Compare commits

...

5 Commits

6 changed files with 77 additions and 12 deletions

80
otp.c
View File

@@ -99,6 +99,9 @@ int handle_text_encrypt(void);
int handle_file_encrypt(void); int handle_file_encrypt(void);
int handle_smart_decrypt(void); int handle_smart_decrypt(void);
// Enhanced input functions
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size);
void print_usage(const char* program_name); void print_usage(const char* program_name);
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
@@ -110,7 +113,7 @@ int main(int argc, char* argv[]) {
} }
int interactive_mode(void) { int interactive_mode(void) {
printf("=== OTP Cipher %s ===\n\n", get_version()); printf("\n\n\n\n=== OTP Cipher %s ===\n\n", get_version());
while (1) { while (1) {
show_main_menu(); show_main_menu();
@@ -148,6 +151,7 @@ int interactive_mode(void) {
break; break;
} }
case 'X': case 'X':
case 'Q':
printf("Goodbye!\n"); printf("Goodbye!\n");
return 0; return 0;
default: default:
@@ -267,7 +271,7 @@ int command_line_mode(int argc, char* argv[]) {
} }
void show_main_menu(void) { void show_main_menu(void) {
printf("=== Main Menu ===\n"); printf("=== Main Menu ===\n\n");
printf("\033[4mT\033[0mext encrypt\n"); printf("\033[4mT\033[0mext encrypt\n");
printf("\033[4mF\033[0mile encrypt\n"); printf("\033[4mF\033[0mile encrypt\n");
printf("\033[4mD\033[0mecrypt\n"); printf("\033[4mD\033[0mecrypt\n");
@@ -2296,6 +2300,59 @@ void simple_entropy_mix(unsigned char* urandom_buffer, size_t buffer_size,
} }
} }
// Enhanced input function for filename with directory separation
int get_filename_with_default(const char* prompt, const char* default_path, char* result, size_t result_size) {
// Find the last directory separator
char* last_slash = strrchr(default_path, '/');
char directory[1024] = "";
char filename[512] = "";
if (last_slash) {
// Extract directory path
size_t dir_len = last_slash - default_path + 1; // Include the trailing slash
if (dir_len < sizeof(directory)) {
strncpy(directory, default_path, dir_len);
directory[dir_len] = '\0';
}
// Extract filename
strncpy(filename, last_slash + 1, sizeof(filename) - 1);
filename[sizeof(filename) - 1] = '\0';
} else {
// No directory separator, treat as filename only
strncpy(filename, default_path, sizeof(filename) - 1);
filename[sizeof(filename) - 1] = '\0';
}
// Display the enhanced prompt with directory and filename separated by colon
printf("\n%s\n%s: %s", prompt, directory, filename);
fflush(stdout);
char input_buffer[512];
if (!fgets(input_buffer, sizeof(input_buffer), stdin)) {
return 1; // Error reading input
}
// Remove newline
input_buffer[strcspn(input_buffer, "\n")] = 0;
// If user just pressed Enter, use the default filename
if (strlen(input_buffer) == 0) {
strncpy(result, default_path, result_size - 1);
result[result_size - 1] = '\0';
} else {
// Combine directory with user input
if (strlen(directory) > 0) {
snprintf(result, result_size, "%s%s", directory, input_buffer);
} else {
strncpy(result, input_buffer, result_size - 1);
result[result_size - 1] = '\0';
}
}
return 0; // Success
}
// Editor and file manager implementations // Editor and file manager implementations
char* get_preferred_editor(void) { char* get_preferred_editor(void) {
@@ -2558,7 +2615,24 @@ int handle_file_encrypt(void) {
int ascii_armor = (atoi(format_input) == 2) ? 1 : 0; int ascii_armor = (atoi(format_input) == 2) ? 1 : 0;
return encrypt_file(pad_input, input_file, NULL, ascii_armor); // Generate default output filename
char default_output[1024]; // Increased buffer size to prevent truncation warnings
if (ascii_armor) {
snprintf(default_output, sizeof(default_output), "%s.otp.asc", input_file);
} else {
snprintf(default_output, sizeof(default_output), "%s.otp", input_file);
}
// Use enhanced input function for output filename
char output_file[512];
if (get_filename_with_default("Output filename:", default_output, output_file, sizeof(output_file)) != 0) {
printf("Error: Failed to read input\n");
return 1;
}
const char* output_filename = output_file;
return encrypt_file(pad_input, input_file, output_filename, ascii_armor);
} }
int handle_smart_decrypt(void) { int handle_smart_decrypt(void) {

View File

@@ -1 +0,0 @@
This is a test file for OTP encryption.

View File

@@ -1 +0,0 @@
This is a test file for OTP encryption.

View File

@@ -1,7 +0,0 @@
-----BEGIN OTP MESSAGE-----
Version: v0.2.15
Pad-ChkSum: 0c8e19fde996e683fdbd348d1052eec168ffe6f67a88bb1278d0d02e9341b87b
Pad-Offset: 210
mMIm7iVtUO6NbXbskMxtydI/A16UXEQUGTcIya/8Dja6PB3EC0MLdw==
-----END OTP MESSAGE-----

Binary file not shown.

Binary file not shown.