#140 Check that user logins are unique

SVN:trunk[796]
This commit is contained in:
Romain Quetiez
2010-09-08 08:11:46 +00:00
parent 39e943c20a
commit 32b337b9a8
6 changed files with 209 additions and 124 deletions

View File

@@ -110,6 +110,27 @@ abstract class User extends cmdbAbstractObject
abstract public function CanChangePassword();
abstract public function ChangePassword($sOldPassword, $sNewPassword);
/*
* Overload the standard behavior
*/
public function DoCheckToWrite()
{
parent::DoCheckToWrite();
// Note: This MUST be factorized later: declare unique keys (set of columns) in the data model
$aChanges = $this->ListChanges();
if (array_key_exists('login', $aChanges))
{
$sNewLogin = $aChanges['login'];
$oSearch = DBObjectSearch::FromOQL_AllData("SELECT User WHERE login = :newlogin");
$oSet = new DBObjectSet($oSearch, array(), array('newlogin' => $sNewLogin));
if ($oSet->Count() > 0)
{
$this->m_aCheckIssues[] = Dict::Format('Class:User/Error:LoginMustBeUnique', $sNewLogin);
}
}
}
function GetGrantAsHtml($sClass, $iAction)
{
if (UserRights::IsActionAllowed($sClass, $iAction, null, $this))

View File

@@ -108,6 +108,8 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:User/Attribute:profile_list+' => 'Roles, granting rights for that person',
'Class:User/Attribute:allowed_org_list' => 'Allowed Organizations',
'Class:User/Attribute:allowed_org_list+' => 'The end user is allowed to see data belonging to the following organizations. If no organization is specified, there is no restriction.',
'Class:User/Error:LoginMustBeUnique' => 'Login must be unique - "%1s" is already being used.',
));
//
@@ -648,6 +650,7 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:PageTitle:ObjectCreated' => 'iTop Object Created.',
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s created.',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Applying %1$s on object: %2$s in state %3$s to target state: %4$s.',
'UI:ObjectCouldNotBeWritten' => 'The object could not be written: %1$s',
'UI:PageTitle:FatalError' => 'iTop - Fatal Error',
'UI:FatalErrorMessage' => 'Fatal error, iTop cannot continue.',
'UI:Error_Details' => 'Error: %1$s.',

View File

@@ -658,6 +658,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'UI:PageTitle:ObjectCreated' => 'iTop Object Created.',
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s created.',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Applying %1$s on object: %2$s in state %3$s to target state: %4$s.',
'UI:ObjectCouldNotBeWritten' => 'The object could not be written: %1$s',
'UI:PageTitle:FatalError' => 'iTop - Fatal Error',
'UI:FatalErrorMessage' => 'Fatal error, iTop cannot continue.',
'UI:Error_Details' => 'Error: %1$s.',

View File

@@ -108,6 +108,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:User/Attribute:profile_list+' => 'Rôles, ouvrants les droits d\'accès',
'Class:User/Attribute:allowed_org_list' => 'Organisations permises',
'Class:User/Attribute:allowed_org_list+' => 'L\'utilisateur a le droit de voir les données des organisations listées ici. Si aucune organisation n\'est spécifiée, alors aucune restriction ne s\'applique.',
'Class:User/Error:LoginMustBeUnique' => 'Le login doit être unique - "%1s" est déjà utilisé.',
));
//
@@ -651,6 +653,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:PageTitle:ObjectCreated' => 'iTop objet créé.',
'UI:Title:Object_Of_Class_Created' => '%2$s - %1$s créé(e).',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => '%1$s pour %2$s de l\'état %3$s vers l\'état %4$s.',
'UI:ObjectCouldNotBeWritten' => 'L\'objet ne peut pas être enregistré: %1$s',
'UI:PageTitle:FatalError' => 'iTop - Erreur Fatale',
'UI:FatalErrorMessage' => 'Erreur fatale, iTop ne peut pas continuer.',
'UI:Error_Details' => 'Erreur: %1$s.',

View File

@@ -48,95 +48,95 @@
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: KnownError
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:KnownError' => 'Erreur Connue',
'Class:KnownError+' => 'Erreur documenté pour un problème connu',
'Class:KnownError/Attribute:name' => 'Nom',
'Class:KnownError/Attribute:name+' => '',
'Class:KnownError/Attribute:org_id' => 'Client',
'Class:KnownError/Attribute:org_id+' => '',
'Class:KnownError/Attribute:cust_name' => 'Nom du client',
'Class:KnownError/Attribute:cust_name+' => '',
'Class:KnownError/Attribute:problem_id' => 'Problème lié',
'Class:KnownError/Attribute:problem_id+' => '',
'Class:KnownError/Attribute:problem_ref' => 'Ref',
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:KnownError/Attribute:symptom' => 'Symptome',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => 'Cause première',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => 'Contournement',
'Class:KnownError/Attribute:workaround+' => '',
'Class:KnownError/Attribute:solution' => 'Solution',
'Class:KnownError/Attribute:solution+' => '',
'Class:KnownError/Attribute:error_code' => 'Code d\'erreur',
'Class:KnownError/Attribute:error_code+' => '',
'Class:KnownError/Attribute:domain' => 'Domaine',
'Class:KnownError/Attribute:domain+' => '',
'Class:KnownError/Attribute:domain/Value:Application' => 'Application',
'Class:KnownError/Attribute:domain/Value:Application+' => 'Application',
'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Network' => 'Réseau',
'Class:KnownError/Attribute:domain/Value:Network+' => 'Réseau',
'Class:KnownError/Attribute:domain/Value:Server' => 'Serveur',
'Class:KnownError/Attribute:domain/Value:Server+' => 'Serveur',
'Class:KnownError/Attribute:vendor' => 'Vendeur',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => 'Modèle',
'Class:KnownError/Attribute:model+' => '',
'Class:KnownError/Attribute:version' => 'Version',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => 'CIs',
'Class:KnownError/Attribute:ci_list+' => '',
'Class:KnownError/Attribute:document_list' => 'Documents',
'Class:KnownError/Attribute:document_list+' => '',
));
//
// Class: lnkInfraError
//
Dict::Add('EN US', 'English', 'English', array(
'Class:lnkInfraError' => 'Lien erreur CI',
'Class:lnkInfraError+' => 'CIs liés à une erreur connue',
'Class:lnkInfraError/Attribute:infra_id' => 'CI',
'Class:lnkInfraError/Attribute:infra_id+' => '',
'Class:lnkInfraError/Attribute:infra_name' => 'Nom du CI',
'Class:lnkInfraError/Attribute:infra_name+' => '',
'Class:lnkInfraError/Attribute:infra_status' => 'Status du CI',
'Class:lnkInfraError/Attribute:infra_status+' => '',
'Class:lnkInfraError/Attribute:error_id' => 'Erreur',
'Class:lnkInfraError/Attribute:error_id+' => '',
'Class:lnkInfraError/Attribute:error_name' => 'Nom de l\'erreur',
'Class:lnkInfraError/Attribute:error_name+' => '',
'Class:lnkInfraError/Attribute:reason' => 'Raison',
'Class:lnkInfraError/Attribute:reason+' => '',
));
//
// Class: lnkDocumentError
//
Dict::Add('EN US', 'English', 'English', array(
'Class:lnkDocumentError' => 'Lien erreur document',
'Class:lnkDocumentError+' => 'Lien entre une erreur et un document',
'Class:lnkDocumentError/Attribute:doc_id' => 'Document',
'Class:lnkDocumentError/Attribute:doc_id+' => '',
'Class:lnkDocumentError/Attribute:doc_name' => 'Nom du document',
'Class:lnkDocumentError/Attribute:doc_name+' => '',
'Class:lnkDocumentError/Attribute:error_id' => 'Erreur',
'Class:lnkDocumentError/Attribute:error_id+' => '',
'Class:lnkDocumentError/Attribute:error_name' => 'Nom de l\'erreur',
'Class:lnkDocumentError/Attribute:error_name+' => '',
'Class:lnkDocumentError/Attribute:link_type' => 'Information',
'Class:lnkDocumentError/Attribute:link_type+' => '',
));
//
// Class: KnownError
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:KnownError' => 'Erreur Connue',
'Class:KnownError+' => 'Erreur documenté pour un problème connu',
'Class:KnownError/Attribute:name' => 'Nom',
'Class:KnownError/Attribute:name+' => '',
'Class:KnownError/Attribute:org_id' => 'Client',
'Class:KnownError/Attribute:org_id+' => '',
'Class:KnownError/Attribute:cust_name' => 'Nom du client',
'Class:KnownError/Attribute:cust_name+' => '',
'Class:KnownError/Attribute:problem_id' => 'Problème lié',
'Class:KnownError/Attribute:problem_id+' => '',
'Class:KnownError/Attribute:problem_ref' => 'Ref',
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:KnownError/Attribute:symptom' => 'Symptome',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => 'Cause première',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => 'Contournement',
'Class:KnownError/Attribute:workaround+' => '',
'Class:KnownError/Attribute:solution' => 'Solution',
'Class:KnownError/Attribute:solution+' => '',
'Class:KnownError/Attribute:error_code' => 'Code d\'erreur',
'Class:KnownError/Attribute:error_code+' => '',
'Class:KnownError/Attribute:domain' => 'Domaine',
'Class:KnownError/Attribute:domain+' => '',
'Class:KnownError/Attribute:domain/Value:Application' => 'Application',
'Class:KnownError/Attribute:domain/Value:Application+' => 'Application',
'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Network' => 'Réseau',
'Class:KnownError/Attribute:domain/Value:Network+' => 'Réseau',
'Class:KnownError/Attribute:domain/Value:Server' => 'Serveur',
'Class:KnownError/Attribute:domain/Value:Server+' => 'Serveur',
'Class:KnownError/Attribute:vendor' => 'Vendeur',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => 'Modèle',
'Class:KnownError/Attribute:model+' => '',
'Class:KnownError/Attribute:version' => 'Version',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => 'CIs',
'Class:KnownError/Attribute:ci_list+' => '',
'Class:KnownError/Attribute:document_list' => 'Documents',
'Class:KnownError/Attribute:document_list+' => '',
));
//
// Class: lnkInfraError
//
Dict::Add('FR FR', 'English', 'English', array(
'Class:lnkInfraError' => 'Lien erreur CI',
'Class:lnkInfraError+' => 'CIs liés à une erreur connue',
'Class:lnkInfraError/Attribute:infra_id' => 'CI',
'Class:lnkInfraError/Attribute:infra_id+' => '',
'Class:lnkInfraError/Attribute:infra_name' => 'Nom du CI',
'Class:lnkInfraError/Attribute:infra_name+' => '',
'Class:lnkInfraError/Attribute:infra_status' => 'Status du CI',
'Class:lnkInfraError/Attribute:infra_status+' => '',
'Class:lnkInfraError/Attribute:error_id' => 'Erreur',
'Class:lnkInfraError/Attribute:error_id+' => '',
'Class:lnkInfraError/Attribute:error_name' => 'Nom de l\'erreur',
'Class:lnkInfraError/Attribute:error_name+' => '',
'Class:lnkInfraError/Attribute:reason' => 'Raison',
'Class:lnkInfraError/Attribute:reason+' => '',
));
//
// Class: lnkDocumentError
//
Dict::Add('FR FR', 'English', 'English', array(
'Class:lnkDocumentError' => 'Lien erreur document',
'Class:lnkDocumentError+' => 'Lien entre une erreur et un document',
'Class:lnkDocumentError/Attribute:doc_id' => 'Document',
'Class:lnkDocumentError/Attribute:doc_id+' => '',
'Class:lnkDocumentError/Attribute:doc_name' => 'Nom du document',
'Class:lnkDocumentError/Attribute:doc_name+' => '',
'Class:lnkDocumentError/Attribute:error_id' => 'Erreur',
'Class:lnkDocumentError/Attribute:error_id+' => '',
'Class:lnkDocumentError/Attribute:error_name' => 'Nom de l\'erreur',
'Class:lnkDocumentError/Attribute:error_name+' => '',
'Class:lnkDocumentError/Attribute:link_type' => 'Information',
'Class:lnkDocumentError/Attribute:link_type+' => '',
));
?>

View File

@@ -484,7 +484,7 @@ try
{
throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'id'));
}
$oObj = MetaModel::GetObject($sClass, $id);
$oObj = MetaModel::GetObject($sClass, $id, false);
if ($oObj != null)
{
$oP->set_title(Dict::Format('UI:DetailsPageTitle', $oObj->GetName(), $sClassLabel));
@@ -694,6 +694,7 @@ try
$bIsModifiedAllowed = (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY, $oSet) == UR_ALLOWED_YES) && !MetaModel::IsReadOnlyClass($sClass);
if( ($oObj != null) && $bIsModifiedAllowed )
{
// Note: code duplicated to the case 'apply_modify' when a data integrity issue has been found
$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
$oP->add("<div class=\"page_header\">\n");
$oP->add("<h1>".$oObj->GetIcon()."&nbsp;".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
@@ -768,6 +769,7 @@ try
{
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'class'));
}
// Note: code duplicated to the case 'apply_modify' when a data integrity issue has been found
$oP->add_linked_script("../js/json.js");
$oP->add_linked_script("../js/forms-json-utils.js");
$oP->add_linked_script("../js/wizardhelper.js");
@@ -806,6 +808,7 @@ try
{
// Display the creation form
$sClassLabel = MetaModel::GetName($sRealClass);
// Note: some code has been duplicated to the case 'apply_new' when a data integrity issue has been found
$oP->set_title(Dict::Format('UI:CreationPageTitle_Class', $sClassLabel));
$oP->add("<h1>".MetaModel::GetClassIcon($sRealClass)."&nbsp;".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."</h1>\n");
$oP->add("<div class=\"wizContainer\">\n");
@@ -872,26 +875,36 @@ try
{
throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'id'));
}
$oObj = MetaModel::GetObject($sClass, $id);
if (!utils::IsTransactionValid($sTransactionId))
$bDisplayDetails = true;
$oObj = MetaModel::GetObject($sClass, $id, false);
if ($oObj == null)
{
$bDisplayDetails = false;
$oP->set_title(Dict::S('UI:ErrorPageTitle'));
$oP->P(Dict::S('UI:ObjectDoesNotExist'));
}
elseif (!utils::IsTransactionValid($sTransactionId))
{
$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
$oP->p("<strong>".Dict::S('UI:Error:ObjectAlreadyUpdated')."</strong>\n");
}
else
{
if ($oObj != null)
UpdateObject($oObj);
if (!$oObj->IsModified())
{
$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
$oP->add("<h1>".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
UpdateObject($oObj);
if (!$oObj->IsModified())
{
$oP->p(Dict::Format('UI:Class_Object_NotUpdated', MetaModel::GetName(get_class($oObj)), $oObj->GetName()));
}
else
$oP->p(Dict::Format('UI:Class_Object_NotUpdated', MetaModel::GetName(get_class($oObj)), $oObj->GetName()));
}
else
{
list($bRes, $aIssues) = $oObj->CheckToWrite();
if ($bRes)
{
$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
$oP->add("<h1>".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
$oMyChange = MetaModel::NewObject("CMDBChange");
$oMyChange->Set("date", time());
if (UserRights::IsImpersonated())
@@ -908,15 +921,35 @@ try
$oP->p(Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oObj)), $oObj->GetName()));
}
}
else
{
$oP->set_title(Dict::S('UI:ErrorPageTitle'));
$oP->P(Dict::S('UI:ObjectDoesNotExist'));
else
{
$bDisplayDetails = false;
// Found issues, explain and give the user a second chance
//
// Note: code duplicated from the case 'modify'
$oP->add_linked_script("../js/json.js");
$oP->add_linked_script("../js/forms-json-utils.js");
$oP->add_linked_script("../js/wizardhelper.js");
$oP->add_linked_script("../js/wizard.utils.js");
$oP->add_linked_script("../js/linkswidget.js");
$oP->add_linked_script("../js/jquery.blockUI.js");
$oP->set_title(Dict::Format('UI:ModificationPageTitle_Object_Class', $oObj->GetName(), $sClassLabel));
$oP->add("<div class=\"page_header\">\n");
$oP->add("<h1>".$oObj->GetIcon()."&nbsp;".Dict::Format('UI:ModificationTitle_Class_Object', $sClassLabel, $oObj->GetName())."</h1>\n");
$oP->add("</div>\n");
$oP->add("<div class=\"wizContainer\">\n");
$oObj->DisplayModifyForm($oP);
$oP->add("</div>\n");
$sIssueDesc = Dict::Format('UI:ObjectCouldNotBeWritten', implode(', ', $aIssues));
$oP->add_ready_script("alert('".addslashes($sIssueDesc)."');");
}
}
}
$oObj = MetaModel::GetObject(get_class($oObj), $oObj->GetKey()); //Workaround: reload the object some that the linkedset are displayed properly
$oObj->DisplayDetails($oP);
if ($bDisplayDetails)
{
$oObj = MetaModel::GetObject(get_class($oObj), $oObj->GetKey()); //Workaround: reload the object so that the linkedset are displayed properly
$oObj->DisplayDetails($oP);
}
break;
case 'select_for_deletion':
@@ -1037,22 +1070,46 @@ try
{
$sClass = get_class($oObj);
$sClassLabel = MetaModel::GetName($sClass);
$oMyChange = MetaModel::NewObject("CMDBChange");
$oMyChange->Set("date", time());
if (UserRights::IsImpersonated())
list($bRes, $aIssues) = $oObj->CheckToWrite();
if ($bRes)
{
$sUserString = Dict::Format('UI:Archive_User_OnBehalfOf_User', UserRights::GetRealUser(), UserRights::GetUser());
$oMyChange = MetaModel::NewObject("CMDBChange");
$oMyChange->Set("date", time());
if (UserRights::IsImpersonated())
{
$sUserString = Dict::Format('UI:Archive_User_OnBehalfOf_User', UserRights::GetRealUser(), UserRights::GetUser());
}
else
{
$sUserString = UserRights::GetUser();
}
$oMyChange->Set("userinfo", $sUserString);
$iChangeId = $oMyChange->DBInsert();
$oObj->DBInsertTracked($oMyChange);
$oP->set_title(Dict::S('UI:PageTitle:ObjectCreated'));
$oP->add("<h1>".Dict::Format('UI:Title:Object_Of_Class_Created', $oObj->GetName(), $sClassLabel)."</h1>\n");
$oObj->DisplayDetails($oP);
}
else
{
$sUserString = UserRights::GetUser();
// Found issues, explain and give the user a second chance
//
// Note: code similar to the case 'modify'
$oP->add_linked_script("../js/json.js");
$oP->add_linked_script("../js/forms-json-utils.js");
$oP->add_linked_script("../js/wizardhelper.js");
$oP->add_linked_script("../js/wizard.utils.js");
$oP->add_linked_script("../js/linkswidget.js");
$oP->add_linked_script("../js/jquery.blockUI.js");
$oP->set_title(Dict::Format('UI:CreationPageTitle_Class', $sClassLabel));
$oP->add("<h1>".MetaModel::GetClassIcon($sClass)."&nbsp;".Dict::Format('UI:CreationTitle_Class', $sClassLabel)."</h1>\n");
$oP->add("<div class=\"wizContainer\">\n");
cmdbAbstractObject::DisplayCreationForm($oP, $sClass, $oObj);
$oP->add("</div>\n");
$sIssueDesc = Dict::Format('UI:ObjectCouldNotBeWritten', implode(', ', $aIssues));
$oP->add_ready_script("alert('".addslashes($sIssueDesc)."');");
}
$oMyChange->Set("userinfo", $sUserString);
$iChangeId = $oMyChange->DBInsert();
$oObj->DBInsertTracked($oMyChange);
$oP->set_title(Dict::S('UI:PageTitle:ObjectCreated'));
$oP->add("<h1>".Dict::Format('UI:Title:Object_Of_Class_Created', $oObj->GetName(), $sClassLabel)."</h1>\n");
$oObj->DisplayDetails($oP);
}
break;
@@ -1099,7 +1156,7 @@ try
{
throw new ApplicationException(Dict::Format('UI:Error:3ParametersMissing', 'class', 'id', 'stimulus'));
}
$oObj = MetaModel::GetObject($sClass, $id);
$oObj = MetaModel::GetObject($sClass, $id, false);
if ($oObj != null)
{
$aTransitions = $oObj->EnumTransitions();
@@ -1191,7 +1248,7 @@ EOF
{
throw new ApplicationException(Dict::Format('UI:Error:3ParametersMissing', 'class', 'id', 'stimulus'));
}
$oObj = MetaModel::GetObject($sClass, $id);
$oObj = MetaModel::GetObject($sClass, $id, false);
if ($oObj != null)
{
$aTransitions = $oObj->EnumTransitions();