From: vincent@cubedesigners.com Date: Thu, 21 Mar 2019 18:17:50 +0000 (+0000) Subject: wait #2645 @0.5 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=2eeb1d307a9c6b7f6157e5c53fa8d4a9125faa46;p=cubeextranet.git wait #2645 @0.5 --- diff --git a/inc/ws/Controlleur/class.ws.services.php b/inc/ws/Controlleur/class.ws.services.php index e8b711252..bcbc75d7c 100644 --- a/inc/ws/Controlleur/class.ws.services.php +++ b/inc/ws/Controlleur/class.ws.services.php @@ -3,485 +3,503 @@ class wsServices extends cubeFlashGateway { - const CNAME = __CLASS__; - - public static function in($args) - { - global $core; - $args = cubePage::getArgs($args); - $n = self::CNAME; - $gateway = new $n($core->con, $args); - } - - public function sendEmail() - { - global $core; - if (!$this->_checkHash()) { - return; - } - - $dao = new wsDAOBook($core->con); - $book = $dao->selectById($this->args['id']); - - $return = 'postmaster@fluidbook.com'; - - // Send the email - $mail = new cubeMail(); - $mail->returnPath = $return; - $mail->acknowledge = isset($this->args['askAcknowledge']) && $this->args['askAcknowledge']; - $mail->charset = 'UTF-8'; - $mail->to = $this->args['email']; - if ($book->parametres->sendasfluidbook) { - $mail->from = $this->args['fromname'] . '<' . $return . '>'; - $mail->replyTo = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; - } else { - $mail->from = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; - } - $mail->subject = $this->args['subject']; - $mail->body = $this->args['body']; - $this->xml->addChild('ok', $mail->send() ? '1' : '0'); - } - - protected function _checkHash() - { - // Check protection hash - $hash = md5(substr($this->args['fromemail'], 2, 6) . substr($this->args['email'], 3, 5) . 'SFGHF566!S' . $this->args['id']); - if ($hash != $this->args['hash']) { - $this->xml->addChild('hashOK', '0'); - $this->xml->addChild('ok', '0'); - return false; - } - $this->xml->addChild('hashOK', '1'); - return true; - } - - public function sendBookmarks() - { - if (!$this->_checkHash()) { - return; - } - - global $core; - $dao = new wsDAOBook($core->con); - $book = $dao->selectById($this->args['id']); - - $bookmarks = json_decode(base64_decode($this->args['bookmarks']), true); - $files = array(); - foreach ($bookmarks as $b) { - $range = $b['page']; - if ($b['nb'] > 1) { - $range .= '-' . ($b['page'] + $b['nb'] - 1); - } - - $file = $this->getPDFComplex($this->args['id'], $range); - $files[] = array('name' => $b['name'], 'file' => $file['file']); - } - - $limit = 5 * 1024 * 1024 * 0.8; - $groups = array(); - $group = array(); - $groupsize = 0; - foreach ($files as $f) { - $size = filesize($f['file']); - - if ($groupsize + $size > $limit) { - if (count($group)) { - $groups[] = $group; - $group = array(); - $groupsize = 0; - } - - $group[] = $f; - $groupsize = $size; - - if ($groupsize > $limit) { - $groups[] = $group; - $group = array(); - $groupsize = 0; - } - } else { - $group[] = $f; - $groupsize += $size; - } - } - - if (count($group)) { - $groups[] = $group; - } - - $return = 'postmaster@fluidbook.com'; - - $total = count($groups); - foreach ($groups as $i => $g) { - $s = ''; - if ($total > 1) { - $s = ' (' . ($i + 1) . '/' . $total . ')'; - } - - // Send the email - $mail = new cubeMail(); - $mail->returnPath = $return; - $mail->acknowledge = isset($this->args['askAcknowledge']) && $this->args['askAcknowledge']; - $mail->charset = 'UTF-8'; - $mail->to = $this->args['email']; - if ($book->parametres->sendasfluidbook) { - $mail->from = $this->args['fromname'] . '<' . $return . '>'; - $mail->replyTo = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; - } else { - $mail->from = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; - } - $mail->subject = $this->args['subject'] . $s; - $mail->body = $this->args['body']; - foreach ($g as $f) { - $mail->addFile($f['name'] . '.pdf', $f['file']); - } - $this->xml->addChild('ok', $mail->send() ? '1' : '0'); - } - } - - protected function shortenURL($url, $id) - { - $bitLyUser = 'fluidbook'; - $bitLyKey = 'R_3858dd1c9884d5c6a5fe386d7e95cf1d'; - // Recherche dans le cache - $r = $this->con->select('SELECT * FROM book_short_url WHERE long_url=\'' . $this->con->escape($url) . '\' LIMIT 1'); - if ($r->count() > 0) { - return $r->short_url; - } - // Si pas dans le cache, on le recherche - $short_url = cubeURLShortener::bitLy($url, $bitLyUser, $bitLyKey); - if (is_null($short_url) || empty($short_url) || !$short_url) { - $short_url = cubeURLShortener::tinyURL($url); - } - $short_url = trim($short_url); - - $c = $this->con->openCursor('book_short_url'); - $c->long_url = $url; - $c->book_id = $id; - $c->short_url = $short_url; - $c->insert(); - - return $short_url; - } - - /** - * wsServices::facebook_thumbnail() - * - * @return - */ - public function facebook_thumbnail() - { - $this->outputXML = false; - $dao = new wsDAOBook($this->con); - - $book = $dao->selectById($this->args['id']); - - if (isset($this->args['image'])) { - $cover = WS_BOOKS . '/working/' . $this->args['id'] . '/' . $this->args['image']; - } else { - - if (isset($book->parametres->facebook_image) && $book->parametres->facebook_image != '') { - $c = WS_BOOKS . '/working/' . $this->args['id'] . '/' . $book->parametres->facebook_image; - if (file_exists($c)) { - $cover = $c; - } - } else if ($book->parametres->pdfThumbnails) { - $pdf = wsDAOBook::getWorkingFile($book->parametres->pdfThumbnails, $book->book_id); - - if (file_exists($pdf)) { - $dir = WS_CACHE . '/thumbs/' . sha1($pdf) . '/'; - if (!file_exists($dir)) { - mkdir($dir, 0777, true); - } - $jpeg = $dir . '/cover.jpg'; - $mtime = filemtime($jpeg); - - if (!file_exists($jpeg) || $mtime < filemtime(__FILE__) || $mtime < filemtime($pdf)) { - wsPDFConvert::makeShot($pdf, $jpeg, 1, '', 150, 90, 4, 'PNM', 1200, -1); - } - $cover = $jpeg; - } - } - - if (!isset($cover)) { - $pages = $dao->getPagesOfBook($this->args['id']); - $dir = wsDocument::getDir($pages[1]['document_id']); - $cover = $dir . '/html/t150-' . $pages[1]['document_page'] . '.jpg'; - if (!file_exists($cover)) { - $cover = $dir . '/p' . $pages[1]['document_page'] . '.jpg'; - } - $i = WS_FILES . '/cover/' . $this->args['id'] . '.jpg'; - - if (!file_exists($i) || filemtime(__FILE__) > filemtime($i) || filemtime($cover) > filemtime($i)) { - $it = new imageTools(); - $it->loadImage($cover); - - $it->resize(1200, 1000000, 'ratio', false); - $it->output('jpeg', $i, 85); - $it->close(); - } - $cover = $i; - } - } - - - cubeHTTP::relayFile($cover); - exit; - } - - public function facebookShare() - { - http::redirect('http://www.facebook.com/sharer/sharer.php?u=' . urlencode($this->args['url'])); - exit; - } - - public function googleplusShare() - { - http::redirect('https://plus.google.com/share?url=' . urlencode($this->args['url']) . "&sgp=1"); - exit; - } - - public function linkedinShare() - { - http::redirect('https://www.linkedin.com/cws/share?url=' . urlencode($this->args['url']) . '&isFramed=true&_ts=' . microtime(true)); - } - - public function viadeoShare() - { - http::redirect('http://www.viadeo.com/shareit/share/?url=' . urlencode($this->args['url'])); - } - - public function twitterShare() - { - $url = $this->shortenURL($this->args['url'], $this->args['id']); - - $post = str_replace('%short%', $url, $this->args['post']); - $post = rawurlencode($post); - - http::redirect('http://twitter.com/intent/tweet?source=webclient&text=' . $post); - exit; - } - - public function searchHints() - { - $index = Zend_Search_Lucene::open(WS_BOOKS . '/search/' . $this->args['id']); - - $charsLimit = 2; - - $terms = $this->getTerms($this->args['term']); - $term = array_pop($terms); - - if (strlen($term) < $charsLimit) { - $this->xml->addChild('hints', '{}'); - return; - } - - $term = new Zend_Search_Lucene_Index_Term($term . '*', 'contents'); - $query = new Zend_Search_Lucene_Search_Query_Wildcard($term); - $query->setMinPrefixLength($charsLimit); - - $index->find($query); - $terms = $query->getQueryTerms(); - $res = array(); - foreach ($terms as $t) { - $res[$t->text] = array_sum($index->termFreqs($t)); - } - arsort($res); - $res = array_slice($res, 0, 10, true); - $this->xml->addChild('hints', json_encode($res)); - } - - public function searchResults() - { - $index = Zend_Search_Lucene::open(WS_BOOKS . '/search/' . $this->args['id']); - - $terms = $this->getTerms($this->args['term']); - - $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); - foreach ($terms as $term) { - $query->addTerm(new Zend_Search_Lucene_Index_Term($term, 'contents'), null); - } - - $hits = $index->find($query); - $res = array(); - $terms = array(); - foreach ($query->getQueryTerms() as $t) { - $terms[] = $t->text; - foreach ($index->termFreqs($t) as $doc_id => $f) { - $page = trim($index->getDocument($doc_id)->getField('url')->getUtf8Value(), "#"); - if (!isset($res[$page])) { - $res[$page] = 0; - } - $res[$page] += $f; - } - } - $this->xml->addChild('results', json_encode($res)); - $this->xml->addChild('terms', implode(',', $terms)); - } - - protected function getTerms($term) - { - $term = trim($term, '*? '); - $term = mb_strtolower($term); - $term = cubeText::removeAccents($term); - $terms = explode(' ', $term); - return $terms; - } - - public function printpdf() - { - $this->outputXML = false; - $this->exportpdf(true); - } - - public function getPDFComplex($book = null, $range = null) - { - global $core; - - if (is_null($book)) { - $book = $this->callArgs[0]; - $range = $this->callArgs[1]; - } - - $daoBook = new wsDAOBook($core->con); - - if (is_int($book) || is_string($book)) { - $book = $daoBook->selectById($book); - } - - if (is_null($book)) { - return false; - } - - // Normalize range - $range = cubeArray::parseRange($range); - - if ($k = array_search(0, $range)) { - $range[$k] = 1; - } - if ($k = array_search($book->parametres->pages + 1, $range)) { - $range[$k] = $r->pages; - } - - $range = array_unique($range); - sort($range); - - - // Paths init - $baseDocument = $this->getPDFComplexBaseDocument($book); - - if (!file_exists($baseDocument)) { - return false; - } - - if (!count($range)) { - return false; - } - - $destDir = WS_CACHE . '/exportpdf/' . $book->cid; - if (!file_exists($destDir)) { - mkdir($destDir, 0777, true); - } - $fname = md5($baseDocument) . '-' . md5(implode(',%ù', $range)) . '.pdf'; - $destFile = $destDir . '/' . $fname; - $destURL = '/fluidbook/cache/exportpdf/' . $book->cid . '/' . $fname; - - // If result exists, don't make the pdf again - if (file_exists($destFile) && filemtime($destFile) > filemtime($baseDocument)) { - - } else { - if ($range[0] == 1 && count($range) == $book->parametres->pages && $range[$book->parametres->pages - 1] == $book->parametres->pages) { - `cp $baseDocument $destFile`; - } else { - - // Prepare the command line - $l = array('A="' . $baseDocument . '"', 'cat'); - foreach ($range as $page) { - if ($page < 1 || $page > $book->parametres->pages) { - continue; - } - $l[] = 'A' . $page; - } - $l[] = 'output'; - $l[] = $destFile; - - $args = implode(' ', $l); - // Execute the command line - $pdftk = new cubeCommandLine('pdftk'); - $pdftk->setPath(CONVERTER_PATH); - $pdftk->setManualArg($args); - $pdftk->execute(); - } - } - - return array('url' => $destURL, 'file' => $destFile); - } - - public function getPDFComplexBaseDocument($book) - { - global $core; - switch ($book->parametres->bookmarkUsePDF) { - case 'download': - return WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfReplace; - break; - case 'thumbnails': - return WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfThumbnails; - break; - case 'pages': - default: - $normal = WS_BOOKS . '/pdf/' . $book->book_id . '/original.pdf'; - if (!file_exists($normal)) { - $daoBook = new wsDAOBook($core->con); - $pages = $daoBook->getPagesOfBook($book->book_id); - $daoBook->compilePDF($book, $pages); - } - return $normal; - break; - } - return $res; - } - - public function e() - { - $this->args['cid'] = $this->callArgs[0]; - $this->args['range'] = $this->callArgs[1]; - return $this->exportpdf(); - } - - public function p() - { - $this->args['cid'] = $this->callArgs[0]; - $this->args['range'] = $this->callArgs[1]; - return $this->exportpdf(true); - } - - public function exportpdf($print = false) - { - global $core; - - set_time_limit(0); - - $dao = new wsDAOBook($core->con); - if (isset($this->args['cid'])) { - $book = $dao->selectByCid($this->args['cid']); - } else if ($this->args['id'] < 11202) { - $book = $dao->selectById($this->args['id']); - } - - $dest = $this->getPDFComplex($book, $this->args['range']); - - if ($dest === false) { - http_response_code(404); - exit; - } - - if (!$print) { - // Return the url of the resulting pdf - http::redirect($dest['url']); - exit; - } else { - $this->outputXML = false; - $res = ' + const CNAME = __CLASS__; + + public static function in($args) + { + global $core; + $args = cubePage::getArgs($args); + $n = self::CNAME; + $gateway = new $n($core->con, $args); + } + + public function sendEmail() + { + global $core; + if (!$this->_checkHash()) { + return; + } + + $dao = new wsDAOBook($core->con); + $book = $dao->selectById($this->args['id']); + + $return = 'postmaster@fluidbook.com'; + + // Send the email + $mail = new cubeMail(); + $mail->returnPath = $return; + $mail->acknowledge = isset($this->args['askAcknowledge']) && $this->args['askAcknowledge']; + $mail->charset = 'UTF-8'; + $mail->to = $this->args['email']; + if ($book->parametres->sendasfluidbook) { + $mail->from = $this->args['fromname'] . '<' . $return . '>'; + $mail->replyTo = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; + } else { + $mail->from = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; + } + $mail->subject = $this->args['subject']; + $mail->body = $this->args['body']; + $this->xml->addChild('ok', $mail->send() ? '1' : '0'); + } + + protected function _checkHash() + { + // Check protection hash + $hash = md5(substr($this->args['fromemail'], 2, 6) . substr($this->args['email'], 3, 5) . 'SFGHF566!S' . $this->args['id']); + if ($hash != $this->args['hash']) { + $this->xml->addChild('hashOK', '0'); + $this->xml->addChild('ok', '0'); + return false; + } + $this->xml->addChild('hashOK', '1'); + return true; + } + + public function sendBookmarks() + { + if (!$this->_checkHash()) { + return; + } + + global $core; + $dao = new wsDAOBook($core->con); + $book = $dao->selectById($this->args['id']); + + $bookmarks = json_decode(base64_decode($this->args['bookmarks']), true); + $files = array(); + foreach ($bookmarks as $b) { + $range = $b['page']; + if ($b['nb'] > 1) { + $range .= '-' . ($b['page'] + $b['nb'] - 1); + } + + $file = $this->getPDFComplex($this->args['id'], $range); + $files[] = array('name' => $b['name'], 'file' => $file['file']); + } + + $limit = 5 * 1024 * 1024 * 0.8; + $groups = array(); + $group = array(); + $groupsize = 0; + foreach ($files as $f) { + $size = filesize($f['file']); + + if ($groupsize + $size > $limit) { + if (count($group)) { + $groups[] = $group; + $group = array(); + $groupsize = 0; + } + + $group[] = $f; + $groupsize = $size; + + if ($groupsize > $limit) { + $groups[] = $group; + $group = array(); + $groupsize = 0; + } + } else { + $group[] = $f; + $groupsize += $size; + } + } + + if (count($group)) { + $groups[] = $group; + } + + $return = 'postmaster@fluidbook.com'; + + $total = count($groups); + foreach ($groups as $i => $g) { + $s = ''; + if ($total > 1) { + $s = ' (' . ($i + 1) . '/' . $total . ')'; + } + + // Send the email + $mail = new cubeMail(); + $mail->returnPath = $return; + $mail->acknowledge = isset($this->args['askAcknowledge']) && $this->args['askAcknowledge']; + $mail->charset = 'UTF-8'; + $mail->to = $this->args['email']; + if ($book->parametres->sendasfluidbook) { + $mail->from = $this->args['fromname'] . '<' . $return . '>'; + $mail->replyTo = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; + } else { + $mail->from = $this->args['fromname'] . '<' . $this->args['fromemail'] . '>'; + } + $mail->subject = $this->args['subject'] . $s; + $mail->body = $this->args['body']; + foreach ($g as $f) { + $mail->addFile($f['name'] . '.pdf', $f['file']); + } + $this->xml->addChild('ok', $mail->send() ? '1' : '0'); + } + } + + protected function shortenURL($url, $id) + { + $bitLyUser = 'fluidbook'; + $bitLyKey = 'R_3858dd1c9884d5c6a5fe386d7e95cf1d'; + // Recherche dans le cache + $r = $this->con->select('SELECT * FROM book_short_url WHERE long_url=\'' . $this->con->escape($url) . '\' LIMIT 1'); + if ($r->count() > 0) { + return $r->short_url; + } + // Si pas dans le cache, on le recherche + $short_url = cubeURLShortener::bitLy($url, $bitLyUser, $bitLyKey); + if (is_null($short_url) || empty($short_url) || !$short_url) { + $short_url = cubeURLShortener::tinyURL($url); + } + $short_url = trim($short_url); + + $c = $this->con->openCursor('book_short_url'); + $c->long_url = $url; + $c->book_id = $id; + $c->short_url = $short_url; + $c->insert(); + + return $short_url; + } + + /** + * wsServices::facebook_thumbnail() + * + * @return + */ + public function facebook_thumbnail() + { + $this->outputXML = false; + $dao = new wsDAOBook($this->con); + + $book = $dao->selectById($this->args['id']); + + if (isset($this->args['image'])) { + $cover = WS_BOOKS . '/working/' . $this->args['id'] . '/' . $this->args['image']; + } else { + + if (isset($book->parametres->facebook_image) && $book->parametres->facebook_image != '') { + $c = WS_BOOKS . '/working/' . $this->args['id'] . '/' . $book->parametres->facebook_image; + if (file_exists($c)) { + $cover = $c; + } + } else if ($book->parametres->pdfThumbnails) { + $pdf = wsDAOBook::getWorkingFile($book->parametres->pdfThumbnails, $book->book_id); + + if (file_exists($pdf)) { + $dir = WS_CACHE . '/thumbs/' . sha1($pdf) . '/'; + if (!file_exists($dir)) { + mkdir($dir, 0777, true); + } + $jpeg = $dir . '/cover.jpg'; + $mtime = filemtime($jpeg); + + if (!file_exists($jpeg) || $mtime < filemtime(__FILE__) || $mtime < filemtime($pdf)) { + wsPDFConvert::makeShot($pdf, $jpeg, 1, '', 150, 90, 4, 'PNM', 1200, -1); + } + $cover = $jpeg; + } + } + + if (!isset($cover)) { + $pages = $dao->getPagesOfBook($this->args['id']); + $dir = wsDocument::getDir($pages[1]['document_id']); + $cover = $dir . '/html/t150-' . $pages[1]['document_page'] . '.jpg'; + if (!file_exists($cover)) { + $cover = $dir . '/p' . $pages[1]['document_page'] . '.jpg'; + } + $i = WS_FILES . '/cover/' . $this->args['id'] . '.jpg'; + + if (!file_exists($i) || filemtime(__FILE__) > filemtime($i) || filemtime($cover) > filemtime($i)) { + $it = new imageTools(); + $it->loadImage($cover); + + $it->resize(1200, 1000000, 'ratio', false); + $it->output('jpeg', $i, 85); + $it->close(); + } + $cover = $i; + } + } + + + cubeHTTP::relayFile($cover); + exit; + } + + public function facebookShare() + { + http::redirect('http://www.facebook.com/sharer/sharer.php?u=' . urlencode($this->args['url'])); + exit; + } + + public function googleplusShare() + { + http::redirect('https://plus.google.com/share?url=' . urlencode($this->args['url']) . "&sgp=1"); + exit; + } + + public function linkedinShare() + { + http::redirect('https://www.linkedin.com/cws/share?url=' . urlencode($this->args['url']) . '&isFramed=true&_ts=' . microtime(true)); + } + + public function viadeoShare() + { + http::redirect('http://www.viadeo.com/shareit/share/?url=' . urlencode($this->args['url'])); + } + + public function twitterShare() + { + $url = $this->shortenURL($this->args['url'], $this->args['id']); + + $post = str_replace('%short%', $url, $this->args['post']); + $post = rawurlencode($post); + + http::redirect('http://twitter.com/intent/tweet?source=webclient&text=' . $post); + exit; + } + + public function searchHints() + { + $index = Zend_Search_Lucene::open(WS_BOOKS . '/search/' . $this->args['id']); + + $charsLimit = 2; + + $terms = $this->getTerms($this->args['term']); + $term = array_pop($terms); + + if (strlen($term) < $charsLimit) { + $this->xml->addChild('hints', '{}'); + return; + } + + $term = new Zend_Search_Lucene_Index_Term($term . '*', 'contents'); + $query = new Zend_Search_Lucene_Search_Query_Wildcard($term); + $query->setMinPrefixLength($charsLimit); + + $index->find($query); + $terms = $query->getQueryTerms(); + $res = array(); + foreach ($terms as $t) { + $res[$t->text] = array_sum($index->termFreqs($t)); + } + arsort($res); + $res = array_slice($res, 0, 10, true); + $this->xml->addChild('hints', json_encode($res)); + } + + public function searchResults() + { + $index = Zend_Search_Lucene::open(WS_BOOKS . '/search/' . $this->args['id']); + + $terms = $this->getTerms($this->args['term']); + + $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); + foreach ($terms as $term) { + $query->addTerm(new Zend_Search_Lucene_Index_Term($term, 'contents'), null); + } + + $hits = $index->find($query); + $res = array(); + $terms = array(); + foreach ($query->getQueryTerms() as $t) { + $terms[] = $t->text; + foreach ($index->termFreqs($t) as $doc_id => $f) { + $page = trim($index->getDocument($doc_id)->getField('url')->getUtf8Value(), "#"); + if (!isset($res[$page])) { + $res[$page] = 0; + } + $res[$page] += $f; + } + } + $this->xml->addChild('results', json_encode($res)); + $this->xml->addChild('terms', implode(',', $terms)); + } + + protected function getTerms($term) + { + $term = trim($term, '*? '); + $term = mb_strtolower($term); + $term = cubeText::removeAccents($term); + $terms = explode(' ', $term); + return $terms; + } + + public function printpdf() + { + $this->outputXML = false; + $this->exportpdf(true); + } + + public function getPDFComplex($book = null, $range = null, $print = false) + { + global $core; + + if (is_null($book)) { + $book = $this->callArgs[0]; + $range = $this->callArgs[1]; + } + + $daoBook = new wsDAOBook($core->con); + + if (is_int($book) || is_string($book)) { + $book = $daoBook->selectById($book); + } + + if (is_null($book)) { + return false; + } + + // Normalize range + $range = cubeArray::parseRange($range); + + if ($k = array_search(0, $range)) { + $range[$k] = 1; + } + if ($k = array_search($book->parametres->pages + 1, $range)) { + $range[$k] = $r->pages; + } + + $range = array_unique($range); + sort($range); + + + // Paths init + $baseDocument = $this->getPDFComplexBaseDocument($book); + + if (!file_exists($baseDocument)) { + return false; + } + + if (!count($range)) { + return false; + } + + $destDir = WS_CACHE . '/exportpdf/' . $book->cid; + if (!file_exists($destDir)) { + mkdir($destDir, 0777, true); + } + $fname = md5($baseDocument) . '-' . md5(implode(',%ù', $range, ($print ? '1' : '0'))) . '.pdf'; + $destFile = $destDir . '/' . $fname; + $destURL = '/fluidbook/cache/exportpdf/' . $book->cid . '/' . $fname; + + // If result exists, don't make the pdf again + if (false && file_exists($destFile) && filemtime($destFile) > filemtime($baseDocument)) { + + } else { + + if ($print) { + $memoDest = $destFile; + $destFile = CubeIT_Files::tempnam(); + } + + if ($range[0] == 1 && count($range) == $book->parametres->pages && $range[$book->parametres->pages - 1] == $book->parametres->pages) { + `cp $baseDocument $destFile`; + } else { + + // Prepare the command line + $l = array('A="' . $baseDocument . '"', 'cat'); + foreach ($range as $page) { + if ($page < 1 || $page > $book->parametres->pages) { + continue; + } + $l[] = 'A' . $page; + } + $l[] = 'output'; + $l[] = $destFile; + + $args = implode(' ', $l); + // Execute the command line + $pdftk = new cubeCommandLine('pdftk'); + $pdftk->setPath(CONVERTER_PATH); + $pdftk->setManualArg($args); + $pdftk->execute(); + } + + if ($print) { + `gs -dNoOutputFonts -sDEVICE=pdfwrite -o $memoDest $destFile`; + } + } + + return array('url' => $destURL, 'file' => $destFile); + } + + public function getPDFComplexBaseDocument($book) + { + global $core; + switch ($book->parametres->bookmarkUsePDF) { + case 'download': + return WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfReplace; + break; + case 'thumbnails': + return WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfThumbnails; + break; + case 'pages': + default: + $normal = WS_BOOKS . '/pdf/' . $book->book_id . '/original.pdf'; + if (!file_exists($normal)) { + $daoBook = new wsDAOBook($core->con); + $pages = $daoBook->getPagesOfBook($book->book_id); + $daoBook->compilePDF($book, $pages); + } + return $normal; + break; + } + return $res; + } + + public function e() + { + $this->args['cid'] = $this->callArgs[0]; + $this->args['range'] = $this->callArgs[1]; + return $this->exportpdf(false, false); + } + + public function ep() + { + $this->outputXML = false; + $this->args['cid'] = $this->callArgs[0]; + $this->args['range'] = $this->callArgs[1]; + return $this->exportpdf(false, true); + } + + public function p() + { + $this->args['cid'] = $this->callArgs[0]; + $this->args['range'] = $this->callArgs[1]; + return $this->exportpdf(true, true); + } + + public function exportpdf($print = false, $printfile = false) + { + global $core; + + set_time_limit(0); + + $dao = new wsDAOBook($core->con); + if (isset($this->args['cid'])) { + $book = $dao->selectByCid($this->args['cid']); + } else if ($this->args['id'] < 11202) { + $book = $dao->selectById($this->args['id']); + } + + $dest = $this->getPDFComplex($book, $this->args['range'], $printfile); + + if ($dest === false) { + http_response_code(404); + exit; + } + + if (!$print) { + // Return the url of the resulting pdf + http::redirect($dest['url']); + exit; + } else { + $this->outputXML = false; + $res = ' @@ -491,1034 +509,1034 @@ class wsServices extends cubeFlashGateway '; - ob_end_clean(); - echo $res; - exit; - } - } - - public function bulle() - { - global $core; - $e = explode('-', $this->args['catalogue'], 2); - if (count($e) == 2) { - $catalogue = $e[1]; - } else { - $catalogue = $e[0]; - } - - $c = $core->con->openCursor('bulle'); - $c->prenom = trim($this->args['prenom']); - $c->nom = trim($this->args['nom']); - $c->catalogue = trim($catalogue); - $c->email = trim($this->args['email']); - $c->date = TIME; - $c->insert(); - } - - public function getBulleList() - { - $user = 'bulle'; - $pass = '23bu1l300'; - $this->outputXML = false; - $ok = (isset($_SERVER['PHP_AUTH_USER']) && $_SERVER['PHP_AUTH_USER'] == $user && isset($_SERVER['PHP_AUTH_PW']) && $_SERVER['PHP_AUTH_PW'] == $pass); - if (!$ok) { - header('WWW-Authenticate: Basic realm="Protected access"'); - header('HTTP/1.0 401 Unauthorized'); - ob_end_clean(); - header('Content-type: text/html'); - echo '

Forbidden

'; - exit; - } else { - global $core; - header('Content-type: text/csv'); - header('Content-Disposition: attachment; filename="inscriptions.csv"'); - $r = $core->con->select('SELECT * FROM bulle ORDER BY date'); - ob_end_clean(); - echo utf8_decode('"Prénom";"Nom";"E-mail";"Catalogue";"Date"') . "\n"; - while ($r->fetch()) { - echo utf8_decode('"' . $r->prenom . '";"' . $r->nom . '";"' . $r->email . '";"' . $r->catalogue . '";"' . date('Y-m-d H:i', $r->date) . '"') . "\n"; - } - exit; - } - } - - public function grdfValidForm() - { - $notempty = array('civilite', 'prenom', 'nom', 'adresse', 'codepostal', 'ville', 'telephone', 'optin', 'connu', 'energie'); - if ($this->args['id'] >= 12779) { - $notempty = array_merge($notempty, array('logement', 'echeance', 'optin_partenaires')); - } - $error = false; - $errors = array(); - foreach ($notempty as $f) { - if (!isset($this->args[$f]) || is_null($this->args[$f]) || $this->args[$f] == 'null' || trim($this->args[$f]) == '') { - $error = true; - $errors[] = $f; - } - } - - /* if (!cubeMail::isEmail($this->args['email'])) { - $error = true; - $errors[] = 'email_valid'; - } */ - - $this->xml->addChild('ok', $error ? '0' : '1'); - $this->xml->addChild('errors', implode(',', $errors)); - } - - public function grdfSendForm() - { - global $core; - - if ($this->args['id'] == 11222) { - $annee = 2013; - } else if ($this->args['id'] == 12235 || $this->args['id'] == 12779) { - $annee = 2014; - } - - $fields = array('Civilité' => 'civilite', 'Prénom' => 'prenom', 'Nom' => 'nom', - 'E-mail' => 'email', 'Adresse' => 'adresse', 'Code postal' => 'codepostal', 'Ville' => 'ville', - 'Téléphone' => 'telephone', 'Connu par' => 'connu', 'Energie' => 'energie', - 'Type de logement' => 'logement', 'Echéance travaux' => 'echeance', - 'Optin' => 'optin', 'Optin partenaires' => 'optin_partenaires', 'Coupons sélectionnés' => 'reflist'); - - $mail = new cubeMail(); - $mail->charset = 'UTF-8'; - $mail->subject = '[Chéquier avantages] Validation de coupon'; - $mail->from = 'noreply@chequieravantages.fr'; - $mail->replyTo = 'noreply@chequiavantages.fr'; - $mail->to = 'projetrenogaz@grdf.fr'; - $mail->to = 'pierric.soustre@external.grdf.fr'; - $mail->to = 'caroline.gaulin@grdf.fr'; - $mail->bcc = 'test@cubedesigners.com'; - $body = ''; - - foreach ($fields as $k => $f) { - $body .= $k . ' : ' . $this->args[$f] . "\r\n"; - $datas[$f] = $this->args[$f]; - } - $datas['date'] = TIME; - - $c = $core->con->openCursor('grdf' . $annee); - $c->datas = json_encode($datas); - $c->insert(); - - $mail->body = $body; - $mail->send(); - } - - public function grdfCoupon2015() - { - $id = $this->args['id']; - - $this->outputXML = false; - $couponsRoot = WS_BOOKS . '/working/' . $id . '/commerce/'; - - $xml = simplexml_load_file($couponsRoot . 'references.xml'); - // Check hash - $hash = md5('ae' . $_GET['nom'] . '25' . $_GET['ref']); - if ($hash != $_GET['h']) { - exit; - } - $refs = explode(',', $_GET['ref']); - - $tmp = cubeFiles::tempnam(); - $pdftk = new CubeIT_CommandLine('pdftk'); - $pdftk->setPath(CONVERTER_PATH); - foreach ($refs as $ref) { - $file = $couponsRoot . $ref . '.pdf'; - $pdftk->setArg(null, $file); - } - $pdftk->setArg(null, 'output'); - $pdftk->setArg(null, $tmp); - $pdftk->execute(); - - header('Content-Type: application/pdf'); - header('Content-Disposition: inline; filename="CouponChequier.pdf"'); - - readfile($tmp); - unlink($tmp); - exit; - } - - public function grdfCoupon() - { - - $id = $this->args['id']; - - if ($id == 13372) { - return $this->grdfCoupon2015(); - } - - $this->outputXML = false; - $couponsRoot = WS_BOOKS . '/working/' . $id . '/commerce/'; - - $xml = simplexml_load_file($couponsRoot . 'references.xml'); - // Check hash - $hash = md5('ae' . $_GET['nom'] . '25' . $_GET['ref']); - if ($hash != $_GET['h']) { - exit; - } - $refs = explode(',', $_GET['ref']); - $pdf = new FPDI(); - foreach ($refs as $ref) { - - foreach ($xml->xpath('//item[@reference=\'' . $ref . '\']') as $item) { - $code = (string)$item['code']; - } - - $file = $couponsRoot . $ref . '.pdf'; - - $pdf->setSourceFile($file); - $idx = $pdf->importPage(1); - $pdf->AddPage(); - $pdf->useTemplate($idx); - $pdf->SetXY(11, 12); - $pdf->SetFont('Helvetica', '', 12); - $pdf->SetTextColor(0, 0, 0); - $pdf->Cell(180, 10, utf8_decode(trim($_GET['civilite'] . ' ' . $_GET['prenom'] . ' ' . $_GET['nom']) . ',')); - $pdf->SetXY(135, 203); - $pdf->SetFont('Helvetica', 'B', 16); - $pdf->Cell(50, 15, $code, 0, 1, "C"); - } - $pdf->Output('coupon.pdf', 'I'); - } - - public function grdfExcel12568() - { - global $core; - $this->outputXML = false; - - if (!isset($_GET['annee'])) { - $_GET['annee'] = 2014; - } - $annee = $_GET['annee']; - - if ($annee == 2013) { - $id = 11222; - } elseif ($annee == 2014) { - $id = 12779; - } - - - $couponsRoot = WS_BOOKS . '/working/' . $id . '/commerce/'; - - $xml = simplexml_load_file($couponsRoot . 'references.xml'); - - $cols = array('Date' => 'date', 'Civilité' => 'civilite', 'Prénom' => 'prenom', 'Nom' => 'nom', - 'E-mail' => 'email', 'Adresse' => 'adresse', 'Code postal' => 'codepostal', 'Ville' => 'ville', - 'Téléphone' => 'telephone', 'Connu par' => 'connu', 'Energie' => 'energie', 'Type de logement' => 'logement', - 'Echéance travaux' => 'echeance', - 'Optin' => 'optin', 'Optin partenaires' => 'optin_partenaires'); - $refs = array(); - foreach ($xml->xpath('//item') as $i) { - $refs[(string)$i['reference']] = $i['name']; - } - - // - $h = ''; - $h .= ''; - foreach ($cols as $l => $k) { - $h .= ''; - } - foreach ($refs as $k => $l) { - $h .= ''; - } - $h .= ''; - - $r = $core->con->select('SELECT * FROM grdf' . $annee); - while ($r->fetch()) { - $d = json_decode($r->datas); - $rl = explode(',', $d->reflist); - $h .= ''; - foreach ($cols as $l => $k) { - $v = $d->$k; - if ($k == 'date') { - $v = date('Y-m-d H:i', $v); - } - $h .= ''; - } - foreach ($refs as $k => $l) { - $v = in_array($k, $rl) ? '1' : '0'; - $h .= ''; - } - $h .= ''; - } - - $h .= '
' . utf8_decode($l) . '' . utf8_decode($l) . '
' . utf8_decode($v) . '' . utf8_decode($v) . '
'; - - if (!file_exists(ROOT . '/cache/12568/')) { - mkdir(ROOT . '/cache/12568/', 0777, true); - } - file_put_contents(ROOT . '/cache/12568/chequieravantage.xls', $h); - http::redirect('/cache/12568/chequieravantage.xls'); - exit; - } - - public function proxy() - { - ob_end_clean(); - fb(netHttp::quickGet($_GET['u'], 'php://output')); - $this->outputXML = false; - } - - public function wescoRef() - { - global $core; - - $this->args['ref'] = str_replace(' ', '', $this->args['ref']); - $ref = ltrim(substr($this->args['ref'], strlen($this->args['ref']) - 5), '0'); - - $r = $core->con->select('SELECT url FROM wescoref WHERE ref="' . $core->con->escape($ref) . '"'); - if ($r->count()) { - header('Location: ' . $r->url); - exit; - } - $cache = ROOT . '/cache/wesco/' . $this->args['ref']; - if (file_exists($cache)) { - header('Location: ' . file_get_contents($cache)); - exit; - } - $url = 'http://www.wesco-eshop.fr/catalogsearch/result/?q=' . $ref; - $doc = new DOMDocument(); - $doc->loadHTML(file_get_contents($url)); - $x = simplexml_import_dom($doc); - $xpath = $x->xpath('//a[@class="product-image"]'); - if (count($xpath) > 0) { - $r = $xpath[0]['href']; - file_put_contents($cache, $r); - header('Location: ' . $r); - exit; - } - header('Location: http://www.wesco-eshop.fr'); - } - - public function wsref() - { - global $core; - $e = explode('|', $_GET['ref'], 2); - $type = trim($e[0]); - $ref = trim($e[1]); - $nzref = ltrim($e[1], '0'); - - $r = $core->con->select("SELECT * FROM wsref WHERE (ref='" . $core->con->escape($ref) . "' OR ref='" . $core->con->escape($nzref) . "') AND type='" . $core->con->escape($type) . "'"); - if ($r->count()) { - header('Location: ' . $r->url); - } - } - - public function pierronRef() - { - global $core; - $ref = $this->args['ref']; - - $r = $core->con->select('SELECT url FROM pierronref WHERE ref="' . $core->con->escape($ref) . '"'); - if ($r->count()) { - header('Location: ' . $r->url); - exit; - } - header('Location: http://www.pierron.fr/'); - } - - public function flfRef() - { - global $core; - - $r = $core->con->select('SELECT url FROM flfref WHERE ref="' . $core->con->escape($this->args['ref']) . '"'); - if ($r->count()) { - if (strpos($r->url, 'http') === 0) { - header('Location: ' . $r->url); - } else { - header('Location: https://www.flf.fr' . $r->url); - } - exit; - } - $q = 'site:https://www.flf.fr/formation-professionnelle/ "Code stage : ' . $this->args['ref'] . '"'; - header('Location: https://www.google.fr/search?q=' . urlencode($q) . '&ie=utf-8&oe=utf-8&btnI'); - exit; - } - - public function collection() - { - global $core; - $id = $this->callArgs[0]; - $os = $this->callArgs[1]; - $resolution = $this->callArgs[2]; - $local = (isset($this->callArgs[3]) && $this->callArgs[3] != '0') ? $this->callArgs[3] : null; - $appver = (isset($this->callArgs[4]) && $this->callArgs[4]) ? $this->callArgs[4] : '1.0'; - - if (is_null($resolution)) { - $resolution = 150; - } - - if ($id == 4) { - $resolution = 150; - } - - $this->outputXML = false; - header('Content-type: application/json'); - - $appverf = str_replace('.', '_', $appver); - - $cache = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.' . $resolution . '.' . $appverf . '.json'; - $update = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.' . $resolution . '.' . $appverf . '.update'; - - if (file_exists($update) && filemtime(__FILE__) > filemtime($update)) { - unlink($update); - } - - if (!is_null($local) && file_exists($update) && file_get_contents($update) == $local) { - echo 'false'; - exit; - } - - $limit = TIME - 72000; - if (!file_exists($cache) || !file_exists($update) || filemtime($cache) < $limit) { - $r = $core->con->select('SELECT *,online_' . $os . ' AS v FROM book_collection_compile WHERE online_' . $os . '!=\'\' AND collection_id=\'' . $core->con->escape($id) . '\' ORDER BY compile_date DESC'); - while ($r->fetch()) { - if (version_compare($r->v, $appver, '>')) { - continue; - } - - $version = $r->compile_date; - - $daoCollection = new wsDAOCollection($core->con); - $collection = $daoCollection->selectById($id); - - $ns = $collection->settings['namespace']; - - $vcompo = WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/composition.json'; - $composition = json_decode(file_get_contents($vcompo)); - - $couvertures = array(); - $vroot = WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/' . $os . '/'; - - $publications = array(); - $langs = array(); - - foreach ($composition as $k => $g) { - foreach ($g->publications as $l => $p) { - $publications[] = $p->id; - } - } - - $daoBook = new wsDAOBook($core->con); - $books = $daoBook->selectByIds($publications); - - $langsnames = array(); - foreach ($composition as $k => $g) { - foreach ($g->publications as $l => $p) { - $book = $books[$p->id]; - $root = WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/' . $os . '/' . $p->id; - $couv = $root . '/cover.jpg'; - if (!file_exists($couv)) { - $couv = $root . '/data/thumbnails/p1.jpg'; - } - $couvertures[$p->id] = base64_encode(file_get_contents($couv)); - $composition[$k]->publications[$l]->width = $book->parametres->width; - $composition[$k]->publications[$l]->height = $book->parametres->height; - $composition[$k]->publications[$l]->lang = $book->lang; - $completeLang = $book->lang; - if ($book->parametres->country) { - $composition[$k]->publications[$l]->country = $book->parametres->country; - $completeLang .= '_' . mb_strtoupper($book->parametres->country); - } - $composition[$k]->publications[$l]->completelang = $completeLang; - - $langs[] = $completeLang; - } - } - - $langs = array_unique($langs); - - $w2h = new wiki2xhtml(); - $w2h->setOpt('active_pre', 0); - - $contents = $collection->contents; - foreach ($langs as $lang) { - $e = explode('_', $lang); - $langsnames[$lang] = cubeLang::getNameByCode($e[0]); - $contents[$lang]['apropos'] = $w2h->transform($contents[$lang]['apropos']); - if (isset($collection->theme['ad_' . $lang])) { - $ad = WS_COLLECTIONS . '/working/' . $id . '/' . $collection->theme['ad_' . $lang]; - if (file_exists($ad)) { - $contents[$lang]['ad'] = base64_encode(file_get_contents($ad)); - } - } - } - - - $traductions = array(); - $r = $core->con->select('SELECT traductions,lang_id FROM langues WHERE lang_id IN(\'' . implode('\',\'', $langs) . '\')'); - while ($r->fetch()) { - $traductions[$r->lang_id] = json_decode($r->traductions); - } - - $theme = $collection->theme; - $settings = $collection->settings; - - $d = array('id' => $id, 'res' => $resolution, 'ns' => $ns, 'langs' => $langs, 'langnames' => $langsnames, 'time' => $version, 'datas' => $composition, 'couvertures' => $couvertures, 'traductions' => $traductions, 'contents' => $contents, 'theme' => $theme, 'settings' => $settings); - if (!$collection->settings['offline']) { - $d = array_merge($d, $this->_getManifest($publications, '/fluidbook/collections/versions/' . $id . '/' . $version . '/' . $os, $books, $resolution)); - } - - $dao = new wsDAOCollection($core->con); - $col = $dao->selectById($id); - - $json = json_encode($d); - file_put_contents($cache, $json); - file_put_contents($update, $version); - - break; - } - } else { - $d = json_decode(file_get_contents($cache), true); - } - - $force = false; - if (!is_null($local)) { - $lcompo = WS_COLLECTIONS . '/versions/' . $id . '/' . $local . '/composition.json'; - if (!file_exists($lcompo)) { - $force = true; - } - } - - - $d['forceUpdate'] = $force; - echo json_encode($d); - exit; - } - - protected function _getManifest($publications, $dir, $books, $resolution) - { - global $core; - $res = array(); - $res['manifest'] = array('assetRoot' => 'https://workshop.fluidbook.com' . $dir . '/', 'autoDownload' => false); - $res['manifestPub'] = array(); - - $bundles = array(); - - $removeFromRelative = realpath(ROOT . '/' . $dir) . '/'; - $daoTheme = new wsDAOTheme($core->con); - - foreach ($publications as $p) { - $res['manifestPub'][$p] = array('assetRoot' => 'https://workshop.fluidbook.com' . $dir . '/', 'autoDownload' => true); - - $r = $p . '/'; - $iterator = CubeIT_Files::getRecursiveDirectoryIterator(ROOT . $dir . '/' . $p); - $book = $books[$p]; - $reso = $resolution; - - $theme = $daoTheme->selectById($book->theme); - $orders = $this->_getBundles($book); - $regexp = $this->_getRegExpManifest($r, $book, $theme, $reso); - $reg = $regexp['reg']; - $exclude = $regexp['exclude']; - - $b = array(); - - foreach ($iterator as $k => $f) { - if ($f->isDir()) { - continue; - } - $path = str_replace($removeFromRelative, '', $k); - - foreach ($exclude as $e) { - if (preg_match('|' . $e . '|', $path)) { - continue 2; - } - } - - $order = $this->_inFirstManifest($path, $orders, $reg); - - if (!isset($b[$order])) { - $b[$order] = array(); - } - - $b[$order][] = $path; - } - - $bundles[] = array('name' => 'p_' . $p, 'contents' => $b['loading']); - $res['manifestPub'][$p]['bundles'] = array(); - - foreach ($b as $name => $contents) { - if ($name == 'loading') { - continue; - } - $k = array_search($name, $orders); - $res['manifestPub'][$p]['bundles'][$k] = array('name' => $name, 'contents' => $contents); - } - ksort($res['manifestPub'][$p]['bundles']); - $res['manifestPub'][$p]['bundles'] = array_values($res['manifestPub'][$p]['bundles']); - } - - $res['manifest']['bundles'] = $bundles; - return $res; - } - - protected function _getRegExpManifest($r, $book, $theme, $resolution) - { - $reg = array(); - $reg['loading'] = array('^' . $r . 'style/(.*).css$', '^' . $r . 'index.html$', '^' . $r . 'data/style/(.*)$', '^' . $r . 'data/(.*).js$', '^' . $r . 'data/images/' . $theme->parametres->logoLoader . '$', '^' . $r . 'style/fonts/(.*).ttf$', '^' . $r . 'data/images/interface-down.svg$', '^' . $r . 'plugins/(.*)$'); - $reg['extras'] = array('^' . $r . 'data/links/(.*).mp4$', '^' . $r . 'data/links/(.*).ogv$', '^' . $r . 'data/links/(.*).webm$', '^' . $r . 'data/(.*).pdf$', '^' . $r . 'cover.jpg$'); - $reg['thumbnails'] = array('^' . $r . 'data/thumbnails/p(\d+).jpg$'); - for ($i = 1; $i <= $book->parametres->pages; $i++) { - $var = 'content_' . $i; - $reg[$var] = array('^' . $r . 'data/background/\d+/t' . $i . '.jpg$', '^' . $r . 'data/contents/p' . $i . '.svg$'); - } - $reg['urgents'] = array('^' . $r . 'images/(.*)$', '^' . $r . 'data/images/(.*)$', '^' . $r . 'data/links/(.*).jpg$', '^' . $r . 'data/links/(.*).png$'); - $reg['loading'] = array_merge($reg['loading'], $reg['urgents']); - - - $exclude = array(); - if ($resolution == 150) { - $er = 300; - } else { - $er = 150; - } - $exclude[] = '^' . $r . 'data/background/' . $er . '/t\d+.jpg$'; - return array('reg' => $reg, 'exclude' => $exclude); - } - - protected function _inFirstManifest($p, $orders, $reg) - { - foreach ($orders as $list) { - foreach ($reg[$list] as $v) { - if (preg_match('|' . $v . '|', $p)) { - return $list; - } - } - } - return $list; - } - - protected function _getBundles($book) - { - $res = array(0 => 'loading', 20001 => 'extras', 20000 => 'thumbnails', 1 => 'urgents'); - for ($i = 1; $i <= $book->parametres->pages; $i++) { - $k = 2 + $i; - $res[$k] = 'content_' . $i; - } - return $res; - } - - public function collectionPushRegister() - { - global $core; - - $c = $core->con->openCursor('book_collection_push'); - $c->collection_id = $_POST['id']; - $c->token = $_POST['token']; - $c->datas = $_POST['datas']; - $c->platform = $_POST['platform']; - $c->locale = $_POST['locale']; - $c->last_visit = TIME; - try { - $c->insert(); - } catch (Exception $e) { - $c->update('WHERE collection_id=\'' . $core->con->escape($_POST['id']) . '\' AND token=\'' . $core->con->escape($_POST['token']) . '\''); - } - } - - public function getFluidbookPage() - { - global $core; - $this->outputXML = false; - - $id = $this->callArgs[0]; - $page = $this->callArgs[1]; - - $dao = new wsDAOBook($core->con); - $pages = $dao->getPagesOfBook($id, false); - $p = $pages[$page]; - - $file = wsDocument::getDir($p['document_id']) . '/html/t150-' . $p['document_page'] . '.jpg'; - - ob_end_clean(); - cubeHTTP::contentType($file); - echo file_get_contents($file); - die; - } - - public function orderRemarkable() - { - try { - $html = file_get_contents(WS_FILES . '/services/remarkableorder.html'); - $billing_address = $_POST['details']['firstname'] . ' ' . $_POST['details']['lastname'] . '

' . $_POST['details']['billing_company'] . "
" . $_POST['details']['billing_address'] . '
' . $_POST['details']['billing_zip'] . ' ' . $_POST['details']['billing_city']; - - $params = array('company', 'address', 'zip', 'city'); - foreach ($params as $param) { - if (trim($_POST['details']['shipping_' . $param]) == '') { - $_POST['details']['shipping_' . $param] = $_POST['details']['billing_' . $param]; - } - } - $shipping_address = $_POST['details']['shipping_company'] . "
" . $_POST['details']['shipping_address'] . '
' . $_POST['details']['shipping_zip'] . ' ' . $_POST['details']['shipping_city']; - - if ($_POST['fpv'] == 'hidden') { - $fraisport = ''; - } else { - $fraisport = ''; - $fraisport .= 'Frais de livraison'; - $fraisport .= '' . $_POST['fpv'] . ''; - $fraisport .= ''; - } - - $lignes = []; - foreach ($_POST['items'] as $item) { - $ligne = ''; - $ligne .= '' . $item[0] . ''; - $ligne .= '' . $item[1] . ''; - $ligne .= '' . $item[2] . ''; - $ligne .= '' . $item[3] . ''; - $ligne .= '' . $item[4] . ''; - $ligne .= ''; - $lignes[] = $ligne; - } - - $lignes = implode('', $lignes); - $totalttc = $_POST['totalttc']; - - $replace = ['billing_address', 'shipping_address', 'totalttc', 'fraisport', 'lignes']; - foreach ($replace as $item) { - if (isset($$item)) { - $html = str_replace('$' . $item, str_replace('€', '€', $$item), $html); - } - } - - $mail = new cubeMail(); - $mail->type = "html"; - $mail->from = 'transfert-fluidbook@remarkable.fr'; - $mail->to = $_POST['details']['email']; - $mail->bcc = 'transfert-fluidbook@remarkable.fr'; - $mail->bcc = 'test@cubedesigners.com'; - $mail->subject = '[Remarkable] Votre commande'; - $mail->body = $html; - $mail->send(); - } catch (Exception $e) { - - } - } - - public function bourbonSuggestion() - { - global $core; - try { - $mail = new PhpMimeMailParser\Parser(); - $mail->setText(base64_decode($_POST['email'])); - $from = $mail->getAddresses('from'); - $from = $from[0]['address']; - - - $attachments = $mail->getAttachments(); - foreach ($attachments as $k => $attachment) { - if ($attachment->getFilename() !== 'suggestion.txt') { - continue; - } - $suggestion = $attachment->getContent(); - $parts = explode('/|!/', $suggestion); - $c = $core->con->openCursor('bourbon_suggestions'); - $c->type = $parts[2]; - $c->suggestion = $parts[3]; - $c->date = round($parts[1] / 1000); - $c->from = $from; - $c->page = $parts[0]; - $c->insert(); - - break; - } - file_put_contents('/tmp/bourbonSuggestion', print_r($mail, true)); - file_put_contents('/tmp/bourbonSuggestionAttach', print_r($attachments, true)); - } catch (Exception $e) { - file_put_contents('/tmp/bourbonSuggestion', print_r($e, true)); - } - - $body = "Hello,\r\nThis automatic message confirms that your suggestion has been received.\r\nPlease do not reply to this e-mail,\r\nThank you"; - - $ack = new Zend_Mail(); - $ack->setFrom('no-reply@bourbonoffshore.com'); - $ack->setSubject('Suggestion acknowledge'); - $ack->setBodyText($body); - - $ack->addTo($from); - $ack->send(); - } - - public function downloadBourbonSuggestions58412() - { - global $core; - $this->outputXML = false; - $r = $core->con->select('SELECT * FROM bourbon_suggestions ORDER BY date DESC'); - $excel = new PHPExcel(); - $excel->setActiveSheetIndex(0); - $defaultStyle = $excel->getDefaultStyle(); - $defaultStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); - $defaultStyle->getAlignment()->setWrapText(true); - $s = $excel->getActiveSheet(); - $s->setTitle('Suggestions'); - $s->setCellValueByColumnAndRow(0, 1, 'Sender'); - $s->setCellValueByColumnAndRow(1, 1, 'Date'); - $s->setCellValueByColumnAndRow(2, 1, 'Type'); - $s->setCellValueByColumnAndRow(3, 1, 'Page'); - $s->setCellValueByColumnAndRow(4, 1, 'Suggestion content'); - - $line = 2; - while ($r->fetch()) { - $date = date('Y-m-d H:i:s', round($r->date)); - - $s->setCellValueByColumnAndRow(0, $line, $r->from); - $s->setCellValueByColumnAndRow(1, $line, $date); - $s->setCellValueByColumnAndRow(2, $line, $r->type); - $s->setCellValueByColumnAndRow(3, $line, $r->page); - $s->setCellValueByColumnAndRow(4, $line, $r->suggestion); - - $line++; - } - - for ($i = 0; $i <= 4; $i++) { - $s->getColumnDimensionByColumn($i)->setAutoSize(true); - } - - - header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); - header('Content-Disposition: attachment;filename="fluidbook-suggestions.xlsx"'); - header('Cache-Control: max-age=0'); - // If you're serving to IE 9, then the following may be needed - header('Cache-Control: max-age=1'); - // If you're serving to IE over SSL, then the following may be needed - header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past - header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified - header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 - header('Pragma: public'); // HTTP/1.0 - - $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); - ob_end_clean(); - $writer->save('php://output'); - exit; - - } - - public static function subscribe() - { - if (isset($_POST['form'])) { - switch ($_POST['form']) { - case 'avery': - self::_subscribeAvery(); - break; - default: - break; - } - } - } - - public function proxypinterest() - { - $this->outputXML = false; - - header('Content-type: application/rss+xml'); - $url = 'https://www.pinterest.com/' . urlencode($this->args['url']); - ob_end_clean(); - $c = file_get_contents($url); - echo $c; - exit; - } - - public static function _subscribeAvery() - { - $api = new CubeIT_Services_Mailchimp('5d00b7e601cf1948cb95de06630878ae-us19'); - $data = [ - 'email' => $_POST['email'], - 'COMPANY' => $_POST['company'], - 'ACTIVITY' => $_POST['activity'], - 'COUNTRY' => $_POST['country'], - 'OPTIN' => $_POST['subscribe'], - 'LANGUAGE' => $_POST['locale'] - ]; - $api->subscribe('33699982ca', $data); - - } - - public static function gpuSeparators() - { - return ['Direct3D', 'DirectX', 'OpenGL', 'Graphics']; - } - - public static function gpuTests() - { - return [546, 544, 680, 632]; - } - - public function gup() - { - global $core; - - $this->outputXML = false; - - $rgpu = $gpu = trim(base64_decode($_GET['gup'])); - - if (strstr($gpu, 'ANGLE (')) { - if (preg_match('/\((.*)\)/', $gpu, $matches)) { - if (strlen($matches[1]) > 8) { - $gpu = $matches[1]; - } - } - - $split = self::gpuSeparators(); - - foreach ($split as $item) { - $e = explode($item, $gpu); - if (count($e) > 1) { - $gpu = $e[0]; - break; - } - } - } - $version = 40; - - - $gpu = trim($gpu); - - $c = $core->con->openCursor('gpu_log'); - $c->gpu = $gpu; - $c->rgpu = $rgpu; - $c->date = time(); - $c->insert(); - - $r = $core->con->select("SELECT * FROM gpu WHERE version=" . $version . " AND (gpu='" . $core->con->escape($gpu) . "' OR rgpu='" . $core->con->escape($rgpu) . "')"); - header('Content-type: text/plain'); - - if ($r->isEmpty()) { - $search = self::searchGFXDevice($c->gpu, $rgpu, $version); - - $doc = new DOMDocument(); - $doc->strictErrorChecking = FALSE; - $doc->loadHTML($search['body']); - $xml = simplexml_import_dom($doc); - - $links = $xml->xpath("//a"); - foreach ($links as $link) { - $h = parse_url($link['href']); - if (trim($h['path']) != 'subtest_results_of_device.jsp') { - continue; - } - parse_str($h['query'], $data); - if (!isset($data['id'])) { - continue; - } - $values = $link->xpath('span[@class=\'value\']'); - if (!count($values)) { - continue; - } - $value = trim((string)$values[0]); - if ($value == 'N/A') { - continue; - } - if (!stristr($value, 'frame')) { - continue; - } - $res[$data['id']] = intval($value); - } - - $scoreids = self::gpuTests(); - $num = 0; - $score = 0; - foreach ($scoreids as $scoreid) { - if (!isset($res[$scoreid])) { - continue; - } - $num++; - $score += $res[$scoreid]; - } - - $score /= $num; - $score = round($score); - - $c = $core->con->openCursor('gpu'); - $c->gpu = $gpu; - $c->rgpu = $rgpu; - $c->page = $search['body']; - $c->url = $search['url']; - $c->version = $version; - $c->benchmark = serialize($res); - $c->score = $score; - $c->date = time(); - $c->insert(); - } else { - $r->fetch(); - $score = $r->score; - } - ob_end_clean(); - echo $score; - exit; - } - - public static function searchGFXDevice($gpu, $raw, $gfxVersion = 40) - { - // First intention direct request - $ugpu = urlencode($gpu); - $url = 'https://gfxbench.com/device.jsp?benchmark=gfx' . $gfxVersion . '&hwname=' . $ugpu . '&D=' . $ugpu . '&testgroup=graphics&var=median'; - - $f = self::_curlRequest($url); - if (!stristr($f, '

No such device')) { - return ['url' => $url, 'body' => $f]; - } - - // Second intention is to use the search engine to lookup the gpu by name - $tests = self::gpuTests(); - $cacheLimit = max(time() - 21600, filemtime(__FILE__)); - foreach ($tests as $test) { - - // Test cache file - $cacheTest = WS_CACHE . '/gfxbench/test_' . $test; - if (!file_exists($cacheTest) || filemtime($cacheTest) < $cacheLimit) { - $f = self::_curlRequest('https://gfxbench.com/result.jsp?benchmark=gfx' . $gfxVersion . '&test=' . $test . '&order=median&base=device'); - - // Search database is stored as js variables in code - $variables = ['gpuNameLookup', 'deviceId', 'gpuName']; - $v = []; - foreach ($variables as $variable) { - if (preg_match('/var ' . $variable . ' = ([^;]*);/ui', $f, $matches)) { - eval('$v[$variable] = ' . $matches[1] . ';'); - } - } - file_put_contents($cacheTest, serialize($v)); - } else { - $v = unserialize(file_get_contents($cacheTest)); - } - - $key = null; - foreach ($v['gpuNameLookup'] as $k => $item) { - if (stristr($item, $raw)) { - $key = $k; - break; - } - } - - // If we get a device id, we have the the device page :) - if (null !== $key) { - $deviceKey = array_search($key, $v['gpuName']); - $deviceId = $v['deviceId'][$deviceKey]; - $url = 'https://gfxbench.com/device.jsp?benchmark=gfx' . $gfxVersion . '&did=' . $deviceId; - $f = self::_curlRequest($url); - if (!stristr($f, '

No such device')) { - return ['url' => $url, 'body' => $f]; - } - } - } - return ['url' => '', 'body' => '']; - } - - - protected static function _curlRequest($url) - { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_VERBOSE, 1); - curl_setopt($ch, CURLOPT_HEADER, 1); - curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'); - $response = curl_exec($ch); - $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); - return substr($response, $header_size); - } + ob_end_clean(); + echo $res; + exit; + } + } + + public function bulle() + { + global $core; + $e = explode('-', $this->args['catalogue'], 2); + if (count($e) == 2) { + $catalogue = $e[1]; + } else { + $catalogue = $e[0]; + } + + $c = $core->con->openCursor('bulle'); + $c->prenom = trim($this->args['prenom']); + $c->nom = trim($this->args['nom']); + $c->catalogue = trim($catalogue); + $c->email = trim($this->args['email']); + $c->date = TIME; + $c->insert(); + } + + public function getBulleList() + { + $user = 'bulle'; + $pass = '23bu1l300'; + $this->outputXML = false; + $ok = (isset($_SERVER['PHP_AUTH_USER']) && $_SERVER['PHP_AUTH_USER'] == $user && isset($_SERVER['PHP_AUTH_PW']) && $_SERVER['PHP_AUTH_PW'] == $pass); + if (!$ok) { + header('WWW-Authenticate: Basic realm="Protected access"'); + header('HTTP/1.0 401 Unauthorized'); + ob_end_clean(); + header('Content-type: text/html'); + echo '

Forbidden

'; + exit; + } else { + global $core; + header('Content-type: text/csv'); + header('Content-Disposition: attachment; filename="inscriptions.csv"'); + $r = $core->con->select('SELECT * FROM bulle ORDER BY date'); + ob_end_clean(); + echo utf8_decode('"Prénom";"Nom";"E-mail";"Catalogue";"Date"') . "\n"; + while ($r->fetch()) { + echo utf8_decode('"' . $r->prenom . '";"' . $r->nom . '";"' . $r->email . '";"' . $r->catalogue . '";"' . date('Y-m-d H:i', $r->date) . '"') . "\n"; + } + exit; + } + } + + public function grdfValidForm() + { + $notempty = array('civilite', 'prenom', 'nom', 'adresse', 'codepostal', 'ville', 'telephone', 'optin', 'connu', 'energie'); + if ($this->args['id'] >= 12779) { + $notempty = array_merge($notempty, array('logement', 'echeance', 'optin_partenaires')); + } + $error = false; + $errors = array(); + foreach ($notempty as $f) { + if (!isset($this->args[$f]) || is_null($this->args[$f]) || $this->args[$f] == 'null' || trim($this->args[$f]) == '') { + $error = true; + $errors[] = $f; + } + } + + /* if (!cubeMail::isEmail($this->args['email'])) { + $error = true; + $errors[] = 'email_valid'; + } */ + + $this->xml->addChild('ok', $error ? '0' : '1'); + $this->xml->addChild('errors', implode(',', $errors)); + } + + public function grdfSendForm() + { + global $core; + + if ($this->args['id'] == 11222) { + $annee = 2013; + } else if ($this->args['id'] == 12235 || $this->args['id'] == 12779) { + $annee = 2014; + } + + $fields = array('Civilité' => 'civilite', 'Prénom' => 'prenom', 'Nom' => 'nom', + 'E-mail' => 'email', 'Adresse' => 'adresse', 'Code postal' => 'codepostal', 'Ville' => 'ville', + 'Téléphone' => 'telephone', 'Connu par' => 'connu', 'Energie' => 'energie', + 'Type de logement' => 'logement', 'Echéance travaux' => 'echeance', + 'Optin' => 'optin', 'Optin partenaires' => 'optin_partenaires', 'Coupons sélectionnés' => 'reflist'); + + $mail = new cubeMail(); + $mail->charset = 'UTF-8'; + $mail->subject = '[Chéquier avantages] Validation de coupon'; + $mail->from = 'noreply@chequieravantages.fr'; + $mail->replyTo = 'noreply@chequiavantages.fr'; + $mail->to = 'projetrenogaz@grdf.fr'; + $mail->to = 'pierric.soustre@external.grdf.fr'; + $mail->to = 'caroline.gaulin@grdf.fr'; + $mail->bcc = 'test@cubedesigners.com'; + $body = ''; + + foreach ($fields as $k => $f) { + $body .= $k . ' : ' . $this->args[$f] . "\r\n"; + $datas[$f] = $this->args[$f]; + } + $datas['date'] = TIME; + + $c = $core->con->openCursor('grdf' . $annee); + $c->datas = json_encode($datas); + $c->insert(); + + $mail->body = $body; + $mail->send(); + } + + public function grdfCoupon2015() + { + $id = $this->args['id']; + + $this->outputXML = false; + $couponsRoot = WS_BOOKS . '/working/' . $id . '/commerce/'; + + $xml = simplexml_load_file($couponsRoot . 'references.xml'); + // Check hash + $hash = md5('ae' . $_GET['nom'] . '25' . $_GET['ref']); + if ($hash != $_GET['h']) { + exit; + } + $refs = explode(',', $_GET['ref']); + + $tmp = cubeFiles::tempnam(); + $pdftk = new CubeIT_CommandLine('pdftk'); + $pdftk->setPath(CONVERTER_PATH); + foreach ($refs as $ref) { + $file = $couponsRoot . $ref . '.pdf'; + $pdftk->setArg(null, $file); + } + $pdftk->setArg(null, 'output'); + $pdftk->setArg(null, $tmp); + $pdftk->execute(); + + header('Content-Type: application/pdf'); + header('Content-Disposition: inline; filename="CouponChequier.pdf"'); + + readfile($tmp); + unlink($tmp); + exit; + } + + public function grdfCoupon() + { + + $id = $this->args['id']; + + if ($id == 13372) { + return $this->grdfCoupon2015(); + } + + $this->outputXML = false; + $couponsRoot = WS_BOOKS . '/working/' . $id . '/commerce/'; + + $xml = simplexml_load_file($couponsRoot . 'references.xml'); + // Check hash + $hash = md5('ae' . $_GET['nom'] . '25' . $_GET['ref']); + if ($hash != $_GET['h']) { + exit; + } + $refs = explode(',', $_GET['ref']); + $pdf = new FPDI(); + foreach ($refs as $ref) { + + foreach ($xml->xpath('//item[@reference=\'' . $ref . '\']') as $item) { + $code = (string)$item['code']; + } + + $file = $couponsRoot . $ref . '.pdf'; + + $pdf->setSourceFile($file); + $idx = $pdf->importPage(1); + $pdf->AddPage(); + $pdf->useTemplate($idx); + $pdf->SetXY(11, 12); + $pdf->SetFont('Helvetica', '', 12); + $pdf->SetTextColor(0, 0, 0); + $pdf->Cell(180, 10, utf8_decode(trim($_GET['civilite'] . ' ' . $_GET['prenom'] . ' ' . $_GET['nom']) . ',')); + $pdf->SetXY(135, 203); + $pdf->SetFont('Helvetica', 'B', 16); + $pdf->Cell(50, 15, $code, 0, 1, "C"); + } + $pdf->Output('coupon.pdf', 'I'); + } + + public function grdfExcel12568() + { + global $core; + $this->outputXML = false; + + if (!isset($_GET['annee'])) { + $_GET['annee'] = 2014; + } + $annee = $_GET['annee']; + + if ($annee == 2013) { + $id = 11222; + } elseif ($annee == 2014) { + $id = 12779; + } + + + $couponsRoot = WS_BOOKS . '/working/' . $id . '/commerce/'; + + $xml = simplexml_load_file($couponsRoot . 'references.xml'); + + $cols = array('Date' => 'date', 'Civilité' => 'civilite', 'Prénom' => 'prenom', 'Nom' => 'nom', + 'E-mail' => 'email', 'Adresse' => 'adresse', 'Code postal' => 'codepostal', 'Ville' => 'ville', + 'Téléphone' => 'telephone', 'Connu par' => 'connu', 'Energie' => 'energie', 'Type de logement' => 'logement', + 'Echéance travaux' => 'echeance', + 'Optin' => 'optin', 'Optin partenaires' => 'optin_partenaires'); + $refs = array(); + foreach ($xml->xpath('//item') as $i) { + $refs[(string)$i['reference']] = $i['name']; + } + + // + $h = ''; + $h .= ''; + foreach ($cols as $l => $k) { + $h .= ''; + } + foreach ($refs as $k => $l) { + $h .= ''; + } + $h .= ''; + + $r = $core->con->select('SELECT * FROM grdf' . $annee); + while ($r->fetch()) { + $d = json_decode($r->datas); + $rl = explode(',', $d->reflist); + $h .= ''; + foreach ($cols as $l => $k) { + $v = $d->$k; + if ($k == 'date') { + $v = date('Y-m-d H:i', $v); + } + $h .= ''; + } + foreach ($refs as $k => $l) { + $v = in_array($k, $rl) ? '1' : '0'; + $h .= ''; + } + $h .= ''; + } + + $h .= '
' . utf8_decode($l) . '' . utf8_decode($l) . '
' . utf8_decode($v) . '' . utf8_decode($v) . '
'; + + if (!file_exists(ROOT . '/cache/12568/')) { + mkdir(ROOT . '/cache/12568/', 0777, true); + } + file_put_contents(ROOT . '/cache/12568/chequieravantage.xls', $h); + http::redirect('/cache/12568/chequieravantage.xls'); + exit; + } + + public function proxy() + { + ob_end_clean(); + fb(netHttp::quickGet($_GET['u'], 'php://output')); + $this->outputXML = false; + } + + public function wescoRef() + { + global $core; + + $this->args['ref'] = str_replace(' ', '', $this->args['ref']); + $ref = ltrim(substr($this->args['ref'], strlen($this->args['ref']) - 5), '0'); + + $r = $core->con->select('SELECT url FROM wescoref WHERE ref="' . $core->con->escape($ref) . '"'); + if ($r->count()) { + header('Location: ' . $r->url); + exit; + } + $cache = ROOT . '/cache/wesco/' . $this->args['ref']; + if (file_exists($cache)) { + header('Location: ' . file_get_contents($cache)); + exit; + } + $url = 'http://www.wesco-eshop.fr/catalogsearch/result/?q=' . $ref; + $doc = new DOMDocument(); + $doc->loadHTML(file_get_contents($url)); + $x = simplexml_import_dom($doc); + $xpath = $x->xpath('//a[@class="product-image"]'); + if (count($xpath) > 0) { + $r = $xpath[0]['href']; + file_put_contents($cache, $r); + header('Location: ' . $r); + exit; + } + header('Location: http://www.wesco-eshop.fr'); + } + + public function wsref() + { + global $core; + $e = explode('|', $_GET['ref'], 2); + $type = trim($e[0]); + $ref = trim($e[1]); + $nzref = ltrim($e[1], '0'); + + $r = $core->con->select("SELECT * FROM wsref WHERE (ref='" . $core->con->escape($ref) . "' OR ref='" . $core->con->escape($nzref) . "') AND type='" . $core->con->escape($type) . "'"); + if ($r->count()) { + header('Location: ' . $r->url); + } + } + + public function pierronRef() + { + global $core; + $ref = $this->args['ref']; + + $r = $core->con->select('SELECT url FROM pierronref WHERE ref="' . $core->con->escape($ref) . '"'); + if ($r->count()) { + header('Location: ' . $r->url); + exit; + } + header('Location: http://www.pierron.fr/'); + } + + public function flfRef() + { + global $core; + + $r = $core->con->select('SELECT url FROM flfref WHERE ref="' . $core->con->escape($this->args['ref']) . '"'); + if ($r->count()) { + if (strpos($r->url, 'http') === 0) { + header('Location: ' . $r->url); + } else { + header('Location: https://www.flf.fr' . $r->url); + } + exit; + } + $q = 'site:https://www.flf.fr/formation-professionnelle/ "Code stage : ' . $this->args['ref'] . '"'; + header('Location: https://www.google.fr/search?q=' . urlencode($q) . '&ie=utf-8&oe=utf-8&btnI'); + exit; + } + + public function collection() + { + global $core; + $id = $this->callArgs[0]; + $os = $this->callArgs[1]; + $resolution = $this->callArgs[2]; + $local = (isset($this->callArgs[3]) && $this->callArgs[3] != '0') ? $this->callArgs[3] : null; + $appver = (isset($this->callArgs[4]) && $this->callArgs[4]) ? $this->callArgs[4] : '1.0'; + + if (is_null($resolution)) { + $resolution = 150; + } + + if ($id == 4) { + $resolution = 150; + } + + $this->outputXML = false; + header('Content-type: application/json'); + + $appverf = str_replace('.', '_', $appver); + + $cache = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.' . $resolution . '.' . $appverf . '.json'; + $update = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.' . $resolution . '.' . $appverf . '.update'; + + if (file_exists($update) && filemtime(__FILE__) > filemtime($update)) { + unlink($update); + } + + if (!is_null($local) && file_exists($update) && file_get_contents($update) == $local) { + echo 'false'; + exit; + } + + $limit = TIME - 72000; + if (!file_exists($cache) || !file_exists($update) || filemtime($cache) < $limit) { + $r = $core->con->select('SELECT *,online_' . $os . ' AS v FROM book_collection_compile WHERE online_' . $os . '!=\'\' AND collection_id=\'' . $core->con->escape($id) . '\' ORDER BY compile_date DESC'); + while ($r->fetch()) { + if (version_compare($r->v, $appver, '>')) { + continue; + } + + $version = $r->compile_date; + + $daoCollection = new wsDAOCollection($core->con); + $collection = $daoCollection->selectById($id); + + $ns = $collection->settings['namespace']; + + $vcompo = WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/composition.json'; + $composition = json_decode(file_get_contents($vcompo)); + + $couvertures = array(); + $vroot = WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/' . $os . '/'; + + $publications = array(); + $langs = array(); + + foreach ($composition as $k => $g) { + foreach ($g->publications as $l => $p) { + $publications[] = $p->id; + } + } + + $daoBook = new wsDAOBook($core->con); + $books = $daoBook->selectByIds($publications); + + $langsnames = array(); + foreach ($composition as $k => $g) { + foreach ($g->publications as $l => $p) { + $book = $books[$p->id]; + $root = WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/' . $os . '/' . $p->id; + $couv = $root . '/cover.jpg'; + if (!file_exists($couv)) { + $couv = $root . '/data/thumbnails/p1.jpg'; + } + $couvertures[$p->id] = base64_encode(file_get_contents($couv)); + $composition[$k]->publications[$l]->width = $book->parametres->width; + $composition[$k]->publications[$l]->height = $book->parametres->height; + $composition[$k]->publications[$l]->lang = $book->lang; + $completeLang = $book->lang; + if ($book->parametres->country) { + $composition[$k]->publications[$l]->country = $book->parametres->country; + $completeLang .= '_' . mb_strtoupper($book->parametres->country); + } + $composition[$k]->publications[$l]->completelang = $completeLang; + + $langs[] = $completeLang; + } + } + + $langs = array_unique($langs); + + $w2h = new wiki2xhtml(); + $w2h->setOpt('active_pre', 0); + + $contents = $collection->contents; + foreach ($langs as $lang) { + $e = explode('_', $lang); + $langsnames[$lang] = cubeLang::getNameByCode($e[0]); + $contents[$lang]['apropos'] = $w2h->transform($contents[$lang]['apropos']); + if (isset($collection->theme['ad_' . $lang])) { + $ad = WS_COLLECTIONS . '/working/' . $id . '/' . $collection->theme['ad_' . $lang]; + if (file_exists($ad)) { + $contents[$lang]['ad'] = base64_encode(file_get_contents($ad)); + } + } + } + + + $traductions = array(); + $r = $core->con->select('SELECT traductions,lang_id FROM langues WHERE lang_id IN(\'' . implode('\',\'', $langs) . '\')'); + while ($r->fetch()) { + $traductions[$r->lang_id] = json_decode($r->traductions); + } + + $theme = $collection->theme; + $settings = $collection->settings; + + $d = array('id' => $id, 'res' => $resolution, 'ns' => $ns, 'langs' => $langs, 'langnames' => $langsnames, 'time' => $version, 'datas' => $composition, 'couvertures' => $couvertures, 'traductions' => $traductions, 'contents' => $contents, 'theme' => $theme, 'settings' => $settings); + if (!$collection->settings['offline']) { + $d = array_merge($d, $this->_getManifest($publications, '/fluidbook/collections/versions/' . $id . '/' . $version . '/' . $os, $books, $resolution)); + } + + $dao = new wsDAOCollection($core->con); + $col = $dao->selectById($id); + + $json = json_encode($d); + file_put_contents($cache, $json); + file_put_contents($update, $version); + + break; + } + } else { + $d = json_decode(file_get_contents($cache), true); + } + + $force = false; + if (!is_null($local)) { + $lcompo = WS_COLLECTIONS . '/versions/' . $id . '/' . $local . '/composition.json'; + if (!file_exists($lcompo)) { + $force = true; + } + } + + + $d['forceUpdate'] = $force; + echo json_encode($d); + exit; + } + + protected function _getManifest($publications, $dir, $books, $resolution) + { + global $core; + $res = array(); + $res['manifest'] = array('assetRoot' => 'https://workshop.fluidbook.com' . $dir . '/', 'autoDownload' => false); + $res['manifestPub'] = array(); + + $bundles = array(); + + $removeFromRelative = realpath(ROOT . '/' . $dir) . '/'; + $daoTheme = new wsDAOTheme($core->con); + + foreach ($publications as $p) { + $res['manifestPub'][$p] = array('assetRoot' => 'https://workshop.fluidbook.com' . $dir . '/', 'autoDownload' => true); + + $r = $p . '/'; + $iterator = CubeIT_Files::getRecursiveDirectoryIterator(ROOT . $dir . '/' . $p); + $book = $books[$p]; + $reso = $resolution; + + $theme = $daoTheme->selectById($book->theme); + $orders = $this->_getBundles($book); + $regexp = $this->_getRegExpManifest($r, $book, $theme, $reso); + $reg = $regexp['reg']; + $exclude = $regexp['exclude']; + + $b = array(); + + foreach ($iterator as $k => $f) { + if ($f->isDir()) { + continue; + } + $path = str_replace($removeFromRelative, '', $k); + + foreach ($exclude as $e) { + if (preg_match('|' . $e . '|', $path)) { + continue 2; + } + } + + $order = $this->_inFirstManifest($path, $orders, $reg); + + if (!isset($b[$order])) { + $b[$order] = array(); + } + + $b[$order][] = $path; + } + + $bundles[] = array('name' => 'p_' . $p, 'contents' => $b['loading']); + $res['manifestPub'][$p]['bundles'] = array(); + + foreach ($b as $name => $contents) { + if ($name == 'loading') { + continue; + } + $k = array_search($name, $orders); + $res['manifestPub'][$p]['bundles'][$k] = array('name' => $name, 'contents' => $contents); + } + ksort($res['manifestPub'][$p]['bundles']); + $res['manifestPub'][$p]['bundles'] = array_values($res['manifestPub'][$p]['bundles']); + } + + $res['manifest']['bundles'] = $bundles; + return $res; + } + + protected function _getRegExpManifest($r, $book, $theme, $resolution) + { + $reg = array(); + $reg['loading'] = array('^' . $r . 'style/(.*).css$', '^' . $r . 'index.html$', '^' . $r . 'data/style/(.*)$', '^' . $r . 'data/(.*).js$', '^' . $r . 'data/images/' . $theme->parametres->logoLoader . '$', '^' . $r . 'style/fonts/(.*).ttf$', '^' . $r . 'data/images/interface-down.svg$', '^' . $r . 'plugins/(.*)$'); + $reg['extras'] = array('^' . $r . 'data/links/(.*).mp4$', '^' . $r . 'data/links/(.*).ogv$', '^' . $r . 'data/links/(.*).webm$', '^' . $r . 'data/(.*).pdf$', '^' . $r . 'cover.jpg$'); + $reg['thumbnails'] = array('^' . $r . 'data/thumbnails/p(\d+).jpg$'); + for ($i = 1; $i <= $book->parametres->pages; $i++) { + $var = 'content_' . $i; + $reg[$var] = array('^' . $r . 'data/background/\d+/t' . $i . '.jpg$', '^' . $r . 'data/contents/p' . $i . '.svg$'); + } + $reg['urgents'] = array('^' . $r . 'images/(.*)$', '^' . $r . 'data/images/(.*)$', '^' . $r . 'data/links/(.*).jpg$', '^' . $r . 'data/links/(.*).png$'); + $reg['loading'] = array_merge($reg['loading'], $reg['urgents']); + + + $exclude = array(); + if ($resolution == 150) { + $er = 300; + } else { + $er = 150; + } + $exclude[] = '^' . $r . 'data/background/' . $er . '/t\d+.jpg$'; + return array('reg' => $reg, 'exclude' => $exclude); + } + + protected function _inFirstManifest($p, $orders, $reg) + { + foreach ($orders as $list) { + foreach ($reg[$list] as $v) { + if (preg_match('|' . $v . '|', $p)) { + return $list; + } + } + } + return $list; + } + + protected function _getBundles($book) + { + $res = array(0 => 'loading', 20001 => 'extras', 20000 => 'thumbnails', 1 => 'urgents'); + for ($i = 1; $i <= $book->parametres->pages; $i++) { + $k = 2 + $i; + $res[$k] = 'content_' . $i; + } + return $res; + } + + public function collectionPushRegister() + { + global $core; + + $c = $core->con->openCursor('book_collection_push'); + $c->collection_id = $_POST['id']; + $c->token = $_POST['token']; + $c->datas = $_POST['datas']; + $c->platform = $_POST['platform']; + $c->locale = $_POST['locale']; + $c->last_visit = TIME; + try { + $c->insert(); + } catch (Exception $e) { + $c->update('WHERE collection_id=\'' . $core->con->escape($_POST['id']) . '\' AND token=\'' . $core->con->escape($_POST['token']) . '\''); + } + } + + public function getFluidbookPage() + { + global $core; + $this->outputXML = false; + + $id = $this->callArgs[0]; + $page = $this->callArgs[1]; + + $dao = new wsDAOBook($core->con); + $pages = $dao->getPagesOfBook($id, false); + $p = $pages[$page]; + + $file = wsDocument::getDir($p['document_id']) . '/html/t150-' . $p['document_page'] . '.jpg'; + + ob_end_clean(); + cubeHTTP::contentType($file); + echo file_get_contents($file); + die; + } + + public function orderRemarkable() + { + try { + $html = file_get_contents(WS_FILES . '/services/remarkableorder.html'); + $billing_address = $_POST['details']['firstname'] . ' ' . $_POST['details']['lastname'] . '

' . $_POST['details']['billing_company'] . "
" . $_POST['details']['billing_address'] . '
' . $_POST['details']['billing_zip'] . ' ' . $_POST['details']['billing_city']; + + $params = array('company', 'address', 'zip', 'city'); + foreach ($params as $param) { + if (trim($_POST['details']['shipping_' . $param]) == '') { + $_POST['details']['shipping_' . $param] = $_POST['details']['billing_' . $param]; + } + } + $shipping_address = $_POST['details']['shipping_company'] . "
" . $_POST['details']['shipping_address'] . '
' . $_POST['details']['shipping_zip'] . ' ' . $_POST['details']['shipping_city']; + + if ($_POST['fpv'] == 'hidden') { + $fraisport = ''; + } else { + $fraisport = ''; + $fraisport .= 'Frais de livraison'; + $fraisport .= '' . $_POST['fpv'] . ''; + $fraisport .= ''; + } + + $lignes = []; + foreach ($_POST['items'] as $item) { + $ligne = ''; + $ligne .= '' . $item[0] . ''; + $ligne .= '' . $item[1] . ''; + $ligne .= '' . $item[2] . ''; + $ligne .= '' . $item[3] . ''; + $ligne .= '' . $item[4] . ''; + $ligne .= ''; + $lignes[] = $ligne; + } + + $lignes = implode('', $lignes); + $totalttc = $_POST['totalttc']; + + $replace = ['billing_address', 'shipping_address', 'totalttc', 'fraisport', 'lignes']; + foreach ($replace as $item) { + if (isset($$item)) { + $html = str_replace('$' . $item, str_replace('€', '€', $$item), $html); + } + } + + $mail = new cubeMail(); + $mail->type = "html"; + $mail->from = 'transfert-fluidbook@remarkable.fr'; + $mail->to = $_POST['details']['email']; + $mail->bcc = 'transfert-fluidbook@remarkable.fr'; + $mail->bcc = 'test@cubedesigners.com'; + $mail->subject = '[Remarkable] Votre commande'; + $mail->body = $html; + $mail->send(); + } catch (Exception $e) { + + } + } + + public function bourbonSuggestion() + { + global $core; + try { + $mail = new PhpMimeMailParser\Parser(); + $mail->setText(base64_decode($_POST['email'])); + $from = $mail->getAddresses('from'); + $from = $from[0]['address']; + + + $attachments = $mail->getAttachments(); + foreach ($attachments as $k => $attachment) { + if ($attachment->getFilename() !== 'suggestion.txt') { + continue; + } + $suggestion = $attachment->getContent(); + $parts = explode('/|!/', $suggestion); + $c = $core->con->openCursor('bourbon_suggestions'); + $c->type = $parts[2]; + $c->suggestion = $parts[3]; + $c->date = round($parts[1] / 1000); + $c->from = $from; + $c->page = $parts[0]; + $c->insert(); + + break; + } + file_put_contents('/tmp/bourbonSuggestion', print_r($mail, true)); + file_put_contents('/tmp/bourbonSuggestionAttach', print_r($attachments, true)); + } catch (Exception $e) { + file_put_contents('/tmp/bourbonSuggestion', print_r($e, true)); + } + + $body = "Hello,\r\nThis automatic message confirms that your suggestion has been received.\r\nPlease do not reply to this e-mail,\r\nThank you"; + + $ack = new Zend_Mail(); + $ack->setFrom('no-reply@bourbonoffshore.com'); + $ack->setSubject('Suggestion acknowledge'); + $ack->setBodyText($body); + + $ack->addTo($from); + $ack->send(); + } + + public function downloadBourbonSuggestions58412() + { + global $core; + $this->outputXML = false; + $r = $core->con->select('SELECT * FROM bourbon_suggestions ORDER BY date DESC'); + $excel = new PHPExcel(); + $excel->setActiveSheetIndex(0); + $defaultStyle = $excel->getDefaultStyle(); + $defaultStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); + $defaultStyle->getAlignment()->setWrapText(true); + $s = $excel->getActiveSheet(); + $s->setTitle('Suggestions'); + $s->setCellValueByColumnAndRow(0, 1, 'Sender'); + $s->setCellValueByColumnAndRow(1, 1, 'Date'); + $s->setCellValueByColumnAndRow(2, 1, 'Type'); + $s->setCellValueByColumnAndRow(3, 1, 'Page'); + $s->setCellValueByColumnAndRow(4, 1, 'Suggestion content'); + + $line = 2; + while ($r->fetch()) { + $date = date('Y-m-d H:i:s', round($r->date)); + + $s->setCellValueByColumnAndRow(0, $line, $r->from); + $s->setCellValueByColumnAndRow(1, $line, $date); + $s->setCellValueByColumnAndRow(2, $line, $r->type); + $s->setCellValueByColumnAndRow(3, $line, $r->page); + $s->setCellValueByColumnAndRow(4, $line, $r->suggestion); + + $line++; + } + + for ($i = 0; $i <= 4; $i++) { + $s->getColumnDimensionByColumn($i)->setAutoSize(true); + } + + + header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header('Content-Disposition: attachment;filename="fluidbook-suggestions.xlsx"'); + header('Cache-Control: max-age=0'); + // If you're serving to IE 9, then the following may be needed + header('Cache-Control: max-age=1'); + // If you're serving to IE over SSL, then the following may be needed + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past + header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified + header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 + header('Pragma: public'); // HTTP/1.0 + + $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); + ob_end_clean(); + $writer->save('php://output'); + exit; + + } + + public static function subscribe() + { + if (isset($_POST['form'])) { + switch ($_POST['form']) { + case 'avery': + self::_subscribeAvery(); + break; + default: + break; + } + } + } + + public function proxypinterest() + { + $this->outputXML = false; + + header('Content-type: application/rss+xml'); + $url = 'https://www.pinterest.com/' . urlencode($this->args['url']); + ob_end_clean(); + $c = file_get_contents($url); + echo $c; + exit; + } + + public static function _subscribeAvery() + { + $api = new CubeIT_Services_Mailchimp('5d00b7e601cf1948cb95de06630878ae-us19'); + $data = [ + 'email' => $_POST['email'], + 'COMPANY' => $_POST['company'], + 'ACTIVITY' => $_POST['activity'], + 'COUNTRY' => $_POST['country'], + 'OPTIN' => $_POST['subscribe'], + 'LANGUAGE' => $_POST['locale'] + ]; + $api->subscribe('33699982ca', $data); + + } + + public static function gpuSeparators() + { + return ['Direct3D', 'DirectX', 'OpenGL', 'Graphics']; + } + + public static function gpuTests() + { + return [546, 544, 680, 632]; + } + + public function gup() + { + global $core; + + $this->outputXML = false; + + $rgpu = $gpu = trim(base64_decode($_GET['gup'])); + + if (strstr($gpu, 'ANGLE (')) { + if (preg_match('/\((.*)\)/', $gpu, $matches)) { + if (strlen($matches[1]) > 8) { + $gpu = $matches[1]; + } + } + + $split = self::gpuSeparators(); + + foreach ($split as $item) { + $e = explode($item, $gpu); + if (count($e) > 1) { + $gpu = $e[0]; + break; + } + } + } + $version = 40; + + + $gpu = trim($gpu); + + $c = $core->con->openCursor('gpu_log'); + $c->gpu = $gpu; + $c->rgpu = $rgpu; + $c->date = time(); + $c->insert(); + + $r = $core->con->select("SELECT * FROM gpu WHERE version=" . $version . " AND (gpu='" . $core->con->escape($gpu) . "' OR rgpu='" . $core->con->escape($rgpu) . "')"); + header('Content-type: text/plain'); + + if ($r->isEmpty()) { + $search = self::searchGFXDevice($c->gpu, $rgpu, $version); + + $doc = new DOMDocument(); + $doc->strictErrorChecking = FALSE; + $doc->loadHTML($search['body']); + $xml = simplexml_import_dom($doc); + + $links = $xml->xpath("//a"); + foreach ($links as $link) { + $h = parse_url($link['href']); + if (trim($h['path']) != 'subtest_results_of_device.jsp') { + continue; + } + parse_str($h['query'], $data); + if (!isset($data['id'])) { + continue; + } + $values = $link->xpath('span[@class=\'value\']'); + if (!count($values)) { + continue; + } + $value = trim((string)$values[0]); + if ($value == 'N/A') { + continue; + } + if (!stristr($value, 'frame')) { + continue; + } + $res[$data['id']] = intval($value); + } + + $scoreids = self::gpuTests(); + $num = 0; + $score = 0; + foreach ($scoreids as $scoreid) { + if (!isset($res[$scoreid])) { + continue; + } + $num++; + $score += $res[$scoreid]; + } + + $score /= $num; + $score = round($score); + + $c = $core->con->openCursor('gpu'); + $c->gpu = $gpu; + $c->rgpu = $rgpu; + $c->page = $search['body']; + $c->url = $search['url']; + $c->version = $version; + $c->benchmark = serialize($res); + $c->score = $score; + $c->date = time(); + $c->insert(); + } else { + $r->fetch(); + $score = $r->score; + } + ob_end_clean(); + echo $score; + exit; + } + + public static function searchGFXDevice($gpu, $raw, $gfxVersion = 40) + { + // First intention direct request + $ugpu = urlencode($gpu); + $url = 'https://gfxbench.com/device.jsp?benchmark=gfx' . $gfxVersion . '&hwname=' . $ugpu . '&D=' . $ugpu . '&testgroup=graphics&var=median'; + + $f = self::_curlRequest($url); + if (!stristr($f, '

No such device')) { + return ['url' => $url, 'body' => $f]; + } + + // Second intention is to use the search engine to lookup the gpu by name + $tests = self::gpuTests(); + $cacheLimit = max(time() - 21600, filemtime(__FILE__)); + foreach ($tests as $test) { + + // Test cache file + $cacheTest = WS_CACHE . '/gfxbench/test_' . $test; + if (!file_exists($cacheTest) || filemtime($cacheTest) < $cacheLimit) { + $f = self::_curlRequest('https://gfxbench.com/result.jsp?benchmark=gfx' . $gfxVersion . '&test=' . $test . '&order=median&base=device'); + + // Search database is stored as js variables in code + $variables = ['gpuNameLookup', 'deviceId', 'gpuName']; + $v = []; + foreach ($variables as $variable) { + if (preg_match('/var ' . $variable . ' = ([^;]*);/ui', $f, $matches)) { + eval('$v[$variable] = ' . $matches[1] . ';'); + } + } + file_put_contents($cacheTest, serialize($v)); + } else { + $v = unserialize(file_get_contents($cacheTest)); + } + + $key = null; + foreach ($v['gpuNameLookup'] as $k => $item) { + if (stristr($item, $raw)) { + $key = $k; + break; + } + } + + // If we get a device id, we have the the device page :) + if (null !== $key) { + $deviceKey = array_search($key, $v['gpuName']); + $deviceId = $v['deviceId'][$deviceKey]; + $url = 'https://gfxbench.com/device.jsp?benchmark=gfx' . $gfxVersion . '&did=' . $deviceId; + $f = self::_curlRequest($url); + if (!stristr($f, '

No such device')) { + return ['url' => $url, 'body' => $f]; + } + } + } + return ['url' => '', 'body' => '']; + } + + + protected static function _curlRequest($url) + { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_VERBOSE, 1); + curl_setopt($ch, CURLOPT_HEADER, 1); + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'); + $response = curl_exec($ch); + $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + return substr($response, $header_size); + } }