1+ const express = require ( 'express' ) ;
2+ const router = express . Router ( ) ;
3+ const debugRoute = require ( 'debug' ) ( 'app:route' ) ;
4+ const speakeasy = require ( 'speakeasy' ) ;
5+ //Models
6+ const { generateAuthToken} = require ( '../models/User' ) ;
7+ //Middleware
8+ const auth = require ( '../middleware/auth' ) ;
9+
10+ router . get ( '/generate' , auth , async ( req , res ) => {
11+ //TODO get user from database
12+ let user = { } ;
13+
14+ if ( ! user ) {
15+ debugRoute ( "GET /api/otp/generate - 404 - User not found" ) ;
16+ return res . status ( 404 ) . send ( 'User not found.' ) ;
17+ }
18+
19+ if ( user . otp_enabled && user . otp_verified ) {
20+ debugRoute ( "GET /api/otp/generate - 400 - OTP already enabled" ) ;
21+ return res . status ( 400 ) . send ( 'OTP already enabled.' ) ;
22+ }
23+
24+ user . totp_confirmed = false ;
25+ let secret = speakeasy . generateSecret ( ) . base32 ;
26+ user . totp_secret = secret ;
27+
28+ //TODO save user
29+
30+ debugRoute ( "GET /api/otp/generate - 200 - OTP generated" ) ;
31+
32+ res . send ( secret ) ;
33+ } ) ;
34+
35+ router . post ( '/verify' , auth , async ( req , res ) => {
36+ if ( ! req . body . token ) {
37+ debugRoute ( "POST /api/otp/verify - 400 - Token required" ) ;
38+ return res . status ( 400 ) . send ( "Token required" ) ;
39+ }
40+
41+ //TODO get user from database and change me
42+ let user = { totp_secret : "someting" } ;
43+
44+ if ( ! user ) {
45+ debugRoute ( "POST /api/otp/verify - 404 - User not found" ) ;
46+ return res . status ( 404 ) . send ( 'User not found.' ) ;
47+ }
48+
49+ if ( user . totp_secret === undefined ) {
50+ debugRoute ( "POST /api/otp/verify - 400 - OTP not enabled" ) ;
51+ return res . status ( 400 ) . send ( 'OTP not enabled.' ) ;
52+ }
53+
54+ let verified = speakeasy . totp . verify ( {
55+ secret : user . otp_secret ,
56+ encoding : 'base32' ,
57+ token : req . body . token ,
58+ window : 1
59+ } ) ;
60+ //TODO change me
61+ verified = true ;
62+
63+ if ( ! verified ) {
64+ debugRoute ( "POST /api/otp/verify - 400 - Invalid token" ) ;
65+ return res . status ( 400 ) . send ( 'Invalid token.' ) ;
66+ }
67+
68+ if ( ! user . totp_confirmed ) {
69+ user . totp_confirmed = true ;
70+ user . lastSecurityUpdate = Date . now ( ) ;
71+ //TODO save User
72+ }
73+
74+ debugRoute ( "POST /api/otp/verify - 200 - OTP verified" ) ;
75+
76+ res . send ( generateAuthToken ( user . id , user . admin , true , true ) ) ;
77+ } ) ;
78+
79+ router . post ( '/disable' , auth , async ( req , res ) => {
80+ //TODO get user from database
81+
82+ let user = { } ;
83+ if ( ! user ) {
84+ debugRoute ( "POST /api/otp/disable - 404 - User not found" ) ;
85+ return res . status ( 404 ) . send ( 'User not found.' ) ;
86+ }
87+
88+ //TODO change me
89+ user . totp_confirmed = true ;
90+ if ( ! user . totp_confirmed ) {
91+ debugRoute ( "POST /api/otp/disable - 400 - OTP not enabled" ) ;
92+ return res . status ( 400 ) . send ( 'OTP not enabled.' ) ;
93+ }
94+
95+ user . totp_secret = undefined ;
96+ user . totp_confirmed = false ;
97+ user . lastSecurityUpdate = Date . now ( ) ;
98+
99+ //save user
100+
101+ debugRoute ( "POST /api/otp/disable - 200 - OTP disabled" ) ;
102+
103+ res . send ( generateAuthToken ( false , false ) ) ;
104+ } ) ;
105+
106+ module . exports = router ;
0 commit comments