瀏覽代碼

chore: adjust style & code clean up

M1Screw 2 年之前
父節點
當前提交
176ce9bb22

+ 1 - 0
composer.json

@@ -29,6 +29,7 @@
         "stripe/stripe-php": "^7",
         "symfony/console": "*",
         "symfony/yaml": "^6",
+        "vectorface/googleauthenticator": "^3.0",
         "voku/anti-xss": "^4"
     },
     "autoload": {

+ 1 - 1
resources/views/tabler/user/invite.tpl

@@ -52,7 +52,7 @@
                 <div class="col-12">
                     <div class="card">
                         <div class="card-header">
-                            <h3 class="card-title">返利记录</h3>
+                            <h3 class="card-title my-3">返利记录</h3>
                         </div>
                         {if $paybacks->count() != '0'}
                             <div class="table-responsive">

+ 3 - 3
src/Controllers/AuthController.php

@@ -12,7 +12,6 @@ use App\Services\Auth;
 use App\Services\Captcha;
 use App\Services\Mail;
 use App\Utils\Check;
-use App\Utils\GA;
 use App\Utils\Hash;
 use App\Utils\ResponseHelper;
 use App\Utils\TelegramSessionManager;
@@ -22,6 +21,7 @@ use Psr\Http\Message\ResponseInterface;
 use Ramsey\Uuid\Uuid;
 use Slim\Http\Response;
 use Slim\Http\ServerRequest;
+use Vectorface\GoogleAuthenticator;
 use voku\helper\AntiXSS;
 
 /**
@@ -97,7 +97,7 @@ final class AuthController extends BaseController
         }
 
         if ($user->ga_enable === 1) {
-            $ga = new GA();
+            $ga = new GoogleAuthenticator();
             $rcode = $ga->verifyCode($user->ga_token, $code);
             if (!$rcode) {
                 return $response->withJson([
@@ -326,7 +326,7 @@ final class AuthController extends BaseController
             $user->telegram_id = $telegram_id;
         }
 
-        $ga = new GA();
+        $ga = new GoogleAuthenticator();
         $secret = $ga->createSecret();
         $user->ga_token = $secret;
         $user->ga_enable = 0;

+ 3 - 3
src/Controllers/UserController.php

@@ -26,7 +26,6 @@ use App\Services\Payment;
 use App\Utils\Check;
 use App\Utils\Cookie;
 use App\Utils\DatatablesHelper;
-use App\Utils\GA;
 use App\Utils\Hash;
 use App\Utils\QQWry;
 use App\Utils\ResponseHelper;
@@ -36,6 +35,7 @@ use App\Utils\URL;
 use Ramsey\Uuid\Uuid;
 use Slim\Http\Response;
 use Slim\Http\ServerRequest;
+use Vectorface\GoogleAuthenticator;
 use voku\helper\AntiXSS;
 
 /**
@@ -215,7 +215,7 @@ final class UserController extends BaseController
             ]);
         }
         $user = $this->user;
-        $ga = new GA();
+        $ga = new GoogleAuthenticator();
         $rcode = $ga->verifyCode($user->ga_token, $code);
         if (! $rcode) {
             return $response->withJson([
@@ -279,7 +279,7 @@ final class UserController extends BaseController
      */
     public function resetGa(ServerRequest $request, Response $response, array $args)
     {
-        $ga = new GA();
+        $ga = new GoogleAuthenticator();
         $secret = $ga->createSecret();
         $user = $this->user;
         $user->ga_token = $secret;

+ 0 - 45
src/Middleware/AuthorizationBearer.php

@@ -1,45 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace App\Middleware;
-
-use Psr\Http\Message\ResponseInterface;
-use Psr\Http\Message\ServerRequestInterface;
-use Psr\Http\Server\MiddlewareInterface;
-use Psr\Http\Server\RequestHandlerInterface;
-use Slim\Factory\AppFactory;
-
-use function substr;
-
-final class AuthorizationBearer implements MiddlewareInterface
-{
-    private string $token;
-
-    public function __construct(string $token)
-    {
-        $this->token = $token;
-    }
-
-    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
-    {
-        // The OAuth 2.0 Authorization Framework: Bearer Token Usage
-        // https://www.rfc-editor.org/rfc/rfc6750
-
-        $authHeader = $request->getHeaderLine('Authorization');
-
-        if (
-            substr($authHeader, 0, 7) !== 'Bearer ' ||
-            substr($authHeader, 8) !== $this->token
-        ) {
-            /** @var \Slim\Http\Response $response */
-            $response = AppFactory::determineResponseFactory()->createResponse(401);
-            return $response->withJson([
-                'ret' => 0,
-                'data' => 'Authorization failed',
-            ]);
-        }
-
-        return $handler->handle($request);
-    }
-}

+ 1 - 6
src/Models/User.php

@@ -5,7 +5,6 @@ declare(strict_types=1);
 namespace App\Models;
 
 use App\Services\Mail;
-use App\Utils\GA;
 use App\Utils\Hash;
 use App\Utils\Telegram;
 use App\Utils\Tools;
@@ -290,11 +289,7 @@ final class User extends Model
 
     public function getGAurl()
     {
-        $ga = new GA();
-        return $ga->getUrl(
-            urlencode($_ENV['appName'] . '-' . $this->user_name . '-两步验证码'),
-            $this->ga_token
-        );
+        return 'otpauth://totp/' . urlencode($_ENV['appName'] . '-' . $this->email . '-两步验证码') . '?secret=' . $this->ga_token . '';
     }
 
     /**

+ 0 - 185
src/Utils/GA.php

@@ -1,185 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace App\Utils;
-
-final class GA
-{
-    private $codeLength = 6;
-
-    /**
-     * Create new secret.
-     * 16 characters, randomly chosen from the allowed base32 characters.
-     */
-    public function createSecret(int $secretLength = 16): string
-    {
-        $validChars = $this->_getBase32LookupTable();
-        unset($validChars[32]);
-
-        $secret = '';
-        for ($i = 0; $i < $secretLength; $i++) {
-            $secret .= $validChars[array_rand($validChars)];
-        }
-        return $secret;
-    }
-
-    /**
-     * Calculate the code, with given secret and point in time
-     */
-    public function getCode(string $secret, ?int $timeSlice = null): string
-    {
-        if ($timeSlice === null) {
-            $timeSlice = floor(\time() / 30);
-        }
-
-        $secretkey = $this->_base32Decode($secret);
-
-        // Pack time into binary string
-        $time = chr(0) . chr(0) . chr(0) . chr(0) . pack('N*', $timeSlice);
-        // Hash it with users secret key
-        $hm = hash_hmac('SHA1', $time, $secretkey, true);
-        // Use last nipple of result as index/offset
-        $offset = ord(substr($hm, -1)) & 0x0F;
-        // grab 4 bytes of the result
-        $hashpart = substr($hm, $offset, 4);
-
-        // Unpak binary value
-        $value = unpack('N', $hashpart);
-        $value = $value[1];
-        // Only 32 bits
-        $value &= 0x7FFFFFFF;
-        $modulo = 10 ** $this->codeLength;
-
-        return str_pad($value % $modulo, $this->codeLength, '0', STR_PAD_LEFT);
-    }
-
-    /**
-     * Get QR-Code URL for image, from google charts
-     */
-    public function getQRCodeGoogleUrl(string $name, string $secret, ?string $title = null): string
-    {
-        $urlencoded = urlencode('otpauth://totp/' . $name . '?secret=' . $secret . '');
-        if (isset($title)) {
-            $urlencoded .= urlencode('&issuer=' . urlencode($title));
-        }
-        return 'https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=' . $urlencoded . '';
-    }
-
-    public function getUrl($name, $secret, $title = null)
-    {
-        $urlencoded = 'otpauth://totp/' . $name . '?secret=' . $secret . '';
-        if (isset($title)) {
-            $urlencoded .= '&issuer=' . urlencode($title);
-        }
-        return $urlencoded;
-    }
-
-    public function verifyCode(string $secret, string $code, int $discrepancy = 1, ?int $currentTimeSlice = null): bool
-    {
-        if ($currentTimeSlice === null) {
-            $currentTimeSlice = floor(\time() / 30);
-        }
-
-        for ($i = -$discrepancy; $i <= $discrepancy; $i++) {
-            $calculatedCode = $this->getCode($secret, (int) $currentTimeSlice + $i);
-            if ($calculatedCode === $code) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public function setCodeLength(int $length)
-    {
-        $this->codeLength = $length;
-        return $this;
-    }
-
-    private function _base32Decode($secret)
-    {
-        if ($secret === '') {
-            return '';
-        }
-
-        $base32chars = $this->_getBase32LookupTable();
-        $base32charsFlipped = array_flip($base32chars);
-
-        $paddingCharCount = substr_count($secret, $base32chars[32]);
-        $allowedValues = [6, 4, 3, 1, 0];
-        if (! \in_array($paddingCharCount, $allowedValues)) {
-            return false;
-        }
-        for ($i = 0; $i < 4; $i++) {
-            if ($paddingCharCount === $allowedValues[$i] &&
-                substr($secret, -$allowedValues[$i]) !== str_repeat($base32chars[32], $allowedValues[$i])) {
-                return false;
-            }
-        }
-        $secret = str_replace('=', '', $secret);
-        $secret = str_split($secret);
-        $binaryString = '';
-        for ($i = 0, $iMax = count($secret); $i < $iMax; $i += 8) {
-            $x = '';
-            if (! \in_array($secret[$i], $base32chars)) {
-                return false;
-            }
-            for ($j = 0; $j < 8; $j++) {
-                $x .= str_pad(base_convert($base32charsFlipped[$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
-            }
-            $eightBits = str_split($x, 8);
-            foreach ($eightBits as $zValue) {
-                $binaryString .= (($y = chr(base_convert($zValue, 2, 10))) || ord($y) === 48) ? $y : '';
-            }
-        }
-        return $binaryString;
-    }
-
-    private function _base32Encode(string $secret, bool $padding = true): string
-    {
-        if ($secret !== '') {
-            return '';
-        }
-
-        $base32chars = $this->_getBase32LookupTable();
-
-        $secret = str_split($secret);
-        $binaryString = '';
-        foreach ($secret as $iValue) {
-            $binaryString .= str_pad(base_convert(ord($iValue), 10, 2), 8, '0', STR_PAD_LEFT);
-        }
-        $fiveBitBinaryArray = str_split($binaryString, 5);
-        $base32 = '';
-        $i = 0;
-        while ($i < count($fiveBitBinaryArray)) {
-            $base32 .= $base32chars[base_convert(str_pad($fiveBitBinaryArray[$i], 5, '0'), 2, 10)];
-            $i++;
-        }
-        $x = strlen($binaryString) % 40;
-
-        if ($padding && $x !== 0) {
-            if ($x === 8) {
-                $base32 .= str_repeat($base32chars[32], 6);
-            } elseif ($x === 16) {
-                $base32 .= str_repeat($base32chars[32], 4);
-            } elseif ($x === 24) {
-                $base32 .= str_repeat($base32chars[32], 3);
-            } elseif ($x === 32) {
-                $base32 .= $base32chars[32];
-            }
-        }
-        return $base32;
-    }
-
-    private function _getBase32LookupTable(): array
-    {
-        return [
-            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7
-            'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
-            'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
-            'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
-            '=',  // padding char
-        ];
-    }
-}