def get_canary(sigid_base64): """Return a Canary if it exists in the filesystem and database.""" if not is_sigid(sigid_base64): return None pathstr = str(sigid_base64) path = os.path.join(app.config.get('CANARIES_DIR'), pathstr) if not os.path.isfile(path): return None try: canary = Canary.query.filter( Canary.sigid_base64 == sigid_base64).one() except: return None return canary
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))