From ee71f231102022d0a4c3301a7a52de1908467f51 Mon Sep 17 00:00:00 2001
From: Artem Konenko <yadummer@gmail.com>
Date: Tue, 11 Oct 2016 22:19:46 +0300
Subject: [PATCH] #138 Add authorisation form for OpenID and draft of OpenID
 handling

---
 media/js/sign.js                              |  8 +++
 ~dev_rating/application/bootstrap.php         |  4 +-
 .../classes/Controller/Handler/Sign.php       | 56 +++++++++++++++++++
 ~dev_rating/application/views/sign/in.twig    |  3 +-
 .../application/views/sign/inOpenID.twig      | 12 ++++
 5 files changed, 80 insertions(+), 3 deletions(-)
 create mode 100644 ~dev_rating/application/views/sign/inOpenID.twig

diff --git a/media/js/sign.js b/media/js/sign.js
index 305e99e94..348fa6882 100644
--- a/media/js/sign.js
+++ b/media/js/sign.js
@@ -3,6 +3,8 @@ $(function () {
     var $login = $('#login');
     var $pass = $('#password');
     var $signInButton = $('#signin_b');
+    var $loginOpenID = $('#loginopenid');
+    var $signInOpenIDButton = $('#signopenidin_b');
 
     $signInButton.click(function () {
         var login = $login.val();
@@ -16,6 +18,12 @@ $(function () {
             })
     });
 
+    $signInOpenIDButton.click(function () {
+        var login = $loginOpenID.val();
+
+        window.location = "http://grade.local/~dev_rating/handler/sign/openidlogin?loginopenid=" + login;
+    });
+
     // todo: animation
     Auth.onAllow = () => $signInButton.removeAttr('disabled');
     Auth.onDeprecate = () => $signInButton.attr('disabled', 'disabled');
diff --git a/~dev_rating/application/bootstrap.php b/~dev_rating/application/bootstrap.php
index cf7c9f215..1325019a9 100644
--- a/~dev_rating/application/bootstrap.php
+++ b/~dev_rating/application/bootstrap.php
@@ -147,13 +147,13 @@ require APPPATH . 'routes/dean_office.php';
 Route::set('main', '')->defaults(['controller' => 'index']);
 
 // --------------- Authorization ----------------
-Route::set('sign', 'sign(/<type>)', ['type' => '(up|in)'])
+Route::set('sign', 'sign(/<type>)', ['type' => '(up|in|inOpenID)'])
     ->defaults([
         'controller' => 'Authentication',
         'action'     => 'sign',
     ]);
 
-Route::set('sign:secret_entrance', 'ssign(/<type>)', ['type' => '(up|in)'])
+Route::set('sign:secret_entrance', 'ssign(/<type>)', ['type' => '(up|in|inOpenID)'])
     ->defaults([
         'controller' => 'Authentication',
         'action'     => 'sign_anyway',
diff --git a/~dev_rating/application/classes/Controller/Handler/Sign.php b/~dev_rating/application/classes/Controller/Handler/Sign.php
index 76d8054ae..9a6e9dd39 100644
--- a/~dev_rating/application/classes/Controller/Handler/Sign.php
+++ b/~dev_rating/application/classes/Controller/Handler/Sign.php
@@ -64,4 +64,60 @@ class Controller_Handler_Sign extends Controller_Handler
 
         $this->response->body(json_encode($res));
     }
+
+    public function action_openidlogin()
+    {
+        $openid = new OpenID;
+        $openid->SetIdentity("https://openid.sfedu.ru/server.php/idpage?user=" . $_GET["loginopenid"]);
+        $openid->SetTrustRoot('http://' . $_SERVER["HTTP_HOST"]);
+        $openid->SetOptionalFields(['email', 'nickname', 'r61globalkey', 'staff', 'student']);
+        if ($openid->GetOpenIDServer()) {
+            $openid->SetApprovedURL('http://' . $_SERVER["HTTP_HOST"] . '/~dev_rating/handler/sign/openidfinish');
+            $openid->Redirect();
+        } else {
+            $error = $openid->GetError();
+            echo "ERROR CODE: " . $error['code'] . "<br>";
+            echo "ERROR DESCRIPTION: " . $error['description'] . "<br>";
+        }
+    }
+
+    public function action_openidfinish()
+    {
+        if ($_GET["openid_sreg_student"] !== '1') {
+            $this->fail('К сожалению, личный кабинет сотрудника пока что находится в разработке. Следите за новостями!');
+        }
+
+        if ($_GET['openid_mode'] == 'id_res') {
+            $openid = new OpenID;
+            $openid->SetIdentity($_GET['openid_identity']);
+            $openid_validation_result = $openid->ValidateWithServer();
+
+            if ($openid_validation_result == true) {
+                $this->openid_signIn();
+            } else if ($openid->IsError() == true) {
+                $error = $openid->GetError();
+                echo 'Ошибка!';
+                echo "[" . $error['code'] . "]: " . $error['description'];
+            } else {
+                echo 'Ошибка!';
+                echo "При авторизации что-то пошло не так. Попробуете снова?";
+            }
+        } else if ($_GET['openid_mode'] == 'cancel') {
+            echo 'Какая досада!';
+            echo "Вы досрочно прекратили процесс авторизации. Надеемся, что у Вас всё хорошо.";
+        }
+    }
+
+    private function openid_signIn()
+    {
+        $flags = [
+            'isStudent' => $_GET["openid_sreg_student"],
+            'isStaff' => $_GET["openid_sreg_staff"]
+        ];
+
+        echo 'Добро пожаловать!';
+//        $this->redirect_url = Route::url('evaluation:student');
+//
+//        Account::signIn($_GET["openid_sig"], $_GET["openid_sreg_r61globalkey"], $flags);
+    }
 }
diff --git a/~dev_rating/application/views/sign/in.twig b/~dev_rating/application/views/sign/in.twig
index 9b438ce7e..f7114f9f8 100644
--- a/~dev_rating/application/views/sign/in.twig
+++ b/~dev_rating/application/views/sign/in.twig
@@ -7,7 +7,8 @@
         {{ sign.input('password', 'password', '', 'Пароль') }}
     </div>
     {{ sign.input('signin_b', 'button', 'Войти') }}
+
     <div class='footer'>
-        {{ HTML.anchor('sign/up', 'Активировать аккаунт')|raw }} | {{ HTML.anchor('remind', 'Забыли пароль?')|raw }}
+        {{ HTML.anchor('sign/inOpenID', 'Вход через OpenID')|raw }} | {{ HTML.anchor('sign/up', 'Активировать аккаунт')|raw }} | {{ HTML.anchor('remind', 'Забыли пароль?')|raw }}
     </div>
 {% endblock %}
diff --git a/~dev_rating/application/views/sign/inOpenID.twig b/~dev_rating/application/views/sign/inOpenID.twig
new file mode 100644
index 000000000..36a99bcd7
--- /dev/null
+++ b/~dev_rating/application/views/sign/inOpenID.twig
@@ -0,0 +1,12 @@
+{% extends "sign" %}
+
+{% block title %}Авторизация{% endblock %}
+{% block forms %}
+	<div id='inputs'>
+		{{ sign.input('loginopenid', 'text', '', 'Логин OpenID', true) }}
+	</div>
+	{{ sign.input('signopenidin_b', 'button', 'Войти c OpenID') }}
+	<div class='footer'>
+		{{ HTML.anchor('sign/in', 'Вход через локальную учетную запись')|raw }} | {{ HTML.anchor('sign/up', 'Активировать аккаунт')|raw }} | {{ HTML.anchor('remind', 'Забыли пароль?')|raw }}
+	</div>
+{% endblock %}
-- 
GitLab