diff --git a/.env.example b/.env.example index 8069162..ae17041 100644 --- a/.env.example +++ b/.env.example @@ -1,11 +1,23 @@ -# postgres credentials +SECRET_KEY='django-insecure-(fffc75h_s6tm=%7a&r8vc2lf7*0q+w2k+=*g=@82nube9s*a-' +DEBUG=True -POSTGRES_PASSWORD='postgres_password' -POSTGRES_DB='postgres_db' -POSTGRES_USER='postgres_user' +FORTYTWO_CLIENT_ID='u-s4t2ud-ab8fff39c8779f781296f279fd71d49a1ae34cb59003ad44bb0dc94d475ceffc' +FORTYTWO_CLIENT_SECRET='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' +FORTYTWO_REDIRECT_URI='http://localhost:4444' -# django superuser credentials -DJANGO_SECRET_KEY='django_secret_key' -DJANGO_SUPERUSER_USERNAME='django_admin_user' -DJANGO_SUPERUSER_EMAIL='django_admin_email' -DJANGO_SUPERUSER_PASSWORD='django_admin_password' +# google social_auth +GOOGLE_CLIENT_ID='GOOGLE_CLIENT_ID' +GOOGLE_REDIRECT_URI='GOOGLE_REDIRECT_URI' + + +# github social_auth +GITHUB_CLIENT_ID='GITHUB_CLIENT_ID' +GITHUB_REDIRECT_URI='GITHUB_REDIRECT_URI' + +POSTGRES_USER="postgres" +POSTGRES_PASSWORD="A9wadPassW0rd/" +POSTGRES_DB="db" +DATABASE_URL="postgres://postgres:A9wadPassW0rd/@db:5432/db" + +LOGSTASH_HOST="logstash" +LOGSTASH_PORT="50000" diff --git a/.gitignore b/.gitignore index 88db7e1..a086576 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,4 @@ htmlcov/ # Migrations **/migrations/* !**/migrations/__init__.py -todo* +*todo* \ No newline at end of file diff --git a/ELK/docker-compose.yml b/ELK/docker-compose.yml new file mode 100644 index 0000000..29ed744 --- /dev/null +++ b/ELK/docker-compose.yml @@ -0,0 +1,91 @@ +version: '3' + +services: + elasticsearch: + container_name: elasticsearch + image: docker.elastic.co/elasticsearch/elasticsearch:8.10.1 + environment: + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - KIBANA_SYSTEM_PASSWORD=${KIBANA_PASSWORD} + - discovery.type=single-node + - xpack.security.enabled=true + - ELASTIC_USERNAME=elastic + - ES_JAVA_OPTS=-Xms1g -Xmx1g + healthcheck: + test: ["CMD-SHELL", "curl -s -u elastic:lol123 http://localhost:9200/_cat/health >/dev/null || exit 1"] + interval: 30s + timeout: 30s + retries: 3 + start_period: 60s + volumes: + - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml + - es_data:/usr/share/elasticsearch/data + ports: + - "9200:9200" + - "9300:9300" + networks: + - elk + restart: always + + setup_kibana: + image: curlimages/curl:latest + volumes: + - ./tools/init-kibana.sh:/init-kibana.sh + command: ["sh", "/init-kibana.sh"] + networks: + - elk + env_file: + - .env + depends_on: + elasticsearch: + condition: service_healthy + + logstash: + container_name: logstash + image: docker.elastic.co/logstash/logstash:8.10.1 + volumes: + - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml + - ./logstash/pipeline:/usr/share/logstash/pipeline + ports: + - "50000:50000" + - "9600:9600" + env_file: + - .env + environment: + - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} + - ELASTICSEARCH_USERNAME=elastic + - ELASTICSEARCH_PASSWORD=${ELASTIC_PASSWORD} + - LS_JAVA_OPTS=-Xms256m -Xmx256m + networks: + - elk + depends_on: + elasticsearch: + condition: service_healthy + + kibana: + container_name: kibana + image: docker.elastic.co/kibana/kibana:8.10.1 + depends_on: + setup_kibana: + condition: service_completed_successfully + environment: + - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 + - ELASTICSEARCH_USERNAME=kibana_system + - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} + - ELASTICSEARCH_SSL_VERIFICATIONMODE=none + volumes: + - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml + ports: + - "5601:5601" + networks: + - elk + +volumes: + es_data: + driver: local + +networks: + elk: + external: true + name: elk_net + # driver: bridge diff --git a/ELK/elasticsearch/config/elasticsearch.yml b/ELK/elasticsearch/config/elasticsearch.yml new file mode 100644 index 0000000..d567d34 --- /dev/null +++ b/ELK/elasticsearch/config/elasticsearch.yml @@ -0,0 +1,8 @@ +cluster.name: "docker-cluster" +network.host: 0.0.0.0 +discovery.type: single-node +xpack.security.enabled: true +xpack.security.authc.api_key.enabled: true + +# Add these memory settings +bootstrap.memory_lock: true \ No newline at end of file diff --git a/ELK/kibana/config/kibana.yml b/ELK/kibana/config/kibana.yml new file mode 100644 index 0000000..b3e09cb --- /dev/null +++ b/ELK/kibana/config/kibana.yml @@ -0,0 +1,7 @@ +server.host: "0.0.0.0" +elasticsearch.hosts: ["http://elasticsearch:9200"] +elasticsearch.username: "kibana_system" +elasticsearch.password: "lil123" +elasticsearch.ssl.verificationMode: none +xpack.security.enabled: true +xpack.reporting.roles.enabled: false \ No newline at end of file diff --git a/ELK/logstash/config/logstash.yml b/ELK/logstash/config/logstash.yml new file mode 100644 index 0000000..69dd8bc --- /dev/null +++ b/ELK/logstash/config/logstash.yml @@ -0,0 +1,5 @@ +http.host: "0.0.0.0" +xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"] +xpack.monitoring.elasticsearch.username: "elastic" +xpack.monitoring.elasticsearch.password: "lol123" +xpack.monitoring.enabled: true \ No newline at end of file diff --git a/ELK/logstash/pipeline/logstash.conf b/ELK/logstash/pipeline/logstash.conf new file mode 100644 index 0000000..99a3183 --- /dev/null +++ b/ELK/logstash/pipeline/logstash.conf @@ -0,0 +1,36 @@ +input { + tcp { + port => 50000 + codec => json + type => "django" + } +} + +filter { + if [type] == "django" { + # Lowercase the level field and rename it to match the standard 'level' in Elasticsearch + mutate { + lowercase => ["levelname"] # Convert 'levelname' to lowercase + rename => { "levelname" => "level" } # Rename for consistent index field name + } + + # Parse the timestamp from Django to ensure it's used as @timestamp in Elasticsearch + date { + match => ["asctime", "YYYY-MM-dd HH:mm:ss"] + target => "@timestamp" + remove_field => ["asctime"] # Clean up to avoid duplicate timestamp fields + } + } +} + +output { + elasticsearch { + hosts => ["elasticsearch:9200"] + index => "django-logs-%{+YYYY.MM.dd}" # Adjusted to only include date in the index + user => "elastic" # Use environment variables for security + password => "${ELASTIC_PASSWORD}" + } + stdout { + codec => rubydebug + } +} diff --git a/ELK/tools/init-kibana.sh b/ELK/tools/init-kibana.sh new file mode 100755 index 0000000..8034d98 --- /dev/null +++ b/ELK/tools/init-kibana.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +echo "Waiting for Elasticsearch to be ready..." +while true; do + if curl -s elasticsearch:9200 >/dev/null; then + break + fi + sleep 5 +done + +echo "Setting up kibana_system user..." +# echo "${ELASTIC_PASSWORD} ${KIBANA_PASSWORD}" +curl -X POST -u elastic:${ELASTIC_PASSWORD} "elasticsearch:9200/_security/user/kibana_system/_password" -H "Content-Type: application/json" -d" +{ + \"password\": \"${KIBANA_PASSWORD}\" +}" \ No newline at end of file diff --git a/Makefile b/Makefile index 9935db8..40b61ed 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,17 @@ images=$(shell docker image ls -aq) +elk_net=$(shell docker network ls -qf name="elk_net") + all: build -build: +create_net: + if [ -n "$(elk_net)" ];\ + then echo "Network elk_net already exists";\ + else\ + docker network create elk_net;\ + fi + +build: create_net docker-compose -f docker-compose.yml build up: build @@ -11,6 +20,12 @@ up: build down: docker-compose -f docker-compose.yml down +ELK: create_net + docker-compose -f ./ELK/docker-compose.yml up + +ELK_down: + docker-compose -f ./ELK/docker-compose.yml down + delete_images: if [ -n "$(images)" ];\ then docker rmi $(images);\ @@ -18,9 +33,9 @@ delete_images: echo "No images to delete";\ fi -fclean: down delete_images +fclean: down ELK_down delete_images docker system prune -a --force -.PHONY: all build up down delete_images fclean +.PHONY: all build up down delete_images fclean ELK ELK_down create_net -.SILENT: all build up down delete_images fclean +.SILENT: all build up down delete_images fclean create_net ELK ELK_down diff --git a/docker-compose.yml b/docker-compose.yml index c8a5b1f..5dbdc91 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,10 +9,12 @@ services: networks: - transcendance_net restart: always - environment: - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: ${POSTGRES_DB} - POSTGRES_USER: ${POSTGRES_USER} + env_file: + - .env.example + # environment: + # POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + # POSTGRES_DB: ${POSTGRES_DB} + # POSTGRES_USER: ${POSTGRES_USER} backend: @@ -21,23 +23,37 @@ services: build: context: ./srcs/api/ volumes: - - backend_files:/var/www/ + - ./srcs/api/:/var/www/ networks: - transcendance_net + - elk_net ports: - 8000:8000 depends_on: - pgdb + env_file: + - .env.example restart: on-failure - environment: - DEBUG: True # ['True', 'False'] - DJANGO_SETTING_MODULE: config.django.local - DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@pgdb:5432/${POSTGRES_DB} - DJANGO_SUPERUSER_USERNAME: ${DJANGO_SUPERUSER_USERNAME} - DJANGO_SUPERUSER_EMAIL: ${DJANGO_SUPERUSER_EMAIL} - DJANGO_SUPERUSER_PASSWORD: ${DJANGO_SUPERUSER_PASSWORD} - DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} + # environment: + # DEBUG: True # ['True', 'False'] + # DJANGO_SETTING_MODULE: config.django.local + # DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@pgdb:5432/${POSTGRES_DB} + # DJANGO_SUPERUSER_USERNAME: ${DJANGO_SUPERUSER_USERNAME} + # DJANGO_SUPERUSER_EMAIL: ${DJANGO_SUPERUSER_EMAIL} + # DJANGO_SUPERUSER_PASSWORD: ${DJANGO_SUPERUSER_PASSWORD} + frontend: + build: ./srcs/frontend + container_name: nextJs + ports: + - "3000:3000" # Map host port 3000 to container port 3000 + volumes: + - ./srcs/frontend/src/:/app/src/ + depends_on: + - backend + networks: + - transcendance_net + restart: on-failure volumes: postgres_data: @@ -50,3 +66,6 @@ volumes: networks: transcendance_net: + elk_net: + external: true + name: elk_net diff --git a/srcs/api/.dockerignore b/srcs/api/.dockerignore index e69de29..2e1304b 100644 --- a/srcs/api/.dockerignore +++ b/srcs/api/.dockerignore @@ -0,0 +1,3 @@ +db.sqlite3 +*__pycache__/ +*.pyc diff --git a/srcs/api/Dockerfile b/srcs/api/Dockerfile index 52ed666..80b9187 100644 --- a/srcs/api/Dockerfile +++ b/srcs/api/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim-bullseye +FROM python:3.12-slim-bullseye # Set the working directory in the container WORKDIR /var/www/ diff --git a/srcs/api/apps/users/views.py b/srcs/api/apps/users/views.py index 757a5da..f2e9cfe 100644 --- a/srcs/api/apps/users/views.py +++ b/srcs/api/apps/users/views.py @@ -1,5 +1,5 @@ from rest_framework import generics, filters -from rest_framework.permissions import AllowAny +from rest_framework.permissions import AllowAny, IsAuthenticated from .models import User from rest_framework.response import Response @@ -7,6 +7,8 @@ class AuthUserView(generics.RetrieveUpdateDestroyAPIView): + permission_classes = [IsAuthenticated] + def get_serializer_class(self): if self.request.method in ['PUT', 'PATCH']: return serializers.UpdateAuthUserSerializer diff --git a/srcs/api/apps/utils/validators.py b/srcs/api/apps/utils/validators.py index d68b399..54db162 100644 --- a/srcs/api/apps/utils/validators.py +++ b/srcs/api/apps/utils/validators.py @@ -1,6 +1,7 @@ from django.contrib.auth import get_user_model from rest_framework import serializers import re +from django.contrib.auth import get_user_model User = get_user_model() @@ -46,6 +47,8 @@ def __call__(self, value): if any(bad in value for bad in ["__", "--", "_-", "-_"]): errors.append("Username cannot contain consecutive special characters like '__', '_-', or similar.") reserved_usernames = ['admin', 'root', 'superuser'] + if get_user_model().objects.filter(username=value).exists(): + errors.append("A user with that username already exists.") if value.lower() in reserved_usernames: errors.append("This username is reserved and cannot be used.") if errors: diff --git a/srcs/api/config/django/base.py b/srcs/api/config/django/base.py index ba5552a..10e998b 100644 --- a/srcs/api/config/django/base.py +++ b/srcs/api/config/django/base.py @@ -1,14 +1,14 @@ from config.env import BASE_DIR, env +import os # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = env('DJANGO_SECRET_KEY') +SECRET_KEY = env('SECRET_KEY') # SECURITY WARNING: don't run with debug turned on in production! DEBUG = env.bool('DEBUG', default=True) ALLOWED_HOSTS = [] - # Application definition INSTALLED_APPS = [ @@ -28,7 +28,7 @@ 'rest_framework_simplejwt.token_blacklist', 'drf_spectacular', 'channels', - 'corsheaders' + 'corsheaders', ] # local apps @@ -40,6 +40,7 @@ ]] MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', @@ -50,6 +51,12 @@ 'apps.authentication.middleware.JWTAuthenticationMiddleware', ] +CORS_ALLOW_CREDENTIALS = True + +CORS_ALLOWED_ORIGINS = [ + "http://localhost:3000", +] + ROOT_URLCONF = 'config.urls' TEMPLATES = [ @@ -129,3 +136,4 @@ from config.settings.rest_framework import * from config.settings.simplejwt import * from config.settings.drf_spectacular import * +from config.settings.logstash import * diff --git a/srcs/api/config/env.py b/srcs/api/config/env.py index eb9d4b1..109dff9 100644 --- a/srcs/api/config/env.py +++ b/srcs/api/config/env.py @@ -6,4 +6,4 @@ env = environ.Env() -# environ.Env.read_env(BASE_DIR / '.env') +environ.Env.read_env(BASE_DIR / '.env') diff --git a/srcs/api/config/settings/logstash.py b/srcs/api/config/settings/logstash.py new file mode 100644 index 0000000..3eb4933 --- /dev/null +++ b/srcs/api/config/settings/logstash.py @@ -0,0 +1,41 @@ +import logstash +from pythonjsonlogger import jsonlogger +from config.env import env + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'logstash': { + '()': 'logstash.formatter.LogstashFormatterVersion1', + }, + 'simple': { + 'format': '[%(asctime)s][%(levelname)s][%(name)s] %(message)s ' + }, + }, + 'handlers': { + 'logstash': { + 'level': 'INFO', + 'class': 'logstash.TCPLogstashHandler', + 'host': env('LOGSTASH_HOST', default='logstash'), + 'port': env.int('LOGSTASH_PORT', default=50000), + 'version': 1, + 'message_type': 'django', + 'fqdn': False, + 'tags': ['django'], + 'formatter': 'logstash', + }, + 'console': { + # 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'simple', + }, + }, + 'loggers': { + 'django': { + 'handlers': ['logstash', 'console'], + # 'level': 'INFO', + 'propagate': True, + }, + } +} \ No newline at end of file diff --git a/srcs/api/config/settings/simplejwt.py b/srcs/api/config/settings/simplejwt.py index fa72310..65f8da8 100644 --- a/srcs/api/config/settings/simplejwt.py +++ b/srcs/api/config/settings/simplejwt.py @@ -9,7 +9,7 @@ "UPDATE_LAST_LOGIN": True, "ALGORITHM": "HS256", - "SIGNING_KEY": env('DJANGO_SECRET_KEY'), + "SIGNING_KEY": env('SECRET_KEY'), "VERIFYING_KEY": "", "AUDIENCE": None, "ISSUER": None, diff --git a/srcs/api/requirements.txt b/srcs/api/requirements.txt index 5b66ccc..0671166 100644 --- a/srcs/api/requirements.txt +++ b/srcs/api/requirements.txt @@ -5,7 +5,6 @@ Automat==24.8.1 certifi==2024.8.30 cffi==1.17.1 channels==4.1.0 -charset-normalizer==3.3.2 constantly==23.10.4 cryptography==43.0.1 daphne==4.1.2 @@ -36,7 +35,7 @@ referencing==0.35.1 requests==2.32.3 rpds-py==0.20.0 service-identity==24.1.0 -setuptools==75.1.0 + sqlparse==0.5.1 Twisted==24.7.0 txaio==23.1.1 @@ -44,3 +43,27 @@ typing_extensions==4.12.2 uritemplate==4.1.1 urllib3==2.2.3 zope.interface==7.1.0 +certifi==2024.8.30 +django-elasticsearch-dsl==8.0 +elastic-transport==8.15.1 +elasticsearch>=8.0.0,<9.0.0 +elasticsearch-dsl>=8.9.0,<9.0.0 +python-dateutil==2.9.0.post0 + +charset-normalizer==3.4.0 +Deprecated==1.2.14 +idna==3.10 +importlib_resources==6.4.5 +limits==3.13.0 +packaging==24.1 +pylogbeat==2.0.1 +python-logstash==0.4.8 +requests==2.32.3 +six==1.16.0 +python-dateutil==2.9.0.post0 +python-json-logger==2.0.7 +# logstash==0.1.dev0 +wheel==0.44.0 +wrapt==1.16.0 +setuptools==75.2.0 +logstash_formatter==0.5.17 \ No newline at end of file diff --git a/srcs/frontend/src/app/auth/signin/page.tsx b/srcs/frontend/src/app/auth/signin/page.tsx index 26080bb..f9e844d 100644 --- a/srcs/frontend/src/app/auth/signin/page.tsx +++ b/srcs/frontend/src/app/auth/signin/page.tsx @@ -48,18 +48,28 @@ const SignInPage: React.FC = () => { setIsLoading(true); try { - await axios.post("http://localhost:8000/api/auth/sign-in/", formData,{withCredentials: true}); - - router.push("/users/home"); - } catch (err: any) { - console.log("there is some errors"); - console.error("Error:", err.response); - setErrors({ - details: "Username or password is not correct", - username: err.response?.data?.username?.[0] || "", - password: err.response?.data?.password?.[0] || "", - otp: err.response?.data?.otp_code?.[0] || "", + const res = await axios.post("http://localhost:8000/api/auth/sign-in/", { + "username": formData.username, + "password": formData.password, + }, { + withCredentials: true, + }).catch(err => { + console.error("Sign-in error:", err); }); + + if (res.status === 200) { // Check if the response is OK + router.push("/users/home"); + setIsLoading(false); + } + } catch (err) { + console.error("test"); + console.error("Error response:", err.response); + setErrors(() => ({ + details: "username of password is not correct", + username: err.response?.data?.username ? err.response.data.username[0] : "", + password: err.response?.data?.password ? err.response.data.password[0] : "", + otp: err.response?.data?.otp_code[0] ? err.response?.data?.otp_code[0] : "", + })); setIsLoading(false); } finally { } diff --git a/srcs/frontend/src/app/auth/signup/page.tsx b/srcs/frontend/src/app/auth/signup/page.tsx index a0b3643..26c538e 100644 --- a/srcs/frontend/src/app/auth/signup/page.tsx +++ b/srcs/frontend/src/app/auth/signup/page.tsx @@ -84,7 +84,9 @@ const SignUpPage: React.FC = () => { email: formData.email, first_name: formData.firstname, last_name: formData.lastname - }); + }, + {withCredentials: true}, + ); setIsSuccess(true); } catch (err: any) { console.error("Error:", err.response?.data); diff --git a/srcs/frontend/src/app/users/logout/page.tsx b/srcs/frontend/src/app/users/logout/page.tsx index 0723e64..4d0f971 100644 --- a/srcs/frontend/src/app/users/logout/page.tsx +++ b/srcs/frontend/src/app/users/logout/page.tsx @@ -38,7 +38,14 @@ const Logout: React.FC = () => { deleteAllCookies(); // Call the sign-out API - await axios.post("http://localhost:8000/api/auth/sign-out/"); + await axios.post("http://localhost:8000/api/auth/sign-out/", + {}, + { + withCredentials: true, + } + ).catch(err => { + console.error("Sign-in error:", err); + }); router.push('/auth/signin'); } catch (error) { diff --git a/srcs/frontend/src/components/Settings/ChangeFirstname/ChangeFirstname.tsx b/srcs/frontend/src/components/Settings/ChangeFirstname/ChangeFirstname.tsx index e952a40..c7de982 100644 --- a/srcs/frontend/src/components/Settings/ChangeFirstname/ChangeFirstname.tsx +++ b/srcs/frontend/src/components/Settings/ChangeFirstname/ChangeFirstname.tsx @@ -38,6 +38,9 @@ const ChangeFirstname: React.FC = ({ setCurrentPage }) => const res = await axios.patch( "http://localhost:8000/api/users/me/", { first_name: newFirstName }, + { + withCredentials: true, + } ); console.log(res.data); updateUserData({ ...userData, first_name: newFirstName }); diff --git a/srcs/frontend/src/components/Settings/ChangeFirstname/change.module.css b/srcs/frontend/src/components/Settings/ChangeFirstname/change.module.css index 1d7fb21..0966e81 100644 --- a/srcs/frontend/src/components/Settings/ChangeFirstname/change.module.css +++ b/srcs/frontend/src/components/Settings/ChangeFirstname/change.module.css @@ -64,6 +64,7 @@ background-color: transparent; border: 1px solid black; width: 100%; + color: black; transition: background-color 0.5s ease, transform 0.5s ease; &:focus { transform: scale(1.025);; diff --git a/srcs/frontend/src/components/Settings/ChangeImage/ImageUpload.tsx b/srcs/frontend/src/components/Settings/ChangeImage/ImageUpload.tsx index 27f3877..7e6c4be 100644 --- a/srcs/frontend/src/components/Settings/ChangeImage/ImageUpload.tsx +++ b/srcs/frontend/src/components/Settings/ChangeImage/ImageUpload.tsx @@ -24,7 +24,9 @@ const ImageUpload: React.FC = ({ setCurrentPage }) => { useEffect(() => { const fetchData = async () => { try { - const res = await axios.get("http://localhost:8000/api/users/me/"); + const res = await axios.get("http://localhost:8000/api/users/me/", { + withCredentials: true + }); console.log(res.data.avatar_url); setNewImage(res.data.avatar_url || "https://res.cloudinary.com/doufu6atn/image/upload/v1726742774/nxdrt0md7buyeghyjyvj.png"); } catch (err: any) { @@ -103,6 +105,7 @@ const ImageUpload: React.FC = ({ setCurrentPage }) => { Authorization: `Bearer ${localStorage.getItem("access")}`, "Content-Type": "application/json", }, + withCredentials: true, } ); console.log(res.data); diff --git a/srcs/frontend/src/components/Settings/ChangeLastname/ChangeLastname.tsx b/srcs/frontend/src/components/Settings/ChangeLastname/ChangeLastname.tsx index ad56c43..a4778b0 100644 --- a/srcs/frontend/src/components/Settings/ChangeLastname/ChangeLastname.tsx +++ b/srcs/frontend/src/components/Settings/ChangeLastname/ChangeLastname.tsx @@ -36,6 +36,9 @@ const ChangeLastname: React.FC = ({ setCurrentPage }) => { const res = await axios.patch( "http://localhost:8000/api/users/me/", { last_name: newLastName }, + { + withCredentials: true, + } ); console.log(res.data); updateUserData({ ...userData, last_name: newLastName }); diff --git a/srcs/frontend/src/components/Settings/ChangeLastname/change.module.css b/srcs/frontend/src/components/Settings/ChangeLastname/change.module.css index 1d7fb21..2e52cf4 100644 --- a/srcs/frontend/src/components/Settings/ChangeLastname/change.module.css +++ b/srcs/frontend/src/components/Settings/ChangeLastname/change.module.css @@ -65,6 +65,7 @@ border: 1px solid black; width: 100%; transition: background-color 0.5s ease, transform 0.5s ease; + color: black; &:focus { transform: scale(1.025);; } diff --git a/srcs/frontend/src/components/Settings/ChangePassword/ChangePassword.tsx b/srcs/frontend/src/components/Settings/ChangePassword/ChangePassword.tsx index ce854fe..a33d4d6 100644 --- a/srcs/frontend/src/components/Settings/ChangePassword/ChangePassword.tsx +++ b/srcs/frontend/src/components/Settings/ChangePassword/ChangePassword.tsx @@ -36,6 +36,9 @@ const ChangePassword: React.FC = ({ setCurrentPage }) => { const res = await axios.patch( "http://localhost:8000/api/users/me/", { password: newPassword }, + { + withCredentials: true, + } ); console.log(res.data); updateUserData({ ...userData, password: newPassword }); diff --git a/srcs/frontend/src/components/Settings/ChangePassword/change.module.css b/srcs/frontend/src/components/Settings/ChangePassword/change.module.css index 1d7fb21..2e52cf4 100644 --- a/srcs/frontend/src/components/Settings/ChangePassword/change.module.css +++ b/srcs/frontend/src/components/Settings/ChangePassword/change.module.css @@ -65,6 +65,7 @@ border: 1px solid black; width: 100%; transition: background-color 0.5s ease, transform 0.5s ease; + color: black; &:focus { transform: scale(1.025);; } diff --git a/srcs/frontend/src/components/Settings/ChangeTFA/ChangeTFA.tsx b/srcs/frontend/src/components/Settings/ChangeTFA/ChangeTFA.tsx index dcc1787..83076d1 100644 --- a/srcs/frontend/src/components/Settings/ChangeTFA/ChangeTFA.tsx +++ b/srcs/frontend/src/components/Settings/ChangeTFA/ChangeTFA.tsx @@ -22,7 +22,9 @@ const ChangeTFA: React.FC = ({ setCurrentPage }) => { const fetchData = async () => { setIsloading(true); try { - const res = await axios.get("http://localhost:8000/api/users/me/"); + const res = await axios.get("http://localhost:8000/api/users/me/", { + withCredentials: true + }); setBoolIsActive(res.data.two_fa_enabled); setToggleActive(res.data.two_fa_enabled); } catch (err: any) { @@ -38,7 +40,9 @@ const ChangeTFA: React.FC = ({ setCurrentPage }) => { setIsloading(true); setToggleActive(!toggleActive); try { - const res = await axios.get("http://localhost:8000/api/users/me/"); + const res = await axios.get("http://localhost:8000/api/users/me/", { + withCredentials: true + }); setCode(res.data.otp_uri); } catch (err: any) { console.log("Error in fetching OTP URI", err); @@ -52,6 +56,9 @@ const ChangeTFA: React.FC = ({ setCurrentPage }) => { try { const res = await axios.post("http://localhost:8000/api/auth/2fa/enable/", { "otp_code": inputCode, + }, + { + withCredentials: true }); // Navigate back after success @@ -65,6 +72,9 @@ const ChangeTFA: React.FC = ({ setCurrentPage }) => { const res = await axios.patch( "http://localhost:8000/api/users/me/", { last_name: newLastName }, + { + withCredentials: true, + } ); console.log(res.data); updateUserData({ ...userData, last_name: newLastName }); diff --git a/srcs/frontend/src/components/Settings/ChangeTFA/change.module.css b/srcs/frontend/src/components/Settings/ChangeTFA/change.module.css index 2b924ae..e34fece 100644 --- a/srcs/frontend/src/components/Settings/ChangeTFA/change.module.css +++ b/srcs/frontend/src/components/Settings/ChangeTFA/change.module.css @@ -103,7 +103,7 @@ font-size: 16px; width: 100%; transition: transform 0.3s ease, background-color 0.3s ease; - + color: black; &:focus { background-color: #f0f0f0; transform: scale(1.02); diff --git a/srcs/frontend/src/components/Settings/ChangeUsername/ChangeUsername.tsx b/srcs/frontend/src/components/Settings/ChangeUsername/ChangeUsername.tsx index bc514be..61deb69 100644 --- a/srcs/frontend/src/components/Settings/ChangeUsername/ChangeUsername.tsx +++ b/srcs/frontend/src/components/Settings/ChangeUsername/ChangeUsername.tsx @@ -38,6 +38,9 @@ const ChangeUsername: React.FC = ({ setCurrentPage }) => { const res = await axios.patch( "http://localhost:8000/api/users/me/", { username: newUsername }, + { + withCredentials: true, + } ); console.log(res.data); updateUserData({ ...userData, username: newUsername }); diff --git a/srcs/frontend/src/components/Settings/ChangeUsername/changeUsername.module.css b/srcs/frontend/src/components/Settings/ChangeUsername/changeUsername.module.css index 694b632..3baea57 100644 --- a/srcs/frontend/src/components/Settings/ChangeUsername/changeUsername.module.css +++ b/srcs/frontend/src/components/Settings/ChangeUsername/changeUsername.module.css @@ -65,6 +65,7 @@ border: 1px solid black; width: 100%; transition: background-color 0.5s ease, transform 0.5s ease; + color: black; &:focus { transform: scale(1.025);; } diff --git a/srcs/frontend/src/components/VerticalNavbar/VerticalNavbar.tsx b/srcs/frontend/src/components/VerticalNavbar/VerticalNavbar.tsx index 2ba7774..2ac204d 100644 --- a/srcs/frontend/src/components/VerticalNavbar/VerticalNavbar.tsx +++ b/srcs/frontend/src/components/VerticalNavbar/VerticalNavbar.tsx @@ -36,6 +36,47 @@ const VerticalNavbar = () => { updateCurrentPage(page); }; + useEffect(() => { + + const fetchData = async () =>{ + try { + const res = await axios.get("http://localhost:8000/api/users/me/", { + withCredentials: true + }); + console.log("res"); + console.log(res.data); + updateUserData({ + id: res.data.id, + otp_uri: res.data.otp_uri, + last_login: res.data.last_login, + is_superuser: res.data.is_superuser, + username: res.data.username, + first_name: res.data.first_name, + last_name: res.data.last_name, + email: res.data.email, + is_staff: res.data.is_staff, + is_active: res.data.is_active, + date_joined: res.data.date_joined, + two_fa_enabled: res.data.two_fa_enabled, + is_online: res.data.is_online, + avatar_url: res.data.avatar_url , + wins: res.data.wins, + loses: res.data.loses, + rating: res.data.rating, + }) + + + } catch (err) { + console.log("test"); + } + } + + fetchData(); + }, []); + + + + return (