85 lines
3.2 KiB
JavaScript
Executable File
85 lines
3.2 KiB
JavaScript
Executable File
const rangeStringToArray = (str) => {
|
|
// Split the string by hyphen
|
|
const parts = str.split ("-");
|
|
// Validate input format (two numbers separated by hyphen)
|
|
if (parts.length !== 2 || isNaN (parts[0]) || isNaN (parts[1])) {
|
|
return null; // Return null for invalid format
|
|
}
|
|
// Convert strings to numbers
|
|
const start = parseInt (parts[0], 10);
|
|
const end = parseInt (parts[1], 10);
|
|
// Check if start is less than or equal to end (inclusive range)
|
|
if (start > end) {
|
|
return null; // Return null for invalid range
|
|
}
|
|
// Use Array.from() to create an array with sequence
|
|
return Array.from ({ length: end - start + 1 }, (_, i) => start + i);
|
|
};
|
|
|
|
const resolveRange = (str) => {
|
|
const numberSets = str.split (","); // Split by commas
|
|
const numbers = [];
|
|
for (const set of numberSets) {
|
|
// Check if it's a range
|
|
if (set.includes ("-")) {
|
|
const range = rangeStringToArray (set); // Use the previous function
|
|
if (range) {
|
|
numbers.push(...range); // Spread operator to add elements from range array
|
|
}
|
|
else {
|
|
const num = parseInt(set, 10);
|
|
// Check if conversion is successful (valid number)
|
|
if (!isNaN(num)) {
|
|
numbers.push(num);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return numbers;
|
|
}
|
|
|
|
module.exports = {
|
|
checkAuth: (rules = []) => {
|
|
var authorised = false;
|
|
if (config.time_rules) {
|
|
if (rules.length > 0) {
|
|
var now = new Date ();
|
|
var minuteOfDay = (now.getHours () * 60) + now.getMinutes (); // 0 - 1439
|
|
var day = now.getDay (); // 1 - 7
|
|
var date = now.getDate (); // 1 - 31
|
|
var month = now.getMonth () + 1; // 1 - 12
|
|
var actions = [];
|
|
rules.forEach ((rule) => {
|
|
var valid = false;
|
|
// Process rule
|
|
var r = {
|
|
startMinute: parseInt (rule.startTime.split (":")[0] * 60) + parseInt (rule.startTime.split (":")[1]),
|
|
endMinute: parseInt (rule.endTime.split (":")[0] * 60) + parseInt (rule.endTime.split (":")[1]),
|
|
days: resolveRange (rule.weekdays),
|
|
dates: resolveRange (rule.dates),
|
|
months: resolveRange (rule.months)
|
|
}
|
|
if (
|
|
minuteOfDay >= r.startMinute &&
|
|
minuteOfDay <= r.endMinute &&
|
|
r.days.indexOf (day) !== -1 &&
|
|
r.dates.indexOf (date) !== -1 &&
|
|
r.months.indexOf (month) !== -1
|
|
) {
|
|
actions.push (rule.action.toLowerCase ());
|
|
}
|
|
});
|
|
if (actions.indexOf ("allow") !== -1) {
|
|
authorised = true;
|
|
}
|
|
if (actions.indexOf ("deny") !== -1) {
|
|
authorised = false;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
authorised = true;
|
|
}
|
|
return authorised;
|
|
}
|
|
} |