/**
* Performs the action; returns true on success, false on error.
*
* @param $p_context - the current context object
* @return bool
*/
public function takeAction(CampContext &$p_context)
{
$p_context->default_url->reset_parameter('f_'.$this->m_name);
$p_context->url->reset_parameter('f_'.$this->m_name);
if (PEAR::isError($this->m_error)) {
return false;
}
$metaUser = $p_context->user;
if (!$metaUser->defined) {
$this->m_properties['type'] = 'add';
if (!MetaAction::ValidateInput($this->m_properties, 'name', 1,
$this->m_error, 'The user name was not filled in.', ACTION_EDIT_USER_ERR_NO_NAME)) {
return false;
}
if (!MetaAction::ValidateInput($this->m_properties, 'uname', 1,
$this->m_error, 'The user login name was not filled in.',
ACTION_EDIT_USER_ERR_NO_USER_NAME)) {
return false;
}
if (!MetaAction::ValidateInput($this->m_properties, 'password', 6,
$this->m_error, 'The user password was not filled in or was too short.',
ACTION_EDIT_USER_ERR_NO_PASSWORD)) {
return false;
}
if (!MetaAction::ValidateInput($this->m_properties, 'passwordagain', 6,
$this->m_error, 'The password confirmation was not filled in or was too short.',
ACTION_EDIT_USER_ERR_NO_PASSWORD_CONFIRMATION)) {
return false;
}
if (!MetaAction::ValidateInput($this->m_properties, 'email', 8,
$this->m_error, 'The user email was not filled in or was invalid.',
ACTION_EDIT_USER_ERR_NO_EMAIL)) {
return false;
}
if (SystemPref::Get('PLUGIN_RECAPTCHA_SUBSCRIPTIONS_ENABLED') == 'Y') {
$captcha = Captcha::factory('ReCAPTCHA');
if (!$captcha->validate()) {
$this->m_error = new PEAR_Error('The code you entered is not the same as the one shown.',
ACTION_SUBMIT_COMMENT_ERR_INVALID_CAPTCHA_CODE);
return false;
}
}
} else {
$this->m_properties['type'] = 'edit';
if (isset($this->m_properties['password'])) {
if (!MetaAction::ValidateInput($this->m_properties, 'password', 6,
$this->m_error, 'The user password was not filled in or was too short.',
ACTION_EDIT_USER_ERR_NO_PASSWORD)) {
return false;
}
if (!MetaAction::ValidateInput($this->m_properties, 'passwordagain', 6,
$this->m_error, 'The password confirmation was not filled in or was too short.',
ACTION_EDIT_USER_ERR_NO_PASSWORD_CONFIRMATION)) {
return false;
}
}
}
if (isset($this->m_properties['password'])
&& $this->m_properties['password'] != $this->m_properties['passwordagain']) {
$this->m_error = new PEAR_Error("The password and password confirmation do not match.",
ACTION_EDIT_USER_ERR_PASSWORD_MISMATCH);
return false;
}
if (!$metaUser->defined) {
if (User::UserNameExists($this->m_properties['uname'])
|| Phorum_user::UserNameExists($this->m_properties['uname'])) {
$this->m_error = new PEAR_Error("The login name already exists, please choose a different one.",
ACTION_EDIT_USER_ERR_DUPLICATE_USER_NAME);
return false;
}
if (User::EmailExists($this->m_properties['email'])) {
$this->m_error = new PEAR_Error("Another user is registered with this e-mail address, please choose a different one.",
ACTION_EDIT_USER_ERR_DUPLICATE_EMAIL);
return false;
}
$user = new User();
$phorumUser = new Phorum_user();
if (!$user->create($this->m_data)
|| !$phorumUser->create($this->m_properties['uname'], $this->m_properties['password'], $this->m_properties['email'], $user->getUserId())) {
$user->delete();
$phorumUser->delete();
$this->m_error = new PEAR_Error("There was an internal error creating the account (code 1).",
ACTION_EDIT_USER_ERR_INTERNAL);
return false;
}
setcookie("LoginUserId", $user->getUserId(), null, '/');
$user->initLoginKey();
setcookie("LoginUserKey", $user->getKeyId(), null, '/');
$p_context->user = new MetaUser($user->getUserId());
} else {
$user = new User($metaUser->identifier);
if (!$user->exists()) {
$this->m_error = new PEAR_Error("There was an internal error updating the account (code 2).",
ACTION_EDIT_USER_ERR_INTERNAL);
return false;
}
$phorumUser = Phorum_user::GetByUserName($user->getUserName());
if (is_null($phorumUser)) {
$phorumUser = new Phorum_user();
if (!$phorumUser->create($user->getUserName(), $user->getPassword(), $user->getEmail(), $user->getUserId(), true)) {
$this->m_error = new PEAR_Error("There was an internal error updating the account (code 3).",
ACTION_EDIT_USER_ERR_INTERNAL);
return false;
}
}
foreach ($this->m_properties as $property=>$value) {
if (!isset(MetaActionEdit_User::$m_fields[$property]['db_field'])) {
continue;
}
$dbProperty = MetaActionEdit_User::$m_fields[$property]['db_field'];
if ($property != 'password' && $property != 'passwordagain') {
$user->setProperty($dbProperty, $value, false);
if ($property == 'email') {
$phorumUser->setProperty('email', $value, false);
}
} elseif ($property == 'password') {
$user->setPassword($this->m_properties['password'], false);
$phorumUser->setPassword($this->m_properties['password'], false);
}
}
if (!$user->commit() || !$phorumUser->commit()) {
$this->m_error = new PEAR_Error("There was an internal error updating the account (code 4).",
ACTION_EDIT_USER_ERR_INTERNAL);
return false;
}
}
foreach ($this->m_properties as $property=>$value) {
$p_context->default_url->reset_parameter('f_user_'.$property);
$p_context->url->reset_parameter('f_user_'.$property);
}
$this->m_error = ACTION_OK;
return true;
}