]> git.immae.eu Git - perso/Immae/Config/Nix.git/blob - modules/private/websites/tools/tools/dmarc_reports/app.js
Add config for CI
[perso/Immae/Config/Nix.git] / modules / private / websites / tools / tools / dmarc_reports / app.js
1 const app = new Vue({
2 el: '#app',
3 data: {
4 info: null,
5 summaries: null,
6 selectedSummary: null,
7 filterGreen: true,
8 filterDomain: null,
9 filterOrg: null,
10 //filterDate: (new Date()).toISOString().substring(0, 7),
11 filterDate: null,
12 reverse: true,
13 anonymous: true,
14 },
15 created: async function () {
16 let that = this;
17
18 if ('anonymous' in localStorage) {
19 this.anonymous = JSON.parse(localStorage.anonymous);
20 }
21 this.fetchAll();
22 },
23 methods: {
24 fetchAll: async function() {
25 try {
26 this.info = await this.getInfo();
27 this.summaries = this.info.summaries;
28 } catch (error) {
29 this.info = null;
30 this.summaries = null;
31 }
32 },
33 toggleAnonymous: function() {
34 this.anonymous = !this.anonymous;
35 localStorage.anonymous = this.anonymous;
36 this.fetchAll();
37 },
38 filtered: function () {
39 let that = this;
40 let filtered = this.summaries.filter(function (summary) {
41 return (!that.filterGreen || that.getColor(summary) !== "lime")
42 && (!that.filterDomain || summary.domain === that.filterDomain)
43 && (!that.filterOrg || summary.org === that.filterOrg)
44 && (!that.filterDate || that.inDates(summary));
45 });
46 if (this.reverse) {
47 return filtered.reverse();
48 } else {
49 return filtered;
50 }
51 },
52 toggle: async function(summary) {
53 if (this.selectedSummary && this.selectedSummary.serial === summary.serial) {
54 this.selectedSummary = null;
55 } else {
56 if (!summary.details) {
57 summary.details = await this.getDetails(summary.serial);
58 }
59 this.selectedSummary = summary;
60 }
61 },
62 inDates: function(summary) {
63 if (!this.filterDate) { return true; }
64
65 let mindate = (new Date(summary.mindate)).toISOString().substring(0, 7);
66 let maxdate = (new Date(summary.maxdate)).toISOString().substring(0, 7);
67
68 return mindate === this.filterDate || maxdate === this.filterDate;
69 },
70 printDate: function (date) {
71 return (new Date(date)).toISOString().replace("T", " ").replace(/\..*Z$/, " UTC");
72 },
73 getColor: function (element) {
74 if (element.dkimresult === "fail" && element.spfresult === "fail") {
75 return "red";
76 } else if (element.dkimresult === "fail" || element.spfresult === "fail") {
77 return "orange";
78 } else if (element.dkimresult === "pass" && element.spfresult === "pass") {
79 return "lime";
80 } else {
81 return "yellow";
82 }
83 },
84 getInfo: function (event) {
85 let anonymous = this.anonymous ? "anonymous=1" : "";
86 return fetch(`api.php?${anonymous}`).then(function (response) {
87 if (response.status != 200) { return; }
88 return response.text().then(function (body) {
89 return JSON.parse(body);
90 });
91 });
92 },
93 getDetails: function (serial) {
94 let anonymous = this.anonymous ? "&anonymous=1" : "";
95 return fetch(`api.php?serial=${serial}${anonymous}`).then(function (response) {
96 if (response.status != 200) { return; }
97 return response.text().then(function (body) {
98 return JSON.parse(body);
99 });
100 });
101 }
102 }
103 });