progress
This commit is contained in:
		
							parent
							
								
									291c72c2a5
								
							
						
					
					
						commit
						4db2cb753a
					
				
							
								
								
									
										139
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								src/main.c
									
									
									
									
									
								
							@ -237,8 +237,8 @@ void mem_expand_dynamically() {
 | 
				
			|||||||
        struct log_entry *new_ptr = realloc(all_entries, max_entries * sizeof(struct log_entry));
 | 
					        struct log_entry *new_ptr = realloc(all_entries, max_entries * sizeof(struct log_entry));
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (new_ptr == NULL) {
 | 
					        if (new_ptr == NULL) {
 | 
				
			||||||
            printf("FEHLER: Speicher konnte nicht auf %d Einträge erweitert werden, ..\n", max_entries);
 | 
					            printf("ERROR: Speicher konnte nicht auf %d Einträge erweitert werden, ..\n", max_entries);
 | 
				
			||||||
            printf("FEHLER: Benötigter Speicher: %lu Bytes\n", (unsigned long)(max_entries * sizeof(struct log_entry)));
 | 
					            printf("ERROR: Benötigter Speicher: %lu Bytes\n", (unsigned long)(max_entries * sizeof(struct log_entry)));
 | 
				
			||||||
            cleanup_and_exit();
 | 
					            cleanup_and_exit();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@ -252,8 +252,8 @@ void allocate_initial_memory() {
 | 
				
			|||||||
    all_entries = malloc(max_entries * sizeof(struct log_entry));
 | 
					    all_entries = malloc(max_entries * sizeof(struct log_entry));
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (all_entries == NULL) {
 | 
					    if (all_entries == NULL) {
 | 
				
			||||||
        printf("FEHLER: Konnte %d Einträge nicht allozieren, ..\n", max_entries);
 | 
					        printf("ERROR: Konnte %d Einträge nicht allozieren, ..\n", max_entries);
 | 
				
			||||||
        printf("FEHLER: %lu Bytes\n", (unsigned long)(max_entries * sizeof(struct log_entry)));
 | 
					        printf("ERROR: %lu Bytes\n", (unsigned long)(max_entries * sizeof(struct log_entry)));
 | 
				
			||||||
        exit(1); // cleanup_and_exit() nicht nötig, da der Speicherbereich nicht beschrieben wurde - use-after-free unproblematisch
 | 
					        exit(1); // cleanup_and_exit() nicht nötig, da der Speicherbereich nicht beschrieben wurde - use-after-free unproblematisch
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -404,7 +404,7 @@ int parse_simple_log_line(char* line, int entry_index, char* source_file) { // N
 | 
				
			|||||||
        // 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
 | 
					        // 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
 | 
				
			||||||
        //                                                ^
 | 
					        //                                                ^
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printf("FEHLER: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen des Timestamps aufgetreten, dieser sollte folgendes Format haben:\n[DD/MMM/YYYY:HH:MM:SS +0000]\n\n");
 | 
					        printf("ERROR: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen des Timestamps aufgetreten, dieser sollte folgendes Format haben:\n[DD/MMM/YYYY:HH:MM:SS +0000]\n\n");
 | 
				
			||||||
        cleanup_and_exit();
 | 
					        cleanup_and_exit();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -479,7 +479,7 @@ int parse_simple_log_line(char* line, int entry_index, char* source_file) { // N
 | 
				
			|||||||
        // 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
 | 
					        // 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
 | 
				
			||||||
        //                                                                              ^
 | 
					        //                                                                              ^
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printf("FEHLER: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen der HTTP-Methode aufgetreten. Diese steht innerhalb eines Strings zusammen mit dem URL-Pfad:\n\"GET /.git/config HTTP/1.1\"\n\n");
 | 
					        printf("ERROR: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen der HTTP-Methode aufgetreten. Diese steht innerhalb eines Strings zusammen mit dem URL-Pfad:\n\"GET /.git/config HTTP/1.1\"\n\n");
 | 
				
			||||||
        cleanup_and_exit();
 | 
					        cleanup_and_exit();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -513,7 +513,7 @@ int parse_simple_log_line(char* line, int entry_index, char* source_file) { // N
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        if (*current_pos == '"') current_pos++; // schließendes Anführungszeichen überspringen
 | 
					        if (*current_pos == '"') current_pos++; // schließendes Anführungszeichen überspringen
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printf("FEHLER: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen des Referrer-Feldes aufgetreten.\n\n");
 | 
					        printf("ERROR: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen des Referrer-Feldes aufgetreten.\n\n");
 | 
				
			||||||
        cleanup_and_exit();
 | 
					        cleanup_and_exit();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -530,7 +530,7 @@ int parse_simple_log_line(char* line, int entry_index, char* source_file) { // N
 | 
				
			|||||||
        all_entries[entry_index].user_agent[i] = '\0';
 | 
					        all_entries[entry_index].user_agent[i] = '\0';
 | 
				
			||||||
        if (*current_pos == '"') current_pos++;
 | 
					        if (*current_pos == '"') current_pos++;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printf("FEHLER: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen des User-Agent aufgetreten. Dieser steht innerhalb eines Strings:\n\"Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);\"\n\n");
 | 
					        printf("ERROR: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen des User-Agent aufgetreten. Dieser steht innerhalb eines Strings:\n\"Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);\"\n\n");
 | 
				
			||||||
        cleanup_and_exit();
 | 
					        cleanup_and_exit();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    get_current_timestamp(all_entries[entry_index].parsing_timestamp, sizeof(all_entries[entry_index].parsing_timestamp));
 | 
					    get_current_timestamp(all_entries[entry_index].parsing_timestamp, sizeof(all_entries[entry_index].parsing_timestamp));
 | 
				
			||||||
@ -544,7 +544,7 @@ int parse_simple_log_line(char* line, int entry_index, char* source_file) { // N
 | 
				
			|||||||
void load_regular_file(char* filename) {
 | 
					void load_regular_file(char* filename) {
 | 
				
			||||||
    FILE* file = fopen(filename, "r");
 | 
					    FILE* file = fopen(filename, "r");
 | 
				
			||||||
    if (file == NULL) {
 | 
					    if (file == NULL) {
 | 
				
			||||||
        printf("FEHLER: Kann Datei '%s' nicht öffnen!\n", filename);
 | 
					        printf("ERROR: Kann Datei '%s' nicht öffnen!\n", filename);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    printf("INFO: Lade Datei: %s\n", filename);
 | 
					    printf("INFO: Lade Datei: %s\n", filename);
 | 
				
			||||||
@ -570,7 +570,7 @@ void load_log_file(char* path) {
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
        DIR* dir = opendir(path);
 | 
					        DIR* dir = opendir(path);
 | 
				
			||||||
        if (dir == NULL) {
 | 
					        if (dir == NULL) {
 | 
				
			||||||
            printf("FEHLER: Kann Verzeichnis '%s' nicht öffnen!\n", path);
 | 
					            printf("ERROR: Kann Verzeichnis '%s' nicht öffnen!\n", path);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@ -599,7 +599,7 @@ void load_log_file(char* path) {
 | 
				
			|||||||
        closedir(dir);
 | 
					        closedir(dir);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (files_found == 0) {
 | 
					        if (files_found == 0) {
 | 
				
			||||||
            printf("WARNUNG: Keine .log Dateien im Verzeichnis gefunden.\n");
 | 
					            printf("WARNING: Keine .log Dateien im Verzeichnis gefunden.\n");
 | 
				
			||||||
            printf("    Tipp: Für .gz Dateien verwenden Sie 'gunzip *.gz' zum Dekomprimieren\n");
 | 
					            printf("    Tipp: Für .gz Dateien verwenden Sie 'gunzip *.gz' zum Dekomprimieren\n");
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            printf("INFO: Insgesamt %d .log Dateien verarbeitet.\n", files_found);
 | 
					            printf("INFO: Insgesamt %d .log Dateien verarbeitet.\n", files_found);
 | 
				
			||||||
@ -609,7 +609,7 @@ void load_log_file(char* path) {
 | 
				
			|||||||
        printf("Einzelne Datei erkannt: %s\n", path);
 | 
					        printf("Einzelne Datei erkannt: %s\n", path);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (strstr(path, ".gz") != NULL) {
 | 
					        if (strstr(path, ".gz") != NULL) {
 | 
				
			||||||
            printf("FEHLER: .gz Dateien werden in dieser Version nicht unterstützt!\n");
 | 
					            printf("ERROR: .gz Dateien werden in dieser Version nicht unterstützt!\n");
 | 
				
			||||||
            printf("    Lösung: Dekomprimieren Sie die Datei zuerst:\n");
 | 
					            printf("    Lösung: Dekomprimieren Sie die Datei zuerst:\n");
 | 
				
			||||||
            printf("        gunzip %s\n", path);
 | 
					            printf("        gunzip %s\n", path);
 | 
				
			||||||
            printf("        Dann: %s %.*s\n", "PROGRAMM", (int)(strlen(path)-3), path);
 | 
					            printf("        Dann: %s %.*s\n", "PROGRAMM", (int)(strlen(path)-3), path);
 | 
				
			||||||
@ -994,7 +994,7 @@ void export_filtered_entries(char *filepath) {
 | 
				
			|||||||
    if (filepath == NULL) {
 | 
					    if (filepath == NULL) {
 | 
				
			||||||
        printf("Dateiname für Timesketch-Export eingeben (ohne .csv): ");
 | 
					        printf("Dateiname für Timesketch-Export eingeben (ohne .csv): ");
 | 
				
			||||||
        if (scanf("%90s", filename) != 1) {
 | 
					        if (scanf("%90s", filename) != 1) {
 | 
				
			||||||
            printf("FEHLER: Ungültiger Dateiname!\n");
 | 
					            printf("ERROR: Ungültiger Dateiname!\n");
 | 
				
			||||||
            clear_input_buffer();
 | 
					            clear_input_buffer();
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -1007,7 +1007,7 @@ void export_filtered_entries(char *filepath) {
 | 
				
			|||||||
    printf("\nINFO: Schreibe Datei %s...\n", filename);
 | 
					    printf("\nINFO: Schreibe Datei %s...\n", filename);
 | 
				
			||||||
    FILE* file = fopen(filename, "w");
 | 
					    FILE* file = fopen(filename, "w");
 | 
				
			||||||
    if (file == NULL) {
 | 
					    if (file == NULL) {
 | 
				
			||||||
        printf("FEHLER: Kann Datei '%s' nicht erstellen!\n", filename);
 | 
					        printf("ERROR: Kann Datei '%s' nicht erstellen!\n", filename);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -1209,7 +1209,7 @@ void show_status() {
 | 
				
			|||||||
        printf("    %d Logzeilen in Datenstruktur\n", total_entries);
 | 
					        printf("    %d Logzeilen in Datenstruktur\n", total_entries);
 | 
				
			||||||
        printf("    Speicherbelegung: %lu Bytes\n", (unsigned long)(max_entries * sizeof(struct log_entry)));
 | 
					        printf("    Speicherbelegung: %lu Bytes\n", (unsigned long)(max_entries * sizeof(struct log_entry)));
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printf("    FEHLER: Keine Einträge in Datenstruktur!\n");
 | 
					        printf("    ERROR: Keine Einträge in Datenstruktur!\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("\n  Aktive Filter:\n");
 | 
					    printf("\n  Aktive Filter:\n");
 | 
				
			||||||
@ -1490,7 +1490,7 @@ int safe_read_integer(const char* prompt, int min_val, int max_val) {
 | 
				
			|||||||
        // scanf liest den Input in einen pointer ein, daher nicht &input. Die Usereingabe ist ein String, also ein Array
 | 
					        // scanf liest den Input in einen pointer ein, daher nicht &input. Die Usereingabe ist ein String, also ein Array
 | 
				
			||||||
        if (scanf("%49s", input) != 1) {
 | 
					        if (scanf("%49s", input) != 1) {
 | 
				
			||||||
            clear_input_buffer();
 | 
					            clear_input_buffer();
 | 
				
			||||||
            printf("FEHLER: Ungültige Eingabe. Bitte erneut versuchen.\n");
 | 
					            printf("ERROR: Ungültige Eingabe. Bitte erneut versuchen.\n");
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        clear_input_buffer();
 | 
					        clear_input_buffer();
 | 
				
			||||||
@ -1503,12 +1503,12 @@ int safe_read_integer(const char* prompt, int min_val, int max_val) {
 | 
				
			|||||||
        value = strtol(input, &endptr, 10);
 | 
					        value = strtol(input, &endptr, 10);
 | 
				
			||||||
        // wenn der endptr der Nullterminator ist, handelte es sich bei der Eingabe sicher um einen Long-Integer.
 | 
					        // wenn der endptr der Nullterminator ist, handelte es sich bei der Eingabe sicher um einen Long-Integer.
 | 
				
			||||||
        if (*endptr != '\0') {
 | 
					        if (*endptr != '\0') {
 | 
				
			||||||
            printf("FEHLER: '%s' ist keine gültige Zahl. Bitte erneut versuchen.\n", input);
 | 
					            printf("ERROR: '%s' ist keine gültige Zahl. Bitte erneut versuchen.\n", input);
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // Prüfen, ob sich der Wert im Erwartungsbereich befindet
 | 
					        // Prüfen, ob sich der Wert im Erwartungsbereich befindet
 | 
				
			||||||
        if (value < min_val || value > max_val) {
 | 
					        if (value < min_val || value > max_val) {
 | 
				
			||||||
            printf("FEHLER: Wert muss zwischen %d und %d liegen. Bitte erneut versuchen.\n", min_val, max_val);
 | 
					            printf("ERROR: Wert muss zwischen %d und %d liegen. Bitte erneut versuchen.\n", min_val, max_val);
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@ -1521,13 +1521,13 @@ int safe_read_string(const char* prompt, char* buffer, int buffer_size) {
 | 
				
			|||||||
        printf("%s", prompt);
 | 
					        printf("%s", prompt);
 | 
				
			||||||
        if (scanf("%s", buffer) != 1) {
 | 
					        if (scanf("%s", buffer) != 1) {
 | 
				
			||||||
            clear_input_buffer();
 | 
					            clear_input_buffer();
 | 
				
			||||||
            printf("FEHLER: Ungültige Eingabe. Bitte erneut versuchen.\n");
 | 
					            printf("ERROR: Ungültige Eingabe. Bitte erneut versuchen.\n");
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        clear_input_buffer();
 | 
					        clear_input_buffer();
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (strlen(buffer) >= buffer_size - 1) {
 | 
					        if (strlen(buffer) >= buffer_size - 1) {
 | 
				
			||||||
            printf("FEHLER: Eingabe zu lang. Bitte erneut versuchen.\n");
 | 
					            printf("ERROR: Eingabe zu lang. Bitte erneut versuchen.\n");
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@ -1684,7 +1684,7 @@ int menu_set_filters() {
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
        if (choice == 1) {
 | 
					        if (choice == 1) {
 | 
				
			||||||
            if (filters.status_count >= MAX_FILTERS) {
 | 
					            if (filters.status_count >= MAX_FILTERS) {
 | 
				
			||||||
                printf("FEHLER: Maximale Anzahl Status-Code Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
					                printf("ERROR: Maximale Anzahl Status-Code Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
@ -1705,7 +1705,7 @@ int menu_set_filters() {
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
        } else if (choice == 2) {
 | 
					        } else if (choice == 2) {
 | 
				
			||||||
            if (filters.ip_count >= MAX_FILTERS) {
 | 
					            if (filters.ip_count >= MAX_FILTERS) {
 | 
				
			||||||
                printf("FEHLER: Maximale Anzahl IP-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
					                printf("ERROR: Maximale Anzahl IP-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
@ -1727,7 +1727,7 @@ int menu_set_filters() {
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
        } else if (choice == 3) {
 | 
					        } else if (choice == 3) {
 | 
				
			||||||
            if (filters.time_count >= MAX_FILTERS) {
 | 
					            if (filters.time_count >= MAX_FILTERS) {
 | 
				
			||||||
                printf("FEHLER: Maximale Anzahl Zeitraum-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
					                printf("ERROR: Maximale Anzahl Zeitraum-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
@ -1802,7 +1802,7 @@ int menu_set_filters() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        } else if (choice == 4) {
 | 
					        } else if (choice == 4) {
 | 
				
			||||||
            if (filters.user_agent_count >= MAX_FILTERS) {
 | 
					            if (filters.user_agent_count >= MAX_FILTERS) {
 | 
				
			||||||
                printf("FEHLER: Maximale Anzahl User-Agent Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
					                printf("ERROR: Maximale Anzahl User-Agent Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
@ -1824,7 +1824,7 @@ int menu_set_filters() {
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
        } else if (choice == 5) {
 | 
					        } else if (choice == 5) {
 | 
				
			||||||
            if (filters.method_count >= MAX_FILTERS) {
 | 
					            if (filters.method_count >= MAX_FILTERS) {
 | 
				
			||||||
                printf("FEHLER: Maximale Anzahl Method-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
					                printf("ERROR: Maximale Anzahl Method-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
@ -1846,7 +1846,7 @@ int menu_set_filters() {
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
        } else if (choice == 6) {
 | 
					        } else if (choice == 6) {
 | 
				
			||||||
            if (filters.url_count >= MAX_FILTERS) {
 | 
					            if (filters.url_count >= MAX_FILTERS) {
 | 
				
			||||||
                printf("FEHLER: Maximale Anzahl URL-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
					                printf("ERROR: Maximale Anzahl URL-Filter erreicht (%d)!\n", MAX_FILTERS);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
@ -1871,7 +1871,7 @@ int menu_set_filters() {
 | 
				
			|||||||
        } else if (choice == -3) {
 | 
					        } else if (choice == -3) {
 | 
				
			||||||
            return -3;
 | 
					            return -3;
 | 
				
			||||||
        } else if (choice != -1) {
 | 
					        } else if (choice != -1) {
 | 
				
			||||||
            printf("FEHLER: Ungültige Auswahl! Bitte wählen Sie 1-6 oder b/m/q.\n");
 | 
					            printf("ERROR: Ungültige Auswahl! Bitte wählen Sie 1-6 oder b/m/q.\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return choice;
 | 
					    return choice;
 | 
				
			||||||
@ -2044,7 +2044,7 @@ void menu_filter_mode() {
 | 
				
			|||||||
    } else if (choice == -2 || choice == -3) {
 | 
					    } else if (choice == -2 || choice == -3) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    } else if (choice != -1) {
 | 
					    } else if (choice != -1) {
 | 
				
			||||||
        printf("FEHLER: Ungültige Auswahl! Bitte wählen Sie 1-3 oder b/m/q.\n");
 | 
					        printf("ERROR: Ungültige Auswahl! Bitte wählen Sie 1-3 oder b/m/q.\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2059,7 +2059,7 @@ void menu_reset_filters() {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("WARNUNG: Alle %d Filter werden gelöscht!\n\n", total_filters);
 | 
					    printf("WARNING: Alle %d Filter werden gelöscht!\n\n", total_filters);
 | 
				
			||||||
    printf("1. Ja, alle Filter löschen\n");
 | 
					    printf("1. Ja, alle Filter löschen\n");
 | 
				
			||||||
    printf("2. Abbrechen\n");
 | 
					    printf("2. Abbrechen\n");
 | 
				
			||||||
    printf("Navigation: [b]Zurück [m]Hauptmenü [q]Beenden\n");
 | 
					    printf("Navigation: [b]Zurück [m]Hauptmenü [q]Beenden\n");
 | 
				
			||||||
@ -2083,7 +2083,7 @@ void menu_reset_filters() {
 | 
				
			|||||||
    } else if (choice == -2 || choice == -3) {
 | 
					    } else if (choice == -2 || choice == -3) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    } else if (choice != -1) {
 | 
					    } else if (choice != -1) {
 | 
				
			||||||
        printf("FEHLER: Ungültige Auswahl! Bitte wählen Sie 1-2 oder b/m/q.\n");
 | 
					        printf("ERROR: Ungültige Auswahl! Bitte wählen Sie 1-2 oder b/m/q.\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -2120,7 +2120,7 @@ void menu_filter_management() {
 | 
				
			|||||||
        } else if (choice == -3) {
 | 
					        } else if (choice == -3) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        } else if (choice != -1) {
 | 
					        } else if (choice != -1) {
 | 
				
			||||||
            printf("FEHLER: Ungültige Auswahl! Bitte wählen Sie 1-5 oder b/m/q.\n");
 | 
					            printf("ERROR: Ungültige Auswahl! Bitte wählen Sie 1-5 oder b/m/q.\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2151,7 +2151,7 @@ void menu_show_entries() {
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
        if (choice == 1) {
 | 
					        if (choice == 1) {
 | 
				
			||||||
            if (filtered_count > 1000) {
 | 
					            if (filtered_count > 1000) {
 | 
				
			||||||
                printf("\nWARNUNG: Die Anzeige von %d Einträgen in der Kommandozeile ist unübersichtlich.\n", filtered_count);
 | 
					                printf("\nWARNING: Die Anzeige von %d Einträgen in der Kommandozeile ist unübersichtlich.\n", filtered_count);
 | 
				
			||||||
                printf("Empfehlung: Verwenden Sie den CSV-Export für große Datenmengen.\n\n");
 | 
					                printf("Empfehlung: Verwenden Sie den CSV-Export für große Datenmengen.\n\n");
 | 
				
			||||||
                printf("1. Trotzdem anzeigen\n");
 | 
					                printf("1. Trotzdem anzeigen\n");
 | 
				
			||||||
                printf("2. Abbrechen\n");
 | 
					                printf("2. Abbrechen\n");
 | 
				
			||||||
@ -2175,7 +2175,7 @@ void menu_show_entries() {
 | 
				
			|||||||
        } else if (choice == -3) {
 | 
					        } else if (choice == -3) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        } else if (choice != -1) {
 | 
					        } else if (choice != -1) {
 | 
				
			||||||
            printf("FEHLER: Ungültige Auswahl! Bitte wählen Sie 1-4 oder b/m/q.\n");
 | 
					            printf("ERROR: Ungültige Auswahl! Bitte wählen Sie 1-4 oder b/m/q.\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2225,49 +2225,56 @@ void parse_filter_values(const char* values_str, const char* filter_type) {
 | 
				
			|||||||
// Funktionen zum setzen der Filter (existierende Datenstrukturen)
 | 
					// Funktionen zum setzen der Filter (existierende Datenstrukturen)
 | 
				
			||||||
void add_status_filter(const char* value, filter_mode_t mode) {
 | 
					void add_status_filter(const char* value, filter_mode_t mode) {
 | 
				
			||||||
    if (filters.status_count >= MAX_FILTERS) {
 | 
					    if (filters.status_count >= MAX_FILTERS) {
 | 
				
			||||||
        printf("WARNUNG: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
					        printf("WARNING: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // TODO
 | 
					    // Kovertierung des Statuscodes zu long mit Error handling
 | 
				
			||||||
    int status_code = atoi(value);
 | 
					    int status_code = strtol(value, &endptr, 10);
 | 
				
			||||||
 | 
					    if (endptr != '\n' ){
 | 
				
			||||||
 | 
					        printf("ERROR: Ungültiger Wert im Statuscode-Filter: %s", value);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (status_code < 100 || status_code > 599) {
 | 
					    if (status_code < 100 || status_code > 599) {
 | 
				
			||||||
        printf("WARNUNG: Invalid status code: %s (must be 100-599)\n", value);
 | 
					        printf("WARNING: Invalid status code: %s (must be 100-599)\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    // setzen des Filters
 | 
				
			||||||
    filters.status_filters[filters.status_count].code = status_code;
 | 
					    filters.status_filters[filters.status_count].code = status_code;
 | 
				
			||||||
    filters.status_filters[filters.status_count].mode = mode;
 | 
					    filters.status_filters[filters.status_count].mode = mode;
 | 
				
			||||||
    filters.status_count++;
 | 
					    filters.status_count++;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("Added status filter: %s%d\n", mode == FILTER_EXCLUDE ? "!" : "", status_code);
 | 
					    printf("DEBUG: Filter hinzugefügt: %s%d\n", mode == FILTER_EXCLUDE ? "!" : "", status_code);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void add_ip_filter(const char* value, filter_mode_t mode) {
 | 
					void add_ip_filter(const char* value, filter_mode_t mode) {
 | 
				
			||||||
    if (filters.ip_count >= MAX_FILTERS) {
 | 
					    if (filters.ip_count >= MAX_FILTERS) {
 | 
				
			||||||
        printf("WARNUNG: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
					        printf("WARNING: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    // einfache Plausibilitätsprüfung hinsichtlich der Länge
 | 
				
			||||||
    if (strlen(value) >= sizeof(filters.ip_filters[0].ip_address)) {
 | 
					    if (strlen(value) >= sizeof(filters.ip_filters[0].ip_address)) {
 | 
				
			||||||
        printf("WARNUNG: IP address too long: %s\n", value);
 | 
					        printf("WARNING: IP-Adresse zu lang: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    // setzen des Filters
 | 
				
			||||||
    strcpy(filters.ip_filters[filters.ip_count].ip_address, value);
 | 
					    strcpy(filters.ip_filters[filters.ip_count].ip_address, value);
 | 
				
			||||||
    filters.ip_filters[filters.ip_count].mode = mode;
 | 
					    filters.ip_filters[filters.ip_count].mode = mode;
 | 
				
			||||||
    filters.ip_count++;
 | 
					    filters.ip_count++;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("Added IP filter: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
					    printf("DEBUG: IP-Adressfilter hinzugefügt: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// gleiche Mechanik wie bei IP-Adresse
 | 
				
			||||||
void add_method_filter(const char* value, filter_mode_t mode) {
 | 
					void add_method_filter(const char* value, filter_mode_t mode) {
 | 
				
			||||||
    if (filters.method_count >= MAX_FILTERS) {
 | 
					    if (filters.method_count >= MAX_FILTERS) {
 | 
				
			||||||
        printf("WARNUNG: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
					        printf("WARNING: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (strlen(value) >= sizeof(filters.method_filters[0].pattern)) {
 | 
					    if (strlen(value) >= sizeof(filters.method_filters[0].pattern)) {
 | 
				
			||||||
        printf("WARNUNG: Method pattern too long: %s\n", value);
 | 
					        printf("WARNING: Methoden-Filterwert zu lang: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -2275,17 +2282,18 @@ void add_method_filter(const char* value, filter_mode_t mode) {
 | 
				
			|||||||
    filters.method_filters[filters.method_count].mode = mode;
 | 
					    filters.method_filters[filters.method_count].mode = mode;
 | 
				
			||||||
    filters.method_count++;
 | 
					    filters.method_count++;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("Added method filter: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
					    printf("DEBUG: Methoden-Filter hinzugefügt: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// gleiche Mechanik wie bei IP-Adresse
 | 
				
			||||||
void add_useragent_filter(const char* value, filter_mode_t mode) {
 | 
					void add_useragent_filter(const char* value, filter_mode_t mode) {
 | 
				
			||||||
    if (filters.user_agent_count >= MAX_FILTERS) {
 | 
					    if (filters.user_agent_count >= MAX_FILTERS) {
 | 
				
			||||||
        printf("WARNUNG: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
					        printf("WARNING: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (strlen(value) >= sizeof(filters.user_agent_filters[0].pattern)) {
 | 
					    if (strlen(value) >= sizeof(filters.user_agent_filters[0].pattern)) {
 | 
				
			||||||
        printf("WARNUNG: User agent pattern too long: %s\n", value);
 | 
					        printf("WARNING: User agent Filterwert zu lang: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -2293,17 +2301,18 @@ void add_useragent_filter(const char* value, filter_mode_t mode) {
 | 
				
			|||||||
    filters.user_agent_filters[filters.user_agent_count].mode = mode;
 | 
					    filters.user_agent_filters[filters.user_agent_count].mode = mode;
 | 
				
			||||||
    filters.user_agent_count++;
 | 
					    filters.user_agent_count++;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("Added user agent filter: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
					    printf("DEBUG: User Agent Filter hinzugefügt: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// gleiche Mechanik wie bei IP-Adresse
 | 
				
			||||||
void add_url_filter(const char* value, filter_mode_t mode) {
 | 
					void add_url_filter(const char* value, filter_mode_t mode) {
 | 
				
			||||||
    if (filters.url_count >= MAX_FILTERS) {
 | 
					    if (filters.url_count >= MAX_FILTERS) {
 | 
				
			||||||
        printf("WARNUNG: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
					        printf("WARNING: MAX_FILTERS überschritten, ignoriere: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (strlen(value) >= sizeof(filters.url_filters[0].pattern)) {
 | 
					    if (strlen(value) >= sizeof(filters.url_filters[0].pattern)) {
 | 
				
			||||||
        printf("WARNUNG: URL pattern too long: %s\n", value);
 | 
					        printf("WARNING: URL/Payload Filterwert zu lang: %s\n", value);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -2311,24 +2320,24 @@ void add_url_filter(const char* value, filter_mode_t mode) {
 | 
				
			|||||||
    filters.url_filters[filters.url_count].mode = mode;
 | 
					    filters.url_filters[filters.url_count].mode = mode;
 | 
				
			||||||
    filters.url_count++;
 | 
					    filters.url_count++;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("Added URL filter: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
					    printf("DEBUG: URL/Payload-Filter hinzugefügt: %s%s\n", mode == FILTER_EXCLUDE ? "!" : "", value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Main filter parsing function
 | 
					// Filter-Argument Parser
 | 
				
			||||||
int parse_filter_argument(const char* arg) {
 | 
					int parse_filter_argument(const char* arg) {
 | 
				
			||||||
    if (!starts_with(arg, "--")) {
 | 
					    if (!starts_with(arg, "--")) {
 | 
				
			||||||
        return 0; // Not a filter argument
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    // Find the '=' character
 | 
					 | 
				
			||||||
    const char* equals_pos = strchr(arg, '=');
 | 
					 | 
				
			||||||
    if (equals_pos == NULL) {
 | 
					 | 
				
			||||||
        printf("WARNUNG: Invalid filter format (missing =): %s\n", arg);
 | 
					 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Extract filter type (between -- and =)
 | 
					    // = finden
 | 
				
			||||||
    int type_len = equals_pos - arg - 2; // -2 for the "--"
 | 
					    const char* equals_pos = strchr(arg, '=');
 | 
				
			||||||
 | 
					    if (equals_pos == NULL) {
 | 
				
			||||||
 | 
					        printf("WARNING: Invalid filter format (missing =): %s\n", arg);
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // filter-Typ parsen
 | 
				
			||||||
 | 
					    int type_len = equals_pos - arg - 2; // Position anpassen,
 | 
				
			||||||
    char filter_type[50];
 | 
					    char filter_type[50];
 | 
				
			||||||
    strncpy(filter_type, arg + 2, type_len);
 | 
					    strncpy(filter_type, arg + 2, type_len);
 | 
				
			||||||
    filter_type[type_len] = '\0';
 | 
					    filter_type[type_len] = '\0';
 | 
				
			||||||
@ -2355,10 +2364,10 @@ int parse_filter_argument(const char* arg) {
 | 
				
			|||||||
            filters.combination_mode = 1;
 | 
					            filters.combination_mode = 1;
 | 
				
			||||||
            printf("Set filter combination mode: OR\n");
 | 
					            printf("Set filter combination mode: OR\n");
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            printf("WARNUNG: Invalid mode value: %s (use 'and' or 'or')\n", values);
 | 
					            printf("WARNING: Invalid mode value: %s (use 'and' or 'or')\n", values);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printf("WARNUNG: Unknown filter type: %s\n", filter_type);
 | 
					        printf("WARNING: Unknown filter type: %s\n", filter_type);
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -2491,7 +2500,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (flag_export == 1 && flag_interactive == 1) {
 | 
					    if (flag_export == 1 && flag_interactive == 1) {
 | 
				
			||||||
        printf("FEHLER: Interaktiver Modus kann nicht mit Export-Modus kombiniert werden. Mit %c ausführen für Anleitung.", argv[0]);
 | 
					        printf("ERROR: Interaktiver Modus kann nicht mit Export-Modus kombiniert werden. Mit %c ausführen für Anleitung.", argv[0]);
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }else if (flag_interactive == 1) {
 | 
					    }else if (flag_interactive == 1) {
 | 
				
			||||||
        load_log_file(argv[1]);
 | 
					        load_log_file(argv[1]);
 | 
				
			||||||
@ -2515,7 +2524,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
            choice = handle_menu_shortcuts(choice);
 | 
					            choice = handle_menu_shortcuts(choice);
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            if (choice == -1) {
 | 
					            if (choice == -1) {
 | 
				
			||||||
                printf("FEHLER: Bitte geben Sie eine gültige Zahl oder Navigation ein (1-4, b, m, q)!\n");
 | 
					                printf("ERROR: Bitte geben Sie eine gültige Zahl oder Navigation ein (1-4, b, m, q)!\n");
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
@ -2531,7 +2540,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
            } else if (choice == -4) {
 | 
					            } else if (choice == -4) {
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                printf("FEHLER: Ungültige Auswahl! Bitte wählen Sie 1-4 oder b/m/q.\n");
 | 
					                printf("ERROR: Ungültige Auswahl! Bitte wählen Sie 1-4 oder b/m/q.\n");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else if (flag_export == 1){
 | 
					    } else if (flag_export == 1){
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user