def command(self): session, config = self.session, self.session.config html_variables = session.ui.html_variables if not (html_variables and session.ui.valid_csrf_token( self.data.get('csrf', [''])[0])): raise AccessError('Invalid CSRF token') backup_fn, backup_contents, backup_data = self.MakeBackupArchive( config, self._gnupg(), what=[a for a in self.args if a not in ('download', )]) if 'download' in self.args: encoded_fn = urllib.quote(backup_fn.encode('utf-8')) request = html_variables['http_request'] request.send_http_response(200, 'OK') request.send_standard_headers( mimetype='application/zip', header_list=[ ('Content-Length', len(backup_data)), ('Content-Disposition', 'attachment; filename*=UTF-8\'\'%s' % (encoded_fn, )) ]) request.wfile.write(backup_data) raise SuppressHtmlOutput() return self._success('Generated backup', result={ 'filename': backup_fn, 'contents': backup_contents, 'data_b64': backup_data.encode('base64') })
class HttpProxyGetRequest(Command): """HTTP GET content from the public web""" SYNOPSIS = (None, None, 'http_proxy', None) ORDER = ('Internals', 0) RAISES = (AccessError, SuppressHtmlOutput) HTTP_CALLABLE = ('GET', ) HTTP_AUTH_REQUIRED = True HTTP_QUERY_VARS = { 'ts': 'Cache busting timestamp', 'timeout': 'Timeout in seconds', 'url': 'URL to fetch', 'csrf': 'CSRF token' } def command(self): session = self.session html_variables = session.ui.html_variables if not (html_variables and session.ui.valid_csrf_token( self.data.get('csrf', [''])[0])): raise AccessError('Invalid CSRF token') url = self.data['url'][0] timeout = float(self.data.get('timeout', ['10'])[0]) conn_reject = [] # FIXME: reject ConnBroker.OUTGOING_TRACKABLE ? if url[:6].lower() == 'https:': conn_need = [ConnBroker.OUTGOING_HTTP] elif url[:5].lower() == 'http:': conn_need = [ConnBroker.OUTGOING_HTTPS] else: raise AccessError('Invalid URL scheme') try: with ConnBroker.context(need=conn_need, reject=conn_reject) as ctx: session.ui.mark('Getting: %s' % url) response = urlopen(url, data=None, timeout=timeout) except HTTPError, e: response = e data = response.read() headers = response.headers contenttype = headers.get('content-type', 'application/octet-stream') request = html_variables['http_request'] request.send_http_response(response.code, response.msg) request.send_standard_headers(mimetype=contenttype, header_list=[('Content-Length', len(data))]) request.wfile.write(data) request.send_full_response(response.code, response.msg) raise SuppressHtmlOutput()
def command(self): session = self.session html_variables = session.ui.html_variables if not (html_variables and session.ui.valid_csrf_token( self.data.get('csrf', [''])[0])): raise AccessError('Invalid CSRF token') url = self.data['url'][0] timeout = float(self.data.get('timeout', ['10'])[0]) conn_reject = [] # FIXME: reject ConnBroker.OUTGOING_TRACKABLE ? if url[:6].lower() == 'https:': conn_need = [ConnBroker.OUTGOING_HTTP] elif url[:5].lower() == 'http:': conn_need = [ConnBroker.OUTGOING_HTTPS] else: raise AccessError('Invalid URL scheme') try: with ConnBroker.context(need=conn_need, reject=conn_reject) as ctx: session.ui.mark('Getting: %s' % url) response = urlopen(url, data=None, timeout=timeout) except HTTPError as e: response = e data = response.read() headers = response.headers contenttype = headers.get('content-type', 'application/octet-stream') request = html_variables['http_request'] request.send_http_response(response.code, response.msg) request.send_standard_headers(mimetype=contenttype, header_list=[('Content-Length', len(data))]) request.wfile.write(data) raise SuppressHtmlOutput()