Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Schiwon <blizzz@arthur-schiwon.de>2019-02-13 02:14:56 +0300
committerArthur Schiwon <blizzz@arthur-schiwon.de>2019-02-14 17:22:22 +0300
commit792bcb82ae5149c86afcd4d550e3a22d60d330f7 (patch)
treeca2ecccf6865254fb7ed463424a4ae34d7ddeded /apps/user_ldap/lib
parenta26bcd8e8fa11870c9192d24c73fbef3ef6112de (diff)
add LDAP ConfigHandler for external storages and "$home" var
* handler registered upon OCA\\Files_External::loadAdditionalBackends event as user_ldap is loaded before files_external * new configuration field "ldapExtStorageHomeAttribute" (not in GUI yet) Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Diffstat (limited to 'apps/user_ldap/lib')
-rw-r--r--apps/user_ldap/lib/AppInfo/Application.php16
-rw-r--r--apps/user_ldap/lib/Configuration.php3
-rw-r--r--apps/user_ldap/lib/Connection.php2
-rw-r--r--apps/user_ldap/lib/Exceptions/AttributeNotSet.php26
-rw-r--r--apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php74
-rw-r--r--apps/user_ldap/lib/User/Manager.php1
-rw-r--r--apps/user_ldap/lib/User/User.php49
7 files changed, 171 insertions, 0 deletions
diff --git a/apps/user_ldap/lib/AppInfo/Application.php b/apps/user_ldap/lib/AppInfo/Application.php
index 59d7cdb4924..7e0c3534488 100644
--- a/apps/user_ldap/lib/AppInfo/Application.php
+++ b/apps/user_ldap/lib/AppInfo/Application.php
@@ -23,7 +23,9 @@
namespace OCA\User_LDAP\AppInfo;
+use OCA\Files_External\Service\BackendService;
use OCA\User_LDAP\Controller\RenewPasswordController;
+use OCA\User_LDAP\Handler\ExtStorageConfigHandler;
use OCA\User_LDAP\ILDAPWrapper;
use OCA\User_LDAP\LDAP;
use OCP\AppFramework\App;
@@ -57,4 +59,18 @@ class Application extends App {
return new LDAP();
});
}
+
+ public function registerBackendDependents() {
+ $container = $this->getContainer();
+
+ $container->getServer()->getEventDispatcher()->addListener(
+ 'OCA\\Files_External::loadAdditionalBackends',
+ function() use ($container) {
+ $storagesBackendService = $container->query(BackendService::class);
+ $storagesBackendService->registerConfigHandler('home', function () use ($container) {
+ return $container->query(ExtStorageConfigHandler::class);
+ });
+ }
+ );
+ }
}
diff --git a/apps/user_ldap/lib/Configuration.php b/apps/user_ldap/lib/Configuration.php
index c912d30b49b..ee77702a090 100644
--- a/apps/user_ldap/lib/Configuration.php
+++ b/apps/user_ldap/lib/Configuration.php
@@ -106,6 +106,7 @@ class Configuration {
'turnOnPasswordChange' => false,
'ldapDynamicGroupMemberURL' => null,
'ldapDefaultPPolicyDN' => null,
+ 'ldapExtStorageHomeAttribute' => null,
);
/**
@@ -477,6 +478,7 @@ class Configuration {
'ldap_dynamic_group_member_url' => '',
'ldap_default_ppolicy_dn' => '',
'ldap_user_avatar_rule' => 'default',
+ 'ldap_ext_storage_home_attribute' => '',
);
}
@@ -537,6 +539,7 @@ class Configuration {
'ldap_experienced_admin' => 'ldapExperiencedAdmin',
'ldap_dynamic_group_member_url' => 'ldapDynamicGroupMemberURL',
'ldap_default_ppolicy_dn' => 'ldapDefaultPPolicyDN',
+ 'ldap_ext_storage_home_attribute' => 'ldapExtStorageHomeAttribute',
'ldapIgnoreNamingRules' => 'ldapIgnoreNamingRules', // sysconfig
);
return $array;
diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php
index 7becf311a22..ba393dffc12 100644
--- a/apps/user_ldap/lib/Connection.php
+++ b/apps/user_ldap/lib/Connection.php
@@ -60,6 +60,8 @@ use OCP\ILogger;
* @property string ldapQuotaAttribute
* @property string ldapQuotaDefault
* @property string ldapEmailAttribute
+ * @property string ldapExtStorageHomeAttribute
+ * @property string homeFolderNamingRule
*/
class Connection extends LDAPUtility {
private $ldapConnectionRes = null;
diff --git a/apps/user_ldap/lib/Exceptions/AttributeNotSet.php b/apps/user_ldap/lib/Exceptions/AttributeNotSet.php
new file mode 100644
index 00000000000..540b65c1820
--- /dev/null
+++ b/apps/user_ldap/lib/Exceptions/AttributeNotSet.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * @copyright Copyright (c) 2019 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\User_LDAP\Exceptions;
+
+class AttributeNotSet extends \RuntimeException {}
diff --git a/apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php b/apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php
new file mode 100644
index 00000000000..98a3cc71263
--- /dev/null
+++ b/apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * @copyright Copyright (c) 2019 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\User_LDAP\Handler;
+
+use OCA\Files_External\Config\IConfigHandler;
+use OCA\Files_External\Config\SimpleSubstitutionTrait;
+use OCA\User_LDAP\User_Proxy;
+use OCP\IUserSession;
+
+class ExtStorageConfigHandler implements IConfigHandler {
+ use SimpleSubstitutionTrait;
+
+ /** @var IUserSession */
+ private $session;
+
+ public function __construct(IUserSession $session) {
+ $this->placeholder = 'home';
+ $this->session = $session;
+ }
+
+ /**
+ * @param mixed $optionValue
+ * @return mixed the same type as $optionValue
+ * @since 16.0.0
+ * @throws \Exception
+ */
+ public function handle($optionValue) {
+ $user = $this->session->getUser();
+ if($user === null) {
+ return $optionValue;
+ }
+
+ $backend = $user->getBackend();
+ if(!$backend instanceof User_Proxy) {
+ return $optionValue;
+ }
+
+ $access = $backend->getLDAPAccess($user->getUID());
+ if(!$access) {
+ return $optionValue;
+ }
+
+ $attribute = $access->connection->ldapExtStorageHomeAttribute;
+ if(empty($attribute)) {
+ return $optionValue;
+ }
+
+ $ldapUser = $access->userManager->get($user->getUID());
+ $extHome = $ldapUser->getExtStorageHome();
+
+ return $this->processInput($optionValue, $extHome);
+ }
+}
diff --git a/apps/user_ldap/lib/User/Manager.php b/apps/user_ldap/lib/User/Manager.php
index 6185c0da45c..046b42551b6 100644
--- a/apps/user_ldap/lib/User/Manager.php
+++ b/apps/user_ldap/lib/User/Manager.php
@@ -176,6 +176,7 @@ class Manager {
$this->access->getConnection()->ldapEmailAttribute,
$this->access->getConnection()->ldapUserDisplayName,
$this->access->getConnection()->ldapUserDisplayName2,
+ $this->access->getConnection()->ldapExtStorageHomeAttribute,
];
$homeRule = $this->access->getConnection()->homeFolderNamingRule;
diff --git a/apps/user_ldap/lib/User/User.php b/apps/user_ldap/lib/User/User.php
index 0d8f993746f..d68d8b35d14 100644
--- a/apps/user_ldap/lib/User/User.php
+++ b/apps/user_ldap/lib/User/User.php
@@ -32,6 +32,7 @@ namespace OCA\User_LDAP\User;
use OCA\User_LDAP\Access;
use OCA\User_LDAP\Connection;
+use OCA\User_LDAP\Exceptions\AttributeNotSet;
use OCA\User_LDAP\FilesystemHelper;
use OCA\User_LDAP\LogWrapper;
use OCP\IAvatarManager;
@@ -244,6 +245,13 @@ class User {
}
$this->connection->writeToCache($cacheKey, $groups);
+ //external storage var
+ $attr = strtolower($this->connection->ldapExtStorageHomeAttribute);
+ if(isset($ldapEntry[$attr])) {
+ $this->updateExtStorageHome($ldapEntry[$attr][0]);
+ }
+ unset($attr);
+
//Avatar
/** @var Connection $connection */
$connection = $this->access->getConnection();
@@ -617,6 +625,47 @@ class User {
}
/**
+ * @throws AttributeNotSet
+ * @throws \OC\ServerNotAvailableException
+ * @throws \OCP\PreConditionNotMetException
+ */
+ public function getExtStorageHome():string {
+ $value = $this->config->getUserValue($this->getUsername(), 'user_ldap', 'extStorageHome', '');
+ if ($value !== '') {
+ return $value;
+ }
+
+ $value = $this->updateExtStorageHome();
+ if ($value !== '') {
+ return $value;
+ }
+
+ throw new AttributeNotSet(sprintf(
+ 'external home storage attribute yield no value for %s', $this->getUsername()
+ ));
+ }
+
+ /**
+ * @throws \OCP\PreConditionNotMetException
+ * @throws \OC\ServerNotAvailableException
+ */
+ public function updateExtStorageHome(string $valueFromLDAP = null):string {
+ if($valueFromLDAP === null) {
+ $extHomeValues = $this->access->readAttribute($this->getDN(), $this->connection->ldapExtStorageHomeAttribute);
+ } else {
+ $extHomeValues = [$valueFromLDAP];
+ }
+ if ($extHomeValues && isset($extHomeValues[0])) {
+ $extHome = $extHomeValues[0];
+ $this->config->setUserValue($this->getUsername(), 'user_ldap', 'extStorageHome', $extHome);
+ return $extHome;
+ } else {
+ $this->config->deleteUserValue($this->getUsername(), 'user_ldap', 'extStorageHome');
+ return '';
+ }
+ }
+
+ /**
* called by a post_login hook to handle password expiry
*
* @param array $params