瀏覽代碼

OAuth (part 11 draft) Add Yandex

Visman 2 年之前
父節點
當前提交
cf3087dd1c

+ 1 - 1
app/Models/Pages/Admin/Install.php

@@ -1274,7 +1274,7 @@ class Install extends Admin
 
         // заполнение providers
         $providers = [
-            'github',
+            'github', 'yandex',
         ];
 
         $query = 'INSERT INTO ::providers (pr_name, pr_pos)

+ 39 - 0
app/Models/Pages/Admin/Update.php

@@ -527,4 +527,43 @@ class Update extends Admin
 
         return null;
     }
+
+    /**
+     * rev.56 to rev.57
+     */
+    protected function stageNumber56(array $args): ?int
+    {
+        $providers = [
+            1 => 'yandex',
+        ];
+
+        $query = 'INSERT INTO ::providers (pr_name, pr_pos)
+            SELECT tmp.*
+            FROM (SELECT ?s:name AS f1, ?i:pos AS f2) AS tmp
+            WHERE NOT EXISTS (
+                SELECT 1
+                FROM ::providers
+                WHERE pr_name=?s:name
+            )';
+
+        foreach ($providers as $pos => $name) {
+            $vars = [
+                ':name' => $name,
+                ':pos'  => $pos,
+            ];
+
+            $this->c->DB->exec($query, $vars);
+        }
+
+        $coreConfig = new CoreConfig($this->configFile);
+
+        $coreConfig->add(
+            'shared=>providers=>drivers=>yandex',
+            '\\ForkBB\\Models\\Provider\\Driver\\Yandex::class'
+        );
+
+        $coreConfig->save();
+
+        return null;
+    }
 }

+ 141 - 0
app/Models/Provider/Driver/Yandex.php

@@ -0,0 +1,141 @@
+<?php
+/**
+ * This file is part of the ForkBB <https://github.com/forkbb>.
+ *
+ * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
+ * @license   The MIT License (MIT)
+ */
+
+declare(strict_types=1);
+
+namespace ForkBB\Models\Provider\Driver;
+
+use ForkBB\Models\Provider\Driver;
+use RuntimeException;
+
+class Yandex extends Driver
+{
+    protected string $origName = 'yandex';
+    protected string $authURL  = 'https://oauth.yandex.ru/authorize';
+    protected string $tokenURL = 'https://oauth.yandex.ru/token';
+    protected string $userURL  = 'https://login.yandex.ru/info?format=json';
+    protected string $scope    = 'login:info login:email login:avatar';
+
+    /**
+     * Запрашивает информацию о пользователе
+     * Проверяет ответ
+     * Запоминает данные пользователя
+     */
+    public function reqUserInfo(): bool
+    {
+        $this->userInfo = [];
+
+        $options = [
+            'headers' => [
+                'Accept: application/json',
+                "Authorization: OAuth {$this->access_token}",
+            ],
+        ];
+
+        $response = $this->request('GET', $this->userURL, $options);
+
+        if (! empty($response['id'])) {
+            $this->userInfo = $response;
+
+            return true;
+        } elseif (\is_array($response)) {
+            $this->error = 'User error';
+        }
+
+        return false;
+    }
+
+    /**
+     * Возвращает идентификатор пользователя (от провайдера)
+     */
+    protected function getuserId(): string
+    {
+        return (string) ($this->userInfo['id'] ?? '');
+    }
+
+    /**
+     * Возвращает логин пользователя (от провайдера)
+     */
+    protected function getuserLogin(): string
+    {
+        return (string) ($this->userInfo['login'] ?? '');
+    }
+
+    /**
+     * Возвращает имя пользователя (от провайдера)
+     */
+    protected function getuserName(): string
+    {
+        return (string) ($this->userInfo['real_name'] ?? ''); // ???? or display_name?
+    }
+
+    /**
+     * Возвращает email пользователя (от провайдера)
+     */
+    protected function getuserEmail(): string
+    {
+        return $this->c->Mail->valid($this->userInfo['default_email'] ?? null) ?: "{$this->origName}-{$this->userId}@localhost";
+    }
+
+    /**
+     * Возвращает флаг подлинности email пользователя (от провайдера)
+     */
+    protected function getuserEmailVerifed(): bool
+    {
+        return false; // ????
+    }
+
+    /**
+     * Возвращает ссылку на аватарку пользователя (от провайдера)
+     */
+    protected function getuserAvatar(): string
+    {
+        if (
+            empty($this->userInfo['is_avatar_empty'])
+            && ! empty($this->userInfo['default_avatar_id'])
+        ) {
+            return "https://avatars.yandex.net/get-yapic/{$this->userInfo['default_avatar_id']}/islands-200";
+        } else {
+            return '';
+        }
+    }
+
+    /**
+     * Возвращает ссылку на профиль пользователя (от провайдера)
+     */
+    protected function getuserURL(): string
+    {
+        return '';
+    }
+
+    /**
+     * Возвращает местоположение пользователя (от провайдера)
+     */
+    protected function getuserLocation(): string
+    {
+        return '';
+    }
+
+    /**
+     * Возвращает пол пользователя (от провайдера)
+     */
+    protected function getuserGender(): int
+    {
+        if (isset($this->userInfo['sex'])) {
+            if ('male' === $this->userInfo['sex']) {
+                return FORK_GEN_MAN;
+            }
+
+            if ('female' === $this->userInfo['sex']) {
+                return FORK_GEN_FEM;
+            }
+        }
+
+        return FORK_GEN_NOT;
+    }
+}

+ 1 - 0
app/config/main.dist.php

@@ -167,6 +167,7 @@ return [
             'class'   => \ForkBB\Models\Provider\Providers::class,
             'drivers' => [
                 'github' => \ForkBB\Models\Provider\Driver\GitHub::class,
+                'yandex' => \ForkBB\Models\Provider\Driver\Yandex::class,
             ],
         ],
         'providerUser'  => \ForkBB\Models\ProviderUser\ProviderUser::class,

+ 3 - 0
app/lang/en/admin_providers.po

@@ -36,6 +36,9 @@ msgstr "Provider data updated."
 msgid "github"
 msgstr "GitHub"
 
+msgid "yandex"
+msgstr "Yandex"
+
 msgid "Callback label"
 msgstr "Callback URI"
 

+ 3 - 0
app/lang/ru/admin_providers.po

@@ -36,6 +36,9 @@ msgstr "Данные провайдера обновлены."
 msgid "github"
 msgstr "GitHub"
 
+msgid "yandex"
+msgstr "Yandex"
+
 msgid "Callback label"
 msgstr "URI перенаправления"
 

+ 13 - 2
public/style/ForkBB/style.css

@@ -2998,11 +2998,22 @@ body,
 /****************/
 #fork .f-btn[name="github"] {
   color: #24292f;
-  background-color: #fff;
+  background-color: #ffffff;
 }
 
 #fork .f-btn[name="github"]:focus,
 #fork .f-btn[name="github"]:hover {
-  color: #fff;
+  color: #ffffff;
   background-color: #24292f;
 }
+
+#fork .f-btn[name="yandex"] {
+  color: #fc3f1d;
+  background-color: #ffffff;
+}
+
+#fork .f-btn[name="yandex"]:focus,
+#fork .f-btn[name="yandex"]:hover {
+  color: #ffffff;
+  background-color: #fc3f1d;
+}