Update docs.

This commit is contained in:
Spencer Ofwiti
2021-06-14 14:28:53 +03:00
parent 7923c63aa8
commit 4ed3d108cb
94 changed files with 10372 additions and 2785 deletions

View File

@@ -78,10 +78,14 @@
<a href="#mutableKeyStore">mutableKeyStore</a>
</li>
<li>
<a href="#sessionLoginCount">sessionLoginCount</a>
<a href="#trustedUsers">trustedUsers</a>
</li>
<li>
<a href="#sessionToken">sessionToken</a>
<span class="modifier">Private</span>
<a href="#trustedUsersList">trustedUsersList</a>
</li>
<li>
<a href="#trustedUsersSubject">trustedUsersSubject</a>
</li>
</ul>
</td>
@@ -95,16 +99,25 @@
<tr>
<td class="col-md-4">
<ul class="index-list">
<li>
<a href="#addTrustedUser">addTrustedUser</a>
</li>
<li>
<a href="#getChallenge">getChallenge</a>
</li>
<li>
<a href="#getPrivateKey">getPrivateKey</a>
</li>
<li>
<a href="#getPrivateKeyInfo">getPrivateKeyInfo</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#getPublicKeys">getPublicKeys</a>
</li>
<li>
<a href="#getSessionToken">getSessionToken</a>
</li>
<li>
<a href="#getTrustedUsers">getTrustedUsers</a>
</li>
@@ -115,12 +128,9 @@
<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>
<a href="#login">login</a>
</li>
<li>
<a href="#loginView">loginView</a>
@@ -129,12 +139,15 @@
<a href="#logout">logout</a>
</li>
<li>
<a href="#sendResponse">sendResponse</a>
<a href="#sendSignedChallenge">sendSignedChallenge</a>
</li>
<li>
<span class="modifier">Async</span>
<a href="#setKey">setKey</a>
</li>
<li>
<a href="#setSessionToken">setSessionToken</a>
</li>
<li>
<a href="#setState">setState</a>
</li>
@@ -161,7 +174,7 @@
</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>
<div class="io-line">Defined in <a href="" data-line="22" class="link-to-prism">src/app/_services/auth.service.ts:22</a></div>
</td>
</tr>
@@ -228,6 +241,76 @@
<h3 id="methods">
Methods
</h3>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="addTrustedUser"></a>
<span class="name">
<b>
addTrustedUser
</b>
<a href="#addTrustedUser"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>addTrustedUser(user: <a href="../interfaces/Staff.html">Staff</a>)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="173"
class="link-to-prism">src/app/_services/auth.service.ts:173</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>user</td>
<td>
<code><a href="../interfaces/Staff.html" target="_self" >Staff</a></code>
</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>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -250,8 +333,8 @@
<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>
<div class="io-line">Defined in <a href="" data-line="85"
class="link-to-prism">src/app/_services/auth.service.ts:85</a></div>
</td>
</tr>
@@ -260,7 +343,7 @@
<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>
<b>Returns : </b> <code>Promise&lt;any&gt;</code>
</div>
</td>
@@ -289,8 +372,47 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="210"
class="link-to-prism">src/app/_services/auth.service.ts:210</a></div>
<div class="io-line">Defined in <a href="" data-line="203"
class="link-to-prism">src/app/_services/auth.service.ts:203</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" >any</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getPrivateKeyInfo"></a>
<span class="name">
<b>
getPrivateKeyInfo
</b>
<a href="#getPrivateKeyInfo"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getPrivateKeyInfo()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="207"
class="link-to-prism">src/app/_services/auth.service.ts:207</a></div>
</td>
</tr>
@@ -330,8 +452,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="200"
class="link-to-prism">src/app/_services/auth.service.ts:200</a></div>
<div class="io-line">Defined in <a href="" data-line="191"
class="link-to-prism">src/app/_services/auth.service.ts:191</a></div>
</td>
</tr>
@@ -347,6 +469,45 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="getSessionToken"></a>
<span class="name">
<b>
getSessionToken
</b>
<a href="#getSessionToken"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>getSessionToken()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="39"
class="link-to-prism">src/app/_services/auth.service.ts:39</a></div>
</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/string" target="_blank" >string</a></code>
</div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -369,8 +530,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="194"
class="link-to-prism">src/app/_services/auth.service.ts:194</a></div>
<div class="io-line">Defined in <a href="" data-line="185"
class="link-to-prism">src/app/_services/auth.service.ts:185</a></div>
</td>
</tr>
@@ -379,7 +540,7 @@
<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>
<b>Returns : </b> <code><a href="https://www.typescriptlang.org/docs/handbook/basic-types.html" target="_blank" >void</a></code>
</div>
</td>
@@ -408,8 +569,8 @@
<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>
<div class="io-line">Defined in <a href="" data-line="51"
class="link-to-prism">src/app/_services/auth.service.ts:51</a></div>
</td>
</tr>
@@ -418,7 +579,7 @@
<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>
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
</div>
</td>
@@ -449,8 +610,8 @@
<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>
<div class="io-line">Defined in <a href="" data-line="32"
class="link-to-prism">src/app/_services/auth.service.ts:32</a></div>
</td>
</tr>
@@ -473,6 +634,7 @@
<a name="login"></a>
<span class="name">
<b>
<span class="modifier">Async</span>
login
</b>
<a href="#login"><span class="icon ion-ios-link"></span></a>
@@ -481,56 +643,16 @@
</tr>
<tr>
<td class="col-md-4">
<code>login()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="98"
class="link-to-prism">src/app/_services/auth.service.ts:98</a></div>
</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>
<code>login()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="116"
class="link-to-prism">src/app/_services/auth.service.ts:116</a></div>
<div class="io-line">Defined in <a href="" data-line="94"
class="link-to-prism">src/app/_services/auth.service.ts:94</a></div>
</td>
</tr>
@@ -539,39 +661,8 @@
<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>
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
<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>
@@ -599,8 +690,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="150"
class="link-to-prism">src/app/_services/auth.service.ts:150</a></div>
<div class="io-line">Defined in <a href="" data-line="129"
class="link-to-prism">src/app/_services/auth.service.ts:129</a></div>
</td>
</tr>
@@ -638,8 +729,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="188"
class="link-to-prism">src/app/_services/auth.service.ts:188</a></div>
<div class="io-line">Defined in <a href="" data-line="167"
class="link-to-prism">src/app/_services/auth.service.ts:167</a></div>
</td>
</tr>
@@ -659,26 +750,26 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="sendResponse"></a>
<a name="sendSignedChallenge"></a>
<span class="name">
<b>
sendResponse
sendSignedChallenge
</b>
<a href="#sendResponse"><span class="icon ion-ios-link"></span></a>
<a href="#sendSignedChallenge"><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>
<code>sendSignedChallenge(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>
<div class="io-line">Defined in <a href="" data-line="73"
class="link-to-prism">src/app/_services/auth.service.ts:73</a></div>
</td>
</tr>
@@ -715,7 +806,7 @@
<div>
</div>
<div class="io-description">
<b>Returns : </b> <code>Promise&lt;boolean&gt;</code>
<b>Returns : </b> <code>Promise&lt;any&gt;</code>
</div>
<div class="io-description">
@@ -749,8 +840,8 @@
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="160"
class="link-to-prism">src/app/_services/auth.service.ts:160</a></div>
<div class="io-line">Defined in <a href="" data-line="139"
class="link-to-prism">src/app/_services/auth.service.ts:139</a></div>
</td>
</tr>
@@ -800,6 +891,72 @@
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="setSessionToken"></a>
<span class="name">
<b>
setSessionToken
</b>
<a href="#setSessionToken"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<code>setSessionToken(token)</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="43"
class="link-to-prism">src/app/_services/auth.service.ts:43</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>token</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>
<table class="table table-sm table-bordered">
<tbody>
<tr>
@@ -822,8 +979,8 @@
<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>
<div class="io-line">Defined in <a href="" data-line="47"
class="link-to-prism">src/app/_services/auth.service.ts:47</a></div>
</td>
</tr>
@@ -903,28 +1060,28 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="sessionLoginCount"></a>
<a name="trustedUsers"></a>
<span class="name">
<b>
sessionLoginCount</b>
<a href="#sessionLoginCount"><span class="icon ion-ios-link"></span></a>
trustedUsers</b>
<a href="#trustedUsers"><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>
<i>Type : </i> <code><a href="../interfaces/Staff.html" target="_self" >Array&lt;Staff&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>0</code>
<i>Default value : </i><code>[]</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>
<div class="io-line">Defined in <a href="" data-line="18" class="link-to-prism">src/app/_services/auth.service.ts:18</a></div>
</td>
</tr>
@@ -935,23 +1092,63 @@
<tbody>
<tr>
<td class="col-md-4">
<a name="sessionToken"></a>
<a name="trustedUsersList"></a>
<span class="name">
<b>
sessionToken</b>
<a href="#sessionToken"><span class="icon ion-ios-link"></span></a>
<span class="modifier">Private</span>
trustedUsersList</b>
<a href="#trustedUsersList"><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>
<i>Type : </i> <code><a href="../interfaces/Staff.html" target="_self" >BehaviorSubject&lt;Array&lt;Staff&gt;&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>new BehaviorSubject&lt;Array&lt;Staff&gt;&gt;(
this.trustedUsers
)</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>
<div class="io-line">Defined in <a href="" data-line="19" class="link-to-prism">src/app/_services/auth.service.ts:19</a></div>
</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<td class="col-md-4">
<a name="trustedUsersSubject"></a>
<span class="name">
<b>
trustedUsersSubject</b>
<a href="#trustedUsersSubject"><span class="icon ion-ios-link"></span></a>
</span>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Type : </i> <code><a href="../interfaces/Staff.html" target="_self" >Observable&lt;Array&lt;Staff&gt;&gt;</a></code>
</td>
</tr>
<tr>
<td class="col-md-4">
<i>Default value : </i><code>this.trustedUsersList.asObservable()</code>
</td>
</tr>
<tr>
<td class="col-md-4">
<div class="io-line">Defined in <a href="" data-line="22" class="link-to-prism">src/app/_services/auth.service.ts:22</a></div>
</td>
</tr>
@@ -972,15 +1169,20 @@ 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;;
import { HttpError, rejectBody } from &#x27;@app/_helpers/global-error-handler&#x27;;
import { Staff } from &#x27;@app/_models&#x27;;
import { BehaviorSubject, Observable } from &#x27;rxjs&#x27;;
@Injectable({
providedIn: &#x27;root&#x27;,
})
export class AuthService {
sessionToken: any;
sessionLoginCount: number &#x3D; 0;
mutableKeyStore: MutableKeyStore;
trustedUsers: Array&lt;Staff&gt; &#x3D; [];
private trustedUsersList: BehaviorSubject&lt;Array&lt;Staff&gt;&gt; &#x3D; new BehaviorSubject&lt;Array&lt;Staff&gt;&gt;(
this.trustedUsers
);
trustedUsersSubject: Observable&lt;Array&lt;Staff&gt;&gt; &#x3D; this.trustedUsersList.asObservable();
constructor(
private httpClient: HttpClient,
@@ -992,127 +1194,101 @@ export class AuthService {
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;)));
}
}
getSessionToken(): string {
return sessionStorage.getItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
}
setSessionToken(token): void {
sessionStorage.setItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;), token);
}
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;);
getWithToken(): Promise&lt;boolean&gt; {
const headers &#x3D; {
Authorization: &#x27;Bearer &#x27; + this.getSessionToken,
&#x27;Content-Type&#x27;: &#x27;application/json;charset&#x3D;utf-8&#x27;,
&#x27;x-cic-automerge&#x27;: &#x27;none&#x27;,
};
const options &#x3D; {
headers,
};
return fetch(environment.cicMetaUrl, options).then((response) &#x3D;&gt; {
if (!response.ok) {
this.loggingService.sendErrorLevelMessage(&#x27;failed to get with auth token.&#x27;, this, {
error: &#x27;&#x27;,
});
return false;
}
this.sessionLoginCount++;
this.setState(&#x27;Click button to log in&#x27;);
return;
return true;
});
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) {
const error &#x3D; new HttpError(xhr.statusText, xhr.status);
return reject(error);
}
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);
}
sendSignedChallenge(hobaResponseEncoded: any): Promise&lt;any&gt; {
const headers &#x3D; {
Authorization: &#x27;HOBA &#x27; + hobaResponseEncoded,
&#x27;Content-Type&#x27;: &#x27;application/json;charset&#x3D;utf-8&#x27;,
&#x27;x-cic-automerge&#x27;: &#x27;none&#x27;,
};
xhr.send();
const options &#x3D; {
headers,
};
return fetch(environment.cicMetaUrl, options);
}
login(): boolean {
if (this.sessionToken !&#x3D;&#x3D; undefined) {
try {
this.getWithToken();
return true;
} catch (e) {
this.loggingService.sendErrorLevelMessage(&#x27;Login token failed&#x27;, this, { error: e });
}
} else {
try {
this.getChallenge();
} catch (e) {
this.loggingService.sendErrorLevelMessage(&#x27;Login challenge failed&#x27;, this, { error: e });
}
}
return false;
}
async loginResponse(o: { challenge: string; realm: any }): Promise&lt;any&gt; {
return new Promise(async (resolve, reject) &#x3D;&gt; {
try {
const r &#x3D; await signChallenge(
o.challenge,
o.realm,
environment.cicMetaUrl,
this.mutableKeyStore
);
const sessionTokenResult: boolean &#x3D; await this.sendResponse(r);
} catch (error) {
if (error instanceof HttpError) {
if (error.status &#x3D;&#x3D;&#x3D; 403) {
this.errorDialogService.openDialog({
message: &#x27;You are not authorized to use this system&#x27;,
});
}
if (error.status &#x3D;&#x3D;&#x3D; 401) {
this.errorDialogService.openDialog({
message:
&#x27;Unable to authenticate with the service. &#x27; +
&#x27;Please speak with the staff at Grassroots &#x27; +
&#x27;Economics for requesting access &#x27; +
&#x27;staff@grassrootseconomics.net.&#x27;,
});
}
}
// TODO define this error
this.errorDialogService.openDialog({ message: &#x27;Incorrect key passphrase.&#x27; });
resolve(false);
getChallenge(): Promise&lt;any&gt; {
return fetch(environment.cicMetaUrl).then((response) &#x3D;&gt; {
if (response.status &#x3D;&#x3D;&#x3D; 401) {
const authHeader: string &#x3D; response.headers.get(&#x27;WWW-Authenticate&#x27;);
return hobaParseChallengeHeader(authHeader);
}
});
}
async login(): Promise&lt;boolean&gt; {
if (this.getSessionToken()) {
sessionStorage.removeItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
} else {
const o &#x3D; await this.getChallenge();
const r &#x3D; await signChallenge(
o.challenge,
o.realm,
environment.cicMetaUrl,
this.mutableKeyStore
);
const tokenResponse &#x3D; await this.sendSignedChallenge(r).then((response) &#x3D;&gt; {
const token &#x3D; response.headers.get(&#x27;Token&#x27;);
if (token) {
return token;
}
if (response.status &#x3D;&#x3D;&#x3D; 401) {
throw new HttpError(&#x27;You are not authorized to use this system&#x27;, response.status);
}
if (!response.ok) {
throw new HttpError(&#x27;Unknown error from authentication server&#x27;, response.status);
}
});
if (tokenResponse) {
this.setSessionToken(tokenResponse);
this.setState(&#x27;Click button to log in&#x27;);
return true;
}
return 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;;
@@ -1153,29 +1329,47 @@ export class AuthService {
logout(): void {
sessionStorage.removeItem(btoa(&#x27;CICADA_SESSION_TOKEN&#x27;));
this.sessionToken &#x3D; undefined;
localStorage.removeItem(btoa(&#x27;CICADA_PRIVATE_KEY&#x27;));
window.location.reload();
}
getTrustedUsers(): any {
const trustedUsers: Array&lt;any&gt; &#x3D; [];
this.mutableKeyStore.getPublicKeys().forEach((key) &#x3D;&gt; trustedUsers.push(key.users[0].userId));
return trustedUsers;
addTrustedUser(user: Staff): void {
const savedIndex &#x3D; this.trustedUsers.findIndex((staff) &#x3D;&gt; staff.userid &#x3D;&#x3D;&#x3D; user.userid);
if (savedIndex &#x3D;&#x3D;&#x3D; 0) {
return;
}
if (savedIndex &gt; 0) {
this.trustedUsers.splice(savedIndex, 1);
}
this.trustedUsers.unshift(user);
this.trustedUsersList.next(this.trustedUsers);
}
getTrustedUsers(): void {
this.mutableKeyStore.getPublicKeys().forEach((key) &#x3D;&gt; {
this.addTrustedUser(key.users[0].userId);
});
}
async getPublicKeys(): Promise&lt;any&gt; {
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();
return new Promise((resolve, reject) &#x3D;&gt; {
fetch(environment.publicKeysUrl).then((res) &#x3D;&gt; {
if (!res.ok) {
// TODO does angular recommend an error interface?
return reject(rejectBody(res));
}
return resolve(res.text());
});
});
}
getPrivateKey(): any {
return this.mutableKeyStore.getPrivateKey();
}
getPrivateKeyInfo(): any {
return this.getPrivateKey().users[0].userId;
}
}
</code></pre>
</div>