From dd958b0fdea4d85324fac19cac18aeb3879e99ed Mon Sep 17 00:00:00 2001 From: Sonali2109 Date: Wed, 23 Jul 2025 11:51:01 +0530 Subject: [PATCH] REMOVED OLD ENDPOINTS AND SOME ENCRYPTION AND DECRYPTION METHODS --- .../SkycrateBackendApplication.java | 0 .../config/ApplicationConfiguration.java | 0 .../skycrateBackend/config/HDFSConfig.java | 0 .../config/HttpToHttpsRedirectConfig.java | 0 .../config/SecurityConfig.java | 0 .../controller/AuthController.java | 0 .../controller/FileController.java | 0 .../controller/HDFScontroller.java | 299 ++++++++++++++++++ .../skycrateBackend/dto/LoginRequest.java | 0 .../skycrateBackend/dto/LoginResponse.java | 0 .../skycrateBackend/dto/LoginUserDto.java | 0 .../skycrateBackend/dto/RegisterUserDto.java | 0 .../skycrateBackend/dto/ResponseDTO.java | 0 .../skycrateBackend/dto/SignupRequest.java | 0 .../dto/TokenRefreshRequest.java | 0 .../dto/TokenRefreshResponse.java | 0 .../skycrateBackend/entity/FileMetadata.java | 0 .../skycrateBackend/entity/RefreshToken.java | 0 .../backend/skycrateBackend/entity/User.java | 0 .../repository/FileMetadataRepository.java | 0 .../repository/RefreshTokenRepository.java | 0 .../repository/UserRepository.java | 0 .../responses/LoginResponse.java | 0 .../security/EncryptionService.java | 0 .../security/JwtAuthenticationFilter.java | 0 .../security/TokenBlacklistService.java | 0 .../services/AuthenticationService.java | 0 .../services/EncryptionUtil.java | 79 +++++ .../skycrateBackend/services/FileService.java | 0 .../services/HDFSOperations.java | 70 ++-- .../skycrateBackend/services/JwtService.java | 0 .../services/RateLimiterService.java | 0 .../services/RefreshTokenService.java | 0 .../skycrateBackend/services/UserService.java | 0 .../skycrateBackend/utils/EncryptionUtil.java | 22 +- .../skycrateBackend/utils/KeyUtil.java | 39 +++ .../skycrateBackend/utils/RSAKeyUtil.java | 36 +-- .../src}/main/resources/application-prod.yml | 1 - .../main/resources/application.properties | 0 Backend/src/main/resources/keystore.p12 | Bin 0 -> 2742 bytes .../controller/HDFScontroller.java | 299 ------------------ .../services/EncryptionUtil.java | 79 ----- .../skycrateBackend/utils/KeyUtil.java | 39 --- 43 files changed, 481 insertions(+), 482 deletions(-) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/SkycrateBackendApplication.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/config/ApplicationConfiguration.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/config/HDFSConfig.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/config/HttpToHttpsRedirectConfig.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/config/SecurityConfig.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/controller/AuthController.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/controller/FileController.java (100%) create mode 100644 Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/LoginRequest.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/LoginResponse.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/LoginUserDto.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/RegisterUserDto.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/ResponseDTO.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/SignupRequest.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshRequest.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshResponse.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/entity/FileMetadata.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/entity/RefreshToken.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/entity/User.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/repository/FileMetadataRepository.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/repository/RefreshTokenRepository.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/repository/UserRepository.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/responses/LoginResponse.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/security/EncryptionService.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/security/JwtAuthenticationFilter.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/security/TokenBlacklistService.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/services/AuthenticationService.java (100%) create mode 100644 Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/services/FileService.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/services/HDFSOperations.java (82%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/services/JwtService.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/services/RateLimiterService.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/services/RefreshTokenService.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/services/UserService.java (100%) rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/utils/EncryptionUtil.java (82%) create mode 100644 Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java rename {src => Backend/src}/main/java/com/skycrate/backend/skycrateBackend/utils/RSAKeyUtil.java (69%) rename {src => Backend/src}/main/resources/application-prod.yml (99%) rename {src => Backend/src}/main/resources/application.properties (100%) create mode 100644 Backend/src/main/resources/keystore.p12 delete mode 100644 src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java delete mode 100644 src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java delete mode 100644 src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/SkycrateBackendApplication.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/SkycrateBackendApplication.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/SkycrateBackendApplication.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/SkycrateBackendApplication.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/config/ApplicationConfiguration.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/ApplicationConfiguration.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/config/ApplicationConfiguration.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/ApplicationConfiguration.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/config/HDFSConfig.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/HDFSConfig.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/config/HDFSConfig.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/HDFSConfig.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/config/HttpToHttpsRedirectConfig.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/HttpToHttpsRedirectConfig.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/config/HttpToHttpsRedirectConfig.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/HttpToHttpsRedirectConfig.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/config/SecurityConfig.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/SecurityConfig.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/config/SecurityConfig.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/config/SecurityConfig.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/controller/AuthController.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/AuthController.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/controller/AuthController.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/AuthController.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/controller/FileController.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/FileController.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/controller/FileController.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/FileController.java diff --git a/Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java new file mode 100644 index 0000000..41b4527 --- /dev/null +++ b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java @@ -0,0 +1,299 @@ +package com.skycrate.backend.skycrateBackend.controller; + +import com.skycrate.backend.skycrateBackend.config.HDFSConfig; +import com.skycrate.backend.skycrateBackend.dto.ResponseDTO; +import com.skycrate.backend.skycrateBackend.entity.User; +import com.skycrate.backend.skycrateBackend.repository.UserRepository; +import com.skycrate.backend.skycrateBackend.services.HDFSOperations; +import com.skycrate.backend.skycrateBackend.utils.KeyUtil; +import com.skycrate.backend.skycrateBackend.utils.RSAKeyUtil; +import org.apache.hadoop.fs.FileSystem; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.List; + +import org.springframework.core.io.FileSystemResource; // For FileSystemResource +import org.springframework.core.io.Resource; // For Resource +import org.springframework.http.HttpHeaders; // For HttpHeaders + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.io.File; // For java.io.File + +@RestController +@RequestMapping("/api/hdfs") +public class HDFScontroller { + + private final HDFSOperations hdfsOperations; + + @Autowired + private UserRepository userRepository; + + + @Autowired + public HDFScontroller(HDFSOperations hdfsOperations) { + this.hdfsOperations = hdfsOperations; + } + + + @PostMapping("/createFolder") + public ResponseDTO createFolder(@RequestParam String hdfsPath) { + try { + hdfsOperations.createFolder(hdfsPath); + return new ResponseDTO("Folder created successfully", true); + } catch (Exception e) { + e.printStackTrace(); + return new ResponseDTO("Failed to create folder: " + e.getMessage(), false); + } + } + +// @PostMapping("/uploadFile") +// public ResponseDTO uploadFile( +// @RequestParam("file") MultipartFile file, +// @RequestParam String hdfsPath, +// @RequestParam String uploadedFileName, +// @RequestParam String username) { +// try { +// // Retrieve the user from the database using the username +// User user = userRepository.findByUsername(username).orElseThrow(() -> new RuntimeException("User not found")); +// +// // Get the public key from the user entity +// byte[] publicKeyBytes = user.getPublicKey(); +// PublicKey publicKey = RSAKeyUtil.getPublicKeyFromBytes(publicKeyBytes); +// +// // Encrypt the file content using the public key +// byte[] encryptedData = encryptFile(file, publicKey); +// +// // Upload the encrypted file to HDFS +// hdfsOperations.uploadFile(encryptedData, hdfsPath, uploadedFileName, username); +// +// return new ResponseDTO("File uploaded successfully", true); +// } catch (IOException e) { +// e.printStackTrace(); +// return new ResponseDTO("Failed to upload file locally: " + e.getMessage(), false); +// } catch (Exception e) { +// e.printStackTrace(); +// return new ResponseDTO("Failed to upload file to HDFS: " + e.getMessage(), false); +// } +// } +// +// // Helper method to encrypt the file content using RSA encryption +// private byte[] encryptFile(MultipartFile file, PublicKey publicKey) throws Exception { +// // Step 1: Generate a random AES key +// SecretKey aesKey = generateAESKey(); +// +// // Step 2: Encrypt the file data using AES +// Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); +// aesCipher.init(Cipher.ENCRYPT_MODE, aesKey); +// byte[] fileData = file.getBytes(); +// byte[] encryptedData = aesCipher.doFinal(fileData); +// +// // Step 3: Encrypt the AES key with RSA +// Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); +// rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey); +// byte[] encryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()); +// +// // Step 4: Combine the encrypted AES key and the encrypted data +// byte[] combined = new byte[4 + encryptedAesKey.length + encryptedData.length]; +// combined[0] = (byte) (encryptedAesKey.length >> 24); +// combined[1] = (byte) (encryptedAesKey.length >> 16); +// combined[2] = (byte) (encryptedAesKey.length >> 8); +// combined[3] = (byte) encryptedAesKey.length; +// +// System.arraycopy(encryptedAesKey, 0, combined, 4, encryptedAesKey.length); +// System.arraycopy(encryptedData, 0, combined, 4 + encryptedAesKey.length, encryptedData.length); +// +// return combined; +// } + +// // Generate a random AES key +// private SecretKey generateAESKey() throws NoSuchAlgorithmException { +// KeyGenerator keyGen = KeyGenerator.getInstance("AES"); +// keyGen.init(256); // Use 256 bits for AES +// return keyGen.generateKey(); +// } + + private String saveFileLocally(MultipartFile file) throws IOException { + // Create a temporary directory if it doesn't exist + Path tmpDir = Paths.get("tmp"); + if (!Files.exists(tmpDir)) { + Files.createDirectories(tmpDir); // Create the directory if it doesn't exist + } + + Path path = tmpDir.resolve(file.getOriginalFilename()); + + // Copy the file to the local directory + Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); + + return path.toString(); // Return the local path for further processing + } + +// @PostMapping("/downloadFile") +// public ResponseEntity downloadFile( +// @RequestParam String hdfsEncPath, +// @RequestParam String username) { +// try { +// // Extract the file name and extension +// String encFileName = new File(hdfsEncPath).getName(); +// String originalFileName = encFileName.replace(".enc", ""); +// String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".") + 1); +// +// // Define local decrypted file path +// String localDecryptedPath = "/SkyCrate/downloaded/" + originalFileName; +// +// // Define HDFS paths for encrypted file +// String encFilePath = "/SkyCrate/downloaded/" + encFileName; +// +// FileSystem fs = HDFSConfig.getHDFS(); +// +// // Download encrypted file from HDFS +// fs.copyToLocalFile(new org.apache.hadoop.fs.Path(hdfsEncPath), new org.apache.hadoop.fs.Path(encFilePath)); +// +// // Retrieve the RSA private key for the user +// User user = userRepository.findByUsername(username) +// .orElseThrow(() -> new RuntimeException("User not found")); +// PrivateKey privateKey = RSAKeyUtil.getPrivateKeyFromBytes(user.getPrivateKey()); +// +// // Read the encrypted file content +// byte[] encryptedFileContent = Files.readAllBytes(Paths.get(encFilePath)); +// +// // Step 1: Extract the AES key length from the combined data +// int aesKeyLength = ((encryptedFileContent[0] & 0xFF) << 24) | +// ((encryptedFileContent[1] & 0xFF) << 16) | +// ((encryptedFileContent[2] & 0xFF) << 8) | +// (encryptedFileContent[3] & 0xFF); +// +// // Step 2: Extract the encrypted AES key and encrypted data +// byte[] encryptedAesKey = new byte[aesKeyLength]; +// byte[] encryptedData = new byte[encryptedFileContent.length - 4 - aesKeyLength]; +// +// System.arraycopy(encryptedFileContent, 4, encryptedAesKey, 0, aesKeyLength); +// System.arraycopy(encryptedFileContent, 4 + aesKeyLength, encryptedData, 0, encryptedData.length); +// +// // Step 3: Decrypt the AES key using RSA +// Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); +// rsaCipher.init(Cipher.DECRYPT_MODE, privateKey); +// byte[] aesKeyBytes = rsaCipher.doFinal(encryptedAesKey); +// +// // Create the AES key +// SecretKey aesKey = new SecretKeySpec(aesKeyBytes, "AES"); +// +// // Step 4: Decrypt the data using AES +// Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); +// aesCipher.init(Cipher.DECRYPT_MODE, aesKey); +// +// // Decrypt the file content using the provided decrypt method +//// byte[] decryptedFileContent = RSAKeyUtil.decrypt(encryptedFileContent, privateKey); +// byte[] decryptedFileContent = aesCipher.doFinal(encryptedData); +// +// // Write the decrypted content to the original file +// Files.write(Paths.get(localDecryptedPath + "." + fileExtension), decryptedFileContent); +// +// +// // Log the file creation +// if (Files.exists(Paths.get(localDecryptedPath + "." + fileExtension))) { +// System.out.println("File created successfully at: " + localDecryptedPath + "." + fileExtension); +// } else { +// System.out.println("Failed to create file at: " + localDecryptedPath + "." + fileExtension); +// } +// +// // Create the decrypted file resource +// File decryptedFile = new File(localDecryptedPath + "." + fileExtension); +// Resource resource = new FileSystemResource(decryptedFile); +// +// // Return the file as a response +// return ResponseEntity.ok() +// .contentLength(decryptedFile.length()) +// .contentType(MediaType.APPLICATION_OCTET_STREAM) +// .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + decryptedFile.getName() + "\"") +// .body(resource); +// +// } catch (Exception e) { +// e.printStackTrace(); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body(null); +// } +// } +// +// +// public void initializeKeysForUser(String username) { +// try { +// // Check if the public key file exists +// Path publicKeyPath = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_public.key"); +// if (!Files.exists(publicKeyPath)) { +// // Generate and store keys if they do not exist +// KeyUtil.generateAndStoreKeyPair(username); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// + + @DeleteMapping("/deleteFile") + public ResponseDTO deleteFile(@RequestParam String hdfsPath) { + try { + hdfsOperations.deleteFile(hdfsPath); + return new ResponseDTO("File deleted successfully", true); + } catch (Exception e) { + return new ResponseDTO("Failed to delete file: " + e.getMessage(), false); + } + } + + @DeleteMapping("/deleteFolder") + public ResponseDTO deleteFolder(@RequestParam String hdfsPath) { + try { + hdfsOperations.deleteFolder(hdfsPath); + return new ResponseDTO("Folder deleted successfully", true); + } catch (Exception e) { + return new ResponseDTO("Failed to delete folder: " + e.getMessage(), false); + } + } + + @GetMapping("/listFiles") + public ResponseEntity listFiles(@RequestParam String hdfsPath) { + try { + List files = hdfsOperations.listFilesAndFolders(hdfsPath); + return ResponseEntity.ok(files); // Returns the list as JSON array + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Failed to list files: " + e.getMessage()); + } + } + + + @GetMapping("/getUsernameByEmail") + public ResponseEntity getUsernameByEmail(@RequestParam String email) { + try { + // Fetch user from the database using the provided email + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new RuntimeException("User not found with email: " + email)); + +// // Log the retrieved user object to verify the username +// System.out.println("Retrieved user: " + user.getFullname()); + + // Return the username as the response + return ResponseEntity.ok(user.getFullname()); // Return the username + } catch (Exception e) { + // Handle error if user is not found or other exceptions occur + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Failed to fetch username: " + e.getMessage()); + } + } + +} diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginRequest.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginRequest.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginRequest.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginRequest.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginResponse.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginResponse.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginResponse.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginResponse.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginUserDto.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginUserDto.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginUserDto.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/LoginUserDto.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/RegisterUserDto.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/RegisterUserDto.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/RegisterUserDto.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/RegisterUserDto.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/ResponseDTO.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/ResponseDTO.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/ResponseDTO.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/ResponseDTO.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/SignupRequest.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/SignupRequest.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/SignupRequest.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/SignupRequest.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshRequest.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshRequest.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshRequest.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshRequest.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshResponse.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshResponse.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshResponse.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/dto/TokenRefreshResponse.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/entity/FileMetadata.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/entity/FileMetadata.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/entity/FileMetadata.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/entity/FileMetadata.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/entity/RefreshToken.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/entity/RefreshToken.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/entity/RefreshToken.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/entity/RefreshToken.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/entity/User.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/entity/User.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/entity/User.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/entity/User.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/repository/FileMetadataRepository.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/repository/FileMetadataRepository.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/repository/FileMetadataRepository.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/repository/FileMetadataRepository.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/repository/RefreshTokenRepository.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/repository/RefreshTokenRepository.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/repository/RefreshTokenRepository.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/repository/RefreshTokenRepository.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/repository/UserRepository.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/repository/UserRepository.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/repository/UserRepository.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/repository/UserRepository.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/responses/LoginResponse.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/responses/LoginResponse.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/responses/LoginResponse.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/responses/LoginResponse.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/security/EncryptionService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/security/EncryptionService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/security/EncryptionService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/security/EncryptionService.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/security/JwtAuthenticationFilter.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/security/JwtAuthenticationFilter.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/security/JwtAuthenticationFilter.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/security/JwtAuthenticationFilter.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/security/TokenBlacklistService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/security/TokenBlacklistService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/security/TokenBlacklistService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/security/TokenBlacklistService.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/AuthenticationService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/AuthenticationService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/services/AuthenticationService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/AuthenticationService.java diff --git a/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java new file mode 100644 index 0000000..aa10441 --- /dev/null +++ b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java @@ -0,0 +1,79 @@ +package com.skycrate.backend.skycrateBackend.services; + +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; + +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; +import java.util.Base64; + +public class EncryptionUtil { + + private static final int SALT_LENGTH = 16; // in bytes + private static final int IV_LENGTH = 16; // for AES CBC + private static final int ITERATIONS = 65536; + private static final int KEY_LENGTH = 256; // bits +// +// // --- AES key derivation using PBKDF2 --- +// public static SecretKey deriveAESKey(char[] password, byte[] salt) +// throws NoSuchAlgorithmException, InvalidKeySpecException { +// +// SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); +// +// KeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_LENGTH); +// byte[] keyBytes = factory.generateSecret(spec).getEncoded(); +// +// return new SecretKeySpec(keyBytes, "AES"); +// } +// +// // --- Encrypt data using AES-CBC --- +// public static byte[] encrypt(byte[] data, SecretKey key, byte[] iv) +// throws GeneralSecurityException { +// +// Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); +// +// IvParameterSpec ivSpec = new IvParameterSpec(iv); +// cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); +// +// return cipher.doFinal(data); +// } + + // --- Decrypt data using AES-CBC --- +// public static byte[] decrypt(byte[] encryptedData, SecretKey key, byte[] iv) +// throws GeneralSecurityException { +// +// Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); +// +// IvParameterSpec ivSpec = new IvParameterSpec(iv); +// cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); +// +// return cipher.doFinal(encryptedData); +// } +// +// // --- Generate random salt --- +// public static byte[] generateSalt() { +// byte[] salt = new byte[SALT_LENGTH]; +// new SecureRandom().nextBytes(salt); +// return salt; +// } + +// // --- Generate random IV --- +// public static byte[] generateIV() { +// byte[] iv = new byte[IV_LENGTH]; +// new SecureRandom().nextBytes(iv); +// return iv; +// } +// +// // --- Optional: Utility to base64 encode data --- +// public static String encodeBase64(byte[] data) { +// return Base64.getEncoder().encodeToString(data); +// } +// +// public static byte[] decodeBase64(String base64) { +// return Base64.getDecoder().decode(base64); +// } +} \ No newline at end of file diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/FileService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/FileService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/services/FileService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/FileService.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/HDFSOperations.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/HDFSOperations.java similarity index 82% rename from src/main/java/com/skycrate/backend/skycrateBackend/services/HDFSOperations.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/HDFSOperations.java index ef09835..1521414 100644 --- a/src/main/java/com/skycrate/backend/skycrateBackend/services/HDFSOperations.java +++ b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/HDFSOperations.java @@ -120,41 +120,41 @@ public class HDFSOperations { // } // } - public void uploadFile(byte[] fileData, String hdfsPath, String uploadedFileName, String username) { - try { - FileSystem fs = HDFSConfig.getHDFS(); - ByteArrayInputStream inputStream = new ByteArrayInputStream(fileData); - String finalHdfsPath = hdfsPath.endsWith("/") ? hdfsPath + uploadedFileName : hdfsPath + "/" + uploadedFileName; - Path hdfsFilePath = new Path(finalHdfsPath); - try (FSDataOutputStream outputStream = fs.create(hdfsFilePath)) { - IOUtils.copyBytes(inputStream, outputStream, 4096, true); - } - } catch (IOException e) { - throw new RuntimeException("Failed to upload file to HDFS: " + e.getMessage(), e); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public void downloadFile(String hdfsEncPath, String localPathWithoutExt, String username) { - try { - FileSystem fs = HDFSConfig.getHDFS(); - String encFilePath = localPathWithoutExt + ".enc"; - fs.copyToLocalFile(new Path(hdfsEncPath), new Path(encFilePath)); - - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new RuntimeException("User not found")); - PrivateKey privateKey = RSAKeyUtil.getPrivateKeyFromBytes(user.getPrivateKey()); - - byte[] encryptedFileContent = Files.readAllBytes(Paths.get(encFilePath)); - byte[] decryptedFileContent = RSAKeyUtil.decrypt(encryptedFileContent, privateKey); - - Files.write(Paths.get(localPathWithoutExt), decryptedFileContent); - Files.deleteIfExists(Paths.get(encFilePath)); - } catch (Exception e) { - throw new RuntimeException("Failed to download or decrypt file: " + e.getMessage(), e); - } - } +// public void uploadFile(byte[] fileData, String hdfsPath, String uploadedFileName, String username) { +// try { +// FileSystem fs = HDFSConfig.getHDFS(); +// ByteArrayInputStream inputStream = new ByteArrayInputStream(fileData); +// String finalHdfsPath = hdfsPath.endsWith("/") ? hdfsPath + uploadedFileName : hdfsPath + "/" + uploadedFileName; +// Path hdfsFilePath = new Path(finalHdfsPath); +// try (FSDataOutputStream outputStream = fs.create(hdfsFilePath)) { +// IOUtils.copyBytes(inputStream, outputStream, 4096, true); +// } +// } catch (IOException e) { +// throw new RuntimeException("Failed to upload file to HDFS: " + e.getMessage(), e); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// } +// +// public void downloadFile(String hdfsEncPath, String localPathWithoutExt, String username) { +// try { +// FileSystem fs = HDFSConfig.getHDFS(); +// String encFilePath = localPathWithoutExt + ".enc"; +// fs.copyToLocalFile(new Path(hdfsEncPath), new Path(encFilePath)); +// +// User user = userRepository.findByUsername(username) +// .orElseThrow(() -> new RuntimeException("User not found")); +// PrivateKey privateKey = RSAKeyUtil.getPrivateKeyFromBytes(user.getPrivateKey()); +// +// byte[] encryptedFileContent = Files.readAllBytes(Paths.get(encFilePath)); +// byte[] decryptedFileContent = RSAKeyUtil.decrypt(encryptedFileContent, privateKey); +// +// Files.write(Paths.get(localPathWithoutExt), decryptedFileContent); +// Files.deleteIfExists(Paths.get(encFilePath)); +// } catch (Exception e) { +// throw new RuntimeException("Failed to download or decrypt file: " + e.getMessage(), e); +// } +// } public void createFolder(String hdfsPath) { try { diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/JwtService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/JwtService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/services/JwtService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/JwtService.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/RateLimiterService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/RateLimiterService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/services/RateLimiterService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/RateLimiterService.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/RefreshTokenService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/RefreshTokenService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/services/RefreshTokenService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/RefreshTokenService.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/UserService.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/UserService.java similarity index 100% rename from src/main/java/com/skycrate/backend/skycrateBackend/services/UserService.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/services/UserService.java diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/utils/EncryptionUtil.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/EncryptionUtil.java similarity index 82% rename from src/main/java/com/skycrate/backend/skycrateBackend/utils/EncryptionUtil.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/EncryptionUtil.java index d5ad1ea..c8c14a4 100644 --- a/src/main/java/com/skycrate/backend/skycrateBackend/utils/EncryptionUtil.java +++ b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/EncryptionUtil.java @@ -80,15 +80,15 @@ public class EncryptionUtil { return cipher.doFinal(data); } - // --------- Encrypt/decrypt RSA private key using AES derived from password --------- - - public static byte[] encryptPrivateKey(PrivateKey privateKey, String password, byte[] salt, byte[] iv) throws Exception { - SecretKey aesKey = deriveKey(password.toCharArray(), salt); - return encrypt(privateKey.getEncoded(), aesKey, iv); - } - - public static byte[] decryptPrivateKey(byte[] encryptedPrivateKey, String password, byte[] salt, byte[] iv) throws Exception { - SecretKey aesKey = deriveKey(password.toCharArray(), salt); - return decrypt(encryptedPrivateKey, aesKey, iv); - } +// // --------- Encrypt/decrypt RSA private key using AES derived from password --------- +// +// public static byte[] encryptPrivateKey(PrivateKey privateKey, String password, byte[] salt, byte[] iv) throws Exception { +// SecretKey aesKey = deriveKey(password.toCharArray(), salt); +// return encrypt(privateKey.getEncoded(), aesKey, iv); +// } +// +// public static byte[] decryptPrivateKey(byte[] encryptedPrivateKey, String password, byte[] salt, byte[] iv) throws Exception { +// SecretKey aesKey = deriveKey(password.toCharArray(), salt); +// return decrypt(encryptedPrivateKey, aesKey, iv); +// } } \ No newline at end of file diff --git a/Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java new file mode 100644 index 0000000..0b35819 --- /dev/null +++ b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java @@ -0,0 +1,39 @@ +package com.skycrate.backend.skycrateBackend.utils; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +public class KeyUtil { + +// public static void generateAndStoreKeyPair(String username) throws Exception { +// KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); +// keyPairGenerator.initialize(2048); // Key size +// KeyPair keyPair = keyPairGenerator.generateKeyPair(); +// +// // Store the public key +// Path publicKeyPath = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_public.key"); +// Files.write(publicKeyPath, keyPair.getPublic().getEncoded()); +// +// // Store the private key +// Path privateKeyPath = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_private.key"); +// Files.write(privateKeyPath, keyPair.getPrivate().getEncoded()); +// } +// +// public static PublicKey getPublicKeyForUser(String username) throws Exception { +// Path path = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_public.key"); +// byte[] bytes = Files.readAllBytes(path); +// X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); +// return KeyFactory.getInstance("RSA").generatePublic(keySpec); +// } +// +// public static PrivateKey getPrivateKeyForUser(String username) throws Exception { +// Path path = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_private.key"); +// byte[] bytes = Files.readAllBytes(path); +// PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); +// return KeyFactory.getInstance("RSA").generatePrivate(keySpec); +// } +} \ No newline at end of file diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/utils/RSAKeyUtil.java b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/RSAKeyUtil.java similarity index 69% rename from src/main/java/com/skycrate/backend/skycrateBackend/utils/RSAKeyUtil.java rename to Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/RSAKeyUtil.java index bde1801..5b8883f 100644 --- a/src/main/java/com/skycrate/backend/skycrateBackend/utils/RSAKeyUtil.java +++ b/Backend/src/main/java/com/skycrate/backend/skycrateBackend/utils/RSAKeyUtil.java @@ -52,22 +52,22 @@ public class RSAKeyUtil { return cipher.doFinal(encryptedData); } - // AES key generation - public static SecretKey generateAESKey(int keySize) throws NoSuchAlgorithmException { - if (keySize != 128 && keySize != 192 && keySize != 256) { - throw new IllegalArgumentException("Invalid AES key size. Must be 128, 192, or 256 bits."); - } - KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); - keyGenerator.init(keySize); - return keyGenerator.generateKey(); - } - - public static byte[] encryptAESKey(SecretKey aesKey, PublicKey publicKey) throws Exception { - return encrypt(aesKey.getEncoded(), publicKey); - } - - public static SecretKey decryptAESKey(byte[] encryptedAESKey, PrivateKey privateKey, int keySize) throws Exception { - byte[] decryptedKey = decrypt(encryptedAESKey, privateKey); - return new SecretKeySpec(decryptedKey, 0, decryptedKey.length, "AES"); - } +// // AES key generation +// public static SecretKey generateAESKey(int keySize) throws NoSuchAlgorithmException { +// if (keySize != 128 && keySize != 192 && keySize != 256) { +// throw new IllegalArgumentException("Invalid AES key size. Must be 128, 192, or 256 bits."); +// } +// KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); +// keyGenerator.init(keySize); +// return keyGenerator.generateKey(); +// } +// +// public static byte[] encryptAESKey(SecretKey aesKey, PublicKey publicKey) throws Exception { +// return encrypt(aesKey.getEncoded(), publicKey); +// } +// +// public static SecretKey decryptAESKey(byte[] encryptedAESKey, PrivateKey privateKey, int keySize) throws Exception { +// byte[] decryptedKey = decrypt(encryptedAESKey, privateKey); +// return new SecretKeySpec(decryptedKey, 0, decryptedKey.length, "AES"); +// } } \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/Backend/src/main/resources/application-prod.yml similarity index 99% rename from src/main/resources/application-prod.yml rename to Backend/src/main/resources/application-prod.yml index 9ba275b..b91c979 100644 --- a/src/main/resources/application-prod.yml +++ b/Backend/src/main/resources/application-prod.yml @@ -6,4 +6,3 @@ server: key-store-password: changeit key-store-type: PKCS12 key-alias: tomcat - diff --git a/src/main/resources/application.properties b/Backend/src/main/resources/application.properties similarity index 100% rename from src/main/resources/application.properties rename to Backend/src/main/resources/application.properties diff --git a/Backend/src/main/resources/keystore.p12 b/Backend/src/main/resources/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..815cd9dae991f9a6443ca4ea0eeffe9ecef3c1d5 GIT binary patch literal 2742 zcma);X*d)N_r_zfEV}=MLyP?5^EFn!AyCiw+ zYm=pvLB`W$%aZW+zy9ylbG@J5_rtl)b$<7`&&T^ZNDSL^79cAU!*&G%lf#+fb~u2? zfFul?1qj1-@i#t?#DHu5Ljo6pFyQ>(IQw@IAjkjhVrK)gkT78V-%uNQ^N$0}fxL`F z|1+{9&w}9VOX16wmmW;-(4(smKMu(ks{(vkSfsgGfCwZz1p5CMSzurQQUn6KhBF0v zv4VhdAnr_Z>b_;2W@%}C?gm$KhZzV18cFrP@JRkh@?euoK!`6tAq`u$#I8p{x6vt0 z2c&_Jtb0^zW$7)ZFi1u=CxtE`K9_I4S+<-hQvDZ{#M%L|rr^jfrKdl|o-5c^5Zl_m zXiIi{Y+e${_Gp16t&88NZh4O=o~6`}3;x{2;lJ@0d*?kDe{se0nuvu!t_=e9M= z7rx2+cn?@<3O4Rg(A;{5OA*6kf-GTYuBW%V|1461WIP&AcA;7fvs2^XJarSlKE7Of z(Q?`{rx2@C=b#x@IkO`A&Obf`d_79%GjYdmHXz=?s*XM$DS7jQmUt2H<>xuRd-mQH zhAEt_gY2)3^#q}c4XdfN@e#XL-(w|Uq#miOpn9L5>*~x&b!7})(~&cAIPC|PP2R91 z(nzAaXf$d6e8!u^lOL*k91jRzRgyOcIS27*?YasZS-&*WB(0o3>cs}$PQ=QUap?|B zkE>GpTi#q>TL0TSdEsV!-9&xX-170}JNPPG+VIOB#FN%g@!Nm~F~7@L;dQFO_Zr)t zsng-76bv0fWLQF-nTTt3e|ce8)TeZF;p6?yw2AnT=AxGe@}Pg&EZz3Pa<;9^a3PglI-gNGsEIMNU+H%~=(3&Oa(5eaUQ9VO~ojzNxNZ zD_FZACjN?KlTvZegRMr0>kEji=StI8Cl&w3oRs4g@cLcIfG{bsOLv4#ZGKOBirD5F zv`r|uyK>Ntqr7^TyXjs#=6z!^c3c#m=wHxrG$qGP4u8E`NM7(uN^93XXct?R73Z=p z86BKw^j@D%eHby5;TT|_WLn02&C8M7gPu%jiF==VR8htGD)m%Tl3H3=631fNMPYiI z3>0vuGQfzqE8(a5mL2lh6p;M6czE>4}Z&Trs>pL1 zNTj+N5(6UqSvm$GVL+JQD24?H_}#+)QGov~q*G&2#;07a#7gq(J_xyDcuF#U>F|FE z=>!P7ZlKOSuf8CGHG9{WHx2^=M1|Cxx0L!cky;Pwbhhk8S?STxxw--=Pf9Bi#zQX0 zeW~vFHJfqP5HdNPP#1a`GHPR+t>kJoW857wWl2zqF}Gk&=jAxB-J>|F{z$8**qH68 zZWGyAkfzLIY;sP*(|IV@rYgbLN|(f%onr zr!9}~wlOtazMA2=w~@omIBu9dS?>HUA7^3jgI{dBPhEGKVwv$a?J)*|NU!PJj@vfe zFA`n6ICV4}(C!#9F3`&ZnblT*y!|fkJ%rtmbB`C^)Rm{Ak9p>A#Zhrv%QXUoXBr~k zufO4ByQ)>pnH7Wsoqb+BoiyT|KI`K-ha=|sjzrxv4Luls?YhuImHA?zeymvRiX5z& zN?%gv_f5_6XhlN{sdFuNTfR%PiSznGI~yCi0VZ?LXh~VYReLn~n}>qF#;LV)&}E}r zzqAM*d3IEWDGlFWh`08LX8lQSs2+B#(K4~{p(!gAJJq(N#|TQV5p&a=-(|Y3_?Q~C z57FG)F07Ld+)& zZS$Dc7e#BM5&V6rC?g(ASN@g8hbc6;GZ+nIwLWpCS^Z(#!ZkK#BBCHFNRrMa_{>E; z&QP60pe7!_ELY`H42ya zeK^(OGkTEKQUByk8LCCFo%lej$S{A_wA$^H+C4(xv6VHc#w=Ri#_~vJz-wv3+_(A` zqzc|C8(8mQ^M$ct^&Cb*v{0IqJ$5v*_GI6oKvyPjH6x^5qML`4A- ztj~nZ-1lTRw|>7wj=MLkCcE`D+-r=w=Fu#m6`e@kLQi|pQ>9Iws}hLiai(Q>5rv`% zAgSV}|4;Osj83M1a7HV4>n=RZ{ISd(7j1AUqSB61({LBJQ{_p#f#o(0Hka$j203FJ zU-}u>9Lj6qdn-gjCP`XY5XZUP-H)kKqwIwsM4uo)Tp#a&Drjm<3O$cAfK08aP#3 zVLvmr-52WZ>FH8tStxVgTdrL0#K%uX06nhML1W-}s08heCa;kppS0x$^A^MY#??1V zNDCwi$?@lxV*!EzAVgbkWAsZY^^bRVz}O|lu7+`Y_POKyOFH5_p9Z<2%~U{eXTeQo Xa!gkQ_ApQ#rRg}iVO@Ii|03vL)K&UN literal 0 HcmV?d00001 diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java b/src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java deleted file mode 100644 index 86d4ceb..0000000 --- a/src/main/java/com/skycrate/backend/skycrateBackend/controller/HDFScontroller.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.skycrate.backend.skycrateBackend.controller; - -import com.skycrate.backend.skycrateBackend.config.HDFSConfig; -import com.skycrate.backend.skycrateBackend.dto.ResponseDTO; -import com.skycrate.backend.skycrateBackend.entity.User; -import com.skycrate.backend.skycrateBackend.repository.UserRepository; -import com.skycrate.backend.skycrateBackend.services.HDFSOperations; -import com.skycrate.backend.skycrateBackend.utils.KeyUtil; -import com.skycrate.backend.skycrateBackend.utils.RSAKeyUtil; -import org.apache.hadoop.fs.FileSystem; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.util.List; - -import org.springframework.core.io.FileSystemResource; // For FileSystemResource -import org.springframework.core.io.Resource; // For Resource -import org.springframework.http.HttpHeaders; // For HttpHeaders - -import javax.crypto.Cipher; -import javax.crypto.KeyGenerator; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; -import java.io.File; // For java.io.File - -@RestController -@RequestMapping("/api/hdfs") -public class HDFScontroller { - - private final HDFSOperations hdfsOperations; - - @Autowired - private UserRepository userRepository; - - - @Autowired - public HDFScontroller(HDFSOperations hdfsOperations) { - this.hdfsOperations = hdfsOperations; - } - - - @PostMapping("/createFolder") - public ResponseDTO createFolder(@RequestParam String hdfsPath) { - try { - hdfsOperations.createFolder(hdfsPath); - return new ResponseDTO("Folder created successfully", true); - } catch (Exception e) { - e.printStackTrace(); - return new ResponseDTO("Failed to create folder: " + e.getMessage(), false); - } - } - - @PostMapping("/uploadFile") - public ResponseDTO uploadFile( - @RequestParam("file") MultipartFile file, - @RequestParam String hdfsPath, - @RequestParam String uploadedFileName, - @RequestParam String username) { - try { - // Retrieve the user from the database using the username - User user = userRepository.findByUsername(username).orElseThrow(() -> new RuntimeException("User not found")); - - // Get the public key from the user entity - byte[] publicKeyBytes = user.getPublicKey(); - PublicKey publicKey = RSAKeyUtil.getPublicKeyFromBytes(publicKeyBytes); - - // Encrypt the file content using the public key - byte[] encryptedData = encryptFile(file, publicKey); - - // Upload the encrypted file to HDFS - hdfsOperations.uploadFile(encryptedData, hdfsPath, uploadedFileName, username); - - return new ResponseDTO("File uploaded successfully", true); - } catch (IOException e) { - e.printStackTrace(); - return new ResponseDTO("Failed to upload file locally: " + e.getMessage(), false); - } catch (Exception e) { - e.printStackTrace(); - return new ResponseDTO("Failed to upload file to HDFS: " + e.getMessage(), false); - } - } - - // Helper method to encrypt the file content using RSA encryption - private byte[] encryptFile(MultipartFile file, PublicKey publicKey) throws Exception { - // Step 1: Generate a random AES key - SecretKey aesKey = generateAESKey(); - - // Step 2: Encrypt the file data using AES - Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); - aesCipher.init(Cipher.ENCRYPT_MODE, aesKey); - byte[] fileData = file.getBytes(); - byte[] encryptedData = aesCipher.doFinal(fileData); - - // Step 3: Encrypt the AES key with RSA - Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey); - byte[] encryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()); - - // Step 4: Combine the encrypted AES key and the encrypted data - byte[] combined = new byte[4 + encryptedAesKey.length + encryptedData.length]; - combined[0] = (byte) (encryptedAesKey.length >> 24); - combined[1] = (byte) (encryptedAesKey.length >> 16); - combined[2] = (byte) (encryptedAesKey.length >> 8); - combined[3] = (byte) encryptedAesKey.length; - - System.arraycopy(encryptedAesKey, 0, combined, 4, encryptedAesKey.length); - System.arraycopy(encryptedData, 0, combined, 4 + encryptedAesKey.length, encryptedData.length); - - return combined; - } - - // Generate a random AES key - private SecretKey generateAESKey() throws NoSuchAlgorithmException { - KeyGenerator keyGen = KeyGenerator.getInstance("AES"); - keyGen.init(256); // Use 256 bits for AES - return keyGen.generateKey(); - } - - private String saveFileLocally(MultipartFile file) throws IOException { - // Create a temporary directory if it doesn't exist - Path tmpDir = Paths.get("tmp"); - if (!Files.exists(tmpDir)) { - Files.createDirectories(tmpDir); // Create the directory if it doesn't exist - } - - Path path = tmpDir.resolve(file.getOriginalFilename()); - - // Copy the file to the local directory - Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); - - return path.toString(); // Return the local path for further processing - } - - @PostMapping("/downloadFile") - public ResponseEntity downloadFile( - @RequestParam String hdfsEncPath, - @RequestParam String username) { - try { - // Extract the file name and extension - String encFileName = new File(hdfsEncPath).getName(); - String originalFileName = encFileName.replace(".enc", ""); - String fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".") + 1); - - // Define local decrypted file path - String localDecryptedPath = "/SkyCrate/downloaded/" + originalFileName; - - // Define HDFS paths for encrypted file - String encFilePath = "/SkyCrate/downloaded/" + encFileName; - - FileSystem fs = HDFSConfig.getHDFS(); - - // Download encrypted file from HDFS - fs.copyToLocalFile(new org.apache.hadoop.fs.Path(hdfsEncPath), new org.apache.hadoop.fs.Path(encFilePath)); - - // Retrieve the RSA private key for the user - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new RuntimeException("User not found")); - PrivateKey privateKey = RSAKeyUtil.getPrivateKeyFromBytes(user.getPrivateKey()); - - // Read the encrypted file content - byte[] encryptedFileContent = Files.readAllBytes(Paths.get(encFilePath)); - - // Step 1: Extract the AES key length from the combined data - int aesKeyLength = ((encryptedFileContent[0] & 0xFF) << 24) | - ((encryptedFileContent[1] & 0xFF) << 16) | - ((encryptedFileContent[2] & 0xFF) << 8) | - (encryptedFileContent[3] & 0xFF); - - // Step 2: Extract the encrypted AES key and encrypted data - byte[] encryptedAesKey = new byte[aesKeyLength]; - byte[] encryptedData = new byte[encryptedFileContent.length - 4 - aesKeyLength]; - - System.arraycopy(encryptedFileContent, 4, encryptedAesKey, 0, aesKeyLength); - System.arraycopy(encryptedFileContent, 4 + aesKeyLength, encryptedData, 0, encryptedData.length); - - // Step 3: Decrypt the AES key using RSA - Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - rsaCipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] aesKeyBytes = rsaCipher.doFinal(encryptedAesKey); - - // Create the AES key - SecretKey aesKey = new SecretKeySpec(aesKeyBytes, "AES"); - - // Step 4: Decrypt the data using AES - Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); - aesCipher.init(Cipher.DECRYPT_MODE, aesKey); - - // Decrypt the file content using the provided decrypt method -// byte[] decryptedFileContent = RSAKeyUtil.decrypt(encryptedFileContent, privateKey); - byte[] decryptedFileContent = aesCipher.doFinal(encryptedData); - - // Write the decrypted content to the original file - Files.write(Paths.get(localDecryptedPath + "." + fileExtension), decryptedFileContent); - - - // Log the file creation - if (Files.exists(Paths.get(localDecryptedPath + "." + fileExtension))) { - System.out.println("File created successfully at: " + localDecryptedPath + "." + fileExtension); - } else { - System.out.println("Failed to create file at: " + localDecryptedPath + "." + fileExtension); - } - - // Create the decrypted file resource - File decryptedFile = new File(localDecryptedPath + "." + fileExtension); - Resource resource = new FileSystemResource(decryptedFile); - - // Return the file as a response - return ResponseEntity.ok() - .contentLength(decryptedFile.length()) - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + decryptedFile.getName() + "\"") - .body(resource); - - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(null); - } - } - - - public void initializeKeysForUser(String username) { - try { - // Check if the public key file exists - Path publicKeyPath = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_public.key"); - if (!Files.exists(publicKeyPath)) { - // Generate and store keys if they do not exist - KeyUtil.generateAndStoreKeyPair(username); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - - @DeleteMapping("/deleteFile") - public ResponseDTO deleteFile(@RequestParam String hdfsPath) { - try { - hdfsOperations.deleteFile(hdfsPath); - return new ResponseDTO("File deleted successfully", true); - } catch (Exception e) { - return new ResponseDTO("Failed to delete file: " + e.getMessage(), false); - } - } - - @DeleteMapping("/deleteFolder") - public ResponseDTO deleteFolder(@RequestParam String hdfsPath) { - try { - hdfsOperations.deleteFolder(hdfsPath); - return new ResponseDTO("Folder deleted successfully", true); - } catch (Exception e) { - return new ResponseDTO("Failed to delete folder: " + e.getMessage(), false); - } - } - - @GetMapping("/listFiles") - public ResponseEntity listFiles(@RequestParam String hdfsPath) { - try { - List files = hdfsOperations.listFilesAndFolders(hdfsPath); - return ResponseEntity.ok(files); // Returns the list as JSON array - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Failed to list files: " + e.getMessage()); - } - } - - - @GetMapping("/getUsernameByEmail") - public ResponseEntity getUsernameByEmail(@RequestParam String email) { - try { - // Fetch user from the database using the provided email - User user = userRepository.findByEmail(email) - .orElseThrow(() -> new RuntimeException("User not found with email: " + email)); - -// // Log the retrieved user object to verify the username -// System.out.println("Retrieved user: " + user.getFullname()); - - // Return the username as the response - return ResponseEntity.ok(user.getFullname()); // Return the username - } catch (Exception e) { - // Handle error if user is not found or other exceptions occur - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Failed to fetch username: " + e.getMessage()); - } - } - -} diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java b/src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java deleted file mode 100644 index b9c1452..0000000 --- a/src/main/java/com/skycrate/backend/skycrateBackend/services/EncryptionUtil.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.skycrate.backend.skycrateBackend.services; - -import javax.crypto.*; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.PBEKeySpec; -import javax.crypto.spec.SecretKeySpec; - -import java.nio.charset.StandardCharsets; -import java.security.*; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.KeySpec; -import java.util.Base64; - -public class EncryptionUtil { - - private static final int SALT_LENGTH = 16; // in bytes - private static final int IV_LENGTH = 16; // for AES CBC - private static final int ITERATIONS = 65536; - private static final int KEY_LENGTH = 256; // bits - - // --- AES key derivation using PBKDF2 --- - public static SecretKey deriveAESKey(char[] password, byte[] salt) - throws NoSuchAlgorithmException, InvalidKeySpecException { - - SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); - - KeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_LENGTH); - byte[] keyBytes = factory.generateSecret(spec).getEncoded(); - - return new SecretKeySpec(keyBytes, "AES"); - } - - // --- Encrypt data using AES-CBC --- - public static byte[] encrypt(byte[] data, SecretKey key, byte[] iv) - throws GeneralSecurityException { - - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); - - IvParameterSpec ivSpec = new IvParameterSpec(iv); - cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); - - return cipher.doFinal(data); - } - - // --- Decrypt data using AES-CBC --- - public static byte[] decrypt(byte[] encryptedData, SecretKey key, byte[] iv) - throws GeneralSecurityException { - - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); - - IvParameterSpec ivSpec = new IvParameterSpec(iv); - cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); - - return cipher.doFinal(encryptedData); - } - - // --- Generate random salt --- - public static byte[] generateSalt() { - byte[] salt = new byte[SALT_LENGTH]; - new SecureRandom().nextBytes(salt); - return salt; - } - - // --- Generate random IV --- - public static byte[] generateIV() { - byte[] iv = new byte[IV_LENGTH]; - new SecureRandom().nextBytes(iv); - return iv; - } - - // --- Optional: Utility to base64 encode data --- - public static String encodeBase64(byte[] data) { - return Base64.getEncoder().encodeToString(data); - } - - public static byte[] decodeBase64(String base64) { - return Base64.getDecoder().decode(base64); - } -} \ No newline at end of file diff --git a/src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java b/src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java deleted file mode 100644 index f75db93..0000000 --- a/src/main/java/com/skycrate/backend/skycrateBackend/utils/KeyUtil.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.skycrate.backend.skycrateBackend.utils; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.*; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; - -public class KeyUtil { - - public static void generateAndStoreKeyPair(String username) throws Exception { - KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); - keyPairGenerator.initialize(2048); // Key size - KeyPair keyPair = keyPairGenerator.generateKeyPair(); - - // Store the public key - Path publicKeyPath = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_public.key"); - Files.write(publicKeyPath, keyPair.getPublic().getEncoded()); - - // Store the private key - Path privateKeyPath = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_private.key"); - Files.write(privateKeyPath, keyPair.getPrivate().getEncoded()); - } - - public static PublicKey getPublicKeyForUser(String username) throws Exception { - Path path = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_public.key"); - byte[] bytes = Files.readAllBytes(path); - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); - return KeyFactory.getInstance("RSA").generatePublic(keySpec); - } - - public static PrivateKey getPrivateKeyForUser(String username) throws Exception { - Path path = Paths.get("C:\\Users\\sonal\\OneDrive\\Desktop\\SkyCrate\\Skycrate\\keys", username + "_private.key"); - byte[] bytes = Files.readAllBytes(path); - PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); - return KeyFactory.getInstance("RSA").generatePrivate(keySpec); - } -} \ No newline at end of file