mirror of
https://github.com/d9pouces/id_configurator.git
synced 2026-11-09 01:47:21 +01:00
ci: new regression test for the Python module
Signed-off-by: d9pouces <github@19pouces.net>
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDZTCCAk2gAwIBAgIUY5npknVV83oHxLlZhV66VyobjvQwDQYJKoZIhvcNAQEL
|
||||
BQAwQjEeMBwGA1UECgwVaWQtY29uZmlndXJhdG9yLXRlc3RzMSAwHgYDVQQDDBdp
|
||||
ZC1jb25maWd1cmF0b3IgVGVzdCBDQTAeFw0yNjA5MDMyMTM5NDNaFw00NjA4Mjky
|
||||
MTM5NDNaMEIxHjAcBgNVBAoMFWlkLWNvbmZpZ3VyYXRvci10ZXN0czEgMB4GA1UE
|
||||
AwwXaWQtY29uZmlndXJhdG9yIFRlc3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||
DwAwggEKAoIBAQD8bMteh3MDnbW6OoFMlhA4Z2QAabVoSFlSE/Si7ut+L/3v1GY4
|
||||
lixenwLQc8a2koIH9CtmOodzfO7hpro/VUjYJ9J2eTsXLLiOg7OgggG1cKV9/kt7
|
||||
RF0Q4hkcanGmiffc4xbz4ZedU6lP1vzLCsgU0A8OPt6svcNjGcWbjxss0KjgxGZ7
|
||||
H4UKdL7Mv4W2Y6Fw1b4eV2M6jErkQK6IPXsHGFh7JkzliNcb0sX1VfbfauS84tBh
|
||||
f3EHwzLNhbjtEmQhQdqgsg4Cbk/gWur//6aEvlD/X12PAUbrp4DFD+CDuVagLX7I
|
||||
7TQBXNFGKhozzQuDg7DFg1gIV8SFx2m+s60/AgMBAAGjUzBRMB0GA1UdDgQWBBSb
|
||||
zJ7DsaxwCeqbfOXGJ3x+u7bjozAfBgNVHSMEGDAWgBSbzJ7DsaxwCeqbfOXGJ3x+
|
||||
u7bjozAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA7RooUNpqn
|
||||
XgpHKri5IcQw3kLnqz6yJ00rk2oIwSyji7uW2UHgURZac9kw4w7kXvcoe91cxI64
|
||||
0bOxdNmrNzbP6giqcyWt7pdt+XfIAzBuzbJj0ohXZHcX1d9HcvcpfiPabYWfPJmo
|
||||
qUROsI5jfZ5uG6Q/r15hQpL8PANLmTbxMmg82BCJVUVX/WHnZwWwuCApbRBDb8W5
|
||||
jjzzNHlcLb8B3Iy5Ns2cd05xxkS9ATavvwU94oMhHx1dvxJMszMV3iMo28qbdbKi
|
||||
o0h4KvQc8LrftuYpBuRPMYhLh4vw2A80RYbvuWp7sm7jDt1wKnTn0zioJbFozcJZ
|
||||
otf1rfaEcRH0
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQD8bMteh3MDnbW6
|
||||
OoFMlhA4Z2QAabVoSFlSE/Si7ut+L/3v1GY4lixenwLQc8a2koIH9CtmOodzfO7h
|
||||
pro/VUjYJ9J2eTsXLLiOg7OgggG1cKV9/kt7RF0Q4hkcanGmiffc4xbz4ZedU6lP
|
||||
1vzLCsgU0A8OPt6svcNjGcWbjxss0KjgxGZ7H4UKdL7Mv4W2Y6Fw1b4eV2M6jErk
|
||||
QK6IPXsHGFh7JkzliNcb0sX1VfbfauS84tBhf3EHwzLNhbjtEmQhQdqgsg4Cbk/g
|
||||
Wur//6aEvlD/X12PAUbrp4DFD+CDuVagLX7I7TQBXNFGKhozzQuDg7DFg1gIV8SF
|
||||
x2m+s60/AgMBAAECggEACGXaMjqRYf+/ia2OmwIBvM6mbg5rlvI+k9N5d745HslG
|
||||
n9GngPRwuh581SXfk41g6Wt/J3cvsHDp8Enqt6wFBg6fxYns+a1m38mT5/V19xet
|
||||
+c4ZrBqEeh5Q4DgjsHsLQFGxyXVU5PVhPvhpD/GQ4dhg19l8RlpIg3svrtLeVZRJ
|
||||
T+jy7b0LTkRwe6D7AjE+1tqZr299JBLdH9dS7DeKA3rP7O6HzSEhrtiFxJBfq0v4
|
||||
MDASAhXHytiqIErylb+ZiGSeqTYDLOJBhRcyrjuR1gNlFSxOa1+4iBVo5OVGTkYj
|
||||
ZuT5r18xgJ0EjnMYd5RszWqfjzWGtd0oYyfN599Z+QKBgQD+2YM1JRAHrQORkjPm
|
||||
Bz3JA6R2lDVbng/q1iJsdNUkxU0iKieLJ9KOiMRF9RU9QWIbuI9bvNxShudyZIiM
|
||||
jqEUiUbGnRB5u7rtUOaA8ZlWtsxn3HGJ6C1iN8+IYhPzi3BFPRUHo8gUF+PgpmI3
|
||||
EYXwto6d7uKh1ExBnebt/qnZEwKBgQD9kHrmlKUbrgR7OOLnhVGjB+5AX4fWbWcP
|
||||
n2JOp19O5ZsQdgtP7eYDsdV7h3UGXbH1u53paXJUKneF53k3FtaG+XR6JPnKGk6Y
|
||||
18Z5TvyXtdkgDuxPITHp0DmzJ7+1SmwsY2dMj8VAf08U7aCkURli1SpXx5a9tgly
|
||||
WlURS1aspQKBgFXwW4KMYP91pIJuXvnu7zLd+5PRHr0qbAuw8iLIsyeXMQ+YT4Vp
|
||||
hGN0U1uT7fmeFstqTU2OPm3F+D5nEHT1k/Qs5qULSgcC+2ITqedJkX/gXMWZXOA4
|
||||
XzWDxIQlLr0uBEoU8waEgG/mLn4PHYecbSJjLWyspdgUkzJ9YOZYvkXpAoGAPMhL
|
||||
jcaIJbB7RoaGbfVZcnlONYQw7cff8rDEQhKBGEqV90Y0w/5FKxGQGUKJXPNM25kT
|
||||
64XpcB+V8zVfq0MAPe7Cax09+6J+wMjIvP+gMUXYPIUXRIiyjFfr3PRkUjL651EU
|
||||
zBeSszlRXbTw0zLVoQl0UwJ3MhbXAOCCj9i9eDkCgYBf4XDR8Mi0rKHRL7NP8mYK
|
||||
pKRmH2ABtupcVJn8GgUm8N5xaVsV7z9fW+YcrNQ2jbXogyMgwoyaUNa26mikb9em
|
||||
i6DZCainr36d9UtO4aCMDOfapX18d68jt5FiEeiYs7r+mGZHrGmMFwxFJKmNdqhr
|
||||
affX588Yx9EvfIb9tyk9KA==
|
||||
-----END PRIVATE KEY-----
|
||||
@@ -1,34 +0,0 @@
|
||||
uuid: 8453d139-cbe5-43b0-ab35-4468042b8c7e
|
||||
organisation: InterDiode
|
||||
description: Python test configuration
|
||||
configurations:
|
||||
certificates:
|
||||
- name: Test CA
|
||||
content: |
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIB9DCCAZqgAwIBAgIUNEY8PzyPCdLkjmIa1xx4vroIVu4wCgYIKoZIzj0EAwIw
|
||||
WDELMAkGA1UEBhMCRlIxFzAVBgNVBAgMDsOObGUtZGUtRnJhbmNlMQ4wDAYDVQQH
|
||||
DAVQYXJpczETMBEGA1UECgwKSW50ZXJEaW9kZTELMAkGA1UEAwwCQ0EwHhcNMjUw
|
||||
NjAxMTAxMzIwWhcNMzUwNjAyMTAxMzIwWjBYMQswCQYDVQQGEwJGUjEXMBUGA1UE
|
||||
CAwOw45sZS1kZS1GcmFuY2UxDjAMBgNVBAcMBVBhcmlzMRMwEQYDVQQKDApJbnRl
|
||||
ckRpb2RlMQswCQYDVQQDDAJDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHpF
|
||||
2Re3jZFY2fP//pvkV2uz3J7QahyNHJJBgo7jnxXSlVsD6uflmrS1wcgkhSlmH8wp
|
||||
CgU+5BpVKb0USyLEwW2jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
|
||||
AgGGMB0GA1UdDgQWBBR2MVIEFjGsx99GHEIyB0x6P8Fz5DAKBggqhkjOPQQDAgNI
|
||||
ADBFAiAuG/B1EL6o7G4ZuWhLGEGhhkCvO+hYsiQ7GHaP6V4YogIhAMkMiO5lPDPR
|
||||
0XU60FMDiUOK2cUZyupytPArWQqg3F4J
|
||||
-----END CERTIFICATE-----
|
||||
apt:
|
||||
sources: []
|
||||
keys: []
|
||||
apk:
|
||||
repositories: []
|
||||
yum:
|
||||
repositories: []
|
||||
keys: []
|
||||
python:
|
||||
repositories:
|
||||
- name: demo
|
||||
index-url: http://localhost:8000/
|
||||
java:
|
||||
repositories: []
|
||||
@@ -0,0 +1,22 @@
|
||||
uuid: 8453d139-cbe5-43b0-ab35-4468042b8c7e
|
||||
organisation: InterDiode
|
||||
description: Python test configuration
|
||||
configurations:
|
||||
certificates:
|
||||
- name: Test CA
|
||||
content: |
|
||||
{{ 'certs/test-ca.crt.pem' | file | indent(6, first=true) }}
|
||||
apt:
|
||||
sources: []
|
||||
keys: []
|
||||
apk:
|
||||
repositories: []
|
||||
yum:
|
||||
repositories: []
|
||||
keys: []
|
||||
python:
|
||||
repositories:
|
||||
- name: demo
|
||||
index-url: https://host.docker.internal:{{ 'PYPI_REPO_PORT' | env }}/simple/
|
||||
java:
|
||||
repositories: []
|
||||
@@ -1,7 +1,9 @@
|
||||
FROM dhi.io/python:3.14-debian13 AS detection
|
||||
FROM python:3.13-slim AS detection
|
||||
FROM interdiode/id_configurator:latest AS configuration
|
||||
COPY --from=detection / /src/
|
||||
COPY ./tests/configs/Python.yaml /config.yaml
|
||||
COPY --from=generated-config Python.yaml /config.yaml
|
||||
RUN id-configurator apply --config /config.yaml --src /src --dst /dst
|
||||
FROM dhi.io/python:3.14-debian13 AS runtime
|
||||
FROM python:3.13-slim AS runtime
|
||||
COPY --from=configuration /dst/ /
|
||||
RUN pip install --no-cache-dir idconfiguratortestpkg \
|
||||
&& python3 -c "import idconfiguratortestpkg"
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
"""Build a minimal, offline, hand-rolled wheel and PEP 503 "simple" index for
|
||||
integration-testing the `python` module of id-configurator.
|
||||
|
||||
No network access and no build backend (setuptools/build/pip) are used: the
|
||||
wheel is a plain zip file assembled with the standard library only, so this
|
||||
script can run in a minimal Python image with nothing installed.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import base64
|
||||
import hashlib
|
||||
import pathlib
|
||||
import zipfile
|
||||
|
||||
PACKAGE = "idconfiguratortestpkg"
|
||||
VERSION = "0.0.1"
|
||||
WHEEL_NAME = f"{PACKAGE}-{VERSION}-py3-none-any.whl"
|
||||
OUT_DIR = pathlib.Path("/srv")
|
||||
|
||||
METADATA = f"""Metadata-Version: 2.1
|
||||
Name: {PACKAGE}
|
||||
Version: {VERSION}
|
||||
Summary: Test-only package served by the id-configurator integration tests
|
||||
"""
|
||||
|
||||
WHEEL_FILE = """Wheel-Version: 1.0
|
||||
Generator: id-configurator-tests
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
"""
|
||||
|
||||
INIT_PY = '"""Test-only package used to verify the python module mirror."""\n'
|
||||
|
||||
|
||||
def _record_line(path: str, content: bytes) -> str:
|
||||
digest = base64.urlsafe_b64encode(hashlib.sha256(content).digest()).rstrip(b"=")
|
||||
return f"{path},sha256={digest.decode('ascii')},{len(content)}"
|
||||
|
||||
|
||||
def build_wheel(packages_dir: pathlib.Path) -> bytes:
|
||||
dist_info = f"{PACKAGE}-{VERSION}.dist-info"
|
||||
files = {
|
||||
f"{PACKAGE}/__init__.py": INIT_PY.encode("utf-8"),
|
||||
f"{dist_info}/METADATA": METADATA.encode("utf-8"),
|
||||
f"{dist_info}/WHEEL": WHEEL_FILE.encode("utf-8"),
|
||||
}
|
||||
record_lines = [_record_line(name, content) for name, content in files.items()]
|
||||
record_lines.append(f"{dist_info}/RECORD,,")
|
||||
files[f"{dist_info}/RECORD"] = ("\n".join(record_lines) + "\n").encode("utf-8")
|
||||
|
||||
packages_dir.mkdir(parents=True, exist_ok=True)
|
||||
wheel_path = packages_dir / WHEEL_NAME
|
||||
with zipfile.ZipFile(wheel_path, "w", zipfile.ZIP_DEFLATED) as archive:
|
||||
for name, content in files.items():
|
||||
archive.writestr(name, content)
|
||||
return wheel_path.read_bytes()
|
||||
|
||||
|
||||
def write_simple_index(simple_dir: pathlib.Path, wheel_content: bytes) -> None:
|
||||
package_dir = simple_dir / PACKAGE
|
||||
package_dir.mkdir(parents=True, exist_ok=True)
|
||||
digest = hashlib.sha256(wheel_content).hexdigest()
|
||||
html = f"""<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<a href="../../packages/{WHEEL_NAME}#sha256={digest}">{WHEEL_NAME}</a>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
(package_dir / "index.html").write_text(html, encoding="utf-8")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
wheel_content = build_wheel(OUT_DIR / "packages")
|
||||
write_simple_index(OUT_DIR / "simple", wheel_content)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,16 @@
|
||||
# Minimal PEP 503 "simple" package index, serving one hand-built test wheel
|
||||
# over TLS, used by tox-docker to exercise the `python` module integration
|
||||
# test (tests/configs/Python.yaml.tmpl, tests/dockerfiles/Python.Dockerfile).
|
||||
#
|
||||
# Built by tox-docker, whose build context is this directory (not the repo
|
||||
# root) - every COPY source below must live under tests/dockerfiles/repos/.
|
||||
FROM python:3.13-slim AS wheelbuild
|
||||
COPY build_test_wheel.py /build_test_wheel.py
|
||||
RUN python3 /build_test_wheel.py
|
||||
|
||||
FROM nginx:alpine
|
||||
COPY --from=wheelbuild /srv /srv
|
||||
COPY repo-server.crt.pem /etc/nginx/certs/repo-server.crt.pem
|
||||
COPY repo-server.key.pem /etc/nginx/certs/repo-server.key.pem
|
||||
COPY pypi-repo.nginx.conf /etc/nginx/conf.d/default.conf
|
||||
EXPOSE 8443
|
||||
@@ -0,0 +1,10 @@
|
||||
server {
|
||||
listen 8443 ssl default_server;
|
||||
server_name _;
|
||||
|
||||
ssl_certificate /etc/nginx/certs/repo-server.crt.pem;
|
||||
ssl_certificate_key /etc/nginx/certs/repo-server.key.pem;
|
||||
|
||||
root /srv;
|
||||
autoindex off;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDqTCCApGgAwIBAgIUUuJBYcNFFtJcKH2PDPTA+QZMP3QwDQYJKoZIhvcNAQEL
|
||||
BQAwQjEeMBwGA1UECgwVaWQtY29uZmlndXJhdG9yLXRlc3RzMSAwHgYDVQQDDBdp
|
||||
ZC1jb25maWd1cmF0b3IgVGVzdCBDQTAeFw0yNjA5MDMyMTM5NDNaFw00NjA4Mjky
|
||||
MTM5NDNaMDYxHjAcBgNVBAoMFWlkLWNvbmZpZ3VyYXRvci10ZXN0czEUMBIGA1UE
|
||||
AwwLcmVwby1zZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCu
|
||||
xCtsiQxqntOBY+LlKxgXs5N0WSKJY5jeof0SzIJWNr7W8GBMbh9fqnXms4Vnimhs
|
||||
AYa6RsTmfGpSzLO73+NlzpuApV9kTBXZmeHVqrJ6S/mFKBZDN74uFiDWl93K1Z/G
|
||||
VccntAdbCsNCMRt71CZ7DD0vFfQSN4qQ3fPDT9EpV8Xv6Pj/MFJvEMp+pu4f7mwh
|
||||
xJQBtlC72okHvcMp6MsbfDFYRTUWFtsDpCct7pps1sRVyalLvxIaFugzpuiTU2+Q
|
||||
0FdlBi5IRhCZjrOlW4kGAyjiP+q/SwZ8j1YJnjifoxLrcn+26ONCNfv/JKsnl8Yr
|
||||
hKGwbrlzEgeoekE8TH9xAgMBAAGjgaIwgZ8wCQYDVR0TBAIwADALBgNVHQ8EBAMC
|
||||
BaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwMAYDVR0RBCkwJ4IUaG9zdC5kb2NrZXIu
|
||||
aW50ZXJuYWyCCWxvY2FsaG9zdIcEfwAAATAdBgNVHQ4EFgQUmPGECu+/yUR3pzKk
|
||||
RSDMtRQvFEAwHwYDVR0jBBgwFoAUm8yew7GscAnqm3zlxid8fru246MwDQYJKoZI
|
||||
hvcNAQELBQADggEBAPZ3xMe6vECPfrWGEru2eSL75JCUl+zLZm40EkCLidiBTXch
|
||||
dvuJYHEjp6oSnTdgPOPlyjgFY/jMkHuRvl46Zwr74eFBZyYqaYxm50Drc4/09/VF
|
||||
bo59/fRbO6UCk/yvTw83q5URL2d9zw79dnWJaOfCHlm9laY2DvD5cPZbYNZ1dlEg
|
||||
nwNiRmw2/twIjuvMBGG+Ooy1V2rOOzR+ytcyf7Ekpotc4DpS/NLC0cPL/gjDoJMc
|
||||
Ot/YZo55Myrrk8IN681ou5Kv+vAUURxCcMaJaFMNfM4HBPW2dwrOp5tplGw0C/pX
|
||||
Kqub6yjjUmzPCIRiWUsW+4mg3UxaL41Q9013Mlw=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCuxCtsiQxqntOB
|
||||
Y+LlKxgXs5N0WSKJY5jeof0SzIJWNr7W8GBMbh9fqnXms4VnimhsAYa6RsTmfGpS
|
||||
zLO73+NlzpuApV9kTBXZmeHVqrJ6S/mFKBZDN74uFiDWl93K1Z/GVccntAdbCsNC
|
||||
MRt71CZ7DD0vFfQSN4qQ3fPDT9EpV8Xv6Pj/MFJvEMp+pu4f7mwhxJQBtlC72okH
|
||||
vcMp6MsbfDFYRTUWFtsDpCct7pps1sRVyalLvxIaFugzpuiTU2+Q0FdlBi5IRhCZ
|
||||
jrOlW4kGAyjiP+q/SwZ8j1YJnjifoxLrcn+26ONCNfv/JKsnl8YrhKGwbrlzEgeo
|
||||
ekE8TH9xAgMBAAECggEADfew5MUoEEloHzo4qX1bn2FQLDqHfEvqegVssLKJl1+O
|
||||
ukAoSIawmTiKOola5LiQhrlK53S9sRIWfIGbVJOcz/rGpAetHqeTqeCwYB96980+
|
||||
QJPzzr5HKjwrtoFMTgHrk0vKiMDM3OWr6PL8Me+PSvXic4xUnzQZlGE4zAGDQ10V
|
||||
xCs0ZrCYGVbMxzOWSBZivd5Tbj7OeCuLEPRqUX5D824bloaudLtO+0pEe8oaFEdt
|
||||
cgwMPUGdz9+XPQlaYPOtcTbk0fTcrUYzyjcYR1CwI48xj6jXnLvFAdTjZnjSgmSr
|
||||
lcxOJNxpRgj8MYvHjHQekyxxBUF3HsaWfbTscWzghQKBgQDyVMgirF7bykCe+E/q
|
||||
HZSio3xdX8TTVyJvxBZeG+sAHFvc0Z0ihA1CrIZIZOYK6c+mF1CHVQ5jPEc0GKwC
|
||||
mzXjqO3kLEUumbrBGXtmPQd7wJ/jVTv9u4JsfqCzMVj3xNTEbpmp5FvZ2JofEb5f
|
||||
7mFWKl1L1JZ58M5B1XUgYSqZ/wKBgQC4n8NZgq1k1jsxGzTggJzDvi230lkIJG1+
|
||||
Tf3wm8AoqCoGtG4O53a6fpsNKlNgNgivk5cUUACj2HRXC44tz5/MydRLRzePLG8M
|
||||
MCjrmPEHCD9zKKn9z0DMjHVL2TAy3aRD1Flo8HcERMD8xyklX2kPtJqkiKUJm2Gm
|
||||
5qrRlRuGjwKBgHYCeZABFxS7sqp3zBr7msV1Dfw+xhART9DT0fy0ZcWhCc9IONh1
|
||||
LCv67k3U7P4FjLyaf/nXnvEOirJBDYsbYKvkOS0zreEatgqRSTmpoLpQPMytVlCi
|
||||
/smtBL8e2e+W5/Jc1fIZJe25gJx+vJHk+XvHl7V06m6pqRgARlClYOSrAoGAZ4uS
|
||||
8FzOCsPsJrpviYoYYeADnBkpPdvQXQo45f00ZJkMGP6Qy2Mdv7LKGzQl1sv3SyGn
|
||||
lgjYkwwPE9KzRxYvNZfsrNugWXg+P8Oy74+zfpIto9SmombenNoZ3xRMZ/rO6gvq
|
||||
qWRUG9zDsAGzHfbI4boVETph9WVj+0tbenf6HBkCgYBWM8J+M+UoHmKZyarZFKum
|
||||
uuVHFM4WzdBVM22NyFFrkYmfCD6tnNb2ZfcwabX2NY+d2AJLA9aNdVlgQHb/SJaC
|
||||
orwNrOuW0wLjGEivXZieGTRHwrcS7IMtG78nm/fMuEMjEwTQkW61bGmSmWxCCnGe
|
||||
2uuQwlL68XytRGkpgPKK6g==
|
||||
-----END PRIVATE KEY-----
|
||||
Reference in New Issue
Block a user