Пример #1
0
    def _registerKey(self, callback=None):
        data = 'username:%s' % self.userName
        digestType = DigestType('SHA1')
        digest = Digest(digestType).digest(data)
        signature = self.rsaKey.sign(digest, digestType)

        form = dict(username=self.userName,
                    public_key=self.rsaKey.toDER_PublicKey(),
                    signature=signature)
        postData = urllib.urlencode(form)

        request = HttpRequest(self.reactor)

        def onResponse(returnCode, data):
            if returnCode != 200:
                op.notify(-1)
                return
            try:
                keyId = int(data)
                op.notify(keyId)
            except ValueError:
                op.notify(-1)

        httpOp = request.post('http://cspace.in/addkey', postData, onResponse)
        op = AsyncOp(callback, httpOp.cancel)
        return op
Пример #2
0
 def _onHttpGet( self, httpOp, result, data, httpUrl ) :
     del self.httpOps[httpOp]
     if result != 200 : return
     assert data is not None
     input = StringIO( data )
     try :
         root = ElementTree.parse(input).getroot()
     except :
         logger.exception( 'error parsing xml' )
         return
     try :
         ns = root.tag[root.tag.index('{')+1:root.tag.index('}')]
     except ValueError :
         logger.exception( 'no namespace found' )
         return
     baseUrl = ''
     scpdUrl = None
     controlUrl = None
     service = None
     friendlyName = None
     manufacturer = None
     for elem in root.findall('.//{%s}friendlyName'%ns) :
         friendlyName = elem.text
         break
     for elem in root.findall('.//{%s}manufacturer'%ns) :
         manufacturer = elem.text
         break
     for elem in root.findall('.//{%s}URLBase'%ns) :
         baseUrl = elem.text
         break
     for elem in root.findall('.//{%s}service'%ns) :
         serviceTypeElem = elem.find( '{%s}serviceType'%ns )
         if serviceTypeElem is None : continue
         service = serviceTypeElem.text
         if service not in UPNP_SERVICES : continue
         scpdUrlElem = elem.find( '{%s}SCPDURL'%ns )
         if scpdUrlElem is None : continue
         controlUrlElem = elem.find( '{%s}controlURL'%ns )
         if controlUrlElem is None : continue
         scpdUrl = urljoin( baseUrl, scpdUrlElem.text )
         controlUrl = urljoin( baseUrl, controlUrlElem.text )
         break
     if not scpdUrl : return
     if not controlUrl : return
     if not scpdUrl.startswith('http:') :
         scpdUrl = urljoin( httpUrl, scpdUrl )
     if not controlUrl.startswith('http:') :
         controlUrl = urljoin( httpUrl, controlUrl )
     device = UPnpDevice( scpdUrl, controlUrl, service )
     device.friendlyName = friendlyName
     device.manufacturer = manufacturer
     def onResult( result, data ) :
         self._onScpdGet( httpOp, device, result, data )
     httpOp = HttpRequest( self.reactor ).get( scpdUrl, onResult )
     self.httpOps[httpOp] = 1
Пример #3
0
 def callAction( self, name, params, reactor, callback=None ) :
     payload = self.getActionPayload( name, params )
     http = HttpRequest( reactor )
     http.addHeader( 'Content-Type: text/xml; charset="utf-8"' )
     http.addHeader( 'SOAPACTION: "%s#%s"' % (self.service,name) )
     def onResponse( result, data ) :
         self._onActionResponse( op, name, result, data )
     httpOp = http.post( self.controlUrl, payload, onResponse )
     op = AsyncOp( callback, httpOp.cancel )
     return op
Пример #4
0
    def _registerKey( self, callback=None ) :
        data = 'username:%s' % self.userName
        digestType = DigestType( 'SHA1' )
        digest = Digest(digestType).digest( data )
        signature = self.rsaKey.sign( digest, digestType )

        form = dict( username=self.userName,
                public_key=self.rsaKey.toDER_PublicKey(),
                signature=signature )
        postData = urllib.urlencode( form )

        request = HttpRequest( self.reactor )
        def onResponse( returnCode, data ) :
            if returnCode != 200 :
                op.notify( -1 )
                return
            try :
                keyId = int(data)
                op.notify( keyId )
            except ValueError :
                op.notify( -1 )
        httpOp = request.post( 'http://cspace.in/addkey', postData, onResponse )
        op = AsyncOp( callback, httpOp.cancel )
        return op
Пример #5
0
    def _fetchKey(self, keyId, callback=None):
        def onFetchKey(responseCode, data):
            if responseCode != 200:
                op.notify(None)
                return
            inp = StringIO.StringIO(data)
            name = inp.readline().strip()
            pemPublicKey = inp.read()
            if name and not isValidUserName(name):
                op.notify(None)
                return
            op.notify((name, pemPublicKey))

        httpOp = HttpRequest(self.reactor).get(
            'http://cspace.in/pubkey/%s' % keyId, onFetchKey)
        op = AsyncOp(callback, httpOp.cancel)
        return op
Пример #6
0
 def _onTimer( self ) :
     self.deleteOldInstallers()
     self.timerOp = None
     url = UPDATE_BASE_URL + UPDATE_LATEST_VERSION
     http = HttpRequest( self.reactor )
     self.httpOp = http.get( url, self._onGetVersionInfo )
Пример #7
0
        if len(header) != 3 : return
        httpVersion,httpCode,httpMsg = header
        if not httpVersion.startswith('HTTP/') : return
        if httpCode != '200' : return
        location = None
        for line in lines[1:] :
            header = line.split(':',1)
            if len(header) != 2 : break
            name,value = header
            if name.lower() == 'location' :
                location = value.strip()
                break
        if location is None : return
        def onResult( result, data ) :
            self._onHttpGet( httpOp, result, data, location )
        httpOp = HttpRequest( self.reactor ).get( location, onResult )
        self.httpOps[httpOp] = 1

    def _onHttpGet( self, httpOp, result, data, httpUrl ) :
        del self.httpOps[httpOp]
        if result != 200 : return
        assert data is not None
        input = StringIO( data )
        try :
            root = ElementTree.parse(input).getroot()
        except :
            logger.exception( 'error parsing xml' )
            return
        try :
            ns = root.tag[root.tag.index('{')+1:root.tag.index('}')]
        except ValueError :
Пример #8
0
 def _onTimer( self ) :
     self.deleteOldInstallers()
     self.timerOp = None
     url = UPDATE_BASE_URL + UPDATE_LATEST_VERSION
     http = HttpRequest( self.reactor )
     self.httpOp = http.get( url, self._onGetVersionInfo )
Пример #9
0
class AutoUpdater( object ) :
    def __init__( self, reactor ) :
        self.reactor = reactor
        self.buildNumber = currentBuildNumber()
        self.timerOp = None
        self.httpOp = None
        self.updateCallback = None
        self._startTimer()

    def setUpdateCallback( self, updateCallback ) :
        self.updateCallback = updateCallback

    def shutdown( self ) :
        if self.timerOp : self.timerOp.cancel()
        if self.httpOp : self.httpOp.cancel()

    def _startTimer( self ) :
        assert self.timerOp is None
        self.timerOp = self.reactor.callLater( UPDATE_CHECK_INTERVAL, self._onTimer )

    def _onTimer( self ) :
        self.deleteOldInstallers()
        self.timerOp = None
        url = UPDATE_BASE_URL + UPDATE_LATEST_VERSION
        http = HttpRequest( self.reactor )
        self.httpOp = http.get( url, self._onGetVersionInfo )

    def _onGetVersionInfo( self, responseCode, data ) :
        self.httpOp = None
        if responseCode != 200 :
            print 'unable to get version info, response = %d' % responseCode
            self._startTimer()
            return
        installers = []
        try :
            for line in data.split('\n') :
                line = line.strip()
                if not line : continue
                info = line.split( ':' )
                for i,x in enumerate(info) :
                    if i > 0 : info[i] = int(x)
                fileName,fileSize,buildNumber,requires = info
                info = (-buildNumber,fileSize,requires,fileName)
                installers.append( info )
        except (TypeError,ValueError), e :
            print 'error parsing version info, e =', e
            self._startTimer()
            return
        installers.sort()
        for info in installers :
            buildNumber,fileSize,requires,fileName = info
            buildNumber = -buildNumber
            if buildNumber <= self.buildNumber :
                self._startTimer()
                return
            if requires > self.buildNumber : continue
            print 'fetching installer = %s' % fileName
            url = UPDATE_BASE_URL + fileName
            self.updateFileName = fileName
            http = HttpRequest( self.reactor )
            self.httpOp = http.get( url, self._onFetchInstaller )
            return
        self._startTimer()