# from dotenv import load_dotenv import secrets import socket import uuid from logging.config import dictConfig from pprint import pprint from urllib.parse import urlparse from flask import Flask, flash, redirect, render_template, request, session, url_for from markupsafe import escape # from io import StringIO from validators import domain, email, ipv4, ipv6, url from constants import * from host_lookup import abuseipdb, metadata, spf_dmarc, virustotal_api_test from upload import csv_parse # import csv dictConfig(LOGCONF) # put this in a .flaskenv file: https://dev.to/kubona_my/dealing-with-environment-variables-in-flask-o1 app = Flask(__name__) generate_secret = secrets.token_urlsafe(16) app.secret_key = generate_secret # app.debug = True class Info(object): def __init__(self, host): self.host = host self.ip_address = None self.host_type = metadata.check(self.host) self.metadata = metadata.lookup(self.host) self.emailsec = () self.vt = {} self.abuseipdb = {} def lookup(host): result = Info(host) if result.host_type == DOMAIN: result.ip_address = socket.gethostbyname(host) result.emailsec = spf_dmarc.lookup(host) result.vt = virustotal_api_test.analyse(result.host, result.host_type) result.abuseipdb = abuseipdb.analyse(result.ip_address) print("[DEBUGGING]") pprint(result.emailsec) elif result.host_type == URL: result.domain = urlparse(host).netloc result.ip_address = socket.gethostbyname(result.domain) result.vt = virustotal_api_test.analyse(result.host, result.host_type) result.abuseipdb = abuseipdb.analyse(result.ip_address) elif result.host_type == IPV4 or IPV6: result.vt = virustotal_api_test.analyse(result.host, result.host_type) result.abuseipdb = abuseipdb.analyse(host) return result @app.route("/") def index(): # logging example taken from https://betterstack.com/community/guides/logging/how-to-start-logging-with-flask/ session["ctx"] = {"request_id": str(uuid.uuid4())} app.logger.info("A user visited the home page >>> %s", session["ctx"]) return redirect(url_for("lookup")) # refactor to handle form requests better: https://www.digitalocean.com/community/tutorials/how-to-use-web-forms-in-a-flask-application @app.route("/lookup", methods=["GET", "POST"]) def lookup(): host = "" host = escape(request.form.get("host")) session["ctx"] = {"request_id": str(uuid.uuid4())} # figure out how to start a session, maybe with a variable? # variable = session.get('something') if request.method == "GET": return render_template("lookup_options.html") elif request.method == "POST" and "host" in request.form: host = "" host = escape(request.form.get("host")) session["ctx"] = {"request_id": str(uuid.uuid4())} app.logger.info( "A user submitted a host to look up. | host: %s >>> %s", host, session["ctx"], ) if not host: flash("Try again", "error") return render_template("lookup_options.html") elif host: result = Info.lookup(host) return render_template( "lookup_options.html", host=result.host, host_type=result.host_type, result=result, ) elif request.method == "POST" and "file" in request.files: file = request.files["file"] extracted = csv_parse.extract(file) results = [] for host in extracted: results.append(Info.lookup(host)) print(results) return render_template("lookup_options.html") else: flash("No file!", "error") return render_template("lookup_options.html") if __name__ == "__main__": app.run(debug=True)