keeweb/app/scripts/models/external/external-otp-entry-model.js

69 lines
2.0 KiB
JavaScript
Raw Normal View History

2020-04-15 16:50:01 +02:00
import { ExternalEntryModel } from 'models/external/external-entry-model';
class ExternalOtpEntryModel extends ExternalEntryModel {
constructor(props) {
2020-05-05 15:08:19 +02:00
super({
...props,
description: props.user
});
2020-04-15 16:50:01 +02:00
}
initOtpGenerator() {
2020-05-05 20:14:32 +02:00
if (this.otpGenerator) {
return;
}
2020-05-11 17:44:18 +02:00
const gen = {
2020-06-01 16:53:51 +02:00
next: (callback) => {
2020-05-11 17:44:18 +02:00
if (gen.otp && gen.expires) {
const timeLeft = gen.expires - Date.now();
if (timeLeft > 0) {
return callback(null, gen.otp, timeLeft);
}
}
if (gen.promise) {
gen.promise.then(({ err, otp, timeLeft }) => {
callback(err, otp, timeLeft);
});
return;
}
2020-06-01 16:53:51 +02:00
gen.promise = new Promise((resolve) => {
2020-05-11 17:44:18 +02:00
gen.otpState = this.device.getOtp(this, (err, otp, timeLeft) => {
gen.otpState = null;
gen.promise = null;
if (otp && timeLeft > 0) {
gen.otp = otp;
gen.expires = Date.now() + timeLeft;
} else {
gen.otp = null;
gen.expires = null;
}
callback(err, otp, timeLeft);
resolve({ err, otp, timeLeft });
});
});
2020-04-15 16:50:01 +02:00
},
cancel: () => {
2020-05-11 17:44:18 +02:00
if (this.otpState) {
this.device.cancelGetOtp(this, this.otpState);
}
2020-04-15 16:50:01 +02:00
}
};
2020-05-11 17:44:18 +02:00
this.otpGenerator = gen;
2020-04-15 16:50:01 +02:00
}
2020-05-05 15:08:19 +02:00
_buildFields() {
super._buildFields();
this.fields.UserName = this.user;
}
2020-04-15 16:50:01 +02:00
}
ExternalOtpEntryModel.defineModelProperties({
user: undefined,
otpGenerator: undefined,
2020-05-11 17:44:18 +02:00
needsTouch: false
2020-04-15 16:50:01 +02:00
});
export { ExternalOtpEntryModel };