1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363:
<?php
require_once("DataUpdate.php");
if ( !function_exists('auth_functions_deprecated') ) {
function auth_functions_deprecated( $method, $message = null ) {
global $c;
if ( isset($c->dbg['ALL']) || isset($c->dbg['deprecated']) ) {
$stack = debug_backtrace();
array_shift($stack);
if ( preg_match( '{/inc/auth-functions.php$}', $stack[0]['file'] ) && $stack[0]['line'] > __LINE__ ) return;
dbg_error_log("LOG", " auth-functions: Call to deprecated routine '%s'%s", $method, (isset($message)?': '.$message:'') );
foreach( $stack AS $k => $v ) {
dbg_error_log( 'LOG', ' auth-functions: Deprecated call from line %4d of %s', $v['line'], $v['file']);
}
}
}
}
function getUserByName( $username, $use_cache=true ) {
auth_functions_deprecated('getUserByName','replaced by Principal class');
return new Principal('username', $username, $use_cache);
}
function getUserByEMail( $email, $use_cache = true ) {
auth_functions_deprecated('getUserByEMail','replaced by Principal class');
return new Principal('email', $email, $use_cache);
}
function getUserByID( $user_no, $use_cache = true ) {
auth_functions_deprecated('getUserByID','replaced by Principal class');
return new Principal('user_no', $user_no, $use_cache);
}
function getPrincipalByID( $principal_id, $use_cache = true ) {
auth_functions_deprecated('getPrincipalByID','replaced by Principal class');
return new Principal('principal_id', $principal_id, $use_cache);
}
function CreateHomeCollections( $username, $defult_timezone = null ) {
global $session, $c;
if ( !isset($c->default_collections) )
{
$c->default_collections = array();
if( !empty($c->home_calendar_name) )
$c->default_collections[] = array( 'type' => 'calendar', 'name' => $c->home_calendar_name );
if( !empty($c->home_addressbook_name) )
$c->default_collections[] = array( 'type' => 'addressbook', 'name' => $c->home_addressbook_name );
}
if ( !is_array($c->default_collections) || !count($c->default_collections) ) return true;
$principal = new Principal('username',$username);
$user_fullname = $principal->fullname;
$user_rfullname = implode(' ', array_reverse(explode(' ', $principal->fullname)));
$sql = 'INSERT INTO collection (user_no, parent_container, dav_name, dav_etag, dav_displayname, is_calendar, is_addressbook, default_privileges, created, modified, resourcetypes) ';
$sql .= 'VALUES( :user_no, :parent_container, :collection_path, :dav_etag, :displayname, :is_calendar, :is_addressbook, :privileges::BIT(24), current_timestamp, current_timestamp, :resourcetypes );';
foreach( $c->default_collections as $v ) {
if ( $v['type'] == 'calendar' || $v['type']=='addressbook' ) {
if ( !empty($v['name']) ) {
$qry = new AwlQuery( 'SELECT 1 FROM collection WHERE dav_name = :dav_name', array( ':dav_name' => $principal->dav_name().$v['name'].'/') );
if ( !$qry->Exec() ) {
$c->messages[] = i18n('There was an error reading from the database.');
return false;
}
if ( $qry->rows() > 0 ) {
$c->messages[] = i18n('Home '.( $v['type']=='calendar' ? 'calendar' : 'addressbook' ).' already exists.');
return true;
}
else {
$params[':user_no'] = $principal->user_no();
$params[':parent_container'] = $principal->dav_name();
$params[':dav_etag'] = '-1';
$params[':collection_path'] = $principal->dav_name().$v['name'].'/';
$params[':displayname'] = ( !isset($v['displayname']) || empty($v['displayname']) ? $user_fullname.( $v['type']=='calendar' ? ' calendar' : ' addressbook' ) : str_replace(array('%fn', '%rfn'), array($user_fullname, $user_rfullname), $v['displayname']) );
$params[':resourcetypes'] = ( $v['type']=='calendar' ? '<DAV::collection/><urn:ietf:params:xml:ns:caldav:calendar/>' : '<DAV::collection/><urn:ietf:params:xml:ns:carddav:addressbook/>' );
$params[':is_calendar'] = ( $v['type']=='calendar' ? true : false );
$params[':is_addressbook'] = ( $v['type']=='addressbook' ? true : false );
$params[':privileges'] = ( !isset($v['privileges']) || $v['privileges']===null ? null : privilege_to_bits($v['privileges']) );
$qry = new AwlQuery( $sql, $params );
if ( $qry->Exec() ) {
$c->messages[] = i18n('Home '.( $v['type']=='calendar' ? 'calendar' : 'addressbook' ).' added.');
dbg_error_log("User",":Write: Created user's home ".( $v['type']=='calendar' ? 'calendar' : 'addressbook' )." at '%s'", $params[':collection_path'] );
if($v['type'] == 'calendar' && isset($v['calendar_components']) && $v['calendar_components'] != null && is_array($v['calendar_components']) && count($v['calendar_components'])) {
$components_clean=array_intersect(array_map("strtoupper", $v['calendar_components']), array('VEVENT', 'VTODO', 'VJOURNAL', 'VTIMEZONE', 'VFREEBUSY', 'VPOLL', 'VAVAILABILITY'));
$result_xml='';
foreach($components_clean as $curr)
$result_xml.=sprintf('<comp name="%s" xmlns="urn:ietf:params:xml:ns:caldav"/>', $curr);
if($result_xml!='')
$v['default_properties']['urn:ietf:params:xml:ns:caldav:supported-calendar-component-set']=$result_xml;
}
if(isset($v['default_properties']) && $v['default_properties'] != null && is_array($v['default_properties']) && count($v['default_properties'])) {
$sql2='INSERT INTO property (dav_name, property_name, property_value, changed_on, changed_by) ';
$sql2.='VALUES (:collection_path, :property_name, :property_value, current_timestamp, :user_no);';
$params2[':user_no'] = $principal->user_no();
$params2[':collection_path'] = $principal->dav_name().$v['name'].'/';
foreach( $v['default_properties'] AS $key => $val ) {
$params2[':property_name'] = $key;
$params2[':property_value'] = $val;
$qry2 = new AwlQuery( $sql2, $params2 );
if ( $qry2->Exec() ) {
dbg_error_log("User",":Write: Created property '%s' for ".( $v['type']=='calendar' ? 'calendar' : 'addressbook' )." at '%s'", $params2[':property_name'], $params2[':collection_path'] );
}
else {
$c->messages[] = i18n("There was an error writing to the database.");
return false;
}
}
}
}
else {
$c->messages[] = i18n("There was an error writing to the database.");
return false;
}
}
}
}
}
return true;
}
function CreateHomeCalendar($username) {
auth_functions_deprecated('CreateHomeCalendar','renamed to CreateHomeCollections');
return CreateHomeCollections($username);
}
function CreateDefaultRelationships( $username ) {
global $c;
if(! isset($c->default_relationships) || count($c->default_relationships) == 0) return true;
$changes = false;
foreach($c->default_relationships as $group => $relationships)
{
$sql = 'INSERT INTO grants (by_principal, to_principal, privileges) VALUES(:by_principal, :to_principal, :privileges::INT::BIT(24))';
$params = array(
':by_principal' => getUserByName($username)->principal_id,
':to_principal' => $group,
':privileges' => privilege_to_bits($relationships)
);
$qry = new AwlQuery($sql, $params);
if ( $qry->Exec() ) {
$changes = true;
dbg_error_log("User",":Write: Created user's default relationship by:'%s', to:'%s', privileges:'%s'",$params[':by_principal'],$params[':to_principal'],$params[':privileges']);
}
else {
$c->messages[] = i18n("There was an error writing to the database.");
return false;
}
}
if($changes)
$c->messages[] = i18n("Default relationships added.");
return true;
}
function UpdateCollectionTimezones( $username, $new_timezone=null ) {
if ( empty($new_timezone) ) return;
$qry = new AwlQuery('UPDATE collection SET timezone=? WHERE dav_name LIKE ? AND is_calendar', '/'.$username.'/%', $new_timezone);
$qry->Exec();
}
function UpdateUserFromExternal( &$usr ) {
global $c;
auth_functions_deprecated('UpdateUserFromExternal','refactor to use the "Principal" class');
if ( !isset($usr->user_no) || intval($usr->user_no) == 0 ) {
$qry = new AwlQuery( "SELECT nextval('usr_user_no_seq');" );
$qry->Exec('Login',__LINE__,__FILE__);
$sequence_value = $qry->Fetch(true);
$usr->user_no = $sequence_value[0];
}
$qry = new AwlQuery('SELECT * FROM usr WHERE user_no = :user_no', array(':user_no' => $usr->user_no) );
if ( $qry->Exec('Login',__LINE__,__FILE__) && $qry->rows() == 1 ) {
$type = "UPDATE";
if ( $old = $qry->Fetch() ) {
$changes = false;
foreach( $usr AS $k => $v ) {
if ( $old->{$k} != $v ) {
$changes = true;
dbg_error_log("Login","User '%s' field '%s' changed from '%s' to '%s'", $usr->username, $k, $old->{$k}, $v );
break;
}
}
if ( !$changes ) {
dbg_error_log("Login","No changes to user record for '%s' - leaving as-is.", $usr->username );
if ( isset($usr->active) && $usr->active == 'f' ) return false;
return;
}
else {
dbg_error_log("Login","Changes to user record for '%s' - updating.", $usr->username );
}
}
}
else
$type = "INSERT";
$params = array();
if ( $type != 'INSERT' ) $params[':user_no'] = $usr->user_no;
$qry = new AwlQuery( sql_from_object( $usr, $type, 'usr', 'WHERE user_no= :user_no' ), $params );
$qry->Exec('Login',__LINE__,__FILE__);
if ( isset($usr->active) && ($usr->active === 'f' || $usr->active === false) ) return false;
if ( $type == 'INSERT' ) {
$qry = new AwlQuery( 'INSERT INTO principal( type_id, user_no, displayname, default_privileges) SELECT 1, user_no, fullname, :privs::INT::BIT(24) FROM usr WHERE username=(text(:username))',
array( ':privs' => privilege_to_bits($c->default_privileges), ':username' => $usr->username) );
$qry->Exec('Login',__LINE__,__FILE__);
CreateHomeCalendar($usr->username);
CreateDefaultRelationships($usr->username);
}
else if ( $usr->fullname != $old->{'fullname'} ) {
$qry->QDo( 'UPDATE principal SET displayname=:new_display WHERE user_no=:user_no',
array(':new_display' => $usr->fullname, ':user_no' => $usr->user_no)
);
}
}
function AuthExternalAWL( $username, $password ) {
global $c;
$persistent = isset($c->authenticate_hook['config']['use_persistent']) && $c->authenticate_hook['config']['use_persistent'];
if ( isset($c->authenticate_hook['config']['columns']) )
$cols = $c->authenticate_hook['config']['columns'];
else
$cols = '*';
if ( isset($c->authenticate_hook['config']['where']) )
$andwhere = ' AND '.$c->authenticate_hook['config']['where'];
else
$andwhere = '';
$qry = new AwlQuery('SELECT '.$cols.' FROM usr WHERE lower(username) = :username '. $andwhere, array( ':username' => strtolower($username) ));
$authconn = $qry->SetConnection($c->authenticate_hook['config']['connection'], ($persistent ? array(PDO::ATTR_PERSISTENT => true) : null));
if ( ! $authconn ) {
echo <<<EOERRMSG
<html><head><title>Database Connection Failure</title></head><body>
<h1>Database Error</h1>
<h3>Could not connect to PostgreSQL database</h3>
</body>
</html>
EOERRMSG;
@ob_flush(); exit(1);
}
if ( $qry->Exec('Login',__LINE__,__FILE__) && $qry->rows() == 1 ) {
$usr = $qry->Fetch();
if ( session_validate_password( $password, $usr->password ) ) {
$principal = new Principal('username',$username);
if ( $principal->Exists() ) {
if ( $principal->modified <= $usr->updated )
$principal->Update($usr);
}
else {
$principal->Create($usr);
CreateHomeCollections($username);
}
if ( isset($usr->active) && $usr->active == 'f' ) return false;
return $principal;
}
}
return false;
}