egroupware/admin/inc/accounts_ldap.inc.php

291 lines
10 KiB
PHP
Raw Normal View History

<?php
/**************************************************************************\
* phpGroupWare - administration *
* http://www.phpgroupware.org *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
// Sections of code where taking from slapda http://www.jeremias.net/projects/sldapa by
// Jason Jeremias <jason@jeremias.net>
$ldap = ldap_connect($phpgw_info["server"]["ldap_host"]);
2000-10-23 04:48:34 +02:00
if (! @ldap_bind($ldap, $phpgw_info["server"]["ldap_root_dn"], $phpgw_info["server"]["ldap_root_pw"])) {
echo "<p><b>Error binding to LDAP server. Check your config</b>";
exit;
}
2000-10-23 04:48:34 +02:00
function getSearchLine($searchstring)
{
if (($searchstring=="*") || ($searchstring=="")) {
$searchline = "cn=*";
} else {
$searchline = sprintf("cn=*%s*",$searchstring);
}
return $searchline;
}
// Not the best method, but it works for now.
function account_total()
{
global $phpgw_info, $ldap;
$filter = "(|(uid=*))";
2000-10-23 07:44:39 +02:00
$sr = ldap_search($ldap,$phpgw_info["server"]["ldap_context"],$filter,array("uid"));
2000-10-23 04:48:34 +02:00
$info = ldap_get_entries($ldap, $sr);
2000-10-26 03:16:10 +02:00
$total = 0;
for ($i=0;$i<count($info);$i++) {
if (! $phpgw_info["server"]["global_denied_users"][$info[$i]["uid"][0]]) {
$total++;
}
}
return $total;
2000-10-23 04:48:34 +02:00
}
2000-10-23 07:44:39 +02:00
function account_view($loginid)
{
global $phpgw_info, $ldap;
$filter = "(|(uid=$loginid))";
$sr = ldap_search($ldap,$phpgw_info["server"]["ldap_context"],$filter,array("sn","givenname","uid","uidnumber"));
$aci = ldap_get_entries($ldap, $sr);
$account_info["account_id"] = $aci[0]["uid"][0];
$account_info["account_lid"] = $aci[0]["uidnumber"][0];
$account_info["account_lastname"] = $aci[0]["sn"][0];
$account_info["account_firstname"] = $aci[0]["givenname"][0];
return $account_info;
}
2000-10-23 03:14:21 +02:00
function account_read($method,$start,$sort,$order)
{
2000-10-23 04:48:34 +02:00
global $phpgw_info, $ldap;
2000-10-26 03:16:10 +02:00
/* echo "sort: $sort";
if ($sort == "account_lastname") {
$sort = 3;
} else if ($sort == "account_firstname") {
$sort = 2;
} else {
$sort = 1;
}
echo " - sort: $sort";
*/
2000-10-23 04:48:34 +02:00
$filter = "(|(uid=*))";
2000-10-23 07:44:39 +02:00
$sr = ldap_search($ldap,$phpgw_info["server"]["ldap_context"],$filter,array("sn","givenname","uid","uidnumber"));
2000-10-23 04:48:34 +02:00
$info = ldap_get_entries($ldap, $sr);
for ($i=0; $i<count($info); $i++) {
2000-10-23 05:33:30 +02:00
if (! $phpgw_info["server"]["global_denied_users"][$info[$i]["uid"][0]]) {
2000-10-23 07:44:39 +02:00
$account_info[$i]["account_id"] = $info[$i]["uidnumber"][0];
2000-10-23 05:33:30 +02:00
$account_info[$i]["account_lid"] = $info[$i]["uid"][0];
2000-10-26 03:16:10 +02:00
$account_info[$i]["account_lastname"] = $info[$i]["givenname"][0];
$account_info[$i]["account_firstname"] = $info[$i]["sn"][0];
2000-10-23 05:33:30 +02:00
}
2000-10-23 04:48:34 +02:00
}
2000-10-26 03:16:10 +02:00
// echo " - order: $order";
/* if ($order == "ASC") {
sort($account_info[$sort]);
} else {
rsort($account_info[$sort]);
} */
2000-10-23 04:48:34 +02:00
return $account_info;
}
function account_add($account_info)
{
2000-10-23 03:14:21 +02:00
global $phpgw_info, $phpgw, $ldap;
2000-10-31 12:55:05 +01:00
$account_info["passwd"] = $phpgw->common->encrypt_password($account_info["passwd"]);
2000-10-23 03:14:21 +02:00
// This method is only temp. We need to figure out the best way to assign uidnumbers and
// guidnumbers.
$phpgw->db->query("select (max(account_id)+1) from accounts");
$phpgw->db->next_record();
$account_info["account_id"] = $phpgw->db->f(0);
// Much of this is going to be guess work for now, until we get things planned out.
$entry["uid"] = $account_info["loginid"];
$entry["uidNumber"] = $account_info["account_id"];
$entry["gidNumber"] = $account_info["account_id"];
$entry["userpassword"] = $account_info["passwd"];
$entry["loginShell"] = "/bin/bash";
$entry["homeDirectory"] = "/home/" . $account_info["loginid"];
$entry["cn"] = sprintf("%s %s", $account_info["firstname"], $account_info["lastname"]);
$entry["sn"] = $account_info["lastname"];
$entry["givenname"] = $account_info["firstname"];
//$entry["company"] = $company;
//$entry["title"] = $title;
$entry["mail"] = $account_info["loginid"] . "@" . $phpgw_info["server"]["mail_suffix"];
//$entry["telephonenumber"] = $telephonenumber;
//$entry["homephone"] = $homephone;
//$entry["pagerphone"] = $pagerphone;
//$entry["cellphone"] = $cellphone;
//$entry["streetaddress"] = $streetaddress;
//$entry["locality"] = $locality;
//$entry["st"] = $st;
//$entry["postalcode"] = $postalcode;
//$entry["countryname"] = $countryname;
//$entry["homeurl"] = $homeurl;
//$entry["description"] = $description;
$entry["objectclass"][0] = "account";
$entry["objectclass"][1] = "posixAccount";
$entry["objectclass"][2] = "shadowAccount";
$entry["objectclass"][3] = "inetOrgperson";
2000-10-23 03:14:21 +02:00
$entry["objectclass"][4] = "person";
$entry["objectclass"][5] = "top";
/* $dn=sprintf("cn=%s %s, %s", $givenname, $sn, $BASEDN);*/
2000-10-23 03:14:21 +02:00
$dn=sprintf("uid=%s, %s", $account_info["loginid"], $phpgw_info["server"]["ldap_context"]);
// add the entries
if (ldap_add($ldap, $dn, $entry)) {
$cd = 28;
} else {
$cd = 99; // Come out with a code for this
}
@ldap_close($ldap);
2000-10-23 03:14:21 +02:00
2000-11-03 21:07:57 +01:00
add_default_preferences($account_info["account_id"]);
2000-10-23 03:14:21 +02:00
$phpgw->db->lock(array("accounts","preferences"));
while ($permission = each($account_info["permissions"])) {
if ($phpgw_info["apps"][$permission[0]]["enabled"]) {
$phpgw->accounts->add_app($permission[0]);
}
}
$sql = "insert into accounts (account_id,account_lid,account_pwd,account_firstname,"
. "account_lastname,account_permissions,account_groups,account_status,"
. "account_lastpwd_change) values ('" . $account_info["account_id"] . "','"
. $account_info["loginid"] . "','x','". addslashes($account_info["firstname"]) . "','"
. addslashes($account_info["lastname"]) . "','" . $phpgw->accounts->add_app("",True)
. "','" . $account_info["groups"] . "','A',0)";
$phpgw->db->query($sql);
$phpgw->db->unlock();
$sep = $phpgw->common->filesystem_separator();
$basedir = $phpgw_info["server"]["files_dir"] . $sep . "users" . $sep;
if (! @mkdir($basedir . $n_loginid, 0707)) {
$cd = 36;
} else {
$cd = 28;
}
return $cd;
}
function account_edit($account_info)
{
global $phpgw, $phpgw_info, $ldap;
// This is just until the API fully handles reading the LDAP account info.
$lid = $account_info["loginid"];
if ($account_info["c_loginid"]) {
$phpgw->db->query("update accounts set account_lid='" . $account_info["c_loginid"]
. "' where account_lid='" . $account_info["loginid"] . "'");
$account_info["loginid"] = $account_info["c_loginid"];
$entry["uid"] = $account_info["loginid"];
$entry["homeDirectory"] = "/home/" . $account_info["loginid"];
$entry["mail"] = $account_info["loginid"] . "@" . $phpgw_info["server"]["mail_suffix"];
}
if ($account_info["passwd"]) {
$entry["userpassword"] = $phpgw->common->encrypt_password($n_passwd);
// Update the sessions table. (The user might be logged in)
$phpgw->db->query("update sessions set session_pwd='" . $phpgw->common->encrypt($n_passwd) . "' "
. "where session_lid='$lid'");
}
while ($permission = each($account_info["permissions"])) {
if ($phpgw_info["apps"][$permission[0]]["enabled"]) {
$phpgw->accounts->add_app($permission[0]);
}
}
if (! $account_info["account_status"]) {
$account_info["account_status"] = "L";
}
$phpgw->db->query("update accounts set account_firstname='"
. addslashes($account_info["firstname"]) . "', account_lastname='"
. addslashes($account_info["lastname"]) . "', account_permissions='"
. $phpgw->accounts->add_app("",True) . "', account_status='"
. $account_info["account_status"] . "', account_groups='"
. $account_info["groups"] . "' where account_lid='" . $account_info["loginid"]
. "'");
$entry["cn"] = sprintf("%s %s", $account_info["firstname"], $account_info["lastname"]);
$entry["sn"] = $account_info["lastname"];
$entry["givenname"] = $account_info["firstname"];
$dn = sprintf("uid=%s, %s", $phpgw_info["user"]["userid"],$phpgw_info["server"]["ldap_context"]);
@ldap_modify($ldap, $dn, $entry);
$cd = 27;
if ($account_info["c_loginid"] != $account_info["loginid"]) {
$sep = $phpgw->common->filesystem_separator();
$basedir = $phpgw_info["server"]["files_dir"] . $sep . "users" . $sep;
if (! @rename($basedir . $lid, $basedir . $account_info["loginid"])) {
$cd = 35;
}
}
return $cd;
}
function account_delete($account_id)
{
2000-10-23 08:34:25 +02:00
global $phpgw_info, $phpgw, $ldap;
2000-10-23 08:34:25 +02:00
$phpgw->db->query("select account_lid from accounts where account_id='$account_id'");
$phpgw->db->next_record();
ldap_delete($ldap,"uid=" . $phpgw->db->f("account_lid") . ", ". $phpgw_info["server"]["ldap_context"]);
2000-10-26 03:16:10 +02:00
$phpgw->db->query("delete from accounts where account_id='$account_id'");
}
function account_exsists($loginid)
{
2000-10-26 03:16:10 +02:00
global $phpgw_info, $ldap;
$filter = "(|(uid=$loginid))";
2000-10-26 03:16:10 +02:00
$sr = ldap_search($ldap,$phpgw_info["server"]["ldap_context"],$filter,array("uid"));
$total = ldap_get_entries($ldap, $sr);
// Odd, but it works
if (count($total) == 2) {
return True;
} else {
return False;
}
}
function account_close()
{
@ldap_close($ldap);
}