Example #1
0
def create_short():
    ''' request.data should contain url and (optional) hash '''
    try:
        data = json.loads(request.data)
    except (TypeError, ValueError):
        return jsonify({'error': "Request data must be passed in as a json string"})

    url = data.get('url')
    if url is None:
        return jsonify({'error': "No 'url' parameter present in request data"})

    try:
        hashed = data['hash']
    except KeyError:
        hashed = create_hash(url)

    try:
        if hashed in BANNED_HASHES:
            # Cannot create a banned hash
            raise DuplicateError
        create_redirect(url, hashed)
    except DuplicateError:
        return jsonify({'error': "hash '{}' already exists".format(hashed)})

    return jsonify({'redirect': "/{}".format(hashed)})
Example #2
0
    def _find_emissions_and_cache(self, detected_plate):
        """Retrieve emissions from database and write to cache for sending.
        If license plate is known and found then actual emissions are read,
        otherwise average for the vehicle type is used.

        Args:
            detected_plate (str): License plate text or string identifier for an unknown vehicle

        TODO:
            Write average vehicle to cache

        Returns:
            bool: True if emission caching was successful
        """
        plate_text = detected_plate["plate_text"]
        if plate_text.startswith(UNKNOWN_VEHICLE_PREFIX):
            # TODO: retrieve average emissions based on detected_plate["label"]
            return True
        else:
            vehicle = self.DB.get_vehicle(create_hash(plate_text))

            if vehicle:
                self.DB.write_cache(str(detected_plate["timestamp"]), vehicle)
                return True

        return False
Example #3
0
 def reset(self):
     if self.pw_entry.get() != self.confpw_entry.get():
         tkMessageBox.showwarning("Reset Failed", "The passwords do not match."
                                  " Please re-enter matching passwords.")
     else:
         hashedpw = hasher.create_hash(self.pw_entry.get())
         database.change_password(self.studentID, hashedpw)
         self.destroy()
Example #4
0
    def import_data(self):
        """Import data if DATABASE_IMPORT file exists"""
        if not os.path.exists(self.import_file):
            logging.error("No import file present: {}".format(self.import_file))
            return

        logging.info("Deleting existing data")
        self.cursor.execute("DELETE FROM emissions;")
        logging.info("Importing data")
        lastmsg = time.time()
        started = time.time()
        with open(self.import_file, "rt") as fp:
            reader = csv.reader(fp, delimiter=";")
            values = []
            for i, row in enumerate(reader):
                if "-" not in row[0]:
                    continue
                plate = row[0].strip().replace("-", "")
                ct = row[1].strip()
                gt = row[2].strip()
                try:
                    co2 = int(row[3].strip())
                except ValueError:
                    co2 = None

                values.append(
                    self.cursor.mogrify(
                        "(%s,%s,%s,%s)", (create_hash(plate), co2, ct, gt)
                    ).decode("utf-8")
                )
                if i % 50000 == 0:
                    self.cursor.execute(
                        """INSERT INTO emissions(hash, co2, car_type, gas_type)
                       VALUES """
                        + ",".join(values)
                        + """ ON CONFLICT DO NOTHING;"""
                    )
                    self.connect.commit()
                    values = []
                    if time.time() - lastmsg > 10:
                        logging.info("Imported {} records ...".format(i))
                        lastmsg = time.time()

            if len(values) > 0:
                self.cursor.execute(
                    """INSERT INTO emissions(hash, co2, car_type, gas_type)
                       VALUES """
                    + ",".join(values)
                    + """ ON CONFLICT DO NOTHING;"""
                )
                values = []
                self.cursor.execute("SELECT count(*) FROM emissions;")
            if time.time() - lastmsg > 10:
                logging.info(
                    "Imported {} records in {}s".format(i, time.time() - started)
                )
            self.connect.commit()
        return
Example #5
0
    def _process_files(self, files):
        """Process set of files and remove after them after processing

        Args:
            files (List): List of frame metadata
        """
        if len(files) == 0:
            return

        self.raw_plate_history = []
        logging.info("LAG: {}".format(datetime.datetime.now() -
                                      files[0]["timestamp"]))
        for file in files:
            # Yolo saw an object here
            if len(file["metadata"]["detections"]) > 0:
                plate = self._get_plate(file["path"])
                try:
                    for temp in plate["results"]:
                        logging.info("ALPR like: {}".format(
                            get_obfuscated_plate(temp["plate"])))
                except Exception:
                    pass
                file["plates"] = plate
                self.raw_plate_history.append(file)

            # Delete files when data has been read
            try:
                os.remove(file["path"])
            except FileNotFoundError:
                pass
            try:
                os.remove(file["path"].replace(".jpg", ".json"))
            except FileNotFoundError:
                pass

        # analyse known plates
        roi_plates = self.analyser.analyse_plates(self.raw_plate_history)

        for detected_plate in roi_plates:
            self._find_emissions_and_cache(detected_plate)
            plate_text = detected_plate["plate_text"]
            plate_hashed = create_hash(plate_text)
            if self.reveal_plate:
                logging.info(f"ROI: {self.roi_id}, {plate_text}")
            else:
                logging.info(f"ROI: {self.roi_id}, {plate_hashed}")
Example #6
0
    def register(self):
        if not self.type_selected:
            tkMessageBox.showwarning("Registration Failure", "Must select if creating a " "student or teacher account.")
            return

        if (self.tpw_entry != None) and (self.tpw_entry.get() != "engineering"):
            tkMessageBox.showwarning(
                "Registration Failure", "Must enter correct password " "to create teacher account."
            )
            return
        name = self.name_entry.get()
        username = self.username_entry.get()
        password = self.password_entry.get()
        password_conf = self.confpw_entry.get()
        for x in [name, username, password, password_conf]:
            if x == "":
                tkMessageBox.showwarning("Registration Failure", "Please complete all fields.")
                return
        if password != password_conf:
            # Pop up window saying that passwords do not match
            tkMessageBox.showwarning(
                "Registration Failure",
                "The passwords you have entered do not match. "
                "Ensure that your passwords are matching and try again.",
            )
            return
        if self.type_selected == "student":
            account_type = "student"
        else:
            account_type = "teacher"
        if database.username_exists(username):
            tkMessageBox.showwarning(
                "Registration Failure",
                "The username that you have selected already exists. " "Please choose a different username.",
            )
            return
        else:
            database.create_user(name, username, account_type, hasher.create_hash(password))
            self.destroy()
            login = LoginScreen(master=self.master)
            login.pack()
Example #7
0
def test_hash_length():
    assert len(create_hash("ABC123")) == 24
Example #8
0
def test_hash_differs_from_input():
    assert create_hash("ABC123") != "ABC123"