CT,&?w=0~F2KئN>>d).?bR,D 'gSyֵhITylX4ã~0^vPbFy!‰-M,<)[\m쁕bnn{;J_izNb W @H%;jsk bM?g8>m׊r xY/Tڲ5܌$ibDce:7pa=n@:G@Pq F08ЖC% w,,<5#֝w<;FG\=e:icmХA'`Mm[bhFB.m@3::vNS.1 DDY@\0ϟ-)|A/MT|QR`3޸a-񐯥m:HMOԔfmRUqȍP1҄*X>=kRQ n! %qs-%/e^^D;,I`lC12W!쌴Y"rB:;9^#zf4B1*G9PG VqB-[ ',^=tHUX6g}dSA~|p+z ̥H*{D7_:@>QΖָJDR7<=ڻd^8[`S~EhЏP0./h':|z:!JTgx]E__ fϞkFa~Dp&,-B>~SK3?Ĥ+vo$LA\W<'kTεZNxVHL2q ",yG|g>|R$rVjfVTٰzv w\3I{d 0&EsG,CHZdvtD'eŝ%t2AdMu\!D@5e^ 5R vw͝m2\l4$攫9U3kDd^+?E:zcoFVgV.CAQ"ZǗ8~-'`!fFXsP5Vș2A4;Bmo D Q!fӠPsMl@kÔFj薯qݨ"5[4l@1cy2dA!V #X:xbB,֩餍 =N3Tl xr&GoFskZyHq{\ EJD$hAjI ;!TÉ  M5c(>iΖ`m1xq9Ζ~-gm!FT̽/WFQN``8לI=!m6g'm^ݮ6E%f9^0ekÄ7Q ;n`9Y #o(~﮹/QPh Ugqz{߈O3r><(=."m:Ahj~2T R!ʝs NoYPQ9FU?TD3'ȁ*`/H#Ɣw/I}cg'?Eɓ,q0ۢa4 ( vGVvNRzJUJμaE~eZ/jˈ{Hcw#O R-vg|ߊykYޕ mڑ:+uG[Jgd):'I91͏^*X:5M9םE*>iG_ mEyR@a]+&]^!&’!kQZD|V->2 d*GNRzJUJμaE~eZ/jˈ{xMpWӂᰬMJ14鋇Qu8d '4.d :JUzx:sP 4bk"E~O_9 mo̮!ݮs6&yf|]^!&’!kQZD|õњ>Հ0$4~;a+RJ*8>(맛7V f*_WV69OM8 9q #,yu%j-U?#Z"M@j>CPQǎh4Zx~^ۦ'e*ѳܜ |ujq]P zM>juKhO㣞)NSyx>O[ X|s#Yǻ|&>kJ X3ܹ=v?Zcp/C+̩a~](4ёT|Ux maٗm_> m%(N!ʲ6[ɓCod8aGB b+^^8::ԐzkԽ.S/E98m2W MPs"6$fպ~oEX/B4敏if.ҒA1`Eehx҃lj#<vNP+aտzNnFPx<9SeӞX.3.Խ;7) ;4qS5Pȗ8>SS?;[c=_&8hqex5id]'/ password if (empty($crypted_pass)) { return PASSWORD_CRYPT_ERROR; } // Crypt new samba password if ($smbpwattr && !($samba_pass = password::hash_password($passwd, 'samba'))) { return PASSWORD_CRYPT_ERROR; } // Writing new crypted password to LDAP $userEntry = $ldap->getEntry($userDN); if (Net_LDAP2::isError($userEntry)) { return PASSWORD_CONNECT_ERROR; } if (!$userEntry->replace([$pwattr => $crypted_pass], $force)) { return PASSWORD_CONNECT_ERROR; } // Updating PasswordLastChange Attribute if desired if ($lchattr) { $current_day = (int) (time() / 86400); if (!$userEntry->replace([$lchattr => $current_day], $force)) { return PASSWORD_CONNECT_ERROR; } } // Update Samba password and last change fields if ($smbpwattr) { $userEntry->replace([$smbpwattr => $samba_pass], $force); } // Update Samba password last change field if ($smblchattr) { $userEntry->replace([$smblchattr => time()], $force); } if (Net_LDAP2::isError($userEntry->update())) { return PASSWORD_CONNECT_ERROR; } // All done, no error return PASSWORD_SUCCESS; } /** * Bind with searchDN and searchPW and search for the user's DN. * Use search_base and search_filter defined in config file. * Return the found DN. */ function search_userdn($rcmail) { $binddn = $rcmail->config->get('password_ldap_searchDN'); $bindpw = $rcmail->config->get('password_ldap_searchPW'); $ldapConfig = [ 'basedn' => $rcmail->config->get('password_ldap_basedn'), 'host' => $rcmail->config->get('password_ldap_host', 'localhost'), 'port' => $rcmail->config->get('password_ldap_port', '389'), 'starttls' => $rcmail->config->get('password_ldap_starttls'), 'version' => $rcmail->config->get('password_ldap_version', '3'), ]; // allow anonymous searches if (!empty($binddn)) { $ldapConfig['binddn'] = $binddn; $ldapConfig['bindpw'] = $bindpw; } $ldap = Net_LDAP2::connect($ldapConfig); if (is_a($ldap, 'PEAR_Error')) { return ''; } $base = rcube_ldap_simple_password::substitute_vars($rcmail->config->get('password_ldap_search_base')); $filter = rcube_ldap_simple_password::substitute_vars($rcmail->config->get('password_ldap_search_filter')); $options = [ 'scope' => 'sub', 'attributes' => [], ]; $result = $ldap->search($base, $filter, $options); if (is_a($result, 'PEAR_Error') || ($result->count() != 1)) { $ldap->done(); return ''; } $userDN = $result->current()->dn(); $ldap->done(); return $userDN; } }