|
From: <gem...@li...> - 2011-11-24 17:17:45
|
Revision: 284
http://gemstracker.svn.sourceforge.net/gemstracker/?rev=284&view=rev
Author: matijsdejong
Date: 2011-11-24 17:17:39 +0000 (Thu, 24 Nov 2011)
Log Message:
-----------
Users can now login as any organization they are allowed to access.
Oodles of small bugs, e.g. gor_accessible_by implemented in wrong way
Modified Paths:
--------------
trunk/library/classes/Gems/User/OldStaffUserDefinition.php
trunk/library/classes/Gems/User/Organization.php
trunk/library/classes/Gems/User/StaffUserDefinition.php
trunk/library/classes/Gems/User/User.php
trunk/library/classes/Gems/User/UserLoader.php
trunk/library/snippets/Organization/OrganizationTableSnippet.php
Modified: trunk/library/classes/Gems/User/OldStaffUserDefinition.php
===================================================================
--- trunk/library/classes/Gems/User/OldStaffUserDefinition.php 2011-11-24 15:35:11 UTC (rev 283)
+++ trunk/library/classes/Gems/User/OldStaffUserDefinition.php 2011-11-24 17:17:39 UTC (rev 284)
@@ -148,7 +148,7 @@
// For a multi-layout project we need to select the appropriate style too,
// but as PATCHES may not be in effect we have to try two selects
$select2 = clone $select;
- $select2->columns(array('user_style' => 'gor_style', 'user_allowed_ip_ranges' => 'ggp_allowed_ip_ranges', 'accessible_by' => 'gor_accessible_by'), 'gems__organizations');
+ $select2->columns(array('user_allowed_ip_ranges' => 'ggp_allowed_ip_ranges'), 'gems__groups');
try {
// Fails before patch has run...
@@ -184,7 +184,6 @@
->columns(array('user_name'=>"(concat(coalesce(concat(`gems__staff`.`gsf_first_name`,_utf8' '),_utf8''),coalesce(concat(`gems__staff`.`gsf_surname_prefix`,_utf8' '),_utf8''),coalesce(`gems__staff`.`gsf_last_name`,_utf8'')))"))
->join('gems__groups', 'gsf_id_primary_group = ggp_id_group', array('user_role'=>'ggp_role'))
->where('ggp_group_active = 1')
- ->where('gor_active = 1')
->where('gsf_active = 1')
->where('gsf_login = ?')
->limit(1);
Modified: trunk/library/classes/Gems/User/Organization.php
===================================================================
--- trunk/library/classes/Gems/User/Organization.php 2011-11-24 15:35:11 UTC (rev 283)
+++ trunk/library/classes/Gems/User/Organization.php 2011-11-24 17:17:39 UTC (rev 284)
@@ -32,7 +32,7 @@
* @author Matijs de Jong <mj...@ma...>
* @copyright Copyright (c) 2011 Erasmus MC
* @license New BSD License
- * @version $Id: Sample.php 203 2011-07-07 12:51:32Z matijs $
+ * @version $id: Organization.php 203 2011-07-07 12:51:32Z matijs $
*/
/**
@@ -57,12 +57,21 @@
'gor_id_organization' => 1,
'gor_name' => 'NO ORGANIZATION',
'gor_code' => null,
+ 'gor_location' => null,
+ 'gor_url' => null,
+ 'gor_task' => null,
+ 'gor_accessible_by' => null,
+ 'gor_contact_name' => null,
+ 'gor_contact_email' => null,
+ 'gor_welcome' => null,
+ 'gor_signature' => null,
'gor_style' => null,
'gor_iso_lang' => 'en',
+ 'gor_has_respondents' => 0,
+ 'gor_add_respondents' => 0,
'gor_active' => 0,
- 'gor_has_respondents' => false,
- 'gor_add_respondents' => false
- );
+ 'can_access' => array(),
+ );
/**
*
@@ -173,21 +182,46 @@
}
if (! $this->_organizationData) {
- $this->_organizationData = $this->db->fetchRow('SELECT * FROM gems__organizations WHERE gor_id_organization = ? LIMIT 1', $this->_organizationId);
+ $sql = "SELECT * FROM gems__organizations WHERE gor_id_organization = ? LIMIT 1";
+ $this->_organizationData = $this->db->fetchRow($sql, $this->_organizationId);
if (! $this->_organizationData) {
$this->_organizationData = $this->_noOrganization;
+ } else {
+ $dbOrgId = $this->db->quote($this->_organizationId, Zend_Db::INT_TYPE);
+ $sql = "SELECT gor_id_organization, gor_name
+ FROM gems__organizations
+ WHERE gor_active = 1 AND
+ (
+ gor_id_organization = $dbOrgId OR
+ gor_accessible_by LIKE '%:$dbOrgId:%'
+ )
+ ORDER BY gor_name";
+ $this->_organizationData['can_access'] = $this->db->fetchPairs($sql);
+
+ // MUtil_Echo::track($sql, $this->_organizationData['can_access']);
}
if ($cacheId) {
$this->cache->save($this->_organizationData, $cacheId);
}
}
+ // MUtil_Echo::track($this->_organizationData);
return is_array($this->_organizationData) && parent::checkRegistryRequestsAnswers();
}
/**
+ * Get the organizations this organizations can access.
+ *
+ * @return array Of type orgId => orgName
+ */
+ public function getAllowedOrganizations()
+ {
+ return $this->_organizationData['can_access'];
+ }
+
+ /**
* Get the code attribute.
*
* @return string
Modified: trunk/library/classes/Gems/User/StaffUserDefinition.php
===================================================================
--- trunk/library/classes/Gems/User/StaffUserDefinition.php 2011-11-24 15:35:11 UTC (rev 283)
+++ trunk/library/classes/Gems/User/StaffUserDefinition.php 2011-11-24 17:17:39 UTC (rev 284)
@@ -192,16 +192,9 @@
'user_base_org_id' => 'gsf_id_organization'))
->columns(array('user_name'=>"(concat(coalesce(concat(`gems__staff`.`gsf_first_name`,_utf8' '),_utf8''),coalesce(concat(`gems__staff`.`gsf_surname_prefix`,_utf8' '),_utf8''),coalesce(`gems__staff`.`gsf_last_name`,_utf8'')))"))
->join('gems__groups', 'gsf_id_primary_group = ggp_id_group', array('user_role'=>'ggp_role', 'user_allowed_ip_ranges' => 'ggp_allowed_ip_ranges'))
- ->join('gems__organizations', 'gul_id_organization = gor_id_organization',
- array(
- 'user_organization_id' => 'gor_id_organization',
- 'user_organization_name' => 'gor_name',
- 'user_style' => 'gor_style',
- 'accessible_by' => 'gor_accessible_by'))
->joinLeft('gems__user_passwords', 'gul_id_user = gup_id_user',
array('user_password_reset' => 'gup_reset_required'))
->where('ggp_group_active = 1')
- ->where('gor_active = 1')
->where('gsf_active = 1')
->where('gul_can_login = 1')
->where('gul_login = ?')
Modified: trunk/library/classes/Gems/User/User.php
===================================================================
--- trunk/library/classes/Gems/User/User.php 2011-11-24 15:35:11 UTC (rev 283)
+++ trunk/library/classes/Gems/User/User.php 2011-11-24 17:17:39 UTC (rev 284)
@@ -230,6 +230,7 @@
$auth = Gems_Auth::getInstance();
$formValues['allowed_ip_ranges'] = $this->getAllowedIPRanges();
+ $formValues['organization'] = $this->getBaseOrganizationId();
$adapter = $this->definition->getAuthAdapter($formValues);
$authResult = $auth->authenticate($adapter, $formValues);
@@ -305,11 +306,6 @@
}
}
- if (! $this->_hasVar('__allowedOrgs')) {
- // Is always requested so no win in waiting.
- $this->refreshAllowedOrganizations();
- }
-
return (boolean) $this->acl && $this->basepath && $this->userLoader;
}
@@ -330,10 +326,25 @@
*/
public function getAllowedOrganizations()
{
+
+ if (! $this->_hasVar('__allowedOrgs')) {
+ $this->refreshAllowedOrganizations();
+ }
+
return $this->_getVar('__allowedOrgs');
}
/**
+ * Returns the original (not the current) organization used by this user.
+ *
+ * @return Gems_User_Organization
+ */
+ public function getBaseOrganization()
+ {
+ return $this->userLoader->getOrganization($this->getBaseOrganizationId());
+ }
+
+ /**
* Returns the original (not the current) organization id of this user.
*
* @return int
@@ -605,33 +616,14 @@
*/
public function refreshAllowedOrganizations()
{
- $sql = "SELECT gor_id_organization, gor_name FROM gems__organizations WHERE ";
-
// Privilege overrules organizational settings
- if (! $this->hasPrivilege('pr.organization-switch')) {
- if ($by = $this->_getVar('accessible_by')) {
- $orgs = explode(':', trim($by, ':'));
-
- if ($orgs) {
- // Not to forget: the users own organization
- $orgs[] = $this->getBaseOrganizationId();
-
- $sql .= "gor_id_organization IN (";
- $sql .= implode(', ', $orgs);
- $sql .= ") AND ";
- } else {
- $sql = false;
- }
- } else {
- $sql = false;
- }
- }
- if ($sql) {
- $sql .= " gor_active = 1 ORDER BY gor_name";
- $orgs = $this->db->fetchPairs($sql);
+ if ($this->hasPrivilege('pr.organization-switch')) {
+ $orgs = $this->db->fetchPairs("SELECT gor_id_organization, gor_name FROM gems__organizations WHERE gor_active = 1 ORDER BY gor_name");
} else {
- $orgs = array();
+ $orgs = $this->getBaseOrganization()->getAllowedOrganizations();
}
+ natsort($orgs);
+ // MUtil_Echo::track($orgs);
$this->_setVar('__allowedOrgs', $orgs);
Modified: trunk/library/classes/Gems/User/UserLoader.php
===================================================================
--- trunk/library/classes/Gems/User/UserLoader.php 2011-11-24 15:35:11 UTC (rev 283)
+++ trunk/library/classes/Gems/User/UserLoader.php 2011-11-24 17:17:39 UTC (rev 284)
@@ -126,16 +126,6 @@
}
/**
- * Get an array of OrgId => Org Name for all allowed organizations for the current loggedin user
- *
- * @return array
- */
- public function getAllowedOrganizations()
- {
- return $this->db->fetchPairs("SELECT gor_id_organization, gor_name FROM gems__organizations WHERE gor_active = 1 ORDER BY gor_name");
- }
-
- /**
* Get the currently loggin in user
*
* @return Gems_User_User
@@ -194,14 +184,15 @@
* @param int $organization
* @return Gems_User_User But ! ->isActive when the user does not exist
*/
- public function getUser($login_name, $organization)
+ public function getUser($login_name, $currentOrganization)
{
- $defName = $this->getUserClassName($login_name, $organization);
+ list($defName, $userOrganization) = $this->getUserClassInfo($login_name, $currentOrganization);
+ // MUtil_Echo::track($defName, $userOrganization);
$definition = $this->_getClass($defName);
- $values = $definition->getUserData($login_name, $organization);
- // MUtil_Echo::track($defName, $login_name, $organization, $values);
+ $values = $definition->getUserData($login_name, $userOrganization);
+ // MUtil_Echo::track($defName, $login_name, $userOrganization, $values);
if (! isset($values['user_active'])) {
$values['user_active'] = true;
@@ -211,7 +202,7 @@
$user = $this->_loadClass('User', true, array($values, $definition));
- $user->setCurrentOrganization($organization);
+ $user->setCurrentOrganization($currentOrganization);
return $user;
}
@@ -239,29 +230,64 @@
*
* @param string $login_name
* @param int $organization
- * @return string
+ * @return array Containing definitionName, organizationId
*/
- protected function getUserClassName($login_name, $organization)
+ protected function getUserClassInfo($login_name, $organization)
{
if ((null == $login_name) || (null == $organization)) {
- return 'NoLoginDefinition';
+ return array('NoLoginDefinition', $organization);
}
if ($this->isProjectUser($login_name)) {
- return 'ProjectUserDefinition';
+ return array('ProjectUserDefinition', $organization);
}
try {
- $sql = "SELECT gul_user_class FROM gems__user_logins WHERE gul_can_login = 1 AND gul_login = ? AND gul_id_organization = ?";
- if ($class = $this->db->fetchOne($sql, array($login_name, $organization))) {
- return $class . 'Definition';
+ $sql = "SELECT CONCAT(gul_user_class, 'Definition'), gul_id_organization
+ FROM gems__user_logins INNER JOIN gems__organizations ON gor_id_organization = gul_id_organization
+ WHERE gor_active = 1 AND
+ gul_can_login = 1 AND
+ gul_login = ? AND
+ gul_id_organization = ?
+ LIMIT 1";
+
+ $params[] = $login_name;
+ $params[] = $organization;
+ // MUtil_Echo::track($sql, $params);
+
+ $row = $this->db->fetchRow($sql, $params, Zend_Db::FETCH_NUM);
+
+ if (! $row) {
+ // Try to get see if this is another allowed organization for this user
+ $sql = "SELECT CONCAT(gul_user_class, 'Definition'), gul_id_organization
+ FROM gems__user_logins INNER JOIN gems__organizations ON gor_id_organization != gul_id_organization
+ WHERE gor_active = 1 AND
+ gul_can_login = 1 AND
+ gul_login = ? AND
+ gor_id_organization = ? AND
+ gor_accessible_by LIKE CONCAT('%:', gul_id_organization, ':%')
+ LIMIT 1";
+
+ // MUtil_Echo::track($sql, $params);
+
+ $row = $this->db->fetchRow($sql, $params, Zend_Db::FETCH_NUM);
}
+ if ($row) {
+ // MUtil_Echo::track($row);
+ return $row;
+ }
+
} catch (Zend_Db_Exception $e) {
// Intentional fall through
}
// Fail over for pre 1.5 projects
- $sql = "SELECT gsf_id_user FROM gems__staff WHERE gsf_active = 1 AND gsf_login = ? AND gsf_id_organization = ?";
+ //
+ // No login as other organization for first login
+ $sql = "SELECT gsf_id_user
+ FROM gems__staff INNER JOIN
+ gems__organizations ON gsf_id_organization = gor_id_organization
+ WHERE gor_active = 1 AND gsf_active = 1 AND gsf_login = ? AND gsf_id_organization = ?";
if ($user_id = $this->db->fetchOne($sql, array($login_name, $organization))) {
// Move user to new staff.
@@ -281,10 +307,10 @@
// MUtil_Echo::r($e);
}
- return self::USER_OLD_STAFF . 'Definition';
+ return array(self::USER_OLD_STAFF . 'Definition', $organization);
}
- return 'NoLoginDefinition';
+ return array('NoLoginDefinition', $organization);
}
protected function isProjectUser($login_name)
Modified: trunk/library/snippets/Organization/OrganizationTableSnippet.php
===================================================================
--- trunk/library/snippets/Organization/OrganizationTableSnippet.php 2011-11-24 15:35:11 UTC (rev 283)
+++ trunk/library/snippets/Organization/OrganizationTableSnippet.php 2011-11-24 17:17:39 UTC (rev 284)
@@ -92,7 +92,7 @@
$bridge->addMultiSort($orgName, $BR, 'gor_task', $BR, 'gor_location');
$bridge->addMultiSort($mailName, $BR, 'gor_style', $BR, 'gor_iso_lang');
$bridge->addMultiSort('gor_active', $BR, 'gor_add_respondents', $BR, 'gor_has_respondents');
- // $bridge->add('gor_accessible_by');
+ $bridge->add('gor_accessible_by');
if ($editMenuItem = $this->getEditMenuItem()) {
$bridge->addItemLink($editMenuItem->toActionLinkLower($this->request, $bridge));
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|