summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/Application.php13
-rw-r--r--core/Controller/OccController.php147
-rw-r--r--core/js/files/iedavclient.js1
-rw-r--r--core/js/setupchecks.js6
-rw-r--r--core/l10n/lb.js1
-rw-r--r--core/l10n/lb.json1
-rw-r--r--core/l10n/ro.js16
-rw-r--r--core/l10n/ro.json16
-rw-r--r--core/l10n/sv.js1
-rw-r--r--core/l10n/sv.json1
-rw-r--r--core/routes.php1
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'],