[docs]defvalidate_image(stream:t.IO[bytes])->str|None:"""Confirm an image is what it claims to be. :param stream: Bytes stream. :return: String if file valid, else None for invalid file. """header=stream.read(512)stream.seek(0)_format=imghdr.what(None,header)ifnot_format:returnNonereturnf".{_formatif_format!='jpeg'else'jpg'}"
[docs]@csrf_protect.exempt@blueprint.route("/favicon",methods=["GET","POST"])@login_required@admin_requireddeffavicon()->str|Response:"""Upload a favicon. :return: Template or response object. """form=UploadForm()ifform.validate_on_submit():file=Path(secure_filename(form.file.data.filename))iffile.suffixnotincurrent_app.config["UPLOAD_EXTENSIONS"]orfile.suffix!=validate_image(form.file.data.stream):flash(f"{file} is not a valid {file.suffix} file,"" cannot confirm validity of file")abort(400)path=current_app.config["UPLOAD_PATH"]/fileform.file.data.save(path)os.rename(path,path.parent/"favicon.ico")flash(f"{form.file.data.filename} uploaded successfully")returnredirect(url_for("upload.favicon"))returnrender_template("upload.html",form=form)