/** * Saves a name/value to the user's specified $Column. * * This method throws exceptions when errors are encountered. Use try ... * catch blocks to capture these exceptions. * * @param string The name of the serialized column to save to. At the time of this writing there are three serialized columns on the user table: Permissions, Preferences, and Attributes. * @param int The UserID to save. * @param mixed The name of the value being saved, or an associative array of name => value pairs to be saved. If this is an associative array, the $Value argument will be ignored. * @param mixed The value being saved. */ public function saveToSerializedColumn($Column, $UserID, $Name, $Value = '') { // Load the existing values $UserData = $this->getID($UserID, DATASET_TYPE_OBJECT); if (!$UserData) { throw new Exception(sprintf('User %s not found.', $UserID)); } $Values = val($Column, $UserData); if (!is_array($Values) && !is_object($Values)) { $Values = @unserialize($UserData->{$Column}); } // Throw an exception if the field was not empty but is also not an object or array if (is_string($Values) && $Values != '') { throw new Exception(sprintf(t('Serialized column "%s" failed to be unserialized.'), $Column)); } if (!is_array($Values)) { $Values = array(); } // Hook for plugins $this->EventArguments['CurrentValues'] =& $Values; $this->EventArguments['Column'] =& $Column; $this->EventArguments['UserID'] =& $UserID; $this->EventArguments['Name'] =& $Name; $this->EventArguments['Value'] =& $Value; $this->fireEvent('BeforeSaveSerialized'); // Assign the new value(s) if (!is_array($Name)) { $Name = array($Name => $Value); } $RawValues = array_merge($Values, $Name); $Values = array(); foreach ($RawValues as $Key => $RawValue) { if (!is_null($RawValue)) { $Values[$Key] = $RawValue; } } $Values = Gdn_Format::serialize($Values); // Save the values back to the db $SaveResult = $this->SQL->put('User', array($Column => $Values), array('UserID' => $UserID)); $this->clearCache($UserID, array('user')); return $SaveResult; }
/** * Create secure handshake with remote authenticator. * * @access public * @since 2.0.? * @author Tim Gunter * * @param string $AuthenticationSchemeAlias (default: 'default') */ public function handshake($AuthenticationSchemeAlias = 'default') { try { // Don't show anything if handshaking not turned on by an authenticator if (!Gdn::authenticator()->canHandshake()) { throw new Exception(); } // Try to load the authenticator $Authenticator = Gdn::authenticator()->authenticateWith($AuthenticationSchemeAlias); // Try to grab the authenticator data $Payload = $Authenticator->getHandshake(); if ($Payload === false) { Gdn::request()->withURI('dashboard/entry/auth/password'); return Gdn::dispatcher()->dispatch(); } } catch (Exception $e) { Gdn::request()->WithURI('/entry/signin'); return Gdn::dispatcher()->dispatch(); } $UserInfo = array('UserKey' => $Authenticator->GetUserKeyFromHandshake($Payload), 'ConsumerKey' => $Authenticator->GetProviderKeyFromHandshake($Payload), 'TokenKey' => $Authenticator->GetTokenKeyFromHandshake($Payload), 'UserName' => $Authenticator->GetUserNameFromHandshake($Payload), 'UserEmail' => $Authenticator->GetUserEmailFromHandshake($Payload)); if (method_exists($Authenticator, 'GetRolesFromHandshake')) { $RemoteRoles = $Authenticator->GetRolesFromHandshake($Payload); if (!empty($RemoteRoles)) { $UserInfo['Roles'] = $RemoteRoles; } } // Manual user sync is disabled. No hand holding will occur for users. $SyncScreen = c('Garden.Authenticator.SyncScreen', 'on'); switch ($SyncScreen) { case 'on': // Authenticator events fired inside $this->syncScreen($Authenticator, $UserInfo, $Payload); break; case 'off': case 'smart': $UserID = $this->UserModel->synchronize($UserInfo['UserKey'], array('Name' => $UserInfo['UserName'], 'Email' => $UserInfo['UserEmail'], 'Roles' => val('Roles', $UserInfo))); if ($UserID > 0) { // Account created successfully. // Finalize the link between the forum user and the foreign userkey $Authenticator->finalize($UserInfo['UserKey'], $UserID, $UserInfo['ConsumerKey'], $UserInfo['TokenKey'], $Payload); $UserEventData = array_merge(array('UserID' => $UserID, 'Payload' => $Payload), $UserInfo); Gdn::authenticator()->trigger(Gdn_Authenticator::AUTH_CREATED, $UserEventData); /// ... and redirect them appropriately $Route = $this->redirectTo(); if ($Route !== false) { redirect($Route); } else { redirect('/'); } } else { // Account not created. if ($SyncScreen == 'smart') { $this->informMessage(t('There is already an account in this forum using your email address. Please create a new account, or enter the credentials for the existing account.')); $this->syncScreen($Authenticator, $UserInfo, $Payload); } else { // Set the memory cookie to allow signinloopback to shortcircuit remote query. $CookiePayload = array('Sync' => 'Failed'); $SerializedCookiePayload = Gdn_Format::serialize($CookiePayload); $Authenticator->remember($UserInfo['ConsumerKey'], $SerializedCookiePayload); // This resets vanilla's internal "where am I" to the homepage. Needed. Gdn::request()->withRoute('DefaultController'); $this->SelfUrl = url(''); //Gdn::request()->Path(); $this->View = 'syncfailed'; $this->ProviderSite = $Authenticator->getProviderUrl(); $this->render(); } } break; } }
/** * Adds information to the definition list that causes the app to "phone * home" and see if there are upgrades available. * * Currently added to the dashboard only. Nothing renders with this method. * It is public so it can be added by plugins. */ public function addUpdateCheck() { if (c('Garden.NoUpdateCheck')) { return; } // Check to see if the application needs to phone-home for updates. Doing // this here because this method is always called when admin pages are // loaded regardless of the application loading them. $UpdateCheckDate = Gdn::config('Garden.UpdateCheckDate', ''); if ($UpdateCheckDate == '' || !IsTimestamp($UpdateCheckDate) || $UpdateCheckDate < strtotime("-1 day")) { $UpdateData = array(); // Grab all of the plugins & versions $Plugins = Gdn::pluginManager()->availablePlugins(); foreach ($Plugins as $Plugin => $Info) { $Name = val('Name', $Info, $Plugin); $Version = val('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Plugin'); } } // Grab all of the applications & versions $ApplicationManager = Gdn::factory('ApplicationManager'); $Applications = $ApplicationManager->availableApplications(); foreach ($Applications as $Application => $Info) { $Name = val('Name', $Info, $Application); $Version = val('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Application'); } } // Grab all of the themes & versions $ThemeManager = new Gdn_ThemeManager(); $Themes = $ThemeManager->availableThemes(); foreach ($Themes as $Theme => $Info) { $Name = val('Name', $Info, $Theme); $Version = val('Version', $Info, ''); if ($Version != '') { $UpdateData[] = array('Name' => $Name, 'Version' => $Version, 'Type' => 'Theme'); } } // Dump the entire set of information into the definition list (jQuery // will pick it up and ping the VanillaForums.org server with this info). $this->addDefinition('UpdateChecks', Gdn_Format::serialize($UpdateData)); } }
/** * Load and compile user permissions * * @param integer $UserID * @param boolean $Serialize * @return array */ public function definePermissions($UserID, $Serialize = true) { if (Gdn::cache()->activeEnabled()) { $PermissionsIncrement = $this->GetPermissionsIncrement(); $UserPermissionsKey = formatString(self::USERPERMISSIONS_KEY, array('UserID' => $UserID, 'PermissionsIncrement' => $PermissionsIncrement)); $CachePermissions = Gdn::cache()->get($UserPermissionsKey); if ($CachePermissions !== Gdn_Cache::CACHEOP_FAILURE) { return $CachePermissions; } } $Data = Gdn::permissionModel()->CachePermissions($UserID); $Permissions = UserModel::CompilePermissions($Data); $PermissionsSerialized = null; if (Gdn::cache()->activeEnabled()) { Gdn::cache()->store($UserPermissionsKey, $Permissions); } else { // Save the permissions to the user table $PermissionsSerialized = Gdn_Format::Serialize($Permissions); if ($UserID > 0) { $this->SQL->put('User', array('Permissions' => $PermissionsSerialized), array('UserID' => $UserID)); } } if ($Serialize && is_null($PermissionsSerialized)) { $PermissionsSerialized = Gdn_Format::serialize($Permissions); } return $Serialize ? $PermissionsSerialized : $Permissions; }
<?php if (!defined('APPLICATION')) { exit; } /** * Conversations stub content for a new site. * * Called by ConversationsHooks::Setup() to insert stub content upon enabling app. * * @copyright 2009-2015 Vanilla Forums Inc. * @license http://www.opensource.org/licenses/gpl-2.0.php GNU GPL v2 * @package Conversations * @since 2.2 */ // Only do this once, ever. if (!$Drop) { return; } $SQL = Gdn::database()->sql(); // Prep default content $ConversationBody = "Pssst. Hey. A conversation is a private chat between two or more members. No one can see it except the members added. You can delete this one since I’m just a bot and know better than to talk back."; $SystemUserID = Gdn::userModel()->getSystemUserID(); $TargetUserID = Gdn::session()->UserID; $Now = Gdn_Format::toDateTime(); $Contributors = Gdn_Format::serialize(array($SystemUserID, $TargetUserID)); // Insert stub conversation $ConversationID = $SQL->insert('Conversation', array('InsertUserID' => $SystemUserID, 'DateInserted' => $Now, 'Contributors' => $Contributors, 'CountMessages' => 1)); $MessageID = $SQL->insert('ConversationMessage', array('ConversationID' => $ConversationID, 'Body' => t('StubConversationBody', $ConversationBody), 'Format' => 'Html', 'InsertUserID' => $SystemUserID, 'DateInserted' => $Now)); $SQL->update('Conversation')->set('LastMessageID', $MessageID)->where('ConversationID', $ConversationID)->put(); $SQL->insert('UserConversation', array('ConversationID' => $ConversationID, 'UserID' => $TargetUserID, 'CountReadMessages' => 0, 'LastMessageID' => $MessageID, 'DateConversationUpdated' => $Now));
/** * * * @param string $Column * @param int $RowID * @param string $Name * @param string $Value * @return bool|Gdn_DataSet|object|string * @throws Exception */ public function saveToSerializedColumn($Column, $RowID, $Name, $Value = '') { if (!isset($this->Schema)) { $this->defineSchema(); } // TODO: need to be sure that $this->PrimaryKey is only one primary key $FieldName = $this->PrimaryKey; // Load the existing values $Row = $this->SQL->select($Column)->from($this->Name)->where($FieldName, $RowID)->get()->firstRow(); if (!$Row) { throw new Exception(T('ErrorRecordNotFound')); } $Values = Gdn_Format::unserialize($Row->{$Column}); if (is_string($Values) && $Values != '') { throw new Exception(T('Serialized column failed to be unserialized.')); } if (!is_array($Values)) { $Values = array(); } if (!is_array($Name)) { // Assign the new value(s) $Name = array($Name => $Value); } $Values = Gdn_Format::serialize(array_merge($Values, $Name)); // Save the values back to the db return $this->SQL->from($this->Name)->where($FieldName, $RowID)->set($Column, $Values)->put(); }