Skip to content
Snippets Groups Projects
Commit ed3e4b1a authored by Tomasz Wolniewicz's avatar Tomasz Wolniewicz
Browse files

adding ECCS interface files

parent 083fb5ec
Branches
Tags
No related merge requests found
<?php
$directory = "/srv/eccs/output";
$files = scandir($directory);
$firstFile = $files[3]; // [0] = '.' ; [1] = '..' ; [2] = '.gitignore'
$str2strip = array("eccs_", ".log");
$firstDate = str_replace($str2strip, "", $firstFile);
$files = scandir($directory, SCANDIR_SORT_DESCENDING);
$lastFile = $files[0];
$lastDate = str_replace($str2strip, "", $lastFile);
$data = array();
$data['firstDate'] = $firstDate;
$data['lastDate'] = $lastDate;
$data['idp'] = isset($_GET["idp"]) ? htmlspecialchars($_GET["idp"]) : "";
$data['reg_auth'] = isset($_GET["reg_auth"]) ? htmlspecialchars($_GET["reg_auth"]) : "";
$data['date'] = isset($_GET["date"]) ? htmlspecialchars($_GET["date"]) : $lastDate;
$data['status'] = isset($_GET["status"]) ? htmlspecialchars($_GET["status"]) : "";
$data['check_result'] = isset($_GET["check_result"]) ? htmlspecialchars($_GET["check_result"]) : "";
echo $twig->render('eccs.html', $data);
?>
{% extends 'common/master.html' %}
{% set breadcrumb = ['Tools', 'eduGAIN Connectivity Check Service'] %}
{% block title %}eduGAIN Connectivity Check Service{% endblock title %}
{% block additional_head %}
<meta charset=utf-8 />
<script type="text/javascript" src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.min.css"/>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css"/>
<link rel="stylesheet" type="text/css" href="css/eccs.css" />
<script>
$( function() {
$( "#datepicker" ).datepicker({
dateFormat: "yy-mm-dd",
minDate: "{{ firstDate }}",
maxDate: "{{ lastDate }}",
defaultDate: "{{ date }}"
}).datepicker("setDate","{{ date }}");
} );
</script>
{% endblock %}
{% block main_body %}
<div class="eccs-central">
<h1><a href="/eccs" target="_self">eduGAIN Connectivity Check Service</a> (<a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Connectivity+Check">Instructions</a>, <a href="mailto:support@edugain.org">Contacts</a>)</h1>
<p>The purpose of the eduGAIN Connectivity Check is to identify eduGAIN Identity Providers (IdP) that does not properly consume eduGAIN SAML2 SP metadata.</p>
<div id="status">
<hr>
<div class="clearfix">
<div class="boxStatus">
<strong>Show IdPs with status:</strong>
<label id="lbl-error" for="error">ERROR</label>
<input id="error" type="checkbox" name="status" value="ERROR"/>
<label id="lbl-ok" for="ok">OK</label>
<input id="ok" type="checkbox" name="status" value="OK"/>
<label id="lbl-unknown" for="unknown">UNKNOWN</label>
<input id="unknown" type="checkbox" name="status" value="UNKNOWN"/>
<label id="lbl-disabled" for="disabled">DISABLED</label>
<input id="disabled" type="checkbox" name="status" value="DISABLE"/>
</div> <!-- END boxStatus -->
<div class="boxCalendar">
<div id="calendarGo">
<button id="goButton" onclick="getPastResults()">Go</button>
<label id="lbl-datepicker" for="datepicker" class="strong">Select date:</label>
<input type="text" id="datepicker" />
</div> <!-- END calendarGo -->
</div> <!-- END boxCalendar -->
</div> <!-- END clearFix -->
<hr>
</div> <!-- END status -->
<div class="container">
<div class="loader"></div>
<table id="eccstable" class="cell-border" style="width:100%">
<thead>
<tr>
<th></th>
<th>DisplayName</th>
<th>EntityID</th>
<th>Registration Authority</th>
</tr>
</thead>
</table>
</div> <!-- END container -->
<script type="text/javascript">
var date = "{{ date }}";
var reg_auth = "{{ reg_auth }}";
var idp = "{{ idp }}";
var status = "{{ status }}";
var check_result = "{{ check_result }}";
</script>
<script type="text/javascript" src="js/eccs.js" /></script>
</div> <!-- END eccs-central -->
{% endblock main_body %}
td.details-control {
background: url('../images/details_open.png') no-repeat center center;
cursor: pointer;
}
tr.shown td.details-control {
background: url('../images/details_close.png') no-repeat center center;
}
#lbl-error, #lbl-ok, #lbl-disabled, #lbl-unknown {
position: relative;
top: -1px;
padding: 5px;
color: black;
margin-left: 4px;
}
#lbl-error {
background-color: #EA3D3F;
}
#lbl-ok {
background-color: #72F81B;
}
#lbl-unknown {
background-color: #FFDB58;
}
#lbl-disabled {
margin-left: 2px;
}
#inner-table {
padding-left:40px;
background-color:white;
}
#inner-table tr td{
border: 0;
}
table {
color: black;
}
.eccs-central {
padding-left: 10px;
padding-right: 10px;
}
.strong {
font-weight: bold;
}
div#calendarGo {
float:right;
position: relative;
top: 2px;
}
button#goButton {
float:right;
padding-right: 10px;
padding-left: 10px;
padding-bottom: 3px;
padding-top: 3px;
margin-left: 5px;
margin-top: 1px;
position: relative;
bottom: 1px;
}
input[type=checkbox] {
transform: scale(1.5);
}
#error, #ok, #disabled, #unknown {
position: relative;
bottom: -2px;
}
#datepicker {
padding: 3px;
}
* {
box-sizing: border-box;
}
.boxStatus {
float: left;
width: 50%;
padding: 5px;
}
.boxCalendar {
float: left;
width: 50%;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
/* CSS Rules for Mozilla Firefox */
@-moz-document url-prefix() {
div#calendarGo {
float:right;
position: relative;
top: 3px;
}
button#goButton {
float:right;
padding-right: 0;
padding-left: 0;
padding-bottom: 2px;
padding-top: 0;
margin-left: 5px;
position: relative;
bottom: 1px;
}
}
.tooltip {
position: relative;
display: inline-block;
border-bottom: 1px dotted #ccc;
color: #004360;
}
.tooltip .tooltiptext {
visibility: hidden;
position: absolute;
background-color: #555;
color: #fff;
text-align: center;
padding: 5px 0;
border-radius: 6px;
z-index: 1;
opacity: 0;
transition: opacity .6s;
}
.tooltip:hover .tooltiptext {
visibility: visible;
opacity: 1;
}
.tooltip-top {
bottom: 125%;
left: 50%;
}
.tooltip-top::after {
content: "";
position: absolute;
top: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: #555 transparent transparent transparent;
}
.tooltip-ok {
width: 540px;
margin-left: -270px;
}
.tooltip-timeout {
width: 380px;
margin-left: -190px;
}
.tooltip-unable-to-check {
width: 170px;
margin-left: -83px;
}
.tooltip-connection-error {
width: 230px;
margin-left: -100px;
}
.tooltip-no-sp-metadata-error {
width: 400px;
margin-left: -200px;
}
.tooltip-idp-generic-error {
width: 180px;
margin-left: -84px;
}
.tooltip-403-forbidden {
width: 180px;
margin-left: -84px;
}
.tooltip-ssl-error {
width: 280px;
margin-left: -140px;
}
.tooltip-disabled {
width: 260px;
margin-left: -130px;
}
.loader {
background: url('./eccs-loading.gif') no-repeat center center;
position: absolute;
width: 100%;
height: 80%;
background-color: white;
padding-top: 150px;
padding-left: 50%;
z-index: 5;
opacity: 0.6;
display: none;
background-size: 100px 100px;
}
web/images/details_close.png

570 B

web/images/details_open.png

600 B

// Needed to draw the ECCS2 DataTable
var table;
var url = "/eccs/api/eccsresults?eccsdt=1";
var infoCircle = '<a href="https://wiki.geant.org/display/eduGAIN/eduGAIN+Connectivity+Check#eduGAINConnectivityCheck-Statusesandresults"><i class="fas fa-info-circle"></i></a>';
/*
* Secure Hash Algorithm (SHA1)
* https://www.webtoolkit.info/javascript_sha1.html
*/
function SHA1(msg) {
function rotate_left(n,s) {
var t4 = ( n<<s ) | (n>>>(32-s));
return t4;
};
function lsb_hex(val) {
var str='';
var i;
var vh;
var vl;
for( i=0; i<=6; i+=2 ) {
vh = (val>>>(i*4+4))&0x0f;
vl = (val>>>(i*4))&0x0f;
str += vh.toString(16) + vl.toString(16);
}
return str;
};
function cvt_hex(val) {
var str='';
var i;
var v;
for( i=7; i>=0; i-- ) {
v = (val>>>(i*4))&0x0f;
str += v.toString(16);
}
return str;
};
function Utf8Encode(string) {
string = string.replace(/\r\n/g,'\n');
var utftext = '';
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
};
var blockstart;
var i, j;
var W = new Array(80);
var H0 = 0x67452301;
var H1 = 0xEFCDAB89;
var H2 = 0x98BADCFE;
var H3 = 0x10325476;
var H4 = 0xC3D2E1F0;
var A, B, C, D, E;
var temp;
msg = Utf8Encode(msg);
var msg_len = msg.length;
var word_array = new Array();
for( i=0; i<msg_len-3; i+=4 ) {
j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
word_array.push( j );
}
switch( msg_len % 4 ) {
case 0:
i = 0x080000000;
break;
case 1:
i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
break;
case 2:
i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
break;
case 3:
i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8 | 0x80;
break;
}
word_array.push( i );
while( (word_array.length % 16) != 14 ) word_array.push( 0 );
word_array.push( msg_len>>>29 );
word_array.push( (msg_len<<3)&0x0ffffffff );
for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
A = H0;
B = H1;
C = H2;
D = H3;
E = H4;
for( i= 0; i<=19; i++ ) {
temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B,30);
B = A;
A = temp;
}
for( i=20; i<=39; i++ ) {
temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B,30);
B = A;
A = temp;
}
for( i=40; i<=59; i++ ) {
temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B,30);
B = A;
A = temp;
}
for( i=60; i<=79; i++ ) {
temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
E = D;
D = C;
C = rotate_left(B,30);
B = A;
A = temp;
}
H0 = (H0 + A) & 0x0ffffffff;
H1 = (H1 + B) & 0x0ffffffff;
H2 = (H2 + C) & 0x0ffffffff;
H3 = (H3 + D) & 0x0ffffffff;
H4 = (H4 + E) & 0x0ffffffff;
}
var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
return temp.toLowerCase();
}
// PHP Variables retrieved from eccs.php
// idp (entityID of the IdP)
// date (date time of the check)
// reg_auth (the IdP RegistrationAuthority)
// status (the ECCS IdP Status)
// check_result (the ECCS check result)
if (date) {
url = url.concat("&date=" + date);
}
if (reg_auth) {
url = url.concat("&reg_auth=" + reg_auth);
}
if (idp) {
url = url.concat("&idp=" + idp);
}
if (status) {
url = url.concat("&status=" + status);
}
if (check_result) {
url = url.concat("&check_result=" + check_result);
}
function getPastResults() {
let checkDate = $.datepicker.formatDate("yy-mm-dd", $('#datepicker').datepicker().datepicker('getDate'));
let getUrl = window.location;
let baseUrl = getUrl.protocol + "//" + getUrl.host + "/";
let dataSource = baseUrl + "/eccs/api/eccsresults?eccsdt=1&date=" + checkDate;
$('.loader').css('display','block');
table.clear().draw();
table.ajax.url(dataSource).load(hideLoder);
function hideLoder() {
$('.loader').css('display','none');
}
}
// use URL constructor and return hostname
function getHostname(url) {
if (url == ""){
return null
}
const urlNew = new URL(url);
if (urlNew.hostname){
return urlNew.hostname;
}
else {
return url.replace(/.+:/g, '');
}
}
function getCheckResult(checkResult){
if (checkResult == "OK"){
return '<div class="tooltip">OK <span class="tooltiptext tooltip-top tooltip-ok">The IdP is consuming correctly the SP metadata and returns a valid login page</span></div> '+infoCircle;
}
else if (checkResult == "Timeout"){
return '<div class="tooltip">Timeout <span class="tooltiptext tooltip-top tooltip-timeout">The IdP does not load a valid login page within 60 seconds</span></div> '+infoCircle;
}
else if (checkResult == "Unable-To-Check"){
return '<div class="tooltip">Unable To Check <span class="tooltiptext tooltip-top tooltip-unable-to-check">The IdP can\'t be checked</span></div> '+infoCircle;
}
else if (checkResult == "Connection-Error"){
return '<div class="tooltip">Connection Error <span class="tooltiptext tooltip-top tooltip-connection-error">Check failed due a connection error</span></div> '+infoCircle;
}
else if (checkResult == "No-SP-Metadata-Error"){
return '<div class="tooltip">No-SP-Metadata-Error <span class="tooltiptext tooltip-top tooltip-no-sp-metadata-error">The IdP is not consuming correctly the SP metadata</span></div> '+infoCircle
}
else if (checkResult == "IdP-Generic-Error"){
return '<div class="tooltip">IdP-Generic-Error <span class="tooltiptext tooltip-top tooltip-idp-generic-error">The IdP reported an error</span></div> '+infoCircle
}
else if (checkResult == "403-Forbidden"){
return '<div class="tooltip">403-Forbidden <span class="tooltiptext tooltip-top tooltip-403-forbidden">The IdP reported a "403 Forbidden" error</span></div> '+infoCircle
}
else if (checkResult == "SSL-Error"){
return '<div class="tooltip">SSL-Error <span class="tooltiptext tooltip-top tooltip-ssl-error">The IdP has a problem on its SSL certificate</span></div> '+infoCircle;
}
else if (checkResult == "DISABLED"){
return '<div class="tooltip">Disabled <span class="tooltiptext tooltip-top tooltip-disabled">The check has been disabled for the IdP</span></div> '+infoCircle;
}
else{
return checkResult;
}
}
/* Formatting function for row details - modify as you need */
function format ( d ) {
// `d` is the original data object for the row
return '<table id="inner-table">'+
'<tr>'+
'<td class="strong">IdP DisplayName:</td>'+
'<td>'+d.displayName+'</td>'+
'</tr>'+
'<tr>'+
'<td class="strong">Technical Contacts:</td>'+
'<td>'+d.contacts.technical+'</td>'+
'</tr>'+
'<tr>'+
'<td class="strong">Support Contacts:</td>'+
'<td>'+d.contacts.support+'</td>'+
'<td class="strong">Check Time</td>'+
'<td class="strong">Check Result</td>'+
//'<td class="strong">HTTP Code</td>'+
'<td class="strong">Page Source</td>'+
'<td class="strong">Retry Check</td>'+
'</tr>'+
'<tr>'+
'<td class="strong">SP1:</td>'+
'<td>https://'+getHostname(d.sp1.entityID)+'</td>'+
'<td>'+d.sp1.checkTime+'</td>'+
'<td>'+getCheckResult(d.sp1.checkResult)+'</td>'+
//'<td>'+d.sp1.httpCode+'</td>'+
'<td><a href="/eccs/html/'+d.date+'/'+SHA1(d.entityID)+'---'+getHostname(d.sp1.entityID)+'.html" target="_blank">Click to open</a></td>'+
'<td><a href="/eccs/api/getsamlreq?idp='+d.entityID+'&sp='+d.sp1.entityID+'" target="_blank">Click to retry</a></td>'+
'</tr>'+
'<tr>'+
'<td class="strong">SP2:</td>'+
'<td>https://'+getHostname(d.sp2.entityID)+'</td>'+
'<td>'+d.sp2.checkTime+'</td>'+
'<td>'+getCheckResult(d.sp2.checkResult)+'</td>'+
//'<td>'+d.sp2.httpCode+'</td>'+
'<td><a href="/eccs/html/'+d.date+'/'+SHA1(d.entityID)+'---'+getHostname(d.sp2.entityID)+'.html" target="_blank">Click to open</a></td>'+
'<td><a href="/eccs/api/getsamlreq?idp='+d.entityID+'&sp='+d.sp2.entityID+'" target="_blank">Click to retry</a></td>'+
'</tr>'+
'<tr>'+
'<td class="strong">SP3:</td>'+
'<td>https://'+getHostname(d.sp3.entityID)+'</td>'+
'<td>'+d.sp3.checkTime+'</td>'+
'<td>'+getCheckResult(d.sp3.checkResult)+'</td>'+
//'<td>'+d.sp3.httpCode+'</td>'+
'<td><a href="/eccs/html/'+d.date+'/'+SHA1(d.entityID)+'---'+getHostname(d.sp3.entityID)+'.html" target="_blank">Click to open</a></td>'+
'<td><a href="/eccs/api/getsamlreq?idp='+d.entityID+'&sp='+d.sp3.entityID+'" target="_blank">Click to retry</a></td>'+
'</tr>'+
'</table>';
}
$(document).ready(function() {
// Setup - add a text input to each footer cell
$('#eccstable thead tr').clone(true).appendTo( '#eccstable thead' );
$('#eccstable thead tr:not(:eq(1)) th').each( function (i) {
var title = $('#eccstable thead th').eq( $(this).index() ).text();
if($(this).index() !=0 && $(this).index() !=5) $(this).html( '<input type="text" placeholder="Search '+title+'" style="text-align:center;width: 100%;" />' );
$( 'input', this ).on( 'keyup change', function () {
if ( table.column(i).search() !== this.value ) {
table
.column(i)
.search( this.value )
.draw();
}
} );
} );
table = $('#eccstable').DataTable( {
"responsive": "true",
"ajax": {
"url": url,
"dataSrc": ""
},
"lengthMenu": [[10, 30, 50, 100, -1], [10, 30, 50, 100, "All"]],
"autoWidth": false,
"dom": '<"top"lip>rt<"bottom"><"clear">',
"columns": [
{
"className": 'details-control',
"orderable": false,
"data": null,
"defaultContent": ''
},
{
"data": "displayName",
"defaultContent": ''
},
{ "data": "entityID" },
{ "data": "registrationAuthority" },
{
"data": "date",
"width": "180px",
"className": "dt-body-center",
"visible": false
},
{
"data": "status",
"className": "dt-body-center",
"visible": false
}
],
"rowCallback": function( row, data, index ) {
if (data.status == "ERROR") {
//$('td', row).css('background-color', '#EA4335'); // NEW ECCS2
$('td', row).css('background-color', '#EA3D3F'); // OLD ECCS
//$('td', row).css('background-color', '#FF0000');
//$('td', row).css('background-color', '#F22422');
}
if (data.status == "DISABLED") {
$('td', row).css('background-color', '#FFFFFF');
}
if (data.status == "OK") {
//$('td', row).css('background-color', '#34A853');
//$('td', row).css('background-color', '#00CE00'); // NEW ECCS2
$('td', row).css('background-color', '#72F81B'); // OLD ECCS
}
if (data.status == "UNKNOWN") {
$('td', row).css('background-color', '#FFDB58');
}
},
"order": [[1, 'asc']]
} );
// Add event listener for opening and closing details
$('#eccstable tbody').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row( tr );
if ( row.child.isShown() ) {
// This row is already open - close it
row.child.hide();
tr.removeClass('shown');
}
else {
// Open this row
row.child( format(row.data()) ).show();
tr.addClass('shown');
}
} );
$('input:checkbox').on('change', function () {
//build a regex filter string with an or(|) condition
var sts = $('input:checkbox[name="status"]:checked').map(function() {
return this.value;
}).get().join('|');
//filter in column 5, with an regex, no smart filtering, not case sensitive
table.column(5).search(sts, true, false, false).draw(false);
});
} );
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment