diff --git a/users/models.py b/users/models.py index 884ab84..e1519ed 100644 --- a/users/models.py +++ b/users/models.py @@ -3,7 +3,7 @@ from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseU import base64 from cryptography.fernet import Fernet from django.utils import timezone - +import base64, hashlib class CustomUserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): diff --git a/users/urls.py b/users/urls.py index 546fb9f..6d669dd 100644 --- a/users/urls.py +++ b/users/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from .views import RegisterView, MeView, CustomTokenObtainPairView, SSHKeyUploadView, SSHKeyInfoView +from .views import RegisterView, MeView, CustomTokenObtainPairView, SSHKeyUploadView, SSHKeyInfoView, SSHKeyRetrieveView from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView urlpatterns = [ @@ -11,4 +11,5 @@ urlpatterns = [ path('me/', MeView.as_view(), name='me'), path("ssh-key/", SSHKeyUploadView.as_view(), name="ssh_key_upload"), path("ssh-key/info/", SSHKeyInfoView.as_view(), name="ssh_key_info"), + path("ssh-key/view/", SSHKeyRetrieveView.as_view(), name="ssh_key_retrieve"), ] diff --git a/users/views.py b/users/views.py index 6c9c511..7ed012f 100644 --- a/users/views.py +++ b/users/views.py @@ -1,10 +1,12 @@ from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status -from .serializers import RegisterSerializer, CustomTokenObtainPairSerializer from rest_framework.permissions import IsAuthenticated from rest_framework_simplejwt.views import TokenObtainPairView +from .serializers import RegisterSerializer, CustomTokenObtainPairSerializer + + class RegisterView(APIView): def post(self, request): serializer = RegisterSerializer(data=request.data) @@ -24,21 +26,23 @@ class MeView(APIView): def put(self, request): user = request.user - serializer = RegisterSerializer(user, data=request.data, partial=True) # ✅ 부분 수정 허용 + serializer = RegisterSerializer(user, data=request.data, partial=True) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - + + class CustomTokenObtainPairView(TokenObtainPairView): serializer_class = CustomTokenObtainPairSerializer - + + class SSHKeyUploadView(APIView): permission_classes = [IsAuthenticated] def post(self, request): private_key = request.data.get("private_key") - key_name = request.data.get("key_name") # 여전히 key_name으로 받음 + key_name = request.data.get("key_name") if not private_key or not key_name: return Response( @@ -54,7 +58,7 @@ class SSHKeyUploadView(APIView): return Response({"message": "SSH key 저장 완료."}) except Exception as e: return Response({"error": str(e)}, status=500) - + def delete(self, request): user = request.user user.encrypted_private_key = None @@ -62,7 +66,8 @@ class SSHKeyUploadView(APIView): user.last_used_at = None user.save(update_fields=["encrypted_private_key", "encrypted_private_key_name", "last_used_at"]) return Response({"message": "SSH key deleted."}, status=200) - + + class SSHKeyInfoView(APIView): permission_classes = [IsAuthenticated] @@ -72,4 +77,15 @@ class SSHKeyInfoView(APIView): "has_key": bool(user.encrypted_private_key), "encrypted_private_key_name": user.encrypted_private_key_name, "last_used_at": user.last_used_at - }) \ No newline at end of file + }) + + +# ✅ 실제 암호화된 키를 반환하는 API +class SSHKeyRetrieveView(APIView): + permission_classes = [IsAuthenticated] + + def get(self, request): + user = request.user + if not user.encrypted_private_key: + return Response({"error": "SSH 키가 등록되어 있지 않습니다."}, status=404) + return Response({"ssh_key": user.encrypted_private_key}) diff --git a/version b/version index 18f9b2a..314e3da 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.0.9-r1 \ No newline at end of file +0.0.10-rc1 \ No newline at end of file