\n";
486 | }
487 | else {
488 | echo "
\n
489 |
\n
490 |
\n
491 |
\n";
492 | }
493 |
494 | if ($ip != '') { echo "$ip
\n"; }
495 | if ($hostname != '') { echo "$hostname
\n"; }
496 | if ($org != '') { echo "$org
\n"; }
497 | if ($city != '') { echo "$city
"; }
498 | if ($region != '') { echo "$region
"; }
499 | if ($country != '') { echo "$country
"; }
500 |
501 | echo "
\n";
502 |
503 | echo "
\n
504 |
\n";
505 |
506 | // if there's no maxmind data, then there's no map to find
507 | if (GEO_ENABLE) {
508 | echo "
\n
509 | \n
510 |
\n";
511 | }
512 |
513 | echo "
\n
514 |
\n";
515 |
516 | if (count($stats) > 0) {
517 | echo "
\n
518 | \n
519 | \n
520 | Report ID | \n
521 | Message Count | \n
522 | Disposition | \n
523 | Reason | \n
524 | DKIM | \n
525 | SPF | \n
526 |
\n
527 | \n";
528 | }
529 |
530 | foreach ($stats as $stat) {
531 | $stat = array_map('htmlspecialchars',$stat);
532 | $dkimresult = $stat['dkimresult'] ?: 'unknown';
533 | $dkim_align = $stat['dkim_align'] ?: 'unknown';
534 | $spfresult = $stat['spfresult'] ?: 'unknown';
535 | $spf_align = $stat['spf_align'] ?: 'unknown';
536 | echo "\n
537 | ".$stat['reportid']." | \n
538 | ".$stat['rcount']." | \n
539 | ";
540 | if ($stat['disposition'] == "quarantine") {
541 | echo "".$stat['disposition']."";
542 | }
543 | elseif ($stat['disposition'] == "reject") {
544 | echo "".$stat['disposition']."";
545 | }
546 | else {
547 | echo $stat['disposition'];
548 | }
549 | echo " | \n
550 | ".$stat['reason']." | \n
551 | ";
552 | if ($stat['dkimdomain'] != '') {
553 | echo "Signed by ".$stat['dkimdomain']." \n
554 | Result: $dkimresult |
555 | Alignment: $dkim_align | \n";
556 | }
557 | else {
558 | echo "Not Signed\n";
559 | }
560 | echo " Envelope from ".$stat['spfdomain']." \n
561 | Result: $spfresult |
562 | Alignment: $spf_align | \n
563 |
\n";
564 | }
565 |
566 | if (count($stats) > 0) { echo "
\n"; }
567 |
568 | }
569 |
570 | function report_details($data, $report) {
571 |
572 | if ($data[0]['ip6'] != '') { $ip = $data[0]['ip6']; }
573 | $data[0] = array_map('htmlspecialchars',$data[0]);
574 | if ($data[0]['ip6'] != '') { $data[0]['ip6'] = $ip; }
575 |
576 | if ($data[0]['policy_adkim'] == 'r') { $dkim_policy = 'Relaxed'; }
577 | else if ($data[0]['policy_adkim'] == 's') { $dkim_policy = 'Strict'; }
578 | else { $dkim_policy = 'unknown'; }
579 | if ($data[0]['policy_aspf'] == 'r') { $spf_policy = 'Relaxed'; }
580 | else if ($data[0]['policy_aspf'] == 's') { $spf_policy = 'Strict'; }
581 | else { $spf_policy = 'unknown'; }
582 |
583 | // report details
584 | echo "
Details for Report $report
\n
585 |
\n
586 |
\n
587 |
\n
588 |
\n";
589 |
590 | if ($data[0]['mindate'] != ''
591 | && $data[0]['maxdate'] != '') { echo "Date Range
\n"; }
592 | if ($data[0]['org'] != '') { echo "Reporting Organization
\n"; }
593 | if ($data[0]['email'] != '') { echo "Report Origin Email
\n"; }
594 | if ($data[0]['extra_contact_info'] != '') { echo "Contact Info
\n"; }
595 | if ($data[0]['policy_p'] != ''
596 | && $data[0]['policy_pct'] != '') { echo "DMARC Policy
\n"; }
597 | if ($data[0]['policy_adkim'] != '') { echo "DKIM Policy
\n"; }
598 | if ($data[0]['policy_aspf'] != '') { echo "SPF Policy
\n"; }
599 |
600 | echo "
\n
601 |
\n
602 |
\n
603 |
\n";
604 |
605 | if ($data[0]['mindate'] != ''
606 | && $data[0]['maxdate'] != '') { echo $data[0]['mindate']." - ".$data[0]['maxdate']."
\n"; }
607 | if ($data[0]['org'] != '') { echo $data[0]['org']."
\n"; }
608 | if ($data[0]['email'] != '') { echo $data[0]['email']."
\n"; }
609 | if ($data[0]['extra_contact_info'] != '') { echo $data[0]['extra_contact_info']."
\n"; }
610 | if ($data[0]['policy_p'] != ''
611 | && $data[0]['policy_pct'] != '') { echo ucfirst($data[0]['policy_p'])." ".$data[0]['policy_pct']."%
\n"; }
612 | if ($data[0]['policy_adkim'] != '') { echo "$dkim_policy
\n"; }
613 | if ($data[0]['policy_aspf'] != '') { echo "$spf_policy
\n"; }
614 |
615 | echo "
\n
616 |
\n
617 |
\n
618 |
\n";
619 |
620 | echo "
\n
621 | \n
622 | \n
623 | Sender IP | \n
624 | RFC5322 Domain | \n
625 | Message Count | \n
626 | Disposition | \n
627 | Reason | \n
628 | DKIM | \n
629 | SPF | \n
630 |
\n
631 | \n";
632 |
633 | foreach ($data as $row) {
634 | $ip = get_ip($row['ip'],$row['ip6']);
635 | $row = array_map('htmlspecialchars',$row);
636 | $dkimresult = $row['dkimresult'] ?: 'unknown';
637 | $dkim_align = $row['dkim_align'] ?: 'unknown';
638 | $spfresult = $row['spfresult'] ?: 'unknown';
639 | $spf_align = $row['spf_align'] ?: 'unknown';
640 | echo "\n
641 | ".$ip['ip']." | \n
642 | ".$row['domain']." | \n
643 | ".$row['rcount']." | \n
644 | ";
645 | if ($row['disposition'] == "quarantine") {
646 | echo "".$row['disposition']."";
647 | }
648 | elseif ($row['disposition'] == "reject") {
649 | echo "".$row['disposition']."";
650 | }
651 | else {
652 | echo $row['disposition'];
653 | }
654 | echo " | \n
655 | ".$row['reason']." | \n
656 | ";
657 | if ($row['dkimdomain'] != '') {
658 | echo "Signed by ".$row['dkimdomain']." \n
659 | Result: $dkimresult |
660 | Alignment: $dkim_align | \n";
661 | }
662 | else {
663 | echo "Not Signed\n";
664 | }
665 | echo " Envelope from ".$row['spfdomain']." \n
666 | Result: $spfresult |
667 | Alignment: $spf_align | \n
668 |
\n";
669 | }
670 |
671 | echo "
\n";
672 | }
673 | ?>
674 |
--------------------------------------------------------------------------------
/index.php:
--------------------------------------------------------------------------------
1 | .
28 |
29 | ---------------------------------------------------------------------------- */
30 |
31 | // Includes
32 | include_once 'includes.php';
33 |
34 | // Pull in URI Gets
35 |
36 | // Range ----------------------------------------------------------------------
37 | if (!empty($_GET['range'])) {
38 | $dateRange = htmlspecialchars($_GET['range']);
39 | }
40 | elseif (isset($_POST['range'])) {
41 | $dateRange = htmlspecialchars($_POST['range']);
42 | }
43 | else {
44 | $dateRange = DATE_RANGE;
45 | }
46 |
47 | // Page -----------------------------------------------------------------------
48 | if (isset($_GET['page'])) {
49 | $page = htmlspecialchars($_GET['page']);
50 | }
51 | elseif (isset($_POST['page'])) {
52 | $page = htmlspecialchars($_POST['page']);
53 | }
54 | else {
55 | $page = "index";
56 | }
57 |
58 | // Domain ---------------------------------------------------------------------
59 | if (isset($_GET['domain'])) {
60 | $domain = htmlspecialchars($_GET['domain']);
61 | }
62 | elseif (isset($_POST['domain'])) {
63 | $domain = htmlspecialchars($_POST['domain']);
64 | }
65 | else {
66 | $domain = "all";
67 | }
68 |
69 | // IPs ------------------------------------------------------------------------
70 | if (isset($_GET['ip'])) {
71 | $ip = htmlspecialchars($_GET['ip']);
72 | }
73 | elseif (isset($_POST['ip'])) {
74 | $ip = htmlspecialchars($_POST['ip']);
75 | }
76 | else {
77 | $ip = '';
78 | }
79 |
80 | // ReportID -------------------------------------------------------------------
81 | if (isset($_GET['report'])) {
82 | $report = htmlspecialchars($_GET['report']);
83 | }
84 | elseif (isset($_POST['report'])) {
85 | $report = htmlspecialchars($_POST['report']);
86 | }
87 | else {
88 | $report = '';
89 | }
90 |
91 | // End URI gets
92 |
93 | // Page Header
94 | page_header($page, $domain, $dateRange, $ip);
95 |
96 | if ($page == "index") {
97 | dashboard($dateRange, $domain);
98 | }
99 | elseif ($page == "sender") {
100 | senderDashboard($dateRange, $domain, $ip);
101 | }
102 | elseif ($page == "report") {
103 | reportDashboard($report);
104 | }
105 | else {
106 | echo "
Invalid Page
\n";
107 | }
108 |
109 | // Page Footer
110 | page_footer();
111 |
112 | ?>
113 |
--------------------------------------------------------------------------------
/install.php:
--------------------------------------------------------------------------------
1 | .
27 |
28 | ---------------------------------------------------------------------------- */
29 |
30 | // Includes
31 | include_once 'includes.php';
32 |
33 | // Connect to database
34 |
35 | echo "connecting to database...";
36 | $pdo = dbConn();
37 | echo " success
";
38 |
39 | // Read in file and build statement
40 | $statement ='';
41 |
42 | echo "opening file...";
43 | $lines = file(DB_TYPE.'.sql');
44 | echo " success
";
45 |
46 | foreach ($lines as $line)
47 | {
48 | echo "→ $line
";
49 | // skip comments
50 | if (substr($line, 0, 2) == '--' || $line == '') { continue; }
51 |
52 | // add line to statement
53 | $statement .= $line;
54 |
55 | // check for end of query and run it
56 | if (substr(trim($line), -1, 1) == ';') {
57 | try {
58 | echo "performing query...";
59 | $query = $pdo->prepare($statement);
60 | $query->execute();
61 |
62 | if($query->errorCode() != 0) {
63 | $errors = $query->errorInfo();
64 | echo " failed: ".$errors[2]."
";
65 | exit();
66 | }
67 | }
68 | catch (PDOException $e) {
69 | echo " failed: ".$e->getMessage()."
";
70 | exit();
71 | }
72 | echo " success
";
73 | $query = NULL;
74 | $statement = '';
75 | }
76 | }
77 |
78 | echo "database successfully updated
";
79 |
80 | // kill the PDO
81 | $pdo = NULL;
82 |
83 | echo "deleting installation files
";
84 |
85 | if (unlink('mysql.sql') == true) {
86 | echo "DELETED → mysql.sql
";
87 | }
88 | else {
89 | echo "FAILED → mysql.sql
";
90 | }
91 |
92 | if (unlink('pgsql.sql') == true) {
93 | echo "DELETED → pgsql.sql
";
94 | }
95 | else {
96 | echo "FAILED → pgsql.sql
";
97 | }
98 |
99 | if (unlink(__FILE__) == true) {
100 | echo "DELETED → install.php
";
101 | }
102 | else {
103 | echo "FAILED → install.php
";
104 | }
105 | ?>
106 |
--------------------------------------------------------------------------------
/mysql.sql:
--------------------------------------------------------------------------------
1 | CREATE VIEW IF NOT EXISTS report_stats AS (
2 | SELECT
3 | report.serial, domain, rcount, disposition, reason,
4 | policy_p, policy_pct, dkimdomain, dkimresult, dkim_align,
5 | spfdomain, spfresult, spf_align, mindate, maxdate
6 | FROM report RIGHT JOIN rptrecord
7 | ON report.serial=rptrecord.serial
8 | );
9 |
--------------------------------------------------------------------------------
/pgsql.sql:
--------------------------------------------------------------------------------
1 | CREATE OR REPLACE VIEW report_stats AS (
2 | SELECT
3 | report.serial, domain, rcount, disposition, reason,
4 | policy_p, policy_pct, dkimdomain, dkimresult, dkim_align,
5 | spfdomain, spfresult, spf_align, mindate, maxdate
6 | FROM report RIGHT JOIN rptrecord
7 | ON report.serial=rptrecord.serial
8 | );
9 |
--------------------------------------------------------------------------------
/templates/openda/codebase_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/userjack6880/Open-DMARC-Analyzer/0ac3d054617c4192bc233da1301bb5b1e7068aa0/templates/openda/codebase_logo.png
--------------------------------------------------------------------------------
/templates/openda/footer.php:
--------------------------------------------------------------------------------
1 | .
27 |
28 | ---------------------------------------------------------------------------- */
29 |
30 | ?>
31 |
32 |