/** * Synchronizes the user based on a given UserKey. * * @param string $UserKey A string that uniquely identifies this user. * @param array $Data Information to put in the user table. * @return int The ID of the user. */ public function synchronize($UserKey, $Data) { $UserID = 0; $Attributes = val('Attributes', $Data); if (is_string($Attributes)) { $Attributes = dbdecode($Attributes); } if (!is_array($Attributes)) { $Attributes = []; } // If the user didnt log in, they won't have a UserID yet. That means they want a new // account. So create one for them. if (!isset($Data['UserID']) || $Data['UserID'] <= 0) { // Prepare the user data. $UserData = []; $UserData['Name'] = $Data['Name']; $UserData['Password'] = randomString(16); $UserData['Email'] = val('Email', $Data, '*****@*****.**'); $UserData['Gender'] = strtolower(substr(val('Gender', $Data, 'u'), 0, 1)); $UserData['HourOffset'] = val('HourOffset', $Data, 0); $UserData['DateOfBirth'] = val('DateOfBirth', $Data, ''); $UserData['CountNotifications'] = 0; $UserData['Attributes'] = $Attributes; $UserData['InsertIPAddress'] = ipEncode(Gdn::request()->ipAddress()); if ($UserData['DateOfBirth'] == '') { $UserData['DateOfBirth'] = '1975-09-16'; } // Make sure there isn't another user with this username. if ($this->validateUniqueFields($UserData['Name'], $UserData['Email'])) { if (!BanModel::checkUser($UserData, $this->Validation, true)) { throw permissionException('Banned'); } // Insert the new user. $this->addInsertFields($UserData); $UserID = $this->insertInternal($UserData); } if ($UserID > 0) { $NewUserRoleIDs = $this->newUserRoleIDs(); // Save the roles. $Roles = val('Roles', $Data, false); if (empty($Roles)) { $Roles = $NewUserRoleIDs; } $this->saveRoles($UserID, $Roles, false); } } else { $UserID = $Data['UserID']; } // Synchronize the transientkey from the external user data source if it is present (eg. WordPress' wpnonce). if (array_key_exists('TransientKey', $Attributes) && $Attributes['TransientKey'] != '' && $UserID > 0) { $this->setTransientKey($UserID, $Attributes['TransientKey']); } return $UserID; }
/** * Register a new user. * * @param $FormPostValues * @param array $Options * @return bool|int|string * @throws Exception */ public function register($FormPostValues, $Options = array()) { $Valid = true; $FormPostValues['LastIPAddress'] = Gdn::request()->ipAddress(); // Throw an error if the registering user has an active session // if (Gdn::session()->isValid()) // $this->Validation->addValidationResult('Name', 'You are already registered.'); // Check for banning first. $Valid = BanModel::checkUser($FormPostValues, null, true); if (!$Valid) { $this->Validation->addValidationResult('UserID', 'Sorry, permission denied.'); } // Throw an event to allow plugins to block the registration. unset($this->EventArguments['User']); $this->EventArguments['User'] = $FormPostValues; $this->EventArguments['Valid'] =& $Valid; $this->fireEvent('BeforeRegister'); if (!$Valid) { return false; // plugin blocked registration } if (array_key_exists('Gender', $FormPostValues)) { $FormPostValues['Gender'] = self::fixGender($FormPostValues['Gender']); } $Method = strtolower(val('Method', $Options, c('Garden.Registration.Method'))); switch ($Method) { case 'captcha': $UserID = $this->insertForBasic($FormPostValues, val('CheckCaptcha', $Options, true), $Options); break; case 'approval': $UserID = $this->insertForApproval($FormPostValues, $Options); break; case 'invitation': $UserID = $this->insertForInvite($FormPostValues, $Options); break; case 'closed': $UserID = false; $this->Validation->addValidationResult('Registration', 'Registration is closed.'); break; case 'basic': default: $UserID = $this->insertForBasic($FormPostValues, val('CheckCaptcha', $Options, false), $Options); break; } if ($UserID) { $this->EventArguments['UserID'] = $UserID; $this->fireEvent('AfterRegister'); } return $UserID; }