/** * Bulk process generations * * @param array|null $values Form submission values * @return \IPS\Helpers\MultipleRedirect */ public function generateBulk($values = NULL) { $self = $this; $vCookie = static::$app . '_faker_' . static::$_controller . '_generator_values'; /* If this is a form submission, store our values now */ if ($values) { /* If we have a custom author defined, we need to save the ID manually for json encoding */ if (!empty($values['author']) and $values['author'] instanceof \IPS\Member) { $values['author'] = $values['author']->member_id; } $values['total'] = mt_rand($values['comment_range']['start'], $values['comment_range']['end']); unset(\IPS\Request::i()->cookie[$vCookie]); \IPS\Request::i()->setCookie($vCookie, json_encode($values)); } $values = $values ?: json_decode(\IPS\Request::i()->cookie[$vCookie], true); /* <sarcasm>Serialization is fun</sarcasm> @TODO: Clean this up */ if (!empty($values['author']) and is_int($values['author'])) { $values['author'] = \IPS\Member::load($values['author']); } if (!empty($values['item_url']) and is_array($values['item_url'])) { $values['item_url'] = \IPS\Http\Url::createFromArray($values['item_url']['data']); } /* Generate the MultipleRedirect page */ $perGo = isset($values['per_go']) ? (int) $values['per_go'] : 25; $reflect = new \ReflectionClass($this); $extension = $reflect->getShortName(); $processUrl = \IPS\Http\Url::internal("app=faker&module=generator&controller={$self::$_controller}&extApp={$self::$app}&extension={$extension}&do=process"); return new \IPS\Helpers\MultipleRedirect($processUrl, function ($doneSoFar) use($self, $perGo, $values, $vCookie) { /* Have we processed everything? */ if ($doneSoFar >= $values['total']) { return NULL; } /* Load our content item container */ $itemClass = $self::$itemClass; $item = $itemClass::loadFromUrl($values['item_url']); $count = 0; $limit = $values['total'] - $doneSoFar; $generated = array(); while ($count < $limit and count($generated) < $perGo) { ++$count; $generated[] = $self->generateSingle($item, $values); } $doneSoFar += $perGo; /* Update our session cookies and proceed to the next chunk */ \IPS\Request::i()->setCookie($vCookie, json_encode($values)); return array($doneSoFar, end($generated), 100 * $doneSoFar / $values['total']); }, function () use($self, $values, $extension) { \IPS\Output::i()->redirect(\IPS\Http\Url::internal("app=faker&module=generator&controller={$self::$_controller}&extApp={$self::$app}&extension={$extension}"), 'completed'); }); }
/** * Authenticate * * @param string $url The URL for the login page * @param \IPS\Member $member If we want to integrate this login method with an existing member, provide the member object * @return \IPS\Member * @throws \IPS\Login\Exception */ public function authenticate( $url, $member=NULL ) { $url = $url->setQueryString( 'loginProcess', 'vk' ); try { /* CSRF Check */ if ( \IPS\Request::i()->state !== \IPS\Session::i()->csrfKey ) { throw new \IPS\Login\Exception( 'CSRF_FAIL', \IPS\Login\Exception::INTERNAL_ERROR ); } if(isset(\IPS\Request::i()->error) || !isset(\IPS\Request::i()->code)) { throw new \IPS\Login\Exception( 'generic_error', \IPS\Login\Exception::INTERNAL_ERROR ); } /* Get a token */ try { $response = \IPS\Http\Url::external( "https://oauth.vk.com/access_token" )->setQueryString( array( 'client_id' => $this->settings['app_id'], 'redirect_uri' => (string) \IPS\Http\Url::internal( 'applications/core/interface/vk/auth.php', 'none' ), 'client_secret' => $this->settings['app_secret'], 'code' => \IPS\Request::i()->code ) )->request()->Get()->decodeJson(); if(isset($response['error'])) { throw new \IPS\Login\Exception( 'generic_error', \IPS\Login\Exception::INTERNAL_ERROR ); } } catch( \RuntimeException $e ) { throw new \IPS\Login\Exception( 'generic_error', \IPS\Login\Exception::INTERNAL_ERROR ); } /* Get the user data */ $userData = \IPS\Http\Url::external( "https://api.vk.com/method/getProfiles?uid={$response['user_id']}&access_token={$response['access_token']}&fields=first_name,last_name,screen_name,bdate,nickname" )->request()->get()->decodeJson(); $userData = $userData['response'][0]; /* Find or create member */ $newMember = FALSE; if ( $member === NULL ) { $member = \IPS\Member::load( $response['user_id'], 'vk_id' ); if ( !$member->member_id ) { if(isset($response['email'])) { $existingEmail = \IPS\Member::load( $response['email'], 'email' ); if ( $existingEmail->member_id ) { $exception = new \IPS\Login\Exception( 'generic_error', \IPS\Login\Exception::MERGE_SOCIAL_ACCOUNT ); $exception->handler = 'vk'; $exception->member = $existingEmail; $exception->details = array($response['access_token'], $response['user_id']); throw $exception; } } $member = new \IPS\Member; if ( \IPS\Settings::i()->reg_auth_type == 'admin' or \IPS\Settings::i()->reg_auth_type == 'admin_user' ) { $member->members_bitoptions['validating'] = TRUE; } $member->member_group_id = \IPS\Settings::i()->member_group; $member->email = isset($response['email'])?$response['email']:''; $member->name = $userData['nickname']; if ( empty($member->name) AND $this->settings['real_name'] ) { $name = $userData['first_name'] . ' ' . $userData['last_name']; $existingUsername = \IPS\Member::load( $name, 'name' ); if ( !$existingUsername->member_id ) { $member->name = $name; } } $member->profilesync = json_encode( array( 'vk' => array( 'photo' => TRUE, 'status' => '' ) ) ); $newMember = TRUE; } } /* Update details */ $member->vk_id = $response['user_id']; $member->vk_token = $response['access_token']; $member->save(); /* Sync */ if ( $newMember ) { if ( \IPS\Settings::i()->reg_auth_type == 'admin_user' ) { \IPS\Db::i()->update( 'core_validating', array( 'user_verified' => 1 ), array( 'member_id=?', $member->member_id ) ); } $sync = new \IPS\core\ProfileSync\VK( $member ); $sync->sync(); } /* Return */ return $member; } catch ( \IPS\Http\Request\Exception $e ) { throw new \IPS\Login\Exception( 'generic_error', \IPS\Login\Exception::INTERNAL_ERROR ); } }
/** * Authenticate * * @param string $url The URL for the login page * @param \IPS\Member $member If we want to integrate this login method with an existing member, provide the * member object * * @return \IPS\Member * @throws \IPS\Login\Exception */ public function authenticate($url, $member = null) { try { $steamId = $this->validate(); if (!$steamId) { throw new \IPS\Login\Exception('generic_error', \IPS\Login\Exception::INTERNAL_ERROR); } /* If an api key is provided, attempt to load the user from steam */ $response = null; $userData = null; if ($this->settings['api_key']) { try { $response = \IPS\Http\Url::external("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$this->settings['api_key']}&steamids={$steamId}")->request()->get()->decodeJson(); if ($response) { // Get the first player $userData = $response['response']['players'][0]; } } catch (\IPS\Http\Request\Exception $e) { throw new \IPS\Login\Exception('generic_error', \IPS\Login\Exception::INTERNAL_ERROR, $e); } } /* Find member */ $newMember = false; if ($member === null) { try { $memberData = \IPS\Db::i()->select('*', 'core_members', array('steamid=?', $steamId))->first(); $member = \IPS\Member::constructFromData($memberData); } catch (\UnderflowException $e) { $member = \IPS\Member::load(null); } if (!$member->member_id) { if ($this->settings['api_key']) { try { $gameslist = \IPS\Http\Url::external("http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key={$this->settings['api_key']}&steamid={$steamId}")->request()->get()->decodeJson(); $hasgmod = false; if (!isset($gameslist) or !isset($gameslist['response']) or !isset($gameslist['response']['games'])) { throw new \IPS\Login\Exception('Your Steam account is private and we can\'t tell if you own Garry\'s Mod. Please change your game library to public!', \IPS\Login\Exception::NO_ACCOUNT, $e); } foreach ($gameslist['response']['games'] as $game) { if ($game['appid'] == 4000) { $hasgmod = true; } } if (!$hasgmod) { throw new \IPS\Login\Exception('Your Steam account must own Garry\'s Mod to login.', \IPS\Login\Exception::NO_ACCOUNT, $e); } } catch (\IPS\Http\Request\Exception $e) { throw new \IPS\Login\Exception('generic_error', \IPS\Login\Exception::INTERNAL_ERROR, $e); } } $member = new \IPS\Member(); $member->member_group_id = \IPS\Settings::i()->member_group; if (\IPS\Settings::i()->reg_auth_type == 'admin' or \IPS\Settings::i()->reg_auth_type == 'admin_user') { $member->members_bitoptions['validating'] = true; } if (isset($userData)) { if ($this->settings['use_steam_name']) { $existingUsername = \IPS\Member::load($userData['personaname'], 'name'); if (!$existingUsername->member_id) { $member->name = $userData['personaname']; } } $member->profilesync = json_encode(array(static::$loginKey => array('photo' => true, 'cover' => false, 'status' => ''))); } $newMember = true; } } /* Create member */ $member->steamid = $steamId; $member->save(); /* Sync */ if ($newMember) { if (\IPS\Settings::i()->reg_auth_type == 'admin_user') { \IPS\Db::i()->update('core_validating', array('user_verified' => 1), array('member_id=?', $member->member_id)); } $sync = new \IPS\core\ProfileSync\Steam($member); $sync->sync(); } /* Return */ return $member; } catch (\IPS\Http\Request\Exception $e) { throw new \IPS\Login\Exception('generic_error', \IPS\Login\Exception::INTERNAL_ERROR); } }
$_SERVER['SCRIPT_FILENAME'] = __FILE__; $path = ''; require_once $path . 'init.php'; \IPS\Session\Front::i(); $key = md5(md5(\IPS\Settings::i()->sql_user . \IPS\Settings::i()->sql_pass) . \IPS\Settings::i()->board_start); $login_type = 'email'; /* Alowed IP addresses, uncomment for more security */ // $ip_address = array('x.x.x.x'); // EDIT THIS LINE!! /* -~-~-~-~-~-~ Stop Editing -~-~-~-~-~-~ */ if (isset($ip_address) and in_array($_SERVER['REMOTE_ADDR'], $ip_address) !== TRUE) { \IPS\Output::i()->json(array('status' => 'FAILD', 'msg' => 'BAD_IP_ADDR')); } if (!\IPS\Request::i()->do || !\IPS\Request::i()->id || !\IPS\Request::i()->key || !\IPS\Login::compareHashes(\IPS\Request::i()->key, md5($key . \IPS\Request::i()->id))) { \IPS\Output::i()->json(array('status' => 'FAILD', 'msg' => 'BAD_KEY')); } $member = \IPS\Member::load(\IPS\Request::i()->id, $login_type); if (!$member->member_id) { \IPS\Output::i()->json(array('status' => 'FAILD', 'msg' => 'ACCOUNT_NOT_FOUND')); } switch (\IPS\Request::i()->do) { case 'get_salt': \IPS\Output::i()->json(array('status' => 'SUCCESS', 'pass_salt' => $member->members_pass_salt)); break; case 'login': if (\IPS\Login::compareHashes($member->members_pass_hash, \IPS\Request::i()->password) === TRUE) { \IPS\Output::i()->json(array('status' => 'SUCCESS', 'connect_status' => $member->members_bitoptions['validating'] ? 'VALIDATING' : 'SUCCESS', 'email' => $member->email, 'name' => $member->name, 'connect_id' => $member->member_id)); } break; case 'field': $fields = $member->profileFields(); if (isset($fields['core_pfieldgroups_' . \IPS\Request::i()->fgroup]) and isset($fields['core_pfieldgroups_' . \IPS\Request::i()->fgroup]['core_pfield_' . \IPS\Request::i()->fid])) {
/** * Generate a random guest member object * * @return \IPS\Member */ public function guest() { $member = \IPS\Member::load(0); $member->name = $this->userName(); return $member; }