diff options
author | Sam Tuke <samtuke@owncloud.com> | 2013-01-06 18:53:32 +0000 |
---|---|---|
committer | Sam Tuke <samtuke@owncloud.com> | 2013-01-06 18:53:32 +0000 |
commit | a68b597e83d22c82d1bf784b1245e03baafd4820 (patch) | |
tree | 9b920413ec801b2a0ba624123c4e66aad9466b9e | |
parent | 015787fbb3152661144d21119bb9ea662a8ba0a3 (diff) | |
parent | 08d7b8ce309baebfc243727c215b63e732bf874e (diff) | |
download | nextcloud-server-a68b597e83d22c82d1bf784b1245e03baafd4820.tar.gz nextcloud-server-a68b597e83d22c82d1bf784b1245e03baafd4820.zip |
Merge branch 'master' into files_encryption
-rw-r--r-- | apps/files/ajax/rename.php | 2 | ||||
-rw-r--r-- | apps/files/js/filelist.js | 2 | ||||
-rw-r--r-- | apps/files/js/files.js | 20 | ||||
-rw-r--r-- | config/config.sample.php | 3 | ||||
-rw-r--r-- | core/ajax/update.php | 67 | ||||
-rw-r--r-- | core/css/styles.css | 3 | ||||
-rw-r--r-- | core/templates/update.php | 31 | ||||
-rw-r--r-- | lib/app.php | 4 | ||||
-rw-r--r-- | lib/base.php | 90 | ||||
-rw-r--r-- | lib/db.php | 10 |
10 files changed, 177 insertions, 55 deletions
diff --git a/apps/files/ajax/rename.php b/apps/files/ajax/rename.php index 45448279fa1..cb0bec399d1 100644 --- a/apps/files/ajax/rename.php +++ b/apps/files/ajax/rename.php @@ -12,7 +12,7 @@ $file = stripslashes($_GET["file"]); $newname = stripslashes($_GET["newname"]); // Delete -if( OC_Files::move( $dir, $file, $dir, $newname )) { +if( $newname !== '.' and OC_Files::move( $dir, $file, $dir, $newname )) { OCP\JSON::success(array("data" => array( "dir" => $dir, "file" => $file, "newname" => $newname ))); } else{ diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 96dd0323d29..22d701d8ff9 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -149,7 +149,7 @@ var FileList={ event.stopPropagation(); event.preventDefault(); var newname=input.val(); - if (Files.containsInvalidCharacters(newname)) { + if (!Files.isFileNameValid(newname)) { return false; } if (newname != name) { diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 6a37d9e7f53..ba2495eb728 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -26,17 +26,29 @@ Files={ }); procesSelection(); }, - containsInvalidCharacters:function (name) { + isFileNameValid:function (name) { + if (name === '.') { + $('#notification').text(t('files', "'.' is an invalid file name.")); + $('#notification').fadeIn(); + return false; + } + if (name.length == 0) { + $('#notification').text(t('files', "File name cannot be empty.")); + $('#notification').fadeIn(); + return false; + } + + // check for invalid characters var invalid_characters = ['\\', '/', '<', '>', ':', '"', '|', '?', '*']; for (var i = 0; i < invalid_characters.length; i++) { if (name.indexOf(invalid_characters[i]) != -1) { $('#notification').text(t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.")); $('#notification').fadeIn(); - return true; + return false; } } $('#notification').fadeOut(); - return false; + return true; } }; $(document).ready(function() { @@ -509,7 +521,7 @@ $(document).ready(function() { $(this).append(input); input.focus(); input.change(function(){ - if (type != 'web' && Files.containsInvalidCharacters($(this).val())) { + if (type != 'web' && !Files.isFileNameValid($(this).val())) { return; } else if( type == 'folder' && $('#dir').val() == '/' && $(this).val() == 'Shared') { $('#notification').text(t('files','Invalid folder name. Usage of "Shared" is reserved by Owncloud')); diff --git a/config/config.sample.php b/config/config.sample.php index 2eec7847f9c..b1655d02830 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -115,6 +115,9 @@ $CONFIG = array( */ // "datadirectory" => "", +/* Enable maintenance mode to disable ownCloud */ +"maintenance" => false, + "apps_paths" => array( /* Set an array of path for your apps directories diff --git a/core/ajax/update.php b/core/ajax/update.php new file mode 100644 index 00000000000..20ab045c892 --- /dev/null +++ b/core/ajax/update.php @@ -0,0 +1,67 @@ +<?php +set_time_limit(0); +$RUNTIME_NOAPPS = true; +require_once '../../lib/base.php'; + +if (OC::checkUpgrade(false)) { + $updateEventSource = new OC_EventSource(); + $watcher = new UpdateWatcher($updateEventSource); + OC_Hook::connect('update', 'success', $watcher, 'success'); + OC_Hook::connect('update', 'error', $watcher, 'error'); + OC_Hook::connect('update', 'error', $watcher, 'failure'); + $watcher->success('Turned on maintenance mode'); + try { + $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/db_structure.xml'); + $watcher->success('Updated database'); + } catch (Exception $exception) { + $watcher->failure($exception->getMessage()); + } + $minimizerCSS = new OC_Minimizer_CSS(); + $minimizerCSS->clearCache(); + $minimizerJS = new OC_Minimizer_JS(); + $minimizerJS->clearCache(); + OC_Config::setValue('version', implode('.', OC_Util::getVersion())); + OC_App::checkAppsRequirements(); + // load all apps to also upgrade enabled apps + OC_App::loadApps(); + OC_Config::setValue('maintenance', false); + $watcher->success('Turned off maintenance mode'); + $watcher->done(); +} + +class UpdateWatcher { + /** + * @var \OC_EventSource $eventSource; + */ + private $eventSource; + + public function __construct($eventSource) { + $this->eventSource = $eventSource; + } + + public function success($message) { + OC_Util::obEnd(); + $this->eventSource->send('success', $message); + ob_start(); + } + + public function error($message) { + OC_Util::obEnd(); + $this->eventSource->send('error', $message); + ob_start(); + } + + public function failure($message) { + OC_Util::obEnd(); + $this->eventSource->send('failure', $message); + $this->eventSource->close(); + die(); + } + + public function done() { + OC_Util::obEnd(); + $this->eventSource->send('done', ''); + $this->eventSource->close(); + } + +}
\ No newline at end of file diff --git a/core/css/styles.css b/core/css/styles.css index d635916b5ae..6e1cef72eda 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -214,7 +214,8 @@ div.jp-play-bar, div.jp-seek-bar { padding:0; } .pager { list-style:none; float:right; display:inline; margin:.7em 13em 0 0; } .pager li { display:inline-block; } -li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; color:#FF3B3B; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } +li.update, li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; cursor:default; } +.error { color:#FF3B3B; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { overflow:hidden; text-overflow:ellipsis; } .hint { background-image:url('../img/actions/info.png'); background-repeat:no-repeat; color:#777777; padding-left:25px; background-position:0 0.3em;} .separator { display:inline; border-left:1px solid #d3d3d3; border-right:1px solid #fff; height:10px; width:0px; margin:4px; } diff --git a/core/templates/update.php b/core/templates/update.php new file mode 100644 index 00000000000..c9f3144f257 --- /dev/null +++ b/core/templates/update.php @@ -0,0 +1,31 @@ +<ul> + <li class='update'> + <?php echo $l->t('Updating ownCloud to version %s, this may take a while.', array($_['version'])); ?><br /><br /> + </li> +</ul> +<script> + $(document).ready(function () { + OC.EventSource.requesttoken = oc_requesttoken; + var updateEventSource = new OC.EventSource(OC.webroot+'/core/ajax/update.php'); + updateEventSource.listen('success', function(message) { + $('<span>').append(message).append('<br />').appendTo($('.update')); + }); + updateEventSource.listen('error', function(message) { + $('<span>').addClass('error').append(message).append('<br />').appendTo($('.update')); + }); + updateEventSource.listen('failure', function(message) { + $('<span>').addClass('error').append(message).append('<br />').appendTo($('.update')); + $('<span>') + .addClass('error bold') + .append('<br />') + .append(t('core', 'The update was unsuccessful. Please report this issue to the <a href="https://github.com/owncloud/core/issues" target="_blank">ownCloud community</a>.')) + .appendTo($('.update')); + }); + updateEventSource.listen('done', function(message) { + $('<span>').addClass('bold').append('<br />').append(t('core', 'The update was successful. Redirecting you to ownCloud now.')).appendTo($('.update')); + setTimeout(function () { + window.location.href = OC.webroot; + }, 3000); + }); + }); +</script>
\ No newline at end of file diff --git a/lib/app.php b/lib/app.php index 30f76300365..e60bce2a201 100644 --- a/lib/app.php +++ b/lib/app.php @@ -648,12 +648,15 @@ class OC_App{ if ($currentVersion) { $installedVersion = $versions[$app]; if (version_compare($currentVersion, $installedVersion, '>')) { + $info = self::getAppInfo($app); OC_Log::write($app, 'starting app upgrade from '.$installedVersion.' to '.$currentVersion, OC_Log::DEBUG); try { OC_App::updateApp($app); + OC_Hook::emit('update', 'success', 'Updated '.$info['name'].' app'); } catch (Exception $e) { echo 'Failed to upgrade "'.$app.'". Exception="'.$e->getMessage().'"'; + OC_Hook::emit('update', 'failure', 'Failed to update '.$info['name'].' app: '.$e->getMessage()); die; } OC_Appconfig::setValue($app, 'installed_version', OC_App::getAppVersion($app)); @@ -678,6 +681,7 @@ class OC_App{ if(!isset($info['require']) or (($version[0].'.'.$version[1])>$info['require'])) { OC_Log::write('core', 'App "'.$info['name'].'" ('.$app.') can\'t be used because it is not compatible with this version of ownCloud', OC_Log::ERROR); OC_App::disable( $app ); + OC_Hook::emit('update', 'success', 'Disabled '.$info['name'].' app because it is not compatible'); } } } diff --git a/lib/base.php b/lib/base.php index ef203b33c2b..3d3e7d59f90 100644 --- a/lib/base.php +++ b/lib/base.php @@ -193,6 +193,15 @@ class OC ); } + public static function checkConfig() { + if (file_exists(OC::$SERVERROOT . "/config/config.php") and !is_writable(OC::$SERVERROOT . "/config/config.php")) { + $tmpl = new OC_Template('', 'error', 'guest'); + $tmpl->assign('errors', array(1 => array('error' => "Can't write into config directory 'config'", 'hint' => "You can usually fix this by giving the webserver user write access to the config directory in owncloud"))); + $tmpl->printPage(); + exit(); + } + } + public static function checkInstalled() { // Redirect to installer if not installed @@ -219,43 +228,35 @@ class OC } } - public static function checkUpgrade() - { - if (OC_Config::getValue('installed', false)) { - $installedVersion = OC_Config::getValue('version', '0.0.0'); - $currentVersion = implode('.', OC_Util::getVersion()); - if (version_compare($currentVersion, $installedVersion, '>')) { - // Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions - if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { - if (!OC_Util::ishtaccessworking()) { - if (!file_exists(OC::$SERVERROOT . '/data/.htaccess')) { - OC_Setup::protectDataDirectory(); - } - } - } - OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG); - $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml'); - if (!$result) { - echo 'Error while upgrading the database'; - die(); - } - if (file_exists(OC::$SERVERROOT . "/config/config.php") and !is_writable(OC::$SERVERROOT . "/config/config.php")) { - $tmpl = new OC_Template('', 'error', 'guest'); - $tmpl->assign('errors', array(1 => array('error' => "Can't write into config directory 'config'", 'hint' => "You can usually fix this by giving the webserver user write access to the config directory in owncloud"))); - $tmpl->printPage(); - exit; - } - $minimizerCSS = new OC_Minimizer_CSS(); - $minimizerCSS->clearCache(); - $minimizerJS = new OC_Minimizer_JS(); - $minimizerJS->clearCache(); - OC_Config::setValue('version', implode('.', OC_Util::getVersion())); - OC_App::checkAppsRequirements(); - // load all apps to also upgrade enabled apps - OC_App::loadApps(); - } - } - } + public static function checkMaintenanceMode() { + // Allow ajax update script to execute without being stopped + if (OC_Config::getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') { + $tmpl = new OC_Template('', 'error', 'guest'); + $tmpl->assign('errors', array(1 => array('error' => 'ownCloud is in maintenance mode'))); + $tmpl->printPage(); + exit(); + } + } + + public static function checkUpgrade($showTemplate = true) { + if (OC_Config::getValue('installed', false)) { + $installedVersion = OC_Config::getValue('version', '0.0.0'); + $currentVersion = implode('.', OC_Util::getVersion()); + if (version_compare($currentVersion, $installedVersion, '>')) { + if ($showTemplate && !OC_Config::getValue('maintenance', false)) { + OC_Config::setValue('maintenance', true); + OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG); + $tmpl = new OC_Template('', 'update', 'guest'); + $tmpl->assign('version', OC_Util::getVersionString()); + $tmpl->printPage(); + exit(); + } else { + return true; + } + } + return false; + } + } public static function initTemplateEngine() { @@ -273,12 +274,6 @@ class OC OC_Util::addScript('search', 'result'); OC_Util::addScript('router'); - if (OC_Config::getValue('installed', false)) { - if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { - OC_Util::addScript('backgroundjobs'); - } - } - OC_Util::addStyle("styles"); OC_Util::addStyle("multiselect"); OC_Util::addStyle("jquery-ui-1.8.16.custom"); @@ -403,11 +398,13 @@ class OC stream_wrapper_register('static', 'OC_StaticStreamWrapper'); stream_wrapper_register('close', 'OC_CloseStreamWrapper'); + self::checkConfig(); self::checkInstalled(); self::checkSSL(); self::initSession(); self::initTemplateEngine(); - self::checkUpgrade(); + self::checkMaintenanceMode(); + self::checkUpgrade(); $errors = OC_Util::checkServer(); if (count($errors) > 0) { @@ -482,6 +479,11 @@ class OC if (OC_Util::issetlocaleworking() == false) { OC_Log::write('core', 'setting locate to en_US.UTF-8 failed. Support is probably not installed on your system', OC_Log::ERROR); } + if (OC_Config::getValue('installed', false)) { + if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { + OC_Util::addScript('backgroundjobs'); + } + } } /** diff --git a/lib/db.php b/lib/db.php index 7e60b41d230..74e7ca5b0e0 100644 --- a/lib/db.php +++ b/lib/db.php @@ -495,8 +495,9 @@ class OC_DB { if (PEAR::isError($previousSchema)) { $error = $previousSchema->getMessage(); $detail = $previousSchema->getDebugInfo(); - OC_Log::write('core', 'Failed to get existing database structure for upgrading ('.$error.', '.$detail.')', OC_Log::FATAL); - return false; + $message = 'Failed to get existing database structure for updating ('.$error.', '.$detail.')'; + OC_Log::write('core', $message, OC_Log::FATAL); + throw new Exception($message); } // Make changes and save them to an in-memory file @@ -523,8 +524,9 @@ class OC_DB { if (PEAR::isError($op)) { $error = $op->getMessage(); $detail = $op->getDebugInfo(); - OC_Log::write('core', 'Failed to update database structure ('.$error.', '.$detail.')', OC_Log::FATAL); - return false; + $message = 'Failed to update database structure ('.$error.', '.$detail.')'; + OC_Log::write('core', $message, OC_Log::FATAL); + throw new Exception($message); } return true; } |