# HG changeset patch # User Peter Sanchez # Date 1618505893 25200 # Thu Apr 15 09:58:13 2021 -0700 # Node ID 53c7aad534308f10b0d019c66d0fe0ec606509ae # Parent 0000000000000000000000000000000000000000 Initial commit. diff --git a/.hgignore b/.hgignore new file mode 100644 --- /dev/null +++ b/.hgignore @@ -0,0 +1,11 @@ +syntax:glob +.hgsvn +.*.swp +**.pyc +*.*~ +*.egg + +# virtualenv +syntax:regexp +^build/lib$ +^nofloc.egg-info$ diff --git a/LICENSE b/LICENSE new file mode 100644 --- /dev/null +++ b/LICENSE @@ -0,0 +1,32 @@ +Copyright (c) 2020, Netlandish Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or +without modification, are permitted provided that the +following conditions are met: + + * Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + + * Neither the name of Netlandish Inc. nor the names of project + contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include LICENSE +include README.rst +include README.md diff --git a/README.md b/README.md new file mode 100644 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# django-nofloc [![nlshield](https://img.shields.io/badge/100%25-Netlandish-blue.svg?style=square-flat)](http://www.netlandish.com) + +django-nofloc is a simple Django app that provides a middleware to let Google +Chrome know that your website should not be included in the Google FLoC +program. Essentially you're opting out of this privacy invading program that is +default for all Chrome users. + +**Version:** 0.1.0 + +**Project Links:** [Mailing List][pinbox] - [Contributing](#contributing) + +**Author:** Peter Sanchez () + +Because this is a simple middleware we have no issue tracker for it. If there +are any issues please send an email to the [mailing list][pinbox]. + +[pinbox]: https://lists.code.netlandish.com/~netlandish/public-inbox + +## Python / Django Support + +- Python 3.6+ for Django versions 2.2+ + +# Installation + +PIP: + + pip install django-nofloc + +Basic Manual Install: + + $ python setup.py build + $ sudo python setup.py install + +Then just add the `nofloc.middleware.NoFLoCMiddleware` to your `MIDDLEWARE` +setting. The placement order shouldn't matter. + + MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'nofloc.middleware.NoFLoCMiddleware', + ] + +This will set the `Permissions-Policy` header to a value of +`interest-cohort=()` for every request served by Django. + +If you need to alter this header within a view or some other case, this app may +not be a good tool for you to use in it's current state. It's set specifically +to disable FLoC. Review your use case before installing this app. You can also +submit a patch to make this more configurable if you'd like :) + +## Why? + +Because we're tired of big tech spying on us. For more info see: + +https://plausible.io/blog/google-floc + +# Contributing + +We accept patches submitted via `hg email` which is the `patchbomb` extension +included with Mercurial. + +The mailing list where you submit your patches is +`~netlandish/public-inbox@lists.code.netlandish.com`. You can also view the +archives on the web here: + +https://lists.code.netlandish.com/~netlandish/public-inbox + +To quickly setup your clone of `django-nofloc` to submit to the mailing +list just edit your `.hg/hgrc` file and add the following: + + [email] + to = ~netlandish/public-inbox@lists.code.netlandish.com + + [patchbomb] + flagtemplate = "django-nofloc" + + [diff] + git = 1 + +We have more information on the topic here: + +- [Contributing][cdoc] +- [Using email with Mercurial][hgemail] +- [Mailing list etiquette][etiquette] + +[etiquette]: https://man.code.netlandish.com/lists/etiquette.md +[hgemail]: https://man.code.netlandish.com/hg/email.md +[cdoc]: https://man.code.netlandish.com/contributing.md + +# Copyright & Warranty + +All documentation, libraries, and sample code are Copyright 2021 Netlandish +Inc. <>. The library and sample code +are made available to you under the terms of the BSD license which is +contained in the included file, LICENSE. diff --git a/README.rst b/README.rst new file mode 100644 --- /dev/null +++ b/README.rst @@ -0,0 +1,117 @@ +django-nofloc |nlshield| +======================== + +django-nofloc is a simple Django app that provides a middleware to let +Google Chrome know that your website should not be included in the +Google FLoC program. Essentially you're opting out of this privacy +invading program that is default for all Chrome users. + +**Version:** 0.1.0 + +**Project Links:** `Mailing +List `__ - +`Contributing <#contributing>`__ + +**Author:** Peter Sanchez (https://netlandish.com) + +Because this is a simple middleware we have no issue tracker for it. If +there are any issues please send an email to the `mailing +list `__. + +Python / Django Support +----------------------- + +- Python 3.6+ for Django versions 2.2+ + +Installation +============ + +PIP: + +:: + + pip install django-nofloc + +Basic Manual Install: + +:: + + $ python setup.py build + $ sudo python setup.py install + +Then just add the ``nofloc.middleware.NoFLoCMiddleware`` to your +``MIDDLEWARE`` setting. The placement order shouldn't matter. + +:: + + MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'nofloc.middleware.NoFLoCMiddleware', + ] + +This will set the ``Permissions-Policy`` header to a value of +``interest-cohort=()`` for every request served by Django. + +If you need to alter this header within a view or some other case, this +app may not be a good tool for you to use in it's current state. It's +set specifically to disable FLoC. Review your use case before installing +this app. You can also submit a patch to make this more configurable if +you'd like :) + +Why? +---- + +Because we're tired of big tech spying on us. For more info see: + +https://plausible.io/blog/google-floc + +Contributing +============ + +We accept patches submitted via ``hg email`` which is the ``patchbomb`` +extension included with Mercurial. + +The mailing list where you submit your patches is +``~netlandish/public-inbox@lists.code.netlandish.com``. You can also +view the archives on the web here: + +https://lists.code.netlandish.com/~netlandish/public-inbox + +To quickly setup your clone of ``django-nofloc`` to submit to the +mailing list just edit your ``.hg/hgrc`` file and add the following: + +:: + + [email] + to = ~netlandish/public-inbox@lists.code.netlandish.com + + [patchbomb] + flagtemplate = "django-nofloc" + + [diff] + git = 1 + +We have more information on the topic here: + +- `Contributing `__ +- `Using email with + Mercurial `__ +- `Mailing list + etiquette `__ + +Copyright & Warranty +==================== + +All documentation, libraries, and sample code are Copyright 2021 +Netlandish Inc. . The library and sample code are +made available to you under the terms of the BSD license which is +contained in the included file, LICENSE. + +.. |nlshield| image:: https://img.shields.io/badge/100%25-Netlandish-blue.svg?style=square-flat + :target: http://www.netlandish.com diff --git a/nofloc/__init__.py b/nofloc/__init__.py new file mode 100644 --- /dev/null +++ b/nofloc/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +default_app_config = "nofloc.apps.NoFLoCConfig" +VERSION = (0, 1, 0, "final", 0) + + +def get_version(): + "Returns a PEP 386-compliant version number from VERSION." + assert len(VERSION) == 5 + assert VERSION[3] in ("alpha", "beta", "rc", "final") + + # Now build the two parts of the version number: + # main = X.Y[.Z] + # sub = .devN - for pre-alpha releases + # | {a|b|c}N - for alpha, beta and rc releases + + parts = 2 if VERSION[2] == 0 else 3 + main = ".".join(str(x) for x in VERSION[:parts]) + + sub = "" + if VERSION[3] != "final": + mapping = {"alpha": "a", "beta": "b", "rc": "c"} + sub = mapping[VERSION[3]] + str(VERSION[4]) + + return str(main + sub) diff --git a/nofloc/apps.py b/nofloc/apps.py new file mode 100644 --- /dev/null +++ b/nofloc/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class NoFLoCConfig(AppConfig): + name = "nofloc" diff --git a/nofloc/middleware.py b/nofloc/middleware.py new file mode 100644 --- /dev/null +++ b/nofloc/middleware.py @@ -0,0 +1,8 @@ +class NoFLoCMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + response.headers["Permissions-Policy"] = "interest-cohort=()" + return response diff --git a/nofloc/models.py b/nofloc/models.py new file mode 100644 --- /dev/null +++ b/nofloc/models.py @@ -0,0 +1,1 @@ +# No models diff --git a/nofloc/views.py b/nofloc/views.py new file mode 100644 --- /dev/null +++ b/nofloc/views.py @@ -0,0 +1,1 @@ +# no views diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[tool.black] +line-length = 79 +target-version = ['py37', 'py38'] +include = '\.pyi?$' +exclude = ''' + +( + /( + \.eggs # exclude a few common directories in the + | \.git # root of the project + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | env + | _build + | buck-out + | build + | dist + )/ + | foo.py # also separately exclude a file named foo.py in + # the root of the project +) +''' + +[tool.isort] +line_length=79 +multi_line_output=5 +include_trailing_comma=true diff --git a/setup.py b/setup.py new file mode 100644 --- /dev/null +++ b/setup.py @@ -0,0 +1,41 @@ +import os + +from setuptools import find_packages, setup + +project_name = "nofloc" + +if os.path.exists("README.rst"): + long_description = open("README.rst").read() +else: + long_description = ( + "See https://hg.code.netlandish.com/~netlandish/django-nofloc" + ) + + +setup( + name=project_name, + version=__import__(project_name).get_version(), + package_dir={project_name: project_name}, + packages=find_packages(), + description=("Opt out of the privacy invading Google FLoC program."), + author="Netlandish Inc.", + author_email="hello@netlandish.com", + license="BSD License", + url="https://hg.code.netlandish.com/~netlandish/django-nofloc", + long_description=long_description, + platforms=["any"], + classifiers=[ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Environment :: Web Environment", + "Programming Language :: Python", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + ], +)