X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fuser.php;h=4d4a28aedba438315a95f9cc546af6b4cfab32d8;hb=20b087ff2e4bb918f601a9bcc2c67d1fbc5b2231;hp=0f4286794675a4e6cc8f00dade2513e553004462;hpb=ed92ea696e042eb9b2d0efcc4731fdf89fb17924;p=platal.git diff --git a/classes/user.php b/classes/user.php index 0f42867..4d4a28a 100644 --- a/classes/user.php +++ b/classes/user.php @@ -21,6 +21,15 @@ class User extends PlUser { + const PERM_GROUPS = 'groups'; + const PERM_MAIL = 'mail'; + const PERM_DIRECTORY_AX = 'directory_ax'; + const PERM_DIRECTORY_PRIVATE = 'directory_private'; + const PERM_EDIT_DIRECTORY = 'edit_directory'; + const PERM_FORUMS = 'forums'; + const PERM_LISTS = 'lists'; + const PERM_PAYMENT = 'payment'; + private $_profile_fetched = false; private $_profile = null; @@ -37,7 +46,7 @@ class User extends PlUser } if ($login instanceof User) { - $machin->id(); + return $login->id(); } if ($login instanceof Profile) { @@ -185,7 +194,7 @@ class User extends PlUser IF (ab.alias IS NULL, NULL, CONCAT(ab.alias, \'@' . $globals->mail->domain2 . '\')) AS bestalias_alternate, a.email, a.full_name, a.directory_name, a.display_name, a.sex = \'female\' AS gender, IF(a.state = \'active\', CONCAT(at.perms, \',\', IF(a.user_perms IS NULL, \'\', a.user_perms)), \'\') AS perms, - a.user_perms, a.email_format, a.is_admin, a.state, a.type, a.skin, + a.user_perms, a.email_format, a.is_admin, a.state, a.type, at.description AS type_description, a.skin, FIND_IN_SET(\'watch\', a.flags) AS watch, a.comment, a.weak_password IS NOT NULL AS weak_access, g.g_account_name IS NOT NULL AS googleapps, a.token IS NOT NULL AS token_access, a.token, a.last_version, @@ -235,6 +244,12 @@ class User extends PlUser $this->perm_flags = self::makePerms($this->perms, $this->is_admin); } + public function setPerms($perms) + { + $this->perms = $perms; + $this->perm_flags = null; + } + // We do not want to store the password in the object. // So, fetch it 'on demand' public function password() @@ -260,6 +275,16 @@ class User extends PlUser return $this->profile()->promo(); } + public function category() + { + $promo = $this->promo(); + if (!empty($promo)) { + return $promo; + } else { + return $this->type_description; + } + } + public function firstName() { if (!$this->hasProfile()) { @@ -318,12 +343,26 @@ class User extends PlUser return !is_null($this->profile()); } + /** Return true if given a reference to the profile of this user. + */ + public function isMyProfile($other) + { + if (!$other) { + return false; + } else if ($other instanceof Profile) { + $profile = $this->profile(); + return $profile && $profile->id() == $other->id(); + } + return false; + } + /** Check if the user can edit to given profile. */ public function canEdit(Profile $profile) { - // XXX: Check permissions (e.g. secretary permission) - // and flags from the profile + if ($this->checkPerms(User::PERM_EDIT_DIRECTORY)) { + return true; + } return XDB::fetchOneCell('SELECT pid FROM account_profiles WHERE uid = {?} AND pid = {?}', @@ -561,29 +600,36 @@ class User extends PlUser // Groupes X private $groups = null; - public function groups() + public function groups($institutions = false, $onlyPublic = false) { if (is_null($this->groups)) { - $this->groups = XDB::fetchAllAssoc('asso_id', 'SELECT asso_id, perms, comm - FROM group_members + $this->groups = XDB::fetchAllAssoc('asso_id', 'SELECT gm.asso_id, gm.perms, gm.comm, + g.diminutif, g.nom, g.site, g.cat, + g.pub + FROM group_members AS gm + INNER JOIN groups AS g ON (g.id = gm.asso_id) WHERE uid = {?}', $this->id()); } - return $this->groups; - } - - public function groupNames($institutions = false) - { - if ($institutions) { - $where = ' AND (g.cat = \'GroupesX\' OR g.cat = \'Institutions\')'; + if (!$institutions && !$onlyPublic) { + return $this->groups; } else { - $where = ''; + $result = array(); + foreach ($this->groups as $id=>$data) { + if ($institutions) { + if ($data['cat'] != Group::CAT_GROUPESX && $data['cat'] != Group::CAT_INSTITUTIONS) { + continue; + } + } + if ($onlyPublic) { + if ($data['pub'] != 'public') { + continue; + } + } + $result[$id] = $data; + } + return $result; } - return XDB::fetchAllAssoc('SELECT g.diminutif, g.nom, g.site - FROM group_members AS gm - LEFT JOIN groups AS g ON (g.id = gm.asso_id) - WHERE gm.uid = {?}' . $where, - $this->id()); } /** @@ -618,13 +664,15 @@ class User extends PlUser } if ($clearAll) { + global $globals; + $groupIds = XDB::iterator('SELECT asso_id FROM group_members WHERE uid = {?}', $this->id()); while ($groupId = $groupIds->next()) { $group = Group::get($groupId); - if ($group->notif_unsub) { + if (!empty($group) && $group->notif_unsub) { $mailer = new PlMailer('xnetgrp/unsubscription-notif.mail.tpl'); $admins = $group->iterAdmins(); while ($admin = $admins->next()) { @@ -637,17 +685,22 @@ class User extends PlUser } } - $tables = array('account_auth_openid', 'gannounce_read', 'contacts', - 'email_options', 'gemail_send_save', 'emails', - 'forum_innd', 'gforum_profiles', 'forum_subs', - 'gapps_accounts', 'ggapps_nicknames', 'group_announces_read', - 'group_members', 'ggroup_member_sub_requests', 'reminder', 'requests', + $tables = array('account_auth_openid', 'announce_read', 'contacts', + 'email_options', 'email_send_save', 'emails', + 'forum_innd', 'forum_profiles', 'forum_subs', + 'group_announces_read', 'group_members', + 'group_member_sub_requests', 'reminder', 'requests', 'requests_hidden'); - foreach ($tables as $t) { XDB::execute('DELETE FROM ' . $t . ' WHERE uid = {?}', - $this->id()); + $this->id()); + } + + foreach (array('gapps_accounts', 'gapps_nicknames') as $t) { + XDB::execute('DELETE FROM ' . $t . ' + WHERE l_userid = {?}', + $this->id()); } XDB::execute("UPDATE accounts @@ -668,8 +721,8 @@ class User extends PlUser if ($globals->mailstorage->googleapps_domain) { require_once 'googleapps.inc.php'; - if (GoogleAppsAccount::account_status($uid)) { - $account = new GoogleAppsAccount($user); + if (GoogleAppsAccount::account_status($this->id())) { + $account = new GoogleAppsAccount($this); $account->suspend(); } } @@ -732,16 +785,12 @@ class User extends PlUser } // Updates user in following tables. - foreach (array('group_announces', 'payment_transactions', 'log_sessions') as $table) { + foreach (array('group_announces', 'payment_transactions', 'log_sessions', 'group_events') as $table) { XDB::execute('UPDATE ' . $table . ' SET uid = {?} WHERE uid = {?}', $newuser->id(), $this->id()); } - XDB::execute('UPDATE group_events - SET organisateur_uid = {?} - WHERE organisateur_uid = {?}', - $newuser->id(), $this->id()); // Merges user in following tables, ie updates when possible, then deletes remaining occurences of the old user. foreach (array('group_announces_read', 'group_event_participants', 'group_member_sub_requests', 'group_members') as $table) {