def web_app_login(self, email): try: socketio.emit('open', "Opening web app...") # first login try add_running_account(email) self.driver = create_driver_instance(email) self.element_actions = ElementActions(self.driver) existing_account = check_account_if_exists(email) if existing_account["cookies"]: self.login_with_cookies(existing_account["cookies"]) else: self.login_first_time() return self._launch() except TimeoutException as e: close_driver(email) return server_response( code=503, msg=server_status_messages.COULD_NOT_GET_SID) except UserNotFound as e: close_driver(email) return server_response(code=401, msg=e.reason) except AuthCodeRequired as e: return server_response(msg=e.reason, codeRequired=True) except WebAppLoginError as e: close_driver(email) return server_response(code=e.code, msg=e.reason) except MaxRetryError as e: close_driver(email) return server_response(code=503, msg=server_status_messages.DRIVER_OPEN_FAIL)
def set_selected_filter(account, filter_id): found_filter = db.ea_accounts_collection.find_one({'email': account}, {"search_filters": {"$elemMatch": {"id": filter_id}}})['search_filters'][0] if not found_filter: return server_response(code=503, msg=server_status_messages.MAIN_SEARCH_FILTER_SET_FAIL) res = db.ea_accounts_collection.update_one({'email': account}, {"$set": {"selected_search_filter": found_filter['id']}}) if res.modified_count > 0: return server_response(code=200, msg=server_status_messages.MAIN_SEARCH_FILTER_SET_SUCESS) return server_response(code=503, msg=server_status_messages.MAIN_SEARCH_FILTER_SET_FAIL)
def add_new_ea_account(owner, email): if check_account_if_exists(email): return server_response(msg=server_status_messages.EA_ACCOUNT_REGISTERED, code=400) new_account = EaAccount(owner, email).__dict__ try: db.ea_accounts_collection.insert_one(new_account) return server_response(owner=owner, msg=server_status_messages.EA_ACCOUNT_ADD_SUCCESS, code=201) except: return server_response(msg=server_status_messages.EA_ACCOUNT_ADD_FAILED, code=500)
def log_in_user(username, password): user = db.users_collection.find_one({"username": username}) if not user: return server_response(msg=server_status_messages.LOGIN_FAILED, code=401) if bcrypt.hashpw(password.encode('utf-8'), user["password"]) == user["password"]: access_token = create_access_token(username, expires_delta=datetime.timedelta(seconds=5)) refresh_token = create_refresh_token(username, expires_delta=datetime.timedelta(days=1)) access_tokens[username] = (access_tokens.get(username) or []) + [access_token] refresh_tokens[username] = (refresh_tokens.get(username) or []) + [refresh_token] return server_response(msg=server_status_messages.LOGIN_SUCCESS, access_token=access_token, refresh_token=refresh_token) else: return server_response(msg=server_status_messages.LOGIN_FAILED, code=401)
def update_user_password(username, new_password): new_hashed_password = hash_password(new_password) result = db.users_collection.update_one( {"username": username}, {"$set": { "password": new_hashed_password }}) if result.modified_count > 0: return server_response( msg=server_status_messages.USER_PASSWORD_UPDATE_SUCCESS, code=200) else: return server_response( msg=server_status_messages.USER_PASSWORD_UPDATE_FAILED, code=500)
def create_new_user(username, password): is_new_user = _check_if_new_user(username) if is_new_user: hashed_password = hash_password(password) new_user = User(username, hashed_password).__dict__ result = db.users_collection.insert(new_user) if result: return server_response(msg=server_status_messages.USER_CREATE_SUCCESS, code=201) else: return server_response(msg=server_status_messages.USER_CREATE_FAILED, code=500) else: return server_response(msg=server_status_messages.USER_EXISTS, code=409)
def edit_password(username): json_data = request.get_json() if json_data.get('username') != username: return server_response(status=server_status_messages.AUTH_FAILED, code=401) new_password = json_data.get('new_password') return update_user_password(username, new_password)
def determine_if_func_should_run(*args): json_data = request.get_json() email = json_data.get('email') login_attempt = login_attempts.get(email) if not login_attempt: return server_response(status='not authenticated', code=401) return func(login_attempt)
def ea_web_app_disconnect(owner): json_data = request.get_json() email = json_data.get('email') if not authenticated_accounts.get(email): return server_response(code=403, msg="Account is already disconnected") authenticated_user = authenticated_accounts.get(email) return authenticated_user.disconnect()
def disconnect(self): close_driver(self.email) if authenticated_accounts.get(self.email): del authenticated_accounts[self.email] update_ea_account_status(self.email, EaAccountStatus.DISCONNECTED) return server_response( msg=server_status_messages.EA_ACCOUNT_DISCONNECT_SUCCESS, code=200)
def start_loop(): json_data = request.get_json() email = json_data['email'] if not authenticated_accounts.get(email): return server_response(code=403, msg="Please connect first before running") configuration = json_data['configuration'] search_parameters = json_data['search_parameters'] return start_loop_run(authenticated_accounts.get(email), search_parameters, configuration)
def edit_username(username): json_data = request.get_json() # make sure to log again to fetch an updated useraname if json_data.get('username') != username: return server_response(status=server_status_messages.AUTH_FAILED, code=401) new_username = json_data.get('new_username') return update_user_username(username, new_username)
def login_with_code(self, email, auth_code): try: self._set_status_code(auth_code) self._remember_account() return self._launch() except TimeoutException as e: close_driver(self.email) return server_response( code=503, msg=server_status_messages.COULD_NOT_GET_SID) except WebAppLoginError as e: # dont close the driver if code is incorrect if e.reason != server_status_messages.WRONG_STATUS_CODE: close_driver(email) return server_response(msg=e.reason) except MaxRetryError as e: close_driver(email) return server_response(code=503, msg=server_status_messages.DRIVER_OPEN_FAIL)
def update_user_username(old_username, new_username): users_collection_result = db.users_collection.update_one( {"username": old_username}, {"$set": { "username": new_username }}) if users_collection_result.modified_count == 0: return server_response( msg=server_status_messages.USERNAME_UPDATE_FAILED, code=500) # update all the accounts that the owner is the old username to the new one ea_accounts_collection_result = db.ea_accounts_collection.update_many( {"owner": old_username}, {"$set": { "owner": new_username }}) if ea_accounts_collection_result.modified_count == 0: return server_response( msg=server_status_messages.USERNAME_UPDATE_FAILED, code=500) return server_response(msg=server_status_messages.USERNAME_UPDATE_SUCESSS, code=200)
def determine_if_func_should_run(*args): json_data = request.get_json() email = json_data.get('email') # check if owner or username fields exist user_account = db.ea_accounts_collection.find_one({"email": email}) # first login if not user_account["password"]: return server_response(msg="should login first", code=200) password = decrypt_password(user_account["password"]) return func(user_account.get('owner'), email, password)
def _launch(self): socketio.emit('correctCredentials', "Login Success. Launching web app... ") self.element_actions.check_if_web_app_is_available() self._set_sid_from_requests() self._set_fut_host() self._add_authenticated_ea_account() close_driver(self.email) print("sid = " + self.sid) if self.sid else print("NO SID found") if self.sid: update_ea_account_status(self.email, EaAccountStatus.CONNECTED) return server_response(msg=server_status_messages.LOGIN_SUCCESS, code=200) raise WebAppLoginError( reason=server_status_messages.WEB_APP_NOT_AVAILABLE, code=503)
def determine_if_func_should_run(*args): owner = get_jwt_identity() json_data = request.get_json() email = json_data.get('email') # check if owner or username fields exist user_account = db.ea_accounts_collection.find_one({"email": email}) # first login if user_account is None: return func(owner) account_owner = user_account.get('owner') if account_owner != owner: return server_response( msg=server_status_messages.EA_ACCOUNT_BELONGS_TO_ANOTHER_USER, code=503) else: return func(owner)
def start_loop_run(ea_account: SeleniumLogin, search_parameters, configuration): loop_thread = threading.Thread(target=start_fab_loop, args=(ea_account,search_parameters,configuration,), daemon=True) loop_thread.start() update_ea_account_status(ea_account.email, EaAccountStatus.RUNNING) return server_response(code=200, msg="Running request accepted")
def determine_if_driver_should_open(*args, **kwargs): if request.get_json().get('email') in running_accounts: return server_response( msg=server_status_messages.ACCOUNT_ALREADY_RUNNING, code=503) return func(*args, **kwargs)
def delete_ea_account_from_user(owner, email): ea_accounts_result = db.ea_accounts_collection.delete_one({"owner": owner, "email": email}) if ea_accounts_result.deleted_count == 0: return server_response(msg=server_status_messages.EA_ACCOUNT_DELETE_FAILED, code=400) return server_response(msg=server_status_messages.EA_ACCOUNT_DELETE_SUCCESS, code=200)
def determine_if_func_should_run(**kwargs): token = request.headers.get('Authorization').split()[1] username = get_jwt_identity() if token not in access_tokens.get(username) and token not in refresh_tokens.get(username): return server_response(msg=server_status_messages.AUTH_FAILED, code=401) return func(username, **kwargs)
def update_ea_account_status(email, status): res = db.ea_accounts_collection.update_one({"email": email}, {"$set": {"status": status.value}}, upsert=True) if res.modified_count > 0 and status == EaAccountStatus.RUNNING: return server_response(code=200, msg=server_status_messages.EA_ACCOUNT_LOGIN_SUCCESS) return server_response(code=200, msg=server_status_messages.EA_ACCOUNT_RUNNING_SUCCESS)
def remove_search_filter_to_account(account, filter_id): res = db.ea_accounts_collection.update_one({'email': account}, {"$pull": {"search_filters": {"id": filter_id}}}) if res.modified_count > 0: return server_response(code=200, msg=server_status_messages.SEARCH_FILTER_REMOVE_SUCCESS) return server_response(code=503, msg=server_status_messages.SEARCH_FILTER_REMOVE_FAIL)
def add_search_filter_to_account(account, search_filter): res = db.ea_accounts_collection.update_one({'email': account}, {"$push": {"search_filters": search_filter}}) if res.modified_count > 0: return server_response(code=201, msg=server_status_messages.NEW_SEARCH_FILTER_ADD_SUCCESS) return server_response(code=503, msg=server_status_messages.NEW_SEARCH_FILTER_ADD_FAIL)