ssh저장 기능 수정중
All checks were successful
Build And Test / build-and-push (push) Successful in 2m52s

This commit is contained in:
2025-05-20 19:05:36 +09:00
parent 247b6b7fe7
commit 91d3b77c23
4 changed files with 28 additions and 11 deletions

View File

@ -3,7 +3,7 @@ from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseU
import base64 import base64
from cryptography.fernet import Fernet from cryptography.fernet import Fernet
from django.utils import timezone from django.utils import timezone
import base64, hashlib
class CustomUserManager(BaseUserManager): class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields): def create_user(self, email, password=None, **extra_fields):

View File

@ -1,5 +1,5 @@
from django.urls import path 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 from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView
urlpatterns = [ urlpatterns = [
@ -11,4 +11,5 @@ urlpatterns = [
path('me/', MeView.as_view(), name='me'), path('me/', MeView.as_view(), name='me'),
path("ssh-key/", SSHKeyUploadView.as_view(), name="ssh_key_upload"), path("ssh-key/", SSHKeyUploadView.as_view(), name="ssh_key_upload"),
path("ssh-key/info/", SSHKeyInfoView.as_view(), name="ssh_key_info"), path("ssh-key/info/", SSHKeyInfoView.as_view(), name="ssh_key_info"),
path("ssh-key/view/", SSHKeyRetrieveView.as_view(), name="ssh_key_retrieve"),
] ]

View File

@ -1,10 +1,12 @@
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status from rest_framework import status
from .serializers import RegisterSerializer, CustomTokenObtainPairSerializer
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework_simplejwt.views import TokenObtainPairView from rest_framework_simplejwt.views import TokenObtainPairView
from .serializers import RegisterSerializer, CustomTokenObtainPairSerializer
class RegisterView(APIView): class RegisterView(APIView):
def post(self, request): def post(self, request):
serializer = RegisterSerializer(data=request.data) serializer = RegisterSerializer(data=request.data)
@ -24,21 +26,23 @@ class MeView(APIView):
def put(self, request): def put(self, request):
user = request.user user = request.user
serializer = RegisterSerializer(user, data=request.data, partial=True) # ✅ 부분 수정 허용 serializer = RegisterSerializer(user, data=request.data, partial=True)
if serializer.is_valid(): if serializer.is_valid():
serializer.save() serializer.save()
return Response(serializer.data) return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class CustomTokenObtainPairView(TokenObtainPairView): class CustomTokenObtainPairView(TokenObtainPairView):
serializer_class = CustomTokenObtainPairSerializer serializer_class = CustomTokenObtainPairSerializer
class SSHKeyUploadView(APIView): class SSHKeyUploadView(APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def post(self, request): def post(self, request):
private_key = request.data.get("private_key") 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: if not private_key or not key_name:
return Response( return Response(
@ -63,6 +67,7 @@ class SSHKeyUploadView(APIView):
user.save(update_fields=["encrypted_private_key", "encrypted_private_key_name", "last_used_at"]) user.save(update_fields=["encrypted_private_key", "encrypted_private_key_name", "last_used_at"])
return Response({"message": "SSH key deleted."}, status=200) return Response({"message": "SSH key deleted."}, status=200)
class SSHKeyInfoView(APIView): class SSHKeyInfoView(APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
@ -73,3 +78,14 @@ class SSHKeyInfoView(APIView):
"encrypted_private_key_name": user.encrypted_private_key_name, "encrypted_private_key_name": user.encrypted_private_key_name,
"last_used_at": user.last_used_at "last_used_at": user.last_used_at
}) })
# ✅ 실제 암호화된 키를 반환하는 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})

View File

@ -1 +1 @@
0.0.9-r1 0.0.10-rc1