Skip to content

Commit cfb1938

Browse files
committed
test docker and configure security
1 parent 50543da commit cfb1938

File tree

153 files changed

+219
-31944
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

153 files changed

+219
-31944
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,5 @@ GitHub.sublime-settings
139139

140140
# private_key.pem
141141
# public_key.pem
142+
143+
db.sqlite3

apps/blog/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class HomePageView(TemplateView):
4141
template_name = "blog/home.html"
4242

4343
def get(self, request):
44-
if request.user and request.user.is_authenticated:
44+
if request.user is not None and request.user.is_authenticated:
4545
posts = Post.objects.exclude(author=request.user)
4646
else:
4747
posts = Post.objects.all()

apps/shared/management/commands/__init__.py

Whitespace-only changes.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import os
2+
3+
from dotenv import load_dotenv
4+
load_dotenv()
5+
6+
from django.contrib.auth import get_user_model
7+
from django.core.management.base import BaseCommand
8+
9+
10+
ADMIN_USERNAME = str(os.getenv("ADMIN_USERNAME"))
11+
ADMIN_PASSWORD = str(os.getenv("ADMIN_PASSWORD"))
12+
ADMIN_EMAIL = str(os.getenv("ADMIN_PASSWORD"))
13+
14+
15+
class Command(BaseCommand):
16+
def handle(self, *args, **options):
17+
User = get_user_model()
18+
self.create_superuser(User, ADMIN_USERNAME, ADMIN_EMAIL, ADMIN_PASSWORD)
19+
def create_superuser(self, User, username, email, password):
20+
if not User.objects.filter(username=username).exists():
21+
User.objects.create_superuser(username, email, password)
22+
self.stdout.write(
23+
self.style.SUCCESS(f"Superuser {username} created successfully.")
24+
)
25+
else:
26+
self.stdout.write(
27+
self.style.ERROR(f"Superuser {username} already exists.")
28+
)

apps/users/middleware.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
from rest_framework_simplejwt.tokens import AccessToken
1+
from rest_framework_simplejwt.tokens import AccessToken, TokenError
22
from django.utils.deprecation import MiddlewareMixin
33
from django.contrib.auth import get_user_model
4+
from django.contrib.auth.models import AnonymousUser
5+
from django.core.cache import cache
46

57

68
User = get_user_model()
@@ -10,11 +12,20 @@ class JWTAuthMiddleware(MiddlewareMixin):
1012
def process_request(self, request):
1113
access_token = request.COOKIES.get("access_token")
1214

13-
if access_token:
14-
try:
15-
token = AccessToken(access_token)
16-
user_id = token['user_id']
17-
request.user = User.objects.get(id=user_id)
18-
except Exception as e:
19-
request.user = None
20-
15+
if not access_token:
16+
request.user = AnonymousUser()
17+
18+
cached_user = cache.get(access_token)
19+
if cached_user:
20+
request.user = cached_user
21+
return
22+
23+
try:
24+
token = AccessToken(access_token)
25+
user_id = token['user_id']
26+
user = User.objects.get(id=user_id)
27+
28+
cache.set(access_token, user, timeout=60 * 15)
29+
request.user = user
30+
except (TokenError, User.DoesNotExist):
31+
request.user = AnonymousUser()

core/config/jwt.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
from datetime import timedelta
44

5+
from dotenv import load_dotenv
6+
load_dotenv()
57

6-
with open(str(os.getenv("PRIVATE_KEY_PATH", "security_settings/private_key.pem")), "r") as f:
8+
with open(str(os.getenv("PRIVATE_KEY_PATH")), "r") as f:
79
PRIVATE_KEY = f.read()
810

9-
with open(str(os.getenv("PUBLIC_KEY_PATH", "security_settings/public_key.pem")), "r") as f:
11+
with open(str(os.getenv("PUBLIC_KEY_PATH")), "r") as f:
1012
PUBLIC_KEY = f.read()
1113

1214

@@ -32,6 +34,6 @@
3234
"TOKEN_TYPE_CLAIM": "token_type",
3335
"JTI_CLAIM": "jti",
3436
"SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
35-
"SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
37+
"SLIDING_TOKEN_LIFETIME": timedelta(seconds=1),
3638
"SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
3739
}

core/settings/base.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import os
2+
3+
from pathlib import Path
4+
5+
from core.config import * # noqa
6+
7+
from dotenv import load_dotenv
8+
load_dotenv()
9+
10+
BASE_DIR = Path(__file__).resolve().parent.parent.parent
11+
12+
SECRET_KEY = str(os.getenv("SECRET_KEY"))
13+
14+
DEBUG = bool(os.getenv("DEBUG", True))
15+
16+
ALLOWED_HOSTS = str(os.getenv("ALLOWED_HOSTS")).split(",")
17+
18+
19+
INSTALLED_APPS = DEFAULT_APPS + PROJECT_APPS + THIRD_PARTY_APPS
20+
21+
22+
MIDDLEWARE = [
23+
"django.middleware.security.SecurityMiddleware",
24+
"django.contrib.sessions.middleware.SessionMiddleware",
25+
"django.middleware.common.CommonMiddleware",
26+
"django.middleware.csrf.CsrfViewMiddleware",
27+
"django.contrib.auth.middleware.AuthenticationMiddleware",
28+
"django.contrib.messages.middleware.MessageMiddleware",
29+
"django.middleware.clickjacking.XFrameOptionsMiddleware",
30+
"apps.users.middleware.JWTAuthMiddleware",
31+
]
32+
33+
ROOT_URLCONF = "core.urls"
34+
35+
36+
TEMPLATES_DIRS = ["templates"]
37+
38+
TEMPLATES = [
39+
{
40+
"BACKEND": "django.template.backends.django.DjangoTemplates",
41+
"DIRS": TEMPLATES_DIRS,
42+
"APP_DIRS": True,
43+
"OPTIONS": {
44+
"context_processors": [
45+
"django.template.context_processors.debug",
46+
"django.template.context_processors.request",
47+
"django.contrib.auth.context_processors.auth",
48+
"django.contrib.messages.context_processors.messages",
49+
],
50+
},
51+
},
52+
]
53+
54+
55+
WSGI_APPLICATION = "core.wsgi.application"
56+
57+
DATABASES = {
58+
"default": {
59+
"ENGINE": "django.db.backends.sqlite3",
60+
"NAME": BASE_DIR / "db.sqlite3",
61+
}
62+
}
63+
64+
65+
AUTH_PASSWORD_VALIDATORS = [
66+
{
67+
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
68+
},
69+
{
70+
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
71+
},
72+
{
73+
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
74+
},
75+
{
76+
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
77+
},
78+
]
79+
80+
LANGUAGE_CODE = "en"
81+
82+
TIME_ZONE = "Asia/Tashkent"
83+
84+
USE_I18N = True
85+
# USE_L10N = True
86+
87+
USE_TZ = True
88+
89+
LOGIN_URL = "/users/login/"
90+
LOGIN_REDIRECT_URL = "/"
91+
92+
STATIC_URL = "static/"
93+
STATIC_ROOT = BASE_DIR / "staticfiles"
94+
STATICFILES_DIRS = [BASE_DIR / "static"]
95+
96+
MEDIA_URL = "media/"
97+
MEDIA_ROOT = BASE_DIR / "media/"
98+
99+
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
100+
101+
AUTH_USER_MODEL = "users.User"
102+
103+
SITE_ID = 1

core/settings/development.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .base import * # noqa
2+
3+
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"

core/settings/production.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import os
2+
3+
from .base import * # noqa
4+
5+
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
6+
EMAIL_HOST = "'smtp.google.com'"
7+
EMAIL_PORT = 587
8+
EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER")
9+
EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD")
10+
EMAIL_USE_TLS = True
11+
12+
DATABASES = {
13+
"default": {
14+
"ENGINE": "django.db.backends.postgresql",
15+
"NAME": str(os.getenv("POSTGRES_NAME")),
16+
"USER": str(os.getenv("POSTGRES_USER")),
17+
"PASSWORD": str(os.getenv("POSTGRES_PASSWORD")),
18+
"HOST": str(os.getenv("POSTGRES_HOST")),
19+
"PORT": int(os.getenv("POSTGRES_PORT"))
20+
}
21+
}
22+
23+
# CACHES = {
24+
# "default": {
25+
# "BACKEND": "django.core.cache.backends.redis.RedisCache",
26+
# "LOCATION": os.getenv("REDIS_CACHE_URL"),
27+
# },
28+
# }

0 commit comments

Comments
 (0)