You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.2 KiB

Qr rotation dev (#400) * Fix #378 - Removing sesskey requirement for viewing attendance.php * Fix #378 - Show password icon when only QR code is selected. * Fix #378 - Refactor/Add functionality for QR Code & No Password * Changes to DB structure for rotateqrcode feature * Added Rotate QR code function * Adding new field to settings and DB create/update functions * Added function to check QR code pass and cookies, error messages. * Added function to return QR passwords as JSON * Moved unix timestamp generation to PHP * Added function that outputs JS to render the rotation code * Add QR code library qrcode.js * Added code to display and rotate the QR code. * Ammended password.php to not show text password when rotating. * Load information from database earlier, fixed check for password * Set expiry time for cookie * Autofill password for authenticated rotateqrcode users * Disable conflicting settings if rotateqr is enabled * Updating version number * Added maximum length to password field and amended key, name for table * Ammend upgrade.php to update db structure for qrcode rotation * Add id column to attendance_rotate_passwords * Removed interval setting from session. Using plugin setting instead. * Amend return passwords function * Update version numbers for DB/version.php * Hide rotate option when students cannot mark on update page. * Show QR icon when rotateqrcode is enabled. * Rename qrcoderotate JS file, frakenstyle * Add qrcode.js to thirdpartylibs.xml * Generate random password when rotateqrcode session is updated. * Add qrcodesecret column to database * Use separate password for rotateqrcode cookie * Remove unnecessary qrcodeinterval database field * Replacing $_GET with optional_param * Clarified time unit (seconds) for Rotate QR Code strings. * Moved rotateqrcodeinterval under studentscanmark setting * Fix code formatting in attendance.php and locallib.php * Add rotateqrcodesecret to structure * Add task to clear temporary qrrotation passwords * Functionality to allow password to be accepted if expired within 2sec * Documenting class clear_temporary_passwords * Updating delete temporary passwords task
6 years ago
/**
*
* @copyright 2019 Maksud R
* @package mod_attendance
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*
*/
class attendance_QRCodeRotate {
constructor() {
this.sessionId = 0;
this.password = "";
this.qrCodeInstance = "";
this.qrCodeHTMLElement = "";
}
start(sessionId, qrCodeHTMLElement) {
this.sessionId = sessionId;
this.qrCodeHTMLElement = qrCodeHTMLElement;
this.fetchAndRotate();
}
qrCodeSetUp() {
this.qrCodeInstance = new QRCode(this.qrCodeHTMLElement, {
text: '',
width: 328,
height: 328,
colorDark : "#000000",
colorLight : "#ffffff",
correctLevel : QRCode.CorrectLevel.H
});
}
changeQRCode(password) {
var qrcodeurl = document.URL.substr(0,document.URL.lastIndexOf('/')) + '/attendance.php?qrpass=' + password + '&sessid=' + this.sessionId;
this.qrCodeInstance.clear();
this.qrCodeInstance.makeCode(qrcodeurl);
}
startRotating() {
var parent = this;
setInterval(function() {
var found = Object.values(parent.password).find(function(element) {
if (element.expirytime > Math.round(new Date().getTime() / 1000)) {
return element;
}
});
if (found == undefined) {
location.reload(true);
} else {
parent.changeQRCode(found.password);
}
}, 1000);
}
fetchAndRotate() {
var parent = this;
fetch('password.php?session='+this.sessionId+'&returnpasswords=1', {
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
})
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
parent.password = data;
parent.qrCodeSetUp();
// this.changeQRCode( password );
parent.startRotating();
}).catch(err => {
console.error("Error fetching QR passwords from API.");
});
}
}