Beispiel #1
0
def index():
    """Set the main view where people come to report issues."""
    push('/css/dist/webcompat.min.css', **{
        'as': 'style',
        'rel': 'preload'
    })
    push(bust_cache('/js/dist/webcompat.min.js'), **{
        'as': 'script',
        'rel': 'preload'
    })
    push('/img/svg/icons/svg-leaf_right.svg', **{
        'as': 'img',
        'rel': 'preload'
    })
    push('/img/svg/icons/svg-leaf_left.svg', **{
        'as': 'img',
        'rel': 'preload'
    })
    ua_header = request.headers.get('User-Agent')
    bug_form = get_form({'user_agent': ua_header})
    # browser_name is used in topbar.html to show the right add-on link
    browser_name = get_browser_name(ua_header)
    # GET means you want to file a report.
    if g.user:
        get_user_info()
    return render_template('index.html', form=bug_form, browser=browser_name)
Beispiel #2
0
def index():
    """Set the main view where people come to report issues."""
    ua_header = request.headers.get('User-Agent')
    bug_form = get_form(ua_header)
    # browser_name is used in topbar.html to show the right add-on link
    browser_name = get_browser_name(ua_header)
    # GET means you want to file a report.
    if g.user:
        get_user_info()
    return render_template('index.html', form=bug_form, browser=browser_name)
Beispiel #3
0
    def scaffold_form(self):
        """
            Create form from the model.
        """
        form_class = get_form(self.model,
                              self.model_form_converter(self),
                              base_class=self.form_base_class,
                              only=self.form_columns,
                              exclude=self.form_excluded_columns,
                              field_args=self.form_args,
                              extra_fields=self.form_extra_fields)

        return form_class
Beispiel #4
0
def create_issue():
    """Create a new issue.

    GET will return an HTML response for reporting issues.
    POST will create a new issue.

    Any deceptive requests will be ended as a 400.
    See https://tools.ietf.org/html/rfc7231#section-6.5.1
    """
    # changing this from index to /issues/new to retire it,
    # and sending a 403 if anyone discovers this route
    abort(403)
    # Get the User-Agent
    user_agent = request.headers.get('User-Agent')
    # GET Requests
    if request.method == 'GET':
        bug_form = get_form(user_agent, request)
        # Note: `src` and `label` are special GET params that can pass
        # in extra information about a bug report. They're not part of the
        # HTML <form>, so we stick them in the session cookie so they survive
        # the scenario where the user decides to do authentication, and they
        # can then be passed on to form.py
        return render_template('new-issue.html', form=bug_form)
    # POST Requests
    if request.form:
        # Copy the form to add the full UA string.
        form = request.form.copy()
        if not is_valid_issue_form(form):
            abort(400)
    else:
        abort(400)
    # Feeding the form with request data
    form['ua_header'] = user_agent
    # form submission is anonymous!
    if form.get('submit_type') == PROXY_REPORT:
        response = report_issue(form, proxy=True)
        print('response: ', response.status_code)
        return redirect(url_for('thanks'))
    else:
        # if anything wrong, we assume it is a bad forged request
        abort(400)
Beispiel #5
0
def create_issue():
    """Create a new issue.

    GET will return an HTML response for reporting issues
    POST will create a new issue
    """
    if request.method == 'GET':
        bug_form = get_form(request.headers.get('User-Agent'))
        if g.user:
            get_user_info()
        # Note: `src` and `label` are special GET params that can pass
        # in extra information about a bug report. They're not part of the
        # HTML <form>, so we stick them in the session cookie so they survive
        # the scenario where the user decides to do authentication, and they
        # can then be passed on to form.py
        if request.args.get('src'):
            session['src'] = request.args.get('src')
        if request.args.get('label'):
            session['label'] = request.args.getlist('label')
        return render_template('new-issue.html', form=bug_form)
    # copy the form so we can add the full UA string to it.
    if request.form:
        form = request.form.copy()
        # To be legit the form needs a couple of parameters
        # if one essential is missing, it's a bad request
        must_parameters = set([
            'url', 'problem_category', 'description', 'os', 'browser',
            'username', 'submit-type'
        ])
        if not must_parameters.issubset(form.keys()):
            abort(400)
    else:
        # https://tools.ietf.org/html/rfc7231#section-6.5.1
        abort(400)
    # see https://github.com/webcompat/webcompat.com/issues/1141
    # see https://github.com/webcompat/webcompat.com/issues/1237
    # see https://github.com/webcompat/webcompat.com/issues/1627
    spamlist = ['qiangpiaoruanjian', 'cityweb.de', 'coco.fr']
    for spam in spamlist:
        if spam in form.get('url'):
            msg = (u'Anonymous reporting for domain {0} '
                   'is temporarily disabled. Please contact '
                   '[email protected] '
                   'for more details.').format(spam)
            flash(msg, 'notimeout')
            return redirect(url_for('index'))
    form['ua_header'] = request.headers.get('User-Agent')
    form['reported_with'] = session.pop('src', 'web')
    # Reminder: label is a list, if it exists
    form['extra_labels'] = session.pop('label', None)
    # Logging the ip and url for investigation
    log = app.logger
    log.setLevel(logging.INFO)
    log.info('{ip} {url}'.format(ip=request.remote_addr,
                                 url=form['url'].encode('utf-8')))
    # form submission for 3 scenarios: authed, to be authed, anonymous
    if form.get('submit-type') == AUTH_REPORT:
        if g.user:  # If you're already authed, submit the bug.
            response = report_issue(form)
            session['show_thanks'] = True
            return redirect(
                url_for('show_issue', number=response.get('number')))
        else:  # Stash form data into session, go do GitHub auth
            session['form_data'] = form
            return redirect(url_for('login'))
    elif form.get('submit-type') == PROXY_REPORT:
        response = report_issue(form, proxy=True).json()
        session['show_thanks'] = True
        return redirect(url_for('show_issue', number=response.get('number')))
    else:
        # if anything wrong, we assume it is a bad forged request
        abort(400)
Beispiel #6
0
def create_issue():
    """Create a new issue or prefill a form for submission.

    * HTTP GET with (optional) parameters
      * create a form with prefilled data.
      * parameters:
        * url: URL of the Web site
        * src: source of the request (web, addon, etc.)
        * label: controled list of labels
    * HTTP POST with a JSON payload
      * create a form with prefilled data
      * content-type is application/json
      * json may include:
        * title
        * User agent string
        * OS identification
        * labels list
        * type of bugs
        * short summary
        * full description
        * tested in another browser
        * body
    * HTTP POST with an attached form
      * submit a form to GitHub to create a new issue
      * form submit type:
        * authenticated: Github authentification
        * anonymous: handled by webcompat-bot

    Any deceptive requests will be ended as a 400.
    See https://tools.ietf.org/html/rfc7231#section-6.5.1
    """
    # Starting a logger
    log = app.logger
    log.setLevel(logging.INFO)
    if g.user:
        get_user_info()
    # We define which type of requests we are dealing with.
    request_type = form_type(request)
    # Form Prefill section
    if request_type == 'prefill':
        form_data = prepare_form(request)
        bug_form = get_form(form_data)
        session['extra_labels'] = form_data['extra_labels']
        return render_template('new-issue.html', form=bug_form)
    # Issue Creation section
    elif request_type == 'create':
        # Check if there is a form
        if not request.form:
            log.info('POST request without form.')
            abort(400)
        # Adding parameters to the form
        form = request.form.copy()
        extra_labels = session.pop('extra_labels', None)
        if extra_labels:
            form['extra_labels'] = extra_labels
        # Logging the ip and url for investigation
        log.info('{ip} {url}'.format(
            ip=request.remote_addr,
            url=form['url'].encode('utf-8')))
        # Checking blacklisted domains
        if is_blacklisted_domain(form['url']):
            msg = (u'Anonymous reporting for domain {0} '
                   'is temporarily disabled. Please contact '
                   '[email protected] '
                   'for more details.').format(form['url'])
            flash(msg, 'notimeout')
            return redirect(url_for('index'))
        # Check if the form is valid
        if not is_valid_issue_form(form):
            abort(400)
        # Anonymous reporting
        if form.get('submit_type') == PROXY_REPORT:
            json_response = report_issue(form, proxy=True)
            session['show_thanks'] = True
            return redirect(
                url_for('show_issue', number=json_response.get('number')))
        # Authenticated reporting
        if form.get('submit_type') == AUTH_REPORT:
            if g.user:  # If you're already authed, submit the bug.
                json_response = report_issue(form)
                session['show_thanks'] = True
                return redirect(url_for('show_issue',
                                        number=json_response.get('number')))
            else:
                # Stash form data into session, go do GitHub auth
                session['form'] = form
                return redirect(url_for('login'))
    else:
        abort(400)
Beispiel #7
0
def create_issue():
    """Create a new issue or prefill a form for submission.

    * HTTP GET with (optional) parameters
      * create a form with prefilled data.
      * parameters:
        * url: URL of the Web site
        * src: source of the request (web, addon, etc.)
        * label: controled list of labels
    * HTTP POST with a JSON payload
      * create a form with prefilled data
      * content-type is application/json
      * json may include:
        * title
        * User agent string
        * OS identification
        * labels list
        * type of bugs
        * short summary
        * full description
        * tested in another browser
        * body
        * utm_ params for Google Analytics
    * HTTP POST with an attached form
      * submit a form to GitHub to create a new issue
      * form submit type:
        * authenticated: Github authentification
        * anonymous: handled by webcompat-bot

    Any deceptive requests will be ended as a 400.
    See https://tools.ietf.org/html/rfc7231#section-6.5.1
    """
    push('/css/dist/webcompat.min.css', **{'as': 'style', 'rel': 'preload'})
    push(bust_cache('/js/dist/webcompat.min.js'), **{
        'as': 'script',
        'rel': 'preload'
    })
    # Starting a logger
    log = app.logger
    log.setLevel(logging.INFO)
    if g.user:
        get_user_info()
    # We define which type of requests we are dealing with.
    request_type = form_type(request)
    # Form Prefill section
    if request_type == 'prefill':
        form_data = prepare_form(request)
        # XXXTemp Hack: if the user clicked on Report Site Issue from Release,
        # we want to redirect them somewhere else and forget all their data.
        # See https://bugzilla.mozilla.org/show_bug.cgi?id=1513541
        if form_data == 'release':
            return render_template('thanks.html')
        bug_form = get_form(form_data)
        session['extra_labels'] = form_data['extra_labels']
        source = form_data.pop('utm_source', None)
        campaign = form_data.pop('utm_campaign', None)
        return render_template('new-issue.html',
                               form=bug_form,
                               source=source,
                               campaign=campaign,
                               nonce=request.nonce)
    # Issue Creation section
    elif request_type == 'create':
        # Check if there is a form
        if not request.form:
            log.info('POST request without form.')
            abort(400)
        # Adding parameters to the form
        form = request.form.copy()
        extra_labels = session.pop('extra_labels', None)
        if extra_labels:
            form['extra_labels'] = extra_labels
        # Logging the ip and url for investigation
        log.info('{ip} {url}'.format(ip=request.remote_addr,
                                     url=form['url'].encode('utf-8')))
        # Check if the form is valid
        if not is_valid_issue_form(form):
            abort(400)
        if form.get('submit_type') == PROXY_REPORT:
            # Checking blacklisted domains
            domain = urlparse.urlsplit(form['url']).hostname
            if is_blacklisted_domain(domain):
                msg = app.config['IS_BLACKLISTED_DOMAIN'].format(form['url'])
                flash(msg, 'notimeout')
                return redirect(url_for('index'))
            # Anonymous reporting
            json_response = report_issue(form, proxy=True)
            session['show_thanks'] = True
            return redirect(
                url_for('show_issue', number=json_response.get('number')))
        # Authenticated reporting
        if form.get('submit_type') == AUTH_REPORT:
            if g.user:  # If you're already authed, submit the bug.
                json_response = report_issue(form)
                session['show_thanks'] = True
                return redirect(
                    url_for('show_issue', number=json_response.get('number')))
            else:
                # Stash form data into session, go do GitHub auth
                session['form'] = form
                return redirect(url_for('login'))
    else:
        abort(400)
Beispiel #8
0
def create_issue():
    """Create a new issue.

    GET will return an HTML response for reporting issues.
    POST will create a new issue.

    Any deceptive requests will be ended as a 400.
    See https://tools.ietf.org/html/rfc7231#section-6.5.1
    """
    # Starting a logger
    log = app.logger
    log.setLevel(logging.INFO)
    # Get the User-Agent
    user_agent = request.headers.get('User-Agent')
    # GET Requests
    if request.method == 'GET':
        bug_form = get_form(user_agent)
        if g.user:
            get_user_info()
        # Note: `src` and `label` are special GET params that can pass
        # in extra information about a bug report. They're not part of the
        # HTML <form>, so we stick them in the session cookie so they survive
        # the scenario where the user decides to do authentication, and they
        # can then be passed on to form.py
        if request.args.get('src'):
            session['src'] = request.args.get('src')
        if request.args.get('label'):
            session['label'] = request.args.getlist('label')
        return render_template('new-issue.html', form=bug_form)
    # POST Requests
    if request.form:
        # Copy the form to add the full UA string.
        form = request.form.copy()
        if not is_valid_issue_form(form):
            abort(400)
    else:
        log.info('POST request without form.')
        abort(400)
    # Logging the ip and url for investigation
    log.info('{ip} {url}'.format(
        ip=request.remote_addr,
        url=form['url'].encode('utf-8')))
    # Checking blacklisted domains
    if is_blacklisted_domain(form['url']):
        msg = (u'Anonymous reporting for domain {0} '
               'is temporarily disabled. Please contact '
               '[email protected] '
               'for more details.').format(form['url'])
        flash(msg, 'notimeout')
        return redirect(url_for('index'))
    # Feeding the form with request data
    form['ua_header'] = user_agent
    form['reported_with'] = session.pop('src', 'web')
    # Reminder: label is a list, if it exists
    form['extra_labels'] = session.pop('label', None)
    # form submission for 3 scenarios: authed, to be authed, anonymous
    if form.get('submit_type') == AUTH_REPORT:
        if g.user:  # If you're already authed, submit the bug.
            json_response = report_issue(form)
            session['show_thanks'] = True
            return redirect(url_for('show_issue',
                                    number=json_response.get('number')))
        else:  # Stash form data into session, go do GitHub auth
            session['form_data'] = form
            return redirect(url_for('login'))
    elif form.get('submit_type') == PROXY_REPORT:
        json_response = report_issue(form, proxy=True)
        session['show_thanks'] = True
        return redirect(url_for('show_issue',
                                number=json_response.get('number')))
    else:
        # if anything wrong, we assume it is a bad forged request
        abort(400)
Beispiel #9
0
def create_issue():
    """Create a new issue or prefill a form for submission.

    * HTTP GET with (optional) parameters
      * create a form with prefilled data.
      * parameters:
        * url: URL of the Web site
        * src: source of the request (web, addon, etc.)
        * label: controled list of labels
    * HTTP POST with a JSON payload
      * create a form with prefilled data
      * content-type is application/json
      * json may include:
        * title
        * User agent string
        * OS identification
        * labels list
        * type of bugs
        * short summary
        * full description
        * tested in another browser
        * body
        * utm_ params for Google Analytics
    * HTTP POST with an attached form
      * submit a form to GitHub to create a new issue
      * form submit type:
        * authenticated: Github authentification
        * anonymous: handled by webcompat-bot

    Any deceptive requests will be ended as a 400.
    See https://tools.ietf.org/html/rfc7231#section-6.5.1
    """
    push('/css/dist/webcompat.min.css', **{
        'as': 'style',
        'rel': 'preload'
    })
    push(bust_cache('/js/dist/webcompat.min.js'), **{
        'as': 'script',
        'rel': 'preload'
    })
    # Starting a logger
    log = app.logger
    log.setLevel(logging.INFO)
    if g.user:
        get_user_info()
    # We define which type of requests we are dealing with.
    request_type = form_type(request)
    # Form Prefill section
    if request_type == 'prefill':
        form_data = prepare_form(request)
        bug_form = get_form(form_data)
        session['extra_labels'] = form_data['extra_labels']
        source = form_data.pop('utm_source', None)
        campaign = form_data.pop('utm_campaign', None)
        return render_template('new-issue.html', form=bug_form, source=source,
                               campaign=campaign, nonce=request.nonce)
    # Issue Creation section
    elif request_type == 'create':
        # Check if there is a form
        if not request.form:
            log.info('POST request without form.')
            abort(400)
        # Adding parameters to the form
        form = request.form.copy()
        extra_labels = session.pop('extra_labels', None)
        if extra_labels:
            form['extra_labels'] = extra_labels
        # Logging the ip and url for investigation
        log.info('{ip} {url}'.format(
            ip=request.remote_addr,
            url=form['url'].encode('utf-8')))
        # Check if the form is valid
        if not is_valid_issue_form(form):
            abort(400)
        if form.get('submit_type') == PROXY_REPORT:
            # Checking blacklisted domains
            domain = urlparse.urlsplit(form['url']).hostname
            if is_blacklisted_domain(domain):
                msg = app.config['IS_BLACKLISTED_DOMAIN'].format(form['url'])
                flash(msg, 'notimeout')
                return redirect(url_for('index'))
            # Anonymous reporting
            json_response = report_issue(form, proxy=True)
            session['show_thanks'] = True
            return redirect(
                url_for('show_issue', number=json_response.get('number')))
        # Authenticated reporting
        if form.get('submit_type') == AUTH_REPORT:
            if g.user:  # If you're already authed, submit the bug.
                json_response = report_issue(form)
                session['show_thanks'] = True
                return redirect(url_for('show_issue',
                                        number=json_response.get('number')))
            else:
                # Stash form data into session, go do GitHub auth
                session['form'] = form
                return redirect(url_for('login'))
    else:
        abort(400)