0byt3m1n1
Path:
/
data
/
applications
/
aps.bak
/
webcalendar
/
1.2.3-0
/
standard
/
htdocs
/
includes
/
[
Home
]
File: user-nis.php
<?php defined ( '_ISVALID' ) or die ( 'You cannot access this file directly!' ); // This file contains all the functions for getting information // about users via NIS. So, if you want to use an authentication scheme // other than the webcal_user table, you can just create a new // version of each function found below. // // Note: this application assumes that usernames (logins) are unique. // // Note #2: If you are using HTTP-based authentication, then you still // need these functions and you will still need to add users to // webcal_user. if ( ! defined ( 'CRYPT_SALT_LENGTH' ) ) define ( 'CRYPT_SALT_LENGTH', 12 ); // Set some global config variables about your system. // For NIS (which is maintained external to WebCalendar), don't let them // add/delete users or change passwords. $user_can_update_password = false; $admin_can_add_user = false; $admin_can_delete_user = false; $admin_can_disable_user = false; // $user_external_group = 100; $user_external_email = 'domain.com'; // Check to see if a given login/password is valid. If invalid, // the error message will be placed in $error (a global variable). // params: // $login - user login // $password - user password // returns: true or false function user_valid_login ( $login, $password ) { global $error,$user_external_group,$user_external_email; $ret = false; $data = @yp_match (yp_get_default_domain (), 'passwd.byname', $login); if ( strlen ( $data ) ) { $data = explode ( ':', $data ); if ( $user_external_group && $user_external_group != $data[3] ) { $error = translate ( 'Invalid login' ); return $ret; } if ( $data[1] == crypt ( $password, substr ( $data[1], 0, CRYPT_SALT_LENGTH ) ) ) { if ( count ( $data ) >= 4 ) { $ret = true; // Check for user in webcal_user. // If in NIS and not in DB, then insert... $sql = 'SELECT cal_login FROM webcal_user WHERE cal_login = ?'; $res = dbi_execute ( $sql, array ( $login ) ); if ( ! $res || ! dbi_fetch_row ( $res ) ) { // insert user into webcal_user $uname = explode ( ' ', $data[4] ); $ufirstname = $uname[0]; $ulastname = $uname[count ( $uname ) - 1]; user_add_user ( $login, $password, $ufirstname, $ulastname, $login . '@' . $user_external_email, 'N' ); } else { //refresh their password in webcal_user user_update_user_password ( $login, $password ); } } else { $error = translate ( 'Invalid login' ) . ': ' . translate ( 'incorrect password' ); $ret = false; } } } else { // no such user $error = translate ( 'Invalid login' ) . ': ' . translate ( 'no such user' ); $ret = false; } return $ret; } /** * Check to see if a given login/crypted password is valid. * * If invalid, the error message will be placed in $error. * * @param string $login User login * @param string $crypt_password Encrypted user password * * @return bool True on success * * @global string Error message */ function user_valid_crypt ( $login, $crypt_password ) { global $error; $ret = false; $sql = 'SELECT cal_login, cal_passwd FROM webcal_user WHERE cal_login = ?'; $res = dbi_execute ( $sql, array ( $login ) ); if ( $res ) { $row = dbi_fetch_row ( $res ); if ( $row && $row[0] != '' ) { // MySQL seems to do case insensitive matching, so double-check // the login. // also check if password matches if ( ($row[0] == $login) && ( (crypt($row[1], $crypt_password) == $crypt_password) ) ) $ret = true; // found login/password else $error = 'Invalid login'; } else { $error = 'Invalid login'; } dbi_free_result ( $res ); } else { $error = 'Database error: ' . dbi_error (); } return $ret; } /** * Load info about a user (first name, last name, admin) and set globally. * * @param string $user User login * @param string $prefix Variable prefix to use * * @return bool True on success */ function user_load_variables ( $login, $prefix ) { global $PUBLIC_ACCESS_FULLNAME, $NONUSER_PREFIX, $cached_user_var; $ret = false; if ( ! empty ( $cached_user_var[$login][$prefix] ) ) return $cached_user_var[$login][$prefix]; $cached_user_var = array (); if ($NONUSER_PREFIX && substr ($login, 0, strlen ($NONUSER_PREFIX) ) == $NONUSER_PREFIX) { nonuser_load_variables ( $login, $prefix ); return true; } if ( $login == '__public__' || $login == '__default__' ) { $GLOBALS[$prefix . 'login'] = $login; $GLOBALS[$prefix . 'firstname'] = ''; $GLOBALS[$prefix . 'lastname'] = ''; $GLOBALS[$prefix . 'is_admin'] = 'N'; $GLOBALS[$prefix . 'email'] = ''; $GLOBALS[$prefix . 'fullname'] = ( $login == '__public__'? $PUBLIC_ACCESS_FULLNAME : translate ( 'DEFAULT CONFIGURATION' ) ); $GLOBALS[$prefix . 'password'] = ''; return true; } $sql = 'SELECT cal_firstname, cal_lastname, cal_is_admin, cal_email, cal_passwd FROM webcal_user WHERE cal_login = ?'; $res = dbi_execute ( $sql, array ( $login ) ); if ( $res ) { if ( $row = dbi_fetch_row ( $res ) ) { $GLOBALS[$prefix . 'login'] = $login; $GLOBALS[$prefix . 'firstname'] = $row[0]; $GLOBALS[$prefix . 'lastname'] = $row[1]; $GLOBALS[$prefix . 'is_admin'] = $row[2]; $GLOBALS[$prefix . 'email'] = empty ( $row[3] ) ? '' : $row[3]; if ( strlen ( $row[0] ) && strlen ( $row[1] ) ) $GLOBALS[$prefix . 'fullname'] = "$row[0] $row[1]"; else $GLOBALS[$prefix . 'fullname'] = $login; $GLOBALS[$prefix . 'password'] = $row[4]; $ret = true; } dbi_free_result ( $res ); } else { $error = db_error (); return false; } //save these results $cached_user_var[$login][$prefix] = $ret; return $ret; } /** * Add a new user. * * @param string $user User login * @param string $password User password * @param string $firstname User first name * @param string $lastname User last name * @param string $email User email address * @param string $admin Is the user an administrator? ('Y' or 'N') * * @return bool True on success * * @global string Error message */ function user_add_user ( $user, $password, $firstname, $lastname, $email, $admin, $enabled='Y' ) { global $error; if ( $user == '__public__' ) { $error = translate ( 'Invalid user login', true); return false; } if ( strlen ( $email ) ) $uemail = $email; else $uemail = NULL; if ( strlen ( $firstname ) ) $ufirstname = $firstname; else $ufirstname = NULL; if ( strlen ( $lastname ) ) $ulastname = $lastname; else $ulastname = NULL; if ( strlen ( $password ) ) $upassword = md5 ( $password ); else $upassword = NULL; if ( $admin != 'Y' ) $admin = 'N'; $sql = 'INSERT INTO webcal_user ( cal_login, cal_lastname, cal_firstname, cal_is_admin, cal_passwd, cal_email, cal_enabled ) VALUES ( ?, ?, ?, ?, ?, ? )'; if ( ! dbi_execute ( $sql, array ( $user, $ulastname, $ufirstname, $admin, $upassword, $uemail, $enabled ) ) ) { $error = translate ( 'Database error', true) . ': ' . dbi_error (); return false; } return true; } /** * Update a user. * * @param string $user User login * @param string $firstname User first name * @param string $lastname User last name * @param string $mail User email address * @param string $admin Is the user an administrator? ('Y' or 'N') * * @return bool True on success * * @global string Error message */ function user_update_user ( $user, $firstname, $lastname, $email, $admin, $enabled='Y' ) { global $error; if ( $user == '__public__' ) { $error = translate ( 'Invalid user login' ); return false; } if ( strlen ( $email ) ) $uemail = $email; else $uemail = NULL; if ( strlen ( $firstname ) ) $ufirstname = $firstname; else $ufirstname = NULL; if ( strlen ( $lastname ) ) $ulastname = $lastname; else $ulastname = NULL; if ( $admin != 'Y' ) $admin = 'N'; if ( $enabled != 'Y' ) $enabled = 'N'; $sql = 'UPDATE webcal_user SET cal_lastname = ?, cal_firstname = ?, cal_email = ?, cal_is_admin = ?, cal_enabled = ? WHERE cal_login = ?'; if ( ! dbi_execute ( $sql, array ( $ulastname, $ufirstname, $uemail, $admin, $enabled, $user ) ) ) { $error = db_error (); return false; } return true; } /** * Update user password. * * @param string $user User login * @param string $password User password * * @return bool True on success * * @global string Error message */ function user_update_user_password ( $user, $password ) { global $error; $sql = 'UPDATE webcal_user SET cal_passwd = ? WHERE cal_login = ?'; if ( ! dbi_execute ( $sql, array ( md5 ( $password ), $user ) ) ) { $error = db_error (); return false; } return true; } /** * Delete a user from the system. * * This will also delete any of the user's events in the system that have * no other participants. Any layers that point to this user * will be deleted. Any views that include this user will be updated. * * @param string $user User to delete */ function user_delete_user ( $user ) { // Get event ids for all events this user is a participant $events = get_users_event_ids ( $user ); // Now count number of participants in each event... // If just 1, then save id to be deleted $delete_em = array (); for ( $i = 0; $i < count ( $events ); $i++ ) { $res = dbi_execute ( 'SELECT COUNT(*) FROM webcal_entry_user WHERE cal_id = ?', array ( $events[$i] ) ); if ( $res ) { if ( $row = dbi_fetch_row ( $res ) ) { if ( $row[0] == 1 ) $delete_em[] = $events[$i]; } dbi_free_result ( $res ); } } // Now delete events that were just for this user for ( $i = 0; $i < count ( $delete_em ); $i++ ) { dbi_execute ( 'DELETE FROM webcal_entry_repeats WHERE cal_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_entry_repeats_not WHERE cal_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_entry_log WHERE cal_entry_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_import_data WHERE cal_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_site_extras WHERE cal_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_entry_ext_user WHERE cal_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_reminders WHERE cal_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_blob WHERE cal_id = ?', array ( $delete_em[$i] ) ); dbi_execute ( 'DELETE FROM webcal_entry WHERE cal_id = ?', array ( $delete_em[$i] ) ); } // Delete user participation from events dbi_execute ( 'DELETE FROM webcal_entry_user WHERE cal_login = ?', array ( $user ) ); // Delete preferences dbi_execute ( 'DELETE FROM webcal_user_pref WHERE cal_login = ?', array ( $user ) ); // Delete from groups dbi_execute ( 'DELETE FROM webcal_group_user WHERE cal_login = ?', array ( $user ) ); // Delete bosses & assistants dbi_execute ( 'DELETE FROM webcal_asst WHERE cal_boss = ?', array ( $user ) ); dbi_execute ( 'DELETE FROM webcal_asst WHERE cal_assistant = ?', array ( $user ) ); // Delete user's views $delete_em = array (); $res = dbi_execute ( 'SELECT cal_view_id FROM webcal_view WHERE cal_owner = ?', array ( $user ) ); if ( $res ) { while ( $row = dbi_fetch_row ( $res ) ) { $delete_em[] = $row[0]; } dbi_free_result ( $res ); } for ( $i = 0; $i < count ( $delete_em ); $i++ ) { dbi_execute ( 'DELETE FROM webcal_view_user WHERE cal_view_id = ?', array ( $delete_em[$i] ) ); } dbi_execute ( 'DELETE FROM webcal_view WHERE cal_owner = ?', array ( $user ) ); //Delete them from any other user's views dbi_execute ( 'DELETE FROM webcal_view_user WHERE cal_login = ?', array ( $user ) ); // Delete layers dbi_execute ( 'DELETE FROM webcal_user_layers WHERE cal_login = ?', array ( $user ) ); // Delete any layers other users may have that point to this user. dbi_execute ( 'DELETE FROM webcal_user_layers WHERE cal_layeruser = ?', array ( $user ) ); // Delete user dbi_execute ( 'DELETE FROM webcal_user WHERE cal_login = ?', array ( $user ) ); // Delete function access dbi_execute ( 'DELETE FROM webcal_access_function WHERE cal_login = ?', array ( $user ) ); // Delete user access dbi_execute ( 'DELETE FROM webcal_access_user WHERE cal_login = ?', array ( $user ) ); dbi_execute ( 'DELETE FROM webcal_access_user WHERE cal_other_user = ?', array ( $user ) ); // Delete user's categories dbi_execute ( 'DELETE FROM webcal_categories WHERE cat_owner = ?', array ( $user ) ); dbi_execute ( 'DELETE FROM webcal_entry_categories WHERE cat_owner = ?', array ( $user ) ); // Delete user's reports $delete_em = array (); $res = dbi_execute ( 'SELECT cal_report_id FROM webcal_report WHERE cal_login = ?', array ( $user ) ); if ( $res ) { while ( $row = dbi_fetch_row ( $res ) ) { $delete_em[] = $row[0]; } dbi_free_result ( $res ); } for ( $i = 0; $i < count ( $delete_em ); $i++ ) { dbi_execute ( 'DELETE FROM webcal_report_template WHERE cal_report_id = ?', array ( $delete_em[$i] ) ); } dbi_execute ( 'DELETE FROM webcal_report WHERE cal_login = ?', array ( $user ) ); //not sure about this one??? dbi_execute ( 'DELETE FROM webcal_report WHERE cal_user = ?', array ( $user ) ); // Delete user templates dbi_execute ( 'DELETE FROM webcal_user_template WHERE cal_login = ?', array ( $user ) ); } /** * Get a list of users and return info in an array. * * @return array Array of user info */ function user_get_users ( $publicOnly=false ) { global $PUBLIC_ACCESS, $PUBLIC_ACCESS_FULLNAME, $USER_SORT_ORDER; $count = 0; $ret = array (); if ( $PUBLIC_ACCESS == 'Y' ) $ret[$count++] = array ( 'cal_login' => '__public__', 'cal_lastname' => '', 'cal_firstname' => '', 'cal_is_admin' => 'N', 'cal_email' => '', 'cal_password' => '', 'cal_fullname' => $PUBLIC_ACCESS_FULLNAME ); if ( $publicOnly ) return $ret;0- $order1 = empty ( $USER_SORT_ORDER ) ? 'cal_lastname, cal_firstname,' : "$USER_SORT_ORDER,"; $res = dbi_execute ( 'SELECT cal_login, cal_lastname, cal_firstname, cal_is_admin, cal_email, cal_passwd FROM webcal_user ORDER BY $order1 cal_login' ); if ( $res ) { while ( $row = dbi_fetch_row ( $res ) ) { if ( strlen ( $row[1] ) && strlen ( $row[2] ) ) $fullname = ( $order1 == 'cal_lastname, cal_firstname,' ? "$row[1] $row[2]" : "$row[2] $row[1]" ); else $fullname = $row[0]; $ret[$count++] = array ( 'cal_login' => $row[0], 'cal_lastname' => $row[1], 'cal_firstname' => $row[2], 'cal_is_admin' => $row[3], 'cal_email' => empty ( $row[4] ) ? '' : $row[4], 'cal_password' => $row[5], 'cal_fullname' => $fullname ); } dbi_free_result ( $res ); } //no need to call sort_users () as the sql can sort for us return $ret; } ?>