Source of file VKControllerExtension.php
Size: 3,765 Bytes - Last Modified: 2022-02-21T10:00:15+00:00
/var/www/docs.ssmods.com/process/src/code/Extensions/VKControllerExtension.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | <?php use SilverStripe\Core\Config\Config; use SilverStripe\Security\Member; use SilverStripe\Core\Injector\Injector; use SilverStripe\Control\Director; use SilverStripe\Control\Controller; use SilverStripe\Core\Extension; /** * Main controller class to handle VK Connect implementations. Extends the * built in SilverStripe controller to add addition template functionality. */ class VKControllerExtension extends Extension { /** * @config * * @var string */ private static $app_id = ''; /** * @config * * @var string */ private static $api_secret = ''; /** * @config * * @var bool */ private static $create_member = true; /** * @config * * @var bool */ private static $sync_member_details = true; /** * @var getjump\Vk\Core */ private $helper; /** * @var getjump\Vk\Auth */ private $session; /** * @var string */ private $userID; public function init() { $this->getVKHelper(); } public function getVKHelper() { if (!$this->helper) { $config = Config::inst(); $appId = $config->get('VKControllerExtension', 'app_id'); $secret = $config->get('VKControllerExtension', 'api_secret'); if (!$appId || !$secret) { return false; } $this->helper = getjump\Vk\Core::getInstance()->apiVersion('5.5'); $this->session = getjump\Vk\Auth::getInstance(); $this->session->setAppId($appId) ->setScope('email') ->setSecret($secret) ->setRedirectUri($this->getCurrentPageURL()); $accessToken = $this->session->startCallback(); if ($accessToken) { $this->userID = $accessToken->userId; $this->helper->setToken($accessToken->token); // create, log in, sync $this->helper->request('users.get', [ 'user_ids' => $this->getVKUserID(), 'fields' => $config->get('VKControllerExtension', 'fields') ])->each(function ($i, $user) use ($accessToken) { $member = Member::get()->filter([ 'VKUID' => $user->id ])->first(); if (!$member) { // see if we have a match based on email. From a // security point of view, users have to confirm their // email address in VK so doing a match up is fine if (isset($user->email) && $user->email) { $member = Member::get()->filter([ 'Email' => $user->email, ])->first(); } } if (!$member) { $member = Injector::inst()->create(Member::class); } $user->VKAccessToken = $accessToken->token; $member->syncVKDetails($user); $member->logIn(); }); } else { $this->helper = false; } } return $this->helper; } public function getVKUserID() { return $this->userID; } /** * @return string */ public function getVKLoginLink() { $this->getVKHelper(); return $this->session->getUrl(); } /** * @return string */ public function getCurrentPageURL() { return Controller::join_links(Director::absoluteBaseURL(),$this->owner->Link()); } } |