Skip to content
This repository was archived by the owner on Jul 12, 2023. It is now read-only.

Commit 17d6347

Browse files
authored
Allow deletion of factors (#628)
* Allow deletion of factors * include enrollment time * tooltip * use d-none * update * deal with d-none * fix * don't hide * don't show without hide * construct elements * confirm prompt * icon
1 parent 199ed9f commit 17d6347

File tree

5 files changed

+100
-12
lines changed

5 files changed

+100
-12
lines changed

cmd/server/assets/login/_loginscripts.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
{{end}}
4141

4242
{{define "login/pindiv"}}
43-
<div class="card shadow-sm" style="display:none;" id="sms-code-div">
43+
<div class="card shadow-sm d-none" id="sms-code-div">
4444
<div class="card-header">
4545
SMS Confirmation Code
4646
<button type="button" class="close" aria-label="Close" id="sms-code-close">

cmd/server/assets/login/account.html

+8-2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ <h6 class="card-title mt-3">System admin</h6>
4747
</li>
4848
<li class="list-group-item">
4949
<div class="card-text" id="phone-registered">loading</div>
50+
<a href="/login/register-phone" id='register-link' class="card-link">Register phone</a>
5051
</li>
5152
<li class="list-group-item">
5253
<div class="card-text">Password was last changed <span class="text-info">{{$user.PasswordAgeString}}</span>
@@ -100,18 +101,23 @@ <h6 class="card-title mt-3">System admin</h6>
100101

101102
if (user.multiFactor.enrolledFactors.length > 0) {
102103
$phoneReg.html('Two-factor auth is <span class="text-success">enabled</span>');
104+
$('#register-link').text('Manage auth factors');
103105
} else {
104106
$phoneReg.addClass("text-danger");
105107
$phoneReg.html('No second auth factor registered');
106-
$phoneReg.after('<a href="/login/register-phone" class="card-link">Register phone</a>');
107108
}
108109

109110
if (user.emailVerified) {
110111
$emailVer.html('Email address is <span class="text-success">verified</span>');
111112
} else {
112113
$emailVer.addClass("text-danger");
113114
$emailVer.html('Email address is <strong>not</strong> verified');
114-
$emailVer.after('<a href="/login/verify-email" class="card-link">Verify email</a>');
115+
116+
let $link = $('<a/>');
117+
$link.addClass('card-link');
118+
$link.attr('href','/login/verify-email');
119+
$link.text('Verify email');
120+
$emailVer.after($link);
115121
}
116122
});
117123
});

cmd/server/assets/login/login.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
setTimeout(function() { $resendPin.removeClass('disabled'); }, 15000);
104104
$submitPin.prop('disabled', false);
105105
$loginDiv.hide();
106-
$pinDiv.show();
106+
$pinDiv.removeClass('d-none');
107107
}).catch(function(error) {
108108
flash.clear();
109109
flash.error(error.message);
@@ -142,7 +142,7 @@
142142
$pinClose.on('click', function(event) {
143143
$submit.prop('disabled', false);
144144
$loginDiv.show();
145-
$pinDiv.hide();
145+
$pinDiv.addClass('d-none');
146146
});
147147

148148
$resendPin.on('click', function(event) {

cmd/server/assets/login/register-phone.html

+86-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@
1919
<div class="d-flex vh-100">
2020
<div class="d-flex w-100 justify-content-center">
2121
<div class="col-sm-6">
22+
<div class="card shadow-sm mb-3 d-none" id="registered-div">
23+
<div class="card-header">Registered factors</div>
24+
<div class="card-body">
25+
<ul id="factors" class="list-group list-group-flush">
26+
</ul>
27+
</div>
28+
</div>
2229

2330
<div class="card shadow-sm" id="register-div">
2431
<div class="card-header">Multi-factor authentication</div>
@@ -34,7 +41,7 @@
3441
<strong>{{$currentRealm.Name}}</strong>
3542
{{if eq .currentRealm.MFAMode.String "required"}}requires{{else}}recommends{{end}}
3643
enhanced security via SMS-based 2-factor authentication. Please
37-
provide your information below.
44+
provide your information below to enroll.
3845
</p>
3946

4047
<form id="register-form" class="floating-form" action="/" method="POST">
@@ -100,8 +107,81 @@
100107
let $submitPin = $('#sms-code-submit');
101108
let $resendPin = $('#sms-code-resend');
102109

110+
let $registeredDiv = $('#registered-div');
111+
let $factors = $('#factors');
112+
103113
let verId = ""
104114

115+
firebase.auth().onAuthStateChanged(function(user) {
116+
if (!user) {
117+
return
118+
}
119+
120+
if (user.multiFactor.enrolledFactors.length > 0) {
121+
$skip.text('Account settings');
122+
$skip.attr('href','/account');
123+
124+
for (i = 0; i < user.multiFactor.enrolledFactors.length; i++) {
125+
let factor = user.multiFactor.enrolledFactors[i];
126+
let $li = $('<li/>');
127+
$li.addClass('list-group-item');
128+
$li.attr('id', 'factor'+factor.uid);
129+
130+
let $row = $('<div/>').text(factor.displayName);
131+
$li.append($row);
132+
133+
let $icon = $('<span/>');
134+
$icon.addClass('oi oi-phone mr-1');
135+
$icon.attr('aria-hidden','true');
136+
$row.prepend($icon);
137+
138+
let $unenroll = $('<a/>');
139+
$unenroll.addClass('text-danger float-right');
140+
$unenroll.attr('href', '#')
141+
$unenroll.attr('title', 'Delete this factor');
142+
$unenroll.tooltip();
143+
144+
$icon = $('<span/>');
145+
$icon.addClass('oi oi-delete mr-1');
146+
$icon.attr('aria-hidden','true');
147+
$unenroll.append($icon);
148+
$row.append($unenroll);
149+
150+
let $time = $('<small/>');
151+
$time.addClass('row text-muted ml-1')
152+
$time.text('Enrolled at: ' + factor.enrollmentTime);
153+
$row.append($time);
154+
155+
$unenroll.on('click', function(event) {
156+
unenrollFactor(factor);
157+
});
158+
159+
$factors.append($li);
160+
}
161+
$registeredDiv.removeClass('d-none');
162+
}
163+
});
164+
165+
function unenrollFactor(factor) {
166+
if (window.confirm('Are you sure you want to delete ' + factor.displayName) !== true) {
167+
return;
168+
}
169+
170+
firebase.auth().currentUser.multiFactor.unenroll(factor)
171+
.then(function() {
172+
$('#factor'+factor.uid).remove();
173+
flash.clear();
174+
flash.alert('Successfully unenrolled ${factor.displayName}');
175+
176+
if (firebase.auth().currentUser.multiFactor.enrolledFactors.length == 0) {
177+
$registeredDiv.addClass('d-none');
178+
}
179+
}).catch(function(error) {
180+
flash.clear();
181+
flash.error(error.message);
182+
});
183+
}
184+
105185
$registerForm.on('submit', function(event) {
106186
event.preventDefault();
107187

@@ -123,7 +203,7 @@
123203
verId = verificationId
124204
setTimeout(function() { $resendPin.removeClass('disabled'); }, 15000);
125205
$registerDiv.hide();
126-
$pinDiv.show();
206+
$pinDiv.removeClass('d-none');
127207
}).catch(function(err) {
128208
flash.clear();
129209
flash.error(err.message);
@@ -145,7 +225,9 @@
145225
user.multiFactor.enroll(multiFactorAssertion, $displayName.val()).then(function() {
146226
flash.clear();
147227
flash.alert('SMS authentication enrolled successfully.');
148-
$skip.text("Continue")
228+
$skip.text('Continue');
229+
$registerDiv.show();
230+
$pinDiv.addClass('d-none');
149231
}).catch(function(err) {
150232
flash.clear();
151233
flash.error(err.message);
@@ -156,7 +238,7 @@
156238
$pinClose.on('click', function(event) {
157239
$submit.prop('disabled', false);
158240
$registerDiv.show();
159-
$pinDiv.hide();
241+
$pinDiv.addClass('d-none');
160242
});
161243

162244
$resendPin.on('click', function(event) {

cmd/server/assets/users/import.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ <h1>Import users</h1>
4848
</div>
4949

5050
<div class="card-body">
51-
<div class="progress" id="progress-div" style="display:none;">
51+
<div class="progress d-none" id="progress-div" style="display:none;>
5252
<div id="progress" class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0"
5353
aria-valuemax="100"></div>
5454
</div>
55-
<table class="table table-bordered" id="csv-table" style="display:none;">
55+
<table class="table table-bordered d-none" id="csv-table">
5656
<thead>
5757
<tr>
5858
<th>Email</th>
@@ -105,7 +105,7 @@ <h1>Import users</h1>
105105
$cancel.prop('disabled', false);
106106

107107
$table.show(100);
108-
$progressDiv.show();
108+
$progressDiv.removeClass('d-none');
109109

110110
var reader = new FileReader();
111111
reader.onload = upload.start;

0 commit comments

Comments
 (0)