String.prototype.padLeft = function (length, character) { return new Array(length - this.length + 1).join(character || ' ') + this; }; Date.prototype.toFormattedString = function () { return [String(this.getMonth()+1).padLeft(2, '0'), String(this.getDate()).padLeft(2, '0'), String(this.getFullYear()).substr(2, 2)].join("/") + " " + [String(this.getHours()).padLeft(2, '0'), String(this.getMinutes()).padLeft(2, '0')].join(":"); }; function principalAttributes(obj) { var output = ''; for (var key in obj) { if (obj.hasOwnProperty(key)) { if (Array.isArray(obj[key])) { output = output.concat(''); } else { output = output.concat(''); } } } output = output.concat('
'+ key +'' + obj[key].toString() + '
'+ key +'' + obj[key] + '
'); return output; } function authenticatedServices(obj) { var output = ''; for (var key in obj) { if (obj.hasOwnProperty(key)) { output = output.concat('
' + key + '
'); for (foo in obj[key] ) { if (obj[key].hasOwnProperty(foo)) { if (Array.isArray(obj[key][foo])) { output = output.concat(''); } else { output = output.concat(''); } } } output = output.concat('
'+ foo +':' + obj[key][foo].toString() + '
'+ foo +':' + obj[key][foo] + '
'); } } return output; } /* Formatting function for row details - modify as you need */ function format ( d ) { return '' + ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ '' + ''+ ''+ ''+ '' + ''+ ''+ ''+ ''+ ''+ '
Ticket Granting Ticket:'+d.ticket_granting_ticket+'
Principal Attributes:' + principalAttributes(d.principal_attributes) + '
Authenticated Services:' + authenticatedServices(d.authenticated_services); '
Ticket Granting Service:
'; } function updateAdminPanels( data ) { //$('#totalUsers').text(data.totalPrincipals); $('#totalUsers').text(data.activeSsoSessions.length); $('#totalUsageSessions').text( sum(data.activeSsoSessions, 'number_of_uses') ); //$('#totalProxied').text(data.totalTicketGrantingTickets); $('#totalTGTs').text(data.totalTicketGrantingTickets); //$('#totalTGTs').text( sum(data.activeSsoSessions, 'is_proxied' ) ); } function sum( obj, prop ) { var sum = 0; for( var el in obj ) { if( obj.hasOwnProperty( el ) ) { sum += ( typeof obj[el][prop] == 'boolean' ) ? +obj[el][prop] : obj[el][prop] ; } } return sum; } function showError(msg) { $("#msg").removeClass(); $("#msg").addClass("errors"); $("#msg").text(msg); $("#msg").show(); } function showInfo(msg) { $("#msg").removeClass(); $("#msg").addClass("info"); $("#msg").text(msg); $("#msg").show(); } function alertUser(message, alertType) { $('#alertWrapper').append('
' + '' + '' + message + '
' ); setTimeout(function() { // this will automatically close the alert and remove this if the users doesnt close it in 5 secs $("#alertdiv").remove(); }, 5000); } function removeSession( ticketId ) { var factory = {}; factory.httpHeaders = {}; factory.messages = {}; factory.httpHeaders[ $("meta[name='_csrf_header']").attr("content") ] = $("meta[name='_csrf']").attr("content"); factory.ticketId = ticketId; if (ticketId && (ticketId == 'ALL' || ticketId == 'PROXIED' || ticketId == 'DIRECT' ) ) { factory.url = urls.destroy.all factory.data = { type: ticketId }; factory.messages.success = 'Removed ' + ticketId + ' tickets successfully.'; factory.messages.error = 'Could not remove ' + ticketId + ' tickets.'; } else { factory.url = urls.destroy.single factory.data = { ticketGrantingTicket: factory.ticketId }; factory.messages.success = 'Ticket is removed successfully.'; factory.messages.error = 'Ticket is not removed successfully.'; } $.ajax({ type: 'post', url: factory.url, //data: { ticketGrantingTicket: factory.ticketId, type: 'ALL' }, data: factory.data, headers: factory.httpHeaders, dataType: 'json', success: function (data, status) { // Reinitialize the table data $('#ssoSessions').DataTable().ajax.reload(); if ( data.status != 200 ) { alertUser(factory.messages.error, 'danger'); } else { alertUser( factory.messages.success, 'success' ); // Reload the page location.reload(); } }, error: function(xhr, status) { alertUser('There appears to be an error. Please try your request again.', 'danger'); } }); } var ssoSessions = (function () { var createDataTable = function() { $('#ssoSessions').DataTable( { "order": [[ 3, "desc" ]], "initComplete": function(settings, json) { if (!json || json.activeSsoSessions.length == 0) { $('#loadingMessage').hide(); $('#no-cas-sessions').show(); } else { updateAdminPanels( json ); $('#loadingMessage').hide(); $("#no-cas-sessions").hide(); $("#cas-sessions").show(); } }, "language": { //"infoEmpty": "No active sessions were found", "emptyTable": "No sessions found", "zeroRecords": "No matching sessions found" }, "processing": true, "ajax": { "url": urls.getSessions, "dataSrc": "activeSsoSessions" }, columnDefs: [ { "targets": 0, "className": 'details-control', "orderable": false, "data": null, "defaultContent": '' }, { "targets": 1, "data": 'is_proxied', 'className': 'col-xs-2 col-md-1', "render" : function ( data, type, full, meta ) { if ( data === true) { return 'Proxy'; } else { return ' '; } } }, { "targets": 2, "data": 'authenticated_principal', "className": 'col-xs-4 col-md-2', "render": function ( data, type, full, meta ) { return type === 'display' && data.length > 20 ? ''+data.substr( 0, 18 )+'...' : data; } }, { "targets": 3, "data": 'ticket_granting_ticket', "className": 'hidden-xs hidden-sm col-md-4', "render": function ( data, type, full, meta ) { return type === 'display' && data.length > 20 ? ''+data.substr( 0, 40 )+'...' : data; } }, { "targets": 4, "data": 'authentication_date_formatted', "className": 'col-xs-4 col-sm-4 col-md-2' }, { "targets": 5, "data": 'number_of_uses', "className": 'hidden-xs hidden-sm visible-md-* col-md-2' }, { "targets": 6, "data": "ticket_granting_ticket", "className": 'col-xs-2 col-sm-2 col-md-1', "render": function (data, type, full, meta ) { return ''; }, "orderable": false }, ] } ); }; var addEventHandlers = function() { /** * The Bulk remove button */ $('#removeAllSessionsButton').on('click', function(e) { e.preventDefault(); removeSession(this.value); }); /** * Individual removal button */ $(document).on('click', '#ssoSessions tbody tr td:last-child button.btn-danger', function (e) { e.preventDefault(); removeSession( this.value ); }); /** * The filter buttons */ $('#filterButtons .btn').click(function() { var filter = $(this).data('filter'); var table = $('#ssoSessions').DataTable(); // Create Filter RegEx: if ( filter == 'proxied') { var filterRegex = '^Proxy$'; var deleteValue = 'PROXIED'; var btnText = 'Remove xx Proxied Sessions'; } else if ( filter == 'non-proxied') { var filterRegex = '^ $'; var deleteValue = 'DIRECT'; var btnText = 'Remove xx Non-Proxied Sessions'; } else { var filterRegex = ''; var deleteValue = 'ALL'; var btnText = 'Remove All Sessions'; } var searchTerm = table.column( 1 ).search(filterRegex, true, false).draw(); $('#removeAllSessionsButton').val( deleteValue ).html(btnText.replace('xx', searchTerm.page.info().recordsDisplay )) }); // Add event listener for opening and closing details $(document).on('click', '#ssoSessions tbody td.details-control', function () { var table = $('#ssoSessions').DataTable(); 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()), 'info' ).show(); tr.addClass('shown'); } } ); }; // initialization ******* ( function init () { addEventHandlers(); createDataTable(); })(); // Public Methods return { /** * Not used */ }; })();