%PDF- %PDF-
| Direktori : /www/varak.net/dmarc.varak.net/public/js/ |
| Current File : /www/varak.net/dmarc.varak.net/public/js/common.js |
/**
* dmarc-srg - A php parser, viewer and summary report generator for incoming DMARC reports.
* Copyright (C) 2020-2025 Aleksey Andreev (liuch)
*
* Available at:
* https://github.com/liuch/dmarc-srg
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
const HTTP_HEADERS = {
"Accept": "application/json"
};
const HTTP_HEADERS_POST = {
"Content-Type": "application/json"
};
function set_wait_status(el, text) {
const wait = document.createElement("div");
wait.classList.add("wait-message");
wait.append(text || "Getting data...");
if (el) el.replaceChildren(wait);
return wait;
}
function set_error_status(el, text) {
const err = document.createElement("div");
err.classList.add("error-message");
err.append(text || "Error!");
if (el) el.replaceChildren(err);
return err;
}
function date_range_to_string(d1, d2) {
let s1 = d1.toISOString().substr(0, 10);
let s2 = d2.toISOString().substr(0, 10);
if (s1 !== s2) {
let d3 = new Date(d2);
d3.setSeconds(d3.getSeconds() - 1);
if (s1 !== d3.toISOString().substr(0, 10))
s1 += " - " + s2;
}
return s1;
}
function scroll_to_element(element, container) { // because scrollIntoView is poorly supported by browsers
let diff = null;
let e_rect = element.getBoundingClientRect();
let c_rect = container.getBoundingClientRect();
let height = Math.min(e_rect.height, 64);
if (e_rect.top < c_rect.top + height * 2) {
diff = e_rect.top - c_rect.top - height * 2;
}
else if (e_rect.bottom > c_rect.bottom - height) {
diff = e_rect.bottom - c_rect.bottom + height;
}
if (diff) {
container.scrollBy(0, diff);
}
}
function bytes2size(bytes) {
if (!bytes) {
return "0 bytes";
}
const k = 1024;
const sizes = [ 'bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' ];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
}
class Common {
static initAriaMethods() {
if (HTMLElement.idSequenceValue === undefined) HTMLElement.idSequenceValue = 0;
if (!HTMLElement.prototype.getId) {
HTMLElement.prototype.getId = function() {
if (!this.id) this.id = `id-${++HTMLElement.idSequenceValue}`;
return this.id;
};
}
if (!HTMLElement.prototype.setAriaControls) {
HTMLElement.prototype.setAriaControls = function(element) {
this.setAttribute("aria-controls", element.getId());
};
}
if (!HTMLElement.prototype.setAriaLabelledBy) {
HTMLElement.prototype.setAriaLabelledBy = function(element) {
this.setAttribute("aria-labelledby", element.getId());
};
}
}
static tuneDateTimeOutput(mode) {
Date.prototype.outputMode = mode;
if (!Date.prototype.toUIString) {
Date.prototype.toUIString = function(prefer_utc) {
if (this.outputMode === "local" || (this.outputMode === "auto" && !prefer_utc)) {
return this.toLocaleString();
}
return this.toLocaleString(undefined, { timeZone: 'UTC', timeZoneName: 'short' });
};
}
if (!Date.prototype.toUIDateString) {
Date.prototype.toUIDateString = function(prefer_utc) {
if (this.outputMode === "local" || (this.outputMode === "auto" && !prefer_utc)) {
return this.toLocaleDateString(
undefined,
{ year:"numeric", month:"short", day:"numeric" }
);
}
return this.toLocaleDateString(
undefined,
{ timeZone:"UTC", year:"numeric", month:"short", day:"numeric" }
);
};
}
}
static makeIpElement(ip) {
let url = null;
let type = ip.includes(":") && 6 || 4;
switch (type) {
case 4:
url = Common.ipv4_url;
break;
case 6:
url = Common.ipv6_url;
break;
}
let tn = document.createTextNode(ip);
if (url) {
const r = /^(!*)(.+)$/.exec(url);
if (r && r[1].length <= 2) {
url = r[2].replace("{$ip}", ip).replace("{$eip}", encodeURIComponent(ip));
let el = document.createElement("a");
el.setAttribute("href", url);
if (r[1].length == 1) {
el.target = "ip-info";
} else if (r[1].length == 2) {
el.target = "_blank";
}
el.appendChild(tn).title = "IP address information";
return el;
}
}
return tn;
}
static createReportResultElement(name, result, value) {
const span = document.createElement("span");
if (value) name += ": " + value;
span.textContent = name;
const atitle = [ result, value ].reduce((res, it, idx) => {
if (it && (!idx || it !== res[0])) res.push(it);
return res;
}, []);
if (atitle.length) span.title = atitle.join(": ");
span.classList.add("report-result");
if (result) span.classList.add("report-result-" + result);
return span;
}
static checkResult(data) {
if (data.error_code !== undefined && data.error_code !== 0) {
throw data;
}
}
static displayError(obj) {
console.warn(obj.message || "Unknown error");
if (!(obj instanceof Error) && obj.debug_info) {
console.warn('Error code: ' + obj.debug_info.code);
console.warn('Error content: ' + obj.debug_info.content);
}
}
/**
* Reduces large numbers with the addition of postfixes K, M, B.
*/
static abbrNumber(val, min) {
if (min !== undefined && val < min) return val.toLocaleString();
let f = 1;
let u = "";
if (val >= 1e9) {
f = 1e9;
u = "B";
} else if (val >= 1e6) {
f = 1e6;
u = "M";
} else if (val >= 1e3) {
f = 1e3;
u = "K";
}
return (Math.round((val / f + Number.EPSILON) * 10) / 10).toLocaleString() + u;
}
/**
* Gets the filter value as an object from the passed url, compares it to the passed cfilter,
* returns the new value, or undefined if the filter has not changed.
*/
static getFilterFromURL(url, cfilter) {
let cnt = 0;
const nfilter = {};
url.searchParams.getAll("filter[]").forEach(function(it) {
let k = null;
let v = null;
const i = it.indexOf(":");
if (i !== 0) {
if (i > 0) {
k = it.substr(0, i);
v = it.substr(i + 1);
} else {
k = it;
v = "";
}
nfilter[k] = v;
++cnt;
}
});
if (cfilter === undefined) return cnt ? nfilter : null;
let changed = !cfilter && cnt > 0;
if (!changed && cfilter) {
let cnt2 = 0;
changed = Object.keys(cfilter).some(function(k) {
++cnt2;
return cnt < cnt2 || cfilter[k] !== nfilter[k];
}) || cnt !== cnt2;
}
return changed ? (cnt ? nfilter : null) : undefined;
}
}
Common.initAriaMethods();
Common.tuneDateTimeOutput("auto");