def test_prepare_form_get(self): """Extract information of a form request with a GET.""" form_data = { 'extra_labels': ['type-stylo'], 'src': 'web', 'user_agent': 'Burger', 'url': 'http://example.net/', } with webcompat.app.test_request_context( '/issues/new?url=http://example.net/&src=web&label=type-stylo', method='GET', headers={'User-agent': 'Burger'}): self.assertEqual(prepare_form(flask.request), form_data) # Testing that we keep processing # even when some parameters are not defined. with webcompat.app.test_request_context( '/issues/new?src=web&label=type-stylo', method='GET', headers={'User-agent': 'Burger'}): # URL is not defined form_data['url'] = None self.assertEqual(prepare_form(flask.request), form_data) # Testing with non-valid extra-labels. For now we keep them. # They are filtered by form.py with webcompat.app.test_request_context( '/issues/new?src=web&label=type-punkcat&label=type-webvr', method='GET', headers={'User-agent': 'Burger'}): form_data['url'] = None form_data['extra_labels'] = ['type-punkcat', 'type-webvr'] self.assertEqual(prepare_form(flask.request), form_data)
def test_prepare_form_get(self): """Extract information of a form request with a GET.""" form_data = {'extra_labels': [u'type-stylo'], 'src': u'web', 'user_agent': u'Burger', 'url': u'http://example.net/', } with webcompat.app.test_request_context( '/issues/new?url=http://example.net/&src=web&label=type-stylo', method='GET', headers={'User-agent': 'Burger'}): self.assertEqual(prepare_form(flask.request), form_data) # Testing that we keep processing # even when some parameters are not defined. with webcompat.app.test_request_context( '/issues/new?src=web&label=type-stylo', method='GET', headers={'User-agent': 'Burger'}): # URL is not defined form_data['url'] = None self.assertEqual(prepare_form(flask.request), form_data) # Testing with non-valid extra-labels. For now we keep them. # They are filtered by form.py with webcompat.app.test_request_context( '/issues/new?src=web&label=type-punkcat&label=type-webvr', method='GET', headers={'User-agent': 'Burger'}): form_data['url'] = None form_data['extra_labels'] = [u'type-punkcat', u'type-webvr'] self.assertEqual(prepare_form(flask.request), form_data)
def test_prepare_form_post(self): """Extract information of a form request with a POST.""" json_data = {'extra_labels': ['type-webvr', 'type-media'], 'src': 'addon', 'user_agent': 'BurgerJSON', 'url': 'http://json.example.net/', } with webcompat.app.test_request_context( '/issues/new?url=http://example.net/&src=web&label=type-stylo', headers={'User-agent': 'Burger', 'Content-Type': 'application/json'}, json=json_data, method='POST'): self.assertEqual(prepare_form(flask.request), json_data)
def test_prepare_form_post(self): """Extract information of a form request with a POST.""" json_data = {'extra_labels': [u'type-webvr', u'type-media'], 'src': u'addon', 'user_agent': u'BurgerJSON', 'url': u'http://json.example.net/', } with webcompat.app.test_request_context( '/issues/new?url=http://example.net/&src=web&label=type-stylo', headers={'User-agent': 'Burger', 'Content-Type': 'application/json'}, json=json_data, method='POST'): self.assertEqual(prepare_form(flask.request), json_data)
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) if ab_active('exp') == 'form-v2': bug_form = get_form(form_data, form=FormWizard) # TODO: remove this when the experiment has ended form_data['extra_labels'].append('form-v2-experiment') else: 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): log.info('Invalid issue form request') abort(400) if form.get('submit_type') == PROXY_REPORT: # Checking blacklisted domains domain = urllib.parse.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: log.info('No idea. Abort from /issues/new') abort(400)