From 5a3281247beb54b5cbffdcddd16d2633b454baaf Mon Sep 17 00:00:00 2001
From: Eugen Ciur <eugen@papermerge.com>
Date: Thu, 21 Oct 2021 21:13:39 +0200
Subject: [PATCH] basic client side authentication

---
 app/authenticators/oauth2.js |   9 +++
 app/controllers/login.js     |  34 ++++++++++
 app/router.js                |   2 +
 app/routes/login.js          |  10 +++
 app/routes/roles/index.js    |   5 ++
 app/templates/login.hbs      |  10 +++
 package-lock.json            | 126 +++++++++++++++++++++++++++++++++++
 package.json                 |   1 +
 8 files changed, 197 insertions(+)
 create mode 100644 app/authenticators/oauth2.js
 create mode 100644 app/controllers/login.js
 create mode 100644 app/routes/login.js
 create mode 100644 app/templates/login.hbs

diff --git a/app/authenticators/oauth2.js b/app/authenticators/oauth2.js
new file mode 100644
index 0000000..267cf12
--- /dev/null
+++ b/app/authenticators/oauth2.js
@@ -0,0 +1,9 @@
+import OAuth2PasswordGrantAuthenticator from 'ember-simple-auth/authenticators/oauth2-password-grant';
+
+
+class OAuth2Authenticator extends OAuth2PasswordGrantAuthenticator {
+  serverTokenEndpoint = '/api/authenticate';
+}
+
+
+export default OAuth2Authenticator;
\ No newline at end of file
diff --git a/app/controllers/login.js b/app/controllers/login.js
new file mode 100644
index 0000000..8a51a71
--- /dev/null
+++ b/app/controllers/login.js
@@ -0,0 +1,34 @@
+import Controller from '@ember/controller';
+import { inject as service } from '@ember/service';
+import { action } from "@ember/object";
+import { tracked } from "@glimmer/tracking";
+
+
+export default class LoginController extends Controller {
+  @tracked errorMessage;
+  @service session;
+
+  @action
+  async authenticate(event) {
+    event.preventDefault();
+
+    let { identification, password } = this;
+
+
+    await this.session.authenticate('authenticator:oauth2', identification, password);
+
+    if (this.session.isAuthenticated) {
+      // What to do with all this success?
+    }
+  }
+
+  @action
+  updateIdentification(event) {
+    this.identification = event.target.value;
+  }
+
+  @action
+  updatePassword(event) {
+    this.password = event.target.value;
+  }
+}
\ No newline at end of file
diff --git a/app/router.js b/app/router.js
index 8484125..1dcf684 100644
--- a/app/router.js
+++ b/app/router.js
@@ -7,6 +7,8 @@ export default class Router extends EmberRouter {
 }
 
 Router.map(function () {
+  this.route('login');
+  
   this.route('documents');
   this.route('inbox');
   this.route('document', { path: '/document/:document_id' });
diff --git a/app/routes/login.js b/app/routes/login.js
new file mode 100644
index 0000000..c9cfd7d
--- /dev/null
+++ b/app/routes/login.js
@@ -0,0 +1,10 @@
+import Route from '@ember/routing/route';
+import { inject as service } from '@ember/service';
+
+export default class LoginRoute extends Route {
+  @service session;
+
+  beforeModel(transition) {
+    this.get('session').prohibitAuthentication('index');
+  }
+}
\ No newline at end of file
diff --git a/app/routes/roles/index.js b/app/routes/roles/index.js
index 757a7d6..7cd3825 100644
--- a/app/routes/roles/index.js
+++ b/app/routes/roles/index.js
@@ -3,6 +3,11 @@ import { inject as service } from '@ember/service';
 
 class RolesRoute extends Route {
   @service store;
+  @service session;
+
+  beforeModel(transition) {
+    this.session.requireAuthentication(transition, 'login');
+  }
 
   async model() {
     return this.store.findAll('role');
diff --git a/app/templates/login.hbs b/app/templates/login.hbs
new file mode 100644
index 0000000..5f0944e
--- /dev/null
+++ b/app/templates/login.hbs
@@ -0,0 +1,10 @@
+<form {{on "submit" this.authenticate}}>
+  <label for="identification">Login</label>
+  <input id='identification' placeholder="Enter Login" value={{this.identification}} {{on "change" this.updateIdentification}}>
+  <label for="password">Password</label>
+  <input id='password' placeholder="Enter Password" value={{this.password}} {{on "change" this.updatePassword}}>
+  <button type="submit">Login</button>
+  {{#if this.errorMessage}}
+    <p>{{this.errorMessage}}</p>
+  {{/if}}
+</form>
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index df8af8c..beba490 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4877,6 +4877,12 @@
         }
       }
     },
+    "base-64": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
+      "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=",
+      "dev": true
+    },
     "base64-arraybuffer": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
@@ -9738,6 +9744,16 @@
         }
       }
     },
+    "ember-cookies": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/ember-cookies/-/ember-cookies-0.5.2.tgz",
+      "integrity": "sha512-nZ7oG97kBcO9UHjO95ryABpnVx62Bhxo7lIsBJNmWvFXleILm9DGueiAynzXxuYWWPuKIeeSbYakrS1869tNTw==",
+      "dev": true,
+      "requires": {
+        "ember-cli-babel": "^7.1.0",
+        "ember-getowner-polyfill": "^1.1.0 || ^2.0.0"
+      }
+    },
     "ember-data": {
       "version": "3.28.3",
       "resolved": "https://registry.npmjs.org/ember-data/-/ember-data-3.28.3.tgz",
@@ -9925,6 +9941,33 @@
       "integrity": "sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw==",
       "dev": true
     },
+    "ember-factory-for-polyfill": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz",
+      "integrity": "sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA==",
+      "dev": true,
+      "requires": {
+        "ember-cli-version-checker": "^2.1.0"
+      },
+      "dependencies": {
+        "ember-cli-version-checker": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz",
+          "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==",
+          "dev": true,
+          "requires": {
+            "resolve": "^1.3.3",
+            "semver": "^5.3.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
     "ember-fetch": {
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/ember-fetch/-/ember-fetch-8.1.1.tgz",
@@ -10200,6 +10243,34 @@
         }
       }
     },
+    "ember-getowner-polyfill": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz",
+      "integrity": "sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q==",
+      "dev": true,
+      "requires": {
+        "ember-cli-version-checker": "^2.1.0",
+        "ember-factory-for-polyfill": "^1.3.1"
+      },
+      "dependencies": {
+        "ember-cli-version-checker": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz",
+          "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==",
+          "dev": true,
+          "requires": {
+            "resolve": "^1.3.3",
+            "semver": "^5.3.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
     "ember-inflector": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/ember-inflector/-/ember-inflector-4.0.2.tgz",
@@ -10740,6 +10811,61 @@
         "recast": "^0.18.1"
       }
     },
+    "ember-simple-auth": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/ember-simple-auth/-/ember-simple-auth-4.0.2.tgz",
+      "integrity": "sha512-6DoNfesB54ToDMv89r7KFtIR1EFYWurAAlD5KRnnerhBbRH0ws3EK2g7O/8wVJoBuPOuvHZlEnJVCtzp+oauyg==",
+      "dev": true,
+      "requires": {
+        "base-64": "^0.1.0",
+        "broccoli-funnel": "^1.2.0 || ^2.0.0",
+        "ember-cli-babel": "^7.20.5",
+        "ember-cli-is-package-missing": "^1.0.0",
+        "ember-cookies": "^0.5.0",
+        "silent-error": "^1.0.0"
+      },
+      "dependencies": {
+        "broccoli-funnel": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz",
+          "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==",
+          "dev": true,
+          "requires": {
+            "array-equal": "^1.0.0",
+            "blank-object": "^1.0.1",
+            "broccoli-plugin": "^1.3.0",
+            "debug": "^2.2.0",
+            "fast-ordered-set": "^1.0.0",
+            "fs-tree-diff": "^0.5.3",
+            "heimdalljs": "^0.2.0",
+            "minimatch": "^3.0.0",
+            "mkdirp": "^0.5.0",
+            "path-posix": "^1.0.0",
+            "rimraf": "^2.4.3",
+            "symlink-or-copy": "^1.0.0",
+            "walk-sync": "^0.3.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
     "ember-source": {
       "version": "3.28.1",
       "resolved": "https://registry.npmjs.org/ember-source/-/ember-source-3.28.1.tgz",
diff --git a/package.json b/package.json
index 324c13e..5abf140 100644
--- a/package.json
+++ b/package.json
@@ -49,6 +49,7 @@
     "ember-page-title": "^6.2.2",
     "ember-qunit": "^5.1.4",
     "ember-resolver": "^8.0.2",
+    "ember-simple-auth": "^4.0.2",
     "ember-source": "~3.28.0",
     "ember-template-lint": "^3.6.0",
     "eslint": "^7.32.0",
-- 
GitLab