class SocialScanRPCCommands(BaseRPCCommands): """ SocialScan RPC functions that are offered to other peers. """ def __init__(self, config, session): super(SocialScanRPCCommands, self).__init__(config, session) self.logger = Logger("RPCFunctions") def xmlrpc_scanlogOffer(self, peername, url): """ Called by a peer to offer a scanlog. Stores the offer so that a worker can retrieve it later (due to the large size scanlogs often reach). """ self.xmlrpc_logOffer(peername, url, logtype='scan') def xmlrpc_scanRequest(self, peername, url, key): try: peer = self._getpeer(peername, "requested a scan on url %s" % url) if not peer: return "peer not known" request = QueuedRequest(self.config.owner, "active-scan", peer, url, key=key) self.session.add(request) self.session.commit() self.logger.log("Scan request %r: %r" % (key, request)) return "success" except: self.logger.exception() return "exception" def xmlrpc_scanResult(self, peername, url, hash, key, malicious, scannervv, sigversion, sigdatestr): try: peer = self._getpeer(peername, "returned a scan on url %s" % url) if not peer: return "peer not known" request = self.session.query(SentScanRequest).\ filter(SentScanRequest.owner == self.config.owner).\ filter(SentScanRequest.key == key).\ filter(SentScanRequest.peer == peer).\ filter(SentScanRequest.url == url).first() if not request: self.log("Peer %r attempted to return a scan result for " "url %r with key %r, but no such scan was requested" % (peer, url, key)) return "no such request" sigdate = datetime.datetime.utcfromtimestamp(int(sigdatestr)) hash = hash or None # if the hash is empty or similar, replace with None scan = Scan(self.config.owner, "social-active", url, malicious, siginfo=SigInfo(scannervv, sigversion, sigdate), hash=hash, sentrequest=request, peer=peer) self.session.add(scan) self.session.commit() self.logger.log("Scan result %r: %r" % (key, scan)) return "success" except: self.logger.exception() return "exception"