<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Analysis Information Leak framework Dashboard</title> <!-- Core CSS --> <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='css/sb-admin-2.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='css/dygraph_gallery.css') }}" rel="stylesheet" type="text/css" /> <link href="{{ url_for('static', filename='css/dataTables.bootstrap.css') }}" rel="stylesheet" type="text/css" /> <!-- JS --> <script type="text/javascript" src="{{ url_for('static', filename='js/dygraph-combined.js') }}"></script> <script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script> <script src="{{ url_for('static', filename='js/jquery.dataTables.min.js') }}"></script> <script src="{{ url_for('static', filename='js/dataTables.bootstrap.js') }}"></script> <!-- Custom style --> <style> .tooltip-inner { text-align: left; height: 200%; max-width: 500px; max-height: 500px; font-size: 13px; } pre { white-space:pre-wrap; word-wrap:break-word; } </style> </head> <body> <div id="wrapper"> <nav class="navbar navbar-default navbar-static-top" role="navigation" style="margin-bottom: 0"> {% include 'header.html' %} <!-- /.navbar-top-links --> <div class="navbar-default sidebar" role="navigation"> <div class="sidebar-collapse"> <ul class="nav" id="side-menu"> {% include 'searchbox.html' %} </ul> <!-- /#side-menu --> </div> <!-- /.sidebar-collapse --> <a href="{{ url_for('index') }}"><img src="{{ url_for('static', filename='image/AIL.png') }}" /></a> </div> <!-- /.navbar-static-side --> </nav> <!-- Modal --> <div id="mymodal" class="modal fade" role="dialog"> <div class="modal-dialog modal-lg"> <!-- Modal content--> <div id="mymodalcontent" class="modal-content"> <div id="mymodalbody" class="modal-body" max-width="850px"> <p>Loading paste information...</p> <img id="loading-gif-modal" src="{{url_for('static', filename='image/loading.gif') }}" height="26" width="26" style="margin: 4px;"> </div> <div class="modal-footer"> <a id="button_show_path" target="_blank" href=""><button type="button" class="btn btn-info">Show saved paste</button></a> <button type="button" class="btn btn-default" data-dismiss="modal" >Close</button> </div> </div> </div> </div> <div id="page-wrapper"> <!-- /.row --> <div class="row"> </div> <div class="row"> <div class="col-lg-12"> </br> <div class="panel panel-default"> <div class="panel-heading"> <i class="glyphicon glyphicon-search"></i> <b id="numberOfRes">{{ r|length }}</b> Results for "<strong>{{ query }}</strong> <div class="pull-right"> </div> </div> <!-- /.panel-heading --> <div class="panel-body"> <table class="table table-striped table-bordered table-hover" id="myTable"> <thead> <tr> <th>#</th> <th style="max-width: 800px;">Path</th> <th>Date</th> <th>Size (Kb)</th> <th>Action</th> </tr> </thead> <tbody id="table_body"> {% set i = 0 %} {% for path in r %} <tr> <td>{{ i + 1 }}</td> <td><a target="_blank" href="{{ url_for('showsavedpaste') }}?paste={{ path }}&num={{ i+1 }}"> {{ path }}</a></td> <td>{{ paste_date[i] }}</td> <td>{{ paste_size[i] }}</td> <td><p><span class="glyphicon glyphicon-info-sign" data-toggle="tooltip" data-placement="left" title="{{ c[i] }}"></span> <button type="button" class="btn-link" data-num="{{ i + 1 }}" data-toggle="modal" data-target="#mymodal" data-url="{{ url_for('showsavedpaste') }}?paste={{ path }}&num={{ i+1 }}" data-path="{{ path }}"><span class="fa fa-search-plus"></span></button></p></td> </tr> {% set i = i + 1 %} {% endfor %} </tbody> </table> <div id="div_stil_data"> <button id="load_more_json_button1" type="button" class="btn btn-default" onclick="add_entries();" style="display: none">Load 50 entries</button> <strong> Totalling {{ num_res }} results related to paste content </strong> </div> </div> <!-- /.panel-body --> </div> </div> <!-- /.row --> </div> <!-- /#page-wrapper --> </div> <script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script> </br> </body> <!-- enable tooltip and dataTable --> <script> var search_table; var last_clicked_paste; var can_change_modal_content = true; var page_offset; var offset; var all_loaded; var init_num_of_elements_in_table; var query; var pagelen = 50; $(document).ready(function(){ $('[data-toggle="tooltip"]').tooltip(); $("#button_show_path").hide(); search_table = $('#myTable').DataTable(); query = "{{ query }}"; offset = 0; page_offset = 2; //page 1 already loaded all_loaded = false; init_num_of_elements_in_table = parseInt("{{ r|length }}"); // Comes from the file search if (init_num_of_elements_in_table == pagelen) { $("#load_more_json_button1").show(); } }); </script> <script> // Loop to recover all the data from get_more_search_results // And add it dynamically top the dataTable function add_entries() { //Used to disable the button before going to the big loop $("#load_more_json_button1").attr('disabled','disabled'); setTimeout(function() { load_search_50_data();}, 50); } function load_search_50_data() { var options = { query: query, page_offset: page_offset }; $.post( "{{ url_for('get_more_search_result') }}", options).done(function( data ) { for(i=0; i<data.path_array.length; i++) { var curr_preview = data.preview_array[i].replace(/\"/g, "\'"); search_table.row.add( [ init_num_of_elements_in_table+((offset))+i+1, "<a target=\"_blank\" href=\"{{ url_for('showsavedpaste') }}?paste="+data.path_array[i]+"&num="+i+"\"> "+ data.path_array[i] +"</a>", data.date_array[i], data.size_array[i], "<p><span class=\"glyphicon glyphicon-info-sign\" data-toggle=\"tooltip\" data-placement=\"left\" title=\""+curr_preview+"\"></span> <button type=\"button\" class=\"btn-link\" data-num=\""+i+"\" data-toggle=\"modal\" data-target=\"#mymodal\" data-url=\"{{ url_for('showsavedpaste') }}?paste="+data.path_array[i]+"&num="+i+"\" data-path=\""+data.path_array[i]+"\"><span class=\"fa fa-search-plus\"></span></button></p>" ] ).draw( false ); } offset = offset + data.path_array.length; page_offset = page_offset+1; $("#numberOfRes").text(parseInt($("#numberOfRes").text()) + data.path_array.length); if (data.moreData == true) { //continue } else { all_loaded = true; $("#load_more_json_button1").hide(); } $("#load_more_json_button1").removeAttr('disabled'); return data.path_array.length; }); } </script> <!-- Dynamically update the modal --> <script type="text/javascript"> // static data var alert_message = '<div class="alert alert-info alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button><strong>No more data.</strong> Full paste displayed.</div>'; var complete_paste = null; var char_to_display = {{ char_to_display }}; var start_index = 0; // When the modal goes out, refresh it to normal content $("#mymodal").on('hidden.bs.modal', function () { can_change_modal_content = true; $("#mymodalbody").html("<p>Loading paste information...</p>"); var loading_gif = "<img id='loading-gif-modal' class='img-center' src=\"{{url_for('static', filename='image/loading.gif') }}\" height='26' width='26' style='margin: 4px;'>"; $("#mymodalbody").append(loading_gif); // Show the loading GIF $("#button_show_path").attr('href', ''); $("#button_show_path").hide(); complete_paste = null; start_index = 0; }); // Update the paste preview in the modal function update_preview() { if (start_index + char_to_display > complete_paste.length-1){ // end of paste reached var final_index = complete_paste.length-1; var flag_stop = true; } else { var final_index = start_index + char_to_display; } if (final_index != start_index){ // still have data to display // Append the new content using text() and not append (XSS) $("#mymodalbody").find("#paste-holder").text($("#mymodalbody").find("#paste-holder").text() + complete_paste.substring(start_index+1, final_index+1)); start_index = final_index; if (flag_stop) nothing_to_display(); } else { nothing_to_display(); } } // Update the modal when there is no more data function nothing_to_display() { var new_content = $(alert_message).hide(); $("#mymodalbody").find("#panel-body").append(new_content); new_content.show('fast'); $("#load-more-button").hide(); } $('#myTable').on( 'draw.dt', function () { // Bind tooltip each time we draw a new page $('[data-toggle="tooltip"]').tooltip(); // On click, get html content from url and update the corresponding modal $("[data-toggle='modal']").off('click.openmodal').on("click.openmodal", function (event) { var modal=$(this); var url = " {{ url_for('showpreviewpaste') }}?paste=" + $(this).attr('data-path') + "&num=" + $(this).attr('data-num'); last_clicked_paste = $(this).attr('data-num'); $.get(url, function (data) { // verify that the reveived data is really the current clicked paste. Otherwise, ignore it. var received_num = parseInt(data.split("|num|")[1]); if (received_num == last_clicked_paste && can_change_modal_content) { can_change_modal_content = false; // clear data by removing html, body, head tags. prevent dark modal background stack bug. var cleared_data = data.split("<body>")[1].split("</body>")[0]; $("#mymodalbody").html(cleared_data); setTimeout(function() { $('#tableDup').DataTable(); }, 150); var button = $('<button type="button" id="load-more-button" class="btn btn-info btn-xs center-block" data-url="' + $(modal).attr('data-path') +'" data-toggle="tooltip" data-placement="bottom" title="Load more content"><span class="glyphicon glyphicon-download"></span></button>'); button.tooltip(); $("#mymodalbody").children(".panel-default").append(button); $("#button_show_path").attr('href', $(modal).attr('data-url')); $("#button_show_path").show('fast'); $("#loading-gif-modal").css("visibility", "hidden"); // Hide the loading GIF if ($("[data-initsize]").attr('data-initsize') < char_to_display) { // All the content is displayed nothing_to_display(); } // On click, donwload all paste's content $("#load-more-button").off('click.download').on("click.download", function (event) { if (complete_paste == null) { //Donwload only once $.get("{{ url_for('getmoredata') }}"+"?paste="+$(modal).attr('data-path'), function(data, status){ complete_paste = data; update_preview(); }); } else { update_preview(); } }); } else if (can_change_modal_content) { $("#mymodalbody").html("Ignoring previous not finished query of paste #" + received_num); } }); }); } ); </script> </html>