Skip to content

Commit bcbc692

Browse files
authored
Merge pull request #314 from webkom/qrv2
QR v2
2 parents 608d697 + 47989e7 commit bcbc692

File tree

8 files changed

+187
-137
lines changed

8 files changed

+187
-137
lines changed

.eslintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"prettier"
55
],
66
"parserOptions": {
7-
"ecmaVersion": 8
7+
"ecmaVersion": 8,
8+
"sourceType": "module"
89
},
910
"rules": {
1011
"no-unused-vars": [2, { "args": "none" }],

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dist
3535
db
3636
public/bundle.js
3737
public/login.js
38+
public/*.js
3839
public/main.css
3940
screenshots
4041
*.mp4

app/routes/auth.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ router.post(
2424
}),
2525
(req, res) => {
2626
// If the user tried to access a specific page before, redirect there:
27-
const path = req.session.originalPath || '/';
28-
res.redirect(path);
27+
// TODO FIXME
28+
//const path = req.session.originalPath || '/';
29+
res.redirect('/');
2930
}
3031
);
3132

app/views/login.pug

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ block scripts
66
block content
77
.container: .row
88
.col-xs-12.col-sm-4.col-sm-offset-4.col-md-4.text-center
9+
video(id="testing", muted, playsinline, style="width: 100%")
10+
br
911
form(action='/auth/login', method='post', role='form')
1012
input(type='hidden', name='_csrf', value=csrfToken)
1113
.form-group
@@ -18,17 +20,17 @@ block content
1820
input(name='usingToken', class='hidden', value='false')
1921
if feedback
2022
p= feedback
21-
23+
2224
div(class="hidden", id="alertInfo")
23-
div(class="alert alert-info")
24-
h5 Velkommen til VOTE
25-
p Du har nå fått bruker, og er nesten klar til å logge inn.
26-
p
27-
span Før du logger inn, <b>MÅ DU</b> ta screenshot av innloggingsinformasjonenen
28-
span sånn at du kan logge inn på andre enheter, samt logge inn her hvis du blir logget ut.
25+
img(id="qrImg" width="50%")
26+
div(class="alert alert-danger")
27+
p
28+
b Velkommen til VOTE
29+
p Ta <b>screenshot</b> av denne siden for å lagre brukernavn og passord
2930

3031

3132
button(class='btn btn-default', type='submit') Logg på
33+
br
3234

3335
div(id="confirmScreenshot" class="hidden")
34-
button(class='btn btn-default' ) JA, jeg har tatt screenshot
36+
button(class='btn btn-default' ) Jeg har tatt screenshot

client/login.js

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,75 @@
1+
import QrScanner from 'qr-scanner';
2+
import QRCode from 'qrcode';
3+
import QrScannerWorkerPath from '!!file-loader!qr-scanner/qr-scanner-worker.min.js';
4+
QrScanner.WORKER_PATH = QrScannerWorkerPath;
15
if ('addEventListener' in document) {
26
document.addEventListener('DOMContentLoaded', function() {
3-
const urlParams = new URLSearchParams(window.location.search);
4-
const token = urlParams.get('token');
5-
if (!token) return;
7+
const getTokenFromUrl = url => {
8+
const urlParams = new URLSearchParams(getLocation(url).search);
9+
return urlParams.get('token');
10+
};
11+
const getLocation = function(href) {
12+
var l = document.createElement('a');
13+
l.href = href;
14+
return l;
15+
};
16+
const doTokenThing = url => {
17+
try {
18+
const [u, p, code] = getTokenFromUrl(url).split(':');
19+
document.querySelector('[name=password]').value = p;
20+
document.querySelector('[name=password]').type = 'text';
621

7-
try {
8-
const [u, p, code] = token.split(':');
9-
document.querySelector('[name=password]').value = p;
10-
document.querySelector('[name=password]').type = 'text';
22+
document.querySelector('#alertInfo').setAttribute('class', '');
1123

12-
document.querySelector('#alertInfo').setAttribute('class', '');
24+
document.querySelector('[name=usingToken]').value = true;
1325

14-
document.querySelector('[name=usingToken]').value = true;
26+
document.querySelector('[name=username]').value = u;
27+
document
28+
.querySelector('[name=username]')
29+
.setAttribute('readonly', 'readonly');
1530

16-
document.querySelector('[name=username]').value = u;
17-
document
18-
.querySelector('[name=username]')
19-
.setAttribute('readonly', 'readonly');
31+
document
32+
.querySelector('[name=password]')
33+
.setAttribute('readonly', 'readonly');
2034

21-
document
22-
.querySelector('[name=password]')
23-
.setAttribute('readonly', 'readonly');
35+
document.querySelector('[type=submit]').style.display = 'none';
36+
document.querySelector('#testing').style.display = 'none';
2437

25-
document.querySelector('[type=submit]').style.display = 'none';
38+
document
39+
.querySelector('[id=confirmScreenshot]')
40+
.setAttribute('class', '');
41+
document.querySelector('[id=confirmScreenshot]').onclick = function(e) {
42+
e.target.setAttribute('class', 'hidden');
43+
document.querySelector('[type=submit]').style.display = '';
44+
};
2645

27-
document
28-
.querySelector('[id=confirmScreenshot]')
29-
.setAttribute('class', '');
30-
document.querySelector('[id=confirmScreenshot]').onclick = function(e) {
31-
e.target.setAttribute('class', 'hidden');
32-
document.querySelector('[type=submit]').style.display = '';
33-
};
34-
35-
fetch('/api/qr/open/?code=' + code);
36-
} catch (e) {
37-
/* eslint no-console: 0 */
38-
console.warn('Unable to decode token: ', e);
46+
fetch('/api/qr/open/?code=' + code);
47+
QRCode.toDataURL(url, { type: 'image/png', width: 300 }, function(
48+
err,
49+
url
50+
) {
51+
document.querySelector('[id=qrImg]').setAttribute('src', url);
52+
});
53+
} catch (e) {
54+
alert('Det skjedde en feil. Prøv på nytt');
55+
/* eslint no-console: 0 */
56+
console.warn('Unable to decode token: ', e);
57+
}
58+
};
59+
const token = getTokenFromUrl(window.location.href);
60+
if (token) {
61+
doTokenThing(window.location.href);
62+
} else {
63+
QrScanner.hasCamera();
64+
const qrScanner = new QrScanner(
65+
document.getElementById('testing'),
66+
result => {
67+
doTokenThing(result);
68+
console.log('dsadasdsads');
69+
}
70+
);
71+
qrScanner.start();
72+
return;
3973
}
4074
});
4175
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
"passport-stub": "1.1.1",
6060
"promptly": "2.1.0",
6161
"pug": "2.0.3",
62+
"qr-scanner": "1.1.1",
6263
"qrcode": "1.3.3",
6364
"raven": "2.6.4",
6465
"serve-favicon": "2.5.0",
@@ -75,7 +76,7 @@
7576
"chai-as-promised": "7.1.1",
7677
"coveralls": "3.0.2",
7778
"cucumber": "0.10.3",
78-
"eslint": "5.12.0",
79+
"eslint": "5.14.1",
7980
"eslint-config-prettier": "3.3.0",
8081
"mkdirp": "^0.5.1",
8182
"mocha": "5.2.0",

test/api/auth.test.js

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,6 @@ describe('Auth API', () => {
7171
header.location.should.equal('/');
7272
});
7373

74-
it('should redirect correctly on login', async () => {
75-
const agent = request.agent(app);
76-
await agent.get('/test').expect(302);
77-
const { header } = await agent
78-
.post('/auth/login')
79-
.send(testUser)
80-
.expect(302);
81-
82-
header.location.should.equal('/test');
83-
});
84-
8574
it('should redirect to login with flash on bad auth', async () => {
8675
const agent = request.agent(app);
8776
const { header } = await agent

0 commit comments

Comments
 (0)