diff --git a/helpers/contributor_helper.py b/helpers/contributor_helper.py index 671eed3..7b80234 100644 --- a/helpers/contributor_helper.py +++ b/helpers/contributor_helper.py @@ -120,14 +120,14 @@ class Contributor_helper: if action in ['edit', None]: pass #return #not a contribution? - + now = datetime.datetime.now() nowSec = int(time.time()) pnts_to_add = self.default_pnts_per_contribution - + # Do not consider contribution as login anymore #self.users_helper.add_user_login(nowSec, org) - + # is a valid contribution if categ is not None: try: @@ -135,23 +135,23 @@ class Contributor_helper: except KeyError: pnts_to_add = self.default_pnts_per_contribution pnts_to_add *= pntMultiplier - + util.push_to_redis_zset(self.serv_redis_db, self.keyDay, org, count=pnts_to_add) #CONTRIB_CATEG retain the contribution per category, not the point earned in this categ util.push_to_redis_zset(self.serv_redis_db, self.keyCateg, org, count=1, endSubkey=':'+util.noSpaceLower(categ)) self.publish_log(zmq_name, 'CONTRIBUTION', {'org': org, 'categ': categ, 'action': action, 'epoch': nowSec }, channel=self.CHANNEL_LASTCONTRIB) else: categ = "" - + self.serv_redis_db.sadd(self.keyAllOrg, org) - + keyname = "{}:{}".format(self.keyLastContrib, util.getDateStrFormat(now)) self.serv_redis_db.zadd(keyname, nowSec, org) self.logger.debug('Added to redis: keyname={}, nowSec={}, org={}'.format(keyname, nowSec, org)) self.serv_redis_db.expire(keyname, util.ONE_DAY*7) #expire after 7 day - + awards_given = self.updateOrgContributionRank(org, pnts_to_add, action, contribType, eventTime=datetime.datetime.now(), isLabeled=isLabeled, categ=util.noSpaceLower(categ)) - + for award in awards_given: # update awards given keyname = "{}:{}".format(self.keyLastAward, util.getDateStrFormat(now)) @@ -589,4 +589,3 @@ class Contributor_helper: return { 'remainingPts': i-points, 'stepPts': prev } prev = i return { 'remainingPts': 0, 'stepPts': self.rankMultiplier**self.levelMax } - diff --git a/helpers/live_helper.py b/helpers/live_helper.py index 7078e49..071423b 100644 --- a/helpers/live_helper.py +++ b/helpers/live_helper.py @@ -32,6 +32,7 @@ class Live_helper: self.serv_live.publish(channel, j_to_send) self.logger.debug('Published: {}'.format(j_to_send)) if name != 'Keepalive': + name = 'Attribute' if 'ObjectAttribute' else name self.add_to_stream_log_cache(name, j_to_send_keep) diff --git a/server.py b/server.py index 5136e0c..9246d5f 100755 --- a/server.py +++ b/server.py @@ -121,9 +121,13 @@ class EventMessage(): self.name = jsonMsg['name'] self.zmqName = jsonMsg['zmqName'] + if self.name == 'Attribute': self.feed = jsonMsg['log'] self.feed = LogItem(self.feed, filters).get_row() + elif self.name == 'ObjectAttribute': + self.feed = jsonMsg['log'] + self.feed = LogItem(self.feed, filters).get_row() else: self.feed = jsonMsg['log'] diff --git a/static/js/index/index.js b/static/js/index/index.js index 1fa9f6c..d2ed2bd 100644 --- a/static/js/index/index.js +++ b/static/js/index/index.js @@ -175,7 +175,7 @@ $(document).ready(function () { pollingFrequency: 5000, tableHeader: head, tableMaxEntries: 50, - animate: false, + // animate: false, preDataURL: urlForLogs, endpoint: urlForLogs }); @@ -333,45 +333,44 @@ function createHead(callback) { { targets: 0, orderable: false }, { targets: '_all', searchable: false, orderable: false, render: function ( data, type, row ) { - // return data +' ('+ row[3]+')'; - var $toRet; - if (typeof data === 'object') { - $toRet = $(''); - data.data.forEach(function(cur, i) { - switch (data.name) { - case 'Tag': - var $tag = $(''); - $tag.addClass('tagElem'); - $tag.css({ - backgroundColor: cur.colour, - color: getTextColour(cur.colour.substring(1,6)) - }); - $tag.text(cur.name) - $toRet.append($tag); - break; - case 'mispObject': - $toRet.append('MISP Object not supported yet') - break; - default: - break; - } - }); - $toRet = $toRet[0].outerHTML; - } else if (data === undefined) { - $toRet = ''; - } else { - var textToAddArray = data.split(char_separator); + var $toRet; + if (typeof data === 'object') { + $toRet = $(''); + data.data.forEach(function(cur, i) { + switch (data.name) { + case 'Tag': + var $tag = $(''); + $tag.addClass('tagElem'); + $tag.css({ + backgroundColor: cur.colour, + color: getTextColour(cur.colour.substring(1,6)) + }); + $tag.text(cur.name) + $toRet.append($tag); + break; + case 'mispObject': + $toRet.append('MISP Object not supported yet') + break; + default: + break; + } + }); + $toRet = $toRet[0].outerHTML; + } else if (data === undefined) { $toRet = ''; - textToAddArray.forEach(function(e, i) { - if (i > 0) { - $toRet += '
' + e; - } else { - $toRet += e; - } - }); - } - return $toRet; - }, + } else { + var textToAddArray = data.split(char_separator); + $toRet = ''; + textToAddArray.forEach(function(e, i) { + if (i > 0) { + $toRet += '
' + e; + } else { + $toRet += e; + } + }); + } + return $toRet; + }, } ], }; @@ -474,6 +473,9 @@ function createHead(callback) { case 'Attribute': that.add_entry(entry); break; + case 'ObjectAttribute': + that.add_entry(entry, true); + break; default: break; } @@ -499,6 +501,9 @@ function createHead(callback) { case 'Attribute': that.add_entry(entry); break; + case 'ObjectAttribute': + that.add_entry(entry, true); + break; default: break; } @@ -577,14 +582,21 @@ function createHead(callback) { } }, - add_entry: function(entry) { + add_entry: function(entry, isObjectAttribute) { var rowNode = this.dt.row.add(entry).draw().node(); - if (this.animate) { + if (this._options.animate) { $( rowNode ) - .css( 'background-color', '#5cb85c' ) - .animate( { 'background-color': '', duration: 600 } ); + .css( 'background-color', '#5cb85c !important' ) + .animate( { 'background-color': '' }, { duration: 1500 } ); + } + if (isObjectAttribute === true) { + console.log(entry); + $( rowNode ).children().last() + .css('position', 'relative') + .append( + $('') + ); } - // this.dt.row.add(entry).draw( false ); // remove entries var numRows = this.dt.rows().count(); var rowsToRemove = numRows - this._options.tableMaxEntries; diff --git a/templates/index.html b/templates/index.html index 144ab2d..9d7cf5b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -189,10 +189,17 @@ div.dataTables_scrollHead table.dataTable { left: 15px !important; right: 10px !important; z-index: 1001 !important; - bottom: 5px !important; + bottom: -7px !important; height: unset !important; } +.rowTableIsObject { + position: absolute; + right: 15px; + top: 0px; + color: #3465a4; +} + diff --git a/zmq_dispatcher.py b/zmq_dispatcher.py index 436ec1d..438a270 100755 --- a/zmq_dispatcher.py +++ b/zmq_dispatcher.py @@ -122,7 +122,16 @@ def handler_conversation(zmq_name, jsonevent): def handler_object(zmq_name, jsondata): logger.info('Handling object') - return + # check if jsonattr is an mispObject object + if 'Object' in jsondata: + jsonobj = jsondata['Object'] + soleObject = copy.deepcopy(jsonobj) + del soleObject['Attribute'] + for jsonattr in jsonobj['Attribute']: + jsonattrcpy = copy.deepcopy(jsonobj) + jsonattrcpy['Event'] = jsondata['Event'] + jsonattrcpy['Attribute'] = jsonattr + handler_attribute(zmq_name, jsonattrcpy, False, parentObject=soleObject) def handler_sighting(zmq_name, jsondata): logger.info('Handling sighting') @@ -168,6 +177,16 @@ def handler_event(zmq_name, jsonobj): else: handler_attribute(zmq_name, attributes) + if 'Object' in jsonevent: + objects = jsonevent['Object'] + if type(objects) is list: + for obj in objects: + jsoncopy = copy.deepcopy(jsonobj) + jsoncopy['Object'] = obj + handler_object(zmq_name, jsoncopy) + else: + handler_object(zmq_name, objects) + action = jsonobj.get('action', None) eventLabeled = len(jsonobj.get('EventTag', [])) > 0 org = jsonobj.get('Orgc', {}).get('name', None) @@ -179,11 +198,15 @@ def handler_event(zmq_name, jsonobj): action, isLabeled=eventLabeled) -def handler_attribute(zmq_name, jsonobj, hasAlreadyBeenContributed=False): +def handler_attribute(zmq_name, jsonobj, hasAlreadyBeenContributed=False, parentObject=False): logger.info('Handling attribute') # check if jsonattr is an attribute object if 'Attribute' in jsonobj: jsonattr = jsonobj['Attribute'] + else: + jsonattr = jsonobj + + attributeType = 'Attribute' if jsonattr['object_id'] == '0' else 'ObjectAttribute' #Add trending categName = jsonattr['category'] @@ -210,12 +233,12 @@ def handler_attribute(zmq_name, jsonobj, hasAlreadyBeenContributed=False): eventLabeled = len(jsonobj.get('EventTag', [])) > 0 action = jsonobj.get('action', None) contributor_helper.handleContribution(zmq_name, jsonobj['Event']['Orgc']['name'], - 'Attribute', + attributeType, jsonattr['category'], action, isLabeled=eventLabeled) # Push to log - live_helper.publish_log(zmq_name, 'Attribute', jsonobj) + live_helper.publish_log(zmq_name, attributeType, jsonobj) ###############