1
0
Fork 0
mirror of https://github.com/Yetangitu/owncloud-apps.git synced 2025-10-02 14:49:17 +02:00

Initial commit

This commit is contained in:
frankdelange 2014-12-09 22:40:49 +01:00
parent 26dd81b2df
commit 993289d86b
51 changed files with 16863 additions and 0 deletions

View file

@ -0,0 +1,65 @@
<?php
/**
* ownCloud - Files_Opds App
*
* @author Frank de Lange
* @copyright 2014 Frank de Lange
*
* This file is licensed under the Affero General Public License version 3 or
* later.
*/
namespace OCA\Files_Opds;
/**
* Bookshelf class for publishing as OPDS
*
* This implements a 'personal bookshelf', listing books
* which have been downloaded from the OPDS feed.
*/
class Bookshelf
{
/**
* @brief add book to personal bookshelf
*
* @param int $id book to add to bookshelf
*/
public static function add($id) {
$bookshelf = json_decode(Config::get('bookshelf', ''), true);
if(!isset($bookshelf[$id])) {
$bookshelf[$id]=time();
}
Config::set('bookshelf', json_encode($bookshelf));
}
/**
* @brief clear personal bookshelf
*/
public static function clear() {
Config::set('bookshelf', '');
}
/**
* @brief return number of books on personal bookshelf
* @return int number of books
*/
public static function count() {
return substr_count(Config::get('bookshelf', ''), ':');
}
/**
* @brief list bookshelf contents
*
* @return array of FileInfo[], sorted by time added
*/
public static function get() {
$files = array();
$bookshelf = json_decode(Config::get('bookshelf', ''), true);
arsort($bookshelf);
while (list($id, $time) = each($bookshelf)) {
array_push($files, \OC\Files\Filesystem::getFileInfo(\OC\Files\Filesystem::normalizePath(\OC\Files\Filesystem::getPath($id))));
}
return $files;
}
}

41
files_opds/lib/config.php Normal file
View file

@ -0,0 +1,41 @@
<?php
/**
* ownCloud - Files_Opds App
*
* @author Frank de Lange
* @copyright 2014 Frank de Lange
*
* This file is licensed under the Affero General Public License version 3 or
* later.
*/
namespace OCA\Files_Opds;
/**
* Config class for publishing as OPDS
*/
class Config
{
/**
* @brief get user config value
*
* @param string $key value to retrieve
* @param string $default default value to use
* @return string retrieved value or default
*/
public static function get($key, $default) {
return \OCP\Config::getUserValue(\OCP\User::getUser(), 'files_opds', $key, $default);
}
/**
* @brief set user config value
*
* @param string $key key for value to change
* @param string $value value to use
* @return bool success
*/
public static function set($key, $value) {
return \OCP\Config::setUserValue(\OCP\User::getUser(), 'files_opds', $key, $value);
}
}

67
files_opds/lib/files.php Normal file
View file

@ -0,0 +1,67 @@
<?php
/**
* ownCloud - Files_Opds App
*
* @author Frank de Lange
* @copyright 2014 Frank de Lange
*
* This file is licensed under the Affero General Public License version 3 or
* later.
*/
namespace OCA\Files_Opds;
/**
* Files class, extendes \OCA\Files, tailored for OPDS
*/
class Files extends \OCA\Files\Helper
{
/**
* Formats the file info to be returned as OPDS to the client.
*
* @param \OCP\Files\FileInfo $i
* @return array formatted file info
*/
public static function formatFileInfo($i) {
$entry = array();
$entry['id'] = $i['fileid'];
$entry['mtime'] = $i['mtime'] * 1000;
$entry['icon'] = self::determineIcon($i);
$entry['name'] = $i->getName();
$entry['mimetype'] = $i['mimetype'];
$entry['size'] = $i['size'];
$entry['type'] = $i['type'];
return $entry;
}
/**
* Format file info for OPDS feed
* @param \OCP\Files\FileInfo[] $fileInfos file infos
*/
public static function formatFileInfos($fileInfos) {
$files = array();
/* if set, add only files with given extensions */
$fileTypes = array_filter(explode(',', strtolower(Config::get('file_types', ''))));
foreach ($fileInfos as $i) {
if((!empty($fileTypes)) && (!in_array(strtolower(substr(strrchr($i->getName(), "."), 1)), $fileTypes))) {
continue;
}
$files[] = self::formatFileInfo($i);
}
return $files;
}
/*
* @brief check if $child is a subdirectory of $parent
*
* @param string $parent a directory
* @param string $child a directory
* @return bool true if $child is a subdirectory of $parent
*/
public static function isChild($parent, $child) {
return strpos($child, $parent . '/') === 0;
}
}

151
files_opds/lib/util.php Normal file
View file

@ -0,0 +1,151 @@
<?php
/**
* ownCloud - Files_Opds App
*
* @author Frank de Lange
* @copyright 2014 Frank de Lange
*
* This file is licensed under the Affero General Public License version 3 or
* later.
*/
namespace OCA\Files_Opds;
/**
* Utility class for OPDS
*/
class Util
{
/**
* @brief Authenticate user by HTTP Basic Authentication
* with user name and password
*/
public static function authenticateUser() {
if (!isset($_SERVER['PHP_AUTH_USER'])) {
$defaults = new \OC_Defaults();
$realm = $defaults->getName();
header ("HTTP/1.0 401 Unauthorized");
header ('WWW-Authenticate: Basic realm="' . $realm. '"');
exit();
}
$userName = $_SERVER['PHP_AUTH_USER'];
// Check the password in the ownCloud database
return self::checkPassword($userName, $_SERVER['PHP_AUTH_PW']);
}
/**
* @brief Checks the password of a user.
* @param string $userName ownCloud user name whose password will be checked.
* @param string $password ownCloud password.
* @return bool True if the password is correct, false otherwise.
*
*/
private static function checkPassword($userName, $password) {
// Check password normally
if (\OCP\User::checkPassword($userName, $password) != false) {
return true;
}
return false;
}
/**
* @brief Change HTTP response code.
*
* @param integer $statusCode The new HTTP status code.
*/
public static function changeHttpStatus($statusCode) {
$message = '';
switch ($statusCode) {
case 400: $message = 'Bad Request'; break;
case 401: $message = 'Unauthorized'; break;
case 403: $message = 'Forbidden'; break;
case 404: $message = 'Not Found'; break;
case 500: $message = 'Internal Server Error'; break;
case 503: $message = 'Service Unavailable'; break;
}
// Set status code and status message in HTTP header
header('HTTP/1.0 ' . $statusCode . ' ' . $message);
}
/**
* @brief offer single file for download
*
* @param string $path full path to file
* @param int $id file id
*/
public static function serveFile($path, $id) {
\OCP\User::checkLoggedIn();
\OC::$session->close();
Bookshelf::add($id);
$dirName = dirname($path);
$fileName = basename($path);
\OC_Files::get($dirName, array($fileName), $_SERVER['REQUEST_METHOD'] == 'HEAD');
}
/**
* @brief serve opds feed for given directory
*
* @param string $dir full path to directory
* @param int $id requested id
*/
public static function serveFeed($dir, $id) {
if (isset($_SERVER['HTTP_ACCEPT']) && stristr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) {
header('Content-Type: application/atom+xml');
} else {
header('Content-Type: text/xml; charset=UTF-8');
}
$sortAttribute = 'name';
$sortDirection = false;
$defaults = new \OC_Defaults();
$tmpl = new \OCP\Template('files_opds', 'feed');
$tmpl->assign('files', Files::formatFileInfos(Files::getFiles($dir, $sortAttribute, $sortDirection)));
$tmpl->assign('bookshelf', Files::formatFileInfos(Bookshelf::get()));
$tmpl->assign('bookshelf-count', Bookshelf::count());
$tmpl->assign('feed_id', self::getFeedId());
$tmpl->assign('id', $id);
$tmpl->assign('dir', $dir);
$tmpl->assign('user', \OCP\User::getDisplayName());
$tmpl->assign('ocname', $defaults->getName());
$tmpl->printPage();
}
/**
* @brief generate v3 UUID based on display name and site url
*
* @return string uuid
*/
public static function genUuid() {
$defaults = new \OC_Defaults();
$hash = md5(\OCP\User::getDisplayName() . $defaults->getBaseUrl());
$hash = substr($hash, 0, 8 ) .'-'.
substr($hash, 8, 4) .'-3'.
substr($hash, 13, 3) .'-9'.
substr($hash, 17, 3) .'-'.
substr($hash, 20);
return $hash;
}
/**
* @brief get feed id
*
* @return string feed id
*/
public static function getFeedId() {
return Config::get('id', '');
}
/**
* @brief log warning
* @param string message to write to log
*/
public static function logWarn($msg) {
\OCP\Util::writeLog('files_opds', $msg, \OCP\Util::WARN);
}
}