This commit is contained in:
@ -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):
|
||||||
|
@ -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"),
|
||||||
]
|
]
|
||||||
|
@ -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})
|
||||||
|
Reference in New Issue
Block a user