From b1b7d33c9657489f14d55ac4ef0a8a42bd99f308 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Wed, 16 May 2018 14:39:01 +0200 Subject: [PATCH 01/22] tags --- bin/ApiKey.py | 7 + bin/Base64.py | 3 + bin/Bitcoin.py | 7 + bin/Credential.py | 3 + bin/CreditCards.py | 3 + bin/Cve.py | 3 + bin/Keys.py | 29 ++ bin/LAUNCH.sh | 6 + bin/Mail.py | 3 + bin/Onion.py | 3 + bin/Phone.py | 4 + bin/SQLInjectionDetection.py | 3 + bin/Tags.py | 68 +++++ var/www/modules/Tags/Flask_Tags.py | 150 +++++++++ var/www/modules/Tags/templates/Tags.html | 78 +++++ .../modules/Tags/templates/header_Tags.html | 1 + var/www/modules/Tags/templates/tagged.html | 285 ++++++++++++++++++ var/www/modules/showpaste/Flask_showpaste.py | 12 +- .../showpaste/templates/show_saved_paste.html | 8 +- 19 files changed, 674 insertions(+), 2 deletions(-) create mode 100755 bin/Tags.py create mode 100644 var/www/modules/Tags/Flask_Tags.py create mode 100644 var/www/modules/Tags/templates/Tags.html create mode 100644 var/www/modules/Tags/templates/header_Tags.html create mode 100644 var/www/modules/Tags/templates/tagged.html diff --git a/bin/ApiKey.py b/bin/ApiKey.py index 8ce7e2b4..e7ded9b2 100755 --- a/bin/ApiKey.py +++ b/bin/ApiKey.py @@ -41,6 +41,8 @@ def search_api_key(message): print(to_print) publisher.warning('{}Checked {} found Google API Key;{}'.format( to_print, len(google_api_key), paste.p_path)) + msg = 'infoleak:automatic-detection="google-api-key";{}'.format(filename) + p.populate_set_out(msg, 'Tags') if(len(aws_access_key) > 0 or len(aws_secret_key) > 0): print('found AWS key') @@ -48,8 +50,13 @@ def search_api_key(message): total = len(aws_access_key) + len(aws_secret_key) publisher.warning('{}Checked {} found AWS Key;{}'.format( to_print, total, paste.p_path)) + msg = 'infoleak:automatic-detection="aws-key";{}'.format(filename) + p.populate_set_out(msg, 'Tags') + msg = 'infoleak:automatic-detection="api-key";{}'.format(filename) + p.populate_set_out(msg, 'Tags') + msg = 'apikey;{}'.format(filename) p.populate_set_out(msg, 'alertHandler') #Send to duplicate diff --git a/bin/Base64.py b/bin/Base64.py index c7700994..960ca6de 100755 --- a/bin/Base64.py +++ b/bin/Base64.py @@ -65,6 +65,9 @@ def search_base64(content, message): msg = ('base64;{}'.format(message)) p.populate_set_out( msg, 'alertHandler') + msg = 'infoleak:automatic-detection="base64";{}'.format(message) + p.populate_set_out(msg, 'Tags') + def save_base64_as_file(decode, type, hash, json_data): filename_b64 = os.path.join(os.environ['AIL_HOME'], diff --git a/bin/Bitcoin.py b/bin/Bitcoin.py index 42468759..5ec2199f 100755 --- a/bin/Bitcoin.py +++ b/bin/Bitcoin.py @@ -63,7 +63,14 @@ def search_key(content, message, paste): publisher.warning(to_print) msg = ('bitcoin;{}'.format(message)) p.populate_set_out( msg, 'alertHandler') + + msg = 'infoleak:automatic-detection="bitcoin-address";{}'.format(message) + p.populate_set_out(msg, 'Tags') + if(key): + msg = 'infoleak:automatic-detection="bitcoin-private-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') + to_print = 'Bitcoin;{};{};{};'.format(paste.p_source, paste.p_date, paste.p_name) publisher.warning('{}Detected {} Bitcoin private key;{}'.format( diff --git a/bin/Credential.py b/bin/Credential.py index fde80d12..5112f534 100755 --- a/bin/Credential.py +++ b/bin/Credential.py @@ -105,6 +105,9 @@ if __name__ == "__main__": msg = 'credential;{}'.format(filepath) p.populate_set_out(msg, 'alertHandler') + msg = 'infoleak:automatic-detection="credential";{}'.format(filepath) + p.populate_set_out(msg, 'Tags') + #Put in form, count occurences, then send to moduleStats creds_sites = {} site_occurence = re.findall(regex_site_for_stats, content) diff --git a/bin/CreditCards.py b/bin/CreditCards.py index a7441807..260d1345 100755 --- a/bin/CreditCards.py +++ b/bin/CreditCards.py @@ -85,6 +85,9 @@ if __name__ == "__main__": #send to Browse_warning_paste msg = 'creditcard;{}'.format(filename) p.populate_set_out(msg, 'alertHandler') + + msg = 'infoleak:automatic-detection="credit-card";{}'.format(filename) + p.populate_set_out(msg, 'Tags') else: publisher.info('{}CreditCard related;{}'.format(to_print, paste.p_path)) else: diff --git a/bin/Cve.py b/bin/Cve.py index 9ac4efc8..bd240260 100755 --- a/bin/Cve.py +++ b/bin/Cve.py @@ -34,6 +34,9 @@ def search_cve(message): #send to Browse_warning_paste msg = 'cve;{}'.format(filepath) p.populate_set_out(msg, 'alertHandler') + + msg = 'infoleak:automatic-detection="cve";{}'.format(filepath) + p.populate_set_out(msg, 'Tags') #Send to duplicate p.populate_set_out(filepath, 'Duplicate') diff --git a/bin/Keys.py b/bin/Keys.py index 9f39cf50..7b1ec7dc 100755 --- a/bin/Keys.py +++ b/bin/Keys.py @@ -28,47 +28,76 @@ def search_key(paste): if '-----BEGIN PGP MESSAGE-----' in content: publisher.warning('{} has a PGP enc message'.format(paste.p_name)) + msg = 'infoleak:automatic-detection="pgp-message";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN CERTIFICATE-----' in content: publisher.warning('{} has a certificate message'.format(paste.p_name)) + + msg = 'infoleak:automatic-detection="certificate";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN RSA PRIVATE KEY-----' in content: publisher.warning('{} has a RSA private key message'.format(paste.p_name)) print('rsa private key message found') + + msg = 'infoleak:automatic-detection="rsa-private-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN PRIVATE KEY-----' in content: publisher.warning('{} has a private key message'.format(paste.p_name)) print('private key message found') + + msg = 'infoleak:automatic-detection="private-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN ENCRYPTED PRIVATE KEY-----' in content: publisher.warning('{} has an encrypted private key message'.format(paste.p_name)) print('encrypted private key message found') + + msg = 'infoleak:automatic-detection="encrypted-private-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN OPENSSH PRIVATE KEY-----' in content: publisher.warning('{} has an openssh private key message'.format(paste.p_name)) print('openssh private key message found') + + msg = 'infoleak:automatic-detection="private-ssh-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN OpenVPN Static key V1-----' in content: publisher.warning('{} has an openssh private key message'.format(paste.p_name)) print('OpenVPN Static key message found') + + msg = 'infoleak:automatic-detection="vpn-static-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN DSA PRIVATE KEY-----' in content: publisher.warning('{} has a dsa private key message'.format(paste.p_name)) + + msg = 'infoleak:automatic-detection="dsa-private-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN EC PRIVATE KEY-----' in content: publisher.warning('{} has an ec private key message'.format(paste.p_name)) + + msg = 'infoleak:automatic-detection="ec-private-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if '-----BEGIN PGP PRIVATE KEY BLOCK-----' in content: publisher.warning('{} has a pgp private key block message'.format(paste.p_name)) + + msg = 'infoleak:automatic-detection="pgp-private-key";{}'.format(message) + p.populate_set_out(msg, 'Tags') find = True if find : diff --git a/bin/LAUNCH.sh b/bin/LAUNCH.sh index aca72e8e..9c372b37 100755 --- a/bin/LAUNCH.sh +++ b/bin/LAUNCH.sh @@ -110,6 +110,8 @@ function launching_scripts { sleep 0.1 screen -S "Script_AIL" -X screen -t "Duplicates" bash -c './Duplicates.py; read x' sleep 0.1 + #screen -S "Script_AIL" -X screen -t "Attributes" bash -c './Attributes.py; read x' + #sleep 0.1 screen -S "Script_AIL" -X screen -t "Lines" bash -c './Lines.py; read x' sleep 0.1 screen -S "Script_AIL" -X screen -t "DomClassifier" bash -c './DomClassifier.py; read x' @@ -144,6 +146,8 @@ function launching_scripts { sleep 0.1 screen -S "Script_AIL" -X screen -t "Base64" bash -c './Base64.py; read x' sleep 0.1 + screen -S "Script_AIL" -X screen -t "DbDump" bash -c './DbDump.py; read x' + sleep 0.1 screen -S "Script_AIL" -X screen -t "Bitcoin" bash -c './Bitcoin.py; read x' sleep 0.1 screen -S "Script_AIL" -X screen -t "Phone" bash -c './Phone.py; read x' @@ -160,6 +164,8 @@ function launching_scripts { sleep 0.1 screen -S "Script_AIL" -X screen -t "alertHandler" bash -c './alertHandler.py; read x' sleep 0.1 + screen -S "Script_AIL" -X screen -t "Tags" bash -c './Tags.py; read x' + sleep 0.1 screen -S "Script_AIL" -X screen -t "SentimentAnalysis" bash -c './SentimentAnalysis.py; read x' } diff --git a/bin/Mail.py b/bin/Mail.py index abc112a6..c1d8cf70 100755 --- a/bin/Mail.py +++ b/bin/Mail.py @@ -76,6 +76,9 @@ if __name__ == "__main__": p.populate_set_out(filename, 'Duplicate') p.populate_set_out('mail;{}'.format(filename), 'alertHandler') + msg = 'infoleak:automatic-detection="mail";{}'.format(filename) + p.populate_set_out(msg, 'Tags') + else: publisher.info(to_print) #Send to ModuleStats diff --git a/bin/Onion.py b/bin/Onion.py index 77ed75fe..277f1c71 100755 --- a/bin/Onion.py +++ b/bin/Onion.py @@ -152,6 +152,9 @@ if __name__ == "__main__": for url in fetch(p, r_cache, urls, domains_list, path): publisher.info('{}Checked {};{}'.format(to_print, url, PST.p_path)) p.populate_set_out('onion;{}'.format(PST.p_path), 'alertHandler') + + msg = 'infoleak:automatic-detection="onion";{}'.format(PST.p_path) + p.populate_set_out(msg, 'Tags') else: publisher.info('{}Onion related;{}'.format(to_print, PST.p_path)) diff --git a/bin/Phone.py b/bin/Phone.py index e3f0f908..213db2b3 100755 --- a/bin/Phone.py +++ b/bin/Phone.py @@ -36,6 +36,10 @@ def search_phone(message): msg = 'phone;{}'.format(message) p.populate_set_out(msg, 'alertHandler') #Send to duplicate + + msg = 'infoleak:automatic-detection="phone-number";{}'.format(message) + p.populate_set_out(msg, 'Tags') + p.populate_set_out(message, 'Duplicate') stats = {} for phone_number in results: diff --git a/bin/SQLInjectionDetection.py b/bin/SQLInjectionDetection.py index 9e28de72..117f3dc0 100755 --- a/bin/SQLInjectionDetection.py +++ b/bin/SQLInjectionDetection.py @@ -82,6 +82,9 @@ def analyse(url, path): p.populate_set_out(path, 'Duplicate') #send to Browse_warning_paste p.populate_set_out('sqlinjection;{}'.format(path), 'alertHandler') + + msg = 'infoleak:automatic-detection="sql-injection";{}'.format(path) + p.populate_set_out(msg, 'Tags') else: print("Potential SQL injection:") print(urllib.request.unquote(url)) diff --git a/bin/Tags.py b/bin/Tags.py new file mode 100755 index 00000000..f4939ec3 --- /dev/null +++ b/bin/Tags.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +# -*-coding:UTF-8 -* + +""" +The Tags Module +================================ + +This module create tags. + +""" +import redis + +import time + +from pubsublogger import publisher +from Helper import Process +from packages import Paste + +if __name__ == '__main__': + + # Port of the redis instance used by pubsublogger + publisher.port = 6380 + # Script is the default channel used for the modules. + publisher.channel = 'Script' + + # Section name in bin/packages/modules.cfg + config_section = 'Tags' + + # Setup the I/O queues + p = Process(config_section) + + server = redis.StrictRedis( + host=p.config.get("ARDB_Tags", "host"), + port=p.config.get("ARDB_Tags", "port"), + db=p.config.get("ARDB_Tags", "db"), + decode_responses=True) + + server_metadata = redis.StrictRedis( + host=p.config.get("ARDB_Metadata", "host"), + port=p.config.get("ARDB_Metadata", "port"), + db=p.config.get("ARDB_Metadata", "db"), + decode_responses=True) + + # Sent to the logging a description of the module + publisher.info("Tags module started") + + # Endless loop getting messages from the input queue + while True: + # Get one message from the input queue + message = p.get_from_set() + + if message is None: + publisher.debug("{} queue is empty, waiting 10s".format(config_section)) + time.sleep(10) + continue + + else: + tag, path = message.split(';') + # add the tag to the tags word_list + res = server.sadd('list_tags', tag) + if res == 1: + print("new tags added : {}".format(tag)) + # add the path to the tag set + res = server.sadd(tag, path) + if res == 1: + print("new paste: {}".format(path)) + print(" tagged: {}".format(tag)) + server_metadata.sadd('tag:'+path, tag) diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py new file mode 100644 index 00000000..db501f67 --- /dev/null +++ b/var/www/modules/Tags/Flask_Tags.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +# -*-coding:UTF-8 -* + +''' + Flask functions and routes for the trending modules page +''' +import redis +from flask import Flask, render_template, jsonify, request, Blueprint + +import json + +import Paste + +# ============ VARIABLES ============ +import Flask_config + +app = Flask_config.app +cfg = Flask_config.cfg +r_serv_tags = Flask_config.r_serv_tags +r_serv_metadata = Flask_config.r_serv_metadata +max_preview_char = Flask_config.max_preview_char +max_preview_modal = Flask_config.max_preview_modal + +Tags = Blueprint('Tags', __name__, template_folder='templates') + +# ============ FUNCTIONS ============ +def one(): + return 1 + +# ============= ROUTES ============== + +@Tags.route("/Tags/", methods=['GET']) +def Tags_page(): + return render_template("Tags.html") + +@Tags.route("/Tags/get_all_tags") +def get_all_tags(): + + all_tags = r_serv_tags.smembers('list_tags') + + list_tags = [] + id = 0 + for tag in all_tags: + list_tags.append( tag ) + id += 1 + + return jsonify(list_tags) + +@Tags.route("/Tags/get_tagged_paste") +def get_tagged_paste(): + + tags = request.args.get('ltags')[1:-1] + tags = tags.replace('\\','') + + list_tags = tags.split(',') + tmp_list_tags = [] + + # remove " char + for tag in list_tags: + tmp_list_tags.append(tag[1:-1]) + list_tags = tmp_list_tags + + # TODO verify input + + if(type(list_tags) is list): + # no tag + if list_tags is False: + print('empty') + # 1 tag + elif len(list_tags) < 2: + tagged_pastes = r_serv_tags.smembers(list_tags[0]) + + # 2 tags or more + else: + tagged_pastes = r_serv_tags.sinter(list_tags[0], *list_tags[1:]) + + else : + return 'INCORRECT INPUT' + + #currentSelectYear = int(datetime.now().year) + currentSelectYear = 2018 + + bootstrap_label = [] + bootstrap_label.append('primary') + bootstrap_label.append('success') + bootstrap_label.append('danger') + bootstrap_label.append('warning') + bootstrap_label.append('info') + bootstrap_label.append('dark') + + all_content = [] + paste_date = [] + paste_linenum = [] + all_path = [] + allPastes = list(tagged_pastes) + paste_tags = [] + + for path in allPastes[0:50]: ######################moduleName + all_path.append(path) + paste = Paste.Paste(path) + content = paste.get_p_content() + content_range = max_preview_char if len(content)>max_preview_char else len(content)-1 + all_content.append(content[0:content_range].replace("\"", "\'").replace("\r", " ").replace("\n", " ")) + curr_date = str(paste._get_p_date()) + curr_date = curr_date[0:4]+'/'+curr_date[4:6]+'/'+curr_date[6:] + paste_date.append(curr_date) + paste_linenum.append(paste.get_lines_info()[0]) + p_tags = r_serv_metadata.smembers('tag:'+path) + l_tags = [] + for tag in p_tags: + tag = tag.split('=') + if len(tag) > 1: + if tag[1] != '': + tag = tag[1][1:-1] + # no value + else: + tag = tag[0][1:-1] + # use for custom tags + else: + tag = tag[0] + + l_tags.append(tag) + + paste_tags.append(l_tags) + + if len(allPastes) > 10: + finished = False + else: + finished = True + + return render_template("tagged.html", + year=currentSelectYear, + all_path=all_path, + paste_tags=paste_tags, + bootstrap_label=bootstrap_label, + content=all_content, + paste_date=paste_date, + paste_linenum=paste_linenum, + char_to_display=max_preview_modal, + finished=finished) + + return 'OK' + +@Tags.route("/Tags/res") +def get_tagged_paste_res(): + + return render_template("res.html") + +# ========= REGISTRATION ========= +app.register_blueprint(Tags) diff --git a/var/www/modules/Tags/templates/Tags.html b/var/www/modules/Tags/templates/Tags.html new file mode 100644 index 00000000..cb476749 --- /dev/null +++ b/var/www/modules/Tags/templates/Tags.html @@ -0,0 +1,78 @@ + + + + + + + + Analysis Information Leak framework Dashboard + + + + + + + + + + + + + + + + + + + {% include 'navbar.html' %} + +
+
+
+

Tags

+
+ +
+ +
+
+ + +
+ +
+ +
+
+ + + +
+ + + + + + + diff --git a/var/www/modules/Tags/templates/header_Tags.html b/var/www/modules/Tags/templates/header_Tags.html new file mode 100644 index 00000000..624adb2f --- /dev/null +++ b/var/www/modules/Tags/templates/header_Tags.html @@ -0,0 +1 @@ +
  • Tags
  • diff --git a/var/www/modules/Tags/templates/tagged.html b/var/www/modules/Tags/templates/tagged.html new file mode 100644 index 00000000..17e5181b --- /dev/null +++ b/var/www/modules/Tags/templates/tagged.html @@ -0,0 +1,285 @@ + + + + + + + + Analysis Information Leak framework Dashboard + + + + + + + + + + + + + + + + + + + + {% include 'navbar.html' %} + + + + +
    +
    +
    +

    Tags

    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + {% for path in all_path %} + + + + + + + + {% endfor %} + + +
    #PathDate# of linesAction
    {{ loop.index0 }}{{ path }} +
    + {% for tag in paste_tags[loop.index0] %} + {{ tag }} + {% endfor %} +
    +
    {{ paste_date[loop.index0] }}{{ paste_linenum[loop.index0] }}

    + +
    +
    + +
    +
    + + +
    +
    + +
    + + + + + + + diff --git a/var/www/modules/showpaste/Flask_showpaste.py b/var/www/modules/showpaste/Flask_showpaste.py index 3a3be9be..398a350a 100644 --- a/var/www/modules/showpaste/Flask_showpaste.py +++ b/var/www/modules/showpaste/Flask_showpaste.py @@ -96,7 +96,17 @@ def showpaste(content_range): if content_range != 0: p_content = p_content[0:content_range] - return render_template("show_saved_paste.html", date=p_date, source=p_source, encoding=p_encoding, language=p_language, size=p_size, mime=p_mime, lineinfo=p_lineinfo, content=p_content, initsize=len(p_content), duplicate_list = p_duplicate_list, simil_list = p_simil_list, hashtype_list = p_hashtype_list, date_list=p_date_list) + bootstrap_label = [] + bootstrap_label.append('primary') + bootstrap_label.append('success') + bootstrap_label.append('danger') + bootstrap_label.append('warning') + bootstrap_label.append('info') + bootstrap_label.append('dark') + + list_tags = r_serv_metadata.smembers('tag:'+requested_path) + + return render_template("show_saved_paste.html", date=p_date, bootstrap_label=bootstrap_label, list_tags=list_tags, source=p_source, encoding=p_encoding, language=p_language, size=p_size, mime=p_mime, lineinfo=p_lineinfo, content=p_content, initsize=len(p_content), duplicate_list = p_duplicate_list, simil_list = p_simil_list, hashtype_list = p_hashtype_list, date_list=p_date_list) # ============ ROUTES ============ diff --git a/var/www/modules/showpaste/templates/show_saved_paste.html b/var/www/modules/showpaste/templates/show_saved_paste.html index b972ef12..2dae1caa 100644 --- a/var/www/modules/showpaste/templates/show_saved_paste.html +++ b/var/www/modules/showpaste/templates/show_saved_paste.html @@ -21,7 +21,13 @@

    Paste: {{ request.args.get('paste') }}

    - + From 0d164b6f4c7eae7c18561725d7327ec22c39101e Mon Sep 17 00:00:00 2001 From: Terrtia Date: Wed, 16 May 2018 14:48:15 +0200 Subject: [PATCH 02/22] add tag js and css --- bin/LAUNCH.sh | 2 - bin/packages/modules.cfg | 27 +- var/www/static/css/tags.css | 226 ++++++ var/www/static/js/tags.js | 1516 +++++++++++++++++++++++++++++++++++ 4 files changed, 1757 insertions(+), 14 deletions(-) create mode 100644 var/www/static/css/tags.css create mode 100644 var/www/static/js/tags.js diff --git a/bin/LAUNCH.sh b/bin/LAUNCH.sh index 9c372b37..e6c12366 100755 --- a/bin/LAUNCH.sh +++ b/bin/LAUNCH.sh @@ -110,8 +110,6 @@ function launching_scripts { sleep 0.1 screen -S "Script_AIL" -X screen -t "Duplicates" bash -c './Duplicates.py; read x' sleep 0.1 - #screen -S "Script_AIL" -X screen -t "Attributes" bash -c './Attributes.py; read x' - #sleep 0.1 screen -S "Script_AIL" -X screen -t "Lines" bash -c './Lines.py; read x' sleep 0.1 screen -S "Script_AIL" -X screen -t "DomClassifier" bash -c './DomClassifier.py; read x' diff --git a/bin/packages/modules.cfg b/bin/packages/modules.cfg index b9e29506..975b7b2c 100644 --- a/bin/packages/modules.cfg +++ b/bin/packages/modules.cfg @@ -49,15 +49,15 @@ publish = Redis_CreditCards,Redis_Mail,Redis_Onion,Redis_Web,Redis_Credential,Re [CreditCards] subscribe = Redis_CreditCards -publish = Redis_Duplicate,Redis_ModuleStats,Redis_alertHandler +publish = Redis_Duplicate,Redis_ModuleStats,Redis_alertHandler,Redis_Tags [Mail] subscribe = Redis_Mail -publish = Redis_Duplicate,Redis_ModuleStats,Redis_alertHandler +publish = Redis_Duplicate,Redis_ModuleStats,Redis_alertHandler,Redis_Tags [Onion] subscribe = Redis_Onion -publish = Redis_ValidOnion,ZMQ_FetchedOnion,Redis_alertHandler +publish = Redis_ValidOnion,ZMQ_FetchedOnion,Redis_alertHandler,Redis_Tags #publish = Redis_Global,Redis_ValidOnion,ZMQ_FetchedOnion,Redis_alertHandler [DumpValidOnion] @@ -72,7 +72,7 @@ subscribe = Redis_Url [SQLInjectionDetection] subscribe = Redis_Url -publish = Redis_alertHandler,Redis_Duplicate +publish = Redis_alertHandler,Redis_Duplicate,Redis_Tags [ModuleStats] subscribe = Redis_ModuleStats @@ -80,9 +80,12 @@ subscribe = Redis_ModuleStats [alertHandler] subscribe = Redis_alertHandler +[Tags] +subscribe = Redis_Tags + #[send_to_queue] #subscribe = Redis_Cve -#publish = Redis_alertHandler +#publish = Redis_alertHandler,Redis_Tags [SentimentAnalysis] subscribe = Redis_Global @@ -92,28 +95,28 @@ subscribe = Redis_Global [Credential] subscribe = Redis_Credential -publish = Redis_Duplicate,Redis_ModuleStats,Redis_alertHandler +publish = Redis_Duplicate,Redis_ModuleStats,Redis_alertHandler,Redis_Tags [Cve] subscribe = Redis_Cve -publish = Redis_alertHandler,Redis_Duplicate +publish = Redis_alertHandler,Redis_Duplicate,Redis_Tags [Phone] subscribe = Redis_Global -publish = Redis_Duplicate,Redis_alertHandler +publish = Redis_Duplicate,Redis_alertHandler,Redis_Tags [Keys] subscribe = Redis_Global -publish = Redis_Duplicate,Redis_alertHandler +publish = Redis_Duplicate,Redis_alertHandler,Redis_Tags [ApiKey] subscribe = Redis_ApiKey -publish = Redis_Duplicate,Redis_alertHandler +publish = Redis_Duplicate,Redis_alertHandler,Redis_Tags [Base64] subscribe = Redis_Global -publish = Redis_Duplicate,Redis_alertHandler +publish = Redis_Duplicate,Redis_alertHandler,Redis_Tags [Bitcoin] subscribe = Redis_Global -publish = Redis_Duplicate,Redis_alertHandler +publish = Redis_Duplicate,Redis_alertHandler,Redis_Tags diff --git a/var/www/static/css/tags.css b/var/www/static/css/tags.css new file mode 100644 index 00000000..baa0f673 --- /dev/null +++ b/var/www/static/css/tags.css @@ -0,0 +1,226 @@ +.tag-ctn{ + position: relative; + height: 30px; + padding: 0; + margin-bottom: 0px; + font-size: 14px; + line-height: 20px; + color: #555555; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; + cursor: default; + display: block; +} +.tag-ctn-invalid{ + border: 1px solid #CC0000; +} +.tag-ctn-readonly{ + cursor: pointer; +} +.tag-ctn-disabled{ + cursor: not-allowed; + background-color: #eeeeee; +} +.tag-ctn-bootstrap-focus, +.tag-ctn-bootstrap-focus .tag-res-ctn{ + border-color: rgba(82, 168, 236, 0.8) !important; + /* IE6-9 */ + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6) !important; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6) !important; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6) !important; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.tag-ctn input{ + border: 0; + box-shadow: none; + -webkit-transition: none; + outline: none; + display: block; + padding: 4px 6px; + line-height: normal; + overflow: hidden; + height: auto; + border-radius: 0; + float: left; + margin: 2px 0 2px 2px; +} +.tag-ctn-disabled input{ + cursor: not-allowed; + background-color: #eeeeee; +} +.tag-ctn .tag-input-readonly{ + cursor: pointer; +} +.tag-ctn .tag-empty-text{ + color: #DDD; +} +.tag-ctn input:focus{ + border: 0; + box-shadow: none; + -webkit-transition: none; + background: #FFF; +} +.tag-ctn .tag-trigger{ + float: right; + width: 27px; + height:100%; + position:absolute; + right:0; + border-left: 1px solid #CCC; + background: #EEE; + cursor: pointer; +} +.tag-ctn .tag-trigger .tag-trigger-ico { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid gray; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + margin-left: 9px; + margin-top: 13px; +} +.tag-ctn .tag-trigger:hover{ + background: -moz-linear-gradient(100% 100% 90deg, #e3e3e3, #f1f1f1); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#f1f1f1), to(#e3e3e3)); +} +.tag-ctn .tag-trigger:hover .tag-trigger-ico{ + background-position: 0 -4px; +} +.tag-ctn-disabled .tag-trigger{ + cursor: not-allowed; + background-color: #eeeeee; +} +.tag-ctn-bootstrap-focus{ + border-bottom: 1px solid #CCC; +} +.tag-res-ctn{ + position: relative; + background: #FFF; + overflow-y: auto; + z-index: 9999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + border: 1px solid #CCC; + left: -1px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; + border-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.tag-res-ctn .tag-res-group{ + line-height: 23px; + text-align: left; + padding: 2px 5px; + font-weight: bold; + border-bottom: 1px dotted #CCC; + border-top: 1px solid #CCC; + background: #f3edff; + color: #333; +} +.tag-res-ctn .tag-res-item{ + line-height: 25px; + text-align: left; + padding: 2px 5px; + color: #666; + cursor: pointer; +} +.tag-res-ctn .tag-res-item-grouped{ + padding-left: 15px; +} +.tag-res-ctn .tag-res-odd{ + background: #F3F3F3; +} +.tag-res-ctn .tag-res-item-active{ + background-color: #3875D7; + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875D7', endColorstr='#2A62BC', GradientType=0 ); + background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875D7), color-stop(90%, #2A62BC)); + background-image: -webkit-linear-gradient(top, #3875D7 20%, #2A62BC 90%); + background-image: -moz-linear-gradient(top, #3875D7 20%, #2A62BC 90%); + background-image: -o-linear-gradient(top, #3875D7 20%, #2A62BC 90%); + background-image: linear-gradient(#3875D7 20%, #2A62BC 90%); + color: #fff; +} +.tag-sel-ctn{ + overflow: auto; + line-height: 22px; + padding-right:27px; +} +.tag-sel-ctn .tag-sel-item{ + background: #555; + color: #EEE; + float: left; + font-size: 12px; + padding: 0 5px; + border-radius: 3px; + margin-left: 5px; + margin-top: 4px; +} +.tag-sel-ctn .tag-sel-text{ + background: #FFF; + color: #666; + padding-right: 0; + margin-left: 0; + font-size: 14px; + font-weight: normal; +} +.tag-res-ctn .tag-res-item em{ + font-style: normal; + background: #565656; + color: #FFF; +} +.tag-sel-ctn .tag-sel-item:hover{ + background: #565656; +} +.tag-sel-ctn .tag-sel-text:hover{ + background: #FFF; +} +.tag-sel-ctn .tag-sel-item-active{ + border: 1px solid red; + background: #757575; +} +.tag-ctn .tag-sel-ctn .tag-sel-item{ + margin-top: 3px; +} +.tag-stacked .tag-sel-item{ + float: inherit; +} +.tag-sel-ctn .tag-sel-item .tag-close-btn{ + width: 7px; + cursor: pointer; + height: 7px; + float: right; + margin: 8px 2px 0 10px; + background-image: url(data:image/png;base64,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); + +} +.tag-sel-ctn .tag-sel-item .tag-close-btn:hover{ + background-position: 0 -7px; +} +.tag-helper{ + color: #AAA; + font-size: 10px; + position: absolute; + top: -17px; + right: 0; +} diff --git a/var/www/static/js/tags.js b/var/www/static/js/tags.js new file mode 100644 index 00000000..ec538ca3 --- /dev/null +++ b/var/www/static/js/tags.js @@ -0,0 +1,1516 @@ +/** + * All auto suggestion boxes are fucked up or badly written. + * This is an attempt to create something that doesn't suck... + * + * Requires: jQuery + * + * Author: Nicolas Bize + * Date: Feb. 8th 2013 + * Version: 1.3.1 + * Licence: TagSuggest is licenced under MIT licence (https://www.opensource.org/licenses/mit-license.php) + */ +(function($) +{ + "use strict"; + var TagSuggest = function(element, options) + { + var ms = this; + + /** + * Initializes the TagSuggest component + * @param defaults - see config below + */ + var defaults = { + /********** CONFIGURATION PROPERTIES ************/ + /** + * @cfg {Boolean} allowFreeEntries + *

    Restricts or allows the user to validate typed entries.

    + * Defaults to true. + */ + allowFreeEntries: false, + + /** + * @cfg {String} cls + *

    A custom CSS class to apply to the field's underlying element.

    + * Defaults to ''. + */ + cls: '', + + /** + * @cfg {Array / String / Function} data + * JSON Data source used to populate the combo box. 3 options are available here:
    + *

    No Data Source (default)
    + * When left null, the combo box will not suggest anything. It can still enable the user to enter + * multiple entries if allowFreeEntries is * set to true (default).

    + *

    Static Source
    + * You can pass an array of JSON objects, an array of strings or even a single CSV string as the + * data source.
    For ex. data: [* {id:0,name:"Paris"}, {id: 1, name: "New York"}]
    + * You can also pass any json object with the results property containing the json array.

    + *

    Url
    + * You can pass the url from which the component will fetch its JSON data.
    Data will be fetched + * using a POST ajax request that will * include the entered text as 'query' parameter. The results + * fetched from the server can be:
    + * - an array of JSON objects (ex: [{id:...,name:...},{...}])
    + * - a string containing an array of JSON objects ready to be parsed (ex: "[{id:...,name:...},{...}]")
    + * - a JSON object whose data will be contained in the results property + * (ex: {results: [{id:...,name:...},{...}]

    + *

    Function
    + * You can pass a function which returns an array of JSON objects (ex: [{id:...,name:...},{...}])
    + * The function can return the JSON data or it can use the first argument as function to handle the data.
    + * Only one (callback function or return value) is needed for the function to succeed.
    + * See the following example:
    + * function (response) { var myjson = [{name: 'test', id: 1}]; response(myjson); return myjson; }

    + * Defaults to null + */ + data: null, + + /** + * @cfg {Object} dataParams + *

    Additional parameters to the ajax call

    + * Defaults to {} + */ + dataUrlParams: {}, + + /** + * @cfg {Boolean} disabled + *

    Start the component in a disabled state.

    + * Defaults to false. + */ + disabled: false, + + /** + * @cfg {String} displayField + *

    name of JSON object property displayed in the combo list

    + * Defaults to name. + */ + displayField: 'name', + + /** + * @cfg {Boolean} editable + *

    Set to false if you only want mouse interaction. In that case the combo will + * automatically expand on focus.

    + * Defaults to true. + */ + editable: true, + + /** + * @cfg {String} emptyText + *

    The default placeholder text when nothing has been entered

    + * Defaults to 'Type or click here' or just 'Click here' if not editable. + */ + emptyText: function() { + return cfg.editable ? '' : ''; + }, + + /** + * @cfg {String} emptyTextCls + *

    A custom CSS class to style the empty text

    + * Defaults to 'tag-empty-text'. + */ + emptyTextCls: 'tag-empty-text', + + /** + * @cfg {Boolean} expanded + *

    Set starting state for combo.

    + * Defaults to false. + */ + expanded: false, + + /** + * @cfg {Boolean} expandOnFocus + *

    Automatically expands combo on focus.

    + * Defaults to false. + */ + expandOnFocus: function() { + return cfg.editable ? false : true; + }, + + /** + * @cfg {String} groupBy + *

    JSON property by which the list should be grouped

    + * Defaults to null + */ + groupBy: null, + + /** + * @cfg {Boolean} hideTrigger + *

    Set to true to hide the trigger on the right

    + * Defaults to false. + */ + hideTrigger: false, + + /** + * @cfg {Boolean} highlight + *

    Set to true to highlight search input within displayed suggestions

    + * Defaults to true. + */ + highlight: true, + + /** + * @cfg {String} id + *

    A custom ID for this component

    + * Defaults to 'tag-ctn-{n}' with n positive integer + */ + id: function() { + return 'tag-ctn-' + $('div[id^="tag-ctn"]').length; + }, + + /** + * @cfg {String} infoMsgCls + *

    A class that is added to the info message appearing on the top-right part of the component

    + * Defaults to '' + */ + infoMsgCls: '', + + /** + * @cfg {Object} inputCfg + *

    Additional parameters passed out to the INPUT tag. Enables usage of AngularJS's custom tags for ex.

    + * Defaults to {} + */ + inputCfg: {}, + + /** + * @cfg {String} invalidCls + *

    The class that is applied to show that the field is invalid

    + * Defaults to tag-ctn-invalid + */ + invalidCls: 'tag-ctn-invalid', + + /** + * @cfg {Boolean} matchCase + *

    Set to true to filter data results according to case. Useless if the data is fetched remotely

    + * Defaults to false. + */ + matchCase: false, + + /** + * @cfg {Integer} maxDropHeight (in px) + *

    Once expanded, the combo's height will take as much room as the # of available results. + * In case there are too many results displayed, this will fix the drop down height.

    + * Defaults to 290 px. + */ + maxDropHeight: 290, + + /** + * @cfg {Integer} maxEntryLength + *

    Defines how long the user free entry can be. Set to null for no limit.

    + * Defaults to null. + */ + maxEntryLength: null, + + /** + * @cfg {String} maxEntryRenderer + *

    A function that defines the helper text when the max entry length has been surpassed.

    + * Defaults to function(v){return 'Please reduce your entry by ' + v + ' character' + (v > 1 ? 's':'');} + */ + maxEntryRenderer: function(v) { + return 'Please reduce your entry by ' + v + ' character' + (v > 1 ? 's':''); + }, + + /** + * @cfg {Integer} maxSuggestions + *

    The maximum number of results displayed in the combo drop down at once.

    + * Defaults to null. + */ + maxSuggestions: null, + + /** + * @cfg {Integer} maxSelection + *

    The maximum number of items the user can select if multiple selection is allowed. + * Set to null to remove the limit.

    + * Defaults to 10. + */ + maxSelection: null, + + /** + * @cfg {Function} maxSelectionRenderer + *

    A function that defines the helper text when the max selection amount has been reached. The function has a single + * parameter which is the number of selected elements.

    + * Defaults to function(v){return 'You cannot choose more than ' + v + ' item' + (v > 1 ? 's':'');} + */ + maxSelectionRenderer: function(v) { + return 'You cannot choose more than ' + v + ' item' + (v > 1 ? 's':''); + }, + + /** + * @cfg {String} method + *

    The method used by the ajax request.

    + * Defaults to 'POST' + */ + method: 'POST', + + /** + * @cfg {Integer} minChars + *

    The minimum number of characters the user must type before the combo expands and offers suggestions. + * Defaults to 0. + */ + minChars: 0, + + /** + * @cfg {Function} minCharsRenderer + *

    A function that defines the helper text when not enough letters are set. The function has a single + * parameter which is the difference between the required amount of letters and the current one.

    + * Defaults to function(v){return 'Please type ' + v + ' more character' + (v > 1 ? 's':'');} + */ + minCharsRenderer: function(v) { + return 'Please type ' + v + ' more character' + (v > 1 ? 's':''); + }, + + /** + * @cfg {String} name + *

    The name used as a form element.

    + * Defaults to 'null' + */ + name: null, + + /** + * @cfg {String} noSuggestionText + *

    The text displayed when there are no suggestions.

    + * Defaults to 'No suggestions" + */ + noSuggestionText: 'No suggestions', + + /** + * @cfg {Boolean} preselectSingleSuggestion + *

    If a single suggestion comes out, it is preselected.

    + * Defaults to true. + */ + preselectSingleSuggestion: true, + + /** + * @cfg (function) renderer + *

    A function used to define how the items will be presented in the combo

    + * Defaults to null. + */ + renderer: null, + + /** + * @cfg {Boolean} required + *

    Whether or not this field should be required

    + * Defaults to false + */ + required: false, + + /** + * @cfg {Boolean} resultAsString + *

    Set to true to render selection as comma separated string

    + * Defaults to false. + */ + resultAsString: false, + + /** + * @cfg {String} resultsField + *

    Name of JSON object property that represents the list of suggested objets

    + * Defaults to results + */ + resultsField: 'results', + + /** + * @cfg {String} selectionCls + *

    A custom CSS class to add to a selected item

    + * Defaults to ''. + */ + selectionCls: '', + + /** + * @cfg {String} selectionPosition + *

    Where the selected items will be displayed. Only 'right', 'bottom' and 'inner' are valid values

    + * Defaults to 'inner', meaning the selected items will appear within the input box itself. + */ + selectionPosition: 'inner', + + /** + * @cfg (function) selectionRenderer + *

    A function used to define how the items will be presented in the tag list

    + * Defaults to null. + */ + selectionRenderer: null, + + /** + * @cfg {Boolean} selectionStacked + *

    Set to true to stack the selectioned items when positioned on the bottom + * Requires the selectionPosition to be set to 'bottom'

    + * Defaults to false. + */ + selectionStacked: false, + + /** + * @cfg {String} sortDir + *

    Direction used for sorting. Only 'asc' and 'desc' are valid values

    + * Defaults to 'asc'. + */ + sortDir: 'asc', + + /** + * @cfg {String} sortOrder + *

    name of JSON object property for local result sorting. + * Leave null if you do not wish the results to be ordered or if they are already ordered remotely.

    + * + * Defaults to null. + */ + sortOrder: null, + + /** + * @cfg {Boolean} strictSuggest + *

    If set to true, suggestions will have to start by user input (and not simply contain it as a substring)

    + * Defaults to false. + */ + strictSuggest: false, + + /** + * @cfg {String} style + *

    Custom style added to the component container.

    + * + * Defaults to ''. + */ + style: '', + + /** + * @cfg {Boolean} toggleOnClick + *

    If set to true, the combo will expand / collapse when clicked upon

    + * Defaults to false. + */ + toggleOnClick: false, + + + /** + * @cfg {Integer} typeDelay + *

    Amount (in ms) between keyboard registers.

    + * + * Defaults to 400 + */ + typeDelay: 400, + + /** + * @cfg {Boolean} useTabKey + *

    If set to true, tab won't blur the component but will be registered as the ENTER key

    + * Defaults to false. + */ + useTabKey: false, + + /** + * @cfg {Boolean} useCommaKey + *

    If set to true, using comma will validate the user's choice

    + * Defaults to true. + */ + useCommaKey: true, + + + /** + * @cfg {Boolean} useZebraStyle + *

    Determines whether or not the results will be displayed with a zebra table style

    + * Defaults to true. + */ + useZebraStyle: true, + + /** + * @cfg {String/Object/Array} value + *

    initial value for the field

    + * Defaults to null. + */ + value: null, + + /** + * @cfg {String} valueField + *

    name of JSON object property that represents its underlying value

    + * Defaults to id. + */ + valueField: 'id', + + /** + * @cfg {Integer} width (in px) + *

    Width of the component

    + * Defaults to underlying element width. + */ + width: function() { + return $(this).width(); + } + }; + + var conf = $.extend({},options); + var cfg = $.extend(true, {}, defaults, conf); + + // some init stuff + if ($.isFunction(cfg.emptyText)) { + cfg.emptyText = cfg.emptyText.call(this); + } + if ($.isFunction(cfg.expandOnFocus)) { + cfg.expandOnFocus = cfg.expandOnFocus.call(this); + } + if ($.isFunction(cfg.id)) { + cfg.id = cfg.id.call(this); + } + + /********** PUBLIC METHODS ************/ + /** + * Add one or multiple json items to the current selection + * @param items - json object or array of json objects + * @param isSilent - (optional) set to true to suppress 'selectionchange' event from being triggered + */ + this.addToSelection = function(items, isSilent) + { + if (!cfg.maxSelection || _selection.length < cfg.maxSelection) { + if (!$.isArray(items)) { + items = [items]; + } + var valuechanged = false; + $.each(items, function(index, json) { + if ($.inArray(json[cfg.valueField], ms.getValue()) === -1) { + _selection.push(json); + valuechanged = true; + } + }); + if(valuechanged === true) { + self._renderSelection(); + this.empty(); + if (isSilent !== true) { + $(this).trigger('selectionchange', [this, this.getSelectedItems()]); + } + } + } + }; + + /** + * Clears the current selection + * @param isSilent - (optional) set to true to suppress 'selectionchange' event from being triggered + */ + this.clear = function(isSilent) + { + this.removeFromSelection(_selection.slice(0), isSilent); // clone array to avoid concurrency issues + }; + + /** + * Collapse the drop down part of the combo + */ + this.collapse = function() + { + if (cfg.expanded === true) { + this.combobox.detach(); + cfg.expanded = false; + $(this).trigger('collapse', [this]); + } + }; + + /** + * Set the component in a disabled state. + */ + this.disable = function() + { + this.container.addClass('tag-ctn-disabled'); + cfg.disabled = true; + ms.input.attr('disabled', true); + }; + + /** + * Empties out the combo user text + */ + this.empty = function(){ + this.input.removeClass(cfg.emptyTextCls); + this.input.val(''); + }; + + /** + * Set the component in a enable state. + */ + this.enable = function() + { + this.container.removeClass('tag-ctn-disabled'); + cfg.disabled = false; + ms.input.attr('disabled', false); + }; + + /** + * Expand the drop drown part of the combo. + */ + this.expand = function() + { + if (!cfg.expanded && (this.input.val().length >= cfg.minChars || this.combobox.children().size() > 0)) { + this.combobox.appendTo(this.container); + self._processSuggestions(); + cfg.expanded = true; + $(this).trigger('expand', [this]); + } + }; + + /** + * Retrieve component enabled status + */ + this.isDisabled = function() + { + return cfg.disabled; + }; + + /** + * Checks whether the field is valid or not + * @return {boolean} + */ + this.isValid = function() + { + return cfg.required === false || _selection.length > 0; + }; + + /** + * Gets the data params for current ajax request + */ + this.getDataUrlParams = function() + { + return cfg.dataUrlParams; + }; + + /** + * Gets the name given to the form input + */ + this.getName = function() + { + return cfg.name; + }; + + /** + * Retrieve an array of selected json objects + * @return {Array} + */ + this.getSelectedItems = function() + { + return _selection; + }; + + /** + * Retrieve the current text entered by the user + */ + this.getRawValue = function(){ + return ms.input.val() !== cfg.emptyText ? ms.input.val() : ''; + }; + + /** + * Retrieve an array of selected values + */ + this.getValue = function() + { + return $.map(_selection, function(o) { + return o[cfg.valueField]; + }); + }; + + /** + * Remove one or multiples json items from the current selection + * @param items - json object or array of json objects + * @param isSilent - (optional) set to true to suppress 'selectionchange' event from being triggered + */ + this.removeFromSelection = function(items, isSilent) + { + if (!$.isArray(items)) { + items = [items]; + } + var valuechanged = false; + $.each(items, function(index, json) { + var i = $.inArray(json[cfg.valueField], ms.getValue()); + if (i > -1) { + _selection.splice(i, 1); + valuechanged = true; + } + }); + if (valuechanged === true) { + self._renderSelection(); + if(isSilent !== true){ + $(this).trigger('selectionchange', [this, this.getSelectedItems()]); + } + if(cfg.expandOnFocus){ + ms.expand(); + } + if(cfg.expanded) { + self._processSuggestions(); + } + } + }; + + /** + * Set up some combo data after it has been rendered + * @param data + */ + this.setData = function(data){ + cfg.data = data; + self._processSuggestions(); + }; + + /** + * Sets the name for the input field so it can be fetched in the form + * @param name + */ + this.setName = function(name){ + cfg.name = name; + if(ms._valueContainer){ + ms._valueContainer.name = name; + } + }; + + /** + * Sets a value for the combo box. Value must be a value or an array of value with data type matching valueField one. + * @param data + */ + this.setValue = function(data) + { + var values = data, items = []; + if(!$.isArray(data)){ + if(typeof(data) === 'string'){ + if(data.indexOf('[') > -1){ + values = eval(data); + } else if(data.indexOf(',') > -1){ + values = data.split(','); + } + } else { + values = [data]; + } + } + + $.each(_cbData, function(index, obj) { + if($.inArray(obj[cfg.valueField], values) > -1) { + items.push(obj); + } + }); + if(items.length > 0) { + this.addToSelection(items); + } + }; + + /** + * Sets data params for subsequent ajax requests + * @param params + */ + this.setDataUrlParams = function(params) + { + cfg.dataUrlParams = $.extend({},params); + }; + + /********** PRIVATE ************/ + var _selection = [], // selected objects + _comboItemHeight = 0, // height for each combo item. + _timer, + _hasFocus = false, + _groups = null, + _cbData = [], + _ctrlDown = false; + + var self = { + + /** + * Empties the result container and refills it with the array of json results in input + * @private + */ + _displaySuggestions: function(data) { + ms.combobox.empty(); + + var resHeight = 0, // total height taken by displayed results. + nbGroups = 0; + + if(_groups === null) { + self._renderComboItems(data); + resHeight = _comboItemHeight * data.length; + } + else { + for(var grpName in _groups) { + nbGroups += 1; + $('
    ', { + 'class': 'tag-res-group', + html: grpName + }).appendTo(ms.combobox); + self._renderComboItems(_groups[grpName].items, true); + } + resHeight = _comboItemHeight * (data.length + nbGroups); + } + + if(resHeight < ms.combobox.height() || resHeight <= cfg.maxDropHeight) { + ms.combobox.height(resHeight); + } + else if(resHeight >= ms.combobox.height() && resHeight > cfg.maxDropHeight) { + ms.combobox.height(cfg.maxDropHeight); + } + + if(data.length === 1 && cfg.preselectSingleSuggestion === true) { + ms.combobox.children().filter(':last').addClass('tag-res-item-active'); + } + + if(data.length === 0 && ms.getRawValue() !== "") { + self._updateHelper(cfg.noSuggestionText); + ms.collapse(); + } + }, + + /** + * Returns an array of json objects from an array of strings. + * @private + */ + _getEntriesFromStringArray: function(data) { + var json = []; + $.each(data, function(index, s) { + var entry = {}; + entry[cfg.displayField] = entry[cfg.valueField] = $.trim(s); + json.push(entry); + }); + return json; + }, + + /** + * Replaces html with highlighted html according to case + * @param html + * @private + */ + _highlightSuggestion: function(html) { + var q = ms.input.val() !== cfg.emptyText ? ms.input.val() : ''; + if(q.length === 0) { + return html; // nothing entered as input + } + + if(cfg.matchCase === true) { + html = html.replace(new RegExp('(' + q + ')(?!([^<]+)?>)','g'), '$1'); + } + else { + html = html.replace(new RegExp('(' + q + ')(?!([^<]+)?>)','gi'), '$1'); + } + return html; + }, + + /** + * Moves the selected cursor amongst the list item + * @param dir - 'up' or 'down' + * @private + */ + _moveSelectedRow: function(dir) { + if(!cfg.expanded) { + ms.expand(); + } + var list, start, active, scrollPos; + list = ms.combobox.find(".tag-res-item"); + if(dir === 'down') { + start = list.eq(0); + } + else { + start = list.filter(':last'); + } + active = ms.combobox.find('.tag-res-item-active:first'); + if(active.length > 0) { + if(dir === 'down') { + start = active.nextAll('.tag-res-item').first(); + if(start.length === 0) { + start = list.eq(0); + } + scrollPos = ms.combobox.scrollTop(); + ms.combobox.scrollTop(0); + if(start[0].offsetTop + start.outerHeight() > ms.combobox.height()) { + ms.combobox.scrollTop(scrollPos + _comboItemHeight); + } + } + else { + start = active.prevAll('.tag-res-item').first(); + if(start.length === 0) { + start = list.filter(':last'); + ms.combobox.scrollTop(_comboItemHeight * list.length); + } + if(start[0].offsetTop < ms.combobox.scrollTop()) { + ms.combobox.scrollTop(ms.combobox.scrollTop() - _comboItemHeight); + } + } + } + list.removeClass("tag-res-item-active"); + start.addClass("tag-res-item-active"); + }, + + /** + * According to given data and query, sort and add suggestions in their container + * @private + */ + _processSuggestions: function(source) { + var json = null, data = source || cfg.data; + if(data !== null) { + if(typeof(data) === 'function'){ + data = data.call(ms); + } + if(typeof(data) === 'string' && data.indexOf(',') < 0) { // get results from ajax + + $(ms).trigger('beforeload', [ms]); + var params = $.extend({query: ms.input.val()}, cfg.dataUrlParams); + $.ajax({ + type: cfg.method, + url: data, + data: params, + success: function(asyncData){ + json = typeof(asyncData) === 'string' ? JSON.parse(asyncData) : asyncData; + self._processSuggestions(json); + $(ms).trigger('load', [ms, json]); + }, + error: function(){ + throw("Could not reach server"); + } + }); + return; + } else if(typeof(data) === 'string' && data.indexOf(',') > -1) { // results from csv string + + _cbData = self._getEntriesFromStringArray(data.split(',')); + } else { // results from local array + + if(data.length > 0 && typeof(data[0]) === 'string') { // results from array of strings + + _cbData = self._getEntriesFromStringArray(data); + } else { // regular json array or json object with results property + + _cbData = data[cfg.resultsField] || data; + + } + } + self._displaySuggestions(self._sortAndTrim(_cbData)); + + } + }, + + /** + * Render the component to the given input DOM element + * @private + */ + _render: function(el) { + $(ms).trigger('beforerender', [ms]); + var w = $.isFunction(cfg.width) ? cfg.width.call(el) : cfg.width; + // holds the main div, will relay the focus events to the contained input element. + ms.container = $('
    ', { + id: cfg.id, + 'class': 'tag-ctn ' + cfg.cls + + (cfg.disabled === true ? ' tag-ctn-disabled' : '') + + (cfg.editable === true ? '' : ' tag-ctn-readonly'), + style: cfg.style + }).width(w); + ms.container.focus($.proxy(handlers._onFocus, this)); + ms.container.blur($.proxy(handlers._onBlur, this)); + ms.container.keydown($.proxy(handlers._onKeyDown, this)); + ms.container.keyup($.proxy(handlers._onKeyUp, this)); + + // holds the input field + ms.input = $('', $.extend({ + id: 'tag-input-' + $('input[id^="tag-input"]').length, + type: 'text', + 'class': cfg.emptyTextCls + (cfg.editable === true ? '' : ' tag-input-readonly'), + value: cfg.emptyText, + readonly: !cfg.editable, + disabled: cfg.disabled + }, cfg.inputCfg)).width(w - (cfg.hideTrigger ? 16 : 42)); + + ms.input.focus($.proxy(handlers._onInputFocus, this)); + ms.input.click($.proxy(handlers._onInputClick, this)); + + // holds the trigger on the right side + if(cfg.hideTrigger === false) { + ms.trigger = $('
    ', { + id: 'tag-trigger-' + $('div[id^="tag-trigger"]').length, + 'class': 'tag-trigger', + html: '
    ' + }); + ms.trigger.click($.proxy(handlers._onTriggerClick, this)); + ms.container.append(ms.trigger); + } + + // holds the suggestions. will always be placed on focus + ms.combobox = $('
    ', { + id: 'tag-res-ctn-' + $('div[id^="tag-res-ctn"]').length, + 'class': 'tag-res-ctn ' + }).width(w).height(cfg.maxDropHeight); + + // bind the onclick and mouseover using delegated events (needs jQuery >= 1.7) + ms.combobox.on('click', 'div.tag-res-item', $.proxy(handlers._onComboItemSelected, this)); + ms.combobox.on('mouseover', 'div.tag-res-item', $.proxy(handlers._onComboItemMouseOver, this)); + + ms.selectionContainer = $('
    ', { + id: 'tag-sel-ctn-' + $('div[id^="tag-sel-ctn"]').length, + 'class': 'tag-sel-ctn' + }); + ms.selectionContainer.click($.proxy(handlers._onFocus, this)); + + if(cfg.selectionPosition === 'inner') { + ms.selectionContainer.append(ms.input); + } + else { + ms.container.append(ms.input); + } + + ms.helper = $('
    ', { + 'class': 'tag-helper ' + cfg.infoMsgCls + }); + self._updateHelper(); + ms.container.append(ms.helper); + + + // Render the whole thing + $(el).replaceWith(ms.container); + + switch(cfg.selectionPosition) { + case 'bottom': + ms.selectionContainer.insertAfter(ms.container); + if(cfg.selectionStacked === true) { + ms.selectionContainer.width(ms.container.width()); + ms.selectionContainer.addClass('tag-stacked'); + } + break; + case 'right': + ms.selectionContainer.insertAfter(ms.container); + ms.container.css('float', 'left'); + break; + default: + ms.container.append(ms.selectionContainer); + break; + } + + self._processSuggestions(); + if(cfg.value !== null) { + ms.setValue(cfg.value); + self._renderSelection(); + } + + $(ms).trigger('afterrender', [ms]); + $("body").click(function(e) { + if(ms.container.hasClass('tag-ctn-bootstrap-focus') && + ms.container.has(e.target).length === 0 && + e.target.className.indexOf('tag-res-item') < 0 && + e.target.className.indexOf('tag-close-btn') < 0 && + ms.container[0] !== e.target) { + handlers._onBlur(); + } + }); + + if(cfg.expanded === true) { + cfg.expanded = false; + ms.expand(); + } + }, + + _renderComboItems: function(items, isGrouped) { + var ref = this, html = ''; + $.each(items, function(index, value) { + var displayed = cfg.renderer !== null ? cfg.renderer.call(ref, value) : value[cfg.displayField]; + var resultItemEl = $('
    ', { + 'class': 'tag-res-item ' + (isGrouped ? 'tag-res-item-grouped ':'') + + (index % 2 === 1 && cfg.useZebraStyle === true ? 'tag-res-odd' : ''), + html: cfg.highlight === true ? self._highlightSuggestion(displayed) : displayed, + 'data-json': JSON.stringify(value) + }); + resultItemEl.click($.proxy(handlers._onComboItemSelected, ref)); + resultItemEl.mouseover($.proxy(handlers._onComboItemMouseOver, ref)); + html += $('
    ').append(resultItemEl).html(); + }); + ms.combobox.append(html); + _comboItemHeight = ms.combobox.find('.tag-res-item:first').outerHeight(); + }, + + /** + * Renders the selected items into their container. + * @private + */ + _renderSelection: function() { + var ref = this, w = 0, inputOffset = 0, items = [], + asText = cfg.resultAsString === true && !_hasFocus; + + ms.selectionContainer.find('.tag-sel-item').remove(); + if(ms._valueContainer !== undefined) { + ms._valueContainer.remove(); + } + + $.each(_selection, function(index, value){ + + var selectedItemEl, delItemEl, + selectedItemHtml = cfg.selectionRenderer !== null ? cfg.selectionRenderer.call(ref, value) : value[cfg.displayField]; + // tag representing selected value + if(asText === true) { + selectedItemEl = $('
    ', { + 'class': 'tag-sel-item tag-sel-text ' + cfg.selectionCls, + html: selectedItemHtml + (index === (_selection.length - 1) ? '' : ',') + }).data('json', value); + } + else { + selectedItemEl = $('
    ', { + 'class': 'tag-sel-item ' + cfg.selectionCls, + html: selectedItemHtml + }).data('json', value); + + if(cfg.disabled === false){ + // small cross img + delItemEl = $('', { + 'class': 'tag-close-btn' + }).data('json', value).appendTo(selectedItemEl); + + delItemEl.click($.proxy(handlers._onTagTriggerClick, ref)); + } + } + + items.push(selectedItemEl); + }); + + ms.selectionContainer.prepend(items); + ms._valueContainer = $('', { + type: 'hidden', + name: cfg.name, + value: JSON.stringify(ms.getValue()) + }); + ms._valueContainer.appendTo(ms.selectionContainer); + + if(cfg.selectionPosition === 'inner') { + ms.input.width(0); + inputOffset = ms.input.offset().left - ms.selectionContainer.offset().left; + w = ms.container.width() - inputOffset - 42; + ms.input.width(w); + ms.container.height(ms.selectionContainer.height()); + } + + if(_selection.length === cfg.maxSelection){ + self._updateHelper(cfg.maxSelectionRenderer.call(this, _selection.length)); + } else { + ms.helper.hide(); + } + }, + + /** + * Select an item either through keyboard or mouse + * @param item + * @private + */ + _selectItem: function(item) { + if(cfg.maxSelection === 1){ + _selection = []; + } + ms.addToSelection(item.data('json')); + item.removeClass('tag-res-item-active'); + if(cfg.expandOnFocus === false || _selection.length === cfg.maxSelection){ + ms.collapse(); + } + if(!_hasFocus){ + ms.input.focus(); + } else if(_hasFocus && (cfg.expandOnFocus || _ctrlDown)){ + self._processSuggestions(); + if(_ctrlDown){ + ms.expand(); + } + } + }, + + /** + * Sorts the results and cut them down to max # of displayed results at once + * @private + */ + _sortAndTrim: function(data) { + var q = ms.getRawValue(), + filtered = [], + newSuggestions = [], + selectedValues = ms.getValue(); + // filter the data according to given input + if(q.length > 0) { + $.each(data, function(index, obj) { + var name = obj[cfg.displayField]; + if((cfg.matchCase === true && name.indexOf(q) > -1) || + (cfg.matchCase === false && name.toLowerCase().indexOf(q.toLowerCase()) > -1)) { + if(cfg.strictSuggest === false || name.toLowerCase().indexOf(q.toLowerCase()) === 0) { + filtered.push(obj); + } + } + }); + } + else { + filtered = data; + } + // take out the ones that have already been selected + $.each(filtered, function(index, obj) { + if($.inArray(obj[cfg.valueField], selectedValues) === -1) { + newSuggestions.push(obj); + } + }); + // sort the data + if(cfg.sortOrder !== null) { + newSuggestions.sort(function(a,b) { + if(a[cfg.sortOrder] < b[cfg.sortOrder]) { + return cfg.sortDir === 'asc' ? -1 : 1; + } + if(a[cfg.sortOrder] > b[cfg.sortOrder]) { + return cfg.sortDir === 'asc' ? 1 : -1; + } + return 0; + }); + } + // trim it down + if(cfg.maxSuggestions && cfg.maxSuggestions > 0) { + newSuggestions = newSuggestions.slice(0, cfg.maxSuggestions); + } + // build groups + if(cfg.groupBy !== null) { + _groups = {}; + $.each(newSuggestions, function(index, value) { + if(_groups[value[cfg.groupBy]] === undefined) { + _groups[value[cfg.groupBy]] = {title: value[cfg.groupBy], items: [value]}; + } + else { + _groups[value[cfg.groupBy]].items.push(value); + } + }); + } + return newSuggestions; + }, + + /** + * Update the helper text + * @private + */ + _updateHelper: function(html) { + ms.helper.html(html); + if(!ms.helper.is(":visible")) { + ms.helper.fadeIn(); + } + } + }; + + var handlers = { + /** + * Triggered when blurring out of the component + * @private + */ + _onBlur: function() { + ms.container.removeClass('tag-ctn-bootstrap-focus'); + ms.collapse(); + _hasFocus = false; + if(ms.getRawValue() !== '' && cfg.allowFreeEntries === true){ + var obj = {}; + obj[cfg.displayField] = obj[cfg.valueField] = ms.getRawValue(); + ms.addToSelection(obj); + } + self._renderSelection(); + + if(ms.isValid() === false) { + ms.container.addClass('tag-ctn-invalid'); + } + + if(ms.input.val() === '' && _selection.length === 0) { + ms.input.addClass(cfg.emptyTextCls); + ms.input.val(cfg.emptyText); + } + else if(ms.input.val() !== '' && cfg.allowFreeEntries === false) { + ms.empty(); + self._updateHelper(''); + } + + if(ms.input.is(":focus")) { + $(ms).trigger('blur', [ms]); + } + }, + + /** + * Triggered when hovering an element in the combo + * @param e + * @private + */ + _onComboItemMouseOver: function(e) { + ms.combobox.children().removeClass('tag-res-item-active'); + $(e.currentTarget).addClass('tag-res-item-active'); + }, + + /** + * Triggered when an item is chosen from the list + * @param e + * @private + */ + _onComboItemSelected: function(e) { + self._selectItem($(e.currentTarget)); + }, + + /** + * Triggered when focusing on the container div. Will focus on the input field instead. + * @private + */ + _onFocus: function() { + ms.input.focus(); + }, + + /** + * Triggered when clicking on the input text field + * @private + */ + _onInputClick: function(){ + if (ms.isDisabled() === false && _hasFocus) { + if (cfg.toggleOnClick === true) { + if (cfg.expanded){ + ms.collapse(); + } else { + ms.expand(); + } + } + } + }, + + /** + * Triggered when focusing on the input text field. + * @private + */ + _onInputFocus: function() { + if(ms.isDisabled() === false && !_hasFocus) { + _hasFocus = true; + ms.container.addClass('tag-ctn-bootstrap-focus'); + ms.container.removeClass(cfg.invalidCls); + + if(ms.input.val() === cfg.emptyText) { + ms.empty(); + } + + var curLength = ms.getRawValue().length; + if(cfg.expandOnFocus === true){ + ms.expand(); + } + + if(_selection.length === cfg.maxSelection) { + self._updateHelper(cfg.maxSelectionRenderer.call(this, _selection.length)); + } else if(curLength < cfg.minChars) { + self._updateHelper(cfg.minCharsRenderer.call(this, cfg.minChars - curLength)); + } + + self._renderSelection(); + $(ms).trigger('focus', [ms]); + } + }, + + /** + * Triggered when the user presses a key while the component has focus + * This is where we want to handle all keys that don't require the user input field + * since it hasn't registered the key hit yet + * @param e keyEvent + * @private + */ + _onKeyDown: function(e) { + // check how tab should be handled + var active = ms.combobox.find('.tag-res-item-active:first'), + freeInput = ms.input.val() !== cfg.emptyText ? ms.input.val() : ''; + $(ms).trigger('keydown', [ms, e]); + + if(e.keyCode === 9 && (cfg.useTabKey === false || + (cfg.useTabKey === true && active.length === 0 && ms.input.val().length === 0))) { + handlers._onBlur(); + return; + } + switch(e.keyCode) { + case 8: //backspace + if(freeInput.length === 0 && ms.getSelectedItems().length > 0 && cfg.selectionPosition === 'inner') { + _selection.pop(); + self._renderSelection(); + $(ms).trigger('selectionchange', [ms, ms.getSelectedItems()]); + ms.input.focus(); + e.preventDefault(); + } + break; + case 9: // tab + case 188: // esc + case 13: // enter + e.preventDefault(); + break; + case 17: // ctrl + _ctrlDown = true; + break; + case 40: // down + e.preventDefault(); + self._moveSelectedRow("down"); + break; + case 38: // up + e.preventDefault(); + self._moveSelectedRow("up"); + break; + default: + if(_selection.length === cfg.maxSelection) { + e.preventDefault(); + } + break; + } + }, + + /** + * Triggered when a key is released while the component has focus + * @param e + * @private + */ + _onKeyUp: function(e) { + var freeInput = ms.getRawValue(), + inputValid = $.trim(ms.input.val()).length > 0 && ms.input.val() !== cfg.emptyText && + (!cfg.maxEntryLength || $.trim(ms.input.val()).length <= cfg.maxEntryLength), + selected, + obj = {}; + + $(ms).trigger('keyup', [ms, e]); + + clearTimeout(_timer); + + // collapse if escape, but keep focus. + if(e.keyCode === 27 && cfg.expanded) { + ms.combobox.height(0); + } + // ignore a bunch of keys + if((e.keyCode === 9 && cfg.useTabKey === false) || (e.keyCode > 13 && e.keyCode < 32)) { + if(e.keyCode === 17){ + _ctrlDown = false; + } + return; + } + switch(e.keyCode) { + case 40:case 38: // up, down + e.preventDefault(); + break; + case 13:case 9:case 188:// enter, tab, comma + if(e.keyCode !== 188 || cfg.useCommaKey === true) { + e.preventDefault(); + if(cfg.expanded === true){ // if a selection is performed, select it and reset field + selected = ms.combobox.find('.tag-res-item-active:first'); + if(selected.length > 0) { + self._selectItem(selected); + return; + } + } + // if no selection or if freetext entered and free entries allowed, add new obj to selection + if(inputValid === true && cfg.allowFreeEntries === true) { + obj[cfg.displayField] = obj[cfg.valueField] = freeInput; + ms.addToSelection(obj); + ms.collapse(); // reset combo suggestions + ms.input.focus(); + } + break; + } + default: + if(_selection.length === cfg.maxSelection){ + self._updateHelper(cfg.maxSelectionRenderer.call(this, _selection.length)); + } + else { + if(freeInput.length < cfg.minChars) { + self._updateHelper(cfg.minCharsRenderer.call(this, cfg.minChars - freeInput.length)); + if(cfg.expanded === true) { + ms.collapse(); + } + } + else if(cfg.maxEntryLength && freeInput.length > cfg.maxEntryLength) { + self._updateHelper(cfg.maxEntryRenderer.call(this, freeInput.length - cfg.maxEntryLength)); + if(cfg.expanded === true) { + ms.collapse(); + } + } + else { + ms.helper.hide(); + if(cfg.minChars <= freeInput.length){ + _timer = setTimeout(function() { + if(cfg.expanded === true) { + self._processSuggestions(); + } else { + ms.expand(); + } + }, cfg.typeDelay); + } + } + } + break; + } + }, + + /** + * Triggered when clicking upon cross for deletion + * @param e + * @private + */ + _onTagTriggerClick: function(e) { + ms.removeFromSelection($(e.currentTarget).data('json')); + }, + + /** + * Triggered when clicking on the small trigger in the right + * @private + */ + _onTriggerClick: function() { + if(ms.isDisabled() === false && !(cfg.expandOnFocus === true && _selection.length === cfg.maxSelection)) { + $(ms).trigger('triggerclick', [ms]); + if(cfg.expanded === true) { + ms.collapse(); + } else { + var curLength = ms.getRawValue().length; + if(curLength >= cfg.minChars){ + ms.input.focus(); + ms.expand(); + } else { + self._updateHelper(cfg.minCharsRenderer.call(this, cfg.minChars - curLength)); + } + } + } + } + }; + + // startup point + if(element !== null) { + self._render(element); + } + }; + + $.fn.tagSuggest = function(options) { + var obj = $(this); + + if(obj.size() === 1 && obj.data('tagSuggest')) { + return obj.data('tagSuggest'); + } + + obj.each(function(i) { + // assume $(this) is an element + var cntr = $(this); + + // Return early if this element already has a plugin instance + if(cntr.data('tagSuggest')){ + return; + } + + if(this.nodeName.toLowerCase() === 'select'){ // rendering from select + options.data = []; + options.value = []; + $.each(this.children, function(index, child){ + if(child.nodeName && child.nodeName.toLowerCase() === 'option'){ + options.data.push({id: child.value, name: child.text}); + if(child.selected){ + options.value.push(child.value); + } + } + }); + + } + + var def = {}; + // set values from DOM container element + $.each(this.attributes, function(i, att){ + def[att.name] = att.value; + }); + var field = new TagSuggest(this, $.extend(options, def)); + cntr.data('tagSuggest', field); + field.container.data('tagSuggest', field); + }); + + if(obj.size() === 1) { + return obj.data('tagSuggest'); + } + return obj; + }; + +// $.fn.tagSuggest.defaults = {}; +})(jQuery); + + + $(document).ready(function() { + var jsonData = []; + var fruits = 'Apple,Orange,Banana,Strawberry'.split(','); + //Default values + /*for(var i=0;i Date: Thu, 17 May 2018 11:00:05 +0200 Subject: [PATCH 03/22] display tag on important paste and search --- .../browsepastes/Flask_browsepastes.py | 55 ++++++++++++++++ .../templates/important_paste_by_module.html | 29 ++++++--- var/www/modules/search/Flask_search.py | 65 ++++++++++++++++++- var/www/modules/search/templates/search.html | 33 ++++++---- 4 files changed, 159 insertions(+), 23 deletions(-) diff --git a/var/www/modules/browsepastes/Flask_browsepastes.py b/var/www/modules/browsepastes/Flask_browsepastes.py index 67923fbd..a3f238c7 100644 --- a/var/www/modules/browsepastes/Flask_browsepastes.py +++ b/var/www/modules/browsepastes/Flask_browsepastes.py @@ -20,6 +20,7 @@ app = Flask_config.app cfg = Flask_config.cfg max_preview_char = Flask_config.max_preview_char max_preview_modal = Flask_config.max_preview_modal +r_serv_metadata = Flask_config.r_serv_metadata #init all lvlDB servers curYear = datetime.now().year @@ -56,6 +57,14 @@ def getPastebyType(server, module_name): def event_stream_getImportantPasteByModule(module_name, year): index = 0 all_pastes_list = getPastebyType(r_serv_db[year], module_name) + paste_tags = [] + bootstrap_label = [] + bootstrap_label.append('primary') + bootstrap_label.append('success') + bootstrap_label.append('danger') + bootstrap_label.append('warning') + bootstrap_label.append('info') + bootstrap_label.append('dark') for path in all_pastes_list: index += 1 @@ -64,6 +73,22 @@ def event_stream_getImportantPasteByModule(module_name, year): content_range = max_preview_char if len(content)>max_preview_char else len(content)-1 curr_date = str(paste._get_p_date()) curr_date = curr_date[0:4]+'/'+curr_date[4:6]+'/'+curr_date[6:] + p_tags = r_serv_metadata.smembers('tag:'+path) + l_tags = [] + for tag in p_tags: + tag = tag.split('=') + if len(tag) > 1: + if tag[1] != '': + tag = tag[1][1:-1] + # no value + else: + tag = tag[0][1:-1] + # use for custom tags + else: + tag = tag[0] + + l_tags.append(tag) + data = {} data["module"] = module_name data["index"] = index @@ -71,6 +96,8 @@ def event_stream_getImportantPasteByModule(module_name, year): data["content"] = content[0:content_range] data["linenum"] = paste.get_lines_info()[0] data["date"] = curr_date + data["l_tags"] = l_tags + data["bootstrap_label"] = bootstrap_label data["char_to_display"] = max_preview_modal data["finished"] = True if index == len(all_pastes_list) else False yield 'retry: 100000\ndata: %s\n\n' % json.dumps(data) #retry to avoid reconnection of the browser @@ -98,8 +125,17 @@ def importantPasteByModule(): paste_date = [] paste_linenum = [] all_path = [] + paste_tags = [] allPastes = getPastebyType(r_serv_db[currentSelectYear], module_name) + bootstrap_label = [] + bootstrap_label.append('primary') + bootstrap_label.append('success') + bootstrap_label.append('danger') + bootstrap_label.append('warning') + bootstrap_label.append('info') + bootstrap_label.append('dark') + for path in allPastes[0:10]: all_path.append(path) paste = Paste.Paste(path) @@ -110,6 +146,23 @@ def importantPasteByModule(): curr_date = curr_date[0:4]+'/'+curr_date[4:6]+'/'+curr_date[6:] paste_date.append(curr_date) paste_linenum.append(paste.get_lines_info()[0]) + p_tags = r_serv_metadata.smembers('tag:'+path) + l_tags = [] + for tag in p_tags: + tag = tag.split('=') + if len(tag) > 1: + if tag[1] != '': + tag = tag[1][1:-1] + # no value + else: + tag = tag[0][1:-1] + # use for custom tags + else: + tag = tag[0] + + l_tags.append(tag) + + paste_tags.append(l_tags) if len(allPastes) > 10: finished = False @@ -124,6 +177,8 @@ def importantPasteByModule(): paste_date=paste_date, paste_linenum=paste_linenum, char_to_display=max_preview_modal, + paste_tags=paste_tags, + bootstrap_label=bootstrap_label, finished=finished) @browsepastes.route("/_getImportantPasteByModule", methods=['GET']) diff --git a/var/www/modules/browsepastes/templates/important_paste_by_module.html b/var/www/modules/browsepastes/templates/important_paste_by_module.html index a76fb870..1e49a127 100644 --- a/var/www/modules/browsepastes/templates/important_paste_by_module.html +++ b/var/www/modules/browsepastes/templates/important_paste_by_module.html @@ -12,7 +12,13 @@ {% for path in all_path %}
    - + @@ -89,14 +95,19 @@ function add_entries_X(to_add) { } else { var feed = json_array.shift(); elem_added++; - search_table.row.add( [ - feed.index, - " "+ feed.path +"", - feed.date, - feed.linenum, - "

    " - ] ).draw( false ); - $("#myTable_"+moduleName).attr('data-numElem', curr_numElem+1); + var tag = "" + for(j=0; j" + feed.l_tags[j] + "" + } + search_table.row.add( [ + feed.index, + " "+ feed.path +"" + + "
    " + tag + "
    " , + feed.date, + feed.linenum, + "

    " + ] ).draw( false ); + $("#myTable_"+moduleName).attr('data-numElem', curr_numElem+1); } } $("#load_more_json_button1").removeAttr('disabled'); diff --git a/var/www/modules/search/Flask_search.py b/var/www/modules/search/Flask_search.py index afce2452..4714e31f 100644 --- a/var/www/modules/search/Flask_search.py +++ b/var/www/modules/search/Flask_search.py @@ -22,6 +22,7 @@ import Flask_config app = Flask_config.app cfg = Flask_config.cfg r_serv_pasteName = Flask_config.r_serv_pasteName +r_serv_metadata = Flask_config.r_serv_metadata max_preview_char = Flask_config.max_preview_char max_preview_modal = Flask_config.max_preview_modal @@ -95,6 +96,7 @@ def search(): c = [] #preview of the paste content paste_date = [] paste_size = [] + paste_tags = [] index_name = request.form['index_name'] num_elem_to_get = 50 @@ -125,7 +127,8 @@ def search(): results = searcher.search_page(query, 1, pagelen=num_elem_to_get) for x in results: r.append(x.items()[0][1]) - paste = Paste.Paste(x.items()[0][1]) + path = x.items()[0][1] + paste = Paste.Paste(path) content = paste.get_p_content() content_range = max_preview_char if len(content)>max_preview_char else len(content)-1 c.append(content[0:content_range]) @@ -133,15 +136,42 @@ def search(): curr_date = curr_date[0:4]+'/'+curr_date[4:6]+'/'+curr_date[6:] paste_date.append(curr_date) paste_size.append(paste._get_p_size()) + p_tags = r_serv_metadata.smembers('tag:'+path) + l_tags = [] + for tag in p_tags: + tag = tag.split('=') + if len(tag) > 1: + if tag[1] != '': + tag = tag[1][1:-1] + # no value + else: + tag = tag[0][1:-1] + # use for custom tags + else: + tag = tag[0] + + l_tags.append(tag) + + paste_tags.append(l_tags) results = searcher.search(query) num_res = len(results) + bootstrap_label = [] + bootstrap_label.append('primary') + bootstrap_label.append('success') + bootstrap_label.append('danger') + bootstrap_label.append('warning') + bootstrap_label.append('info') + bootstrap_label.append('dark') + index_min = 1 index_max = len(get_index_list()) return render_template("search.html", r=r, c=c, query=request.form['query'], paste_date=paste_date, paste_size=paste_size, char_to_display=max_preview_modal, num_res=num_res, index_min=index_min, index_max=index_max, + bootstrap_label=bootstrap_label, + paste_tags=paste_tags, index_list=get_index_list(selected_index) ) @@ -165,6 +195,15 @@ def get_more_search_result(): preview_array = [] date_array = [] size_array = [] + list_tags = [] + + bootstrap_label = [] + bootstrap_label.append('primary') + bootstrap_label.append('success') + bootstrap_label.append('danger') + bootstrap_label.append('warning') + bootstrap_label.append('info') + bootstrap_label.append('dark') schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT) @@ -173,8 +212,9 @@ def get_more_search_result(): query = QueryParser("content", ix.schema).parse(" ".join(q)) results = searcher.search_page(query, page_offset, num_elem_to_get) for x in results: - path_array.append(x.items()[0][1]) - paste = Paste.Paste(x.items()[0][1]) + path = x.items()[0][1] + path_array.append(path) + paste = Paste.Paste(path) content = paste.get_p_content() content_range = max_preview_char if len(content)>max_preview_char else len(content)-1 preview_array.append(content[0:content_range]) @@ -182,11 +222,30 @@ def get_more_search_result(): curr_date = curr_date[0:4]+'/'+curr_date[4:6]+'/'+curr_date[6:] date_array.append(curr_date) size_array.append(paste._get_p_size()) + p_tags = r_serv_metadata.smembers('tag:'+path) + l_tags = [] + for tag in p_tags: + tag = tag.split('=') + if len(tag) > 1: + if tag[1] != '': + tag = tag[1][1:-1] + # no value + else: + tag = tag[0][1:-1] + # use for custom tags + else: + tag = tag[0] + + l_tags.append(tag) + list_tags.append(l_tags) + to_return = {} to_return["path_array"] = path_array to_return["preview_array"] = preview_array to_return["date_array"] = date_array to_return["size_array"] = size_array + to_return["list_tags"] = list_tags + to_return["bootstrap_label"] = bootstrap_label if len(path_array) < num_elem_to_get: #pagelength to_return["moreData"] = False else: diff --git a/var/www/modules/search/templates/search.html b/var/www/modules/search/templates/search.html index 43895a9f..3ebfc182 100644 --- a/var/www/modules/search/templates/search.html +++ b/var/www/modules/search/templates/search.html @@ -75,7 +75,7 @@
    - Index: + Index:
    {% for path in r %} - - - - - + + + + + {% endfor %} @@ -160,7 +166,7 @@ input1.setAttribute("name", "index_name"); input1.setAttribute("value", this.value); form.appendChild(input1); - + var input2 = document.createElement('input'); input2.setAttribute("type", "hidden"); input2.setAttribute("name", "query"); @@ -190,9 +196,14 @@ for(i=0; i" + data.list_tags[j] + "" + } search_table.row.add( [ init_num_of_elements_in_table+((offset))+i+1, - " "+ data.path_array[i] +"", + " "+ data.path_array[i] +"" + + "
    " + tag + "
    ", data.date_array[i], data.size_array[i], "

    " @@ -245,7 +256,7 @@ 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)); + $("#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(); @@ -272,7 +283,7 @@ 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. + // 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; @@ -285,7 +296,7 @@ var 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 From b9eb3ed9bad12417e133b18b8fc3e35b4c550870 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 17 May 2018 15:33:06 +0200 Subject: [PATCH 04/22] add and delete tags features --- var/www/modules/Tags/Flask_Tags.py | 40 ++++++++++++++++++- var/www/modules/Tags/templates/tagged.html | 2 +- .../showpaste/templates/show_saved_paste.html | 38 +++++++++++++++++- 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index db501f67..2b723c79 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -5,7 +5,7 @@ Flask functions and routes for the trending modules page ''' import redis -from flask import Flask, render_template, jsonify, request, Blueprint +from flask import Flask, render_template, jsonify, request, Blueprint, redirect, url_for import json @@ -146,5 +146,43 @@ def get_tagged_paste_res(): return render_template("res.html") +@Tags.route("/Tags/remove_tag") +def remove_tag(): + + #TODO verify input + path = request.args.get('paste') + tag = request.args.get('tag') + + #remove tag + r_serv_metadata.srem('tag:'+path, tag) + r_serv_tags.srem(tag, path) + + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + +@Tags.route("/Tags/confirm_tag") +def confirm_tag(): + + #TODO verify input + path = request.args.get('paste') + tag = request.args.get('tag') + + if(tag[9:28] == 'automatic-detection'): + + #remove automatic tag + r_serv_metadata.srem('tag:'+path, tag) + r_serv_tags.srem(tag, path) + + tag = tag.replace('automatic-detection','analyst-detection', 1) + #add analyst tag + r_serv_metadata.sadd('tag:'+path, tag) + r_serv_tags.sadd(tag, path) + #add new tag in list of all used tags + r_serv_tags.sadd('list_tags', tag) + + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + + return 'incompatible tag' + + # ========= REGISTRATION ========= app.register_blueprint(Tags) diff --git a/var/www/modules/Tags/templates/tagged.html b/var/www/modules/Tags/templates/tagged.html index 17e5181b..6102be28 100644 --- a/var/www/modules/Tags/templates/tagged.html +++ b/var/www/modules/Tags/templates/tagged.html @@ -168,7 +168,7 @@ $(document).ready(function(){ var ltags = $('#ltags').tagSuggest({ data: data, - //value: slct_tags, + value: '["infoleak:automatic-detection=\"bitcoin-address\"","infoleak:automatic-detection=\"aws-key\""]', sortOrder: 'name', maxDropHeight: 200, name: 'ltags' diff --git a/var/www/modules/showpaste/templates/show_saved_paste.html b/var/www/modules/showpaste/templates/show_saved_paste.html index 2dae1caa..c0bcd35d 100644 --- a/var/www/modules/showpaste/templates/show_saved_paste.html +++ b/var/www/modules/showpaste/templates/show_saved_paste.html @@ -24,8 +24,37 @@ @@ -55,6 +84,13 @@
    {{ loop.index0 }}{{ path }}{{ path }} +
    + {% for tag in paste_tags[loop.index0] %} + {{ tag }} + {% endfor %} +
    +
    {{ paste_date[loop.index0] }} {{ paste_linenum[loop.index0] }}

    {{ loop.index0 + 1 }} {{ path }}{{ paste_date[loop.index0] }}{{ paste_size[loop.index0] }}

    {{ loop.index0 }}{{ path }} +
    + {% for tag in paste_tags[loop.index0] %} + {{ tag }} + {% endfor %} +
    +
    {{ paste_date[loop.index0] }}{{ paste_size[loop.index0] }}

    + +
    {% if duplicate_list|length == 0 %} From f5cae0d99c427c19267fd7f9b715ed91fe9de21f Mon Sep 17 00:00:00 2001 From: Terrtia Date: Wed, 23 May 2018 16:58:56 +0200 Subject: [PATCH 05/22] taxonomie + add tags + tags display --- var/www/Flask_server.py | 16 + var/www/modules/Tags/Flask_Tags.py | 319 +++++++++++++++++- var/www/modules/Tags/templates/Tags.html | 21 +- .../Tags/templates/edit_taxonomie.html | 171 ++++++++++ var/www/modules/Tags/templates/tagged.html | 39 ++- .../modules/Tags/templates/taxonomies.html | 119 +++++++ .../browsepastes/Flask_browsepastes.py | 6 +- .../templates/important_paste_by_module.html | 8 +- var/www/modules/search/Flask_search.py | 4 +- var/www/modules/search/templates/search.html | 4 +- var/www/modules/showpaste/Flask_showpaste.py | 17 +- .../showpaste/templates/show_saved_paste.html | 133 +++++++- var/www/static/js/tags.js | 8 +- 13 files changed, 803 insertions(+), 62 deletions(-) create mode 100644 var/www/modules/Tags/templates/edit_taxonomie.html create mode 100644 var/www/modules/Tags/templates/taxonomies.html diff --git a/var/www/Flask_server.py b/var/www/Flask_server.py index 0be6854a..95b2f60d 100755 --- a/var/www/Flask_server.py +++ b/var/www/Flask_server.py @@ -18,6 +18,8 @@ sys.path.append('./modules/') import Paste from Date import Date +from pytaxonomies import Taxonomies + # Import config import Flask_config @@ -82,6 +84,7 @@ for module_name, txt in list(to_add_to_header_dico.items()): to_add_to_header = [] for module_name, txt in to_add_to_header_dico.items(): to_add_to_header.append(txt) +print(to_add_to_header) modified_header = modified_header.replace('', '\n'.join(to_add_to_header)) @@ -113,6 +116,19 @@ def searchbox(): return render_template("searchbox.html") +# ========== INITIAL taxonomies ============ +r_serv_tags = redis.StrictRedis( + host=cfg.get("ARDB_Tags", "host"), + port=cfg.getint("ARDB_Tags", "port"), + db=cfg.getint("ARDB_Tags", "db"), + decode_responses=True) +# add default ail taxonomies +r_serv_tags.sadd('active_taxonomies', 'infoleak') +# add default tags +taxonomies = Taxonomies() +for tag in taxonomies.get('infoleak').machinetags(): + r_serv_tags.sadd('active_tag_infoleak', tag) + # ============ MAIN ============ if __name__ == "__main__": diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index 2b723c79..0c8be22d 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -11,6 +11,8 @@ import json import Paste +from pytaxonomies import Taxonomies + # ============ VARIABLES ============ import Flask_config @@ -39,26 +41,62 @@ def get_all_tags(): all_tags = r_serv_tags.smembers('list_tags') list_tags = [] - id = 0 for tag in all_tags: list_tags.append( tag ) - id += 1 return jsonify(list_tags) +@Tags.route("/Tags/get_all_tags_taxonomies") +def get_all_tags_taxonomies(): + + taxonomies = Taxonomies() + list_taxonomies = list(taxonomies.keys()) + + active_taxonomie = r_serv_tags.smembers('active_taxonomies') + + list_tags = [] + for taxonomie in active_taxonomie: + #l_tags = taxonomies.get(taxonomie).machinetags() + l_tags = r_serv_tags.smembers('active_tag_' + taxonomie) + for tag in l_tags: + list_tags.append( tag ) + + return jsonify(list_tags) + +@Tags.route("/Tags/get_tags_taxonomie") +def get_tags_taxonomie(): + + taxonomie = request.args.get('taxonomie') + + taxonomies = Taxonomies() + list_taxonomies = list(taxonomies.keys()) + + active_taxonomie = r_serv_tags.smembers('active_taxonomies') + + #verify input + if taxonomie in list_taxonomies: + if taxonomie in active_taxonomie: + + list_tags = [] + #l_tags = taxonomies.get(taxonomie).machinetags() + l_tags = r_serv_tags.smembers('active_tag_' + taxonomie) + for tag in l_tags: + list_tags.append( tag ) + + return jsonify(list_tags) + + else: + return 'this taxinomie is disable' + else: + return 'INCORRECT INPUT' + + @Tags.route("/Tags/get_tagged_paste") def get_tagged_paste(): - tags = request.args.get('ltags')[1:-1] - tags = tags.replace('\\','') + tags = request.args.get('ltags') list_tags = tags.split(',') - tmp_list_tags = [] - - # remove " char - for tag in list_tags: - tmp_list_tags.append(tag[1:-1]) - list_tags = tmp_list_tags # TODO verify input @@ -106,8 +144,11 @@ def get_tagged_paste(): paste_date.append(curr_date) paste_linenum.append(paste.get_lines_info()[0]) p_tags = r_serv_metadata.smembers('tag:'+path) + complete_tags = [] l_tags = [] for tag in p_tags: + complete_tag = tag + tag = tag.split('=') if len(tag) > 1: if tag[1] != '': @@ -119,7 +160,7 @@ def get_tagged_paste(): else: tag = tag[0] - l_tags.append(tag) + l_tags.append( (tag,complete_tag) ) paste_tags.append(l_tags) @@ -131,6 +172,7 @@ def get_tagged_paste(): return render_template("tagged.html", year=currentSelectYear, all_path=all_path, + tags=tags, paste_tags=paste_tags, bootstrap_label=bootstrap_label, content=all_content, @@ -139,12 +181,6 @@ def get_tagged_paste(): char_to_display=max_preview_modal, finished=finished) - return 'OK' - -@Tags.route("/Tags/res") -def get_tagged_paste_res(): - - return render_template("res.html") @Tags.route("/Tags/remove_tag") def remove_tag(): @@ -183,6 +219,255 @@ def confirm_tag(): return 'incompatible tag' +@Tags.route("/Tags/addTags") +def addTags(): + + tags = request.args.get('tags') + path = request.args.get('path') + + list_tag = tags.split(',') + + taxonomies = Taxonomies() + active_taxonomies = r_serv_tags.smembers('active_taxonomies') + + if not path: + return 'INCORRECT INPUT' + + for tag in list_tag: + # verify input + tax = tag.split(':')[0] + if tax in active_taxonomies: + if tag in r_serv_tags.smembers('active_tag_' + tax): + + #add tag + r_serv_metadata.sadd('tag:'+path, tag) + r_serv_tags.sadd(tag, path) + #add new tag in list of all used tags + r_serv_tags.sadd('list_tags', tag) + + else: + return 'INCORRECT INPUT' + else: + return 'INCORRECT INPUT' + + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + +@Tags.route("/Tags/thumbs_up_paste") +def thumbs_up_paste(): + + #TODO verify input + path = request.args.get('paste') + + '''positive_t = 'infoleak:confirmed="true-positive"' + positive_f = 'infoleak:confirmed="false-positive"' + + negative_t = 'infoleak:confirmed="true-negative"' + + list_tags = r_serv_metadata.smembers('tag:'+path) + + if(list_tags > 0): + + if positive_f in list_tags: + r_serv_metadata.srem('tag:'+path, positive_f) + r_serv_metadata.sadd('tag:'+path, positive_t) + + r_serv_tags.srem(positive_f, path) + r_serv_tags.sadd(positive_t, path) + #add new tag in list of all used tags + r_serv_tags.sadd('list_tags', positive_t) + + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + + + + if positive_t in list_tags: + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + else: + r_serv_metadata.sadd('tag:'+path, negative_t) + r_serv_tags.sadd(negative_t, path) + #add new tag in list of all used tags + r_serv_tags.sadd('list_tags', negative_t)''' + + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + +@Tags.route("/Tags/thumbs_down_paste") +def thumbs_down_paste(): + + #TODO verify input + path = request.args.get('paste') + + '''list_tags = r_serv_metadata.smembers('tag:'+path)''' + + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + + +@Tags.route("/Tags/taxonomies") +def taxonomies(): + + active_taxonomies = r_serv_tags.smembers('active_taxonomies') + + taxonomies = Taxonomies() + list_taxonomies = list(taxonomies.keys()) + + id = [] + name = [] + description = [] + version = [] + enabled = [] + n_tags = [] + + for taxonomie in list_taxonomies: + id.append(taxonomie) + name.append(taxonomies.get(taxonomie).name) + description.append(taxonomies.get(taxonomie).description) + version.append(taxonomies.get(taxonomie).version) + if taxonomie in active_taxonomies: + enabled.append(True) + else: + enabled.append(False) + + n = str(r_serv_tags.scard('active_tag_' + taxonomie)) + n_tags.append(n + '/' + str(len(taxonomies.get(taxonomie).machinetags())) ) + + return render_template("taxonomies.html", + id=id, + all_name = name, + description = description, + version = version, + enabled = enabled, + n_tags=n_tags) + #return 'O' + +@Tags.route("/Tags/edit_taxonomie") +def edit_taxonomie(): + + taxonomies = Taxonomies() + list_taxonomies = list(taxonomies.keys()) + + id = request.args.get('taxonomie') + + #verify input + if id in list(taxonomies.keys()): + active_tag = r_serv_tags.smembers('active_tag_' + id) + list_tag = taxonomies.get(id).machinetags() + list_tag_desc = taxonomies.get(id).machinetags_expanded() + + active_taxonomies = r_serv_tags.smembers('active_taxonomies') + if id in active_taxonomies: + active = True + else: + active = False + + name = taxonomies.get(id).name + description = taxonomies.get(id).description + version = taxonomies.get(id).version + + status = [] + for tag in list_tag: + if tag in active_tag: + status.append(True) + else: + status.append(False) + + return render_template("edit_taxonomie.html", + id=id, + name=name, + description = description, + version = version, + active=active, + all_tags = list_tag, + list_tag_desc=list_tag_desc, + status = status) + + else: + return 'INVALID TAXONOMIE' + +@Tags.route("/Tags/test") +def test(): + return 'test', + +@Tags.route("/Tags/disable_taxonomie") +def disable_taxonomie(): + + taxonomies = Taxonomies() + list_taxonomies = list(taxonomies.keys()) + + id = request.args.get('taxonomie') + + if id in list_taxonomies: + r_serv_tags.srem('active_taxonomies', id) + for tag in taxonomies.get(id).machinetags(): + r_serv_tags.srem('active_tag_' + id, tag) + + return redirect(url_for('Tags.taxonomies')) + + else: + return "INCORRECT INPUT" + + + +@Tags.route("/Tags/active_taxonomie") +def active_taxonomie(): + + taxonomies = Taxonomies() + list_taxonomies = list(taxonomies.keys()) + + id = request.args.get('taxonomie') + + # verify input + if id in list_taxonomies: + r_serv_tags.sadd('active_taxonomies', id) + for tag in taxonomies.get(id).machinetags(): + r_serv_tags.sadd('active_tag_' + id, tag) + + return redirect(url_for('Tags.taxonomies')) + + else: + return "INCORRECT INPUT" + +@Tags.route("/Tags/edit_taxonomie_tag") +def edit_taxonomie_tag(): + + taxonomies = Taxonomies() + list_taxonomies = list(taxonomies.keys()) + + arg1 = request.args.getlist('tag_enabled') + arg2 = request.args.getlist('tag_disabled') + + id = request.args.get('taxonomie') + + #verify input + if id in list_taxonomies: + list_tag = taxonomies.get(id).machinetags() + + #check tags validity + if ( all(elem in list_tag for elem in arg1) or (len(arg1) == 0) ) and ( all(elem in list_tag for elem in arg2) or (len(arg2) == 0) ): + + active_tag = r_serv_tags.smembers('active_tag_' + id) + + diff = list(set(arg1) ^ set(list_tag)) + + #remove tags + for tag in diff: + r_serv_tags.srem('active_tag_' + id, tag) + + #all tags unchecked + if len(arg1) == 0 and len(arg2) == 0: + r_serv_tags.srem('active_taxonomies', id) + + #add new tags + for tag in arg2: + r_serv_tags.sadd('active_taxonomies', id) + r_serv_tags.sadd('active_tag_' + id, tag) + + return redirect(url_for('Tags.taxonomies')) + else: + return "INCORRECT INPUT" + + else: + return "INCORRECT INPUT" + + # ========= REGISTRATION ========= app.register_blueprint(Tags) diff --git a/var/www/modules/Tags/templates/Tags.html b/var/www/modules/Tags/templates/Tags.html index cb476749..be02a0bc 100644 --- a/var/www/modules/Tags/templates/Tags.html +++ b/var/www/modules/Tags/templates/Tags.html @@ -34,28 +34,32 @@
    -
    - +
    -
    -
    +
    + [Taxonomies list] +
    +
    + + diff --git a/var/www/modules/Tags/templates/edit_taxonomie.html b/var/www/modules/Tags/templates/edit_taxonomie.html new file mode 100644 index 00000000..becaef6c --- /dev/null +++ b/var/www/modules/Tags/templates/edit_taxonomie.html @@ -0,0 +1,171 @@ + + + + + + + + Analysis Information Leak framework Dashboard + + + + + + + + + + + + + + + + + + + {% include 'navbar.html' %} + +
    + + + +
    +
    {{ name }} + {% if active %} + Enabled + {% endif %} + {% if not active %} + Disabled + {% endif %} +
    +
    + {{ description }} +

    + Version: {{ version }} + {% if active %} + + Disable Taxonomie + + {% endif %} + {% if not active %} + + Enable Taxonomie + + {% endif %} +
    +
    + +
    + + + + + + + + + + + + + + + {% for tag in all_tags %} + + + + + + + {% endfor %} + + +
    TagDescriptionEnabled
    + {% if status[loop.index0] %} +
    Enabled
    + + {% endif %} + {% if not status[loop.index0] %} +
    Disabled
    + + {% endif %} +
    {{ tag }}{{ list_tag_desc[loop.index0] }} + {% if status[loop.index0] %} +
    Enabled
    +
    + {% endif %} + {% if not status[loop.index0] %} +
    Disabled
    +
    + {% endif %} +
    + + +
    + +
    + +
    + +
    + + + + + + + + + + diff --git a/var/www/modules/Tags/templates/tagged.html b/var/www/modules/Tags/templates/tagged.html index 6102be28..28e7a28e 100644 --- a/var/www/modules/Tags/templates/tagged.html +++ b/var/www/modules/Tags/templates/tagged.html @@ -70,19 +70,17 @@ -
    - +
    -
    -
    + + + + + + + + + + {% for tag in list_tags %} - {{ tag }} + {{ tag[0] }} @@ -52,9 +112,9 @@ {% endfor %} - @@ -85,12 +145,12 @@ - + + + + + + + + + + + + + + + diff --git a/var/www/modules/Tags/templates/galaxies.html b/var/www/modules/Tags/templates/galaxies.html new file mode 100644 index 00000000..68a0ee82 --- /dev/null +++ b/var/www/modules/Tags/templates/galaxies.html @@ -0,0 +1,121 @@ + + + + + + + + Analysis Information Leak framework Dashboard + + + + + + + + + + + + + + + + + + + {% include 'navbar.html' %} + +
    +
    +
    +

    Galaxies

    +
    + +
    + + + + + + + + + + + + + + + + {% for type in all_type %} + + + + + + + + + {% endfor %} + + +
    NameDescriptionNamespaceVersionEnabledActive Tags
    + {{ name[loop.index0] }} +
    + +
    +
    {{ description[loop.index0] }}{{ namespace[loop.index0] }}{{ version[loop.index0] }} + {% if enabled[loop.index0] %} +
    Enabled
    +
    + {% endif %} + {% if not enabled[loop.index0] %} +
    Disabled
    +
    + {% endif %} +
    +
    {{ n_tags[loop.index0] }}
    + Active Tags {{ n_tags[loop.index0] }} +
    + +
    + + + + + + + + From dbe67e094befdba41029877b0de96540d4897bb7 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Tue, 29 May 2018 17:17:02 +0200 Subject: [PATCH 07/22] galaxies synonyms --- var/www/modules/Tags/Flask_Tags.py | 234 +++++++++++++----- var/www/modules/Tags/templates/Tags.html | 28 ++- .../modules/Tags/templates/edit_galaxy.html | 14 +- .../Tags/templates/edit_taxonomie.html | 21 +- var/www/modules/Tags/templates/tagged.html | 33 ++- .../browsepastes/Flask_browsepastes.py | 2 - .../templates/important_paste_by_module.html | 4 +- var/www/modules/search/Flask_search.py | 2 - var/www/modules/search/templates/search.html | 4 +- var/www/modules/showpaste/Flask_showpaste.py | 6 +- .../showpaste/templates/show_saved_paste.html | 87 +++++-- var/www/static/js/tags.js | 4 +- 12 files changed, 313 insertions(+), 126 deletions(-) diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index c975a928..5d1a4b14 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -58,7 +58,18 @@ def get_all_tags(): list_tags = [] for tag in all_tags: - list_tags.append( tag ) + t = tag.split(':')[0] + # add synonym + str_synonyms = ' - synonyms: ' + if t == 'misp-galaxy': + synonyms = r_serv_tags.smembers('synonym_tag_' + tag) + for synonym in synonyms: + str_synonyms = str_synonyms + synonym + ', ' + # add real tag + if str_synonyms != ' - synonyms: ': + list_tags.append({'name':tag + str_synonyms,'id':tag}) + else: + list_tags.append({'name':tag,'id':tag}) return jsonify(list_tags) @@ -79,6 +90,28 @@ def get_all_tags_taxonomies(): return jsonify(list_tags) +@Tags.route("/Tags/get_all_tags_galaxies") +def get_all_tags_galaxy(): + + active_galaxies = r_serv_tags.smembers('active_galaxies') + + list_tags = [] + for galaxy in active_galaxies: + l_tags = r_serv_tags.smembers('active_tag_galaxies_' + galaxy) + for tag in l_tags: + str_synonyms = ' - synonyms: ' + synonyms = r_serv_tags.smembers('synonym_tag_' + tag) + # synonyms to display + for synonym in synonyms: + str_synonyms = str_synonyms + synonym + ', ' + # add real tag + if str_synonyms != ' - synonyms: ': + list_tags.append({'name':tag + str_synonyms,'id':tag}) + else: + list_tags.append({'name':tag,'id':tag}) + + return jsonify(list_tags) + @Tags.route("/Tags/get_tags_taxonomie") def get_tags_taxonomie(): @@ -102,10 +135,38 @@ def get_tags_taxonomie(): return jsonify(list_tags) else: - return 'this taxinomie is disable' + return 'this taxonomie is disable' else: return 'INCORRECT INPUT' +@Tags.route("/Tags/get_tags_galaxy") +def get_tags_galaxy(): + + galaxy = request.args.get('galaxy') + + active_galaxies = r_serv_tags.smembers('active_galaxies') + + #verify input + if galaxy in active_galaxies: + + list_tags = [] + l_tags = r_serv_tags.smembers('active_tag_galaxies_' + galaxy) + for tag in l_tags: + synonyms = r_serv_tags.smembers('synonym_tag_' + tag) + str_synonyms = ' - synonyms: ' + for synonym in synonyms: + str_synonyms = str_synonyms + synonym + ', ' + # add real tag + if str_synonyms != ' - synonyms: ': + list_tags.append({'name':tag + str_synonyms,'id':tag}) + else: + list_tags.append({'name':tag,'id':tag}) + + return jsonify(list_tags) + + else: + return 'this galaxy is disable' + @Tags.route("/Tags/get_tagged_paste") def get_tagged_paste(): @@ -140,7 +201,6 @@ def get_tagged_paste(): bootstrap_label.append('danger') bootstrap_label.append('warning') bootstrap_label.append('info') - bootstrap_label.append('dark') all_content = [] paste_date = [] @@ -209,6 +269,9 @@ def remove_tag(): r_serv_metadata.srem('tag:'+path, tag) r_serv_tags.srem(tag, path) + if r_serv_tags.scard(tag) == 0: + r_serv_tags.srem('list_tags', tag) + return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) @Tags.route("/Tags/confirm_tag") @@ -239,80 +302,60 @@ def confirm_tag(): def addTags(): tags = request.args.get('tags') + tagsgalaxies = request.args.get('tagsgalaxies') path = request.args.get('path') list_tag = tags.split(',') + list_tag_galaxies = tagsgalaxies.split(',') taxonomies = Taxonomies() active_taxonomies = r_serv_tags.smembers('active_taxonomies') + active_galaxies = r_serv_tags.smembers('active_galaxies') + if not path: - return 'INCORRECT INPUT' + return 'INCORRECT INPUT0' - for tag in list_tag: - # verify input - tax = tag.split(':')[0] - if tax in active_taxonomies: - if tag in r_serv_tags.smembers('active_tag_' + tax): + if list_tag != ['']: + for tag in list_tag: + # verify input + tax = tag.split(':')[0] + if tax in active_taxonomies: + if tag in r_serv_tags.smembers('active_tag_' + tax): - #add tag - r_serv_metadata.sadd('tag:'+path, tag) - r_serv_tags.sadd(tag, path) - #add new tag in list of all used tags - r_serv_tags.sadd('list_tags', tag) + #add tag + r_serv_metadata.sadd('tag:'+path, tag) + r_serv_tags.sadd(tag, path) + #add new tag in list of all used tags + r_serv_tags.sadd('list_tags', tag) + else: + return 'INCORRECT INPUT1' else: - return 'INCORRECT INPUT' - else: - return 'INCORRECT INPUT' + return 'INCORRECT INPUT2' - return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) + if list_tag_galaxies != ['']: + for tag in list_tag_galaxies: + # verify input + gal = tag.split(':')[1] + gal = gal.split('=')[0] + print(tag) + print(gal) + print(active_galaxies) + if gal in active_galaxies: + if tag in r_serv_tags.smembers('active_tag_galaxies_' + gal): -@Tags.route("/Tags/thumbs_up_paste") -def thumbs_up_paste(): + print('adding ...') + #add tag + r_serv_metadata.sadd('tag:'+path, tag) + r_serv_tags.sadd(tag, path) + #add new tag in list of all used tags + r_serv_tags.sadd('list_tags', tag) - #TODO verify input - path = request.args.get('paste') - - '''positive_t = 'infoleak:confirmed="true-positive"' - positive_f = 'infoleak:confirmed="false-positive"' - - negative_t = 'infoleak:confirmed="true-negative"' - - list_tags = r_serv_metadata.smembers('tag:'+path) - - if(list_tags > 0): - - if positive_f in list_tags: - r_serv_metadata.srem('tag:'+path, positive_f) - r_serv_metadata.sadd('tag:'+path, positive_t) - - r_serv_tags.srem(positive_f, path) - r_serv_tags.sadd(positive_t, path) - #add new tag in list of all used tags - r_serv_tags.sadd('list_tags', positive_t) - - return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) - - - - if positive_t in list_tags: - return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) - else: - r_serv_metadata.sadd('tag:'+path, negative_t) - r_serv_tags.sadd(negative_t, path) - #add new tag in list of all used tags - r_serv_tags.sadd('list_tags', negative_t)''' - - return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) - -@Tags.route("/Tags/thumbs_down_paste") -def thumbs_down_paste(): - - #TODO verify input - path = request.args.get('paste') - - '''list_tags = r_serv_metadata.smembers('tag:'+path)''' + else: + return 'INCORRECT INPUT3' + else: + return 'INCORRECT INPUT4' return redirect(url_for('showsavedpastes.showsavedpaste', paste=path)) @@ -397,10 +440,6 @@ def edit_taxonomie(): else: return 'INVALID TAXONOMIE' -@Tags.route("/Tags/test") -def test(): - return 'test', - @Tags.route("/Tags/disable_taxonomie") def disable_taxonomie(): @@ -615,6 +654,32 @@ def active_galaxy(): for tag in l_tags: r_serv_tags.sadd('active_tag_galaxies_' + id, 'misp-galaxy:{}="{}"'.format(id, tag)) + #save synonyms + for clusters_json in list_clusters: + + #get clusters + cluster = json.loads(clusters_json) + + if cluster['type'] == id: + + val = cluster['values'] + + tags = [] + for data in val: + try: + meta = data['meta'] + synonyms = meta['synonyms'] + tag_name = data['value'] + tag_name = 'misp-galaxy:{}="{}"'.format(id, tag_name) + #save synonyms + for synonym in synonyms: + r_serv_tags.sadd('synonym_tag_' + tag_name, synonym) + + except KeyError: + pass + + break + return redirect(url_for('Tags.galaxies')) @@ -631,7 +696,9 @@ def disable_galaxy(): r_serv_tags.srem('active_galaxies', id) for tag in l_tags: - r_serv_tags.srem('active_tag_galaxies_' + id, 'misp-galaxy:{}="{}"'.format(id, tag)) + tag_name = 'misp-galaxy:{}="{}"'.format(id, tag) + r_serv_tags.srem('active_tag_galaxies_' + id, tag_name) + r_serv_tags.delete('synonym_tag_' + tag_name) return redirect(url_for('Tags.galaxies')) @@ -666,6 +733,7 @@ def edit_galaxy_tag(): #remove tags for tag in diff: r_serv_tags.srem('active_tag_galaxies_' + id, tag) + r_serv_tags.delete('synonym_tag_' + tag) #all tags unchecked if len(arg1) == 0 and len(arg2) == 0: @@ -676,10 +744,42 @@ def edit_galaxy_tag(): r_serv_tags.sadd('active_galaxies', id) r_serv_tags.sadd('active_tag_galaxies_' + id, tag) + #get tags synonyms + for clusters_json in list_clusters: + + #get clusters + cluster = json.loads(clusters_json) + + if cluster['type'] == id: + + val = cluster['values'] + + tags = [] + for data in val: + try: + meta = data['meta'] + synonyms = meta['synonyms'] + tag_name = data['value'] + tag_name = 'misp-galaxy:{}="{}"'.format(id, tag_name) + if tag_name in arg2: + #save synonyms + for synonym in synonyms: + r_serv_tags.sadd('synonym_tag_' + tag_name, synonym) + + except KeyError: + pass + break + return redirect(url_for('Tags.galaxies')) else: return "INCORRECT INPUT" +@Tags.route("/Tags/test") +def test(): + + return render_template("test.html", + id = '1') + # ========= REGISTRATION ========= app.register_blueprint(Tags) diff --git a/var/www/modules/Tags/templates/Tags.html b/var/www/modules/Tags/templates/Tags.html index be02a0bc..003cc4e2 100644 --- a/var/www/modules/Tags/templates/Tags.html +++ b/var/www/modules/Tags/templates/Tags.html @@ -38,20 +38,31 @@
    -
    -
    - [Taxonomies list] +

    + + +

    + Edit Taxonomies List +
    + + +

    + Edit Galaxies List +
    @@ -79,9 +90,12 @@ diff --git a/var/www/modules/Tags/templates/edit_galaxy.html b/var/www/modules/Tags/templates/edit_galaxy.html index d0e8a282..5469327c 100644 --- a/var/www/modules/Tags/templates/edit_galaxy.html +++ b/var/www/modules/Tags/templates/edit_galaxy.html @@ -127,7 +127,7 @@
    - @@ -142,13 +142,14 @@ diff --git a/var/www/modules/Tags/templates/edit_taxonomie.html b/var/www/modules/Tags/templates/edit_taxonomie.html index becaef6c..576a7f7c 100644 --- a/var/www/modules/Tags/templates/edit_taxonomie.html +++ b/var/www/modules/Tags/templates/edit_taxonomie.html @@ -127,7 +127,7 @@
    - @@ -142,20 +142,14 @@ diff --git a/var/www/modules/Tags/templates/tagged.html b/var/www/modules/Tags/templates/tagged.html index 28e7a28e..99cc365c 100644 --- a/var/www/modules/Tags/templates/tagged.html +++ b/var/www/modules/Tags/templates/tagged.html @@ -74,17 +74,18 @@
    -
    - + @@ -105,7 +106,7 @@
    {% for tag in paste_tags[loop.index0] %} - {{ tag[0] }} + {{ tag[0] }} {% endfor %}
    @@ -129,7 +130,19 @@
    - [Taxonomies list] +
    +

    + + +

    + Edit Taxonomies List +
    + + +

    + Edit Galaxies List +
    +
    @@ -186,6 +199,10 @@ $(document).ready(function(){ var data = ltags.getValue(); window.location.replace("{{ url_for('Tags.get_tagged_paste') }}?ltags=" + data); } + function emptyTags() { + console.log('b'); + ltags.clear(); + } diff --git a/var/www/modules/browsepastes/Flask_browsepastes.py b/var/www/modules/browsepastes/Flask_browsepastes.py index 474a0d35..d5f098b9 100644 --- a/var/www/modules/browsepastes/Flask_browsepastes.py +++ b/var/www/modules/browsepastes/Flask_browsepastes.py @@ -64,7 +64,6 @@ def event_stream_getImportantPasteByModule(module_name, year): bootstrap_label.append('danger') bootstrap_label.append('warning') bootstrap_label.append('info') - bootstrap_label.append('dark') for path in all_pastes_list: index += 1 @@ -135,7 +134,6 @@ def importantPasteByModule(): bootstrap_label.append('danger') bootstrap_label.append('warning') bootstrap_label.append('info') - bootstrap_label.append('dark') for path in allPastes[0:10]: all_path.append(path) diff --git a/var/www/modules/browsepastes/templates/important_paste_by_module.html b/var/www/modules/browsepastes/templates/important_paste_by_module.html index d35f5174..41923391 100644 --- a/var/www/modules/browsepastes/templates/important_paste_by_module.html +++ b/var/www/modules/browsepastes/templates/important_paste_by_module.html @@ -16,7 +16,7 @@
    {% for tag in paste_tags[loop.index0] %} - {{ tag[0] }} + {{ tag[0] }} {% endfor %}
    @@ -101,7 +101,7 @@ function add_entries_X(to_add) { for(j=0; j" - + "" + feed.l_tags[j][0] + "" + ""; + + "" + feed.l_tags[j][0] + "" + ""; } search_table.row.add( [ feed.index, diff --git a/var/www/modules/search/Flask_search.py b/var/www/modules/search/Flask_search.py index 9e62f7cf..82040d17 100644 --- a/var/www/modules/search/Flask_search.py +++ b/var/www/modules/search/Flask_search.py @@ -164,7 +164,6 @@ def search(): bootstrap_label.append('danger') bootstrap_label.append('warning') bootstrap_label.append('info') - bootstrap_label.append('dark') index_min = 1 index_max = len(get_index_list()) @@ -205,7 +204,6 @@ def get_more_search_result(): bootstrap_label.append('danger') bootstrap_label.append('warning') bootstrap_label.append('info') - bootstrap_label.append('dark') schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT) diff --git a/var/www/modules/search/templates/search.html b/var/www/modules/search/templates/search.html index cc9f2885..bed826dd 100644 --- a/var/www/modules/search/templates/search.html +++ b/var/www/modules/search/templates/search.html @@ -101,7 +101,7 @@
    {% for tag in paste_tags[loop.index0] %} - {{ tag[0] }} + {{ tag[0] }} {% endfor %}
    @@ -200,7 +200,7 @@ var curr_preview = data.preview_array[i].replace(/\"/g, "\'"); var tag = "" for(j=0; j" + data.list_tags[j] + "" + tag = tag + "" + data.list_tags[j] + "" } search_table.row.add( [ init_num_of_elements_in_table+((offset))+i+1, diff --git a/var/www/modules/showpaste/Flask_showpaste.py b/var/www/modules/showpaste/Flask_showpaste.py index a3efdd4b..a728ce7e 100644 --- a/var/www/modules/showpaste/Flask_showpaste.py +++ b/var/www/modules/showpaste/Flask_showpaste.py @@ -104,13 +104,15 @@ def showpaste(content_range): bootstrap_label.append('danger') bootstrap_label.append('warning') bootstrap_label.append('info') - bootstrap_label.append('dark') #active taxonomies active_taxonomies = r_serv_tags.smembers('active_taxonomies') l_tags = r_serv_metadata.smembers('tag:'+requested_path) + #active galaxies + active_galaxies = r_serv_tags.smembers('active_galaxies') + list_tags = [] for tag in l_tags: @@ -119,7 +121,7 @@ def showpaste(content_range): else: list_tags.append( (tag, False) ) - return render_template("show_saved_paste.html", date=p_date, bootstrap_label=bootstrap_label, active_taxonomies=active_taxonomies, list_tags=list_tags, source=p_source, encoding=p_encoding, language=p_language, size=p_size, mime=p_mime, lineinfo=p_lineinfo, content=p_content, initsize=len(p_content), duplicate_list = p_duplicate_list, simil_list = p_simil_list, hashtype_list = p_hashtype_list, date_list=p_date_list) + return render_template("show_saved_paste.html", date=p_date, bootstrap_label=bootstrap_label, active_taxonomies=active_taxonomies, active_galaxies=active_galaxies, list_tags=list_tags, source=p_source, encoding=p_encoding, language=p_language, size=p_size, mime=p_mime, lineinfo=p_lineinfo, content=p_content, initsize=len(p_content), duplicate_list = p_duplicate_list, simil_list = p_simil_list, hashtype_list = p_hashtype_list, date_list=p_date_list) # ============ ROUTES ============ diff --git a/var/www/modules/showpaste/templates/show_saved_paste.html b/var/www/modules/showpaste/templates/show_saved_paste.html index ee6f0dcb..75d57b96 100644 --- a/var/www/modules/showpaste/templates/show_saved_paste.html +++ b/var/www/modules/showpaste/templates/show_saved_paste.html @@ -49,26 +49,51 @@
    - - - - - -
    {% if duplicate_list|length == 0 %} @@ -191,6 +210,7 @@ + + + diff --git a/var/www/static/js/tags.js b/var/www/static/js/tags.js index 65d9255e..47b84061 100644 --- a/var/www/static/js/tags.js +++ b/var/www/static/js/tags.js @@ -99,7 +99,7 @@ * Defaults to 'Type or click here' or just 'Click here' if not editable. */ emptyText: function() { - return cfg.editable ? '' : ''; + return cfg.editable ? 'Select Tags' : ''; }, /** @@ -122,7 +122,7 @@ * Defaults to false. */ expandOnFocus: function() { - return cfg.editable ? false : true; + return cfg.editable ? true : true; }, /** From 8a87b7b0828532ce13b0e16540305eafe1364aa9 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Wed, 30 May 2018 16:18:58 +0200 Subject: [PATCH 08/22] galaxy tag info + fix --- var/www/Flask_server.py | 6 + var/www/modules/Tags/Flask_Tags.py | 100 +++++++++++++-- var/www/modules/Tags/templates/Tags.html | 2 + .../modules/Tags/templates/edit_galaxy.html | 6 +- .../Tags/templates/edit_taxonomie.html | 2 + .../Tags/templates/tag_galaxy_info.html | 116 ++++++++++++++++++ var/www/modules/Tags/templates/tagged.html | 13 +- 7 files changed, 229 insertions(+), 16 deletions(-) create mode 100644 var/www/modules/Tags/templates/tag_galaxy_info.html diff --git a/var/www/Flask_server.py b/var/www/Flask_server.py index 9fafcd69..a03999ab 100755 --- a/var/www/Flask_server.py +++ b/var/www/Flask_server.py @@ -123,10 +123,16 @@ r_serv_tags = redis.StrictRedis( decode_responses=True) # add default ail taxonomies r_serv_tags.sadd('active_taxonomies', 'infoleak') +r_serv_tags.sadd('active_taxonomies', 'gdpr') +r_serv_tags.sadd('active_taxonomies', 'fpf') # add default tags taxonomies = Taxonomies() for tag in taxonomies.get('infoleak').machinetags(): r_serv_tags.sadd('active_tag_infoleak', tag) +for tag in taxonomies.get('gdpr').machinetags(): + r_serv_tags.sadd('active_tag_infoleak', tag) +for tag in taxonomies.get('fpf').machinetags(): + r_serv_tags.sadd('active_tag_infoleak', tag) # ============ MAIN ============ diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index 5d1a4b14..030060ee 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -41,6 +41,11 @@ list_clusters = [] for c in clusters.values(): list_clusters.append(c.to_json()) +# tags numbers in galaxies +total_tags = {} +for name, tags in clusters.items(): #galaxie name + tags + total_tags[name] = len(tags) + # ============ FUNCTIONS ============ def one(): return 1 @@ -174,6 +179,9 @@ def get_tagged_paste(): tags = request.args.get('ltags') list_tags = tags.split(',') + list_tag = [] + for tag in list_tags: + list_tag.append(tag.replace('"','\"')) # TODO verify input @@ -249,6 +257,7 @@ def get_tagged_paste(): year=currentSelectYear, all_path=all_path, tags=tags, + list_tag = list_tag, paste_tags=paste_tags, bootstrap_label=bootstrap_label, content=all_content, @@ -339,13 +348,10 @@ def addTags(): # verify input gal = tag.split(':')[1] gal = gal.split('=')[0] - print(tag) - print(gal) - print(active_galaxies) + if gal in active_galaxies: if tag in r_serv_tags.smembers('active_tag_galaxies_' + gal): - print('adding ...') #add tag r_serv_metadata.sadd('tag:'+path, tag) r_serv_tags.sadd(tag, path) @@ -416,6 +422,9 @@ def edit_taxonomie(): else: active = False + n = str(r_serv_tags.scard('active_tag_' + id)) + badge = n + '/' + str(len(taxonomies.get(id).machinetags())) + name = taxonomies.get(id).name description = taxonomies.get(id).description version = taxonomies.get(id).version @@ -430,6 +439,7 @@ def edit_taxonomie(): return render_template("edit_taxonomie.html", id=id, name=name, + badge = badge, description = description, version = version, active=active, @@ -526,10 +536,6 @@ def galaxies(): active_galaxies = r_serv_tags.smembers('active_galaxies') - total_tags = {} - for name, tags in clusters.items(): #galaxie name + tags - total_tags[name] = len(tags) - name = [] icon = [] version = [] @@ -588,6 +594,9 @@ def edit_galaxy(): type = id active_tag = r_serv_tags.smembers('active_tag_galaxies_' + type) + n = str(r_serv_tags.scard('active_tag_galaxies_' + type)) + badge = n + '/' + str(total_tags[type]) + name = cluster['name'] description = cluster['description'] version = cluster['version'] @@ -629,6 +638,7 @@ def edit_galaxy(): return render_template("edit_galaxy.html", id = type, name = name, + badge = badge, description = description, version = version, active = active, @@ -775,11 +785,77 @@ def edit_galaxy_tag(): else: return "INCORRECT INPUT" -@Tags.route("/Tags/test") -def test(): +@Tags.route("/Tags/tag_galaxy_info") +def tag_galaxy_info(): - return render_template("test.html", - id = '1') + galaxy = request.args.get('galaxy') + tag = request.args.get('tag') + + full_tag = tag + title = tag.split(':')[1] + tag = tag.split('=')[1] + tag = tag[1:-1] + + #get clusters + for clusters_json in list_clusters: + cluster = json.loads(clusters_json) + + if cluster['type'] == galaxy: + val = cluster['values'] + source = cluster['source'] + + for data in val: + if tag == data['value']: + try: + description = data['description'] + except KeyError: + description = '' + if r_serv_tags.sismember('active_tag_galaxies_' + galaxy, full_tag): + active = True + else: + active = False + + synonyms = [] + metadata = [] + try: + meta = data['meta'] + list_metadata = [] + for key in meta: + if key != 'synonyms': + if type(meta[key]) is list: + for item in meta[key]: + list_metadata.append(key + ' : ' + item) + else: + list_metadata.append(key + ' : ' + meta[key]) + try: + synonyms = meta['synonyms'] + bool_synonyms = True + except KeyError: + synonyms = [] + bool_synonyms = False + except KeyError: + pass + + if synonyms: + bool_synonyms = True + else: + bool_synonyms = False + if list_metadata: + metadata = True + else: + metadata = False + + return render_template("tag_galaxy_info.html", + title = title, + description = description, + source = source, + active = active, + synonyms = synonyms, + bool_synonyms = bool_synonyms, + metadata = metadata, + list_metadata = list_metadata) + + return 'INVALID INPUT' # ========= REGISTRATION ========= app.register_blueprint(Tags) diff --git a/var/www/modules/Tags/templates/Tags.html b/var/www/modules/Tags/templates/Tags.html index 003cc4e2..8c9fad2a 100644 --- a/var/www/modules/Tags/templates/Tags.html +++ b/var/www/modules/Tags/templates/Tags.html @@ -72,6 +72,8 @@ + + + + + + + + + + + {% include 'navbar.html' %} + +
    + + + +
    +
    {{ title }} + {% if active %} + Enabled + {% endif %} + {% if not active %} + Disabled + {% endif %} +
    +
    + {{ description }} +

    + Source: {{ source }} + {% if metadata %} +
    +
    Metadata : +
      + {% for meta in list_metadata %} +
    • {{ meta }}
    • + {% endfor %} +
    +
    +
    + {% endif %} + {% if bool_synonyms %} +

    +
      +
    • synonyms :
    • + {% for synonym in synonyms %} +
    • {{ synonym }}
    • + {% endfor %} +
    + {% endif %} +
    +
    + + +
    + + + + + + + + diff --git a/var/www/modules/Tags/templates/tagged.html b/var/www/modules/Tags/templates/tagged.html index 99cc365c..1fe47c4f 100644 --- a/var/www/modules/Tags/templates/tagged.html +++ b/var/www/modules/Tags/templates/tagged.html @@ -178,17 +178,25 @@ $(document).ready(function(){ $.getJSON('/Tags/get_all_tags', function(data) { + activePage = "page-Tags" + $("#"+activePage).addClass("active"); + //var valueData = ["infoleak:automatic-detection=\"bitcoin-address\"","infoleak:automatic-detection=\"aws-key\"",'misp-galaxy:botnet="Marina Botnet"']; + var valueData = [ + {% for tag in list_tag %} + '{{tag|safe}}', + {% endfor %} + ]; ltags = $('#ltags').tagSuggest({ data: data, - //value: ["infoleak:automatic-detection=\"bitcoin-address\"","infoleak:automatic-detection=\"aws-key\""], + value: valueData, sortOrder: 'name', maxDropHeight: 200, name: 'ltags', }); //ltags.setValue(["{{ tags }}"]); - ltags.setValue(["infoleak:automatic-detection='bitcoin-address'","infoleak:automatic-detection='aws-key'"]); + //ltags.setValue([{id:"infoleak:automatic-detection='bitcoin-address'",name:"infoleak:automatic-detection='bitcoin-address'"}}]); }); }); @@ -200,7 +208,6 @@ $(document).ready(function(){ window.location.replace("{{ url_for('Tags.get_tagged_paste') }}?ltags=" + data); } function emptyTags() { - console.log('b'); ltags.clear(); } From 93dcdf4f23a62fccc919bd70c2ed7c3b59ca7ccf Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 09:01:47 +0200 Subject: [PATCH 09/22] fix duplicate --- bin/packages/Paste.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/packages/Paste.py b/bin/packages/Paste.py index ccaf3400..317743f4 100755 --- a/bin/packages/Paste.py +++ b/bin/packages/Paste.py @@ -340,7 +340,7 @@ class Paste(object): Save a new duplicate on others pastes """ for hash_type, path, percent, date in list_value: - to_add = [hash_type, self.p_path, percent, date] + to_add = (hash_type, self.p_path, percent, date) self.store_duplicate.sadd('dup:'+path,to_add) def _get_from_redis(self, r_serv): From 5c50de45deacb0c45b7e2712e2f7aaa7e1dffeac Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 10:07:23 +0200 Subject: [PATCH 10/22] add taxonomies and galaxies update and install --- installing_deps.sh | 5 +++++ var/www/modules/Tags/Flask_Tags.py | 1 + var/www/update_thirdparty.sh | 12 +++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/installing_deps.sh b/installing_deps.sh index 246fd2b2..bad6a9ce 100755 --- a/installing_deps.sh +++ b/installing_deps.sh @@ -95,6 +95,11 @@ mkdir -p $AIL_HOME/{PASTES,Blooms,dumps} pip3 install -U pip pip3 install -U -r pip3_packages_requirement.txt +#MISP PyTaxonomies +pip3 install -U git+https://github.com/MISP/PyTaxonomies +#MISP PyMISPGalaxies +pip3 install -U git+https://github.com/MISP/PyMISPGalaxies + # Pyfaup pushd faup/src/lib/bindings/python/ python3 setup.py install diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index 030060ee..98a809af 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -553,6 +553,7 @@ def galaxies(): icon.append(galaxie['icon']) version.append(galaxie['version']) type = galaxie['type'] + # FIXME remove this if type == 'mitre-pre-attack-relashipship': type = 'mitre-pre-attack-relationship' all_type.append(type) diff --git a/var/www/update_thirdparty.sh b/var/www/update_thirdparty.sh index c0208bed..7e99ebed 100755 --- a/var/www/update_thirdparty.sh +++ b/var/www/update_thirdparty.sh @@ -5,23 +5,27 @@ set -e wget http://dygraphs.com/dygraph-combined.js -O ./static/js/dygraph-combined.js SBADMIN_VERSION='3.3.7' +FONT_AWESOME_VERSION='4.7.0' rm -rf temp mkdir temp wget https://github.com/BlackrockDigital/startbootstrap-sb-admin/archive/v${SBADMIN_VERSION}.zip -O temp/${SBADMIN_VERSION}.zip wget https://github.com/BlackrockDigital/startbootstrap-sb-admin-2/archive/v${SBADMIN_VERSION}.zip -O temp/${SBADMIN_VERSION}-2.zip +wget https://github.com/FortAwesome/Font-Awesome/archive/v${FONT_AWESOME_VERSION}.zip -O temp/FONT_AWESOME_${FONT_AWESOME_VERSION}.zip unzip temp/${SBADMIN_VERSION}.zip -d temp/ unzip temp/${SBADMIN_VERSION}-2.zip -d temp/ +unzip temp/FONT_AWESOME_${FONT_AWESOME_VERSION}.zip -d temp/ mv temp/startbootstrap-sb-admin-${SBADMIN_VERSION} temp/sb-admin mv temp/startbootstrap-sb-admin-2-${SBADMIN_VERSION} temp/sb-admin-2 +mv temp/Font-Awesome-${FONT_AWESOME_VERSION} temp/font-awesome rm -rf ./static/js/plugins mv temp/sb-admin/js/* ./static/js/ rm -rf ./static/fonts/ ./static/font-awesome/ mv temp/sb-admin/fonts/ ./static/ -mv temp/sb-admin/font-awesome/ ./static/ +mv temp/font-awesome/ ./static/ rm -rf ./static/css/plugins/ mv temp/sb-admin/css/* ./static/css/ @@ -60,3 +64,9 @@ mkdir -p ./static/image pushd static/image wget https://www.circl.lu/assets/images/logos/AIL.png -O AIL.png popd + +#active virtualenv +. ./../../AILENV/bin/activate +#Update MISP Taxonomies and Galaxies +pip3 install --upgrade git+https://github.com/MISP/PyTaxonomies +pip3 install --upgrade git+https://github.com/MISP/PyMISPGalaxies From 884d655b0c9f83e3d71f255ca1250c98426e418d Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 13:53:29 +0200 Subject: [PATCH 11/22] taxonomies and galaxies update via LAUNCH --- bin/LAUNCH.sh | 13 ++++++++++++- installing_deps.sh | 15 ++++----------- var/www/modules/Tags/Flask_Tags.py | 8 +++----- var/www/update_thirdparty.sh | 6 +++--- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/bin/LAUNCH.sh b/bin/LAUNCH.sh index e6c12366..5a8764da 100755 --- a/bin/LAUNCH.sh +++ b/bin/LAUNCH.sh @@ -232,7 +232,7 @@ islogged=`screen -ls | egrep '[0-9]+.Logging_AIL' | cut -d. -f1` isqueued=`screen -ls | egrep '[0-9]+.Queue_AIL' | cut -d. -f1` isscripted=`screen -ls | egrep '[0-9]+.Script_AIL' | cut -d. -f1` -options=("Redis" "Ardb" "Logs" "Queues" "Scripts" "Killall" "Shutdown" "Update-config") +options=("Redis" "Ardb" "Logs" "Queues" "Scripts" "Killall" "Shutdown" "Update-config" "Update-thirdparty") menu() { echo "What do you want to Launch?:" @@ -332,6 +332,17 @@ for i in ${!options[@]}; do echo -e $GREEN"\t* Configuration up-to-date"$DEFAULT fi ;; + Update-thirdparty) + echo -e "\t* Updating thirdparty..." + bash -c "(cd ../var/www && ./update_thirdparty.sh)" + exitStatus=$? + if [ $exitStatus -ge 1 ]; then + echo -e $RED"\t* Configuration not up-to-date"$DEFAULT + exit + else + echo -e $GREEN"\t* Configuration up-to-date"$DEFAULT + fi + ;; esac fi done diff --git a/installing_deps.sh b/installing_deps.sh index bad6a9ce..d55fc7e3 100755 --- a/installing_deps.sh +++ b/installing_deps.sh @@ -70,10 +70,6 @@ if [ ! -f bin/packages/config.cfg ]; then cp bin/packages/config.cfg.sample bin/packages/config.cfg fi -pushd var/www/ -sudo ./update_thirdparty.sh -popd - if [ -z "$VIRTUAL_ENV" ]; then virtualenv -p python3 AILENV @@ -88,6 +84,10 @@ if [ -z "$VIRTUAL_ENV" ]; then fi +pushd var/www/ +./update_thirdparty.sh +popd + year1=20`date +%y` year2=20`date --date='-1 year' +%y` mkdir -p $AIL_HOME/{PASTES,Blooms,dumps} @@ -95,11 +95,6 @@ mkdir -p $AIL_HOME/{PASTES,Blooms,dumps} pip3 install -U pip pip3 install -U -r pip3_packages_requirement.txt -#MISP PyTaxonomies -pip3 install -U git+https://github.com/MISP/PyTaxonomies -#MISP PyMISPGalaxies -pip3 install -U git+https://github.com/MISP/PyMISPGalaxies - # Pyfaup pushd faup/src/lib/bindings/python/ python3 setup.py install @@ -107,8 +102,6 @@ popd # Py tlsh pushd tlsh/py_ext -#python setup.py build -#python setup.py install python3 setup.py build python3 setup.py install diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index 98a809af..01183b5a 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -8,6 +8,7 @@ import redis from flask import Flask, render_template, jsonify, request, Blueprint, redirect, url_for import json +from datetime import datetime import Paste @@ -200,8 +201,8 @@ def get_tagged_paste(): else : return 'INCORRECT INPUT' - #currentSelectYear = int(datetime.now().year) - currentSelectYear = 2018 + #TODO FIXME + currentSelectYear = int(datetime.now().year) bootstrap_label = [] bootstrap_label.append('primary') @@ -553,9 +554,6 @@ def galaxies(): icon.append(galaxie['icon']) version.append(galaxie['version']) type = galaxie['type'] - # FIXME remove this - if type == 'mitre-pre-attack-relashipship': - type = 'mitre-pre-attack-relationship' all_type.append(type) namespace.append(galaxie['namespace']) description.append(galaxie['description']) diff --git a/var/www/update_thirdparty.sh b/var/www/update_thirdparty.sh index 7e99ebed..8f032651 100755 --- a/var/www/update_thirdparty.sh +++ b/var/www/update_thirdparty.sh @@ -66,7 +66,7 @@ wget https://www.circl.lu/assets/images/logos/AIL.png -O AIL.png popd #active virtualenv -. ./../../AILENV/bin/activate +source ./../../AILENV/bin/activate #Update MISP Taxonomies and Galaxies -pip3 install --upgrade git+https://github.com/MISP/PyTaxonomies -pip3 install --upgrade git+https://github.com/MISP/PyMISPGalaxies +python3 -m pip install git+https://github.com/MISP/PyTaxonomies +python3 -m pip install --upgrade git+https://github.com/MISP/PyMISPGalaxies From cc31b42957f3796fd0a8b72391fb378ba59ef67d Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 14:04:03 +0200 Subject: [PATCH 12/22] fix install --- installing_deps.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/installing_deps.sh b/installing_deps.sh index d55fc7e3..3afbfe96 100755 --- a/installing_deps.sh +++ b/installing_deps.sh @@ -5,11 +5,11 @@ set -x sudo apt-get update -sudo apt-get install python3-pip python-virtualenv python3-dev libfreetype6-dev \ +sudo apt-get install python3-pip python-virtualenv python3-dev python3-setuptools libfreetype6-dev \ screen g++ python-tk unzip libsnappy-dev cmake -y #optional tor install -sudo apt-get install tor +sudo apt-get install tor -y #Needed for bloom filters sudo apt-get install libssl-dev libfreetype6-dev python-numpy -y From 3730b7fdb96ece3194ebf294069f4783634f9b49 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 14:35:15 +0200 Subject: [PATCH 13/22] fix install --- installing_deps.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/installing_deps.sh b/installing_deps.sh index 3afbfe96..b9231b9c 100755 --- a/installing_deps.sh +++ b/installing_deps.sh @@ -27,7 +27,8 @@ sudo apt-get install libev-dev libgmp-dev -y sudo apt-get install graphviz -y #needed for mathplotlib -sudo easy_install -U distribute +sudo pip3 install setuptools +sudo python3 -m easy_install -U distribute # ssdeep sudo apt-get install libfuzzy-dev sudo apt-get install build-essential libffi-dev automake autoconf libtool -y From e36cc666cd351acb452820b438b775e69c75b800 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 14:38:06 +0200 Subject: [PATCH 14/22] fix install --- installing_deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installing_deps.sh b/installing_deps.sh index b9231b9c..2c67a6b3 100755 --- a/installing_deps.sh +++ b/installing_deps.sh @@ -5,7 +5,7 @@ set -x sudo apt-get update -sudo apt-get install python3-pip python-virtualenv python3-dev python3-setuptools libfreetype6-dev \ +sudo apt-get install python3-pip python-virtualenv python3-dev libfreetype6-dev \ screen g++ python-tk unzip libsnappy-dev cmake -y #optional tor install From 7f5596328f9d4824c2f8fee9eb18ac55d0004128 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 15:03:52 +0200 Subject: [PATCH 15/22] fix install --- installing_deps.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/installing_deps.sh b/installing_deps.sh index 2c67a6b3..0106d310 100755 --- a/installing_deps.sh +++ b/installing_deps.sh @@ -26,9 +26,6 @@ sudo apt-get install libev-dev libgmp-dev -y #Need for generate-data-flow graph sudo apt-get install graphviz -y -#needed for mathplotlib -sudo pip3 install setuptools -sudo python3 -m easy_install -U distribute # ssdeep sudo apt-get install libfuzzy-dev sudo apt-get install build-essential libffi-dev automake autoconf libtool -y From cd6734f70430024bf02fc3494f361a8d4be6297f Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 15:35:20 +0200 Subject: [PATCH 16/22] fix install --- installing_deps.sh | 8 ++++---- var/www/modules/Tags/Flask_Tags.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/installing_deps.sh b/installing_deps.sh index 0106d310..6bb73f6b 100755 --- a/installing_deps.sh +++ b/installing_deps.sh @@ -26,8 +26,11 @@ sudo apt-get install libev-dev libgmp-dev -y #Need for generate-data-flow graph sudo apt-get install graphviz -y +# install nosetests +sudo pip install nose -y + # ssdeep -sudo apt-get install libfuzzy-dev +sudo apt-get install libfuzzy-dev -y sudo apt-get install build-essential libffi-dev automake autoconf libtool -y # REDIS # @@ -108,8 +111,5 @@ HOME=$(pwd) python3 -m textblob.download_corpora python3 -m nltk.downloader vader_lexicon python3 -m nltk.downloader punkt -# install nosetests -sudo pip install nose - #Create the file all_module and update the graph in doc $AIL_HOME/doc/generate_modules_data_flow_graph.sh diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index 01183b5a..701f7c46 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -816,9 +816,9 @@ def tag_galaxy_info(): synonyms = [] metadata = [] + list_metadata = [] try: meta = data['meta'] - list_metadata = [] for key in meta: if key != 'synonyms': if type(meta[key]) is list: From aa8e49d7a0856dfd2597ced04826afd6cd7bba3d Mon Sep 17 00:00:00 2001 From: Terrtia Date: Thu, 31 May 2018 15:53:47 +0200 Subject: [PATCH 17/22] add screenshots --- doc/screenshots/galaxies_list.png | Bin 0 -> 100571 bytes doc/screenshots/galaxy_tag_edit.png | Bin 0 -> 130525 bytes doc/screenshots/paste_tags_edit.png | Bin 0 -> 22277 bytes doc/screenshots/tag_delete_confirm.png | Bin 0 -> 12123 bytes doc/screenshots/tags.png | Bin 0 -> 18768 bytes doc/screenshots/tags_search.png | Bin 0 -> 12263 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/screenshots/galaxies_list.png create mode 100644 doc/screenshots/galaxy_tag_edit.png create mode 100644 doc/screenshots/paste_tags_edit.png create mode 100644 doc/screenshots/tag_delete_confirm.png create mode 100644 doc/screenshots/tags.png create mode 100644 doc/screenshots/tags_search.png diff --git a/doc/screenshots/galaxies_list.png b/doc/screenshots/galaxies_list.png new file mode 100644 index 0000000000000000000000000000000000000000..31ae76d831ac0926e596febb2d3f11feeebce5c3 GIT binary patch literal 100571 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 Z37Lw%VhW;n?)f>Uf{Y5V_~n}q{|8O8vQ+>8 literal 0 HcmV?d00001 diff --git a/doc/screenshots/galaxy_tag_edit.png b/doc/screenshots/galaxy_tag_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..93806873d88d10e825988fe505df7b7066e7f16b GIT binary patch literal 130525 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 z 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 O1A5v<_o_4#{dGC1l7MksMM$x+F(p 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 RmjJ<2SJna5zI^@ezW^THytV)U literal 0 HcmV?d00001 diff --git a/doc/screenshots/tags.png b/doc/screenshots/tags.png new file mode 100644 index 0000000000000000000000000000000000000000..11ce1812ada7dd2644467d5a330f7804258a570b GIT binary patch literal 18768 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

    )w)JXOoB>NMvjh? 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 Date: Thu, 31 May 2018 16:09:46 +0200 Subject: [PATCH 18/22] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index b977c185..74426e4d 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Features * Detect Amazon AWS and Google API keys * Detect Bitcoin address and Bitcoin private keys * Detect private keys and certificate +* Tagging system with [MISP Galaxy](https://github.com/MISP/misp-galaxy) and [MISP Taxonomies](https://github.com/MISP/misp-taxonomies) tags Installation ------------ @@ -144,6 +145,11 @@ Browsing ![Browse-Pastes](./doc/screenshots/browse-important.png?raw=true "AIL framework browseImportantPastes") +Tagging system +-------- + +![Tags](./doc/screenshots/tags.png?raw=true "AIL framework tags") + Sentiment analysis ------------------ From 6287981668f0ccfd46b5503e3f3a25c1961802fb Mon Sep 17 00:00:00 2001 From: Terrtia Date: Fri, 1 Jun 2018 09:49:26 +0200 Subject: [PATCH 19/22] clean --- bin/LAUNCH.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/LAUNCH.sh b/bin/LAUNCH.sh index 5a8764da..ed05f676 100755 --- a/bin/LAUNCH.sh +++ b/bin/LAUNCH.sh @@ -144,8 +144,6 @@ function launching_scripts { sleep 0.1 screen -S "Script_AIL" -X screen -t "Base64" bash -c './Base64.py; read x' sleep 0.1 - screen -S "Script_AIL" -X screen -t "DbDump" bash -c './DbDump.py; read x' - sleep 0.1 screen -S "Script_AIL" -X screen -t "Bitcoin" bash -c './Bitcoin.py; read x' sleep 0.1 screen -S "Script_AIL" -X screen -t "Phone" bash -c './Phone.py; read x' From 2b310d436790d99ba45d6e1d91b054ae800667f1 Mon Sep 17 00:00:00 2001 From: Terrtia Date: Fri, 1 Jun 2018 11:26:45 +0200 Subject: [PATCH 20/22] clean --- var/www/modules/Flask_config.py | 2 ++ var/www/modules/Tags/Flask_Tags.py | 8 +------- var/www/modules/Tags/templates/Tags.html | 2 -- var/www/modules/Tags/templates/galaxies.html | 1 - .../modules/Tags/templates/tag_galaxy_info.html | 3 --- var/www/modules/Tags/templates/tagged.html | 11 ----------- var/www/modules/Tags/templates/taxonomies.html | 8 -------- .../modules/browsepastes/Flask_browsepastes.py | 14 +------------- .../templates/important_paste_by_module.html | 1 - var/www/modules/search/Flask_search.py | 15 +-------------- var/www/modules/showpaste/Flask_showpaste.py | 9 +-------- .../showpaste/templates/show_saved_paste.html | 4 +--- var/www/update_thirdparty.sh | 2 +- 13 files changed, 8 insertions(+), 72 deletions(-) diff --git a/var/www/modules/Flask_config.py b/var/www/modules/Flask_config.py index 41745f21..26edccfa 100644 --- a/var/www/modules/Flask_config.py +++ b/var/www/modules/Flask_config.py @@ -82,3 +82,5 @@ max_preview_char = int(cfg.get("Flask", "max_preview_char")) # Maximum number of max_preview_modal = int(cfg.get("Flask", "max_preview_modal")) # Maximum number of character to display in the modal DiffMaxLineLength = int(cfg.get("Flask", "DiffMaxLineLength"))#Use to display the estimated percentage instead of a raw value + +bootstrap_label = ['primary', 'success', 'danger', 'warning', 'info'] diff --git a/var/www/modules/Tags/Flask_Tags.py b/var/www/modules/Tags/Flask_Tags.py index 701f7c46..95560ad6 100644 --- a/var/www/modules/Tags/Flask_Tags.py +++ b/var/www/modules/Tags/Flask_Tags.py @@ -24,6 +24,7 @@ r_serv_tags = Flask_config.r_serv_tags r_serv_metadata = Flask_config.r_serv_metadata max_preview_char = Flask_config.max_preview_char max_preview_modal = Flask_config.max_preview_modal +bootstrap_label = Flask_config.bootstrap_label Tags = Blueprint('Tags', __name__, template_folder='templates') @@ -204,13 +205,6 @@ def get_tagged_paste(): #TODO FIXME currentSelectYear = int(datetime.now().year) - bootstrap_label = [] - bootstrap_label.append('primary') - bootstrap_label.append('success') - bootstrap_label.append('danger') - bootstrap_label.append('warning') - bootstrap_label.append('info') - all_content = [] paste_date = [] paste_linenum = [] diff --git a/var/www/modules/Tags/templates/Tags.html b/var/www/modules/Tags/templates/Tags.html index 8c9fad2a..f3cf1a44 100644 --- a/var/www/modules/Tags/templates/Tags.html +++ b/var/www/modules/Tags/templates/Tags.html @@ -77,8 +77,6 @@ $.getJSON('/Tags/get_all_tags', function(data) { - //console.log(data) - //for(var i=0;i $(document).ready(function(){ - //search_table = $('#myTable_').DataTable({ "order": [[ 2, "desc" ]] }); - $('#myTable_').DataTable( { "aLengthMenu": [[5, 10, 15, 20, -1], [5, 10, 15, 20, "All"]], "iDisplayLength": 15, - //"order": [[ 1, "asc" ]] } ); diff --git a/var/www/modules/Tags/templates/tagged.html b/var/www/modules/Tags/templates/tagged.html index 1fe47c4f..284323fd 100644 --- a/var/www/modules/Tags/templates/tagged.html +++ b/var/www/modules/Tags/templates/tagged.html @@ -159,7 +159,6 @@ $(document).ready(function(){ search_table = $('#myTable_').DataTable({ "order": [[ 2, "desc" ]] }); $('[data-toggle="tooltip"]').tooltip(); $("[data-toggle='modal']").off('click.openmodal').on("click.openmodal", function (event) { - //get_html_and_update_modal(event); get_html_and_update_modal(event, $(this)); }); @@ -169,18 +168,10 @@ $(document).ready(function(){ $("#nbr_entry").hide(); $("#loading_gif_browse").hide(); - /*$('#myTable_').DataTable( - { - "aLengthMenu": [[5, 10, 25, -1], [5, 10, 25, "All"]], - "iDisplayLength": 10 - } - );*/ - $.getJSON('/Tags/get_all_tags', function(data) { activePage = "page-Tags" $("#"+activePage).addClass("active"); - //var valueData = ["infoleak:automatic-detection=\"bitcoin-address\"","infoleak:automatic-detection=\"aws-key\"",'misp-galaxy:botnet="Marina Botnet"']; var valueData = [ {% for tag in list_tag %} '{{tag|safe}}', @@ -195,8 +186,6 @@ $(document).ready(function(){ name: 'ltags', }); - //ltags.setValue(["{{ tags }}"]); - //ltags.setValue([{id:"infoleak:automatic-detection='bitcoin-address'",name:"infoleak:automatic-detection='bitcoin-address'"}}]); }); }); diff --git a/var/www/modules/Tags/templates/taxonomies.html b/var/www/modules/Tags/templates/taxonomies.html index 6ac9a3e6..74feda6f 100644 --- a/var/www/modules/Tags/templates/taxonomies.html +++ b/var/www/modules/Tags/templates/taxonomies.html @@ -97,19 +97,11 @@