diff options
author | Lukas Reschke <lukas@owncloud.com> | 2016-06-26 12:55:05 +0200 |
---|---|---|
committer | Lukas Reschke <lukas@owncloud.com> | 2016-06-26 12:55:05 +0200 |
commit | 7a9d60d87eb8e4414e5fe05830b088d426ff810d (patch) | |
tree | 0fc97a7eacfd071475afd8bc6d4372babacb5740 /core | |
parent | 5387b942c44e05b87ba2a0fd54168f5278a31344 (diff) | |
parent | 52eab2a61a5d27b64fcd0440b91f854c052933a9 (diff) | |
download | nextcloud-server-7a9d60d87eb8e4414e5fe05830b088d426ff810d.tar.gz nextcloud-server-7a9d60d87eb8e4414e5fe05830b088d426ff810d.zip |
Merge remote-tracking branch 'upstream/master' into master-upstream-sync
Diffstat (limited to 'core')
-rw-r--r-- | core/Application.php | 13 | ||||
-rw-r--r-- | core/Controller/OccController.php | 147 | ||||
-rw-r--r-- | core/js/files/iedavclient.js | 1 | ||||
-rw-r--r-- | core/js/setupchecks.js | 6 | ||||
-rw-r--r-- | core/l10n/lb.js | 1 | ||||
-rw-r--r-- | core/l10n/lb.json | 1 | ||||
-rw-r--r-- | core/l10n/ro.js | 16 | ||||
-rw-r--r-- | core/l10n/ro.json | 16 | ||||
-rw-r--r-- | core/l10n/sv.js | 1 | ||||
-rw-r--r-- | core/l10n/sv.json | 1 | ||||
-rw-r--r-- | core/routes.php | 1 |
11 files changed, 200 insertions, 4 deletions
diff --git a/core/Application.php b/core/Application.php index a87917b626a..8ea2672e54e 100644 --- a/core/Application.php +++ b/core/Application.php @@ -32,6 +32,7 @@ use OC\AppFramework\Utility\TimeFactory; use OC\Core\Controller\AvatarController; use OC\Core\Controller\LoginController; use OC\Core\Controller\LostController; +use OC\Core\Controller\OccController; use OC\Core\Controller\TokenController; use OC\Core\Controller\TwoFactorChallengeController; use OC\Core\Controller\UserController; @@ -125,6 +126,18 @@ class Application extends App { $c->query('SecureRandom') ); }); + $container->registerService('OccController', function(SimpleContainer $c) { + return new OccController( + $c->query('AppName'), + $c->query('Request'), + $c->query('Config'), + new \OC\Console\Application( + $c->query('Config'), + $c->query('ServerContainer')->getEventDispatcher(), + $c->query('Request') + ) + ); + }); /** * Core class wrappers diff --git a/core/Controller/OccController.php b/core/Controller/OccController.php new file mode 100644 index 00000000000..917d02f37f1 --- /dev/null +++ b/core/Controller/OccController.php @@ -0,0 +1,147 @@ +<?php +/** + * @author Victor Dubiniuk <dubiniuk@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OC\Core\Controller; + +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\JSONResponse; +use OC\Console\Application; +use OCP\IConfig; +use OCP\IRequest; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\BufferedOutput; + +class OccController extends Controller { + + /** @var array */ + private $allowedCommands = [ + 'app:disable', + 'app:enable', + 'app:getpath', + 'app:list', + 'check', + 'config:list', + 'maintenance:mode', + 'status', + 'upgrade' + ]; + + /** @var IConfig */ + private $config; + /** @var Application */ + private $console; + + /** + * OccController constructor. + * + * @param string $appName + * @param IRequest $request + * @param IConfig $config + * @param Application $console + */ + public function __construct($appName, IRequest $request, + IConfig $config, Application $console) { + parent::__construct($appName, $request); + $this->config = $config; + $this->console = $console; + } + + /** + * @PublicPage + * @NoCSRFRequired + * + * Execute occ command + * Sample request + * POST http://domain.tld/index.php/occ/status', + * { + * 'params': { + * '--no-warnings':'1', + * '--output':'json' + * }, + * 'token': 'someToken' + * } + * + * @param string $command + * @param string $token + * @param array $params + * + * @return JSONResponse + * @throws \Exception + */ + public function execute($command, $token, $params = []) { + try { + $this->validateRequest($command, $token); + + $output = new BufferedOutput(); + $formatter = $output->getFormatter(); + $formatter->setDecorated(false); + $this->console->setAutoExit(false); + $this->console->loadCommands(new ArrayInput([]), $output); + + $inputArray = array_merge(['command' => $command], $params); + $input = new ArrayInput($inputArray); + + $exitCode = $this->console->run($input, $output); + $response = $output->fetch(); + + $json = [ + 'exitCode' => $exitCode, + 'response' => $response + ]; + + } catch (\UnexpectedValueException $e){ + $json = [ + 'exitCode' => 126, + 'response' => 'Not allowed', + 'details' => $e->getMessage() + ]; + } + return new JSONResponse($json); + } + + /** + * Check if command is allowed and has a valid security token + * @param $command + * @param $token + */ + protected function validateRequest($command, $token){ + if (!in_array($this->request->getRemoteAddress(), ['::1', '127.0.0.1', 'localhost'])) { + throw new \UnexpectedValueException('Web executor is not allowed to run from a different host'); + } + + if (!in_array($command, $this->allowedCommands)) { + throw new \UnexpectedValueException(sprintf('Command "%s" is not allowed to run via web request', $command)); + } + + $coreToken = $this->config->getSystemValue('updater.secret', ''); + if ($coreToken === '') { + throw new \UnexpectedValueException( + 'updater.secret is undefined in config/config.php. Either browse the admin settings in your ownCloud and click "Open updater" or define a strong secret using <pre>php -r \'echo password_hash("MyStrongSecretDoUseYourOwn!", PASSWORD_DEFAULT)."\n";\'</pre> and set this in the config.php.' + ); + } + + if (!password_verify($token, $coreToken)) { + throw new \UnexpectedValueException( + 'updater.secret does not match the provided token' + ); + } + } +} diff --git a/core/js/files/iedavclient.js b/core/js/files/iedavclient.js index 9e83f5b9a22..a0185fb3bec 100644 --- a/core/js/files/iedavclient.js +++ b/core/js/files/iedavclient.js @@ -29,6 +29,7 @@ var self = this; var xhr = this.xhrProvider(); + headers = headers || {}; if (this.userName) { headers['Authorization'] = 'Basic ' + btoa(this.userName + ':' + this.password); diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js index f987c9f04e6..280c8d08c99 100644 --- a/core/js/setupchecks.js +++ b/core/js/setupchecks.js @@ -76,7 +76,8 @@ $.ajax({ type: 'PROPFIND', url: url, - complete: afterCall + complete: afterCall, + allowAuthErrors: true }); return deferred.promise(); }, @@ -209,7 +210,8 @@ $.ajax({ type: 'GET', url: OC.linkTo('', oc_dataURL+'/htaccesstest.txt?t=' + (new Date()).getTime()), - complete: afterCall + complete: afterCall, + allowAuthErrors: true }); return deferred.promise(); }, diff --git a/core/l10n/lb.js b/core/l10n/lb.js index 92d10ed3661..dfd8e7a0f62 100644 --- a/core/l10n/lb.js +++ b/core/l10n/lb.js @@ -83,6 +83,7 @@ OC.L10N.register( "can share" : "kann deelen", "can edit" : "kann änneren", "create" : "erstellen", + "change" : "änneren", "delete" : "läschen", "access control" : "Zougrëffskontroll", "Share" : "Deelen", diff --git a/core/l10n/lb.json b/core/l10n/lb.json index 382da7f58d2..e1cfc10d33c 100644 --- a/core/l10n/lb.json +++ b/core/l10n/lb.json @@ -81,6 +81,7 @@ "can share" : "kann deelen", "can edit" : "kann änneren", "create" : "erstellen", + "change" : "änneren", "delete" : "läschen", "access control" : "Zougrëffskontroll", "Share" : "Deelen", diff --git a/core/l10n/ro.js b/core/l10n/ro.js index e73ec5cf79f..fad21a73e58 100644 --- a/core/l10n/ro.js +++ b/core/l10n/ro.js @@ -9,6 +9,11 @@ OC.L10N.register( "Invalid image" : "Imagine invalidă", "An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.", "No temporary profile picture available, try again" : "Nu este disponibilă nicio imagine temporară a profilului, încearcă din nou", + "Crop is not square" : "Selecția nu este pătrată", + "Couldn't reset password because the token is invalid" : "Parola nu a putut fi resetată deoarece token-ul este invalid", + "Couldn't reset password because the token is expired" : "Parola nu a putut fi resetată deoarece token-ul a expirat", + "Couldn't send reset email. Please make sure your username is correct." : "Nu a putut fi trimis un email pentru resetare. Asigură-te că numele de utilizator este corect.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nu a putut fi trimis un email pentru resetare deoarece nu există o adresă email pentru acest utilizator. Contactează-ți administratorul.", "%s password reset" : "%s resetare parola", "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "Error loading tags" : "Eroare la încărcarea etichetelor", @@ -115,6 +120,7 @@ OC.L10N.register( "So-so password" : "Parolă medie", "Good password" : "Parolă bună", "Strong password" : "Parolă puternică", + "Error occurred while checking server setup" : "A apărut o eroare la verificarea configurației serverului", "Shared" : "Partajat", "Shared with {recipients}" : "Partajat cu {recipients}", "Error" : "Eroare", @@ -151,6 +157,8 @@ OC.L10N.register( "access control" : "control acces", "Could not unshare" : "Nu s-a putut elimina partajarea", "Share details could not be loaded for this item." : "Nu s-au putut încărca detaliile de partajare pentru acest element.", + "No users or groups found for {search}" : "Nu au fost găsiți utilizatori sau grupuri pentru {search}", + "No users found for {search}" : "Nu au fost găsiți utilizatori pentru {search}", "An error occurred. Please try again" : "A apărut o eroare. Încearcă din nou", "Share" : "Partajează", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partajează cu persoane din alte instanțe ownCloud folosind sintaxa nume_utilizator@exemplu.com/owncloud", @@ -175,6 +183,7 @@ OC.L10N.register( "sunny" : "însorit", "Hello {name}" : "Salut {name}", "new" : "nou", + "_download %n file_::_download %n files_" : ["descarcă %n fișier","descarcă %n fișiere","descarcă %n fișiere"], "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Actualizarea este în progres, părăsirea acestei pagini ar putea duce la întreruperea procesului în unele medii.", "Updating to {version}" : "Actualizare la {version}", "An error occurred." : "A apărut o eroare.", @@ -238,8 +247,12 @@ OC.L10N.register( "New password" : "Noua parolă", "New Password" : "Noua parolă", "Reset password" : "Resetează parola", + "This ownCloud instance is currently in single user mode." : "Această instanță ownCloud este momentan în modul de utilizare de către un singur utilizator.", + "This means only administrators can use the instance." : "Asta înseamnă că doar administratorii pot folosi instanța.", + "Contact your system administrator if this message persists or appeared unexpectedly." : "Contactează-ți administratorul de sistem dacă acest mesaj persistă sau a apărut neașteptat.", "Thank you for your patience." : "Îți mulțumim pentru răbdare.", "Two-step verification" : "Verificare în doi pași", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A fost activată securitatea sporită pentru contul tău. Te rugăm să te autentifici folosind un al doilea factor.", "Cancel login" : "Anulează autentificarea", "Please authenticate using the selected factor." : "Autentifică-te folosind factorul ales.", "An error occured while verifying the token" : "A apărut o eroare la verificarea jetonului", @@ -254,6 +267,7 @@ OC.L10N.register( "Detailed logs" : "Loguri detaliate", "Update needed" : "E necesară actualizarea", "Please use the command line updater because you have a big instance." : "Folosește actualizarea din linia de comandă deoarece ai o instanță mare.", - "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme." + "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme.", + "This page will refresh itself when the %s instance is available again." : "Această pagină se va reîmprospăta atunci când %s instance e disponibil din nou." }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/core/l10n/ro.json b/core/l10n/ro.json index c154312dab6..b922cf154a6 100644 --- a/core/l10n/ro.json +++ b/core/l10n/ro.json @@ -7,6 +7,11 @@ "Invalid image" : "Imagine invalidă", "An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.", "No temporary profile picture available, try again" : "Nu este disponibilă nicio imagine temporară a profilului, încearcă din nou", + "Crop is not square" : "Selecția nu este pătrată", + "Couldn't reset password because the token is invalid" : "Parola nu a putut fi resetată deoarece token-ul este invalid", + "Couldn't reset password because the token is expired" : "Parola nu a putut fi resetată deoarece token-ul a expirat", + "Couldn't send reset email. Please make sure your username is correct." : "Nu a putut fi trimis un email pentru resetare. Asigură-te că numele de utilizator este corect.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nu a putut fi trimis un email pentru resetare deoarece nu există o adresă email pentru acest utilizator. Contactează-ți administratorul.", "%s password reset" : "%s resetare parola", "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "Error loading tags" : "Eroare la încărcarea etichetelor", @@ -113,6 +118,7 @@ "So-so password" : "Parolă medie", "Good password" : "Parolă bună", "Strong password" : "Parolă puternică", + "Error occurred while checking server setup" : "A apărut o eroare la verificarea configurației serverului", "Shared" : "Partajat", "Shared with {recipients}" : "Partajat cu {recipients}", "Error" : "Eroare", @@ -149,6 +155,8 @@ "access control" : "control acces", "Could not unshare" : "Nu s-a putut elimina partajarea", "Share details could not be loaded for this item." : "Nu s-au putut încărca detaliile de partajare pentru acest element.", + "No users or groups found for {search}" : "Nu au fost găsiți utilizatori sau grupuri pentru {search}", + "No users found for {search}" : "Nu au fost găsiți utilizatori pentru {search}", "An error occurred. Please try again" : "A apărut o eroare. Încearcă din nou", "Share" : "Partajează", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partajează cu persoane din alte instanțe ownCloud folosind sintaxa nume_utilizator@exemplu.com/owncloud", @@ -173,6 +181,7 @@ "sunny" : "însorit", "Hello {name}" : "Salut {name}", "new" : "nou", + "_download %n file_::_download %n files_" : ["descarcă %n fișier","descarcă %n fișiere","descarcă %n fișiere"], "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Actualizarea este în progres, părăsirea acestei pagini ar putea duce la întreruperea procesului în unele medii.", "Updating to {version}" : "Actualizare la {version}", "An error occurred." : "A apărut o eroare.", @@ -236,8 +245,12 @@ "New password" : "Noua parolă", "New Password" : "Noua parolă", "Reset password" : "Resetează parola", + "This ownCloud instance is currently in single user mode." : "Această instanță ownCloud este momentan în modul de utilizare de către un singur utilizator.", + "This means only administrators can use the instance." : "Asta înseamnă că doar administratorii pot folosi instanța.", + "Contact your system administrator if this message persists or appeared unexpectedly." : "Contactează-ți administratorul de sistem dacă acest mesaj persistă sau a apărut neașteptat.", "Thank you for your patience." : "Îți mulțumim pentru răbdare.", "Two-step verification" : "Verificare în doi pași", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A fost activată securitatea sporită pentru contul tău. Te rugăm să te autentifici folosind un al doilea factor.", "Cancel login" : "Anulează autentificarea", "Please authenticate using the selected factor." : "Autentifică-te folosind factorul ales.", "An error occured while verifying the token" : "A apărut o eroare la verificarea jetonului", @@ -252,6 +265,7 @@ "Detailed logs" : "Loguri detaliate", "Update needed" : "E necesară actualizarea", "Please use the command line updater because you have a big instance." : "Folosește actualizarea din linia de comandă deoarece ai o instanță mare.", - "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme." + "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme.", + "This page will refresh itself when the %s instance is available again." : "Această pagină se va reîmprospăta atunci când %s instance e disponibil din nou." },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" }
\ No newline at end of file diff --git a/core/l10n/sv.js b/core/l10n/sv.js index ce2c918a839..abc3a916707 100644 --- a/core/l10n/sv.js +++ b/core/l10n/sv.js @@ -298,6 +298,7 @@ OC.L10N.register( "Thank you for your patience." : "Tack för ditt tålamod.", "Two-step verification" : "Tvåfaktorsautentisering", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Utökad säkerhet har aktiverats på ditt konto. Vänligen autentisera med en andra faktor.", + "Cancel login" : "Avbryt inloggning", "Please authenticate using the selected factor." : "Vänligen autentisera med vald faktor.", "An error occured while verifying the token" : "Ett fel uppstod vid verifiering av token.", "You are accessing the server from an untrusted domain." : "Du ansluter till servern från en osäker domän.", diff --git a/core/l10n/sv.json b/core/l10n/sv.json index 63b69ec557f..a0c32823747 100644 --- a/core/l10n/sv.json +++ b/core/l10n/sv.json @@ -296,6 +296,7 @@ "Thank you for your patience." : "Tack för ditt tålamod.", "Two-step verification" : "Tvåfaktorsautentisering", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Utökad säkerhet har aktiverats på ditt konto. Vänligen autentisera med en andra faktor.", + "Cancel login" : "Avbryt inloggning", "Please authenticate using the selected factor." : "Vänligen autentisera med vald faktor.", "An error occured while verifying the token" : "Ett fel uppstod vid verifiering av token.", "You are accessing the server from an untrusted domain." : "Du ansluter till servern från en osäker domän.", diff --git a/core/routes.php b/core/routes.php index 402277d8f3e..c473408e2e9 100644 --- a/core/routes.php +++ b/core/routes.php @@ -48,6 +48,7 @@ $application->registerRoutes($this, [ ['name' => 'login#showLoginForm', 'url' => '/login', 'verb' => 'GET'], ['name' => 'login#logout', 'url' => '/logout', 'verb' => 'GET'], ['name' => 'token#generateToken', 'url' => '/token/generate', 'verb' => 'POST'], + ['name' => 'occ#execute', 'url' => '/occ/{command}', 'verb' => 'POST'], ['name' => 'TwoFactorChallenge#selectChallenge', 'url' => '/login/selectchallenge', 'verb' => 'GET'], ['name' => 'TwoFactorChallenge#showChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'GET'], ['name' => 'TwoFactorChallenge#solveChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'POST'], |