def new(): form = NewReportForm() if request.method == "POST": try: if not form.validate() or form.file.name not in request.files: raise InvalidUsage("Invalid form data.", 400) raw_data = request.files[form.file.name].read() try: data = json.loads(raw_data) except Exception as ex: # pylint: disable=broad-except _save_invalid_ureport(db, raw_data, str(ex)) raise InvalidUsage("Couldn't parse JSON data.", 400) try: ureport.validate(data) except Exception as exp: # pylint: disable=broad-except reporter = None if ("reporter" in data and "name" in data["reporter"] and "version" in data["reporter"]): reporter = "{0} {1}".format(data["reporter"]["name"], data["reporter"]["version"]) _save_invalid_ureport(db, json.dumps(data, indent=2), str(exp), reporter=reporter) if ("os" in data and "name" in data["os"] and data["os"]["name"] not in systems and data["os"]["name"].lower() not in systems): _save_unknown_opsys(db, data["os"]) if str(exp) == 'uReport must contain affected package': raise InvalidUsage(("Server is not accepting problems " "from unpackaged files."), 400) raise InvalidUsage("uReport data is invalid.", 400) report = data max_ureport_length = InvalidUReport.__lobs__["ureport"] if len(str(report)) > max_ureport_length: raise InvalidUsage( "uReport may only be {0} bytes long".format( max_ureport_length), 413) osr_id = None osr = None if report["os"]["name"] in systems: osr = (db.session.query(OpSysRelease).join(OpSys).filter( OpSys.name == systems[report["os"]["name"]].nice_name ).filter( OpSysRelease.version == report["os"]["version"]).first()) if osr: osr_id = osr.id try: dbreport = ureport.is_known(report, db, return_report=True, opsysrelease_id=osr_id) except Exception as e: # pylint: disable=broad-except logging.exception(e) dbreport = None known = bool(dbreport) fname = str(uuid.uuid4()) fpath = os.path.join(paths["reports_incoming"], fname) with open(fpath, 'w') as file: file.write(raw_data.decode("utf-8")) if request_wants_json(): response = {'result': known} try: report2 = ureport2(report) ureport.validate(report2) except FafError: report2 = None if report2 is not None: solution = find_solution(report2, db=db, osr=osr) if solution is not None: response["message"] = ( "Your problem seems to be caused by {0}\n\n" "{1}".format(solution.cause, solution.note_text)) if solution.url: response["message"] += ( "\n\nYou can get more information at {0}". format(solution.url)) solution_dict = { "cause": solution.cause, "note": solution.note_text, "url": solution.url } if not solution_dict["url"]: del solution_dict["url"] response["solutions"] = [solution_dict] response["result"] = True try: problemplugin = problemtypes[report2["problem"] ["type"]] response["bthash"] = problemplugin.hash_ureport( report2["problem"]) except Exception as e: # pylint: disable=broad-except logging.exception(e) if known: url = url_for('reports.item', report_id=dbreport.id, _external=True) parts = [{ "reporter": "ABRT Server", "value": url, "type": "url" }] bugs = (db.session.query(BzBug).join(ReportBz).filter( ReportBz.bzbug_id == BzBug.id).filter( ReportBz.report_id == dbreport.id).all()) for bug in bugs: parts.append({ "reporter": "Bugzilla", "value": bug.url, "type": "url" }) if 'message' not in response: response['message'] = '' else: response['message'] += '\n\n' response['message'] += "\n".join( p["value"] for p in parts if p["type"].lower() == "url") response['reported_to'] = parts json_response = jsonify(response) json_response.status_code = 202 return json_response flash("The uReport was saved successfully. Thank you.", "success") return render_template("reports/new.html", form=form), 202 except InvalidUsage as e: if request_wants_json(): response = jsonify({"error": e.message}) response.status_code = e.status_code return response flash(e.message, "danger") return render_template("reports/new.html", form=form), e.status_code return render_template("reports/new.html", form=form)
def new(): form = NewReportForm() if request.method == "POST": try: if not form.validate() or form.file.name not in request.files: raise InvalidUsage("Invalid form data.", 400) raw_data = request.files[form.file.name].read() try: data = json.loads(raw_data) except Exception as ex: # pylint: disable=broad-except _save_invalid_ureport(db, raw_data, str(ex)) raise InvalidUsage("Couldn't parse JSON data.", 400) try: ureport.validate(data) except Exception as exp: # pylint: disable=broad-except reporter = None if ("reporter" in data and "name" in data["reporter"] and "version" in data["reporter"]): reporter = "{0} {1}".format(data["reporter"]["name"], data["reporter"]["version"]) _save_invalid_ureport(db, json.dumps(data, indent=2), str(exp), reporter=reporter) if ("os" in data and "name" in data["os"] and data["os"]["name"] not in systems and data["os"]["name"].lower() not in systems): _save_unknown_opsys(db, data["os"]) if str(exp) == 'uReport must contain affected package': raise InvalidUsage(("Server is not accepting problems " "from unpackaged files."), 400) raise InvalidUsage("uReport data is invalid.", 400) report = data max_ureport_length = InvalidUReport.__lobs__["ureport"] if len(str(report)) > max_ureport_length: raise InvalidUsage("uReport may only be {0} bytes long" .format(max_ureport_length), 413) osr_id = None osr = None if report["os"]["name"] in systems: try: osr = (db.session.query(OpSysRelease) .join(OpSys) .filter(OpSys.name == systems[report["os"]["name"]].nice_name) .filter(OpSysRelease.version == report["os"]["version"]) .first()) except (DatabaseError, InterfaceError) as e: flash("Database unreachable. The uReport couldn't be saved. Please try again later.", "danger") logging.exception(e) return render_template("reports/new.html", form=form), 503 #HTTP Service Unavailable if osr: osr_id = osr.id try: dbreport = ureport.is_known(report, db, return_report=True, opsysrelease_id=osr_id) except Exception as e: # pylint: disable=broad-except logging.exception(e) dbreport = None known = bool(dbreport) fname = str(uuid.uuid4()) fpath = os.path.join(paths["reports_incoming"], fname) with open(fpath, 'w') as file: file.write(raw_data.decode("utf-8")) if request_wants_json(): response = {'result': known} try: report2 = ureport2(report) ureport.validate(report2) except FafError: report2 = None if report2 is not None: try: solution = find_solution(report2, db=db, osr=osr) except (DatabaseError, InterfaceError) as e: flash("Database unreachable. The solution couldn't be retrieved. Please try again later.", "danger") logging.exception(e) return render_template("reports/new.html", form=form), 503 #HTTP Service Unavailable if solution is not None: response["message"] = ( "Your problem seems to be caused by {0}\n\n" "{1}".format(solution.cause, solution.note_text)) if solution.url: response["message"] += ( "\n\nYou can get more information at {0}" .format(solution.url)) solution_dict = {"cause": solution.cause, "note": solution.note_text, "url": solution.url} if not solution_dict["url"]: del solution_dict["url"] response["solutions"] = [solution_dict] response["result"] = True try: problemplugin = problemtypes[ report2["problem"]["type"]] response["bthash"] = problemplugin.hash_ureport( report2["problem"]) except Exception as e: # pylint: disable=broad-except logging.exception(e) if known: url = url_for('reports.item', report_id=dbreport.id, _external=True) parts = [{"reporter": "ABRT Server", "value": url, "type": "url"}] try: bugs = (db.session.query(BzBug) .join(ReportBz) .filter(ReportBz.bzbug_id == BzBug.id) .filter(ReportBz.report_id == dbreport.id) .all()) except (DatabaseError, InterfaceError) as e: flash("Database unreachable. The bugs couldn't be retrieved. Please try again later.", "danger") logging.exception(e) return render_template("reports/new.html", form=form), 503 #HTTP Service Unavailable for bug in bugs: parts.append({"reporter": "Bugzilla", "value": bug.url, "type": "url"}) if 'message' not in response: response['message'] = '' else: response['message'] += '\n\n' response[ 'message'] += "\n".join(p["value"] for p in parts if p["type"].lower() == "url") response['reported_to'] = parts json_response = jsonify(response) json_response.status_code = 202 return json_response flash( "The uReport was saved successfully. Thank you.", "success") return render_template("reports/new.html", form=form), 202 except InvalidUsage as e: if request_wants_json(): response = jsonify({"error": e.message}) response.status_code = e.status_code return response flash(e.message, "danger") return render_template("reports/new.html", form=form), e.status_code return render_template("reports/new.html", form=form)