Skip to content

Commit

Permalink
1.0.67 Improve build resiliency
Browse files Browse the repository at this point in the history
  • Loading branch information
webpwnized committed Aug 15, 2024
1 parent 4f3fdf8 commit 00c35a9
Show file tree
Hide file tree
Showing 22 changed files with 316 additions and 74 deletions.
6 changes: 3 additions & 3 deletions .build/database/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Container image: webpwnized/mutillidae:database
# From project root, build with:
# docker build --file .build/database/Dockerfile --tag webpwnized/mutillidae:database .
# docker build --file ./Dockerfile --tag webpwnized/mutillidae:database .build/database/
# docker build: This is the command to build a Docker image.
# --file .build/database/Dockerfile: This specifies the path to the Dockerfile you want to use. In this case, it's .build/database/Dockerfile.
# --tag webpwnized/mutillidae:database: This tags the resulting Docker image with a name (webpwnized/mutillidae) and a tag (database).
# .: This is the build context. It indicates the directory to be used for the build process. The Docker daemon will send this directory's contents to the Docker engine. In this case, the dot represents the current directory.
#
# From project root, run with:
# docker-compose --file .build/docker-compose.yml up --detach
# docker-compose: This is the Docker Compose command-line tool used for managing multi-container Docker applications.
# docker compose -f .build/docker-compose.yml up --build --detach
# docker compose: This is the Docker Compose command-line tool used for managing multi-container Docker applications.
# --file .build/docker-compose.yml: This option (--file or -f) specifies the path to the docker-compose.yml file. In this case, it’s located at .build/docker-compose.yml.
# up: This subcommand tells Docker Compose to create and start the containers defined in the docker-compose.yml file. If the containers do not exist, they will be created. If they already exist, they will be started.
# --detach: This option (--detach or -d) runs the containers in the background (detached mode). When you use this option, Docker Compose will start the containers and return control to the terminal, allowing you to continue using it for other commands or tasks.
Expand Down
4 changes: 2 additions & 2 deletions .build/database_admin/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Container image: webpwnized/mutillidae:database_admin
# From project root, build with:
# docker build --file .build/database_admin/Dockerfile --tag webpwnized/mutillidae:database_admin .
# docker build --file ./Dockerfile --tag webpwnized/mutillidae:database_admin .build/database_admin/
# docker build: This is the command to build a Docker image.
# --file .build/database_admin/Dockerfile: This specifies the path to the Dockerfile you want to use. In this case, it's .build/database_admin/Dockerfile.
# --tag webpwnized/mutillidae:database_admin: This tags the resulting Docker image with a name (webpwnized/mutillidae) and a tag (database_admin).
# .: This is the build context. It indicates the directory to be used for the build process. The Docker daemon will send this directory's contents to the Docker engine. In this case, the dot represents the current directory.
#
# From project root, run with:
# docker-compose --file .build/docker-compose.yml up --detach
# docker compose -f .build/docker-compose.yml up --build --detach
# docker-compose: This is the Docker Compose command-line tool used for managing multi-container Docker applications.
# --file .build/docker-compose.yml: This option (--file or -f) specifies the path to the docker-compose.yml file. In this case, it’s located at .build/docker-compose.yml.
# up: This subcommand tells Docker Compose to create and start the containers defined in the docker-compose.yml file. If the containers do not exist, they will be created. If they already exist, they will be started.
Expand Down
1 change: 0 additions & 1 deletion .build/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# Documentation: https://github.com/compose-spec/compose-spec/blob/master/spec.md
# Purpose: Build local containers for the Mutillidae environment

version: '3.7'
services:

database:
Expand Down
6 changes: 4 additions & 2 deletions .build/ldap/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# Container image: webpwnized/mutillidae:ldap
# From project root, build with:
# docker build --file .build/ldap/Dockerfile --tag webpwnized/mutillidae:ldap .
# docker build --file ./Dockerfile --tag webpwnized/mutillidae:ldap .build/ldap/
#
# docker build: This is the command to build a Docker image.
# --file .build/ldap/Dockerfile: This specifies the path to the Dockerfile you want to use. In this case, it's .build/ldap/Dockerfile.
# --tag webpwnized/mutillidae:ldap: This tags the resulting Docker image with a name (webpwnized/mutillidae) and a tag (ldap).
# .: This is the build context. It indicates the directory to be used for the build process. The Docker daemon will send this directory's contents to the Docker engine. In this case, the dot represents the current directory.
#
# From project root, run with:
# docker-compose --file .build/docker-compose.yml up --detach
# docker compose -f .build/docker-compose.yml up --build --detach
# docker-compose: This is the Docker Compose command-line tool used for managing multi-container Docker applications.
# --file .build/docker-compose.yml: This option (--file or -f) specifies the path to the docker-compose.yml file. In this case, it’s located at .build/docker-compose.yml.
# up: This subcommand tells Docker Compose to create and start the containers defined in the docker-compose.yml file. If the containers do not exist, they will be created. If they already exist, they will be started.
Expand Down Expand Up @@ -36,3 +37,4 @@ ENV LDAP_TLS="false"
# apt-get -y autoremove && \
# apt-get clean && \
# rm -rf /var/lib/apt/lists/*

File renamed without changes.
5 changes: 3 additions & 2 deletions .build/ldap_admin/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# Container image: webpwnized/mutillidae:ldap_admin
# From project root, build with:
# docker build --file .build/ldap_admin/Dockerfile --tag webpwnized/mutillidae:ldap_admin .
# docker build --file ./Dockerfile --tag webpwnized/mutillidae:ldap_admin .build/ldap_admin/
#
# docker build: This is the command to build a Docker image.
# --file .build/ldap_admin/Dockerfile: This specifies the path to the Dockerfile you want to use. In this case, it's .build/ldap_admin/Dockerfile.
# --tag webpwnized/mutillidae:ldap_admin: This tags the resulting Docker image with a name (webpwnized/mutillidae) and a tag (ldap_admin).
# .: This is the build context. It indicates the directory to be used for the build process. The Docker daemon will send this directory's contents to the Docker engine. In this case, the dot represents the current directory.
#
# From project root, run with:
# docker-compose --file .build/docker-compose.yml up --detach
# docker compose -f .build/docker-compose.yml up --build --detach
# docker-compose: This is the Docker Compose command-line tool used for managing multi-container Docker applications.
# --file .build/docker-compose.yml: This option (--file or -f) specifies the path to the docker-compose.yml file. In this case, it’s located at .build/docker-compose.yml.
# up: This subcommand tells Docker Compose to create and start the containers defined in the docker-compose.yml file. If the containers do not exist, they will be created. If they already exist, they will be started.
Expand Down
32 changes: 19 additions & 13 deletions .build/www/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Container image: webpwnized/mutillidae:www
# From project root, build with:
# docker build --file .build/www/Dockerfile --tag webpwnized/mutillidae:www .
# docker build --file ./Dockerfile --tag webpwnized/mutillidae:www .build/www/
# docker build: This is the command to build a Docker image.
# --file .build/www/Dockerfile: This specifies the path to the Dockerfile you want to use. In this case, it's .build/www/Dockerfile.
# --tag webpwnized/mutillidae:www: This tags the resulting Docker image with a name (webpwnized/mutillidae) and a tag (www).
# .: This is the build context. It indicates the directory to be used for the build process. The Docker daemon will send this directory's contents to the Docker engine. In this case, the dot represents the current directory.
#
# From project root, run with:
# docker-compose --file .build/docker-compose.yml up --detach
# docker compose -f .build/docker-compose.yml up --build --detach
# docker-compose: This is the Docker Compose command-line tool used for managing multi-container Docker applications.
# --file .build/docker-compose.yml: This option (--file or -f) specifies the path to the docker-compose.yml file. In this case, it’s located at .build/docker-compose.yml.
# up: This subcommand tells Docker Compose to create and start the containers defined in the docker-compose.yml file. If the containers do not exist, they will be created. If they already exist, they will be started.
Expand Down Expand Up @@ -87,26 +87,32 @@ RUN rm /var/www/mutillidae/.htaccess && \
# Configure the web server #
# ######################## #

# Create directories for the Apache configuration and error pages
RUN mkdir /etc/apache2/conf/ && \
mkdir /etc/apache2/error-pages/

# Copy the TLS certificate files from mutillidae into cert directories
# Copy the host entries into the host file
# Copy the Apache configuration from Mutillidae into Apache conf
# Copy the error pages from Mutillidae into Apache error pages
# Copy the aliases configuration into Apache conf-available
# Copy the Mutillidae site configuration into Apache sites-available
COPY ./configuration/https-certificate/mutillidae-selfsigned.crt /etc/ssl/certs/mutillidae-selfsigned.crt
COPY ./configuration/https-certificate/mutillidae-selfsigned.key /etc/ssl/private/mutillidae-selfsigned.key
COPY ./configuration/apache-configuration/conf/error-pages.conf /etc/apache2/conf/error-pages.conf
COPY ./configuration/apache-configuration/conf/headers.conf /etc/apache2/conf/headers.conf
COPY ./configuration/apache-configuration/error-pages/404.html /etc/apache2/error-pages/404.html
COPY ./configuration/apache-configuration/error-pages/oops.jpg /etc/apache2/error-pages/oops.jpg
COPY ./configuration/apache-configuration/conf-available/aliases.conf /etc/apache2/conf-available/aliases.conf
COPY ./configuration/apache-configuration/sites-available/mutillidae.conf /etc/apache2/sites-available/mutillidae.conf

# Change the localhost references to listen on external network interfaces
# Unlink access log and error log so the log files can be written in the container
# Make sure access log and error log exist
# Enable Apache TLS modules
# Disable the default site because it intercepts calls to Mutillidae made by IP address
# Enable the mutillidae site
RUN cp /var/www/mutillidae/configuration/https-certificate/mutillidae-selfsigned.crt /etc/ssl/certs/mutillidae-selfsigned.crt && \
cp /var/www/mutillidae/configuration/https-certificate/mutillidae-selfsigned.key /etc/ssl/private/mutillidae-selfsigned.key && \
mkdir /etc/apache2/conf/ && \
cp /var/www/mutillidae/configuration/apache-configuration/conf/error-pages.conf /etc/apache2/conf/error-pages.conf && \
cp /var/www/mutillidae/configuration/apache-configuration/conf/headers.conf /etc/apache2/conf/headers.conf && \
mkdir /etc/apache2/error-pages/ && \
cp /var/www/mutillidae/configuration/apache-configuration/error-pages/404.html /etc/apache2/error-pages/404.html && \
cp /var/www/mutillidae/configuration/apache-configuration/error-pages/oops.jpg /etc/apache2/error-pages/oops.jpg && \
cp /var/www/mutillidae/configuration/apache-configuration/conf-available/aliases.conf /etc/apache2/conf-available/aliases.conf && \
cp /var/www/mutillidae/configuration/apache-configuration/sites-available/mutillidae.conf /etc/apache2/sites-available/mutillidae.conf && \
sed -i 's/127.0.0.1/0.0.0.0/' /etc/apache2/sites-available/mutillidae.conf && \
RUN sed -i 's/127.0.0.1/0.0.0.0/' /etc/apache2/sites-available/mutillidae.conf && \
sed -i 's/127.0.0.2/0.0.0.0/' /etc/apache2/sites-available/mutillidae.conf && \
unlink /var/log/apache2/access.log && \
unlink /var/log/apache2/error.log && \
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Alias /error-pages/404.html /var/www/error-pages/404.html
Alias /error-pages/oops.jpg /var/www/error-pages/oops.jpg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ErrorDocument 404 /error-pages/404.html
14 changes: 14 additions & 0 deletions .build/www/configuration/apache-configuration/conf/headers.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#Header unset X-Powered-By

#Header set X-XSS-Protection "1;mode=block"
#Header set X-Content-Type-Options "nosniff"
#Header set X-Frame-Options "SAMEORIGIN"
#Header set Content-Security-Policy "frame-ancestors 'self';"

#Header set Cache-Control "no-cache=\"Set-Cookie\""
#Header unset Pragma

#<Files *.php>
# Header set Cache-Control "no-store,no-cache"
# Header set Pragma "no-cache"
#</Files>
17 changes: 17 additions & 0 deletions .build/www/configuration/apache-configuration/error-pages/404.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html>
<head>
<title>Page not found</title>
</head>

<body>
<br />
<br />
<div style="text-align:center;font-weight: bold;">
<img src="/error-pages/oops.jpg" />
</div>
<br />
<div style="text-align:center;font-weight:bold;font-size:42px;">We cannot find that resource</div>
<div style="text-align:center;font-weight:bold;font-size:42px;">That's all we know</div>
</body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<VirtualHost 127.0.0.1:80>
ServerName mutillidae.localhost
ServerAlias www.mutillidae.localhost mutillidae
DocumentRoot /var/www/mutillidae
Include conf/headers.conf
Include conf/error-pages.conf

<IfModule dir_module>
DirectoryIndex index.php
</IfModule>

<Directory /var/www/mutillidae>
AllowOverride All
Options +Indexes +FollowSymLinks +MultiViews
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/mutillidae-error.log
CustomLog ${APACHE_LOG_DIR}/mutillidae-access.log combined
</VirtualHost>

<VirtualHost 127.0.0.1:443>
ServerName mutillidae.localhost
ServerAlias www.mutillidae.localhost mutillidae
DocumentRoot /var/www/mutillidae
Include conf/headers.conf
Include conf/error-pages.conf

<IfModule dir_module>
DirectoryIndex index.php
</IfModule>

<Directory /var/www/mutillidae>
AllowOverride All
Options +Indexes +FollowSymLinks +MultiViews
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/mutillidae-error.log
CustomLog ${APACHE_LOG_DIR}/mutillidae-access.log combined

SSLEngine On
SSLOptions +StrictRequire
SSLCertificateFile /etc/ssl/certs/mutillidae-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/mutillidae-selfsigned.key
SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2 +TLSv1.3
</VirtualHost>

<VirtualHost 127.0.0.2:80>
ServerName cors.mutillidae.localhost
ServerAlias webservice.mutillidae.localhost api.mutillidae.localhost
DocumentRoot /var/www/mutillidae
Include conf/error-pages.conf

<IfModule dir_module>
DirectoryIndex index.php
</IfModule>

<Directory /var/www/mutillidae>
AllowOverride All
Options +Indexes +FollowSymLinks +MultiViews
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/cors-mutillidae-error.log
CustomLog ${APACHE_LOG_DIR}/cors-mutillidae-access.log combined
</VirtualHost>

<VirtualHost 127.0.0.2:443>
ServerName cors.mutillidae.localhost
ServerAlias webservice.mutillidae.localhost api.mutillidae.localhost
DocumentRoot /var/www/mutillidae
Include conf/error-pages.conf

<IfModule dir_module>
DirectoryIndex index.php
</IfModule>

<Directory /var/www/mutillidae>
AllowOverride All
Options +Indexes +FollowSymLinks +MultiViews
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/cors-mutillidae-error.log
CustomLog ${APACHE_LOG_DIR}/cors-mutillidae-access.log combined

SSLEngine On
SSLOptions +StrictRequire
SSLCertificateFile /etc/ssl/certs/mutillidae-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/mutillidae-selfsigned.key
SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2 +TLSv1.3
</VirtualHost>
3 changes: 3 additions & 0 deletions .build/www/configuration/hosts-file/hosts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

127.0.0.1 localhost mutillidae.localhost www.mutillidae.localhost mutillidae
127.0.0.2 cors.mutillidae.localhost webservice.mutillidae.localhost api.mutillidae.localhost
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIEXzCCA0egAwIBAgIUVTpLNZlka/LtfI5GlvV+Pk4TlFMwDQYJKoZIhvcNAQEL
BQAwgb4xCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJLeTESMBAGA1UEBwwJV2VzdHdv
cmxkMRYwFAYDVQQKDA1NdXRpbGxpZGFlIElJMSgwJgYDVQQLDB9BcHBsaWNhdGlv
biBTZWN1cml0eSBEZXBhcnRtZW50MR0wGwYDVQQDDBRtdXRpbGxpZGFlLmxvY2Fs
aG9zdDEtMCsGCSqGSIb3DQEJARYed2VibWFzdGVyQG11dGlsbGlkYWUubG9jYWxo
b3N0MB4XDTIyMDgyNDIzMzAwNFoXDTMyMDgyMTIzMzAwNFowgb4xCzAJBgNVBAYT
AlVTMQswCQYDVQQIDAJLeTESMBAGA1UEBwwJV2VzdHdvcmxkMRYwFAYDVQQKDA1N
dXRpbGxpZGFlIElJMSgwJgYDVQQLDB9BcHBsaWNhdGlvbiBTZWN1cml0eSBEZXBh
cnRtZW50MR0wGwYDVQQDDBRtdXRpbGxpZGFlLmxvY2FsaG9zdDEtMCsGCSqGSIb3
DQEJARYed2VibWFzdGVyQG11dGlsbGlkYWUubG9jYWxob3N0MIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0cZFe4OPwRgAUU6IowcbmBu++OZ0HACs0mFg
R2IUawXeLn5bfpia/2uh1TApVSJM+xSFGgx8LUjn09xZYbQUFlTKiFTFBspDRMTn
8y1tseIUSlaL2/PQ1B2z8ZC341TLak9UifKqFvFfB3dnc+tqR6Anmf4ZxiEg7Fn+
GYRASsjrt+K3B8lSAwkbLt2pKThqeZpJ/mMiG82ubxmW/++qx+iIhAxyky3QV/Ir
knmH24808SFz6keuo79/0C+U4Lr7oMrnbcYGQBa91JLA6I2HmDT3SCgKF5visp7F
ZT/moXruHx7gM2C2Oeqo8mKCnja85ipNoJ+GWKjAruYtyNwPMwIDAQABo1MwUTAd
BgNVHQ4EFgQUQ9MR7G1kIHl7c3ouMx3r0WpBFvowHwYDVR0jBBgwFoAUQ9MR7G1k
IHl7c3ouMx3r0WpBFvowDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
AQEALyVQXSkHcasurwnawY9/14e2xWTTp3ux8crtfVm0hQlYhK7HNaco/E5enMZr
wgv1SrrIewiEKW6kSbOQ74S7fbjBDDzdOhQjEhASjVzEdwXXa0Zq07Hym1mw8SoK
0zbwj0NI99gN1/wSSU6Je7NEEY8IeirWT7CGoS6/zMaexvX2kXNAcCks9+T4Ymo7
4fJMBVgXQUNkMndt6wZlc6ZnO7RZcjyziwzyV7J+hFMrzmxeD6JSr0HSkBWkt3ex
lA3KGmfKRbd3bNgqOErRz6lUFSg5PPmJriNftdhTT0HUlkKn+4Dh0kcsJVOMFBou
KhrfFX1Wd7SFm+jmer53NR3pqQ==
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRxkV7g4/BGABR
ToijBxuYG7745nQcAKzSYWBHYhRrBd4uflt+mJr/a6HVMClVIkz7FIUaDHwtSOfT
3FlhtBQWVMqIVMUGykNExOfzLW2x4hRKVovb89DUHbPxkLfjVMtqT1SJ8qoW8V8H
d2dz62pHoCeZ/hnGISDsWf4ZhEBKyOu34rcHyVIDCRsu3akpOGp5mkn+YyIbza5v
GZb/76rH6IiEDHKTLdBX8iuSeYfbjzTxIXPqR66jv3/QL5TguvugyudtxgZAFr3U
ksDojYeYNPdIKAoXm+KynsVlP+aheu4fHuAzYLY56qjyYoKeNrzmKk2gn4ZYqMCu
5i3I3A8zAgMBAAECggEACjCe7G6KG5+eWFS/x2ePfBaQ8sdDCZ8wxfFr+1u00TQS
RGDn8eDY2qJwVIpH37ZQVfv7sTW9DHgXps9z2g6k0SbiRbgUcA2AMgV8nO/ufa8V
PD0zAwa3dK5SsN/ORvE2Bl5/JUpP39huvM6cjGF5oqwRcGYK+3hdgI2ojbXCZ79/
Su+4c+XoE0BVmxrqwWv3NkuEvgMkQCFXzoOMANkT8lHIywrHGQ76pF1YFXYVMxHU
+aEP36h++wQCQrDgKR7ituJHViGjPeaR9amm2YSeIeHVBbfa4aQ7kKP02L+6ZJc9
JNK7Z2LPpqJY53UQekds5+UuL2tUUNsX3F3D/8m3EQKBgQDi5DU9Pew8JEvvUCpK
SCD9XKSU5OF504d5UgzRDifimaXT/b7FhOEwDvs7mSxWP4j1RqksEImXX57oX80i
fESFH1an+rP3At6od8jjG/pLKf610Gve++U4zq81ZzkQALQ+6CqgTsc89sl5IJT/
dZ5m6gjQmYmN2Ug93aSmd8JV8QKBgQDsr+ReHcmgkpfzbHhG7b0ws2WkQBMbNpNU
huMoQoKaB+ynB2dG3K1jlaQdTZpWtWSIAIKxst9fE1EE6E/iDGeuDO8QQNqLHWPX
GlEfcatEl7VwbQJxWcjSG58HOw4vVwZ5fiGLg3D7YKRXCZKncCwAo6CoXPes+Swa
e5BizeMDYwKBgQChy3ajm1qwcHmtyA7ANbtAsSWz/5tCErOSsg3trhiHIGX+S/4U
P/ONH8HL+CiDwH7b2W2dvJVBWrCoqFhR9Sevfm9/DenzhRpeLD0WpsbPfrzhziR+
OEZ3QfvzKw6n+LiP+2MaOdMeCCYXuEJIAQnZ/Z4XksViX8WCSGG3S8NLIQKBgQCS
nb60QnWE/2obQ4UaQujgQzDiV0K+p8cKJGiQpuqqKeCB80cZkVfjCW5ZLJo/vivh
R5euJiTSi2+zv4jEeXS8T4zDn7kBVhpjxAyektZKLkQZuZ06xChvZubTHtUBpEIB
fo2fE7QoM8x5kheDmyvW1YWO5dATGWMloIdnfSx0CwKBgElCM60QHSsD2QMuSADI
ZjAH7vQ/srZV+i5+7IaF1+AIaRajZmjgyo8GYAGgTNidZuCGXQZTCzPog+YY8OmM
Xnn/VwFxy0XVUNIDjPe/RlaeUPP8nSxmzyWpwFxQDdWmP5Ikl0hTxkAVTVRzwprg
MYpy/I20gAxCKOJ7Gbrn/kPs
-----END PRIVATE KEY-----
Loading

0 comments on commit 00c35a9

Please sign in to comment.