def delete(self, path): """Delete the canary in the filesystem and database, and delete the canary's publisher if this is the user's only canary. """ os.unlink(path) if len(self.user.canaries) == 1: db_session.delete(self.user) if "uid" in session: session.pop("uid") if "fp" in session: session.pop("fp") db_session.delete(self) db_session.commit()
def canary(sigid_base64): if request.method == 'GET': canary = get_canary(sigid_base64) if canary is None: return page_not_found('canary') pathstr = str(sigid_base64) path = os.path.join(app.config.get('CANARIES_DIR'), pathstr) f = open(path, 'r') text = f.read() f.close() return dict(canary=canary, text=text) if request.method == 'POST': if not is_sigid(sigid_base64): return redirect(url_for('index')) try: canary = Canary.query.filter( Canary.sigid_base64 == sigid_base64).one() decrypted = request.form['decrypted'].strip() if not Challenge.check(canary, decrypted): raise IncorrectChallengeException except KeyError: flash(err_messages['incomplete_form'], 'error') return None except IncorrectChallengeException: db_session.delete(canary) db_session.commit() flash(err_messages['decrypt_fail'], 'error') return redirect(url_for('new_canary')) except Exception as e: flash(err_messages['generic'], 'error') app.logger.error(e) return redirect(url_for('new_canary')) sess = session['canary'] fp = sess['fp'] try: user = User.query.filter(User.fingerprint == fp).one() """Update the existing user's key info, in case the username or email address has been edited since we last saw it.""" user.update(canary['uid']) except NoResultFound: # Create a new user user = User(sess['keyid'], fp, sess['uid']) db_session.add(user) db_session.commit() canary.user_id = user.id canary.active = True db_session.commit() with app.app_context(): text = sess['text'] if app.testing: notify(canary, user, text) else: notify.delay(canary, user, text) pathstr = str(sigid_base64) path = os.path.join(app.config.get('CANARIES_DIR'), pathstr) with open(path, 'w') as f: f.write(text) f.close() flash(messages['published'], 'message') return redirect(url_for('canary', sigid_base64=sigid_base64))