diff options
author | Simon Rettberg | 2014-06-27 21:15:35 +0200 |
---|---|---|
committer | Simon Rettberg | 2014-06-27 21:15:35 +0200 |
commit | 16aacada0f64240b7ec35026f0e207b7d0fd37df (patch) | |
tree | 26f4b434cd8eb7d3cd0c8eaba6cff6d096213761 /inc | |
parent | Added doxygen comments to Taskmanager class (diff) | |
download | slx-admin-16aacada0f64240b7ec35026f0e207b7d0fd37df.tar.gz slx-admin-16aacada0f64240b7ec35026f0e207b7d0fd37df.tar.xz slx-admin-16aacada0f64240b7ec35026f0e207b7d0fd37df.zip |
New SysConfig module for adding a logo
Diffstat (limited to 'inc')
-rw-r--r-- | inc/configmodule.inc.php | 34 | ||||
-rw-r--r-- | inc/download.inc.php | 93 | ||||
-rw-r--r-- | inc/util.inc.php | 99 |
3 files changed, 141 insertions, 85 deletions
diff --git a/inc/configmodule.inc.php b/inc/configmodule.inc.php index 5c789275..c0838b5c 100644 --- a/inc/configmodule.inc.php +++ b/inc/configmodule.inc.php @@ -36,16 +36,44 @@ class ConfigModule ); $data = json_encode($ownEntry); if ($data === false) Util::traceError('Serializing the AD data failed.'); - $name = CONFIG_TGZ_LIST_DIR . '/modules/AD_AUTH_id_' . $id . '.' . mt_rand() . '.tgz'; + $moduleTgz = CONFIG_TGZ_LIST_DIR . '/modules/AD_AUTH_id_' . $id . '.' . mt_rand() . '.tgz'; Database::exec("UPDATE configtgz_module SET filepath = :filename, contents = :contents WHERE moduleid = :id LIMIT 1", array( 'id' => $id, - 'filename' => $name, + 'filename' => $moduleTgz, 'contents' => $data )); // Add archive file name to array before returning it $ownEntry['moduleid'] = $id; - $ownEntry['filename'] = $name; + $ownEntry['filename'] = $moduleTgz; return $ownEntry; } + public static function insertBrandingModule($title, $archive) + { + Database::exec("INSERT INTO configtgz_module (title, moduletype, filepath, contents) " + . " VALUES (:title, 'BRANDING', '', '')", array('title' => $title)); + $id = Database::lastInsertId(); + if (!is_numeric($id)) Util::traceError('Inserting new Branding Module into DB did not yield a numeric insert id'); + // Move tgz + $moduleTgz = CONFIG_TGZ_LIST_DIR . '/modules/BRANDING_id_' . $id . '.' . mt_rand() . '.tgz'; + $task = Taskmanager::submit('MoveFile', array( + 'source' => $archive, + 'destination' => $moduleTgz + )); + $task = Taskmanager::waitComplete($task, 3000); + if (Taskmanager::isFailed($task) || $task['statusCode'] !== TASK_FINISHED) { + Taskmanager::addErrorMessage($task); + Database::exec("DELETE FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array( + 'moduleid' => $id + )); + return false; + } + // Update with path + Database::exec("UPDATE configtgz_module SET filepath = :filename WHERE moduleid = :id LIMIT 1", array( + 'id' => $id, + 'filename' => $moduleTgz + )); + return true; + } + } diff --git a/inc/download.inc.php b/inc/download.inc.php new file mode 100644 index 00000000..6485ee24 --- /dev/null +++ b/inc/download.inc.php @@ -0,0 +1,93 @@ +<?php + +class Download +{ + + /** + * Common initialization for download and downloadToFile + * Return file handle to header file + */ + private static function initCurl($url, $timeout, &$head) + { + $ch = curl_init(); + if ($ch === false) + Util::traceError('Could not initialize cURL'); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, ceil($timeout / 2)); + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_AUTOREFERER, true); + curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); + curl_setopt($ch, CURLOPT_MAXREDIRS, 6); + $tmpfile = tempnam('/tmp/', 'bwlp-'); + $head = fopen($tmpfile, 'w+b'); + if ($head === false) + Util::traceError("Could not open temporary head file $tmpfile for writing."); + curl_setopt($ch, CURLOPT_WRITEHEADER, $head); + return $ch; + } + + /** + * Read 10kb from the given file handle, seek to 0 first, + * close the file after reading. Returns data read + */ + private static function getContents($fh) + { + fseek($fh, 0, SEEK_SET); + $data = fread($fh, 10000); + fclose($fh); + return $data; + } + + /** + * Download file, obey given timeout in seconds + * Return data on success, false on failure + */ + public static function asString($url, $timeout, &$code) + { + $ch = self::initCurl($url, $timeout, $head); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $data = curl_exec($ch); + $head = self::getContents($head); + if (preg_match('#^HTTP/\d+\.\d+ (\d+) #', $head, $out)) { + $code = (int) $out[1]; + } else { + $code = 999; + } + curl_close($ch); + return $data; + } + + /** + * Download a file from a URL to file. + * + * @param string $target destination path to download file to + * @param string $url URL of file to download + * @param int $timeout timeout in seconds + * @param int $code HTTP status code passed out by reference + * @return boolean + */ + public static function toFile($target, $url, $timeout, &$code) + { + $fh = fopen($target, 'wb'); + if ($fh === false) + Util::traceError("Could not open $target for writing."); + $ch = self::initCurl($url, $timeout, $head); + curl_setopt($ch, CURLOPT_FILE, $fh); + $res = curl_exec($ch); + $head = self::getContents($head); + curl_close($ch); + fclose($fh); + if ($res === false) { + @unlink($target); + return false; + } + if (preg_match_all('#\bHTTP/\d+\.\d+ (\d+) #', $head, $out, PREG_SET_ORDER)) { + $code = (int) $out[count($out)-1][1]; + } else { + $code = '999 ' . curl_error($ch); + } + return true; + } + +} diff --git a/inc/util.inc.php b/inc/util.inc.php index ea28b4fa..45a6b684 100644 --- a/inc/util.inc.php +++ b/inc/util.inc.php @@ -79,88 +79,6 @@ class Util } /** - * Common initialization for download and downloadToFile - * Return file handle to header file - */ - private static function initCurl($url, $timeout, &$head) - { - $ch = curl_init(); - if ($ch === false) - Util::traceError('Could not initialize cURL'); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, ceil($timeout / 2)); - curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_AUTOREFERER, true); - curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); - curl_setopt($ch, CURLOPT_MAXREDIRS, 6); - $tmpfile = '/tmp/' . mt_rand() . '-' . time(); - $head = fopen($tmpfile, 'w+b'); - if ($head === false) - Util::traceError("Could not open temporary head file $tmpfile for writing."); - curl_setopt($ch, CURLOPT_WRITEHEADER, $head); - return $ch; - } - - /** - * Read 10kb from the given file handle, seek to 0 first, - * close the file after reading. Returns data read - */ - private static function getContents($fh) - { - fseek($fh, 0, SEEK_SET); - $data = fread($fh, 10000); - fclose($fh); - return $data; - } - - /** - * Download file, obey given timeout in seconds - * Return data on success, false on failure - */ - public static function download($url, $timeout, &$code) - { - $ch = self::initCurl($url, $timeout, $head); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - $data = curl_exec($ch); - $head = self::getContents($head); - if (preg_match('#^HTTP/\d+\.\d+ (\d+) #', $head, $out)) { - $code = (int) $out[1]; - } else { - $code = 999; - } - curl_close($ch); - return $data; - } - - /** - * Download file, obey given timeout in seconds - * Return true on success, false on failure - */ - public static function downloadToFile($target, $url, $timeout, &$code) - { - $fh = fopen($target, 'wb'); - if ($fh === false) - Util::traceError("Could not open $target for writing."); - $ch = self::initCurl($url, $timeout, $head); - curl_setopt($ch, CURLOPT_FILE, $fh); - $res = curl_exec($ch); - $head = self::getContents($head); - curl_close($ch); - fclose($fh); - if ($res === false) { - @unlink($target); - return false; - } - if (preg_match('#^HTTP/\d+\.\d+ (\d+) #', $head, $out)) { - $code = (int) $out[1]; - } else { - $code = '999 ' . curl_error($ch); - } - return true; - } - - /** * Convert given number to human readable file size string. * Will append Bytes, KiB, etc. depending on magnitude of number. * @@ -249,5 +167,22 @@ class Util return true; } + + /** + * Return contents of given file as string, but only read up to maxBytes bytes. + * + * @param string $file file to read + * @param int $maxBytes maximum length to read + * @return boolean success or failure + */ + public static function readFile($file, $maxBytes = 1000) + { + $fh = @fopen($file, 'rb'); + if ($fh === false) + return false; + $data = fread($fh, $maxBytes); + fclose($fh); + return $data; + } } |