14require_once(
"auth-functions.php");
41 $host=$config[
'host'];
42 $port=$config[
'port'];
43 if(!function_exists(
'ldap_connect')){
44 $c->messages[] = i18n(
"drivers_ldap : function ldap_connect not defined, check your php_ldap module");
50 if (isset($config[
'protocolVersion']))
51 ldap_set_option($this->connect, LDAP_OPT_PROTOCOL_VERSION, $config[
'protocolVersion']);
52 if (isset($config[
'optReferrals']))
53 ldap_set_option($this->connect, LDAP_OPT_REFERRALS, $config[
'optReferrals']);
54 if (isset($config[
'networkTimeout']))
55 ldap_set_option($this->connect, LDAP_OPT_NETWORK_TIMEOUT, $config[
'networkTimeout']);
60 if (isset($config[
'uri']))
61 $this->connect=ldap_connect($config[
'uri']);
63 $this->connect=ldap_connect($host, $port);
65 $this->connect=ldap_connect($host);
67 if (! $this->connect){
68 if (isset($config[
'uri'])) {
69 $c->messages[] = sprintf(translate(
'drivers_ldap : Unable to connect to LDAP with URI: %s'), $config[
'uri'] );
71 if (! $port) $port =
'default';
72 $c->messages[] = sprintf(translate(
'drivers_ldap : Unable to connect to LDAP with port %s on host %s'), $port, $host );
77 if (isset($config[
'uri']))
78 dbg_error_log(
"LDAP",
"drivers_ldap : Connected to LDAP server %s", $config[
'uri'] );
80 dbg_error_log(
"LDAP",
"drivers_ldap : Connected to LDAP server %s, port %s", $host, $port );
82 dbg_error_log(
"LDAP",
"drivers_ldap : Connected to LDAP server %s", $host );
86 if (isset($config[
'startTLS'])) {
87 if (!ldap_set_option($this->connect, LDAP_OPT_PROTOCOL_VERSION, 3)) {
88 $c->messages[] = i18n(
'drivers_ldap : Failed to set LDAP to use protocol version 3, TLS not supported');
92 if (!ldap_start_tls($this->connect)) {
93 $c->messages[] = i18n(
'drivers_ldap : Could not start TLS: ldap_start_tls() failed');
100 if (!isset($config[
'scope'])) $config[
'scope'] =
'subtree';
101 switch (strtolower($config[
'scope'])) {
103 $this->ldap_query_one =
'ldap_read';
104 $this->ldap_query_all =
'ldap_read';
107 $this->ldap_query_one =
'ldap_list';
108 $this->ldap_query_all =
'ldap_list';
111 $this->ldap_query_one =
'ldap_search';
112 $this->ldap_query_all =
'ldap_search';
121 if (isset($config[
'sasl'])){
122 $bind_result = ldap_sasl_bind(
124 (isset($config[
'bindDN']) ? $config[
'bindDN'] :
null),
125 (isset($config[
'passDN']) ? $config[
'passDN'] :
null),
126 (isset($config[
'sasl_mech']) ? $config[
'sasl_mech'] :
null),
127 (isset($config[
'sasl_realm']) ? $config[
'sasl_realm'] :
null),
128 (isset($config[
'sasl_authc_id']) ? $config[
'sasl_authc_id'] :
null),
129 (isset($config[
'sasl_authz_id']) ? $config[
'sasl_authz_id'] :
null),
130 (isset($config[
'sasl_props']) ? $config[
'sasl_props'] :
null) );
132 $bind_result = ldap_bind($this->connect, (isset($config[
'bindDN']) ? $config[
'bindDN'] :
null), (isset($config[
'passDN']) ? $config[
'passDN'] :
null) );
135 $bindDN = isset($config[
'bindDN']) ? $config[
'bindDN'] :
'anonymous';
136 $passDN = isset($config[
'passDN']) ? $config[
'passDN'] :
'anonymous';
138 dbg_error_log(
"LDAP", i18n(
'drivers_ldap : Failed to bind to host %1$s on port %2$s with bindDN of %3$s'), $host, $port, $bindDN );
139 $c->messages[] = i18n(
'drivers_ldap : Unable to bind to LDAP - check your configuration for bindDN and passDN, and that your LDAP server is reachable');
147 is_string($config[
'baseDNUsers']) ?
148 array($config[
'baseDNUsers']) : $config[
'baseDNUsers'];
150 (isset($config[
'filterUsers']) ?
151 $config[
'filterUsers'] :
'(objectclass=*)');
152 $this->baseDNGroups =
153 (isset($config[
'baseDNGroups']) ?
154 (is_string($config[
'baseDNGroups']) ?
155 array($config[
'baseDNGroups']) : $config[
'baseDNGroups']) :
null);
156 $this->filterGroups =
157 (isset($config[
'filterGroups']) ?
158 $config[
'filterGroups'] :
'(objectclass=*)');
167 $query = $this->ldap_query_all;
170 foreach($this->baseDNUsers as $baseDNUsers) {
171 $entry = $query($this->connect, $baseDNUsers, $this->filterUsers, $attributes);
174 $c->messages[] = sprintf(translate(
'Error NoUserFound with filter >%s<, attributes >%s< , baseDN >%s<'),
176 join(
', ', $attributes),
178 dbg_error_log(
'LDAP',
'Error NoUserFound with filter >%s<, attributes >%s< , baseDN >%s<',
180 join(
', ', $attributes),
185 if (! ldap_first_entry($this->connect, $entry)) {
186 $c->messages[] = sprintf(translate(
'Error NoUserFound with filter >%s<, attributes >%s< , dn >%s<'),
188 join(
', ', $attributes),
194 for ($i = ldap_first_entry($this->connect,$entry);
195 $i && $arr = ldap_get_attributes($this->connect,$i);
196 $i = ldap_next_entry($this->connect,$i) ) {
199 for ($j=0; $j < $arr[
'count']; $j++) {
200 $row[$arr[$j]] = $arr[$arr[$j]][0];
215 $query = $this->ldap_query_all;
218 foreach($this->baseDNGroups as $baseDNGroups) {
219 $entry = $query($this->connect,$baseDNGroups,$this->filterGroups,$attributes);
221 if (!ldap_first_entry($this->connect,$entry)) {
222 $c->messages[] = sprintf(translate(
'Error NoGroupFound with filter >%s<, attributes >%s< , dn >%s<'),
224 join(
', ', $attributes),
228 for($i = ldap_first_entry($this->connect,$entry);
229 $i && $arr = ldap_get_attributes($this->connect,$i);
230 $i = ldap_next_entry($this->connect,$i) ) {
231 for ($j=0; $j < $arr[
'count']; $j++) {
232 $row[$arr[$j]] = count($arr[$arr[$j]])>2?$arr[$arr[$j]]:$arr[$arr[$j]][0];
256 $query = $this->ldap_query_one;
257 # ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
259 foreach($this->baseDNUsers as $baseDNUsers) {
260 $entry = $query($this->connect, $baseDNUsers, $filter, $attributes);
262 if (ldap_first_entry($this->connect,$entry) )
265 dbg_error_log(
"LDAP",
"drivers_ldap : Failed to find user with baseDN: %s", $baseDNUsers );
268 if ( !ldap_first_entry($this->connect, $entry) ){
269 dbg_error_log(
"ERROR",
"drivers_ldap : Unable to find the user with filter %s",$filter );
272 dbg_error_log(
"LDAP",
"drivers_ldap : Found a user using filter %s",$filter );
275 $dnUser = ldap_get_dn($this->connect, ldap_first_entry($this->connect,$entry));
277 $authenticated =
false;
278 $use_kerberos_only = isset($c->authenticate_hook[
'config'][
'i_use_mode_kerberos']) && $c->authenticate_hook[
'config'][
'i_use_mode_kerberos'] ==
"i_know_what_i_am_doing";
279 $use_kerberos_with_fallback = isset($c->authenticate_hook[
'config'][
'i_use_mode_kerberos']) && $c->authenticate_hook[
'config'][
'i_use_mode_kerberos'] ==
"allow_fallback_to_ldap_auth";
281 if ($use_kerberos_only or $use_kerberos_with_fallback) {
282 if (isset($_SERVER[
"REMOTE_USER"])) {
283 dbg_error_log(
"LOG",
"drivers_ldap : Skipping password Check for user %s which should be the same as %s",$username , $_SERVER[
"REMOTE_USER"]);
284 if ($username == $_SERVER[
"REMOTE_USER"]) {
285 $authenticated =
true;
289 } elseif (isset($_SERVER[
"REDIRECT_REMOTE_USER"])) {
290 dbg_error_log(
"LOG",
"drivers_ldap : Skipping password Check for user %s which should be the same as %s",$username , $_SERVER[
"REDIRECT_REMOTE_USER"]);
291 if ($username == $_SERVER[
"REDIRECT_REMOTE_USER"]) {
292 $authenticated =
true;
296 } elseif ($use_kerberos_only) {
301 if (!$authenticated) {
302 if ( empty($passwd) || preg_match(
'/[\x00-\x19]/',$passwd) ) {
304 dbg_error_log(
'LDAP',
'drivers_ldap : user %s supplied empty or invalid password: login rejected', $dnUser );
308 if ( !@ldap_bind($this->connect, $dnUser, $passwd) ) {
309 dbg_error_log(
"LDAP",
"drivers_ldap : Failed to bind to user %s ", $dnUser );
315 dbg_error_log(
"LDAP",
"drivers_ldap : Bound to user %s using password %s", $dnUser,
316 (isset($c->dbg[
'password']) && $c->dbg[
'password'] ? $passwd :
'another delicious password for the debugging monster!') );
318 $i = ldap_first_entry($this->connect,$entry);
319 $arr = ldap_get_attributes($this->connect,$i);
320 for( $i=0; $i<$arr[
'count']; $i++ ) {
321 $ret[$arr[$i]]=$arr[$arr[$i]][0];
332function getStaticLdap() {
338 if(!isset($instance)) {
339 $ldapDriver =
new ldapDriver($c->authenticate_hook[
'config']);
341 if ($ldapDriver->valid) {
342 $instance = $ldapDriver;
346 $ldapDriver = $instance;
356function sync_user_from_LDAP(
Principal &$principal, $mapping, $ldap_values ) {
359 dbg_error_log(
"LDAP",
"Going to sync the user from LDAP" );
361 $fields_to_set = array();
362 $updateable_fields = Principal::updateableFields();
363 foreach( $updateable_fields AS $field ) {
364 if ( isset($mapping[$field]) ) {
365 $tab_part_fields = explode(
',',$mapping[$field]);
366 foreach( $tab_part_fields as $part_field ) {
367 if ( isset($ldap_values[$part_field]) ) {
368 if (isset($fields_to_set[$field]) ) {
369 $fields_to_set[$field] .=
' '.$ldap_values[$part_field];
372 $fields_to_set[$field] = $ldap_values[$part_field];
376 dbg_error_log(
"LDAP",
"Setting usr->%s to %s from LDAP field %s", $field, $fields_to_set[$field], $mapping[$field] );
378 else if ( isset($c->authenticate_hook[
'config'][
'default_value']) && is_array($c->authenticate_hook[
'config'][
'default_value'])
379 && isset($c->authenticate_hook[
'config'][
'default_value'][$field] ) ) {
380 $fields_to_set[$field] = $c->authenticate_hook[
'config'][
'default_value'][$field];
381 dbg_error_log(
"LDAP",
"Setting usr->%s to %s from configured defaults", $field, $c->authenticate_hook[
'config'][
'default_value'][$field] );
385 if ( $principal->Exists() ) {
386 $principal->Update($fields_to_set);
389 $principal->Create($fields_to_set);
390 CreateHomeCollections($principal->username());
391 CreateDefaultRelationships($principal->username());
398function array_values_mapping($mapping){
400 foreach ( $mapping as $field ) {
401 $tab_part_field = explode(
",",$field);
402 foreach( $tab_part_field as $part_field ) {
403 $attributes[] = $part_field;
412function LDAP_check($username, $password ){
415 $ldapDriver = getStaticLdap();
416 if ( !$ldapDriver->valid ) {
418 $ldapDriver = getStaticLdap();
419 if ( !$ldapDriver->valid ) {
420 dbg_error_log(
"ERROR",
"Couldn't contact LDAP server for authentication" );
421 foreach($c->messages as $msg) {
422 dbg_error_log(
"ERROR",
"-> ".$msg );
424 header( sprintf(
"HTTP/1.1 %d %s", 503, translate(
"Authentication server unavailable.")) );
429 $mapping = $c->authenticate_hook[
'config'][
'mapping_field'];
430 if ( isset($mapping[
'active']) && !isset($mapping[
'user_active']) ) {
432 $mapping[
'user_active'] = $mapping[
'active'];
433 unset($mapping[
'active']);
435 if ( isset($mapping[
'updated']) && !isset($mapping[
'modified']) ) {
437 $mapping[
'modified'] = $mapping[
'updated'];
438 unset($mapping[
'updated']);
440 $attributes = array_values_mapping($mapping);
447 if ( preg_match(
'/^\(/', $ldapDriver->filterUsers ) ) {
448 $filter_munge = $ldapDriver->filterUsers;
450 else if ( isset($ldapDriver->filterUsers) && $ldapDriver->filterUsers !=
'' ) {
451 $filter_munge =
"($ldapDriver->filterUsers)";
454 $filter =
"(&$filter_munge(".$mapping[
'username'].
"=$username))";
455 $valid = $ldapDriver->requestUser( $filter, $attributes, $username, $password );
459 dbg_error_log(
"LDAP",
"user %s is not a valid user",$username );
463 if ( $mapping[
'modified'] !=
"" && array_key_exists($mapping[
'modified'], $valid)) {
464 $ldap_timestamp = $valid[$mapping[
'modified']];
466 $ldap_timestamp =
'19700101000000';
472 foreach($c->authenticate_hook[
'config'][
'format_updated'] as $k => $v)
473 $$k = substr($ldap_timestamp,$v[0],$v[1]);
475 $ldap_timestamp =
"$Y".
"$m".
"$d".
"$H".
"$M".
"$S";
476 if ($mapping[
'modified'] !=
"" && array_key_exists($mapping[
'modified'], $valid)) {
477 $valid[$mapping[
'modified']] =
"$Y-$m-$d $H:$M:$S";
480 $principal =
new Principal(
'username',$username);
481 if ( $principal->Exists() ) {
483 $db_timestamp = $principal->modified;
484 $db_timestamp = substr(strtr($db_timestamp, array(
':' =>
'',
' '=>
'',
'-'=>
'')),0,14);
485 if( $ldap_timestamp <= $db_timestamp ) {
490 dbg_error_log(
"LDAP",
"user %s has been modified in LDAP, we need to update our DB", $username );
493 dbg_error_log(
"LDAP",
"user %s doesn't exist in local DB, we need to create it", $username );
495 $principal->setUsername($username);
498 sync_user_from_LDAP( $principal, $mapping, $valid );
507function fix_unique_member($list) {
508 $fixed_list = array();
509 foreach ( $list as $member ){
510 array_unshift( $fixed_list, ldap_explode_dn($member,1)[0]);
518function sync_LDAP_groups(){
522 if (! isset($c->authenticate_hook[
'config'][
'baseDNGroups']) )
525 $ldapDriver = getStaticLdap();
526 if ( ! $ldapDriver->valid )
return;
528 $mapping = $c->authenticate_hook[
'config'][
'group_mapping_field'];
532 if ( ! isset($mapping[
'name']) && isset($mapping[
'username']) ) {
533 $mapping[
'name'] = $mapping[
'username'];
534 unset($mapping[
'username']);
538 if (! isset($mapping[
'name']))
539 $mapping[
'name'] =
'cn';
540 if (! isset($mapping[
'members']))
541 $mapping[
'members'] =
'member';
543 $attributes = array_values_mapping($mapping);
544 $ldap_groups_tmp = $ldapDriver->getAllGroups($attributes);
546 if (
sizeof($ldap_groups_tmp) == 0 )
return;
548 $member_field = $mapping[
'members'];
550 $dnfix = isset($c->authenticate_hook[
'config'][
'group_member_dnfix'])
551 && $c->authenticate_hook[
'config'][
'group_member_dnfix'];
553 foreach ($ldap_groups_tmp as $key => $ldap_group) {
554 $group_name = $ldap_group[$mapping[
'name']];
556 if ( isset($ldap_group[$member_field]) ) {
557 if ( is_array($ldap_group[$member_field]) ) {
558 unset( $ldap_group[$member_field][
'count'] );
560 $ldap_group[$member_field] = array($ldap_group[$member_field]);
564 $ldap_groups_info[$group_name] = $ldap_group;
565 unset($ldap_groups_tmp[$key]);
568 $db_groups = array();
569 $db_group_members = array();
571 $qry =
new AwlQuery(
"
572 SELECT g.username AS group_name, member.username AS member_name
574 LEFT JOIN group_member ON (g.principal_id = group_member.group_id)
575 LEFT JOIN dav_principal member ON
576 (member.principal_id = group_member.member_id)
580 $qry->Exec(
'sync_LDAP',__LINE__,__FILE__);
582 while ($db_group = $qry->Fetch()) {
583 $db_groups[$db_group->group_name] = $db_group->group_name;
584 $db_group_members[$db_group->group_name][] = $db_group->member_name;
587 $ldap_groups = array_keys($ldap_groups_info);
590 $groups_to_create = array_merge(
591 array_diff($ldap_groups, $db_groups),
592 array_intersect($db_groups, $ldap_groups));
595 $groups_to_deactivate = array_diff($db_groups, $ldap_groups);
598 $groups_nothing_done[] =
null;
600 if (
sizeof ( $groups_to_create ) ) {
601 $validUserFields = awl_get_fields(
'usr');
603 foreach ( $groups_to_create as $k => $group ){
604 if ( isset($c->do_not_sync_group_from_ldap)
605 && isset($c->do_not_sync_group_from_ldap[$group]) ) {
606 unset($groups_to_create[$k]);
607 $groups_nothing_done[] = $group;
612 dbg_error_log(
"LDAP",
"Syncing group %s", $group );
613 $user = (object) array();
615 if ( isset($c->authenticate_hook[
'config'][
'default_value'])
616 && is_array($c->authenticate_hook[
'config'][
'default_value']) ) {
617 foreach ( $c->authenticate_hook[
'config'][
'default_value'] as $field => $value ) {
618 if ( isset($validUserFields[$field]) ) {
619 $user->{$field} = $value;
620 dbg_error_log(
"LDAP",
"Setting usr->%s to %s from configured defaults", $field, $value );
626 $ldap_values = $ldap_groups_info[$group];
628 foreach ( $mapping as $field => $value ) {
629 dbg_error_log(
"LDAP",
"Considering copying %s", $field );
630 if ( isset($validUserFields[$field]) && isset($ldap_values[$value]) ) {
631 $user->{$field} = $ldap_values[$value];
632 dbg_error_log(
"LDAP",
"Setting usr->%s to %s from LDAP field %s", $field, $ldap_values[$value], $value );
637 if (! isset($user->fullname) || $user->fullname ==
"") {
638 $user->fullname = $group;
643 if (! isset($user->displayname) || $user->displayname ==
"") {
644 $user->displayname = $user->fullname;
647 $user->username = $group;
648 $user->updated =
"now";
650 $principal =
new Principal(
'username', $group);
651 if ( $principal->Exists() ) {
652 $principal->Update($user);
655 $principal->Create($user);
658 $qry =
new AwlQuery(
"
661 WHERE username = :group",
662 array(
':group' => $group) );
663 $qry->Exec(
'sync_LDAP',__LINE__,__FILE__);
665 Principal::cacheDelete(
'username', $group);
668 $groups_to_sync_members[] = $group;
671 $c->messages[] = sprintf( i18n(
'- creating groups : %s'), join(
', ', $groups_to_create) );
674 if (
sizeof ( $groups_to_sync_members ) ){
675 $c->messages[] = sprintf(i18n(
'- updating groups : %s'), join(
', ', $groups_to_sync_members));
678 $user_mapping = NULL;
679 if (isset($c->authenticate_hook[
'config'][
'user_mapping_field'])) {
680 $user_mapping = $c->authenticate_hook[
'config'][
'user_mapping_field'];
681 }
else if (isset($c->authenticate_hook[
'config'][
'mapping_field'])) {
682 $user_mapping = $c->authenticate_hook[
'config'][
'mapping_field'];
686 $query = $ldapDriver->ldap_query_one;
687 $username_ldap_attribute = $user_mapping[
'username'];
688 $filter = $ldapDriver->filterUsers;
690 foreach ( $groups_to_sync_members as $group ) {
691 $db_members = isset($db_group_members[$group])
692 && is_array($db_group_members[$group])
693 ? array_values( $db_group_members[$group] )
695 $ldap_members = isset ( $ldap_groups_info[$group][$member_field] )
696 ? array_values ( $ldap_groups_info[$group][$member_field] )
699 $ldap_members_tmp = array();
701 foreach ( $ldap_members as $member ) {
702 dbg_error_log(
"LDAP",
"Considering adding %s to group %s", $member, $group );
704 if (isset($user_mapping[
'username'])
705 && preg_match(
'/=/', $member)) {
708 if (preg_match(
"/^$username_ldap_attribute=/", $member)) {
712 $ldap_members_tmp[] = ldap_explode_dn($member,1)[0];
721 $entry = $query($ldapDriver->connect, $member, $filter,
722 array($username_ldap_attribute));
724 = ldap_first_entry($ldapDriver->connect, $entry);
726 if (! $ldap_user_entry) {
727 dbg_error_log(
"ERROR",
"%s not found in LDAP, not adding to group %s", $member, $group );
729 $ldap_user_attributes
730 = ldap_get_attributes($ldapDriver->connect,
734 = $ldap_user_attributes[$username_ldap_attribute][0];
739 $ldap_members_tmp[] = $member;
742 $ldap_members = $ldap_members_tmp;
745 $add_users = array_diff ( $ldap_members, $db_members );
746 if (
sizeof ( $add_users ) ){
747 $c->messages[] = sprintf(i18n(
'- adding %s to group : %s'),join(
', ', $add_users ), $group);
749 foreach ( $add_users as $member ) {
750 if ( isset($c->do_not_sync_from_ldap)
751 && isset($c->do_not_sync_from_ldap[$member]) ) {
752 dbg_error_log(
"ERROR",
"drivers_ldap : Skipped adding %s to %s", $member, $group);
757 $qry =
new AwlQuery(
"
758 INSERT INTO group_member
759 SELECT g.principal_id AS group_id, u.principal_id AS member_id
760 FROM dav_principal g, dav_principal u
761 WHERE g.username = :group
762 AND u.username = :member",
763 array (
':group' => $group,
':member' => $member) );
765 $qry->Exec(
'sync_LDAP_groups',__LINE__,__FILE__);
766 Principal::cacheDelete(
'username', $member);
770 $remove_users = @array_flip( @array_flip( array_diff( $db_members,
772 if (
sizeof ( $remove_users ) ) {
773 $c->messages[] = sprintf(i18n(
'- removing %s from group : %s'),join(
', ', $remove_users ), $group);
775 foreach ( $remove_users as $member ) {
776 $qry =
new AwlQuery(
"
777 DELETE FROM group_member
778 USING dav_principal g,dav_principal m
779 WHERE group_id = g.principal_id
780 AND member_id = m.principal_id
781 AND g.username = :group
782 AND m.username=:member",
783 array (
':group' => $group ,
':member' => $member) );
785 $qry->Exec(
'sync_LDAP_groups',__LINE__,__FILE__);
786 Principal::cacheDelete(
'username', $member);
792 if (
sizeof ( $groups_to_deactivate ) ) {
793 foreach ( $groups_to_deactivate as $k => $group ) {
794 if ( isset($c->do_not_sync_group_from_ldap)
795 && isset($c->do_not_sync_group_from_ldap[$group]) ) {
796 unset($groups_to_deactivate[$k]);
797 $groups_nothing_done[] = $group;
800 $qry =
new AwlQuery(
'
802 SET user_active = FALSE
803 WHERE username = :group
805 array(
':group' => $group) );
806 $qry->Exec(
'sync_LDAP',__LINE__,__FILE__);
808 Principal::cacheFlush(
'username=:group AND type_id = 3',
809 array(
':group' => $group) );
813 if (
sizeof($groups_to_deactivate) )
814 $c->messages[] = sprintf(i18n(
'- deactivated groups : %s'), join(
', ',$groups_to_deactivate));
817 if (
sizeof($groups_nothing_done) )
818 $c->messages[] = sprintf( i18n(
'- nothing done on : %s'), join(
', ',$groups_nothing_done) );
827 $ldapDriver = getStaticLdap();
828 if ( ! $ldapDriver->valid )
return;
832 if (isset($c->authenticate_hook[
'config'][
'user_mapping_field'])) {
833 $mapping = $c->authenticate_hook[
'config'][
'user_mapping_field'];
834 }
else if (isset($c->authenticate_hook[
'config'][
'mapping_field'])) {
835 $mapping = $c->authenticate_hook[
'config'][
'mapping_field'];
838 $attributes = array_values_mapping($mapping);
839 $ldap_users_tmp = $ldapDriver->getAllUsers($attributes);
841 if (
sizeof($ldap_users_tmp) == 0 )
return;
843 foreach($ldap_users_tmp as $key => $ldap_user){
844 if(!isset($ldap_user[$mapping[
'username']]))
continue;
845 $ldap_users_info[$ldap_user[$mapping[
'username']]] = $ldap_user;
846 unset($ldap_users_tmp[$key]);
848 $qry =
new AwlQuery(
"SELECT username, user_no, modified as updated , user_active FROM dav_principal where type_id=1");
849 $qry->Exec(
'sync_LDAP',__LINE__,__FILE__);
850 while($db_user = $qry->Fetch()) {
851 $db_users[] = $db_user->username;
852 $db_users_info[$db_user->username] = array(
'user_no' => $db_user->user_no,
'updated' => $db_user->updated,
'user_active' => $db_user->user_active);
856 $ldap_users = array_keys($ldap_users_info);
858 $users_to_create = array_diff($ldap_users,$db_users);
860 $users_to_deactivate = array_diff($db_users,$ldap_users);
862 $users_to_update = array_intersect($db_users,$ldap_users);
864 $users_nothing_done = array();
867 if (
sizeof($users_to_create) ) {
868 foreach( $users_to_create as $k => $username ) {
869 if ( isset($c->do_not_sync_from_ldap) && isset($c->do_not_sync_from_ldap[$username]) ) {
870 unset( $users_to_create[$k] );
871 $users_nothing_done[] = $username;
874 $principal =
new Principal(
'username', $username );
875 $valid = $ldap_users_info[$username];
876 if ( $mapping[
'modified'] !=
"" && array_key_exists($mapping[
'modified'], $valid)) {
877 $ldap_timestamp = $valid[$mapping[
'modified']];
879 $ldap_timestamp =
'19700101000000';
882 if ( !empty($c->authenticate_hook[
'config'][
'format_updated']) ) {
886 foreach($c->authenticate_hook[
'config'][
'format_updated'] as $k => $v)
887 $$k = substr($ldap_timestamp,$v[0],$v[1]);
888 $ldap_timestamp = $Y.$m.$d.$H.$M.$S;
890 else if ( preg_match(
'{^(\d{8})(\d{6})(Z)?$}', $ldap_timestamp, $matches ) ) {
891 $ldap_timestamp = $matches[1].
'T'.$matches[2].$matches[3];
893 else if ( empty($ldap_timestamp) ) {
894 $ldap_timestamp = date(
'c');
896 if ( $mapping[
'modified'] !=
"" && array_key_exists($mapping[
'modified'], $valid)) {
897 $valid[$mapping[
'modified']] = $ldap_timestamp;
900 sync_user_from_LDAP( $principal, $mapping, $valid );
902 $c->messages[] = sprintf( i18n(
'- creating record for users : %s'), join(
', ',$users_to_create) );
909 foreach( $users_to_deactivate as $k => $v ) {
910 if ( isset($c->do_not_sync_from_ldap) && isset($c->do_not_sync_from_ldap[$v]) ) {
911 unset($users_to_deactivate[$k]);
912 $users_nothing_done[] = $v;
915 if ( $i > 0 ) $paramstring .=
',';
916 $paramstring .=
':u'.$i.
'::text';
917 $params[
':u'.$i++] = strtolower($v);
919 if ( count($params) > 0 ) {
920 $c->messages[] = sprintf(i18n(
'- deactivating users : %s'),join(
', ',$users_to_deactivate));
921 $qry =
new AwlQuery(
'UPDATE usr SET active = FALSE WHERE lower(username) IN ('.$paramstring.
')', $params);
922 $qry->Exec(
'sync_LDAP',__LINE__,__FILE__);
924 Principal::cacheFlush(
'lower(username) IN ('.$paramstring.
')', $params);
928 if (
sizeof($users_to_update) ) {
929 foreach ( $users_to_update as $key=> $username ) {
930 $principal =
new Principal(
'username', $username );
931 $valid=$ldap_users_info[$username];
932 if ( $mapping[
'modified'] !=
"" && array_key_exists($mapping[
'modified'], $valid)) {
933 $ldap_timestamp = $valid[$mapping[
'modified']];
935 $ldap_timestamp =
'19700101000000';
938 $valid[
'user_no'] = $db_users_info[$username][
'user_no'];
939 $mapping[
'user_no'] =
'user_no';
944 foreach($c->authenticate_hook[
'config'][
'format_updated'] as $k => $v) {
945 $$k = substr($ldap_timestamp,$v[0],$v[1]);
947 $ldap_timestamp = $Y.$m.$d.$H.$M.$S;
948 $valid[$mapping[
'modified']] =
"$Y-$m-$d $H:$M:$S";
950 $db_timestamp = substr(strtr($db_users_info[$username][
'updated'], array(
':' =>
'',
' '=>
'',
'-'=>
'')),0,14);
951 if ( $ldap_timestamp > $db_timestamp || !$db_users_info[$username][
'user_active']) {
952 $principal->user_active =
true;
953 sync_user_from_LDAP($principal, $mapping, $valid);
956 unset($users_to_update[$key]);
957 $users_nothing_done[] = $username;
960 if (
sizeof($users_to_update) )
961 $c->messages[] = sprintf(i18n(
'- updating user records : %s'),join(
', ',$users_to_update));
963 if (
sizeof($users_nothing_done) )
964 $c->messages[] = sprintf( i18n(
'- nothing done on : %s'), join(
', ',$users_nothing_done) );
968 $qry =
new AwlQuery(
"SELECT count(*) AS admins FROM usr JOIN role_member USING ( user_no ) JOIN roles USING (role_no) WHERE usr.active=TRUE AND role_name='Admin'");
969 $qry->Exec(
'sync_LDAP',__LINE__,__FILE__);
970 while ( $db_user = $qry->Fetch() ) {
971 $admins = $db_user->admins;
973 if ( $admins == 0 ) {
974 $c->messages[] = sprintf(i18n(
'Warning: there are no active admin users! You should fix this before logging out. Consider using the $c->do_not_sync_from_ldap configuration setting.'));
requestUser( $filter, $attributes, $username, $passwd)
getAllGroups($attributes)