mbirth /
cops
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | /** |
||
| 3 | * COPS (Calibre OPDS PHP Server) class file |
||
| 4 | * |
||
| 5 | * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) |
||
| 6 | * @author Sébastien Lucas <[email protected]> |
||
| 7 | */ |
||
| 8 | |||
| 9 | class Data |
||
| 10 | { |
||
| 11 | public $id; |
||
| 12 | public $name; |
||
| 13 | public $format; |
||
| 14 | public $realFormat; |
||
| 15 | public $extension; |
||
| 16 | public $book; |
||
| 17 | |||
| 18 | public static $mimetypes = array( |
||
| 19 | 'aac' => 'audio/aac', |
||
| 20 | 'azw' => 'application/x-mobipocket-ebook', |
||
| 21 | 'azw1' => 'application/x-topaz-ebook', |
||
| 22 | 'azw2' => 'application/x-kindle-application', |
||
| 23 | 'azw3' => 'application/x-mobi8-ebook', |
||
| 24 | 'cbz' => 'application/x-cbz', |
||
| 25 | 'cbr' => 'application/x-cbr', |
||
| 26 | 'djv' => 'image/vnd.djvu', |
||
| 27 | 'djvu' => 'image/vnd.djvu', |
||
| 28 | 'doc' => 'application/msword', |
||
| 29 | 'epub' => 'application/epub+zip', |
||
| 30 | 'fb2' => 'text/fb2+xml', |
||
| 31 | 'ibooks'=> 'application/x-ibooks+zip', |
||
| 32 | 'kepub' => 'application/epub+zip', |
||
| 33 | 'kobo' => 'application/x-koboreader-ebook', |
||
| 34 | 'm4a' => 'audio/mp4', |
||
| 35 | 'mobi' => 'application/x-mobipocket-ebook', |
||
| 36 | 'mp3' => 'audio/mpeg', |
||
| 37 | 'lit' => 'application/x-ms-reader', |
||
| 38 | 'lrs' => 'text/x-sony-bbeb+xml', |
||
| 39 | 'lrf' => 'application/x-sony-bbeb', |
||
| 40 | 'lrx' => 'application/x-sony-bbeb', |
||
| 41 | 'ncx' => 'application/x-dtbncx+xml', |
||
| 42 | 'opf' => 'application/oebps-package+xml', |
||
| 43 | 'otf' => 'application/x-font-opentype', |
||
| 44 | 'pdb' => 'application/vnd.palm', |
||
| 45 | 'pdf' => 'application/pdf', |
||
| 46 | 'prc' => 'application/x-mobipocket-ebook', |
||
| 47 | 'rtf' => 'application/rtf', |
||
| 48 | 'svg' => 'image/svg+xml', |
||
| 49 | 'ttf' => 'application/x-font-truetype', |
||
| 50 | 'tpz' => 'application/x-topaz-ebook', |
||
| 51 | 'wav' => 'audio/wav', |
||
| 52 | 'wmf' => 'image/wmf', |
||
| 53 | 'xhtml' => 'application/xhtml+xml', |
||
| 54 | 'xpgt' => 'application/adobe-page-template+xml', |
||
| 55 | 'zip' => 'application/zip' |
||
| 56 | ); |
||
| 57 | |||
| 58 | 63 | public function __construct($post, $book = null) { |
|
| 59 | 63 | $this->id = $post->id; |
|
| 60 | 63 | $this->name = $post->name; |
|
| 61 | 63 | $this->format = $post->format; |
|
| 62 | 63 | $this->realFormat = str_replace ("ORIGINAL_", "", $post->format); |
|
| 63 | 63 | $this->extension = strtolower ($this->realFormat); |
|
| 64 | 63 | $this->book = $book; |
|
| 65 | 63 | } |
|
| 66 | |||
| 67 | 53 | public function isKnownType () { |
|
| 68 | 53 | return array_key_exists ($this->extension, self::$mimetypes); |
|
| 69 | } |
||
| 70 | |||
| 71 | 53 | public function getMimeType () { |
|
| 72 | 53 | $result = "application/octet-stream"; |
|
| 73 | 53 | if ($this->isKnownType ()) { |
|
| 74 | 53 | return self::$mimetypes [$this->extension]; |
|
| 75 | 1 | } elseif (function_exists('finfo_open') === true) { |
|
| 76 | 1 | $finfo = finfo_open(FILEINFO_MIME_TYPE); |
|
| 77 | |||
| 78 | 1 | if (is_resource($finfo) === true) |
|
| 79 | 1 | { |
|
| 80 | 1 | $result = finfo_file($finfo, $this->getLocalPath ()); |
|
| 81 | 1 | } |
|
| 82 | |||
| 83 | 1 | finfo_close($finfo); |
|
| 84 | |||
| 85 | 1 | } |
|
| 86 | 1 | return $result; |
|
| 87 | } |
||
| 88 | |||
| 89 | 1 | public function isEpubValidOnKobo () { |
|
| 90 | 1 | return $this->format == "EPUB" || $this->format == "KEPUB"; |
|
| 91 | } |
||
| 92 | |||
| 93 | 50 | public function getFilename () { |
|
| 94 | 50 | return $this->name . "." . strtolower ($this->format); |
|
| 95 | } |
||
| 96 | |||
| 97 | 1 | public function getUpdatedFilename () { |
|
| 98 | 1 | return $this->book->getAuthorsSort () . " - " . $this->book->title; |
|
| 99 | } |
||
| 100 | |||
| 101 | 1 | public function getUpdatedFilenameEpub () { |
|
| 102 | 1 | return $this->getUpdatedFilename () . ".epub"; |
|
| 103 | } |
||
| 104 | |||
| 105 | 1 | public function getUpdatedFilenameKepub () { |
|
| 106 | 1 | $str = $this->getUpdatedFilename () . ".kepub.epub"; |
|
| 107 | 1 | return str_replace(array(':', '#', '&'), |
|
| 108 | 1 | array('-', '-', ' '), $str ); |
|
| 109 | } |
||
| 110 | |||
| 111 | 49 | public function getDataLink ($rel, $title = NULL) { |
|
| 112 | 49 | global $config; |
|
| 113 | |||
| 114 | 49 | if ($rel == Link::OPDS_ACQUISITION_TYPE && $config['cops_use_url_rewriting'] == "1") { |
|
| 115 | 2 | return $this->getHtmlLinkWithRewriting($title); |
|
| 116 | } |
||
| 117 | |||
| 118 | 48 | return self::getLink ($this->book, $this->extension, $this->getMimeType (), $rel, $this->getFilename (), $this->id, $title); |
|
| 119 | } |
||
| 120 | |||
| 121 | 5 | public function getHtmlLink () { |
|
| 122 | 5 | return $this->getDataLink(Link::OPDS_ACQUISITION_TYPE)->href; |
|
| 123 | } |
||
| 124 | |||
| 125 | 2 | public function getLocalPath () { |
|
| 126 | 2 | return $this->book->path . "/" . $this->getFilename (); |
|
| 127 | } |
||
| 128 | |||
| 129 | 2 | public function getHtmlLinkWithRewriting ($title = NULL) { |
|
| 130 | 2 | global $config; |
|
| 131 | |||
| 132 | 2 | $database = ""; |
|
| 133 | 2 | View Code Duplication | if (!is_null (GetUrlParam (DB))) $database = GetUrlParam (DB) . "/"; |
|
0 ignored issues
–
show
|
|||
| 134 | |||
| 135 | 2 | $href = "download/" . $this->id . "/" . $database; |
|
| 136 | |||
| 137 | 2 | if ($config['cops_provide_kepub'] == "1" && |
|
| 138 | 2 | $this->isEpubValidOnKobo () && |
|
| 139 | 2 | preg_match("/Kobo/", $_SERVER['HTTP_USER_AGENT'])) { |
|
| 140 | 1 | $href .= rawurlencode ($this->getUpdatedFilenameKepub ()); |
|
| 141 | 1 | } else { |
|
| 142 | 2 | $href .= rawurlencode ($this->getFilename ()); |
|
| 143 | } |
||
| 144 | 2 | return new Link ($href, $this->getMimeType (), Link::OPDS_ACQUISITION_TYPE, $title); |
|
| 145 | } |
||
| 146 | |||
| 147 | 62 | View Code Duplication | public static function getDataByBook ($book) { |
|
0 ignored issues
–
show
This method seems to be duplicated in your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. Loading history...
|
|||
| 148 | 62 | $out = array (); |
|
| 149 | 62 | $result = Base::getDb ()->prepare('select id, format, name |
|
| 150 | 62 | from data where book = ?'); |
|
| 151 | 62 | $result->execute (array ($book->id)); |
|
| 152 | |||
| 153 | 62 | while ($post = $result->fetchObject ()) |
|
| 154 | { |
||
| 155 | 62 | array_push ($out, new Data ($post, $book)); |
|
| 156 | 62 | } |
|
| 157 | 62 | return $out; |
|
| 158 | } |
||
| 159 | |||
| 160 | 19 | public static function handleThumbnailLink ($urlParam, $height) { |
|
| 161 | 19 | global $config; |
|
| 162 | |||
| 163 | 19 | if (is_null ($height)) { |
|
| 164 | 18 | if (preg_match ('/feed.php/', $_SERVER["SCRIPT_NAME"])) { |
|
| 165 | $height = $config['cops_opds_thumbnail_height']; |
||
| 166 | } |
||
| 167 | else |
||
| 168 | { |
||
| 169 | 18 | $height = $config['cops_html_thumbnail_height']; |
|
| 170 | } |
||
| 171 | 18 | } |
|
| 172 | 19 | if ($config['cops_thumbnail_handling'] != "1") { |
|
| 173 | 19 | $urlParam = addURLParameter($urlParam, "height", $height); |
|
| 174 | 19 | } |
|
| 175 | |||
| 176 | 19 | return $urlParam; |
|
| 177 | } |
||
| 178 | |||
| 179 | 49 | public static function getLink ($book, $type, $mime, $rel, $filename, $idData, $title = NULL, $height = NULL) |
|
| 180 | { |
||
| 181 | 49 | global $config; |
|
| 182 | |||
| 183 | 49 | $urlParam = addURLParameter("", "data", $idData); |
|
| 184 | |||
| 185 | 49 | if (Base::useAbsolutePath () || |
|
| 186 | $rel == Link::OPDS_THUMBNAIL_TYPE || |
||
| 187 | ($type == "epub" && $config['cops_update_epub-metadata'])) |
||
| 188 | 49 | { |
|
| 189 | 49 | if ($type != "jpg") $urlParam = addURLParameter($urlParam, "type", $type); |
|
| 190 | 49 | if ($rel == Link::OPDS_THUMBNAIL_TYPE) { |
|
| 191 | 19 | $urlParam = self::handleThumbnailLink($urlParam, $height); |
|
| 192 | 19 | } |
|
| 193 | 49 | $urlParam = addURLParameter($urlParam, "id", $book->id); |
|
| 194 | 49 | View Code Duplication | if (!is_null (GetUrlParam (DB))) $urlParam = addURLParameter ($urlParam, DB, GetUrlParam (DB)); |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation. You can also find more detailed suggestions in the “Code” section of your repository. Loading history...
|
|||
| 195 | 49 | if ($config['cops_thumbnail_handling'] != "1" && |
|
| 196 | 49 | !empty ($config['cops_thumbnail_handling']) && |
|
| 197 | 49 | $rel == Link::OPDS_THUMBNAIL_TYPE) { |
|
| 198 | return new Link ($config['cops_thumbnail_handling'], $mime, $rel, $title); |
||
| 199 | } else { |
||
| 200 | 49 | return new Link ("fetch.php?" . $urlParam, $mime, $rel, $title); |
|
| 201 | } |
||
| 202 | } |
||
| 203 | else |
||
| 204 | { |
||
| 205 | return new Link (str_replace('%2F','/',rawurlencode ($book->path."/".$filename)), $mime, $rel, $title); |
||
| 206 | } |
||
| 207 | } |
||
| 208 | } |
||
| 209 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.