From 1eee6291020ffccc40ea71060f1f1a19541f73b6 Mon Sep 17 00:00:00 2001 From: maxime Date: Mon, 30 Mar 2026 18:09:36 +0200 Subject: [PATCH] liaison rfid --- .../__pycache__/alarme.cpython-311.pyc | Bin 0 -> 10756 bytes flask/.env | 6 + .../RPi.GPIO-0.7.1.egg-info/PKG-INFO | 260 +++++++ .../RPi.GPIO-0.7.1.egg-info/SOURCES.txt | 31 + .../dependency_links.txt | 1 + .../installed-files.txt | 9 + .../RPi.GPIO-0.7.1.egg-info/top_level.txt | 1 + .../site-packages/RPi/GPIO/__init__.py | 25 + .../GPIO/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 364 bytes .../RPi/_GPIO.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 143088 bytes .../python3.11/site-packages/RPi/__init__.py | 0 .../RPi/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 203 bytes .../flask_talisman-1.1.0.dist-info/INSTALLER | 1 + .../flask_talisman-1.1.0.dist-info/LICENSE | 201 ++++++ .../flask_talisman-1.1.0.dist-info/METADATA | 490 +++++++++++++ .../flask_talisman-1.1.0.dist-info/RECORD | 13 + .../flask_talisman-1.1.0.dist-info/REQUESTED | 0 .../flask_talisman-1.1.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/flask_talisman/__init__.py | 31 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 630 bytes .../__pycache__/talisman.cpython-311.pyc | Bin 0 -> 19045 bytes .../__pycache__/talisman_test.cpython-311.pyc | Bin 0 -> 19921 bytes .../site-packages/flask_talisman/talisman.py | 465 ++++++++++++ .../flask_talisman/talisman_test.py | 344 +++++++++ .../mfrc522-0.0.7.dist-info/INSTALLER | 1 + .../mfrc522-0.0.7.dist-info/LICENSE | 674 ++++++++++++++++++ .../mfrc522-0.0.7.dist-info/METADATA | 50 ++ .../mfrc522-0.0.7.dist-info/RECORD | 13 + .../mfrc522-0.0.7.dist-info/REQUESTED | 0 .../mfrc522-0.0.7.dist-info/WHEEL | 5 + .../mfrc522-0.0.7.dist-info/top_level.txt | 1 + .../site-packages/mfrc522/MFRC522.py | 425 +++++++++++ .../site-packages/mfrc522/SimpleMFRC522.py | 90 +++ .../site-packages/mfrc522/__init__.py | 4 + .../__pycache__/MFRC522.cpython-311.pyc | Bin 0 -> 18209 bytes .../__pycache__/SimpleMFRC522.cpython-311.pyc | Bin 0 -> 5914 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 325 bytes .../spidev-3.8.dist-info/INSTALLER | 1 + .../spidev-3.8.dist-info/METADATA | 276 +++++++ .../site-packages/spidev-3.8.dist-info/RECORD | 7 + .../site-packages/spidev-3.8.dist-info/WHEEL | 5 + .../spidev-3.8.dist-info/licenses/LICENSE | 21 + .../spidev-3.8.dist-info/top_level.txt | 1 + .../spidev.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 92528 bytes 45 files changed, 3459 insertions(+) create mode 100644 composants/byPanda/__pycache__/alarme.cpython-311.pyc create mode 100644 flask/.env create mode 100644 venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/PKG-INFO create mode 100644 venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/SOURCES.txt create mode 100644 venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/dependency_links.txt create mode 100644 venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/installed-files.txt create mode 100644 venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/RPi/GPIO/__init__.py create mode 100644 venv/lib/python3.11/site-packages/RPi/GPIO/__pycache__/__init__.cpython-311.pyc create mode 100755 venv/lib/python3.11/site-packages/RPi/_GPIO.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/RPi/__init__.py create mode 100644 venv/lib/python3.11/site-packages/RPi/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/LICENSE create mode 100644 venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/flask_talisman/__init__.py create mode 100644 venv/lib/python3.11/site-packages/flask_talisman/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/flask_talisman/__pycache__/talisman.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/flask_talisman/__pycache__/talisman_test.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/flask_talisman/talisman.py create mode 100644 venv/lib/python3.11/site-packages/flask_talisman/talisman_test.py create mode 100644 venv/lib/python3.11/site-packages/mfrc522-0.0.7.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/mfrc522-0.0.7.dist-info/LICENSE create mode 100644 venv/lib/python3.11/site-packages/mfrc522-0.0.7.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/mfrc522-0.0.7.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/mfrc522-0.0.7.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/mfrc522-0.0.7.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/mfrc522-0.0.7.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/mfrc522/MFRC522.py create mode 100644 venv/lib/python3.11/site-packages/mfrc522/SimpleMFRC522.py create mode 100644 venv/lib/python3.11/site-packages/mfrc522/__init__.py create mode 100644 venv/lib/python3.11/site-packages/mfrc522/__pycache__/MFRC522.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mfrc522/__pycache__/SimpleMFRC522.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/mfrc522/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/spidev-3.8.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/spidev-3.8.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/spidev-3.8.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/spidev-3.8.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/spidev-3.8.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/spidev-3.8.dist-info/top_level.txt create mode 100755 venv/lib/python3.11/site-packages/spidev.cpython-311-x86_64-linux-gnu.so diff --git a/composants/byPanda/__pycache__/alarme.cpython-311.pyc b/composants/byPanda/__pycache__/alarme.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e57cc9de0db36da9d4547a01e2a8843152d3f40 GIT binary patch literal 10756 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 literal 0 HcmV?d00001 diff --git a/flask/.env b/flask/.env new file mode 100644 index 0000000..7b11113 --- /dev/null +++ b/flask/.env @@ -0,0 +1,6 @@ +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_USER=python +DB_PASSWORD=wolaouais +DB_NAME=Utilisateurs +DB_CHARSET=utf8mb4 \ No newline at end of file diff --git a/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/PKG-INFO b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/PKG-INFO new file mode 100644 index 0000000..738b65a --- /dev/null +++ b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/PKG-INFO @@ -0,0 +1,260 @@ +Metadata-Version: 2.1 +Name: RPi.GPIO +Version: 0.7.1 +Summary: A module to control Raspberry Pi GPIO channels +Home-page: http://sourceforge.net/projects/raspberry-gpio-python/ +Author: Ben Croston +Author-email: ben@croston.org +License: MIT +Keywords: Raspberry Pi GPIO +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: POSIX :: Linux +Classifier: License :: OSI Approved :: MIT License +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development +Classifier: Topic :: Home Automation +Classifier: Topic :: System :: Hardware +License-File: LICENCE.txt + +This package provides a Python module to control the GPIO on a Raspberry Pi. + +Note that this module is unsuitable for real-time or timing critical applications. This is because you +can not predict when Python will be busy garbage collecting. It also runs under the Linux kernel which +is not suitable for real time applications - it is multitasking O/S and another process may be given +priority over the CPU, causing jitter in your program. If you are after true real-time performance and +predictability, buy yourself an Arduino http://www.arduino.cc ! + +Note that the current release does not support SPI, I2C, hardware PWM or serial functionality on the RPi yet. +This is planned for the near future - watch this space! One-wire functionality is also planned. + +Although hardware PWM is not available yet, software PWM is available to use on all channels. + +For examples and documentation, visit http://sourceforge.net/p/raspberry-gpio-python/wiki/Home/ + +Change Log +========== + +0.7.1 +------- +- Better RPi board + peri_addr detection (issue 190 / 191) +- Fix PyEval_InitThreads deprecation warning for Python 3.9 (issue 188) +- Fix build using GCC 10 (issue 187) +- Fix docstrings to not include licence +- Remove Debian/Raspbian stretch packaging support +- Use setuptools instead of distutils +- Added detection of Zero 2 W +- Tested and working with Python 2.7, 3.7, 3.8, 3.9, 3.10 + +0.7.0 +----- +- Updated RPI_INFO to include RPi 4B +- Fixed pull up/down for Pi4 (issue 168) +- Fix spelling mistake in docstrings +- Tested and working on Raspbian Buster + Python 3.8.0b2 +- Fix board detection for aarch64 (Issues 161 / 165) +- Fix checking mmap return value in c_gpio.c (issue 166) + +0.6.5 +----- +- Fix exception on re-export of /sys/class/gpio/gpioNN + +0.6.4 +----- +- Event cleanup bug (issue 145) +- Raise exception for duplicate PWM objects (issue 54 - Thijs Schreijer ) +- Fix build warnings (Issue 146 - Dominik George) +- test.py runs unchanged for both python 2+3 +- Soft PWM stops running fix (Issues 94, 111, 154) +- Soft PWM segfault fix (Luke Allen pull request) + +0.6.3 +----- +- Fix code so it builds under PyPy (Gasper Zejn) +- os.system breaks event detection - Matt Kimball (issue 127) + +0.6.2 +----- +- Rewrote Debian packaging mechanism +- RPI_INFO reports Pi 3 +- Changed module layout - moved C components to RPi._GPIO + +0.6.1 +----- +- Update RPI_INFO to detect more board types +- Issue 118 - add_event_detect sometimes gives runtime error with unpriv user +- Issue 120 - setmode() remembers invalid mode + +0.6.0a3 +------- +- Now uses /dev/gpiomem if available to avoid being run as root +- Fix warnings with pull up/down on pins 3/5 +- Correct base address on Pi 2 when devicetree is disabled +- caddr_t error on compile (Issue 109) +- Error on invalid parameters to setup() (issue 93) +- Add timeout parameter to wait_for_edge() (issue 91) + +0.5.11 +------ +- Fix - pins > 26 missing when using BOARD mode +- Add getmode() +- Raise exception when a mix of modes is used +- GPIO.cleanaup() unsets the current pin mode + +0.5.10 +------ +- Issue 95 - support RPi 2 boards +- Introduce RPI_INFO +- Deprecate RPI_REVISION +- Issue 97 - fixed docstring for setup() + +0.5.9 +----- +- Issue 87 - warn about pull up/down on i2c pins +- Issue 86/75 - wait_for_edge() bugfix +- Issue 84 - recognise RPi properly when using a custom kernel +- Issue 90 - cleanup() on a list/tuple of channels + +0.5.8 +----- +- Allow lists/tuples of channels in GPIO.setup() +- GPIO.output() now allows lists/tuples of values +- GPIO.wait_for_edge() bug fixes (issue 78) + +0.5.7 +----- +- Issue 67 - speed up repeated calls to GPIO.wait_for_event() +- Added bouncetime keyword to GPIO.wait_for_event() +- Added extra edge/interrupt unit tests +- GPIO.wait_for_event() can now be mixed with GPIO.add_event_detect() +- Improved cleanups of events +- Issue 69 resolved + +0.5.6 +----- +- Issue 68 - support for RPi Model B+ +- Fix gpio_function() + +0.5.5 +----- +- Issue 52 - 'unallocate' a channel +- Issue 35 - use switchbounce with GPIO.event_detected() +- Refactored events code +- Rewrote tests to use unittest mechanism and new test board with loopbacks +- Fixed adding events after a GPIO.cleanup() +- Issue 64 - misleading /dev/mem permissions error +- Issue 59 - name collision with PWM constant and class + +0.5.4 +----- +- Changed release status (from alpha to full release) +- Warn when GPIO.cleanup() used with nothing to clean up (issue 44) +- Avoid collisions in constants (e.g. HIGH / RISING / PUD_DOWN) +- Accept BOARD numbers in gpio_function (issue 34) +- More return values for gpio_function (INPUT, OUTPUT, SPI, I2C, PWM, SERIAL, UNKNOWN) +- Tidy up docstrings +- Fix /dev/mem access error with gpio_function + +0.5.3a +------ +- Allow pydoc for non-root users (issue 27) +- Fix add_event_detect error when run as daemon (issue 32) +- Simplified exception types +- Changed from distribute to pip + +0.5.2a +------ +- Added software PWM (experimental) +- Added switch bounce handling to event callbacks +- Added channel number parameter to event callbacks (issue 31) +- Internal refactoring and code tidy up + +0.5.1a +------ +- Fixed callbacks for multiple GPIOs (issue 28) + +0.5.0a +------ +- Added new edge detection events (interrupt handling) + - Added add_event_detect() + - Added remove_event_detect() + - Added add_event_callback() + - Added wait_for_edge() +- Removed old experimental event functions + - Removed set_rising_event() + - Removed set_falling_event() + - Removed set_high_event() + - Removed set_low_event() +- Changed event_detected() for new edge detection functionality +- input() now returns 0/LOW == False or 1/HIGH == True (integers) instead of False or True (booleans). +- Fix error on repeated import (issue 3) +- Change SetupException to a RuntimeError so it can be caught on import (issue 25, Chris Hager ) +- Improved docstrings of functions + +0.4.2a +------ +- Fix for installing on Arch Linux (Python 3.3) (issue 20) +- Initial value when setting a channel as an output (issue 19) + +0.4.1a +------ +- Added VERSION +- Permit input() of channels set as outputs (Eric Ptak ) + +0.4.0a +------ +- Added support for Revision 2 boards +- Added RPI_REVISION +- Added cleanup() function and removed automatic reset functionality on program exit +- Added get_function() to read existing GPIO channel functionality (suggestion from Eric Ptak ) +- Added set_rising_event() +- Added set_falling_event() +- Added set_high_event() +- Added set_low_event() +- Added event_detected() +- Added test/test.py +- Converted debian to armhf +- Fixed C function short_wait() (thanks to Thibault Porteboeuf ) + +0.3.1a +------ +- Fixed critical bug with swapped high/low state on outputs +- Added pull-up / pull-down setup functionality for inputs + +0.3.0a +------ +- Rewritten as a C extension +- Now uses /dev/mem and SoC registers instead of /sys/class/gpio +- Faster! +- Make call to GPIO.setmode() mandatory +- Added GPIO.HIGH and GPIO.LOW constants + +0.2.0 +----- +- Changed status from alpha to beta +- Added setmode() to be able to use BCM GPIO 00.nn channel numbers +- Renamed InvalidPinException to InvalidChannelException + +0.1.0 +------ +- Fixed direction bug +- Added MANIFEST.in (to include missing file) +- Changed GPIO channel number to pin number +- Tested and working! + +0.0.3a +------ +- Added GPIO table +- Refactored +- Fixed a few critical bugs +- Still completely untested! + +0.0.2a +------ +- Internal refactoring. Still completely untested! + +0.0.1a +------ +- First version. Completely untested until I can get hold of a Raspberry Pi! + diff --git a/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/SOURCES.txt b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/SOURCES.txt new file mode 100644 index 0000000..c45dbbc --- /dev/null +++ b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/SOURCES.txt @@ -0,0 +1,31 @@ +CHANGELOG.txt +INSTALL.txt +LICENCE.txt +MANIFEST.in +README.txt +create_gpio_user_permissions.py +setup.cfg +setup.py +RPi/__init__.py +RPi.GPIO.egg-info/PKG-INFO +RPi.GPIO.egg-info/SOURCES.txt +RPi.GPIO.egg-info/dependency_links.txt +RPi.GPIO.egg-info/top_level.txt +RPi/GPIO/__init__.py +source/c_gpio.c +source/c_gpio.h +source/common.c +source/common.h +source/constants.c +source/constants.h +source/cpuinfo.c +source/cpuinfo.h +source/event_gpio.c +source/event_gpio.h +source/py_gpio.c +source/py_pwm.c +source/py_pwm.h +source/soft_pwm.c +source/soft_pwm.h +test/issue_94_111_154.py +test/test.py \ No newline at end of file diff --git a/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/dependency_links.txt b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/installed-files.txt b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/installed-files.txt new file mode 100644 index 0000000..92676a8 --- /dev/null +++ b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/installed-files.txt @@ -0,0 +1,9 @@ +../RPi/GPIO/__init__.py +../RPi/GPIO/__pycache__/__init__.cpython-311.pyc +../RPi/_GPIO.cpython-311-x86_64-linux-gnu.so +../RPi/__init__.py +../RPi/__pycache__/__init__.cpython-311.pyc +PKG-INFO +SOURCES.txt +dependency_links.txt +top_level.txt diff --git a/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/top_level.txt b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/top_level.txt new file mode 100644 index 0000000..196e1e3 --- /dev/null +++ b/venv/lib/python3.11/site-packages/RPi.GPIO-0.7.1.egg-info/top_level.txt @@ -0,0 +1 @@ +RPi diff --git a/venv/lib/python3.11/site-packages/RPi/GPIO/__init__.py b/venv/lib/python3.11/site-packages/RPi/GPIO/__init__.py new file mode 100644 index 0000000..b309025 --- /dev/null +++ b/venv/lib/python3.11/site-packages/RPi/GPIO/__init__.py @@ -0,0 +1,25 @@ +# Copyright (c) 2012-2021 Ben Croston +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""This package provides a Python module to control the GPIO on a Raspberry Pi""" + +from RPi._GPIO import * + +VERSION = '0.7.1' diff --git a/venv/lib/python3.11/site-packages/RPi/GPIO/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/RPi/GPIO/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c21b84c7acb310d74588073fd2977f8e1c3f939 GIT binary patch literal 364 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 Qz|6?V_<;dN6fpzE0JfYo%>V!Z literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/LICENSE b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/METADATA new file mode 100644 index 0000000..f9d00bc --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/METADATA @@ -0,0 +1,490 @@ +Metadata-Version: 2.1 +Name: flask-talisman +Version: 1.1.0 +Summary: HTTP security headers for Flask. +Home-page: https://github.com/wntrblm/flask-talisman +Author: Alethea Katherine Flowers +Author-email: me@thea.codes +License: Apache Software License +Keywords: flask security https xss +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS +Classifier: Operating System :: Unix +License-File: LICENSE + +Talisman: HTTP security headers for Flask +========================================= + +|PyPI Version| + +Talisman is a small Flask extension that handles setting HTTP headers +that can help protect against a few common web application security +issues. + +The default configuration: + +- Forces all connects to ``https``, unless running with debug enabled. +- Enables `HTTP Strict Transport + Security `_. +- Sets Flask's session cookie to ``secure``, so it will never be set if + your application is somehow accessed via a non-secure connection. +- Sets Flask's session cookie to ``httponly``, preventing JavaScript + from being able to access its content. CSRF via Ajax uses a separate + cookie and should be unaffected. +- Sets Flask's session cookie to ``Lax``, preventing the cookie to be leaked + in CSRF-prone request methods. +- Sets + `X-Frame-Options `_ + to ``SAMEORIGIN`` to avoid + `clickjacking `_. +- Sets `X-Content-Type-Options + `_ + to prevent content type sniffing. +- Sets a strict `Content Security + Policy `__ + of ``default-src: 'self', 'object-src': 'none'``. This is intended to almost completely + prevent Cross Site Scripting (XSS) attacks. This is probably the only + setting that you should reasonably change. See the + `Content Security Policy`_ section. +- Sets a strict `Referrer-Policy `_ + of ``strict-origin-when-cross-origin`` that governs which referrer information should be included with + requests made. +- Disables ``browsing-topics`` by default in the `Permissions-Policy `_ + like `Drupal `_ to enhance privacy protection. + + +In addition to Talisman, you **should always use a cross-site request +forgery (CSRF) library**. It's highly recommended to use +`Flask-SeaSurf `_, +which is based on Django's excellent library. + +Installation & Basic Usage +-------------------------- + +Install via `pip `_: + +:: + + pip install flask-talisman + +After installing, wrap your Flask app with a ``Talisman``: + +.. code:: python + + from flask import Flask + from flask_talisman import Talisman + + app = Flask(__name__) + Talisman(app) + + +There is also a full `Example App `_. + +Options +------- + +- ``force_https``, default ``True``, forces all non-debug connects to + ``https`` (`about HTTPS `_). +- ``force_https_permanent``, default ``False``, uses ``301`` instead of + ``302`` for ``https`` redirects. + +- ``frame_options``, default ``SAMEORIGIN``, can be ``SAMEORIGIN``, + ``DENY``, or ``ALLOWFROM`` (`about Frame Options `_). +- ``frame_options_allow_from``, default ``None``, a string indicating + the domains that are allowed to embed the site via iframe. + +- ``strict_transport_security``, default ``True``, whether to send HSTS + headers (`about HSTS `_). +- ``strict_transport_security_preload``, default ``False``, enables HSTS + preloading. If you register your application with + `Google's HSTS preload list `_, + Firefox and Chrome will never load your site over a non-secure + connection. +- ``strict_transport_security_max_age``, default ``ONE_YEAR_IN_SECS``, + length of time the browser will respect the HSTS header. +- ``strict_transport_security_include_subdomains``, default ``True``, + whether subdomains should also use HSTS. + +- ``content_security_policy``, default ``default-src: 'self'`, 'object-src': 'none'``, see the + `Content Security Policy`_ section (`about Content Security Policy `_). +- ``content_security_policy_nonce_in``, default ``[]``. Adds a per-request nonce + value to the flask request object and also to the specified CSP header section. + I.e. ``['script-src', 'style-src']`` +- ``content_security_policy_report_only``, default ``False``, whether to set + the CSP header as "report-only" (as `Content-Security-Policy-Report-Only`) + to ease deployment by disabling the policy enforcement by the browser, + requires passing a value with the ``content_security_policy_report_uri`` + parameter +- ``content_security_policy_report_uri``, default ``None``, a string + indicating the report URI used for `CSP violation reports + `_ + +- ``referrer_policy``, default ``strict-origin-when-cross-origin``, a string + that sets the Referrer Policy header to send a full URL when performing a same-origin + request, only send the origin of the document to an equally secure destination + (HTTPS->HTTPS), and send no header to a less secure destination (HTTPS->HTTP) (`about Referrer Policy `_). + +- ``feature_policy``, default ``{}``, see the `Feature Policy`_ section (`about Feature Policy `_). + +- ``permissions_policy``, default ``{'browsing-topics': '()'}``, see the `Permissions Policy`_ section (`about Permissions Policy `_). +- ``document_policy``, default ``{}``, see the `Document Policy`_ section (`about Document Policy `_). + +- ``session_cookie_secure``, default ``True``, set the session cookie + to ``secure``, preventing it from being sent over plain ``http`` (`about cookies (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie)_`). +- ``session_cookie_http_only``, default ``True``, set the session + cookie to ``httponly``, preventing it from being read by JavaScript. +- ``session_cookie_samesite``, default ``Lax``, set this to ``Strict`` to prevent the cookie from being sent by the browser to the target site in all cross-site browsing context, even when following a regular link. + + +- ``force_file_save``, default ``False``, whether to set the + `X-Download-Options `_ + header to ``noopen`` to prevent IE >= 8 to from opening file downloads + directly and only save them instead. + +- ``x_content_type_options``, default ``True``, Protects against MIME sniffing vulnerabilities (`about Content Type Options `_). +- ``x_xss_protection``, default ``False``, Protects against cross-site scripting (XSS) attacks (`about XSS Protection `_). This option is disabled by default because no modern browser (`supports this header `_) anymore. + +For a full list of (security) headers, check out: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers. + +Per-view options +~~~~~~~~~~~~~~~~ + +Sometimes you want to change the policy for a specific view. The +``force_https``, ``frame_options``, ``frame_options_allow_from``, +`content_security_policy``, ``feature_policy``, ``permissions_policy`` +and ``document_policy`` options can be changed on a per-view basis. + +.. code:: python + + from flask import Flask + from flask_talisman import Talisman, ALLOW_FROM + + app = Flask(__name__) + talisman = Talisman(app) + + @app.route('/normal') + def normal(): + return 'Normal' + + @app.route('/embeddable') + @talisman(frame_options=ALLOW_FROM, frame_options_allow_from='*') + def embeddable(): + return 'Embeddable' + +Content Security Policy +----------------------- + +The default content security policy is extremely strict and will +prevent loading any resources that are not in the same domain as the +application. Most web applications will need to change this policy. +If you're not ready to deploy Content Security Policy, you can set +`content_security_policy` to `False` to disable sending this header +entirely. + +A slightly more permissive policy is available at +``flask_talisman.GOOGLE_CSP_POLICY``, which allows loading Google-hosted JS +libraries, fonts, and embeding media from YouTube and Maps. + +You can and should create your own policy to suit your site's needs. +Here's a few examples adapted from +`MDN `_: + +Example 1 +~~~~~~~~~ + +This is the default policy. A web site administrator wants all content +to come from the site's own origin (this excludes subdomains) and disallow +legacy HTML elements. + +.. code:: python + + csp = { + 'default-src': '\'self\'', + 'object-src': '\'none\'', + } + talisman = Talisman(app, content_security_policy=csp) + +Example 2 +~~~~~~~~~ + +A web site administrator wants to allow content from a trusted domain +and all its subdomains (it doesn't have to be the same domain that the +CSP is set on.) + +.. code:: python + + csp = { + 'default-src': [ + '\'self\'', + '*.trusted.com' + ] + } + +Example 3 +~~~~~~~~~ + +A web site administrator wants to allow users of a web application to +include images from any origin in their own content, but to restrict +audio or video media to trusted providers, and all scripts only to a +specific server that hosts trusted code. + +.. code:: python + + csp = { + 'default-src': '\'self\'', + 'img-src': '*', + 'media-src': [ + 'media1.com', + 'media2.com', + ], + 'script-src': 'userscripts.example.com' + } + +In this example content is only permitted from the document's origin +with the following exceptions: + +- Images may loaded from anywhere (note the ``*`` wildcard). +- Media is only allowed from media1.com and media2.com (and not from + subdomains of those sites). +- Executable script is only allowed from userscripts.example.com. + +Example 4 +~~~~~~~~~ + +A web site administrator for an online banking site wants to ensure that +all its content is loaded using SSL, in order to prevent attackers from +eavesdropping on requests. + +.. code:: python + + csp = { + 'default-src': 'https://onlinebanking.jumbobank.com' + } + +The server only permits access to documents being loaded specifically +over HTTPS through the single origin onlinebanking.jumbobank.com. + +Example 5 +~~~~~~~~~ + +A web site administrator of a web mail site wants to allow HTML in +email, as well as images loaded from anywhere, but not JavaScript or +other potentially dangerous content. + +.. code:: python + + csp = { + 'default-src': [ + '\'self\'', + '*.mailsite.com', + ], + 'img-src': '*' + } + +Note that this example doesn't specify a ``script-src``; with the +example CSP, this site uses the setting specified by the ``default-src`` +directive, which means that scripts can be loaded only from the +originating server. + +Example 6 +~~~~~~~~~ + +A web site administrator wants to allow embedded scripts (which might +be generated dynamicially). + +.. code:: python + + csp = { + 'default-src': '\'self\'', + 'script-src': '\'self\'', + } + talisman = Talisman( + app, + content_security_policy=csp, + content_security_policy_nonce_in=['script-src'] + ) + +The nonce needs to be added to the script tag in the template: + +.. code:: html + + + +Note that the CSP directive (`script-src` in the example) to which the `nonce-...` +source should be added needs to be defined explicitly. + +Example 7 +~~~~~~~~~ + +A web site adminstrator wants to override the CSP directives via an +environment variable which doesn't support specifying the policy as +a Python dictionary, e.g.: + +.. code:: bash + + export CSP_DIRECTIVES="default-src 'self'; image-src *" + python app.py + +Then in the app code you can read the CSP directives from the environment: + +.. code:: python + + import os + from flask_talisman import Talisman, DEFAULT_CSP_POLICY + + talisman = Talisman( + app, + content_security_policy=os.environ.get("CSP_DIRECTIVES", DEFAULT_CSP_POLICY), + ) + +As you can see above the policy can be defined simply just like the official +specification requires the HTTP header to be set: As a semicolon separated +list of individual CSP directives. + +Feature Policy +-------------- + +**Note:** Feature Policy has largely been `renamed Permissions Policy `_ +in the latest draft and some features are likely to move to Document Policy. +At this writing, most browsers support the ``Feature-Policy`` HTTP Header name. +See the `Permissions Policy`_ and `Document Policy`_ sections below should you wish +to set these. + +Also note that the Feature Policy specification did not progress beyond the `draft https://wicg.github.io/feature-policy/` +stage before being renamed, but is `supported in some form in most browsers +`_. + +The default feature policy is empty, as this is the default expected behaviour. + +Geolocation Example +~~~~~~~~~~~~~~~~~~~ + +Disable access to Geolocation interface. + +.. code:: python + + feature_policy = { + 'geolocation': '\'none\'' + } + talisman = Talisman(app, feature_policy=feature_policy) + +Permissions Policy +------------------ + +Feature Policy has been split into Permissions Policy and Document Policy but +at this writing `browser support of Permissions Policy is very limited `_, +and it is recommended to still set the ``Feature-Policy`` HTTP Header. +Permission Policy support is included in Talisman for when this becomes more +widely supported. + +Note that the `Permission Policy is still an Working Draft `_. + +When the same feature or permission is set in both Feature Policy and Permission Policy, +the Permission Policy setting will take precedence in browsers that support both. + +It should be noted that the syntax differs between Feature Policy and Permission Policy +as can be seen from the ``geolocation`` examples provided. + +The default Permissions Policy is ``browsing-topics=()``, which opts sites out of +`Federated Learning of Cohorts `_ an interest-based advertising initiative +called Topics API. + +Permission Policy can be set either using a dictionary, or using a string. + +Geolocation and Microphone Example +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Disable access to Geolocation interface and Microphone using dictionary syntax + +.. code:: python + + permissions_policy = { + 'geolocation': '()', + 'microphone': '()' + } + talisman = Talisman(app, permissions_policy=permissions_policy) + +Disable access to Geolocation interface and Microphone using string syntax + +.. code:: python + + permissions_policy = 'geolocation=(), microphone=()' + talisman = Talisman(app, permissions_policy=permissions_policy) + +Document Policy +--------------- + +Feature Policy has been split into Permissions Policy and Document Policy but +at this writing `browser support of Document Policy is very limited `_, +and it is recommended to still set the ``Feature-Policy`` HTTP Header. +Document Policy support is included in Talisman for when this becomes more +widely supported. + +Note that the `Document Policy is still an Unofficial Draft `_. + +The default Document Policy is empty, as this is the default expected behaviour. + +Document Policy can be set either using a dictionary, or using a string. + +Oversized-Images Example +~~~~~~~~~~~~~~~~~~~~~~~~ + +Forbid oversized-images using dictionary syntax: + +.. code:: python + + document_policy = { + 'oversized-images': '?0' + } + talisman = Talisman(app, document_policy=document_policy) + +Forbid oversized-images using string syntax: + +.. code:: python + + document_policy = 'oversized-images=?0' + talisman = Talisman(app, document_policy=document_policy) + +Disclaimer +---------- + +This code originated at Google, but is not an official Google product, +experimental or otherwise. It was forked on June 6th, 2021 from the +unmaintained GoogleCloudPlatform/flask-talisman. + +There is no silver bullet for web application security. Talisman can +help, but security is more than just setting a few headers. Any +public-facing web application should have a comprehensive approach to +security. + + +Contributing changes +-------------------- + +- See `CONTRIBUTING.md`_ + +Licensing +--------- + +- Apache 2.0 - See `LICENSE`_ + +.. _LICENSE: https://github.com/wntrblm/flask-talisman/blob/master/LICENSE +.. _CONTRIBUTING.md: https://github.com/wntrblm/flask-talisman/blob/master/CONTRIBUTING.md +.. |PyPI Version| image:: https://img.shields.io/pypi/v/flask-talisman.svg + :target: https://pypi.python.org/pypi/flask-talisman + + diff --git a/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/RECORD new file mode 100644 index 0000000..85f28a9 --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/RECORD @@ -0,0 +1,13 @@ +flask_talisman-1.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask_talisman-1.1.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357 +flask_talisman-1.1.0.dist-info/METADATA,sha256=AwnGEfgydNEYCwtRCtDWiQB6hSaTi1QBQrdWhw997_0,18722 +flask_talisman-1.1.0.dist-info/RECORD,, +flask_talisman-1.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_talisman-1.1.0.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110 +flask_talisman-1.1.0.dist-info/top_level.txt,sha256=mXVUQo_kTE7G1KmO-Pl2mbgm8braqn1FfwVzSh2rh68,15 +flask_talisman/__init__.py,sha256=cTbxfRkVoP9JwIwHJFEymT3-ZuOr4uspReRunGwSNns,1027 +flask_talisman/__pycache__/__init__.cpython-311.pyc,, +flask_talisman/__pycache__/talisman.cpython-311.pyc,, +flask_talisman/__pycache__/talisman_test.cpython-311.pyc,, +flask_talisman/talisman.py,sha256=Y2q-X4ug-91wpS54wArEP0LWpA0bErDNW86ZL-hPhEY,17033 +flask_talisman/talisman_test.py,sha256=Ht7OTCm2VXWJJlxXNxGmMARGn3dYQg51E4lrpT772dY,14153 diff --git a/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/REQUESTED b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/WHEEL new file mode 100644 index 0000000..0b18a28 --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/top_level.txt new file mode 100644 index 0000000..d89915c --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman-1.1.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_talisman diff --git a/venv/lib/python3.11/site-packages/flask_talisman/__init__.py b/venv/lib/python3.11/site-packages/flask_talisman/__init__.py new file mode 100644 index 0000000..b567808 --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman/__init__.py @@ -0,0 +1,31 @@ +# Copyright 2015 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .talisman import ( + ALLOW_FROM, DEFAULT_CSP_POLICY, DEFAULT_DOCUMENT_POLICY, + DEFAULT_FEATURE_POLICY, DEFAULT_PERMISSIONS_POLICY, DENY, + GOOGLE_CSP_POLICY, NONCE_LENGTH, SAMEORIGIN, Talisman) + +__all__ = ( + 'ALLOW_FROM', + 'DEFAULT_CSP_POLICY', + 'DEFAULT_DOCUMENT_POLICY', + 'DEFAULT_FEATURE_POLICY', + 'DEFAULT_PERMISSIONS_POLICY', + 'DENY', + 'GOOGLE_CSP_POLICY', + 'NONCE_LENGTH', + 'SAMEORIGIN', + 'Talisman', +) diff --git a/venv/lib/python3.11/site-packages/flask_talisman/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/flask_talisman/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40d2e7c440bfcb34c79c8eff2142a38b3107ae0c GIT binary patch literal 630 zcmchT%}VP)6vtf#D6+;^da2rj%Lly+JJX{I!(;%tU!bM0Uz>CK1S?(Whz z@DaoZ@g=f#<*v}3D`&)jPv9B&osa)v&fz?5Y*;|r#qkT*YXH2eq%!R*Sf9w?5zN30 zMnFIcg+?`@Q(e?(P1I>!G-yK@)DR{$MUys#MJ*`1X=|o=prgM*`9a4jt*+ycOE#F0 zQMuj6gYMMvS&nPRk>5u`lL4|T{yLqdiQ{ywGc61Rt$gWaKjURqvvgvrDn+HPt3LBul=#BQfun)z3f>T>&39tWg# zg@%HmU@9~f)DhE`LR+FV7z?6^v1hQBDR}2-o`?{M;2)Q+pWGB8jPnfL@_b%gqbMn| zoc}Gt{m-`hFuq3-zebB?K2PGKgTq6V@jTpL1UGlVZJ41yQIOrSYC*&pk9p46!D9Jt po{D5vMB!PwEhnqPXAcr99YVO;)8X$G_<2~ZmiFIJFWr>Od;s|Yrk4N! literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/flask_talisman/__pycache__/talisman.cpython-311.pyc b/venv/lib/python3.11/site-packages/flask_talisman/__pycache__/talisman.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a50359ee2bf2c059edbf7852b434d425c5657e84 GIT binary patch literal 19045 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 UxA!LH1Mz1{fiE^GM<@3G0p|UTsQ>@~ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.11/site-packages/flask_talisman/talisman.py b/venv/lib/python3.11/site-packages/flask_talisman/talisman.py new file mode 100644 index 0000000..3911da9 --- /dev/null +++ b/venv/lib/python3.11/site-packages/flask_talisman/talisman.py @@ -0,0 +1,465 @@ +# Copyright 2015 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from collections import OrderedDict + +import flask + + +DENY = 'DENY' +SAMEORIGIN = 'SAMEORIGIN' +ALLOW_FROM = 'ALLOW-FROM' +ONE_YEAR_IN_SECS = 31556926 + +DEFAULT_REFERRER_POLICY = 'strict-origin-when-cross-origin' + +DEFAULT_CSP_POLICY = { + 'default-src': '\'self\'', + 'object-src': '\'none\'', +} + +DEFAULT_SESSION_COOKIE_SAMESITE = "Lax" + +GOOGLE_CSP_POLICY = { + # Fonts from fonts.google.com + 'font-src': '\'self\' themes.googleusercontent.com *.gstatic.com', + #