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
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
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
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
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
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 )
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 :
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()