コード例 #1
0
ファイル: rpccommands.py プロジェクト: F3DS/f3ds
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"