def send_email(): captcha = FlaskSessionCaptcha(app) cform = ContactForm(request.values) tmpl = tmpl_picker('contact') reply = tmpl_picker('autoreply') if request.method == 'POST': if cform.validate_on_submit(): if captcha.validate(): try: mail = Mail(app) msg = Message(">>> message from SciBook: " + cform.data["subject"], sender=cform.data["email"], recipients=[app.config["EMAIL_1"]]) msg.add_recipient(app.config["EMAIL_2"]) msg.body = cform.data["msg"] + "\n\n" + "signed as from:\n" + cform.data["email"] mail.send(msg) flash("Your message is sent!", category='info') return render_template(reply, form=g.form, cform=cform) except: flash("Your message is not sent fast way... Something went wrong, we are soory, but we look at your message a bit later", category='error') return render_template(reply, form=g.form, cform=cform) else: flash("Captcha is wrong!", category='error') return render_template(tmpl, form=g.form, cform=cform, email=cform.data["email"], subject=cform.data["subject"], msg=cform.data["msg"], topics=g.topics) else: flash("All fields are necessary to fill in!", category='error') return render_template(tmpl, form=g.form, cform=cform, email=cform.data["email"], subject=cform.data["subject"], msg=cform.data["msg"], topics=g.topics) else: return render_template(tmpl, form=g.form, cform=cform, topics=g.topics)
def test_captcha_with_init_app_ok(self): captcha = FlaskSessionCaptcha() _default_routes(captcha, self.app) captcha.init_app(self.app) # everything ok r = self.client.get("/") r = self.client.post("/", data={"s": "something", "captcha": r.data.decode('utf-8')}) assert r.data == b"ok"
def test_captcha_jinja_global(self): captcha = FlaskSessionCaptcha(self.app) with self.app.test_request_context('/'): function = self.app.jinja_env.globals['captcha'] assert not captcha.get_answer() img = function() assert "<img" in img assert captcha.get_answer()
def test_captcha_session_key_default(self): captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) with self.app.test_request_context('/'): captcha.generate() answer = captcha.get_answer() assert self.app.config['CAPTCHA_SESSION_KEY'] == "captcha_answer" assert session.get("captcha_answer") == answer
def test_captcha_with_defined_width_and_height(self): self.app.config['CAPTCHA_WIDTH'] = 400 self.app.config['CAPTCHA_HEIGHT'] = 150 captcha = FlaskSessionCaptcha() _default_routes(captcha, self.app) captcha.init_app(self.app) r = self.client.get("/") r = self.client.post("/", data={"s": "something", "captcha": r.data.decode('utf-8')}) assert r.data == b"ok"
def test_captcha_warning_on_non_server_storage(self): self.app.config['SESSION_TYPE'] = 'null' Session(self.app) with self.assertRaises(RuntimeWarning): FlaskSessionCaptcha(self.app) self.app.config['SESSION_TYPE'] = None Session(self.app) with self.assertRaises(RuntimeWarning): FlaskSessionCaptcha(self.app)
def test_captcha_validate_value(self): captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) with self.app.test_request_context('/'): captcha.generate() answer = captcha.get_answer() assert not captcha.validate(value="wrong") captcha.generate() answer = captcha.get_answer() assert captcha.validate(value=answer)
def test_captcha_jinja_global_empty_while_disabled(self): self.app.config["CAPTCHA_ENABLE"] = False captcha = FlaskSessionCaptcha(self.app) with self.app.test_request_context('/'): function = self.app.jinja_env.globals['captcha'] try: captcha.get_answer() assert False except: pass img = function() assert img == ""
def test_captcha_least_digits(self): self.app.config["CAPTCHA_LENGTH"] = 8 captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) r = self.client.get("http://localhost:5000/") captcha_value = r.data.decode('utf-8') assert len(captcha_value) == 8
def test_captcha_session_file_storage(self): self.app.config['SESSION_TYPE'] = 'filesystem' Session(self.app) captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) r = self.client.get("/") r = self.client.post("/", data={"s": "something", "captcha": r.data.decode('utf-8')}) assert r.data == b"ok"
def test_captcha_without_cookie(self): captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) # without right cookie r = self.client.get("/") self.client.set_cookie("localhost", "session", "wrong") r = self.client.post("/", data={"s": "something", "captcha": r.data.decode('utf-8')}) assert r.data == b"nope" # no session
def test_captcha_wrong(self): captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) # try some wrong values r = self.client.post("/", data={"s": "something"}) assert r.data == b"nope" r = self.client.post("/", data={"s": "something", "captcha": ""}) assert r.data == b"nope" r = self.client.post("/", data={"s": "something", "captcha": "also wrong"}) assert r.data == b"nope"
def create_app(): """Construct the core application.""" app = Flask(__name__, instance_relative_config=False) app.register_blueprint(auth_bp, url_prefix='/auth') app.register_blueprint(errors_bp, url_prefix='/error') app.config.from_object('config.Config') db.init_app(app) store.bind(db) login_manager.init_app(app) Session(app) captcha = FlaskSessionCaptcha(app) captcha.init_app(app) with app.app_context(): from . import routes # Import routes db.create_all() # Create sql tables for our data models return app
def test_captcha_passthrough_when_disabled(self): self.app.config["CAPTCHA_ENABLE"] = False captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) r = self.client.post("/", data={"s": "something"}) assert r.data == b"ok" r = self.client.get("/") captcha_value = r.data.decode('utf-8') r = self.client.post("/", data={"s": "something", "captcha": captcha_value}) assert r.data == b"ok" r = self.client.post("/", data={"s": "something", "captcha": "false"}) assert r.data == b"ok"
def test_captcha_replay(self): captcha = FlaskSessionCaptcha(self.app) _default_routes(captcha, self.app) r = self.client.get("/") captcha_value = r.data.decode('utf-8') cookies = self.client.cookie_jar._cookies['localhost.local']['/']['session'] r = self.client.post("/", data={"s": "something", "captcha": captcha_value}) assert r.data == b"ok" self.client.set_cookie("localhost", "session", cookies.value) r = self.client.post("/", data={"s": "something", "captcha": captcha_value}) assert r.data == b"nope"
def test_captcha_session_key_can_be_set(self): captcha = FlaskSessionCaptcha(self.app) new_session_key = 'other-key-in-session' captcha.session_key = new_session_key _default_routes(captcha, self.app) with self.app.test_request_context('/'): captcha.generate() answer = captcha.get_answer() assert not session.get(self.app.config['CAPTCHA_SESSION_KEY']) assert session.get(new_session_key) == answer
def __init__(self, *args, **kwargs): FlaskSessionCaptcha.__init__(self, *args, **kwargs)
app = Flask(__name__) # Database Config # If your mongodb runs on a different port # change 33017 to that port number mongoClient = MongoClient('localhost', 33017) app.config["SECRET_KEY"] = uuid.uuid4() app.config['CAPTCHA_ENABLE'] = True app.config['CAPTCHA_LENGTH'] = 5 app.config['CAPTCHA_WIDTH'] = 160 app.config['CAPTCHA_HEIGHT'] = 60 app.config['SESSION_MONGODB'] = mongoClient app.config['SESSION_TYPE'] = 'mongodb' Session(app) captcha = FlaskSessionCaptcha(app) @app.route('/', methods=['POST', 'GET']) def some_route(): if request.method == "POST": if captcha.validate(): return "success" else: return "fail" return render_template("form.html") if __name__ == "__main__": app.debug = True
def create_app(): app = Flask(__name__) # sessionを使う際にSECRET_KEYを設定 app.config['SECRET_KEY'] = b'R\x1c`\x8d\xed_\xe5\xd6\x8d\xef\xc6\x19g- J' # ここから /// 画像アップロードの設定 # 画像のアップロード先のディレクトリ app.config["IMAGE_UPLOADS"] = 'flmapp/static/user_image' app.config["ORIGINAL_IMAGE_UPLOADS"] = 'flmapp/static/original_user_image' app.config["ITEM_IMAGE_UPLOADS"] = 'flmapp/static/item_image' app.config["ITEM_TEMP_IMAGE_UPLOADS"] = 'flmapp/static/item_temp_image' app.config[ "ORIGINAL_ITEM_IMAGE_UPLOADS"] = 'flmapp/static/original_item_image' # アップロードされる拡張子の制限 app.config["ALLOWED_IMAGE_EXTENSIONS"] = ["JPEG", "JPG", "PNG", "GIF"] # 画像サイズの制限 app.config["MAX_IMAGE_FILESIZE"] = 0.5 * 1024 * 1024 # ここまで /// 画像アップロードの設定 # ここから /// データベースの設定 # DBはSQLiteを使う #! パスを変えてください app.config['SQLALCHEMY_DATABASE_URI'] = \ 'sqlite:///' + "/Users/shimomuramei/Desktop/set_prefs/data.sqlite" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SQLALCHEMY_ECHO'] = False # ここまで /// データベースの設定 # ここから /// メール送信の設定 app.config['DEBUG'] = True # デバッグのサポート app.config['TESTING'] = False app.config['MAIL_SERVER'] = 'smtp.gmail.com' app.config['MAIL_PORT'] = 587 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USE_SSL'] = False app.config['MAIL_USERNAME'] = '******' app.config['MAIL_PASSWORD'] = '******' app.config['MAIL_DEFAULT_SENDER'] = '*****@*****.**' app.config['MAIL_MAX_EMAILS'] = 5 #送信するメールの最大数 app.config['MAIL_SUPPRESS_SEND'] = False app.config['MAIL_ASCII_ATTACHHMENTS'] = False # ここまで /// メール送信の設定 # ここから /// キャプチャの設定 app.config['CAPTCHA_ENABLE'] = True app.config['CAPTCHA_LENGTH'] = 5 app.config['CAPTCHA_WIDTH'] = 160 app.config['CAPTCHA_HEIGHT'] = 100 app.config['SESSION_TYPE'] = 'sqlalchemy' # ここまで /// キャプチャの設定 db.init_app(app) migrate.init_app(app, db) login_manager.init_app(app) mail.init_app(app) Session(app) captcha = FlaskSessionCaptcha(app) CSRFProtect(app) # カスタムテンプレートフィルターの登録 app.add_template_filter(replace_newline) # 分割したblueprintを登録する from flmapp.views import (auth, mypage, route, sell, item, buy, transaction, ajax, user, history, search, todolist) app.register_blueprint(auth.bp) app.register_blueprint(mypage.bp) app.register_blueprint(route.bp) app.register_blueprint(sell.bp) app.register_blueprint(item.bp) app.register_blueprint(buy.bp) app.register_blueprint(transaction.bp) app.register_blueprint(ajax.bp) app.register_blueprint(user.bp) app.register_blueprint(history.bp) app.register_blueprint(search.bp) app.register_blueprint(todolist.bp) return app