|
19 | 19 | <div class="d-flex vh-100">
|
20 | 20 | <div class="d-flex w-100 justify-content-center">
|
21 | 21 | <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> |
22 | 29 |
|
23 | 30 | <div class="card shadow-sm" id="register-div">
|
24 | 31 | <div class="card-header">Multi-factor authentication</div>
|
|
34 | 41 | <strong>{{$currentRealm.Name}}</strong>
|
35 | 42 | {{if eq .currentRealm.MFAMode.String "required"}}requires{{else}}recommends{{end}}
|
36 | 43 | enhanced security via SMS-based 2-factor authentication. Please
|
37 |
| - provide your information below. |
| 44 | + provide your information below to enroll. |
38 | 45 | </p>
|
39 | 46 |
|
40 | 47 | <form id="register-form" class="floating-form" action="/" method="POST">
|
|
100 | 107 | let $submitPin = $('#sms-code-submit');
|
101 | 108 | let $resendPin = $('#sms-code-resend');
|
102 | 109 |
|
| 110 | + let $registeredDiv = $('#registered-div'); |
| 111 | + let $factors = $('#factors'); |
| 112 | + |
103 | 113 | let verId = ""
|
104 | 114 |
|
| 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 | + |
105 | 185 | $registerForm.on('submit', function(event) {
|
106 | 186 | event.preventDefault();
|
107 | 187 |
|
|
123 | 203 | verId = verificationId
|
124 | 204 | setTimeout(function() { $resendPin.removeClass('disabled'); }, 15000);
|
125 | 205 | $registerDiv.hide();
|
126 |
| - $pinDiv.show(); |
| 206 | + $pinDiv.removeClass('d-none'); |
127 | 207 | }).catch(function(err) {
|
128 | 208 | flash.clear();
|
129 | 209 | flash.error(err.message);
|
|
145 | 225 | user.multiFactor.enroll(multiFactorAssertion, $displayName.val()).then(function() {
|
146 | 226 | flash.clear();
|
147 | 227 | flash.alert('SMS authentication enrolled successfully.');
|
148 |
| - $skip.text("Continue") |
| 228 | + $skip.text('Continue'); |
| 229 | + $registerDiv.show(); |
| 230 | + $pinDiv.addClass('d-none'); |
149 | 231 | }).catch(function(err) {
|
150 | 232 | flash.clear();
|
151 | 233 | flash.error(err.message);
|
|
156 | 238 | $pinClose.on('click', function(event) {
|
157 | 239 | $submit.prop('disabled', false);
|
158 | 240 | $registerDiv.show();
|
159 |
| - $pinDiv.hide(); |
| 241 | + $pinDiv.addClass('d-none'); |
160 | 242 | });
|
161 | 243 |
|
162 | 244 | $resendPin.on('click', function(event) {
|
|
0 commit comments