1: <?php
2: 3: 4: 5:
6:
7: class directoryConfigHandler extends baseModel {
8: protected $id;
9: protected $appid;
10: private $schema;
11: private $directory_id;
12: private $config_dir = '../conf';
13: private $directory_config = array('public' => array ());
14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
28: private $dbhandler;
29:
30: public function __construct ($schema,$appid = PREF_APP){
31: $this->instance = $this;
32: $this->createObjInstance(array("viewhandler","directoryConfigViewHandler",$this->instance));
33: $this->viewhandler->setHeaderIdent('directory','administration');
34: if (file_exists("{$this->config_dir}/ldap/{$schema}.conf"))
35: $this->directory_config = json_decode(file_get_contents('../conf/ldap/public.conf'),true);
36: $directory_id = 0;
37: $this->schema = $schema;
38:
39: }
40:
41: public function destructDbInstances(){
42: }
43:
44: public function setDataSource(&$db){
45: }
46:
47: public function &getDataSource(){
48: }
49:
50: public function initialize(){
51: $this->id = null;
52: $this->appid = null;
53: $this->directory_id = null;
54: }
55:
56: public function syncStorageUpdate(&$postdata_arr){
57: try {
58: $id = $postdata_arr['dir_id'];
59: if (!intval($id)){
60: $keys = $this->getDirectoryKeys();
61: $id = intval(count($keys)) + 1;
62: if (!intval($postdata_arr['dir_position']))
63: $postdata_arr['dir_position'] = $id;
64: }
65:
66: $this->setDirectoryId($id);
67: $this->directory_config["{$this->schema}"][$id] = array();
68: foreach (array_keys($postdata_arr) as $key){
69: if ($param = str_replace ('dir_' , '' , $key,$count));
70: if (!$count) continue;
71: if ($param == 'password' && strpos($postdata_arr[$key],'*****')) continue;
72:
73: $this->directory_config["{$this->schema}"][$id][$param] = $postdata_arr[$key];
74: }
75:
76: $this->directory_config["{$this->schema}"][$id]['id'] = $id;
77: $this->writeActionData();
78: }catch (Exception $e){
79: throw new Exception($e->getMessage());
80: }
81: return true;
82: }
83:
84: public function syncStorageRemove(){
85: }
86:
87: public function getDirectoryKeys($state = null){
88: $dir_keys = array();
89: asort($this->directory_config[$this->schema]);
90: foreach (array_keys($this->directory_config[$this->schema]) as $key){
91: if ($state && $this->getDirectoryParam($key,'state') == 0) continue;
92: array_push($dir_keys,$key);
93: }
94: return $dir_keys;
95: }
96:
97: public function getDirectoryFirstActive(){
98: $dir_keys = array();
99:
100: asort($this->directory_config[$this->schema]);
101: foreach (array_keys($this->directory_config[$this->schema]) as $key){
102: if ($this->getDirectoryParam($key,'state') == 0) continue;
103:
104: return $key;
105: }
106: return null;
107: }
108:
109: public function getDirectoryByPosition($position = 1){
110: $dir_keys = array();
111: asort($this->directory_config[$this->schema]);
112: foreach (array_keys($this->directory_config[$this->schema]) as $key){
113: if ($this->getDirectoryParam($key,'position') == $position)
114: return $key;
115: }
116: return null;
117: }
118:
119: public function getDirectoryList(){
120: $directory_list = array();
121: $position = 1;
122: while(1){
123: if(!($key = $this->getDirectoryByPosition($position))) break;
124: array_push($directory_list,$this->directory_config[$this->schema][$key]);
125: $position++;
126: }
127: return $directory_list;
128: }
129:
130: public function setDirectoryId($id){
131: $this->directory_id = $id;
132: }
133:
134: public function getDirectoryId(){
135: return $this->directory_id;
136: }
137:
138: public function changeDirectoryPosition($id){
139: $position = $this->getDirectoryParam($id,'position');
140: $new_position = $position - 1;
141: $replaced_target_id = $this->getDirectoryByPosition($new_position);
142:
143: $this->setDirectoryParam($id,'position',intval($new_position));
144: $this->setDirectoryParam($replaced_target_id,'position',intval($position));
145: $this->writeActionData();
146: }
147:
148: public function changeDirectoryState($id){
149: $new_state = $this->directory_config["{$this->schema}"][$id]['state'] == '1' ? '0' : '1';
150: $this->setDirectoryParam($id,'state',$new_state);
151: $this->writeActionData();
152: return $new_state;
153: }
154:
155: public function setDirectoryParam($id,$param,$value){
156: $this->directory_config["{$this->schema}"][$id][$param] = (string) $value;
157: }
158:
159: public function getDirectoryParam($id,$param){
160:
161: if (isset($this->directory_config["{$this->schema}"]["$id"]["$param"])){
162: return $this->directory_config["{$this->schema}"]["$id"]["$param"];
163: }
164:
165: return null;
166: }
167:
168: public function getDirectoryParams($id){
169: return $this->directory_config["{$this->schema}"]["$id"];
170: }
171:
172: public function validateAuthentication($username,$auth_pwd){
173: try {
174: $success = false;
175:
176: if ( empty($username) && empty($auth_pwd))
177: throw new Exception('invalid username or password');
178:
179: $directory_keys_arr = $this->getDirectoryKeys(true);
180: foreach($directory_keys_arr as $id){
181: $auth_user = $this->getDirectoryParam($id,'user_attr').'='.$username.','.$this->getDirectoryParam($id,'userdn').','.$this->getDirectoryParam($id,'basedn');
182:
183: $ds = $this->connect($id);
184: if (!is_resource($ds))
185: continue;
186:
187: $r = ldap_bind($ds, $auth_user, $auth_pwd);
188: if (!$r) {
189: ldap_close($ds);
190: continue;
191: }
192:
193: error_log("Directory authentication $auth_user success");
194: $success = true;
195: break;
196: }
197: if (is_resource($ds))
198: ldap_close($ds);
199:
200: if ($success == false)
201: throw new Exception('invalid user login');
202:
203: return true;
204: }catch(Exception $e){
205: throw new Exception($e->getMessage());
206: }
207: }
208:
209: private function &connect($id = null){
210: $directory_id = intval($id) ? intval($id) : $this->directory_id;
211: $ds = ldap_connect($this->getDirectoryParam($directory_id,'host'),$this->getDirectoryParam($directory_id,'port'));
212: ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
213: ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
214:
215: return $ds;
216: }
217:
218: public function connect_test($host,$port,$basedn,$userdn,$user_attr,$username,$password){
219:
220: $ds = ldap_connect($host,$port);
221: if (!is_resource($ds))
222: throw new Exception('failed to connect');
223:
224: ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
225: ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
226:
227: 228: 229: 230: 231: 232: 233:
234: ldap_close($ds);
235: }
236:
237: private function writeActionData(){
238: $file = "{$this->config_dir}/ldap/{$this->schema}.conf";
239: if (($f = fopen($file, "w") ) == false)
240: throw new Exception ("Failed to open $file for write");
241:
242: fwrite($f, json_encode($this->directory_config));
243: fclose($f);
244: }
245:
246: }
247: ?>
248: