Blame view

sources/apps/user_ldap/appinfo/update.php 3.03 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  <?php
  
  //from version 0.1 to 0.2
  
  //ATTENTION
  //Upgrade from ownCloud 3 (LDAP backend 0.1) to ownCloud 4.5 (LDAP backend 0.3) is not supported!!
  //You must do upgrade to ownCloud 4.0 first!
  //The upgrade stuff in the section from 0.1 to 0.2 is just to minimize the bad effects.
  
  //settings
  $pw = OCP\Config::getAppValue('user_ldap', 'ldap_password');
  if(!is_null($pw)) {
  	$pwEnc = base64_encode($pw);
  	OCP\Config::setAppValue('user_ldap', 'ldap_agent_password', $pwEnc);
  	OC_Appconfig::deleteKey('user_ldap', 'ldap_password');
  }
  
  //detect if we can switch on naming guidelines. We won't do it on conflicts.
  //it's a bit spaghetti, but hey.
  $state = OCP\Config::getSystemValue('ldapIgnoreNamingRules', 'unset');
  if($state == 'unset') {
  	OCP\Config::setSystemValue('ldapIgnoreNamingRules', false);
  }
  
  //from version 0.2 to 0.3 (0.2.0.x dev version)
  $objects = array('user', 'group');
  
  $connector = new \OCA\user_ldap\lib\Connection();
  $userBE = new \OCA\user_ldap\USER_LDAP();
  $userBE->setConnector($connector);
  $groupBE = new \OCA\user_ldap\GROUP_LDAP();
  $groupBE->setConnector($connector);
  
  foreach($objects as $object) {
  	$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 = 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);
  		}
  		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;
  }
  
  
  // SUPPORTED UPGRADE FROM Version 0.3 (ownCloud 4.5) to 0.4 (ownCloud 5)
  
  if(!isset($connector)) {
  	$connector = new \OCA\user_ldap\lib\Connection();
  }
  //it is required, that connections do have ldap_configuration_active setting stored in the database
  $connector->getConfiguration();
  $connector->saveConfiguration();
  
  // we don't save it anymore, was a well-meant bad idea. Clean up database.
  $query = OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ? AND `configkey` = ?');
  $query->execute(array('user_ldap' , 'homedir'));