Ejemplo n.º 1
0
    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')
                             })
Ejemplo n.º 2
0
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()