admin_user = $admin_user; $this->admin_pass = $admin_pass; $this->site = $siteConnection->GetSite(); $this->site->Open($user); $createTables = (file_exists($db))?false:true; $this->db = new SQLiteDatabase($db); $this->aszInitialPrefs = $default_prefs; if ($createTables) { //build db tables $this->db->query("CREATE TABLE users (userid INTEGER PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, password VARCHAR ( 255 ) NOT NULL, disabled INTEGER, resetkey VARCHAR ( 255 ) default '', email VARCHAR ( 255 )) ;"); $this->db->query("CREATE TABLE prefs (prefid INTEGER PRIMARY KEY, name VARCHAR ( 255 ) NOT NULL, default_value VARCHAR ( 255 ));"); $this->db->query("CREATE TABLE user_prefs (userid INTEGER NOT NULL, prefid INTEGER NOT NULL, value VARCHAR(255));"); //add default preferences; $szPrefsSQL = ''; foreach($this->aszInitialPrefs as $key => $value) { $szPrefsSQL .= 'INSERT INTO prefs (name, default_value) VALUES ("'.$key.'","'.$value.'");'; } if ($szPrefsSQL != ''){ $this->db->queryExec($szPrefsSQL); } } } // = ======================================================================= // = AddUser will be invoked with new user credentials assuming login failed // = in MgCommon // = ======================================================================= function AddUser ($username, $password, $email) { try { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $site = $siteConnection->GetSite(); $username = trim($username); $fullname = $username; $site->AddUser($username, $username, $password, $fullname); //set author role $usersToGrant = new MgStringCollection(); $roleToUpdate = new MgStringCollection(); $roleToUpdate->Add( MgRole::Author ); $usersToGrant->Add( $username ) ; $site->GrantRoleMembershipsToUsers( $roleToUpdate, $usersToGrant ); // Create user directory in repository: // Create Header $headerContent = $this->GetUserFolderHeader($username); $header_byteSource = new MgByteSource($headerContent, strlen($headerContent)); $header_byteSource->setMimeType("text/xml"); $header_byteReader = $header_byteSource->GetReader(); $resourceService = $siteConnection->CreateService(MgServiceType::ResourceService); // Create Folder $id = new MgResourceIdentifier(MG_USER_DIRECTORY_ROOT.$username.'/'); $resourceService->SetResource($id, NULL, $header_byteReader); $encryptedPassword = crypt($password, SALT); $success = $this->db->queryExec('INSERT INTO users (username, password, disabled, email) VALUES ("'.$username.'", "'.$encryptedPassword.'", 0, "'.$email.'" );'); if ($success) { $userId = $this->db->lastInsertRowid(); //setup default prefs foreach($this->aszInitialPrefs as $key => $value) { $result = $this->db->SingleQuery('SELECT prefid FROM prefs WHERE name="'.$key.'";'); if ($result) { $prefid = $result; } //TODO: improve efficiency by combining queries $this->AddUserPref($userId, $prefid, $value); } return $this->GetUser($userId); } else { echo "Failed to insert user"; return FALSE; } } catch (MgDuplicateUserException $du_e) { echo 'Duplicate user!'; return FALSE; } catch (MgException $e) { echo "" . $e->GetExceptionMessage() . "\n"; echo $e->GetDetails() . "\n"; echo $e->GetStackTrace() . "\n"; return FALSE; } } function EnableUser ($userId) { $success = $this->db->queryExec('UPDATE users SET disabled = 1 where userid ='.$userId.';'); if ($success) { return $userId; }else { //couldn't update the user return FALSE; } } function DisableUser ($userId) { $success = $this->db->queryExec('UPDATE users SET disabled = 1 where userid ='.$userId.';'); if ($success) { return $userId; }else { //couldn't create the user - not unique return FALSE; } } function DeleteUser ($userId, $userName) { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $users = new MgStringCollection(); $users->Add($userName); if (!$users->GetCount()) { throw new Exception("User was not removed from MapGuide."); } $siteConnection->GetSite()->DeleteUsers($users); $success = $this->db->queryExec('DELETE FROM users WHERE userid ='.$userId.';'. 'DELETE FROM user_prefs WHERE userid ='.$userId.';'); if ($success) { $userId = $this->db->lastInsertRowid(); return $userId; } else { //couldn't create the user - not unique return FALSE; } } function AddPref ($name, $defaultValue) { $this->db->query('INSERT INTO prefs (name, default_value) VALUES ("'.$name.'","'.$defaultValue.'");'); return $this->db->lastInsertRowid(); } function SetUserPref($userId, $pref, $value) { $prefId = $this->db->SingleQuery('select prefid from prefs where name = "'.$pref.'"'); // use default value from prefs table if value is not supplied. if ($value == '') { $result = $this->db->SingleQuery('SELECT default_value FROM prefs WHERE prefid='.$prefId.';'); if ($result) { $value = $result; } } //determine if the pref already exists for this user $test = $this->db->query('SELECT userid FROM user_prefs WHERE userid='.$userId. ' AND prefid='.$prefId.';'); if ($test->numRows()) { $this->db->queryExec('UPDATE user_prefs SET value="'.$value.'" WHERE userid='. $userId.' AND prefid='.$prefId.';'); }else{ $this->db->queryExec('INSERT INTO user_prefs (userid, prefid, value) VALUES ('. $userId.', '.$prefId.', "'.$value.'");'); return $this->db->lastInsertRowid(); } } function AddUserPref ($userId, $prefId, $value) { $this->db->queryExec('INSERT INTO user_prefs (userid, prefid, value) VALUES ('.$userId.', '.$prefId.', "'.$value.'");'); return $this->db->lastInsertRowid(); } function Login($username, $password) { $user = FALSE; $encryptedPassword = crypt($password, SALT); $result = $this->db->query('SELECT userid FROM users WHERE username = "'.$username.'" and password = "'.$encryptedPassword.'" and disabled = 0 and resetkey = '."''".';'); try { if ($result) { $aRow = $result->fetch(SQLITE_ASSOC); $user = $this->GetUser($aRow['userid']); } else { //user was logged in by the MapGuide server if we got to here, we //need to kick them out. global $sessionID; $user = new MgUserInformation("Anonymous", ""); $user->SetMgSessionId($sessionID); } } catch(MgException $e) { return "Login failed."; } return $user; } // //TODO secure these functions so only admin can get values // function GetUserPrefs($userId) { $result = $this->db->query('SELECT * from user_prefs, prefs WHERE userid = '.$userId.' AND user_prefs.prefid = prefs.prefid;'); return $result->FetchAll(SQLITE_ASSOC); } function GetUsers() { $result = $this->db->query('SELECT * FROM users;'); return $result->FetchAll(SQLITE_ASSOC); } function GetPrefs() { $result = $this->db->query('SELECT prefid, name, default_value FROM prefs;'); return $result->FetchAll(SQLITE_ASSOC); } function GetUserFolderHeader($user){ $szContent = sprintf(' false %s r,w ',$user); return $szContent; } /* remove all managed users */ function Clean() { $aUsers = $this->GetUsers(); foreach ($aUsers as $user) { $this->DeleteUser($user['userid'], $user['username']); } } /* enumerate groups - this requires admin privileges */ function GetGroups($username=NULL) { $aGroups = array(); try { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $site = $siteConnection->GetSite(); if ($username) { $byteReader = $site->EnumerateGroups($username, ''); } else { $byteReader = $site->EnumerateGroups(); } $xmldoc = new DOMDocument(); $xmldoc->loadXML(ByteReaderToString($byteReader)); $groupNodeList = $xmldoc->getElementsByTagName('Group'); for ($i=0; $i<$groupNodeList->length; $i++) { $group = $groupNodeList->item($i); $nameElt = $group->getElementsByTagName('Name'); $name = $nameElt->item(0)->nodeValue; $descElt = $group->getElementsByTagName('Description'); $description = $descElt->item(0)->nodeValue; array_push($aGroups, array('name' => $name, 'description' => $description)); } } catch (MgException $e) { echo "ERROR: " . $e->GetExceptionMessage() . "\n"; echo $e->GetDetails() . "\n"; echo $e->GetStackTrace() . "\n"; } return $aGroups; } function AddGroup($name, $description) { try { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $site = $siteConnection->GetSite(); $site->AddGroup($name, $description); } catch (MgException $e) { return FALSE; } return TRUE; } function RemoveGroup($group) { try { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $site = $siteConnection->GetSite(); $groups = new MgStringCollection(); $groups->Add( $group ) ; $site->DeleteGroups($groups); } catch (MgException $e) { echo "ERROR: " . $e->GetExceptionMessage() . "\n"; echo $e->GetDetails() . "\n"; echo $e->GetStackTrace() . "\n"; return FALSE; } return TRUE; } function AddUserToGroup($group, $username) { try { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $site = $siteConnection->GetSite(); $userToGrant = new MgStringCollection(); $userToGrant->Add( $username ) ; $groupToUpdate = new MgStringCollection(); $groupToUpdate->Add( $group ); $site->GrantGroupMembershipsToUsers($groupToUpdate, $userToGrant); } catch (MgException $e) { echo "ERROR: " . $e->GetExceptionMessage() . "\n"; echo $e->GetDetails() . "\n"; echo $e->GetStackTrace() . "\n"; return FALSE; } return TRUE; } function RemoveUserFromGroup($group, $username) { try { $user = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($user); $site = $siteConnection->GetSite(); $userToRemove = new MgStringCollection(); $userToRemove->Add( $username ) ; $groupToUpdate = new MgStringCollection(); $groupToUpdate->Add( $group ); $site->RevokeGroupMembershipsFromUsers($groupToUpdate, $userToRemove); } catch (MgException $e) { return FALSE; } return TRUE; } function GetUser($id) { $user = FALSE; if (!empty($id)) { $result = $this->db->query("SELECT * FROM users where userid = $id;"); if ($result) { $a = $result->fetch(); $result = $this->db->query('SELECT * from user_prefs, prefs WHERE userid = '.$id.' AND user_prefs.prefid = prefs.prefid;'); $prefs = array(); if ($result) { while ($pref = $result->fetch()) { array_push($prefs, array('name'=>$pref['prefs.name'], 'value'=>$pref['user_prefs.value'])); } } $groups = array(); $aGroups = $this->GetGroups($a['username']); for ( $i=0; $i < count($aGroups); $i++) { array_push($groups, $aGroups[$i]['name']); } $user = new FusionUser($a['userid'], $a['username'], $a['email'], $prefs, $groups ); } } return $user; } function GetUserByName($username) { $user = FALSE; $result = $this->db->query('SELECT * FROM users where username = "'.$username.'";'); if ($result) { $a = $result->fetch(); $user = $this->GetUser($a['userid']); } return $user; } function GetUserByEmail($email) { $user = FALSE; $result = $this->db->query('SELECT * FROM users where email = "'.$email.'";'); if ($result) { $a = $result->fetch(); $user = $this->GetUser($a['userid']); } return $user; } function GetUserByKey($key) { $user = FALSE; $result = $this->db->query('SELECT * FROM users where resetkey = "'.$key.'";'); if ($result) { $a = $result->fetch(); $user = $this->GetUser($a['userid']); } return $user; } function ResetPassword($id) { $uuid = uuid(); $this->db->query('UPDATE users SET resetkey = "'.$uuid.'" where userid = '.$id); return $uuid; } function SetPassword($id, $password) { $encryptedPassword = crypt($password, SALT); $success = $this->db->queryExec('UPDATE users SET password = "'.$encryptedPassword.'", resetkey = "" where userid = '.$id); $user = $this->GetUser($id); if ($success) { $adminUser = new MgUserInformation(MG_ADMIN_USER, MG_ADMIN_PASSWD); $siteConnection = new MgSiteConnection(); $siteConnection->Open($adminUser); $site = $siteConnection->GetSite(); $site->UpdateUser( $user->userName(), "", $user->userName(), $password, "" ); } else { echo "/* failed to update user password */"; } return $success; } } class FusionUser { private $username = ''; private $id = -1; private $email = ''; private $preferences = array(); function __construct($id, $username, $email, $preferences, $groups) { $this->id = $id; $this->username = $username; $this->email = $email; $this->preferences = $preferences; $this->groups = $groups; } function userName() { return $this->username; } function id() { return $this->id; } function email() { return $this->email; } function preferences() { return $this->preferences; } function toXML() { $result = ''; $result .= "\n"; $result .= "".$this->userName()."\n"; $result .= "".$this->id()."\n"; $result .= "".$this->email()."\n"; $result .= "\n"; foreach($this->preferences() as $pref) { $result .= "\n"; $result .= "".$pref['name']."\n"; $result .= "".$pref['value']."\n"; $result .= "\n"; } $result .= "\n"; $result .= "\n"; foreach($this->groups as $group) { $result .= "$group\n"; } $result .= "\n"; $result .= "\n"; return $result; } } function Test() { $manager = new MGUserManager(NULL); $prefId = $manager->AddPref('map', 'Sheboygan'); $prefId2 = $manager->AddPref('color', 'Blue'); $userId = $manager->AddUser('bob', 'foo', 'Bob', 'Loblaws'); if (!$userId) { echo "User could not be created"; exit; } $manager->AddUserPref($userId, $prefId, 'MyMap'); $manager->AddUserPref($userId, $prefId2, 'Red'); $manager->SetUserPref($userId, $prefId, 'MyMapModified'); echo $manager->Login('bob', 'foo'); $manager->DeleteUser($userId, 'bob'); } function uuid() { // version 4 UUID return sprintf( '%08x-%04x-%04x-%02x%02x-%012x', mt_rand(), mt_rand(0, 65535), bindec(substr_replace( sprintf('%016b', mt_rand(0, 65535)), '0100', 11, 4) ), bindec(substr_replace(sprintf('%08b', mt_rand(0, 255)), '01', 5, 2)), mt_rand(0, 255), mt_rand() ); } ?>