cic-staff-client/docs/compodoc/injectables/AuthService.html

1235 lines
43 KiB
HTML
Raw Normal View History

2021-05-10 20:56:20 +02:00
<!doctype html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>CICADA</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="../images/favicon.ico">
<link rel="stylesheet" href="../styles/style.css">
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top visible-xs">
<a href="../" class="navbar-brand">CICADA</a>
<button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button>
</div>
<div class="xs-menu menu" id="mobile-menu">
<div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div> <compodoc-menu></compodoc-menu>
</div>
<div class="container-fluid main">
<div class="row main">
<div class="hidden-xs menu">
<compodoc-menu mode="normal"></compodoc-menu>
</div>
<!-- START CONTENT -->
<div class="content injectable">
<div class="content-data">
<ol class="breadcrumb">
<li>Injectables</li>
<li>AuthService</li>
</ol>
<ul class="nav nav-tabs" role="tablist">
<li class="active">
<a href="#info" role="tab" id="info-tab" data-toggle="tab" data-link="info">Info</a>
</li>
<li >
<a href="#source" role="tab" id="source-tab" data-toggle="tab" data-link="source">Source</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade active in" id="c-info">
<p class="comment">
<h3>File</h3>
</p>
<p class="comment">
<code>src/app/_services/auth.service.ts</code>
</p>
<section>
<h3 id="index">Index</h3>
<table class="table table-sm table-bordered index-table">
<tbody>
<tr>
<td class="col-md-4">
<h6><b>Properties</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#mutableKeyStore">mutableKeyStore</a>
</li>
<li>
<a href="#sessionLoginCount">sessionLoginCount</a>
</li>
<li>
<a href="#sessionToken">sessionToken</a>
</li>
</ul>
</td>
</tr>
<tr>
<td class="col-md-4">
<h6><b>Methods</b></h6>
</td>
</tr>
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#getChallenge">getChallenge</a>
</li>
<li>
<a href="#getPrivateKey">getPrivateKey</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getPublicKeys">getPublicKeys</a>
</li>
<li>
<a href="#getTrustedUsers">getTrustedUsers</a>
</li>
<li>
<a href="#getWithToken">getWithToken</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#init">init</a>
</li>
<li>
<a href="#login">login</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#loginResponse">loginResponse</a>
</li>
<li>
<a href="#loginView">loginView</a>
</li>
<li>
<a href="#logout">logout</a>
</li>
<li>
<a href="#sendResponse">sendResponse</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#setKey">setKey</a>
</li>
<li>
<a href="#setState">setState</a>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<section>
<h3 id="constructor">Constructor</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<code>constructor(httpClient: <a href="https://angular.io/api/common/http/HttpClient" target="_blank">HttpClient</a>, loggingService: <a href="../injectables/LoggingService.html">LoggingService</a>, errorDialogService: <a href="../injectables/ErrorDialogService.html">ErrorDialogService</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="17" class="link-to-prism">src/app/_services/auth.service.ts:17</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div>
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>httpClient</td>
<td>
<code><a href="https://angular.io/api/common/http/HttpClient" target="_blank" >HttpClient</a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>loggingService</td>
<td>
<code><a href="../injectables/LoggingService.html" target="_self" >LoggingService</a></code>
</td>
<td>
No
</td>
</tr>
<tr>
<td>errorDialogService</td>
<td>
<code><a href="../injectables/ErrorDialogService.html" target="_self" >ErrorDialogService</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section>
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getChallenge"></a>
<span class="name">
<b>
getChallenge
</b>
<a href="#getChallenge"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getChallenge()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="84"
class="link-to-prism">src/app/_services/auth.service.ts:84</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getPrivateKey"></a>
<span class="name">
<b>
getPrivateKey
</b>
<a href="#getPrivateKey"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getPrivateKey()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="206"
class="link-to-prism">src/app/_services/auth.service.ts:206</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getPublicKeys"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
getPublicKeys
</b>
<a href="#getPublicKeys"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>getPublicKeys()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="196"
class="link-to-prism">src/app/_services/auth.service.ts:196</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;any&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getTrustedUsers"></a>
<span class="name">
<b>
getTrustedUsers
</b>
<a href="#getTrustedUsers"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getTrustedUsers()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="190"
class="link-to-prism">src/app/_services/auth.service.ts:190</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getWithToken"></a>
<span class="name">
<b>
getWithToken
</b>
<a href="#getWithToken"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getWithToken()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="42"
class="link-to-prism">src/app/_services/auth.service.ts:42</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="init"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
init
</b>
<a href="#init"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>init()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="27"
class="link-to-prism">src/app/_services/auth.service.ts:27</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;void&gt;</code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="login"></a>
<span class="name">
<b>
login
</b>
<a href="#login"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>login()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="98"
class="link-to-prism">src/app/_services/auth.service.ts:98</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/boolean" target="_blank" >boolean</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="loginResponse"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
loginResponse
</b>
<a href="#loginResponse"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>loginResponse(o: literal type)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="116"
class="link-to-prism">src/app/_services/auth.service.ts:116</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>o</td>
<td>
<code>literal type</code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;any&gt;</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="loginView"></a>
<span class="name">
<b>
loginView
</b>
<a href="#loginView"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>loginView()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="150"
class="link-to-prism">src/app/_services/auth.service.ts:150</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="logout"></a>
<span class="name">
<b>
logout
</b>
<a href="#logout"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>logout()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="184"
class="link-to-prism">src/app/_services/auth.service.ts:184</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="sendResponse"></a>
<span class="name">
<b>
sendResponse
</b>
<a href="#sendResponse"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>sendResponse(hobaResponseEncoded: <a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank">any</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="61"
class="link-to-prism">src/app/_services/auth.service.ts:61</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Type</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>hobaResponseEncoded</td>
<td>
<code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="setKey"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
setKey
</b>
<a href="#setKey"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<span class="modifier-icon icon ion-ios-reset"></span>
<code>setKey(privateKeyArmored)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
2021-05-11 19:51:48 +02:00
<div class="io-line">Defined in <a href="" data-line="156"
class="link-to-prism">src/app/_services/auth.service.ts:156</a></div>
2021-05-10 20:56:20 +02:00
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>privateKeyArmored</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="setState"></a>
<span class="name">
<b>
setState
</b>
<a href="#setState"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>setState(s)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="38"
class="link-to-prism">src/app/_services/auth.service.ts:38</a></div>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-description">
<b>Parameters :</b>
<table class="params">
<thead>
<tr>
<td>Name</td>
<td>Optional</td>
</tr>
</thead>
<tbody>
<tr>
<td>s</td>
<td>
No
</td>
</tr>
</tbody>
</table>
</div>
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
<div class="io-description">
</div>
</td>
</tr>
</tbody>
</table>
</section>
<section>
<h3 id="inputs">
Properties
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="mutableKeyStore"></a>
<span class="name">
<b>
mutableKeyStore</b>
<a href="#mutableKeyStore"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../interfaces/MutableKeyStore.html" target="_self" >MutableKeyStore</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="17" class="link-to-prism">src/app/_services/auth.service.ts:17</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="sessionLoginCount"></a>
<span class="name">
<b>
sessionLoginCount</b>
<a href="#sessionLoginCount"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/number" target="_blank" >number</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>0</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="16" class="link-to-prism">src/app/_services/auth.service.ts:16</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="sessionToken"></a>
<span class="name">
<b>
sessionToken</b>
<a href="#sessionToken"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >any</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="15" class="link-to-prism">src/app/_services/auth.service.ts:15</a></div>
</td>
</tr>
</tbody>
</table>
</section>
</div>
<div class="tab-pane fade tab-source-code" id="c-source">
2021-05-11 19:51:48 +02:00
<pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Injectable } from &#x27;@angular/core&#x27;;
import { hobaParseChallengeHeader } from &#x27;@src/assets/js/hoba.js&#x27;;
import { signChallenge } from &#x27;@src/assets/js/hoba-pgp.js&#x27;;
import { environment } from &#x27;@src/environments/environment&#x27;;
import { LoggingService } from &#x27;@app/_services/logging.service&#x27;;
import { MutableKeyStore, MutablePgpKeyStore } from &#x27;@app/_pgp&#x27;;
import { ErrorDialogService } from &#x27;@app/_services/error-dialog.service&#x27;;
import { HttpClient } from &#x27;@angular/common/http&#x27;;
import { HttpError } from &#x27;@app/_helpers/global-error-handler&#x27;;
2021-05-10 20:56:20 +02:00
@Injectable({
2021-05-11 19:51:48 +02:00
providedIn: &#x27;root&#x27;,
2021-05-10 20:56:20 +02:00
})
export class AuthService {
sessionToken: any;
sessionLoginCount: number &#x3D; 0;
mutableKeyStore: MutableKeyStore;
constructor(
private httpClient: HttpClient,
private loggingService: LoggingService,
private errorDialogService: ErrorDialogService
) {
this.mutableKeyStore &#x3D; new MutablePgpKeyStore();
}
async init(): Promise&lt;void&gt; {
await this.mutableKeyStore.loadKeyring();
// TODO setting these together should be atomic
if (sessionStorage.getItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;))) {
this.sessionToken &#x3D; sessionStorage.getItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
}
if (localStorage.getItem(btoa(&#x27;CICADA_PRIVATE_KEY&#x27;))) {
await this.mutableKeyStore.importPrivateKey(localStorage.getItem(btoa(&#x27;CICADA_PRIVATE_KEY&#x27;)));
}
}
setState(s): void {
document.getElementById(&#x27;state&#x27;).innerHTML &#x3D; s;
}
getWithToken(): void {
const xhr: XMLHttpRequest &#x3D; new XMLHttpRequest();
xhr.responseType &#x3D; &#x27;text&#x27;;
xhr.open(&#x27;GET&#x27;, environment.cicMetaUrl + window.location.search.substring(1));
xhr.setRequestHeader(&#x27;Authorization&#x27;, &#x27;Bearer &#x27; + this.sessionToken);
xhr.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/json&#x27;);
xhr.setRequestHeader(&#x27;x-cic-automerge&#x27;, &#x27;none&#x27;);
xhr.addEventListener(&#x27;load&#x27;, (e) &#x3D;&gt; {
if (xhr.status &#x3D;&#x3D;&#x3D; 401) {
throw new Error(&#x27;login rejected&#x27;);
}
this.sessionLoginCount++;
this.setState(&#x27;Click button to log in&#x27;);
return;
});
xhr.send();
}
// TODO rename to send signed challenge and set session. Also separate these responsibilities
sendResponse(hobaResponseEncoded: any): Promise&lt;boolean&gt; {
return new Promise((resolve, reject) &#x3D;&gt; {
const xhr: XMLHttpRequest &#x3D; new XMLHttpRequest();
xhr.responseType &#x3D; &#x27;text&#x27;;
xhr.open(&#x27;GET&#x27;, environment.cicMetaUrl + window.location.search.substring(1));
xhr.setRequestHeader(&#x27;Authorization&#x27;, &#x27;HOBA &#x27; + hobaResponseEncoded);
xhr.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/json&#x27;);
xhr.setRequestHeader(&#x27;x-cic-automerge&#x27;, &#x27;none&#x27;);
xhr.addEventListener(&#x27;load&#x27;, (e) &#x3D;&gt; {
if (xhr.status !&#x3D;&#x3D; 200) {
2021-05-11 19:51:48 +02:00
const error &#x3D; new HttpError(xhr.statusText, xhr.status);
return reject(error);
2021-05-10 20:56:20 +02:00
}
this.sessionToken &#x3D; xhr.getResponseHeader(&#x27;Token&#x27;);
sessionStorage.setItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;), this.sessionToken);
this.sessionLoginCount++;
this.setState(&#x27;Click button to log in&#x27;);
return resolve(true);
});
xhr.send();
});
}
getChallenge(): void {
const xhr: XMLHttpRequest &#x3D; new XMLHttpRequest();
xhr.responseType &#x3D; &#x27;arraybuffer&#x27;;
xhr.open(&#x27;GET&#x27;, environment.cicMetaUrl + window.location.search.substring(1));
xhr.onload &#x3D; async (e) &#x3D;&gt; {
if (xhr.status &#x3D;&#x3D;&#x3D; 401) {
const authHeader &#x3D; xhr.getResponseHeader(&#x27;WWW-Authenticate&#x27;);
const o &#x3D; hobaParseChallengeHeader(authHeader);
this.loginResponse(o);
}
};
xhr.send();
}
login(): boolean {
if (this.sessionToken !&#x3D;&#x3D; undefined) {
try {
this.getWithToken();
return true;
} catch (e) {
2021-05-11 19:51:48 +02:00
this.loggingService.sendErrorLevelMessage(&#x27;Login token failed&#x27;, this, { error: e });
2021-05-10 20:56:20 +02:00
}
} else {
try {
this.getChallenge();
} catch (e) {
2021-05-11 19:51:48 +02:00
this.loggingService.sendErrorLevelMessage(&#x27;Login challenge failed&#x27;, this, { error: e });
2021-05-10 20:56:20 +02:00
}
}
return false;
}
2021-05-11 19:51:48 +02:00
async loginResponse(o: { challenge: string; realm: any }): Promise&lt;any&gt; {
2021-05-10 20:56:20 +02:00
return new Promise(async (resolve, reject) &#x3D;&gt; {
try {
2021-05-11 19:51:48 +02:00
const r &#x3D; await signChallenge(
o.challenge,
o.realm,
environment.cicMetaUrl,
this.mutableKeyStore
);
2021-05-10 20:56:20 +02:00
const sessionTokenResult: boolean &#x3D; await this.sendResponse(r);
} catch (error) {
if (error instanceof HttpError) {
if (error.status &#x3D;&#x3D;&#x3D; 403) {
2021-05-11 19:51:48 +02:00
this.errorDialogService.openDialog({
message: &#x27;You are not authorized to use this system&#x27;,
});
2021-05-10 20:56:20 +02:00
}
if (error.status &#x3D;&#x3D;&#x3D; 401) {
this.errorDialogService.openDialog({
2021-05-11 19:51:48 +02:00
message:
&#x27;Unable to authenticate with the service. &#x27; +
2021-05-10 20:56:20 +02:00
&#x27;Please speak with the staff at Grassroots &#x27; +
&#x27;Economics for requesting access &#x27; +
2021-05-11 19:51:48 +02:00
&#x27;staff@grassrootseconomics.net.&#x27;,
2021-05-10 20:56:20 +02:00
});
}
}
// TODO define this error
2021-05-11 19:51:48 +02:00
this.errorDialogService.openDialog({ message: &#x27;Incorrect key passphrase.&#x27; });
2021-05-10 20:56:20 +02:00
resolve(false);
}
});
}
loginView(): void {
document.getElementById(&#x27;one&#x27;).style.display &#x3D; &#x27;none&#x27;;
document.getElementById(&#x27;two&#x27;).style.display &#x3D; &#x27;block&#x27;;
this.setState(&#x27;Click button to log in with PGP key &#x27; + this.mutableKeyStore.getPrivateKeyId());
}
async setKey(privateKeyArmored): Promise&lt;boolean&gt; {
try {
const isValidKeyCheck &#x3D; await this.mutableKeyStore.isValidKey(privateKeyArmored);
if (!isValidKeyCheck) {
throw Error(&#x27;The private key is invalid&#x27;);
}
// TODO leaving this out for now.
// const isEncryptedKeyCheck &#x3D; await this.mutableKeyStore.isEncryptedPrivateKey(privateKeyArmored);
// if (!isEncryptedKeyCheck) {
// throw Error(&#x27;The private key doesn\&#x27;t have a password!&#x27;);
// }
const key &#x3D; await this.mutableKeyStore.importPrivateKey(privateKeyArmored);
localStorage.setItem(btoa(&#x27;CICADA_PRIVATE_KEY&#x27;), privateKeyArmored);
} catch (err) {
2021-05-11 19:51:48 +02:00
this.loggingService.sendErrorLevelMessage(
&#x60;Failed to set key: ${err.message || err.statusText}&#x60;,
this,
{ error: err }
);
2021-05-10 20:56:20 +02:00
this.errorDialogService.openDialog({
message: &#x60;Failed to set key: ${err.message || err.statusText}&#x60;,
});
return false;
}
this.loginView();
return true;
}
logout(): void {
sessionStorage.removeItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
this.sessionToken &#x3D; undefined;
2021-05-11 19:51:48 +02:00
window.location.reload();
2021-05-10 20:56:20 +02:00
}
getTrustedUsers(): any {
const trustedUsers: Array&lt;any&gt; &#x3D; [];
2021-05-11 19:51:48 +02:00
this.mutableKeyStore.getPublicKeys().forEach((key) &#x3D;&gt; trustedUsers.push(key.users[0].userId));
2021-05-10 20:56:20 +02:00
return trustedUsers;
}
async getPublicKeys(): Promise&lt;any&gt; {
2021-05-11 19:51:48 +02:00
return await fetch(environment.publicKeysUrl).then((res) &#x3D;&gt; {
if (!res.ok) {
// TODO does angular recommend an error interface?
throw Error(&#x60;${res.statusText} - ${res.status}&#x60;);
}
return res.text();
});
2021-05-10 20:56:20 +02:00
}
getPrivateKey(): any {
2021-05-11 19:51:48 +02:00
return this.mutableKeyStore.getPrivateKey();
2021-05-10 20:56:20 +02:00
}
}
</code></pre>
</div>
</div>
</div><div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> result-matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
<!-- END CONTENT -->
</div>
</div>
<script>
var COMPODOC_CURRENT_PAGE_DEPTH = 1;
var COMPODOC_CURRENT_PAGE_CONTEXT = 'injectable';
var COMPODOC_CURRENT_PAGE_URL = 'AuthService.html';
var MAX_SEARCH_RESULTS = 15;
</script>
<script src="../js/libs/custom-elements.min.js"></script>
<script src="../js/libs/lit-html.js"></script>
<!-- Required to polyfill modern browsers as code is ES5 for IE... -->
<script src="../js/libs/custom-elements-es5-adapter.js" charset="utf-8" defer></script>
<script src="../js/menu-wc.js" defer></script>
<script src="../js/libs/bootstrap-native.js"></script>
<script src="../js/libs/es6-shim.min.js"></script>
<script src="../js/libs/EventDispatcher.js"></script>
<script src="../js/libs/promise.min.js"></script>
<script src="../js/libs/zepto.min.js"></script>
<script src="../js/compodoc.js"></script>
<script src="../js/tabs.js"></script>
<script src="../js/menu.js"></script>
<script src="../js/libs/clipboard.min.js"></script>
<script src="../js/libs/prism.js"></script>
<script src="../js/sourceCode.js"></script>
<script src="../js/search/search.js"></script>
<script src="../js/search/lunr.min.js"></script>
<script src="../js/search/search-lunr.js"></script>
<script src="../js/search/search_index.js"></script>
<script src="../js/lazy-load-graphs.js"></script>
</body>
</html>