]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add global auth backend for files external
authorRobin Appelman <icewind@owncloud.com>
Wed, 3 Feb 2016 17:29:24 +0000 (18:29 +0100)
committerRobin Appelman <icewind@owncloud.com>
Thu, 4 Feb 2016 13:57:17 +0000 (14:57 +0100)
apps/files_external/appinfo/application.php
apps/files_external/appinfo/routes.php
apps/files_external/controller/ajaxcontroller.php
apps/files_external/js/settings.js
apps/files_external/lib/auth/password/globalauth.php [new file with mode: 0644]
apps/files_external/lib/failedcache.php
apps/files_external/personal.php
apps/files_external/settings.php
apps/files_external/templates/settings.php

index 1bf258c48b4e9baddfaaede0f07fe5c0372eef82..d6552fa680cdcddf45322af30c411a3f8e6c7749 100644 (file)
@@ -110,6 +110,7 @@ class Application extends App {
                        $container->query('OCA\Files_External\Lib\Auth\Password\SessionCredentials'),
                        $container->query('OCA\Files_External\Lib\Auth\Password\LoginCredentials'),
                        $container->query('OCA\Files_External\Lib\Auth\Password\UserProvided'),
+                       $container->query('OCA\Files_External\Lib\Auth\Password\GlobalAuth'),
 
                        // AuthMechanism::SCHEME_OAUTH1 mechanisms
                        $container->query('OCA\Files_External\Lib\Auth\OAuth1\OAuth1'),
index c3149a300cff83ae5a8fb0e18b7efc0f37a7889a..d5b927c022755306c2882696c1af1ffafddeec6c 100644 (file)
@@ -44,7 +44,12 @@ namespace OCA\Files_External\AppInfo;
                                'url' => '/ajax/public_key.php',
                                'verb' => 'POST',
                                'requirements' => array()
-                       )
+                       ),
+                       [
+                               'name' => 'Ajax#saveGlobalCredentials',
+                               'url' => '/globalcredentials',
+                               'verb' => 'POST'
+                       ]
                )
        )
 );
index cfccacb03ea19fac4a5aaaa092efe7feba5cbd69..86c1b657c91f2592dd05d9f61f816dec4ad0e97d 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace OCA\Files_External\Controller;
 
+use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
 use OCP\AppFramework\Controller;
 use OCP\IRequest;
 use OCP\AppFramework\Http\JSONResponse;
@@ -31,10 +32,13 @@ use OCA\Files_External\Lib\Auth\PublicKey\RSA;
 class AjaxController extends Controller {
        /** @var RSA */
        private $rsaMechanism;
+       /** @var GlobalAuth  */
+       private $globalAuth;
 
-       public function __construct($appName, IRequest $request, RSA $rsaMechanism) {
+       public function __construct($appName, IRequest $request, RSA $rsaMechanism, GlobalAuth $globalAuth) {
                parent::__construct($appName, $request);
                $this->rsaMechanism = $rsaMechanism;
+               $this->globalAuth = $globalAuth;
        }
 
        private function generateSshKeys() {
@@ -61,4 +65,8 @@ class AjaxController extends Controller {
                ));
        }
 
+       public function saveGlobalCredentials($uid, $user, $password) {
+               $this->globalAuth->saveAuth($uid, $user, $password);
+               return true;
+       }
 }
index 26df203091e33512d63e99e1df553214b899a77e..0837555f534b251d6761e7ed3138099208593181 100644 (file)
@@ -1338,6 +1338,33 @@ $(document).ready(function() {
                }
        });
 
+       $('#global_credentials').on('submit', function() {
+               var $form = $(this);
+               var uid = $form.find('[name=uid]').val();
+               var user = $form.find('[name=username]').val();
+               var password = $form.find('[name=password]').val();
+               var $submit = $form.find('[type=submit]');
+               $submit.val(t('files_external', 'Saving...'));
+               $.ajax({
+                       type: 'POST',
+                       contentType: 'application/json',
+                       data: JSON.stringify({
+                               uid: uid,
+                               user: user,
+                               password: password
+                       }),
+                       url: OC.generateUrl('apps/files_external/globalcredentials'),
+                       dataType: 'json',
+                       success: function() {
+                               $submit.val(t('files_external', 'Saved'));
+                               setTimeout(function(){
+                                       $submit.val(t('files_external', 'Save'));
+                               }, 2500);
+                       }
+               });
+               return false;
+       });
+
        // global instance
        OCA.External.Settings.mountConfig = mountConfigListView;
 
diff --git a/apps/files_external/lib/auth/password/globalauth.php b/apps/files_external/lib/auth/password/globalauth.php
new file mode 100644 (file)
index 0000000..dcfea65
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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 OCA\Files_External\Lib\Auth\Password;
+
+use OCA\Files_External\Lib\Auth\IUserProvided;
+use OCA\Files_External\Lib\DefinitionParameter;
+use OCA\Files_External\Service\BackendService;
+use OCP\IL10N;
+use OCP\IUser;
+use OCA\Files_External\Lib\Auth\AuthMechanism;
+use OCA\Files_External\Lib\StorageConfig;
+use OCP\Security\ICredentialsManager;
+use OCP\Files\Storage;
+use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
+
+/**
+ * Global Username and Password
+ */
+class GlobalAuth extends AuthMechanism {
+
+       const CREDENTIALS_IDENTIFIER = 'password::global';
+
+       /** @var ICredentialsManager */
+       protected $credentialsManager;
+
+       public function __construct(IL10N $l, ICredentialsManager $credentialsManager) {
+               $this->credentialsManager = $credentialsManager;
+
+               $this
+                       ->setIdentifier('password::global')
+                       ->setVisibility(BackendService::VISIBILITY_DEFAULT)
+                       ->setScheme(self::SCHEME_PASSWORD)
+                       ->setText($l->t('Global Credentails'));
+       }
+
+       public function getAuth($uid) {
+               $auth = $this->credentialsManager->retrieve($uid, self::CREDENTIALS_IDENTIFIER);
+               if (!is_array($auth)) {
+                       return [];
+               } else {
+                       return $auth;
+               }
+       }
+
+       public function saveAuth($uid, $user, $password) {
+               $this->credentialsManager->store($uid, self::CREDENTIALS_IDENTIFIER, [
+                       'user' => $user,
+                       'password' => $password
+               ]);
+       }
+
+       public function manipulateStorageConfig(StorageConfig &$storage, IUser $user = null) {
+               if ($storage->getType() === StorageConfig::MOUNT_TYPE_ADMIN) {
+                       $uid = '';
+               } else {
+                       $uid = $user->getUID();
+               }
+               $credentials = $this->credentialsManager->retrieve($uid, self::CREDENTIALS_IDENTIFIER);
+
+               if (is_array($credentials)) {
+                       $storage->setBackendOption('user', $credentials['user']);
+                       $storage->setBackendOption('password', $credentials['password']);
+               }
+       }
+
+}
index 9e24c12f4b5d33e3cd230c4a11516b5b12d74a32..f9866f43058c8c3049c755fee7d2f8e4485f6b3e 100644 (file)
@@ -60,6 +60,10 @@ class FailedCache implements ICache {
                return;
        }
 
+       public function insert($file, array $data) {
+               return;
+       }
+
        public function update($id, array $data) {
                return;
        }
index 4d8f480ecc03db52ef8d6b4d0de78aa45d093665..f180b7e8f5c9882e42c1d21efeb3210a4e3d3ef0 100644 (file)
@@ -30,6 +30,7 @@ use \OCA\Files_External\Service\BackendService;
 $appContainer = \OC_Mount_Config::$app->getContainer();
 $backendService = $appContainer->query('OCA\Files_External\Service\BackendService');
 $userStoragesService = $appContainer->query('OCA\Files_external\Service\UserStoragesService');
+$globalAuth = $appContainer->query('OCA\Files_External\Lib\Auth\Password\GlobalAuth');
 
 $tmpl = new OCP\Template('files_external', 'settings');
 $tmpl->assign('encryptionEnabled', \OC::$server->getEncryptionManager()->isEnabled());
@@ -38,4 +39,7 @@ $tmpl->assign('storages', $userStoragesService->getStorages());
 $tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends()));
 $tmpl->assign('backends', $backendService->getAvailableBackends());
 $tmpl->assign('authMechanisms', $backendService->getAuthMechanisms());
+$uid = \OC::$server->getUserSession()->getUser()->getUID();
+$tmpl->assign('globalCredentials', $globalAuth->getAuth($uid));
+$tmpl->assign('globalCredentialsUid', $uid);
 return $tmpl->fetchPage();
index 0d83d26ff9793fb3bc26c37856fe5a529cf656c0..a5265c500d9fc476b6f1999aff6d4f8fbb50c11a 100644 (file)
@@ -32,6 +32,7 @@ use \OCA\Files_External\Service\BackendService;
 $appContainer = \OC_Mount_Config::$app->getContainer();
 $backendService = $appContainer->query('OCA\Files_External\Service\BackendService');
 $globalStoragesService = $appContainer->query('OCA\Files_external\Service\GlobalStoragesService');
+$globalAuth = $appContainer->query('OCA\Files_External\Lib\Auth\Password\GlobalAuth');
 
 \OC_Util::addVendorScript('select2/select2');
 \OC_Util::addVendorStyle('select2/select2');
@@ -44,4 +45,7 @@ $tmpl->assign('backends', $backendService->getAvailableBackends());
 $tmpl->assign('authMechanisms', $backendService->getAuthMechanisms());
 $tmpl->assign('dependencies', OC_Mount_Config::dependencyMessage($backendService->getBackends()));
 $tmpl->assign('allowUserMounting', $backendService->isUserMountingAllowed());
+$tmpl->assign('allowUserMounting', $backendService->isUserMountingAllowed());
+$tmpl->assign('globalCredentials', $globalAuth->getAuth(''));
+$tmpl->assign('globalCredentialsUid', '');
 return $tmpl->fetchPage();
index f7caf3d2caa495bd769e135e3212ee36ba4f10e7..8b453fe77c37c921b830c997a018ae8244b01a4d 100644 (file)
                }
        }
 ?>
-<form id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
+<form autocomplete="false" class="section" action="#"
+         id="global_credentials">
        <h2><?php p($l->t('External Storage')); ?></h2>
+       <p><?php p($l->t('Global Credentials')); ?></p>
+       <input type="text" name="username"
+                  autocomplete="false"
+                  value="<?php p($_['globalCredentials']['user']); ?>"
+                  placeholder="<?php p($l->t('Username')) ?>"/>
+       <input type="password" name="password"
+                  autocomplete="false"
+                  value="<?php p($_['globalCredentials']['password']); ?>"
+                  placeholder="<?php p($l->t('Password')) ?>"/>
+       <input type="hidden" name="uid"
+                  value="<?php p($_['globalCredentialsUid']); ?>"/>
+       <input type="submit" value="<?php p($l->t('Save')) ?>"/>
+</form>
+<form id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
        <?php if (isset($_['dependencies']) and ($_['dependencies']<>'')) print_unescaped(''.$_['dependencies'].''); ?>
        <table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['visibilityType'] === BackendService::VISIBILITY_ADMIN)); ?>'>
                <thead>