mirror of https://github.com/CIRCL/AIL-framework
chg: [core + UI] search domain by tags
parent
b4a36d812f
commit
99897ffa9b
|
@ -23,6 +23,12 @@ config_loader = ConfigLoader.ConfigLoader()
|
||||||
r_serv_metadata = config_loader.get_redis_conn("ARDB_Metadata")
|
r_serv_metadata = config_loader.get_redis_conn("ARDB_Metadata")
|
||||||
config_loader = None
|
config_loader = None
|
||||||
|
|
||||||
|
def is_valid_object_type(object_type):
|
||||||
|
if object_type in ['domain', 'item', 'screenshot']:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
def get_all_objects():
|
def get_all_objects():
|
||||||
return ['domain', 'paste', 'pgp', 'cryptocurrency', 'decoded', 'screenshot']
|
return ['domain', 'paste', 'pgp', 'cryptocurrency', 'decoded', 'screenshot']
|
||||||
|
|
||||||
|
@ -189,6 +195,13 @@ def get_item_url(correlation_name, value, correlation_type=None):
|
||||||
url = url_for(endpoint, paste=value)
|
url = url_for(endpoint, paste=value)
|
||||||
return url
|
return url
|
||||||
|
|
||||||
|
def get_obj_tag_table_keys(object_type):
|
||||||
|
'''
|
||||||
|
Warning: use only in flask (dynamic templates)
|
||||||
|
'''
|
||||||
|
if object_type=="domain":
|
||||||
|
return ['id', 'first_seen', 'last_check', 'status'] # # TODO: add root screenshot
|
||||||
|
|
||||||
|
|
||||||
def create_graph_links(links_set):
|
def create_graph_links(links_set):
|
||||||
graph_links_list = []
|
graph_links_list = []
|
||||||
|
@ -316,6 +329,7 @@ def get_graph_node_object_correlation(object_type, root_value, mode, correlation
|
||||||
|
|
||||||
|
|
||||||
######## API EXPOSED ########
|
######## API EXPOSED ########
|
||||||
|
def sanitize_object_type(object_type):
|
||||||
|
if not is_valid_object_type(object_type):
|
||||||
|
return ({'status': 'error', 'reason': 'Incorrect object_type'}, 400)
|
||||||
######## ########
|
######## ########
|
||||||
|
|
|
@ -200,6 +200,20 @@ def get_tag_metadata(tag, r_int=False):
|
||||||
tag_metadata['last_seen'] = get_tag_last_seen(tag)
|
tag_metadata['last_seen'] = get_tag_last_seen(tag)
|
||||||
return tag_metadata
|
return tag_metadata
|
||||||
|
|
||||||
|
def get_tags_min_last_seen(l_tags, r_int=False):
|
||||||
|
'''
|
||||||
|
Get max last seen from a list of tags (current: item only)
|
||||||
|
'''
|
||||||
|
min_last_seen = 99999999
|
||||||
|
for tag in l_tags:
|
||||||
|
last_seen = get_tag_last_seen(tag, r_int=True)
|
||||||
|
if last_seen < min_last_seen:
|
||||||
|
min_last_seen = last_seen
|
||||||
|
if r_int:
|
||||||
|
return min_last_seen
|
||||||
|
else:
|
||||||
|
return str(min_last_seen)
|
||||||
|
|
||||||
def is_obj_tagged(object_id, tag):
|
def is_obj_tagged(object_id, tag):
|
||||||
'''
|
'''
|
||||||
Check if a object is tagged
|
Check if a object is tagged
|
||||||
|
@ -431,6 +445,106 @@ def delete_obj_tags(object_id, object_type, tags=[]):
|
||||||
if res:
|
if res:
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def sanitise_tags_date_range(l_tags, date_from=None, date_to=None):
|
||||||
|
if date_from and date_to is None:
|
||||||
|
date_from = get_tags_min_last_seen(l_tags, r_int=False)
|
||||||
|
date_to = date_from
|
||||||
|
return Date.sanitise_date_range(date_from, date_to)
|
||||||
|
|
||||||
|
|
||||||
|
# # TODO: verify tags + object_type
|
||||||
|
# get set_keys: intersection
|
||||||
|
def get_obj_keys_by_tags(object_type, l_tags, date_day=None):
|
||||||
|
l_set_keys = []
|
||||||
|
if object_type=='item':
|
||||||
|
for tag in l_tags:
|
||||||
|
l_set_keys.append('{}:{}'.format(tag, date_day))
|
||||||
|
else:
|
||||||
|
for tag in l_tags:
|
||||||
|
l_set_keys.append('{}:{}'.format(object_type, tag))
|
||||||
|
return l_set_keys
|
||||||
|
|
||||||
|
def get_obj_by_tag(key_tag):
|
||||||
|
return r_serv_tags.smembers(key_tag)
|
||||||
|
|
||||||
|
def get_obj_by_tags(object_type, l_tags, date_from=None, date_to=None, nb_obj=50, page=1): # remove old object
|
||||||
|
# with daterange
|
||||||
|
l_tagged_obj = []
|
||||||
|
if object_type=='item':
|
||||||
|
#sanityze date
|
||||||
|
date_range = sanitise_tags_date_range(l_tags, date_from=date_from, date_to=date_to)
|
||||||
|
l_dates = Date.substract_date(date_from, date_to)
|
||||||
|
|
||||||
|
for date_day in l_dates:
|
||||||
|
l_set_keys = get_obj_keys_by_tags(object_type, l_tags, date_day)
|
||||||
|
# if len(l_set_keys) > nb_obj:
|
||||||
|
# return l_tagged_obj
|
||||||
|
if len(l_set_keys) < 2:
|
||||||
|
date_day_obj = get_obj_by_tag(l_set_keys[0])
|
||||||
|
else:
|
||||||
|
date_day_obj = r_serv_tags.sinter(l_set_keys[0], *l_set_keys[1:])
|
||||||
|
|
||||||
|
# next_nb_start = len(l_tagged_obj) + len(date_day_obj) - nb_obj
|
||||||
|
# if next_nb_start > 0:
|
||||||
|
# get + filter nb_start
|
||||||
|
l_tagged_obj.extend( date_day_obj )
|
||||||
|
|
||||||
|
# handle pagination
|
||||||
|
nb_pages = len(l_tagged_obj) / nb_obj
|
||||||
|
if not nb_pages.is_integer():
|
||||||
|
nb_pages = int(nb_pages)+1
|
||||||
|
else:
|
||||||
|
nb_pages = int(nb_pages)
|
||||||
|
if page > nb_pages:
|
||||||
|
page = nb_pages
|
||||||
|
|
||||||
|
# select index
|
||||||
|
start = nb_obj*(page -1)
|
||||||
|
stop = (nb_obj*page) -1
|
||||||
|
l_tagged_obj = l_tagged_obj[start:stop]
|
||||||
|
|
||||||
|
return {"tagged_obj":l_tagged_obj, "page":page, "nb_pages":nb_pages}
|
||||||
|
|
||||||
|
# without daterange
|
||||||
|
else:
|
||||||
|
l_set_keys = get_obj_keys_by_tags(object_type, l_tags)
|
||||||
|
if len(l_set_keys) < 2:
|
||||||
|
l_tagged_obj = get_obj_by_tag(l_set_keys[0])
|
||||||
|
else:
|
||||||
|
l_tagged_obj = r_serv_tags.sinter(l_set_keys[0], *l_set_keys[1:])
|
||||||
|
|
||||||
|
if not l_tagged_obj:
|
||||||
|
return {"tagged_obj":l_tagged_obj, "page":0, "nb_pages":0}
|
||||||
|
|
||||||
|
# handle pagination
|
||||||
|
nb_pages = len(l_tagged_obj) / nb_obj
|
||||||
|
if not nb_pages.is_integer():
|
||||||
|
nb_pages = int(nb_pages)+1
|
||||||
|
else:
|
||||||
|
nb_pages = int(nb_pages)
|
||||||
|
if page > nb_pages:
|
||||||
|
page = nb_pages
|
||||||
|
|
||||||
|
# multiple pages
|
||||||
|
if nb_pages > 1:
|
||||||
|
start = nb_obj*(page -1)
|
||||||
|
stop = (nb_obj*page) -1
|
||||||
|
current_index = 0
|
||||||
|
l_obj = []
|
||||||
|
for elem in l_tagged_obj:
|
||||||
|
if current_index > stop:
|
||||||
|
break
|
||||||
|
if start <= current_index and stop >= current_index:
|
||||||
|
l_obj.append(elem)
|
||||||
|
current_index += 1
|
||||||
|
l_tagged_obj = l_obj
|
||||||
|
# only one page
|
||||||
|
else:
|
||||||
|
l_tagged_obj = list(l_tagged_obj)
|
||||||
|
|
||||||
|
return {"tagged_obj":l_tagged_obj, "page":page, "nb_pages":nb_pages}
|
||||||
|
|
||||||
|
|
||||||
def get_obj_date(object_type, object_id): # # TODO: move me in another file
|
def get_obj_date(object_type, object_id): # # TODO: move me in another file
|
||||||
if object_type == "item":
|
if object_type == "item":
|
||||||
return Item.get_item_date(object_id)
|
return Item.get_item_date(object_id)
|
||||||
|
|
|
@ -18,7 +18,7 @@ import Flask_config
|
||||||
|
|
||||||
# Import Role_Manager
|
# Import Role_Manager
|
||||||
from Role_Manager import create_user_db, check_password_strength, check_user_role_integrity
|
from Role_Manager import create_user_db, check_password_strength, check_user_role_integrity
|
||||||
from Role_Manager import login_admin, login_analyst
|
from Role_Manager import login_admin, login_analyst, login_read_only
|
||||||
|
|
||||||
sys.path.append(os.path.join(os.environ['AIL_BIN'], 'packages'))
|
sys.path.append(os.path.join(os.environ['AIL_BIN'], 'packages'))
|
||||||
import Date
|
import Date
|
||||||
|
@ -77,6 +77,64 @@ def delete_tag():
|
||||||
return str(res[0])
|
return str(res[0])
|
||||||
return redirect(Correlate_object.get_item_url(object_type, object_id))
|
return redirect(Correlate_object.get_item_url(object_type, object_id))
|
||||||
|
|
||||||
|
|
||||||
|
@tags_ui.route('/tag/get_all_tags')
|
||||||
|
@login_required
|
||||||
|
@login_read_only
|
||||||
|
def get_all_tags():
|
||||||
|
return jsonify(Tag.get_all_tags())
|
||||||
|
|
||||||
|
@tags_ui.route('/tag/get_all_obj_tags')
|
||||||
|
@login_required
|
||||||
|
@login_read_only
|
||||||
|
def get_all_obj_tags():
|
||||||
|
object_type = request.args.get('object_type')
|
||||||
|
res = Correlate_object.sanitize_object_type(object_type)
|
||||||
|
if res:
|
||||||
|
return jsonify(res)
|
||||||
|
return jsonify(Tag.get_all_obj_tags(object_type))
|
||||||
|
|
||||||
|
@tags_ui.route('/tag/search/get_obj_by_tags')
|
||||||
|
@login_required
|
||||||
|
@login_read_only
|
||||||
|
def get_obj_by_tags():
|
||||||
|
|
||||||
|
# # TODO: sanityze all
|
||||||
|
object_type = request.args.get('object_type')
|
||||||
|
ltags = request.args.get('ltags')
|
||||||
|
page = request.args.get('ltags')
|
||||||
|
date_from = request.args.get('ltags')
|
||||||
|
date_to = request.args.get('ltags')
|
||||||
|
|
||||||
|
# unpack tags
|
||||||
|
list_tags = ltags.split(',')
|
||||||
|
list_tag = []
|
||||||
|
for tag in list_tags:
|
||||||
|
list_tag.append(tag.replace('"','\"'))
|
||||||
|
|
||||||
|
res = Correlate_object.sanitize_object_type(object_type)
|
||||||
|
if res:
|
||||||
|
return jsonify(res)
|
||||||
|
|
||||||
|
dict_obj = Tag.get_obj_by_tags(object_type, list_tag)
|
||||||
|
|
||||||
|
if dict_obj['tagged_obj']:
|
||||||
|
dict_tagged = {"object_type":object_type, "page":dict_obj['page'] ,"nb_pages":dict_obj['nb_pages'], "tagged_obj":[]}
|
||||||
|
for obj_id in dict_obj['tagged_obj']:
|
||||||
|
obj_metadata = Correlate_object.get_object_metadata(object_type, obj_id)
|
||||||
|
obj_metadata['id'] = obj_id
|
||||||
|
dict_tagged["tagged_obj"].append(obj_metadata)
|
||||||
|
|
||||||
|
dict_tagged['tab_keys'] = Correlate_object.get_obj_tag_table_keys(object_type)
|
||||||
|
|
||||||
|
if len(list_tag) == 1:
|
||||||
|
dict_tagged['current_tags'] = ltags.replace('"', '').replace('=', '').replace(':', '')
|
||||||
|
else:
|
||||||
|
dict_tagged['current_tags'] = list_tag
|
||||||
|
|
||||||
|
#return jsonify(dict_tagged)
|
||||||
|
return render_template("tags/search_obj_by_tags.html", bootstrap_label=bootstrap_label, dict_tagged=dict_tagged)
|
||||||
|
|
||||||
# # add route : /crawlers/show_domain
|
# # add route : /crawlers/show_domain
|
||||||
# @tags_ui.route('/tags/search/domain')
|
# @tags_ui.route('/tags/search/domain')
|
||||||
# @login_required
|
# @login_required
|
||||||
|
|
|
@ -253,6 +253,7 @@ def dashboard():
|
||||||
statDomains_regular = get_stats_last_crawled_domains('regular', date)
|
statDomains_regular = get_stats_last_crawled_domains('regular', date)
|
||||||
|
|
||||||
return render_template("Crawler_dashboard.html", crawler_metadata_onion = crawler_metadata_onion,
|
return render_template("Crawler_dashboard.html", crawler_metadata_onion = crawler_metadata_onion,
|
||||||
|
object_type='domain',
|
||||||
crawler_enabled=crawler_enabled, date=date,
|
crawler_enabled=crawler_enabled, date=date,
|
||||||
crawler_metadata_regular=crawler_metadata_regular,
|
crawler_metadata_regular=crawler_metadata_regular,
|
||||||
statDomains_onion=statDomains_onion, statDomains_regular=statDomains_regular)
|
statDomains_onion=statDomains_onion, statDomains_regular=statDomains_regular)
|
||||||
|
|
|
@ -105,6 +105,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% include 'tags/block_obj_tags_search.html' %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
<div class="card mb-3 mt-1">
|
||||||
|
<div class="card-header text-white bg-dark">
|
||||||
|
<h5 class="card-title">Search Domain by Tags :</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<!-- <div class="row mb-3"> TODO: use condition
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="input-group" id="date-range-from">
|
||||||
|
<div class="input-group-prepend"><span class="input-group-text"><i class="far fa-calendar-alt" aria-hidden="true"></i></span></div>
|
||||||
|
<input class="form-control" id="date-range-from-input" placeholder="yyyy-mm-dd" value="{{ date_from }}" name="date_from" autocomplete="off">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="input-group" id="date-range-to">
|
||||||
|
<div class="input-group-prepend"><span class="input-group-text"><i class="far fa-calendar-alt" aria-hidden="true"></i></span></div>
|
||||||
|
<input class="form-control" id="date-range-to-input" placeholder="yyyy-mm-dd" value="{{ date_to }}" name="date_to" autocomplete="off">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div> -->
|
||||||
|
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<button class="btn btn-outline-danger" type="button" id="button-clear-tags" style="z-index: 1;" onclick="emptyTags()">
|
||||||
|
<i class="fas fa-eraser"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<input id="ltags" name="ltags" type="text" class="form-control" aria-describedby="button-clear-tags" autocomplete="off">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="btn btn-primary" type="button" id="button-search-tags" onclick="searchTags()">
|
||||||
|
<i class="fas fa-search"></i> Search Domains
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<link href="{{ url_for('static', filename='css/tags.css') }}" rel="stylesheet" type="text/css" />
|
||||||
|
<script src="{{ url_for('static', filename='js/tags.js') }}"></script>
|
||||||
|
<script>
|
||||||
|
var ltags;
|
||||||
|
$.getJSON("{{ url_for('tags_ui.get_all_obj_tags') }}?object_type={{dict_tagged['object_type']}}",
|
||||||
|
function(data) {
|
||||||
|
ltags = $('#ltags').tagSuggest({
|
||||||
|
data: data,
|
||||||
|
value: [{%if "current_tags" in dict_tagged%}{% for tag in dict_tagged['current_tags'] %}'{{tag|safe}}',{%endfor%}{%endif%}],
|
||||||
|
sortOrder: 'name',
|
||||||
|
maxDropHeight: 200,
|
||||||
|
name: 'ltags'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function searchTags() {
|
||||||
|
var data = ltags.getValue();
|
||||||
|
//var date_from = $('#date-range-from-input').val();
|
||||||
|
//var date_to =$('#date-range-to-input').val();
|
||||||
|
//parameter = parameter + "&date_from="+date_from+"&date_to="+date_to
|
||||||
|
window.location.replace("{{ url_for('tags_ui.get_obj_by_tags') }}?ltags=" + data + "&object_type={{dict_tagged['object_type']}}&page={{dict_tagged['page']}}");
|
||||||
|
}
|
||||||
|
function emptyTags() {
|
||||||
|
ltags.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// $('#date-range-from').dateRangePicker({
|
||||||
|
// separator : ' to ',
|
||||||
|
// getValue: function(){
|
||||||
|
// if ($('#date-range-from-input').val() && $('#date-range-to-input').val() )
|
||||||
|
// return $('#date-range-from-input').val() + ' to ' + $('#date-range-to-input').val();
|
||||||
|
// else
|
||||||
|
// return '';
|
||||||
|
// },
|
||||||
|
// setValue: function(s,s1,s2){
|
||||||
|
// $('#date-range-from-input').val(s1);
|
||||||
|
// $('#date-range-to-input').val(s2);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// $('#date-range-to').dateRangePicker({
|
||||||
|
// separator : ' to ',
|
||||||
|
// getValue: function(){
|
||||||
|
// if ($('#date-range-from-input').val() && $('#date-range-to-input').val() )
|
||||||
|
// return $('#date-range-from-input').val() + ' to ' + $('#date-range-to-input').val();
|
||||||
|
// else
|
||||||
|
// return '';
|
||||||
|
// },
|
||||||
|
// setValue: function(s,s1,s2){
|
||||||
|
// $('#date-range-from-input').val(s1);
|
||||||
|
// $('#date-range-to-input').val(s2);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
// tagid + objtype + objid
|
||||||
|
// $('#edit_tags_modal').on('show.bs.modal', function (event) {
|
||||||
|
// var button = $(event.relatedTarget);
|
||||||
|
// var tagid = button.data('tagid')
|
||||||
|
// var objtype = button.data('objtype')
|
||||||
|
// var objid = button.data('objid')
|
||||||
|
// var modal = $(this)
|
||||||
|
// modal.find('#modal_tag_edit_tag_id').text(tagid)
|
||||||
|
// modal.find('#modal_tag_edit_delete_tag').prop("href", "{{ url_for('tags_ui.delete_tag') }}?object_type="+ objtype +"&object_id="+ objid +"&tag="+ tagid)
|
||||||
|
// })
|
||||||
|
</script>
|
|
@ -0,0 +1,146 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Tags - AIL</title>
|
||||||
|
<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}">
|
||||||
|
|
||||||
|
<!-- Core CSS -->
|
||||||
|
<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet">
|
||||||
|
<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet">
|
||||||
|
<link href="{{ url_for('static', filename='css/daterangepicker.min.css') }}" rel="stylesheet">
|
||||||
|
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.min.css') }}" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- JS -->
|
||||||
|
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
||||||
|
<script language="javascript" src="{{ url_for('static', filename='js/moment.min.js') }}"></script>
|
||||||
|
<script language="javascript" src="{{ url_for('static', filename='js/jquery.daterangepicker.min.js') }}"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
{% include 'nav_bar.html' %}
|
||||||
|
|
||||||
|
<!-- 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 class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
{% include 'tags/menu_sidebar.html' %}
|
||||||
|
|
||||||
|
<div class="col-12 col-lg-10" id="core_content">
|
||||||
|
|
||||||
|
{% include 'tags/block_obj_tags_search.html' %}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{%if dict_tagged%}
|
||||||
|
<table class="table table-bordered table-hover" id="myTable_">
|
||||||
|
<thead class="thead-dark">
|
||||||
|
<tr>
|
||||||
|
{%if dict_tagged["object_type"]=="domain"%}
|
||||||
|
<th>first seen</th>
|
||||||
|
<th>last check</th>
|
||||||
|
<th style="max-width: 800px;">Domain</th>
|
||||||
|
<th>status</th>
|
||||||
|
{%endif%}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
{%if dict_tagged["object_type"]=="domain"%}
|
||||||
|
|
||||||
|
{% for dict_obj in dict_tagged["tagged_obj"] %}
|
||||||
|
<tr>
|
||||||
|
<td class="pb-0">{{ dict_obj['first_seen'] }}</td>
|
||||||
|
<td class="pb-0">{{ dict_obj['last_check'] }}</td>
|
||||||
|
<td class="pb-0">
|
||||||
|
<a target="_blank" href="{{ url_for('showsavedpastes.showsavedpaste') }}?paste={{dict_obj['id']}}" class="text-secondary">
|
||||||
|
<div style="line-height:0.9;">{{ dict_obj['id'] }}</div>
|
||||||
|
</a>
|
||||||
|
<div class="mb-2">
|
||||||
|
{% for tag in dict_obj['tags'] %}
|
||||||
|
<a href="{{ url_for('Tags.Tags_page') }}?ltags={{ tag }}">
|
||||||
|
<span class="badge badge-{{ bootstrap_label[loop.index0 % 5] }} pull-left">{{ tag }}</span>
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="pb-0">
|
||||||
|
{%if dict_obj['status'] %}
|
||||||
|
<div style="color:Green;">
|
||||||
|
<i class="fas fa-check-circle"></i>
|
||||||
|
UP
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div style="color:Red;">
|
||||||
|
<i class="fas fa-times-circle"></i>
|
||||||
|
DOWN
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
{%endif%}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var ltags;
|
||||||
|
var search_table;
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
//search_table = $('#myTable_').DataTable({ "order": [[ 0, "asc" ]] });
|
||||||
|
$('#myTable_').DataTable({ "order": [[ 0, "asc" ]] });
|
||||||
|
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function toggle_sidebar(){
|
||||||
|
if($('#nav_menu').is(':visible')){
|
||||||
|
$('#nav_menu').hide();
|
||||||
|
$('#side_menu').removeClass('border-right')
|
||||||
|
$('#side_menu').removeClass('col-lg-2')
|
||||||
|
$('#core_content').removeClass('col-lg-10')
|
||||||
|
}else{
|
||||||
|
$('#nav_menu').show();
|
||||||
|
$('#side_menu').addClass('border-right')
|
||||||
|
$('#side_menu').addClass('col-lg-2')
|
||||||
|
$('#core_content').addClass('col-lg-10')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
</html>
|
Loading…
Reference in New Issue