예제 #1
0
def test_db_connection():
    connection_success = Connection(dbhost=DBHOST,
                                    dbport=DBPORT,
                                    database=DATABASE,
                                    dbuser=DBUSER,
                                    dbpassword=DBPASSWORD,
                                    create_tables=False).get_connection()
    connection_wrong = Connection(dbhost='localhost',
                                  dbport=3306,
                                  database='xyz',
                                  dbuser='******',
                                  dbpassword='******',
                                  create_tables=False).get_connection()
    assert connection_success is not None, "The request was not successful. Check credentials, database existence, etc"
    assert connection_wrong is None, f"Connection with wrong credentials must be 'None'"
예제 #2
0
class Miamala:

    ctx = user.quick_login("admin", "admin")
    meseji = sms.get_sms(ctx, 1, 1, qty=10, unread_preferred=True)
    data = Connection()

    def save_miamala(self):
        """miamala ilio ingia kwenye account"""
        for ujumbe in self.meseji['response']['Messages']['Message']:
            if "HaloPesa" in ujumbe["Phone"]:
                muamala = ujumbe['Content'].split(' ')
                if "Transaction" and "received" in muamala:
                    try:
                        self.Transaction_id = muamala[2]
                        amount = muamala[muamala.index("received") + 1]
                        phone = muamala[muamala.index('number') + 1]
                        sender = muamala[muamala.index('from') +
                                         1] + " " + muamala[
                                             muamala.index('from') + 2]
                        time = muamala[muamala.index('time') + 2]
                        date = muamala[muamala.index('time') + 1]
                        query = f"""INSERT INTO watu.miamla (transaction_id,amout,phone,sender,time,date)
                               values ({self.Transaction_id},{amount},{phone},{sender},{time},{date}) """
                    except Exception as e:
                        logging.INFO("Error in muamala")
                        pass
                    finally:
                        self.data.run_query(query)

    def watu_details(self):
        """get information of people"""
        query = "SELECT * FROM watu.people"
        watu = self.data.run_query(query)
        return jsonify(watu)
예제 #3
0
    def append(s, clients):

        # Insert to table all clients in list
        for key in clients:

            # Get robot by anchor
            r = s.db.query(Robot)\
                            .join('container')\
                            .filter(Robot.anchor==key)\
                            .first()

            if not r:
                # robot doesn't exist - skip
                s.log.critical('Robot {0} does NOT exist'.format(key))
                continue

            # Create connection row
            c = Connection(since=clients[key]['Connected Since'],
                           vaddress=clients[key]['Virtual Address'],
                           raddress=clients[key]['Real Address'],
                           sent=int(clients[key]['Bytes Sent']),
                           received=int(clients[key]['Bytes Received']),
                           container=r.container.id,
                           node=s.nodeid)

            # Add new item to session
            s.log.info('Append new connection: {0} -> {1}'.format(
                c.raddress, c.vaddress))
            s.db.add(c)
            s.db_changed = True
예제 #4
0
def get_member_ranking(username):
    conn = Connection()
    member = conn.query_sql("SELECT * FROM members where username = '******'")
    ranked = sorted([(x[0], x[1], find_in_pi(x[2]))
                     for x in conn.get_pi_members()],
                    key=lambda tup: tup[2])
    if member:
        return str(
            ranked.index((member[0], member[1], find_in_pi(member[2]))) +
            1) + "°: " + member[
                1] + ", respectiva posição nos dígitos de π: " + str(
                    member[2]) + "\n"
    else:
        generate_member_ranking(username)
        member = conn.query_sql("SELECT * FROM members where username = '******'")
        ranked = sorted([(x[0], x[1], find_in_pi(x[2]))
                         for x in conn.get_pi_members()],
                        key=lambda tup: tup[2])
        return str(
            ranked.index((member[0], member[1], find_in_pi(member[2]))) +
            1) + "°: " + member[
                1] + ", respectiva posição nos dígitos de π: " + str(
                    member[2]) + "\n"
예제 #5
0
    def __init__(self, fb_token=None, fb_id=None, tinder_token=None):
        if tinder_token:
            self._api = TinderApi(tinder_token=tinder_token)
        else:
            self._facebook_data = FacebookTools(access_token=fb_token,
                                                fb_id=fb_id)
            self._api = TinderApi(self._facebook_data.access_token,
                                  self._facebook_data.facebook_id)

        self._db = Connection(Config.DB_IP, Config.DB_PORT)
예제 #6
0
def get_daily_ranking():
    conn = Connection()
    msg = ''
    ranked = sorted([(x[0], x[1], find_in_pi(x[2]))
                     for x in conn.get_pi_members()],
                    key=lambda tup: tup[2])
    for rank in ranked:
        msg += str(ranked.index(rank) + 1) + "°: " + rank[
            1] + ", respectiva posição nos dígitos de π: " + str(
                rank[2]) + "\n"
    return msg
예제 #7
0
    def __init__(self):
        self.API_TOKEN = os.environ["SECRET"]
        self.contatinhosSheet = "http://bit.ly/contatosbcc021"
        self.githubRepo = "https://github.com/lineuzinho-icmc/lineuzinho"
        self.usefulLinks = "Estamos adicionando todo mundo aos poucos. Se puder ajudar a achar o pessoal, passa o link do grupo na descrição!\n\nInscrição na semana de recepção: calouros.icmc.usp.br/\n\nGuia do Bixo: https://bit.ly/3c9mcUG\n\nContatinho de geral: {0}\n\nEnquetes: https://t.me/joinchat/qrJ_MrnHDbE1ZmNh\n\n".format(
            self.contatinhosSheet)
        self.docsChannel = "https://t.me/docs21"

        self.greeter = Greeter()
        self.forwarder = Forwarder()
        self.beaner = Beaner()

        self.conn = Connection()
        self.last_pi_call = time.time()
예제 #8
0
 def save(self, author, tipo, genre):
     try:
         connection = Connection().get_connection()
         cursor = connection.cursor()
         insert = """INSERT INTO music (name, author, genre) values ('{0}', '{1}', '{2}');""".format(
             author, tipo, genre)
         cursor.execute(insert)
         connection.commit()
     except (Exception, psycopg2.DatabaseError) as error:
         print("Error", error)
     finally:
         if connection:
             cursor.close()
             connection.close()
예제 #9
0
def new_connection(uid, classId, webhookUrl, db):
    webhookId, webhookToken = clean_webhook_url(webhookUrl)

    regId, time = Classroom.from_uid(uid, db).register(classId)

    con = Connection(
        uid=uid,
        classId=classId,
        webhookId=webhookId,
        webhookToken=webhookToken,
        registration=regId,
        expire=parsetime(time),
    )
    db.add(con)
예제 #10
0
 def get_posts_from_db(self):
     try:
         from db import Connection
     except ImportError as error:
         logging.info(error)
     with Connection() as conn:
         try:
             dtypes = {}
             self.posts = pd.read_sql("SELECT * FROM posts",
                                      conn,
                                      parse_dates=['timestamp'])
             self.posts = self.posts.convert_dtypes()
             logging.info("Retrieved posts from database")
         except Exception as e:
             logging.error(e + "Please ensure container is up and running.")
예제 #11
0
def generate_member_ranking(username):
    conn = Connection()
    #Verify if user is already in db
    if [i for i, v in enumerate(conn.get_members()) if v[1] == username]:
        num = str(randint(0, 1000))
        while find_in_pi(num) == -1:
            num = str(randint(0, 1000))

        conn.execute_sql("UPDATE members SET pi_rank = " + str(num) +
                         " WHERE username = '******'")
    else:
        num = str(randint(0, 1000))
        while find_in_pi(num) == -1:
            num = str(randint(0, 1000))
        conn.execute_sql("INSERT INTO members (username, pi_rank) VALUES ('" +
                         username + "', " + num + ");")
    def put_session(self, session):
        ipinfo = get_ip_info(session["ip"])
        asn = None
        block = None
        country = None

        if ipinfo:
            asn_obj = self.get_asn(ipinfo["asn"])
            asn = ipinfo["asn"]
            block = ipinfo["ipblock"]
            country = ipinfo["country"]

        # Calculate "hash"
        connhash = ""
        for line in session["text_in"].split("\n"):
            line = line.strip()
            linehash = abs(hash(line)) % 0xFFFF
            connhash += struct.pack("!H", linehash)
        connhash = connhash.encode("hex")

        backend_user = self.session.query(User).filter(
            User.username == session["backend_username"]).first()

        conn = Connection(ip=session["ip"],
                          user=session["user"],
                          date=session["date"],
                          password=session["pass"],
                          text_combined=session["text_combined"],
                          asn_id=asn,
                          ipblock=block,
                          country=country,
                          connhash=connhash,
                          backend_user_id=backend_user.id)

        self.session.add(conn)
        self.session.flush()

        req_urls = []

        for url in session["urls"]:
            db_url = self.db.get_url(url).fetchone()
            url_id = 0

            if db_url == None:
                url_ip, url_info = get_url_info(url)
                url_asn = None
                url_country = None

                if url_info:
                    asn_obj_url = self.get_asn(url_info["asn"])
                    url_asn = url_info["asn"]
                    url_country = url_info["country"]

                url_id = self.db.put_url(url, session["date"], url_ip, url_asn,
                                         url_country)
                req_urls.append(url)

            elif db_url["sample"] == None:
                req_urls.append(url)
                url_id = db_url["id"]

            else:
                # Sample exists already
                # TODO: Check url for oldness
                url_id = db_url["id"]

            self.db.link_conn_url(conn.id, url_id)

        # Find previous connections
        # A connection is associated when:
        #  - same honeypot/user
        #  - connection happened as long as 120s before
        #  - same client ip OR same username/password combo
        assoc_timediff = 120
        previous_conns = (self.session.query(Connection).filter(
            Connection.date > (conn.date - assoc_timediff),
            or_(
                and_(Connection.user == conn.user,
                     Connection.password == conn.password),
                Connection.ip == conn.ip),
            Connection.backend_user_id == conn.backend_user_id,
            Connection.id != conn.id).all())

        for prev in previous_conns:
            conn.conns_before.append(prev)

        # Check connection against all tags
        tags = self.session.query(Tag).all()
        conn = self.session.query(Connection).filter(
            Connection.id == conn.id).first()
        for tag in tags:
            json_obj = conn.json(depth=0)
            json_obj["text_combined"] = filter_ascii(json_obj["text_combined"])
            if simple_eval(tag.code, names=json_obj) == True:
                self.db.link_conn_tag(conn.id, tag.id)

        return req_urls
예제 #13
0
 async def _get_crypto_token(self):
     async with Connection() as connect:
         return await connect.fetch(
             '''SELECT *
             FROM crypto_token
             WHERE email='$1' ''', self.email)
예제 #14
0
import csv
from bson.objectid import ObjectId
from datetime import date
from db import Connection


def find(arr, key, value):

    for item in arr:
        if item[key] == value:
            return item


lists = []
con = Connection()
lists_cusror = con.find_lists({})

for list in lists_cusror:
    lists.append(list)

current_date = date.today().strftime('%Y-%m-%d')
to_read = find(lists, 'name', 'To Read')['name']
read = find(lists, 'name', 'Read')['name']
reading = find(lists, 'name', 'Currently Reading')['name']
books = []

print(to_read_id)
print(read_id)
print(reading_id)

with open('/Users/abhishek/Downloads/goodreads_library_export.csv',
    def put_session(self, session):
        ipinfo = None
        asn = None
        block = None
        country = None

        if self.do_ip_to_asn_resolution:
            ipinfo = get_ip_info(session["ip"])
            if ipinfo:
                asn_obj = self.get_asn(ipinfo["asn"])
                asn = ipinfo["asn"]
                block = ipinfo["ipblock"]
                country = ipinfo["country"]

        report = {}
        if self.vt != None:
            if self.web.get_ip_report(session["ip"]) == None:
                report = self.vt.query_ip_reports(session["ip"])
                ipReport = IpReport(ip=session["ip"],
                                    report=json.dumps(report))
                self.session.add(ipReport)

        # Calculate "hash"
        connhash = ""
        for event in session["stream"]:
            if event["in"]:
                line = event["data"]
                line = ''.join(char for char in line
                               if ord(char) < 128 and ord(char) > 32)
                if line != "":
                    linehash = abs(hash(line)) % 0xFFFF
                    connhash += struct.pack("!H", linehash)
        connhash = connhash.encode("hex")

        backend_user = self.session.query(User).filter(
            User.username == session["backend_username"]).first()

        conn = Connection(ip=session["ip"],
                          user=session["user"],
                          date=session["date"],
                          password=session["pass"],
                          stream=json.dumps(session["stream"]),
                          asn_id=asn,
                          ipblock=block,
                          country=country,
                          connhash=connhash,
                          backend_user_id=backend_user.id)

        self.session.add(conn)
        self.session.flush()

        req_urls = []
        set_urls = set(session["urls"])
        for url in set_urls:
            db_url = self.db.get_url(url).fetchone()
            url_id = 0

            report = ''
            parsed_uri = urlparse(url)
            domain = '{uri.netloc}'.format(uri=parsed_uri)
            if self.vt != None:
                report = self.vt.query_domain_reports(domain)
            domainReport = DomainReport(domain=domain,
                                        report=json.dumps(report))
            self.session.add(domainReport)

            if db_url == None:
                url_ip = None
                url_asn = None
                url_country = None

                if self.do_ip_to_asn_resolution:
                    url_ip, url_info = get_url_info(url)
                    if url_info:
                        asn_obj_url = self.get_asn(url_info["asn"])
                        url_asn = url_info["asn"]
                        url_country = url_info["country"]

                url_id = self.db.put_url(url, session["date"], url_ip, url_asn,
                                         url_country)
                req_urls.append(url)

            elif db_url["sample"] == None:
                req_urls.append(url)
                url_id = db_url["id"]

            else:
                # Sample exists already
                # TODO: Check url for oldness
                url_id = db_url["id"]

            self.db.link_conn_url(conn.id, url_id)

        # Find previous connections
        # A connection is associated when:
        #  - same honeypot/user
        #  - connection happened as long as 120s before
        #  - same client ip OR same username/password combo
        assoc_timediff = 120
        previous_conns = (self.session.query(Connection).filter(
            Connection.date > (conn.date - assoc_timediff),
            or_(
                and_(Connection.user == conn.user,
                     Connection.password == conn.password),
                Connection.ip == conn.ip),
            Connection.backend_user_id == conn.backend_user_id,
            Connection.id != conn.id).all())

        for prev in previous_conns:
            conn.conns_before.append(prev)

        # Check connection against all tags
        tags = self.session.query(Tag).all()
        conn = self.session.query(Connection).filter(
            Connection.id == conn.id).first()
        for tag in tags:
            json_obj = conn.json(depth=0)
            json_obj["text_combined"] = filter_ascii(json_obj["text_combined"])
            if simple_eval(tag.code, names=json_obj) == True:
                self.db.link_conn_tag(conn.id, tag.id)

        return req_urls
예제 #16
0
#!//usr/bin/python3.6
import hashlib
import random
import requests
import json
import threading
from OpenSSL import SSL
from flask import *
from flask_cors import CORS
from db import Connection
from bs4 import BeautifulSoup
import urllib.request as urllib2
import re
from smmbget import get_level_info, check_valid_level, write_level_info, check_level_duplicate

c = Connection()
c.connect()
members = c.fetch("members")
if not members:
    c.create("members", {"username": None, "password": None, "salt": None, "admin": 0})

pepper = "efoijxewioufhaewprofwefz;dorfgjlakesdf;;yesIhitmyheadonmykeyboard"

app = Flask(__name__, template_folder='templates', static_folder='templates/static')
CORS(app)

def set_admin(username):
    c.connect()
    members = c.fetch("members")
    members.add({"admin":1}, {"username":username})    
    return True
예제 #17
0
    "channels": {
        "feed": 762952918848503859,
        "debug": 764641152682033172
    }
}]

CACHE = {}
LEVELER = None
FROZEN_USERS = []
IGNORE_ROLES = ["@everyone", "Muted"]

# load_dotenv()
# TOKEN = os.getenv('DISCORD_TOKEN')
TOKEN = os.environ["DISCORD_TOKEN"]

conn = Connection()
c = conn.cursor

routes = Routes(conn, c)


def is_moderator(ctx):
    mod_roles = CACHE[ctx.guild.id]["roles"]["Moderators"]
    admin_roles = CACHE[ctx.guild.id]["roles"]["Administrators"]
    valid_roles = mod_roles + admin_roles
    if any(r in ctx.author.roles for r in valid_roles):
        return True

    return False

예제 #18
0
    def put_session(self, session):
        ipinfo = None
        asn = None
        block = None
        country = None
        network_id = None

        if self.do_ip_to_asn_resolution:
            ipinfo = get_ip_info(session["ip"])
            if ipinfo:
                asn_obj = self.get_asn(ipinfo["asn"])
                asn = ipinfo["asn"]
                block = ipinfo["ipblock"]
                country = ipinfo["country"]

        # Calculate "hash"
        connhash = ""
        for event in session["stream"]:
            if event["in"]:
                line = event["data"]
                line = ''.join(char for char in line
                               if ord(char) < 128 and ord(char) > 32)
                if line != "":
                    linehash = abs(hash(line)) % 0xFFFF
                    connhash += struct.pack("!H", linehash)
        connhash = connhash.encode("hex")

        backend_user = self.session.query(User).filter(
            User.username == session["backend_username"]).first()

        conn = Connection(ip=session["ip"],
                          user=session["user"],
                          date=session["date"],
                          password=session["pass"],
                          stream=json.dumps(session["stream"]),
                          asn_id=asn,
                          ipblock=block,
                          country=country,
                          connhash=connhash,
                          backend_user_id=backend_user.id)

        self.session.add(conn)
        self.session.flush()  # to get id

        samples = []
        urls = []
        for sample_json in session["samples"]:
            sample, url = self.create_url_sample(sample_json)

            if network_id == None and sample.network_id != None:
                network_id = sample.network_id

            if network_id == None and url.network_id != None:
                network_id = url.network_id

            conn.urls.append(url)
            samples.append(sample)
            urls.append(url)

        # Find previous connections
        # A connection is associated when:
        #  - same honeypot/user
        #  - connection happened as long as 120s before
        #  - same client ip OR same username/password combo
        assoc_timediff = 120
        previous_conns = (self.session.query(Connection).filter(
            Connection.date > (conn.date - assoc_timediff),
            or_(
                and_(Connection.user == conn.user,
                     Connection.password == conn.password),
                Connection.ip == conn.ip),
            Connection.backend_user_id == conn.backend_user_id,
            Connection.id != conn.id).all())

        for prev in previous_conns:
            if network_id == None and prev.network_id != None:
                network_id = prev.network_id
            conn.conns_before.append(prev)

        # Check connection against all tags
        tags = self.session.query(Tag).all()
        for tag in tags:
            json_obj = conn.json(depth=0)
            json_obj["text_combined"] = filter_ascii(json_obj["text_combined"])
            if simple_eval(tag.code, names=json_obj) == True:
                self.db.link_conn_tag(conn.id, tag.id)

        # Only create new networks for connections with urls or associtaed conns,
        # to prevent the creation of thousands of networks
        # NOTE: only conns with network == NULL will get their network updated
        #       later so whe should only create a network where we cannot easily
        #       change it later
        if (len(conn.urls) > 0
                or len(previous_conns) > 0) and network_id == None:
            network_id = self.create_network().id

        # Update network on self
        conn.network_id = network_id

        # Update network on all added Urls
        for url in urls:
            if url.network_id == None:
                url.network_id = network_id

        # Update network on all added Samples
        for sample in samples:
            if sample.network_id == None:
                sample.network_id = network_id

        # Update network on all previous connections withut one
        if network_id != None:
            for prev in previous_conns:
                if prev.network_id == None:
                    prev.network_id = network_id

        self.session.flush()
        return []
예제 #19
0
파일: login.py 프로젝트: indicolite/toolkit
def main():

    the_date = (datetime.datetime.now() +
                datetime.timedelta(days=-1)).strftime("%Y-%m-%d")
    if len(sys.argv) > 1:
        the_date = sys.argv[1]

    log_file = "./login_%s.txt" % (the_date)

    insertSql = "insert into bd_action.login_action(q_date,q_time,q_ip,q_uid,q_login_type,q_dev_type,q_result_code,q_channel,q_dev_imei,q_dev_model,q_net,q_app_ver,q_sys_version,q_mobile,q_login_uid,q_third_type,q_third_id,q_opt_duration) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);"
    delSql = "delete from  bd_action.login_action where q_date='%s'" % (
        the_date)

    conn = Connection(using="bd")
    conn.execute(delSql)
    '''
    filePath = './big.txt'
    for chunk in read_in_chunks(filePath):
        print chunk
    '''

    params = []

    for line in open(log_file):
        log_str = line.strip()

        log = json.loads(line)
        param = log.get("q_req_param", "{}")

        req_data = None
        if isinstance(param.get("data", [{}])[0], dict) == False:
            req_data = json.loads(param.get("data", [{}])[0])
        else:
            req_data = param.get("data", [{}])[0]

        result = None
        if isinstance(log.get("q_opt_result"), dict) == False:
            result = json.loads(log.get("q_opt_result"))
        else:
            result = log.get("q_opt_result")

        result_data = result.get("data", {})

        if req_data.get("openid", "").find("Testyaliceshi") <> -1:
            continue
        if req_data.get("isTest", 0) == 1:
            continue
        q_time = log.get("q_opt_time", "0")
        if str(q_time).find(":") == -1:
            q_time = time.strftime(
                '%Y-%m-%d %H:%M:%S',
                time.localtime(string.atof(log.get("q_opt_time", "0")) / 1000))

        resultArr = [
            the_date, q_time,
            log.get("q_ip", "").split(",", -1)[0],
            log.get("q_uid", ""),
            log.get("q_action", ""),
            log.get("q_dev_type", ""),
            result.get("code", ""),
            log.get("q_channel", ""),
            log.get("q_dev_imei", ""),
            log.get("q_dev_model", ""),
            log.get("q_net", ""),
            log.get("q_app_ver", ""),
            log.get("q_sys_version", ""),
            req_data.get("mobile", ""),
            result_data.get("userId", ""),
            req_data.get("thirdType", ""),
            req_data.get("openid", ""),
            log.get("q_opt_duration", "0")
        ]
        params.append(resultArr)

        #conn.execute(insertSql,*tuple(resultArr))

    try:
        conn.executemany(insertSql, params)

    except Exception, e:
        print traceback.format_exc()
        print line
예제 #20
0
import threading
from water import Water
from communication import Communication
from db import Connection
from sensoren import Sensoren
import time
from apiMain import start

#com = Communication("RPI", "192.168.2.156

com = Communication("RPI", "0.0.0.0")
sensoren = Sensoren(pinRain=22, pinVent1=17, pinVent2=27)
water = Water(com, sensoren)

db = Connection(host="localhost",
                user="******",
                password="******",
                database="sensor_data")

t_com = threading.Thread(target=com.server)
t_sensoren = threading.Thread(target=sensoren.update_data)
t_water = threading.Thread(target=water.main)
t_api = threading.Thread(target=start)

if __name__ == '__main__':
    print("Starting")
    t_com.start()
    t_sensoren.start()
    t_water.start()
    t_api.start()

    while True:
예제 #21
0
 def open_spider(self, spider):
     self.conn = Connection(using="bd")
예제 #22
0
 async def _create_crypto_token(self):
     async with Connection() as connect:
         return await connect.execute(
             '''INSERT INTO crypto_token(email, private_key)
             VALUES('$1', '$2') ''', self.email, self.key)
예제 #23
0
def generate_daily_ranking():
    conn = Connection()
    for user in conn.get_usernames():
        generate_member_ranking(user)
예제 #24
0
 async def _update_key(self):
     async with Connection() as connect:
         return await connect.execute(
             '''UPDATE crypto_token
             SET private_key='$1'
             WHERE email='$2' ''', self.key, self.email)
    def put_session(self, session):

        connhash = self.calc_connhash(session["stream"]).encode("hex")

        backend_user = self.session.query(User).filter(
            User.username == session["backend_username"]).first()

        conn = Connection(ip=session["ip"],
                          user=session["user"],
                          date=session["date"],
                          password=session["pass"],
                          stream=json.dumps(session["stream"]),
                          connhash=connhash,
                          backend_user_id=backend_user.id)

        conn.user = filter_ascii(conn.user)
        conn.password = filter_ascii(conn.password)

        if self.do_ip_to_asn_resolution:
            range = self.get_ip_range(conn.ip)
            if range:
                conn.country = range.country
                conn.city = range.city
                conn.lat = range.latitude
                conn.lon = range.longitude
                conn.asn = range.asn

        self.session.add(conn)
        self.session.flush()  # to get id

        network_id = None

        samples = []
        urls = []
        for sample_json in session["samples"]:
            # Ignore junk - may clean up the db a bit
            if sample_json["length"] < 2000:
                continue

            sample, url = self.create_url_sample(sample_json)

            if sample:
                if network_id == None and sample.network_id != None:
                    network_id = sample.network_id
                samples.append(sample)

            if url:
                if network_id == None and url.network_id != None:
                    network_id = url.network_id
                conn.urls.append(url)
                urls.append(url)

        # Find previous connections
        # A connection is associated when:
        #  - same honeypot/user
        #  - connection happened as long as 120s before
        #  - same client ip OR same username/password combo
        assoc_timediff = 120
        assoc_timediff_sameip = 3600

        previous_conns = (self.session.query(Connection).filter(
            or_(
                and_(Connection.date > (conn.date - assoc_timediff),
                     Connection.user == conn.user,
                     Connection.password == conn.password),
                and_(Connection.date > (conn.date - assoc_timediff_sameip),
                     Connection.ip == conn.ip)),
            Connection.backend_user_id == conn.backend_user_id,
            Connection.id != conn.id).all())

        for prev in previous_conns:
            if network_id == None and prev.network_id != None:
                network_id = prev.network_id
            conn.conns_before.append(prev)

        # Check connection against all tags
        tags = self.session.query(Tag).all()
        for tag in tags:
            json_obj = conn.json(depth=0)
            json_obj["text_combined"] = filter_ascii(json_obj["text_combined"])
            if simple_eval(tag.code, names=json_obj) == True:
                self.db.link_conn_tag(conn.id, tag.id)

        # Only create new networks for connections with urls or associtaed conns,
        # to prevent the creation of thousands of networks
        # NOTE: only conns with network == NULL will get their network updated
        #       later so whe should only create a network where we cannot easily
        #       change it later
        haslogin = conn.user != None and conn.user != ""
        if (len(conn.urls) > 0 or
                len(previous_conns) > 0) and network_id == None and haslogin:
            print(" --- create network --- ")
            network_id = self.create_network().id

        # Update network on self
        conn.network_id = network_id

        # Update network on all added Urls
        for url in urls:
            if url.network_id == None:
                url.network_id = network_id

        # Update network on all added Samples
        for sample in samples:
            if sample.network_id == None:
                sample.network_id = network_id

        # Update network on all previous connections withut one
        if network_id != None:
            for prev in previous_conns:
                if prev.network_id == None:
                    prev.network_id = network_id

                    # Update number of first conns on network
                    if len(prev.conns_before) == 0:
                        conn.network.nb_firstconns += 1

        self.session.flush()

        # Check for Malware type
        # 	only if our network exists AND has no malware associated
        if conn.network != None and conn.network.malware == None:
            # Find connections with similar connhash
            similar_conns = (self.session.query(Connection).filter(
                func.length(Connection.connhash) == len(connhash)).all())

            min_sim = 2
            min_conn = None
            for similar in similar_conns:
                if similar.network_id != None:
                    c1 = connhash.decode("hex")
                    c2 = similar.connhash.decode("hex")
                    sim = self.calc_connhash_similiarity(c1, c2)
                    if sim < min_sim and similar.network.malware != None:
                        min_sim = sim
                        min_conn = similar

            # 0.9: 90% or more words in session are equal
            #	think this is probably the same kind of malware
            #	doesn't need to be the same botnet though!
            if min_sim < 0.9:
                conn.network.malware = min_conn.network.malware
            else:
                conn.network.malware = Malware()
                conn.network.malware.name = random.choice(ANIMAL_NAMES)

                self.session.add(conn.network.malware)
                self.session.flush()

        # Update network number of first connections
        if len(previous_conns) == 0 and conn.network_id != None:
            conn.network.nb_firstconns += 1

        return conn.json(depth=1)
예제 #26
0
##   Primary Author: Mayank Mohindra <github.com/mayankmtg>
##
##   Description: Main file. Contains logic to handle all commands and start the bot
##
import discord
from discord.ext import commands
from search import perform_search
from config import Config
from cache import save_search_query, find_search_history
from db import Connection
from error import ErrorMessage

Config.load()

client = discord.Client()
conn = Connection(Config.DATABASE)


# bot starts
@client.event
async def on_ready():
    print("bot is running")


# bot receives any messages
@client.event
async def on_message(command):
    # Ignore string from self
    if command.author == client.user:
        return