From 5910cbcc9ad09d8e49da51cef2e7fef8047def22 Mon Sep 17 00:00:00 2001
From: Tiara Rodney
Date: Sat, 16 Apr 2022 22:31:43 +0200
Subject: [PATCH 1/2] refactor(view): make things a little more pretty
---
src/httpaste/controller/ui/__init__.py | 5 +-
src/httpaste/controller/ui/paste/__init__.py | 10 +++-
src/httpaste/controller/ui/user/__init__.py | 12 ++++
src/httpaste/helper/http.py | 9 +++
src/httpaste/helper/syntax.py | 14 ++++-
src/httpaste/helper/template.py | 2 +-
src/httpaste/schema/httpaste.openapi.json | 19 ++++++
.../view/container/get_paste_form.html | 39 +++++++++++++
.../view/container/post_paste_form.html | 26 +++++++++
src/httpaste/view/frame/base.html | 16 +++++
src/httpaste/view/frame/decorated.html | 29 ++++++++++
src/httpaste/view/viewport/ui/paste/get.html | 36 ++++++++++++
.../viewport/ui/paste/private/search.html | 14 +++++
.../view/viewport/ui/paste/public/search.html | 14 +++++
.../view/viewport/ui/paste/search.html | 36 ++++++++++++
src/httpaste/view/viewport/ui/search.html | 41 +++++++++++++
.../view/viewport/ui/user/search.html | 16 +++++
.../viewport/ui/user/session/search.html | 0
.../views/container/get_paste_form.html | 26 ---------
.../views/container/post_paste_form.html | 21 -------
src/httpaste/views/frame/base.html | 58 -------------------
src/httpaste/views/frame/decorated.html | 31 ----------
src/httpaste/views/viewport/ui/paste/get.html | 27 ---------
.../viewport/ui/paste/private/search.html | 5 --
.../viewport/ui/paste/public/search.html | 5 --
.../views/viewport/ui/paste/search.html | 29 ----------
src/httpaste/views/viewport/ui/search.html | 11 ----
27 files changed, 331 insertions(+), 220 deletions(-)
create mode 100644 src/httpaste/view/container/get_paste_form.html
create mode 100644 src/httpaste/view/container/post_paste_form.html
create mode 100644 src/httpaste/view/frame/base.html
create mode 100644 src/httpaste/view/frame/decorated.html
create mode 100644 src/httpaste/view/viewport/ui/paste/get.html
create mode 100644 src/httpaste/view/viewport/ui/paste/private/search.html
create mode 100644 src/httpaste/view/viewport/ui/paste/public/search.html
create mode 100644 src/httpaste/view/viewport/ui/paste/search.html
create mode 100644 src/httpaste/view/viewport/ui/search.html
create mode 100644 src/httpaste/view/viewport/ui/user/search.html
rename src/httpaste/{views => view}/viewport/ui/user/session/search.html (100%)
delete mode 100644 src/httpaste/views/container/get_paste_form.html
delete mode 100644 src/httpaste/views/container/post_paste_form.html
delete mode 100644 src/httpaste/views/frame/base.html
delete mode 100644 src/httpaste/views/frame/decorated.html
delete mode 100644 src/httpaste/views/viewport/ui/paste/get.html
delete mode 100644 src/httpaste/views/viewport/ui/paste/private/search.html
delete mode 100644 src/httpaste/views/viewport/ui/paste/public/search.html
delete mode 100644 src/httpaste/views/viewport/ui/paste/search.html
delete mode 100644 src/httpaste/views/viewport/ui/search.html
diff --git a/src/httpaste/controller/ui/__init__.py b/src/httpaste/controller/ui/__init__.py
index c1b52c2..23890e6 100644
--- a/src/httpaste/controller/ui/__init__.py
+++ b/src/httpaste/controller/ui/__init__.py
@@ -7,7 +7,10 @@ def search(**kwargs):
variables = {
'paste_index_url': '/ui/paste',
- 'man_page': man_page
+ 'user_index_url': '/ui/user',
+ 'man_page': man_page,
+ 'user': kwargs.get('user'),
+ 'delete_session_url': '/ui/user/session/delete'
}
return template.render(**variables), 200
\ No newline at end of file
diff --git a/src/httpaste/controller/ui/paste/__init__.py b/src/httpaste/controller/ui/paste/__init__.py
index 4d63bfd..e743a4c 100644
--- a/src/httpaste/controller/ui/paste/__init__.py
+++ b/src/httpaste/controller/ui/paste/__init__.py
@@ -5,6 +5,9 @@ from connexion import request
from httpaste.helper.template import views
from httpaste.helper.url import url_query_string, url_append_query_param
+from httpaste.helper.syntax import syntax_shortnames, format_shortnames
+from httpaste.helper.http import mime_types
+
from httpaste.controller.paste import post as post_raw
from httpaste.controller.paste import get as get_raw
@@ -54,8 +57,6 @@ def get(**kwargs):
template = views.get_template("viewport/ui/paste/get.html")
-
-
base_path = f'paste/public/{kwargs["id"]}'
if kwargs.get('user'):
@@ -86,7 +87,10 @@ def get(**kwargs):
'syntax': kwargs.get('syntax', ''),
'mime': kwargs.get('mime', ''),
'preview': kwargs.get('preview', True)
- }
+ },
+ 'syntax_shortnames': syntax_shortnames(),
+ 'format_shortnames': format_shortnames(),
+ 'mime_types': mime_types()
}
return template.render(**variables)
\ No newline at end of file
diff --git a/src/httpaste/controller/ui/user/__init__.py b/src/httpaste/controller/ui/user/__init__.py
index e69de29..6c6d86a 100644
--- a/src/httpaste/controller/ui/user/__init__.py
+++ b/src/httpaste/controller/ui/user/__init__.py
@@ -0,0 +1,12 @@
+from httpaste.helper.template import views
+from httpaste import __doc__ as man_page
+
+def search(**kwargs):
+
+ template = views.get_template("viewport/ui/user/search.html")
+
+ variables = {
+ 'delete_session_url': '/ui/user/session/delete'
+ }
+
+ return template.render(**variables), 200
\ No newline at end of file
diff --git a/src/httpaste/helper/http.py b/src/httpaste/helper/http.py
index 050cd00..2e00d6f 100644
--- a/src/httpaste/helper/http.py
+++ b/src/httpaste/helper/http.py
@@ -1,3 +1,4 @@
+from mimetypes import types_map as mime_types_map
class BadRequestError(RuntimeError):
def __init__(self, msg=None):
@@ -62,3 +63,11 @@ class NotFoundError(RuntimeError):
"status": 404,
"title": "Not Found",
}, 404
+
+
+def mime_types():
+
+ types = list(set(mime_types_map.values()))
+ types.sort()
+
+ return types
\ No newline at end of file
diff --git a/src/httpaste/helper/syntax.py b/src/httpaste/helper/syntax.py
index d1ed048..c939267 100644
--- a/src/httpaste/helper/syntax.py
+++ b/src/httpaste/helper/syntax.py
@@ -1,5 +1,5 @@
-from pygments.lexers import get_lexer_by_name, find_lexer_class_by_name
-from pygments.formatters import find_formatter_class, HtmlFormatter
+from pygments.lexers import (get_lexer_by_name, find_lexer_class_by_name, get_all_lexers)
+from pygments.formatters import (find_formatter_class, HtmlFormatter, get_all_formatters)
def highlight(
@@ -18,3 +18,13 @@ def highlight(
formatter = find_formatter_class(format_alias)(linenos=linenos)
return highlight(data, get_lexer_by_name(lexer_alias), formatter)
+
+
+def syntax_shortnames():
+
+ return {l[0]:l[1][0] for l in get_all_lexers() if len(l[1]) > 0}
+
+
+def format_shortnames():
+
+ return [f.aliases[0] for f in get_all_formatters()]
\ No newline at end of file
diff --git a/src/httpaste/helper/template.py b/src/httpaste/helper/template.py
index 446418a..1ae6d0e 100644
--- a/src/httpaste/helper/template.py
+++ b/src/httpaste/helper/template.py
@@ -1,6 +1,6 @@
from jinja2 import Environment, PackageLoader, select_autoescape
views = Environment(
- loader=PackageLoader("httpaste", "views"),
+ loader=PackageLoader("httpaste", "view"),
autoescape=select_autoescape()
)
\ No newline at end of file
diff --git a/src/httpaste/schema/httpaste.openapi.json b/src/httpaste/schema/httpaste.openapi.json
index 508fa5e..35ef3ec 100644
--- a/src/httpaste/schema/httpaste.openapi.json
+++ b/src/httpaste/schema/httpaste.openapi.json
@@ -388,6 +388,9 @@
},
{
"$ref": "#/components/parameters/mime"
+ },
+ {
+ "$ref": "#/components/parameters/ui_preview"
}
],
"responses": {
@@ -422,6 +425,22 @@
}
}
},
+ "/ui/user": {
+ "get": {
+ "description": "get a public paste",
+ "security": [
+ {}
+ ],
+ "responses": {
+ "200": {
+ "description": "paste data. content type may vary.",
+ "content": {
+ "text/html": {}
+ }
+ }
+ }
+ }
+ },
"/ui/user/session/delete": {
"get": {
"description": "get a public paste",
diff --git a/src/httpaste/view/container/get_paste_form.html b/src/httpaste/view/container/get_paste_form.html
new file mode 100644
index 0000000..9d3d8b4
--- /dev/null
+++ b/src/httpaste/view/container/get_paste_form.html
@@ -0,0 +1,39 @@
+
\ No newline at end of file
diff --git a/src/httpaste/view/container/post_paste_form.html b/src/httpaste/view/container/post_paste_form.html
new file mode 100644
index 0000000..153a06a
--- /dev/null
+++ b/src/httpaste/view/container/post_paste_form.html
@@ -0,0 +1,26 @@
+
\ No newline at end of file
diff --git a/src/httpaste/view/frame/base.html b/src/httpaste/view/frame/base.html
new file mode 100644
index 0000000..4a2060a
--- /dev/null
+++ b/src/httpaste/view/frame/base.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+ {% block content %}{% endblock %}
+
+
+
\ No newline at end of file
diff --git a/src/httpaste/view/frame/decorated.html b/src/httpaste/view/frame/decorated.html
new file mode 100644
index 0000000..d7c6cf7
--- /dev/null
+++ b/src/httpaste/view/frame/decorated.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+ {% block header %}{% endblock %}
+
+
+
+ {% block content %}{% endblock %}
+
+
+
\ No newline at end of file
diff --git a/src/httpaste/view/viewport/ui/paste/get.html b/src/httpaste/view/viewport/ui/paste/get.html
new file mode 100644
index 0000000..b9cac69
--- /dev/null
+++ b/src/httpaste/view/viewport/ui/paste/get.html
@@ -0,0 +1,36 @@
+{% extends 'frame/decorated.html' %}
+{% block header %}
+
+
+ Preview and conditon an existing paste
+
+{% endblock %}
+{% block content %}
+
+ {% if query['preview'] %}
+ Preview
+
+ {% else %}
+ Preview is disabled.
+
+ This probably happened because the paste is set to expire after read.
+
+ You can still proceed to condition the paste URL.
+
+ {% endif %}
+ {% include 'container/get_paste_form.html' %}
+
+
+ URLs
+
+ Formatted
+
+ {{paste_url}}
+
+ Raw
+
+ {{raw_paste_url}}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/view/viewport/ui/paste/private/search.html b/src/httpaste/view/viewport/ui/paste/private/search.html
new file mode 100644
index 0000000..6d43869
--- /dev/null
+++ b/src/httpaste/view/viewport/ui/paste/private/search.html
@@ -0,0 +1,14 @@
+{% extends 'frame/decorated.html' %}
+
+{% block header %}
+
+
+
+ Private pastes are authenticated
+
+{% endblock %}
+{% block content %}
+{% include 'container/post_paste_form.html' %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/view/viewport/ui/paste/public/search.html b/src/httpaste/view/viewport/ui/paste/public/search.html
new file mode 100644
index 0000000..5036269
--- /dev/null
+++ b/src/httpaste/view/viewport/ui/paste/public/search.html
@@ -0,0 +1,14 @@
+{% extends 'frame/decorated.html' %}
+
+{% block header %}
+
+
+ Public pastes are not indexed and can only be accessed by knowing their respective
+ paste id.
+
+{% endblock %}
+{% block content %}
+{% include 'container/post_paste_form.html' %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/view/viewport/ui/paste/search.html b/src/httpaste/view/viewport/ui/paste/search.html
new file mode 100644
index 0000000..549bc74
--- /dev/null
+++ b/src/httpaste/view/viewport/ui/paste/search.html
@@ -0,0 +1,36 @@
+{% extends 'frame/decorated.html' %}
+
+{% block header %}
+
+
+
+ All pastes are symetrically encrypted server-side with an HMAC derived key
+ and SHA-256 hashing, a server-side salt and a randomly generated password.
+ Public paste’s passwords are derived from their ids. Private paste’s passwords
+ are randomly generated and stored inside a symetrically encrypted personal database,
+ with the encryption key also being derived through the same HMAC mechanism,
+ where a HTTP basic authentication act as the master password.
+ Paste ids, usernames, and any other identifiable attributes are only stored
+ inside the storage backend as keyed and salted BLAKE2 hashes.
+
+ Note:
+ The initial creation of a private paste will prompt for login credentials.
+ If the login credentials are not known, they will be created automatically.
+ If it is required to authenticate with other credentials, clear your local
+ HTTP authentication cache.
+
+{% endblock %}
+{% block content %}
+
+ Navigation
+
+
+ Create a Private Paste
+
+
+ Create a Public Paste
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/view/viewport/ui/search.html b/src/httpaste/view/viewport/ui/search.html
new file mode 100644
index 0000000..c84ce4d
--- /dev/null
+++ b/src/httpaste/view/viewport/ui/search.html
@@ -0,0 +1,41 @@
+{% extends 'frame/decorated.html' %}
+
+{% block header %}
+httpaste - versatile HTTP pastebin
+
+ This is the user interface of the hosted version of httpaste ,
+ a program which offers an HTTP interface for storing public and private data (a.k.a. pastes),
+ commonly referred to as a pastebin application. It is inspired by
+ sprunge.us and ix.io .
+ It aims for a higher degree of privacy control than available commercial pastebin products.
+
+
+ httpaste features include:
+
+ Authenticated private and unlisted public pasting
+ Lifetime control (including Burn-After-Read expiration)
+ Encoded and Binary Data Upload
+ Syntax Higlighting
+ Output Formatting
+ Output Content-Type Control
+
+
+
+ A pseudo man page for CLI usage is available via HTTP GET of this host's root document.
+ (e.g. `$ curl httpaste.it`)
+
+{% endblock %}
+
+{% block content %}
+
+ Navigation
+
+
+ Paste
+
+
+ User
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/view/viewport/ui/user/search.html b/src/httpaste/view/viewport/ui/user/search.html
new file mode 100644
index 0000000..0d2df0f
--- /dev/null
+++ b/src/httpaste/view/viewport/ui/user/search.html
@@ -0,0 +1,16 @@
+{% extends 'frame/decorated.html' %}
+
+{% block header %}
+
+{% endblock %}
+{% block content %}
+
+ Navigation
+
+
+ Clear Local HTTP Authentication Cache
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/views/viewport/ui/user/session/search.html b/src/httpaste/view/viewport/ui/user/session/search.html
similarity index 100%
rename from src/httpaste/views/viewport/ui/user/session/search.html
rename to src/httpaste/view/viewport/ui/user/session/search.html
diff --git a/src/httpaste/views/container/get_paste_form.html b/src/httpaste/views/container/get_paste_form.html
deleted file mode 100644
index d3f658a..0000000
--- a/src/httpaste/views/container/get_paste_form.html
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
- Syntax
-
-
-
- Pygments lexer short name (e.g. 'terraform', 'python')
-
-
-
- Format
-
-
- Pygments formatter short name (e.g. 'html', 'terminal256')
-
-
-
- Content-Type (MIME)
-
-
- Content-Type Header the server should return
-
-
-
-
\ No newline at end of file
diff --git a/src/httpaste/views/container/post_paste_form.html b/src/httpaste/views/container/post_paste_form.html
deleted file mode 100644
index 31ed83c..0000000
--- a/src/httpaste/views/container/post_paste_form.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- Data
-
-
-
-
- Either supply a past text, or upload a file.
-
-
-
- Lifetime
-
-
- Set a paste’s lifetime to make it expire after a specified amount of time.
- The lifetime must be provided in minutes and cannot be less than 1 (, unless lesser than 0).
- A lifetime of 0 will evaluate to a lifetime 1.
-
-
-
\ No newline at end of file
diff --git a/src/httpaste/views/frame/base.html b/src/httpaste/views/frame/base.html
deleted file mode 100644
index 8d6a422..0000000
--- a/src/httpaste/views/frame/base.html
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
- {% block content %}{% endblock %}
-
-
-
\ No newline at end of file
diff --git a/src/httpaste/views/frame/decorated.html b/src/httpaste/views/frame/decorated.html
deleted file mode 100644
index 7e13b26..0000000
--- a/src/httpaste/views/frame/decorated.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
- {% block content %}{% endblock %}
-
-
-
\ No newline at end of file
diff --git a/src/httpaste/views/viewport/ui/paste/get.html b/src/httpaste/views/viewport/ui/paste/get.html
deleted file mode 100644
index 03a1538..0000000
--- a/src/httpaste/views/viewport/ui/paste/get.html
+++ /dev/null
@@ -1,27 +0,0 @@
-{% extends 'frame/base.html' %}
-
-{% block content %}
-
- Return
- Paste Conditioner
- {% if query['preview'] %}
- Preview
-
-
- {% else %}
- Preview is disabled.
-
- This probably happened because the paste is set to expire after read.
-
- You can still proceed to condition the paste URL.
-
- {% endif %}
- {% include 'container/get_paste_form.html' %}
-
-{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/views/viewport/ui/paste/private/search.html b/src/httpaste/views/viewport/ui/paste/private/search.html
deleted file mode 100644
index 08bce72..0000000
--- a/src/httpaste/views/viewport/ui/paste/private/search.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% extends 'frame/base.html' %}
-
-{% block content %}
- {% include 'container/post_paste_form.html' %}
-{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/views/viewport/ui/paste/public/search.html b/src/httpaste/views/viewport/ui/paste/public/search.html
deleted file mode 100644
index 08bce72..0000000
--- a/src/httpaste/views/viewport/ui/paste/public/search.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% extends 'frame/base.html' %}
-
-{% block content %}
- {% include 'container/post_paste_form.html' %}
-{% endblock %}
\ No newline at end of file
diff --git a/src/httpaste/views/viewport/ui/paste/search.html b/src/httpaste/views/viewport/ui/paste/search.html
deleted file mode 100644
index 17cb192..0000000
--- a/src/httpaste/views/viewport/ui/paste/search.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
- Create a Private Paste
-
-
- Create a Public Paste
-
-
-
- Flush Local HTTP Authentication Cache
-
-
-
-
\ No newline at end of file
diff --git a/src/httpaste/views/viewport/ui/search.html b/src/httpaste/views/viewport/ui/search.html
deleted file mode 100644
index ddfe158..0000000
--- a/src/httpaste/views/viewport/ui/search.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% extends 'frame/decorated.html' %}
-
-{% block content %}
-
-
-{% endblock %}
\ No newline at end of file
From 26aea68acb3e10409874ee649389836b74e7d5ac Mon Sep 17 00:00:00 2001
From: Tiara Rodney
Date: Sat, 16 Apr 2022 22:32:46 +0200
Subject: [PATCH 2/2] chore(setup.cfg): update dependencies
---
Pipfile.lock | 66 +++++++++++++++++++++++++++++++++++++++++++---------
setup.cfg | 1 +
2 files changed, 56 insertions(+), 11 deletions(-)
diff --git a/Pipfile.lock b/Pipfile.lock
index fc24f88..34a19aa 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -292,6 +292,50 @@
"markers": "python_version >= '3.6'",
"version": "==21.3"
},
+ "pillow": {
+ "hashes": [
+ "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e",
+ "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595",
+ "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512",
+ "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c",
+ "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477",
+ "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a",
+ "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4",
+ "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e",
+ "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5",
+ "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378",
+ "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a",
+ "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652",
+ "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7",
+ "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a",
+ "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a",
+ "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6",
+ "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165",
+ "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160",
+ "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331",
+ "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b",
+ "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458",
+ "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033",
+ "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8",
+ "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481",
+ "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58",
+ "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7",
+ "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3",
+ "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea",
+ "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34",
+ "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3",
+ "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8",
+ "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581",
+ "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244",
+ "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef",
+ "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0",
+ "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2",
+ "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97",
+ "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==9.1.0"
+ },
"protobuf": {
"hashes": [
"sha256:001c2160c03b6349c04de39cf1a58e342750da3632f6978a1634a3dcca1ec10e",
@@ -339,11 +383,11 @@
},
"pyparsing": {
"hashes": [
- "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea",
- "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"
+ "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954",
+ "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"
],
- "markers": "python_version >= '3.6'",
- "version": "==3.0.7"
+ "markers": "python_full_version >= '3.6.8'",
+ "version": "==3.0.8"
},
"pyrsistent": {
"hashes": [
@@ -501,11 +545,11 @@
},
"pyparsing": {
"hashes": [
- "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea",
- "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"
+ "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954",
+ "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"
],
- "markers": "python_version >= '3.6'",
- "version": "==3.0.7"
+ "markers": "python_full_version >= '3.6.8'",
+ "version": "==3.0.8"
},
"six": {
"hashes": [
@@ -533,11 +577,11 @@
},
"virtualenv": {
"hashes": [
- "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66",
- "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"
+ "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a",
+ "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==20.14.0"
+ "version": "==20.14.1"
}
}
}
diff --git a/setup.cfg b/setup.cfg
index d8b5b0e..78e0361 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -23,6 +23,7 @@ install_requires =
connexion>=2.13.0,<3
cryptography>=36.0.2,<37
pygments>=2.11.2,<3
+ Pillow>=9.1.0,<10
zip_safe = true
package_dir =
=src