]> source.dussan.org Git - nextcloud-server.git/commitdiff
LDAP: Make update script escape all known DNs. Requires version bump.
authorArthur Schiwon <blizzz@owncloud.com>
Fri, 16 Nov 2012 23:03:35 +0000 (00:03 +0100)
committerArthur Schiwon <blizzz@owncloud.com>
Fri, 16 Nov 2012 23:03:35 +0000 (00:03 +0100)
apps/user_ldap/appinfo/update.php
apps/user_ldap/appinfo/version

index e6e25cec73456b9c7ba6336a2f58c14a4ecc00c5..9b54ba18b6ce7a7e7a637397e111f3035abb047d 100644 (file)
@@ -34,22 +34,49 @@ $groupBE = new \OCA\user_ldap\GROUP_LDAP();
 $groupBE->setConnector($connector);
 
 foreach($objects as $object) {
-       $fetchDNSql = 'SELECT `ldap_dn`, `owncloud_name` FROM `*PREFIX*ldap_'.$object.'_mapping` WHERE `directory_uuid` = \'\'';
-       $updateSql = 'UPDATE `*PREFIX*ldap_'.$object.'_mapping` SET `ldap_DN` = ?, `directory_uuid` = ? WHERE `ldap_dn` = ?';
+       $fetchDNSql = '
+               SELECT `ldap_dn`, `owncloud_name`, `directory_uuid`
+               FROM `*PREFIX*ldap_'.$object.'_mapping`';
+       $updateSql = '
+               UPDATE `*PREFIX*ldap_'.$object.'_mapping`
+               SET `ldap_DN` = ?, `directory_uuid` = ?
+               WHERE `ldap_dn` = ?';
 
        $query = OCP\DB::prepare($fetchDNSql);
        $res = $query->execute();
        $DNs = $res->fetchAll();
        $updateQuery = OCP\DB::prepare($updateSql);
        foreach($DNs as $dn) {
-               $newDN = mb_strtolower($dn['ldap_dn'], 'UTF-8');
-               if($object == 'user') {
+               $newDN = escapeDN(mb_strtolower($dn['ldap_dn'], 'UTF-8'));
+               if(!empty($dn['directory_uuid'])) {
+                       $uuid = $dn['directory_uuid'];
+               } elseif($object == 'user') {
                        $uuid = $userBE->getUUID($newDN);
                        //fix home folder to avoid new ones depending on the configuration
                        $userBE->getHome($dn['owncloud_name']);
                } else {
                        $uuid = $groupBE->getUUID($newDN);
                }
-               $updateQuery->execute(array($newDN, $uuid, $dn['ldap_dn']));
+               try {
+                       $updateQuery->execute(array($newDN, $uuid, $dn['ldap_dn']));
+               } catch(Exception $e) {
+                   \OCP\Util::writeLog('user_ldap', 'Could not update '.$object.' '.$dn['ldap_dn'].' in the mappings table. ', \OCP\Util::WARN);
+               }
+
+       }
+}
+
+function escapeDN($dn) {
+       $aDN = ldap_explode_dn($dn, false);
+       unset($aDN['count']);
+       foreach($aDN as $key => $part) {
+               $value = substr($part, strpos($part, '=')+1);
+               $escapedValue = strtr($value, Array(','=>'\2c', '='=>'\3d', '+'=>'\2b',
+                       '<'=>'\3c', '>'=>'\3e', ';'=>'\3b', '\\'=>'\5c',
+                       '"'=>'\22', '#'=>'\23'));
+               $part = str_replace($part, $value, $escapedValue);
        }
+       $dn = implode(',', $aDN);
+
+       return $dn;
 }
index 73082a89b3568d934f8e07cbc937cb5a575855cb..b1a5f4781d198d55b7847e2cc091a878567887f2 100644 (file)
@@ -1 +1 @@
-0.3.0.0
\ No newline at end of file
+0.3.0.1
\ No newline at end of file