def confirmation(self): try: if str(self.data["group_id"]) == str(config["API"]["vk"]["group_id"]): return str(config["API"]["vk"]["confirm"]) else: raise InvalidUsage('Confirmation is fail', status_code=503) except Exception as e: raise InvalidUsage('Confirmation error', status_code=410)
def contacts_geojson(username): if not username: raise InvalidUsage("Missing username", status_code=400) user = User.query.filter(User.name == username).first() if not user: raise InvalidUsage("User not found", status_code=404) _contacts = Contact.query.filter(User.id == user.id).all() if not is_valid_qth(user.locator, 6): raise InvalidUsage("QTH is not valid", status_code=400) _u = qth_to_coords(user.locator, 6) # precision, latitude, longitude j = [{ "type": "Feature", "properties": { "name": user.cutename(), "callsign": user.callsign, "own": True, "icon": "home" }, "geometry": { "type": "Point", "coordinates": [_u["longitude"], _u["latitude"]] }, }] for log in _contacts: if log.gridsquare: if not is_valid_qth(log.gridsquare, 6): raise InvalidUsage("QTH is not valid", status_code=400) _f = qth_to_coords(log.gridsquare, 6) # precision, latitude, longitude else: _f = log.country_grid_coords() if not _f: continue # No grid at all ? Skit ip f = { "type": "Feature", "properties": { "callsign": log.callsign, "distance": log.distance, "bearing": log.bearing, "bearing_star": log.bearing_star, "icon": "qso", }, "geometry": { "type": "Point", "coordinates": [_f["longitude"], _f["latitude"]] }, } j.append(f) return Response(json.dumps(j), mimetype="application/json")
def validation(self): super().validation() try: if str(self.data["secret_key"]) != str(config["API"]["vk"]["secret_key"]): raise InvalidUsage("Bad vk secret_key", status_code=503) except Exception as e: if hasattr(e, 'message'): raise else: InvalidUsage("Fail validation: {}".format(e.args[0]))
def attach(): form = NewAttachmentForm() 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: raise InvalidUsage("Invalid JSON file", 400) try: ureport.validate_attachment(data) except Exception as ex: raise InvalidUsage("Validation failed: %s" % ex, 400) attachment = data max_attachment_length = 2048 if len(str(attachment)) > max_attachment_length: err = "uReport attachment may only be {0} bytes long" \ .format(max_attachment_length) raise InvalidUsage(err, 413) fname = str(uuid.uuid4()) fpath = os.path.join(paths["attachments_incoming"], fname) with open(fpath, "w") as file: file.write(raw_data) if request_wants_json(): json_response = jsonify({"result": True}) json_response.status_code = 202 return json_response else: flash("The attachment was saved successfully. Thank you.", "success") return render_template("reports/attach.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 else: flash(e.message, "danger") return render_template("reports/attach.html", form=form), e.status_code return render_template("reports/attach.html", form=form)
def login(): try: args = request.args.to_dict() user_data = {} if app.config.get('DEV_USER_ID'): user_data = { 'user_id': app.config.get('DEV_USER_ID'), 'name': 'Dev User', 'email': '*****@*****.**' } else: code = args.get('code') # If the is no code, redirect to the users site to get a code if not all([code]): next = args.get('next') oauthUrl = app.config.get('OAUTH_URL') # include the next url if there is one if next is not None: oauthUrl += '?next=' + args.get('next') return redirect(oauthUrl) # We have a code, so use it to get and access token params = { 'code': code, 'grant_type': 'authorization_code', 'client_id': app.config.get('OAUTH_CLIENT_ID'), 'client_secret': app.config.get('OAUTH_CLIENT_SECRET'), 'redirect_uri': app.config.get('LOGIN_URL'), 'next': args.get('next') } response = requests.post(app.config.get('AUTH_SERVER') + '/oauth/access_token', data=params) access_data = response.json() response = requests.get( app.config.get('AUTH_SERVER') + '/api/user', params={'access_token': access_data['access_token']}) user_data = response.json() user_data['user_id'] = user_data['id'] user_data['name'] = user_data['name'] user_data['subscribed'] = ( 'Court Costs' in user_data['services']) or app.config.get( 'ALL_SUBSCRIBED', False) db.upsert_user(user_data) session['user_id'] = user_data['user_id'] redirect_uri = request.args.get('next', url_for('catch_all')) return redirect(redirect_uri) except Exception as e: print(e) raise InvalidUsage('Could not log in', status_code=500, error=e)
def call_type_func(self): self.validation() if self.type in self.api_types: self.current_response = self.api_types[self.type] return self.current_response["func"]() else: raise InvalidUsage("Unknown request type")
def message_new(self): # data example: {"type": "group_join", "object": {"text": "xzc", "from_id": 1, "peer_id": 1, "attachments": [], "id": 27, "out": 1, "is_hidden": false, "conversation_message_id": 27, "important": false, "fwd_messages": [], "random_id": 0, "date": 1532054458}, "group_id": 1} try: self.user_message_object = self.data["object"] self.user_message_text = self.user_message_object["text"] except Exception as e: raise InvalidUsage("Failed parse data message_new") else: response = self.do_message(self.user_message_text) return "ok"
def get_dxcc_from_clublog(callsign): config = Config.query.first() if not config: print("!!! Error: config not found") add_log(category="CONFIG", level="ERROR", message="Config not found") return clublog_api_key = config.clublog_api_key clublog_uri = "https://secure.clublog.org/dxcc?call={0}&api={1}&full=1".format( callsign, clublog_api_key) try: r = requests.get(clublog_uri) except: # noqa: E722 raise InvalidUsage("Error getting DXCC from ClubLog", status_code=500) if r.status_code != 200: raise InvalidUsage("Error getting DXCC from ClubLog", status_code=r.status_code) return json.loads(r.content)
def waveform_json(username, soundslug): user = User.query.filter(User.name == username).first() if not user: raise InvalidUsage("User not found", status_code=404) sound = Sound.query.filter(Sound.slug == soundslug, Sound.user_id == user.id).first() if not sound: raise InvalidUsage("Sound not found", status_code=404) if sound.private: if current_user: if sound.user_id != current_user.id: raise InvalidUsage("Sound not found", status_code=404) else: raise InvalidUsage("Sound not found", status_code=404) si = sound.sound_infos.first() if not si: return abort(404) wf = json.loads(si.waveform) wf["filename"] = sound.path_sound() wf["wf_png"] = sound.path_waveform() wf["title"] = sound.title return Response(json.dumps(wf), mimetype="application/json;charset=utf-8")
def get_dxcc_from_clublog_or_database(callsign): response = {} dxcc_database = None dxcc_clublog = get_dxcc_from_clublog(callsign) if not dxcc_clublog: # Trying fallback from database q = (DxccPrefixes.query.filter(DxccPrefixes.call == func.substring( callsign, 1, func.LENGTH(DxccPrefixes.call))).order_by( func.length(DxccPrefixes.call).asc()).limit(1).first()) if q: dxcc_database = { "CQZ": int(q.cqz), "Continent": q.cont, "DXCC": q.adif, "Lat": q.lat, "Lon": q.long, "Name": q.entity, "PermKomi": False, } if not dxcc_clublog and not dxcc_database: # We have nothing at all :( raise InvalidUsage("Error while getting infos from clublog", status_code=500) if dxcc_clublog or dxcc_database: response["status"] = "ok" if dxcc_clublog: response.update(dxcc_clublog) response["source"] = "clublog" else: response.update(dxcc_database) response["source"] = "database" return response
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: _save_invalid_ureport(db, raw_data, str(ex)) raise InvalidUsage("Couldn't parse JSON data.", 400) try: ureport.validate(data) except Exception as exp: 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"]) 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: 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) if request_wants_json(): response = {'result': known} try: report2 = ureport2(report) 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: logging.exception(e) pass 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 else: 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 else: 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(url_fname=None): """ Handle dump dir archive uploads """ form = NewDumpDirForm() if request.method in ["POST", "PUT"]: try: if request.method == "POST": if not form.validate() or form.file.name not in request.files: raise InvalidUsage("Invalid form data.", 400) archive_file = request.files[form.file.name] archive_fname = archive_file.filename if request.method == "PUT": archive_file = StringIO(request.stream.read()) archive_fname = url_fname archive_file.seek(0, os.SEEK_END) archive_size = archive_file.tell() archive_file.seek(0) if not archive_size: raise InvalidUsage("Empty archive received", 400) if not check_filename(archive_fname): raise InvalidUsage("Wrong archive file name", 400) # sanitize input filename just to be sure archive_fname = secure_filename(archive_fname) if not os.path.exists(paths["dumpdir"]): raise InvalidUsage("That's embarrassing! We have some troubles" " with deployment. Please try again later.", 500) count = 0 try: count = sum( 1 for x in os.listdir(paths["dumpdir"]) if os.path.isfile(os.path.join(paths["dumpdir"], x))) except Exception as e: raise InvalidUsage("That's embarrassing! We have some troubles" " with storage. Please try again later.", 500) if count >= int(config["dumpdir.cachedirectorycountquota"]): raise InvalidUsage("That's embarrassing! We have reached" " the limit of uploaded archives." " Please try again later.", 500) if archive_size > int(config["dumpdir.maxdumpdirsize"]): raise InvalidUsage("Dump dir archive is too large", 413) used_space = 0.0 try: used_space = sum( float(os.path.getsize(x)) for x in map(lambda f: os.path.join(paths["dumpdir"], f), os.listdir(paths["dumpdir"])) if os.path.isfile(x)) except Exception as e: raise InvalidUsage("That's embarrasing! We have some" " troubles with disk space." " Please try again later.", 500) quota = int(config["dumpdir.cachedirectorysizequota"]) if (quota - archive_size) < used_space: raise InvalidUsage("That's embarrassing! We ran out" " of disk space." " Please try again later.", 500) fpath = os.path.join(paths["dumpdir"], archive_fname) if os.path.exists(fpath): raise InvalidUsage("Dump dir archive already exists.", 409) with open(fpath, 'w') as dest: dest.write(archive_file.read()) if request_wants_json(): response = jsonify({"ok": "ok"}) response.status_code = 201 return response else: flash("Uploaded successfully.") return render_template("dumpdirs/new.html", form=form) except InvalidUsage as e: if e.status_code == 500: logger.error(e.message) elif e.status_code >= 400: logger.warning(e.message) if request_wants_json(): response = jsonify({"error": e.message}) response.status_code = e.status_code return response else: flash(e.message, "danger") return render_template("dumpdirs/new.html", form=form), e.status_code return render_template("dumpdirs/new.html", form=form)
def adif_export_dl(username, logbook_slug): """ http://hamclubs.info/adif-validator/ """ user = User.query.filter(User.name == username).first() if not user: raise InvalidUsage("User not found", 404) logbook = Logbook.query.filter(Logbook.user_id == user.id, Logbook.slug == logbook_slug).first() if not logbook or (current_user.id != user.id): raise InvalidUsage("Logbook not found", 404) logs = logbook.logs def a(k, v): v = str(v) return "<{0}:{1}>{2} ".format(k, len(v), v) def ab(k, t, v): v = str(v) return "<{0}:{1}:{2}>{3} ".format(k, len(v), t, v) def generate(): yield "ADIF Export by AHRL\r\n" yield "\r\n" yield "<adif_ver:5>3.0.4\r\n" yield "<programid:4>AHRL\r\n" vers = "{0} git {1}".format(g.cfg["AHRL_VERSION_VER"], g.cfg["AHRL_VERSION_GIT"]) yield a("programversion", vers) + "\r\n" ct = datetime.datetime.utcnow().strftime("%Y%m%d %H%M%S") yield a("created_timestamp", ct) + "\r\n" yield ab("app_ahrl_station_callsign", "S", user.callsign) + "\r\n" yield ab("app_ahrl_operator", "S", user.callsign) + "\r\n" yield ab("app_ahrl_logbook", "I", logbook.name) + "\r\n" yield ab("app_ahrl_logbook_swl", "B", "Y" if logbook.swl else "N") + "\r\n" yield ab("app_ahrl_logbook_private", "B", "N" if logbook.public else "Y") + "\r\n" yield "\r\n" yield "<eoh>\r\n\r\n" for log in logs: counter = 0 for key in ADIF_FIELDS: if counter == 4: counter = 0 yield "\r\n" value = getattr(log, key) if value: if key == "swl" or key == "force_init": if value == 1: val = "Y" elif value == 2: val = "N" else: val = "Y" elif key == "lat": val = coordinates2adif(value, "Latitude") elif key == "lon": val = coordinates2adif(value, "Longitude") elif key == "notes": val = "".join([ i if (126 >= ord(i) >= 32) or (i == "\r") or (i == "\n") else " " for i in value ]) elif key == "iota": if len(value) == 5: val = "{0}-{1}".format(value[0:2], value[2:5]) else: val = value else: val = value yield a(key, val) counter += 1 yield "\r\n" # Manual ones if log.freq: yield a("freq", log.freq / 1000000.0) if log.freq_rx: yield a("freq", log.freq_rx / 1000000.0) if log.mode: yield a("mode", log.mode.mode) if log.time_on: yield a("qso_date", log.time_on.strftime("%Y%m%d")) yield a("time_on", log.time_on.strftime("%H%M%S")) if log.time_off: yield a("time_off", log.time_off.strftime("%H%M%S")) if log.klass: yield a("class", log.klass) if log.band: yield a("band", log.band.name) if log.comment: yield a("comment_intl", log.comment) yield "\r\n<eor>\r\n\r\n" return Response( stream_with_context(generate()), mimetype="text/plain", headers={ "Content-Disposition": "attachment;filename=qsos-{0}.adi".format(user.name) }, )