workaround logout bug

This commit is contained in:
AJ ONeal 2018-08-20 17:42:59 +00:00
parent ec65fe31cc
commit 168b2edfd6
2 changed files with 65 additions and 47 deletions

View File

@ -5,27 +5,30 @@
<body> <body>
<div class="v-app"> <div class="v-app">
<div v-if="spinner" style="position: absolute; width: 100%; height: 100%; background-color: #ddd;">Loading... </div>
<div v-if="!hasAccount"> <div v-if="!hasAccount">
<h1>Login</h1> <h1>Login</h1>
<form class="js-auth-form"> <form class="js-auth-form" v-on:submit.prevent="login()">
<input class="js-auth-subject" placeholder="email" type="email" required/> <input class="js-auth-subject" v-model="newEmail" placeholder="email" type="email" required/>
<button class="js-auth-submit" type="submit">Login</button> <button class="js-auth-submit" type="submit">Login</button>
</form> </form>
</div> </div>
<div v-if="hasAccount"> <div v-if="hasAccount">
<h1>Account</h1> <h1>Account</h1>
<button v-on:click.prevent.stop="logout()" type="click">Logout</button>
<form v-on:submit.prevent="challengeDns()"> <form v-on:submit.prevent="challengeDns()">
Add a custom domain: Add a custom domain:
<input v-model="newDomain" placeholder="example.com" type="text" required/> <input v-model="newDomain" placeholder="example.com" type="text" required/>
<button type="submit">Next</button> <button type="submit">Next</button>
</form> </form>
<form v-on:submit.prevent="challengeEmail()"> <!-- not yet -->
<!--form v-on:submit.prevent="challengeEmail()">
Authorize another email: Authorize another email:
<input v-model="newEmail" placeholder="jon@example.com" type="email" required/> <input v-model="newEmail" placeholder="jon@example.com" type="email" required/>
<button type="submit">Next</button> <button type="submit">Next</button>
</form> </form-->
<h3>Claims</h3> <h3>Claims</h3>
<p>If your DNS host supports ANAME records, please use those instead of CNAMEs.</p> <p>If your DNS host supports ANAME records, please use those instead of CNAMEs.</p>
<p>If CNAMEs are not supported, set an A record to {{ site.deviceDomainA }}.</p> <p>If CNAMEs are not supported, set an A record to {{ site.deviceDomainA }}.</p>

View File

@ -6,7 +6,7 @@
host: window.location.host host: window.location.host
, pathname: window.location.pathname.replace(/\/[^\/]*$/, '/') , pathname: window.location.pathname.replace(/\/[^\/]*$/, '/')
}); });
var $ = function () { return document.querySelector.apply(document, arguments); }; //var $ = function () { return document.querySelector.apply(document, arguments); };
var sessionStr = localStorage.getItem('session'); var sessionStr = localStorage.getItem('session');
var session; var session;
if (sessionStr) { if (sessionStr) {
@ -29,46 +29,58 @@
, newEmail: null , newEmail: null
, hasAccount: false , hasAccount: false
, token: null , token: null
, spinner: false
, site: { deviceDomain: document.location.hostname, deviceDomainA: dnsRecords[document.location.hostname] } , site: { deviceDomain: document.location.hostname, deviceDomainA: dnsRecords[document.location.hostname] }
}; };
var vueMethods = {
challengeDns: function () {
// we could do a checkbox
var wildcard = vueData.newDomainWildcard || false;
if (!/(\*\.)?[a-z0-9][a-z0-9\.\-_]\.[a-z0-9]{2,}/.test(vueData.newDomain)) {
window.alert("invalid domain name '" + vueData.newDomain + "'");
return;
}
// we can just detect by text
if ('*.' === vueData.newDomain.slice(0, 2)) {
vueData.newDomain = vueData.newDomain.slice(2);
wildcard = true;
}
return oauth3.request({
url: 'https://api.' + location.hostname + '/api/telebit.cloud/account/authorizations/new'
, method: 'POST'
, session: session
, data: { type: 'dns', value: vueData.newDomain, wildcard: wildcard }
}).then(function (resp) {
vueData.claims.unshift(resp.data.claim);
});
}
, checkDns: function (claim) {
return oauth3.request({
url: 'https://api.' + location.hostname + '/api/telebit.cloud/account/authorizations/new/:value/:challenge'
.replace(/:value/g, claim.value)
.replace(/:challenge/g, claim.challenge)
, method: 'POST'
, session: session
});
}
, challengeEmail: function () {
console.log("A new (Email) challenger!", vueData);
}
, login: function () {
var email = vueData.newEmail;
vueMethods.logout();
onClickLogin(email);
}
, logout: function () {
sessionStorage.clear();
vueData.hasAccount = false;
// TODO OAUTH3._logoutHelper(directives, opts)
}
};
var app = new Vue({ var app = new Vue({
el: '.v-app' el: '.v-app'
, data: vueData , data: vueData
, methods: { , methods: vueMethods
challengeDns: function () {
// we could do a checkbox
var wildcard = vueData.newDomainWildcard || false;
if (!/(\*\.)?[a-z0-9][a-z0-9\.\-_]\.[a-z0-9]{2,}/.test(vueData.newDomain)) {
window.alert("invalid domain name '" + vueData.newDomain + "'");
return;
}
// we can just detect by text
if ('*.' === vueData.newDomain.slice(0, 2)) {
vueData.newDomain = vueData.newDomain.slice(2);
wildcard = true;
}
return oauth3.request({
url: 'https://api.' + location.hostname + '/api/telebit.cloud/account/authorizations/new'
, method: 'POST'
, session: session
, data: { type: 'dns', value: vueData.newDomain, wildcard: wildcard }
}).then(function (resp) {
vueData.claims.unshift(resp.data.claim);
});
}
, checkDns: function (claim) {
return oauth3.request({
url: 'https://api.' + location.hostname + '/api/telebit.cloud/account/authorizations/new/:value/:challenge'
.replace(/:value/g, claim.value)
.replace(/:challenge/g, claim.challenge)
, method: 'POST'
, session: session
});
}
, challengeEmail: function () {
console.log("A new (Email) challenger!", vueData);
}
}
}); });
app = null; app = null;
@ -121,13 +133,9 @@
// This opens up the login window for the specified provider // This opens up the login window for the specified provider
// //
function onClickLogin(ev) { function onClickLogin(email) {
ev.preventDefault();
ev.stopPropagation();
var email = $('.js-auth-subject').value;
// TODO check subject for provider viability // TODO check subject for provider viability
vueData.spinner = true;
return oauth3.authenticate({ return oauth3.authenticate({
subject: email subject: email
, scope: 'email@oauth3.org' , scope: 'email@oauth3.org'
@ -168,10 +176,17 @@
}, function (err) { }, function (err) {
console.error('Authentication Failed:'); console.error('Authentication Failed:');
console.log(err); console.log(err);
}).then(function () {
vueData.spinner = false;
}); });
} }
$('body form.js-auth-form').addEventListener('submit', onClickLogin); //$('body form.js-auth-form').addEventListener('submit', function onClickLoginHelper(ev) {
// ev.preventDefault();
// ev.stopPropagation();
// var email = $('.js-auth-subject').value;
// onClickLogin(email);
//});
onChangeProvider('oauth3.org'); onChangeProvider('oauth3.org');
if (session) { if (session) {
vueData.token = session.access_token; vueData.token = session.access_token;