progress
This commit is contained in:
		
							parent
							
								
									3d11d2f0f2
								
							
						
					
					
						commit
						e567bdbc65
					
				
							
								
								
									
										318
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										318
									
								
								src/main.c
									
									
									
									
									
								
							@ -625,114 +625,162 @@ int search_in_string(const char* raw_string, const char* search_string) {
 | 
				
			|||||||
// Filterfunktion für den User-Agent. Nimmt den Datensatz entgegen und prüft gegen die gesetzten Filter, gibt dann 0 oder 1 zurück
 | 
					// Filterfunktion für den User-Agent. Nimmt den Datensatz entgegen und prüft gegen die gesetzten Filter, gibt dann 0 oder 1 zurück
 | 
				
			||||||
int user_agent_matches(char* user_agent) {
 | 
					int user_agent_matches(char* user_agent) {
 | 
				
			||||||
    if (filters.user_agent_count == 0) return 1;
 | 
					    if (filters.user_agent_count == 0) return 1;
 | 
				
			||||||
    
 | 
					    // Ausschluss-Filter geht vor    
 | 
				
			||||||
    int has_include_filters = 0;
 | 
					    for (int i = 0; i < filters.user_agent_count; i++) {
 | 
				
			||||||
    int include_match = 0;
 | 
					        if (filters.user_agent_filters[i].mode == FILTER_EXCLUDE) {
 | 
				
			||||||
 | 
					            int pattern_found = search_in_string(user_agent, filters.user_agent_filters[i].pattern);
 | 
				
			||||||
 | 
					            if (pattern_found) {
 | 
				
			||||||
 | 
					                return 0; // früheres Verlassen der Schleife, sobald Ausschlussfilter zutrifft
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Prüfung im entsprechenden Modus
 | 
				
			||||||
 | 
					    int include_count = 0;
 | 
				
			||||||
 | 
					    int include_matches = 0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    for (int i = 0; i < filters.user_agent_count; i++) {
 | 
					    for (int i = 0; i < filters.user_agent_count; i++) {
 | 
				
			||||||
        int pattern_found = search_in_string(user_agent, filters.user_agent_filters[i].pattern);
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        if (filters.user_agent_filters[i].mode == FILTER_INCLUDE) {
 | 
					        if (filters.user_agent_filters[i].mode == FILTER_INCLUDE) {
 | 
				
			||||||
            has_include_filters = 1;
 | 
					            include_count++;
 | 
				
			||||||
 | 
					            int pattern_found = search_in_string(user_agent, filters.user_agent_filters[i].pattern);
 | 
				
			||||||
            if (pattern_found) {
 | 
					            if (pattern_found) {
 | 
				
			||||||
                include_match = 1;
 | 
					                include_matches++;
 | 
				
			||||||
 | 
					                if (filters.combination_mode == 1) { // OR-Modus
 | 
				
			||||||
 | 
					                    return 1; // Früheres Verlassen der Schleife bei erstem zutreffendem Einschlussfilter im OR-Modus
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        } else { // ausschließen-Filter
 | 
					 | 
				
			||||||
            if (pattern_found) {
 | 
					 | 
				
			||||||
                return 0;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (has_include_filters) {
 | 
					    // Diese Prüfung wird ausgeführt, wenn Einschlussfilter vorhanden sind
 | 
				
			||||||
        return include_match;
 | 
					    if (include_count > 0) {
 | 
				
			||||||
 | 
					        if (filters.combination_mode == 0) { // AND-Modus
 | 
				
			||||||
 | 
					            return include_matches == include_count; // Alle Einschlussfilter müssen zutreffen, die Treffer müssen Anzahl der Filter entsprechen
 | 
				
			||||||
 | 
					        } else { // OR-Modus
 | 
				
			||||||
 | 
					            return include_matches > 0; // Ausschlussfilter im ODER-Modus - wenn ein beliebiger Eintrag zum Ausschlussfilter passt, wird 0=negativ zurückgegeben
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return 1;
 | 
					    return 1; // Keine Einschlussfilter, keine zutreffenden Ausschlussfilter, positiver Rückgabewert =1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int status_code_matches(int status_code) {
 | 
					int status_code_matches(int status_code) {
 | 
				
			||||||
    if (filters.status_count == 0) return 1;
 | 
					    if (filters.status_count == 0) return 1;
 | 
				
			||||||
    
 | 
					    // Ausschluss-Filter prüfen: immer übergeordnet gültig
 | 
				
			||||||
    int has_include_filters = 0;
 | 
					 | 
				
			||||||
    int include_match = 0;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    for (int i = 0; i < filters.status_count; i++) {
 | 
					    for (int i = 0; i < filters.status_count; i++) {
 | 
				
			||||||
        if (filters.status_filters[i].mode == FILTER_INCLUDE) {
 | 
					        if (filters.status_filters[i].mode == FILTER_EXCLUDE) {
 | 
				
			||||||
            has_include_filters = 1;
 | 
					 | 
				
			||||||
            if (filters.status_filters[i].code == status_code) {
 | 
					 | 
				
			||||||
                include_match = 1;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            if (filters.status_filters[i].code == status_code) {
 | 
					            if (filters.status_filters[i].code == status_code) {
 | 
				
			||||||
                return 0; 
 | 
					                return 0; 
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (has_include_filters) {
 | 
					    // Filter prüfen in entsprechendem Modus
 | 
				
			||||||
        return include_match;
 | 
					    int include_count = 0;
 | 
				
			||||||
 | 
					    int include_matches = 0;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for (int i = 0; i < filters.status_count; i++) {
 | 
				
			||||||
 | 
					        if (filters.status_filters[i].mode == FILTER_INCLUDE) {
 | 
				
			||||||
 | 
					            include_count++;
 | 
				
			||||||
 | 
					            if (filters.status_filters[i].code == status_code) {
 | 
				
			||||||
 | 
					                include_matches++;
 | 
				
			||||||
 | 
					                if (filters.combination_mode == 1) { // OR-Modus
 | 
				
			||||||
 | 
					                    return 1; // positiver Rückgabewert, Schleife wird verlassen sobald erster Treffer im OR-Modus
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return 1;
 | 
					    // Diese Prüfung wird ausgeführt, wenn Einschlussfilter vorhanden sind
 | 
				
			||||||
 | 
					    if (include_count > 0) {
 | 
				
			||||||
 | 
					        if (filters.combination_mode == 0) { // UND-Modus
 | 
				
			||||||
 | 
					            return include_matches == include_count; // Filter-Treffer müssen der Anzahl der Statuscode-Filter entsprechen
 | 
				
			||||||
 | 
					        } else { // OR-Modus
 | 
				
			||||||
 | 
					            return include_matches > 0; // Ausschlussfilter im ODER-Modus - wenn ein beliebiger Eintrag zum Ausschlussfilter passt, wird 0=negativ zurückgegeben
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return 1; // Keine Einschlussfilter, keine Treffer in den Ausschlussfiltern, positiver Rückgabewert = 1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ip_address_matches(char* ip_address) {
 | 
					int ip_address_matches(char* ip_address) {
 | 
				
			||||||
    if (filters.ip_count == 0) return 1;
 | 
					    if (filters.ip_count == 0) return 1;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    int has_include_filters = 0;
 | 
					    // Prüfen der Ausschlussfilter, sind dem Rest vorgelagert
 | 
				
			||||||
    int include_match = 0;
 | 
					    for (int i = 0; i < filters.ip_count; i++) {
 | 
				
			||||||
 | 
					        if (filters.ip_filters[i].mode == FILTER_EXCLUDE) {
 | 
				
			||||||
 | 
					            if (strcmp(filters.ip_filters[i].ip_address, ip_address) == 0) {
 | 
				
			||||||
 | 
					                return 0; // zutreffender Ausschlussfilter führt zu negativem Rückgabewert
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Prüfung im AND oder im OR-Modus
 | 
				
			||||||
 | 
					    int include_count = 0;
 | 
				
			||||||
 | 
					    int include_matches = 0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    for (int i = 0; i < filters.ip_count; i++) {
 | 
					    for (int i = 0; i < filters.ip_count; i++) {
 | 
				
			||||||
        if (filters.ip_filters[i].mode == FILTER_INCLUDE) {
 | 
					        if (filters.ip_filters[i].mode == FILTER_INCLUDE) {
 | 
				
			||||||
            has_include_filters = 1;
 | 
					            include_count++;
 | 
				
			||||||
            if (strcmp(filters.ip_filters[i].ip_address, ip_address) == 0) {
 | 
					            if (strcmp(filters.ip_filters[i].ip_address, ip_address) == 0) {
 | 
				
			||||||
                include_match = 1;
 | 
					                include_matches++;
 | 
				
			||||||
 | 
					                if (filters.combination_mode == 1) { // OR-Modus
 | 
				
			||||||
 | 
					                    return 1; // Früheres Verlassen der Schleife, sofern erster Filter im OR-Modus zutrifft
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            if (strcmp(filters.ip_filters[i].ip_address, ip_address) == 0) {
 | 
					 | 
				
			||||||
                return 0;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (has_include_filters) {
 | 
					    // Diese Prüfung wird ausgeführt, wenn Einschlussfilter vorhanden sind
 | 
				
			||||||
        return include_match;
 | 
					    if (include_count > 0) {
 | 
				
			||||||
 | 
					        if (filters.combination_mode == 0) { // UND-Modus
 | 
				
			||||||
 | 
					            return include_matches == include_count; // Filter-Treffer müssen der Anzahl der IP-Adressen-Filter entsprechen
 | 
				
			||||||
 | 
					        } else { // OR-Modus
 | 
				
			||||||
 | 
					            return include_matches > 0; // zutreffender Ausschlussfilter führt zu negativem Rückgabewert
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    
 | 
					    }
 | 
				
			||||||
    return 1;
 | 
					    return 1; // Keine Einschlussfilter, keine Treffer in den Ausschlussfiltern, positiver Rückgabewert = 1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Vergleicht einen übergebenen Prüfwert für einen Zeitstempel mit dem aktuell gesetzten Filter. Wenn der Prüfwert im Filterbereich ist,wird 1 zurückgegeben.
 | 
					// Vergleicht einen übergebenen Prüfwert für einen Zeitstempel mit dem aktuell gesetzten Filter. Wenn der Prüfwert im Filterbereich ist,wird 1 zurückgegeben.
 | 
				
			||||||
int time_matches(struct simple_time entry_time) {
 | 
					int time_matches(struct simple_time entry_time) {
 | 
				
			||||||
    // gibt 1 zurück, wenn kein Filter gesetzt wird -> der komplette Log-Datensatz wird ausgegeben
 | 
					 | 
				
			||||||
    if (filters.time_count == 0) return 1;
 | 
					    if (filters.time_count == 0) return 1;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    int has_include_filters = 0;
 | 
					    // Übergeordneter Ausschlussfilter
 | 
				
			||||||
    int include_match = 0;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    // es können mehrere Filter gleichzeitig gesetzt sein, diese werden alle nacheinander in einer Schleife geprüft
 | 
					 | 
				
			||||||
    for (int i = 0; i < filters.time_count; i++) {
 | 
					    for (int i = 0; i < filters.time_count; i++) {
 | 
				
			||||||
 | 
					        if (filters.time_filters[i].mode == FILTER_EXCLUDE) {
 | 
				
			||||||
            int in_range = (compare_times(entry_time, filters.time_filters[i].start_time) >= 0 &&
 | 
					            int in_range = (compare_times(entry_time, filters.time_filters[i].start_time) >= 0 &&
 | 
				
			||||||
                       compare_times(entry_time, filters.time_filters[i].end_time) <= 0); // gibt 0=false zurück, wenn der Prüfwert nicht im Filterbereich ist
 | 
					                           compare_times(entry_time, filters.time_filters[i].end_time) <= 0);
 | 
				
			||||||
 | 
					            if (in_range) {
 | 
				
			||||||
 | 
					                return 0; // zutreffender Ausschlussfilter führt zu negativem Rückgabewert, ist den Einschlussfiltern übergeordnet
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Prüfung im entsprechenden Modus
 | 
				
			||||||
 | 
					    int include_count = 0;
 | 
				
			||||||
 | 
					    int include_matches = 0;
 | 
				
			||||||
 | 
					    for (int i = 0; i < filters.time_count; i++) {
 | 
				
			||||||
        if (filters.time_filters[i].mode == FILTER_INCLUDE) {
 | 
					        if (filters.time_filters[i].mode == FILTER_INCLUDE) {
 | 
				
			||||||
            has_include_filters = 1; // Flag für inlusive Filter
 | 
					            include_count++;
 | 
				
			||||||
 | 
					            int in_range = (compare_times(entry_time, filters.time_filters[i].start_time) >= 0 &&
 | 
				
			||||||
 | 
					                           compare_times(entry_time, filters.time_filters[i].end_time) <= 0);
 | 
				
			||||||
            if (in_range) {
 | 
					            if (in_range) {
 | 
				
			||||||
                include_match = 1; // gibt 1=true aus, wenn der Prüfwert in den geprüften inklusiven Filter passt
 | 
					                include_matches++;
 | 
				
			||||||
 | 
					                if (filters.combination_mode == 1) { // OR-Modus
 | 
				
			||||||
 | 
					                    return 1; // Sobald der erste Zeitraum im OR-Modus zutrifft, wird die Schleife verlassen
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
        // ausschließen-Filter
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            if (in_range) {
 | 
					 | 
				
			||||||
                return 0;  // gibt 0=false aus, wenn der geprüfte Filter exklusiv ist, und der Prüfwert in den Filterbereich passt
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (has_include_filters) {
 | 
					    // Diese Prüfung wird ausgeführt, wenn Einschlussfilter vorhanden sind
 | 
				
			||||||
        return include_match; // gibt 0=false aus, wenn es inklusive Filter gibt (has_include_filters =1), aber kein Zeitstempel in den Filterbereich passt
 | 
					    if (include_count > 0) {
 | 
				
			||||||
 | 
					        if (filters.combination_mode == 0) { // AND-Modus
 | 
				
			||||||
 | 
					            return include_matches == include_count; // Filter-Treffer müssen der Anzahl der Zeitraum-Filter entsprechen
 | 
				
			||||||
 | 
					        } else { // OR-Modus
 | 
				
			||||||
 | 
					            return include_matches > 0; // zutreffender Ausschlussfilter führt zu negativem Rückgabewert
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    
 | 
					    }
 | 
				
			||||||
    return 1;
 | 
					    return 1; // keine Einschlussfilter und keine zutreffenden Ausschlussfilter - positiver Rückgabewert
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Prüfen aller Filter im AND-Modus oder OR-Modus (combination_mode) pro Log-Eintrag
 | 
					// Prüfen aller Filter im AND-Modus oder OR-Modus (combination_mode) pro Log-Eintrag
 | 
				
			||||||
@ -772,64 +820,142 @@ void show_status() {
 | 
				
			|||||||
        printf("❌ Keine Log-Daten geladen\n");
 | 
					        printf("❌ Keine Log-Daten geladen\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("\n🔍 Aktive Filter:\n");
 | 
					    printf("\n🔍 Aktive Filter-Logik:\n");
 | 
				
			||||||
    int total_filters = filters.status_count + filters.ip_count + filters.time_count + filters.user_agent_count;  // UPDATE THIS LINE
 | 
					    int total_filters = filters.status_count + filters.ip_count + filters.time_count + filters.user_agent_count;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (total_filters == 0) {
 | 
					    if (total_filters == 0) {
 | 
				
			||||||
        printf("   Keine Filter gesetzt\n");
 | 
					        printf("   Keine Filter gesetzt → alle Einträge werden angezeigt\n");
 | 
				
			||||||
        printf("   Filter-Modus: %s\n", filters.combination_mode == 0 ? "AND" : "OR");
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        printf("   Filter-Modus: %s\n", filters.combination_mode == 0 ? "AND" : "OR");
 | 
					        printf("   Modus: %s\n", filters.combination_mode == 0 ? "AND" : "OR");
 | 
				
			||||||
 | 
					        printf("   Regel: Ausschlussfilter (!) haben Vorrang, dann Einschlussfilter\n");
 | 
				
			||||||
 | 
					        printf("\n   Filter-Ausdruck:\n");
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (filters.status_count > 0) {
 | 
					        if (filters.status_count > 0) {
 | 
				
			||||||
            printf("   Status-Codes (%d): ", filters.status_count);
 | 
					            printf("     Status: ");
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            int excludes = 0, includes = 0;
 | 
				
			||||||
            for (int i = 0; i < filters.status_count; i++) {
 | 
					            for (int i = 0; i < filters.status_count; i++) {
 | 
				
			||||||
                char mode_char = (filters.status_filters[i].mode == FILTER_EXCLUDE) ? '!' : ' ';
 | 
					                if (filters.status_filters[i].mode == FILTER_EXCLUDE) excludes++;
 | 
				
			||||||
                printf("%c%d", mode_char, filters.status_filters[i].code);
 | 
					                else includes++;
 | 
				
			||||||
                if (i < filters.status_count - 1) printf(", ");
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            // Ausschlussfilter (immer im ODER-Modus)
 | 
				
			||||||
 | 
					            if (excludes > 0) {
 | 
				
			||||||
 | 
					                printf("!(");
 | 
				
			||||||
 | 
					                int first = 1;
 | 
				
			||||||
 | 
					                for (int i = 0; i < filters.status_count; i++) {
 | 
				
			||||||
 | 
					                    if (filters.status_filters[i].mode == FILTER_EXCLUDE) {
 | 
				
			||||||
 | 
					                        if (!first) printf(" OR ");
 | 
				
			||||||
 | 
					                        printf("%d", filters.status_filters[i].code);
 | 
				
			||||||
 | 
					                        first = 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                printf(")");
 | 
				
			||||||
 | 
					                if (includes > 0) printf(" AND ");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            // Einschlussfilter (folgen dem gesetzten Modus)
 | 
				
			||||||
 | 
					            if (includes > 0) {
 | 
				
			||||||
 | 
					                if (includes > 1) printf("(");
 | 
				
			||||||
 | 
					                int first = 1;
 | 
				
			||||||
 | 
					                for (int i = 0; i < filters.status_count; i++) {
 | 
				
			||||||
 | 
					                    if (filters.status_filters[i].mode == FILTER_INCLUDE) {
 | 
				
			||||||
 | 
					                        if (!first) printf(" %s ", filters.combination_mode == 0 ? "AND" : "OR");
 | 
				
			||||||
 | 
					                        printf("%d", filters.status_filters[i].code);
 | 
				
			||||||
 | 
					                        first = 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (includes > 1) printf(")");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            printf("\n");
 | 
					            printf("\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (filters.ip_count > 0) {
 | 
					        if (filters.ip_count > 0) {
 | 
				
			||||||
            printf("   IP-Adressen (%d): ", filters.ip_count);
 | 
					            printf("     IP: ");
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            int excludes = 0, includes = 0;
 | 
				
			||||||
            for (int i = 0; i < filters.ip_count; i++) {
 | 
					            for (int i = 0; i < filters.ip_count; i++) {
 | 
				
			||||||
                char mode_char = (filters.ip_filters[i].mode == FILTER_EXCLUDE) ? '!' : ' ';
 | 
					                if (filters.ip_filters[i].mode == FILTER_EXCLUDE) excludes++;
 | 
				
			||||||
                printf("%c%s", mode_char, filters.ip_filters[i].ip_address);
 | 
					                else includes++;
 | 
				
			||||||
                if (i < filters.ip_count - 1) printf(", ");
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if (excludes > 0) {
 | 
				
			||||||
 | 
					                printf("!(");
 | 
				
			||||||
 | 
					                int first = 1;
 | 
				
			||||||
 | 
					                for (int i = 0; i < filters.ip_count; i++) {
 | 
				
			||||||
 | 
					                    if (filters.ip_filters[i].mode == FILTER_EXCLUDE) {
 | 
				
			||||||
 | 
					                        if (!first) printf(" OR ");
 | 
				
			||||||
 | 
					                        printf("%s", filters.ip_filters[i].ip_address);
 | 
				
			||||||
 | 
					                        first = 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                printf(")");
 | 
				
			||||||
 | 
					                if (includes > 0) printf(" AND ");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if (includes > 0) {
 | 
				
			||||||
 | 
					                if (includes > 1) printf("(");
 | 
				
			||||||
 | 
					                int first = 1;
 | 
				
			||||||
 | 
					                for (int i = 0; i < filters.ip_count; i++) {
 | 
				
			||||||
 | 
					                    if (filters.ip_filters[i].mode == FILTER_INCLUDE) {
 | 
				
			||||||
 | 
					                        if (!first) printf(" %s ", filters.combination_mode == 0 ? "AND" : "OR");
 | 
				
			||||||
 | 
					                        printf("%s", filters.ip_filters[i].ip_address);
 | 
				
			||||||
 | 
					                        first = 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (includes > 1) printf(")");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            printf("\n");
 | 
					            printf("\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (filters.user_agent_count > 0) {
 | 
					        if (filters.user_agent_count > 0) {
 | 
				
			||||||
            printf("   User-Agent Pattern (%d): ", filters.user_agent_count);
 | 
					            printf("     UserAgent: ");
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            int excludes = 0, includes = 0;
 | 
				
			||||||
            for (int i = 0; i < filters.user_agent_count; i++) {
 | 
					            for (int i = 0; i < filters.user_agent_count; i++) {
 | 
				
			||||||
                char mode_char = (filters.user_agent_filters[i].mode == FILTER_EXCLUDE) ? '!' : ' ';
 | 
					                if (filters.user_agent_filters[i].mode == FILTER_EXCLUDE) excludes++;
 | 
				
			||||||
                printf("%c\"%s\"", mode_char, filters.user_agent_filters[i].pattern);
 | 
					                else includes++;
 | 
				
			||||||
                if (i < filters.user_agent_count - 1) printf(", ");
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if (excludes > 0) {
 | 
				
			||||||
 | 
					                printf("!(");
 | 
				
			||||||
 | 
					                int first = 1;
 | 
				
			||||||
 | 
					                for (int i = 0; i < filters.user_agent_count; i++) {
 | 
				
			||||||
 | 
					                    if (filters.user_agent_filters[i].mode == FILTER_EXCLUDE) {
 | 
				
			||||||
 | 
					                        if (!first) printf(" OR ");
 | 
				
			||||||
 | 
					                        printf("\"%s\"", filters.user_agent_filters[i].pattern);
 | 
				
			||||||
 | 
					                        first = 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                printf(")");
 | 
				
			||||||
 | 
					                if (includes > 0) printf(" AND ");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if (includes > 0) {
 | 
				
			||||||
 | 
					                if (includes > 1) printf("(");
 | 
				
			||||||
 | 
					                int first = 1;
 | 
				
			||||||
 | 
					                for (int i = 0; i < filters.user_agent_count; i++) {
 | 
				
			||||||
 | 
					                    if (filters.user_agent_filters[i].mode == FILTER_INCLUDE) {
 | 
				
			||||||
 | 
					                        if (!first) printf(" %s ", filters.combination_mode == 0 ? "AND" : "OR");
 | 
				
			||||||
 | 
					                        printf("\"%s\"", filters.user_agent_filters[i].pattern);
 | 
				
			||||||
 | 
					                        first = 0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (includes > 1) printf(")");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            printf("\n");
 | 
					            printf("\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (filters.time_count > 0) {
 | 
					        if (filters.time_count > 0) {
 | 
				
			||||||
            printf("   Zeiträume (%d):\n", filters.time_count);
 | 
					            printf("     Time: %d Filter(s) gesetzt\n", filters.time_count);
 | 
				
			||||||
            for (int i = 0; i < filters.time_count; i++) {
 | 
					 | 
				
			||||||
                char mode_char = (filters.time_filters[i].mode == FILTER_EXCLUDE) ? '!' : ' ';
 | 
					 | 
				
			||||||
                printf("     %c%02d.%02d.%d %02d:%02d:%02d - %02d.%02d.%d %02d:%02d:%02d\n",
 | 
					 | 
				
			||||||
                       mode_char,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].start_time.day,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].start_time.month,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].start_time.year,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].start_time.hour,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].start_time.minute,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].start_time.second,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].end_time.day,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].end_time.month,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].end_time.year,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].end_time.hour,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].end_time.minute,
 | 
					 | 
				
			||||||
                       filters.time_filters[i].end_time.second);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        // Zeigt aktuellen Modus
 | 
				
			||||||
 | 
					        int active_types = (filters.status_count > 0) + (filters.ip_count > 0) + 
 | 
				
			||||||
 | 
					                          (filters.user_agent_count > 0) + (filters.time_count > 0);
 | 
				
			||||||
 | 
					        if (active_types > 1) {
 | 
				
			||||||
 | 
					            printf("\n   %s-Verknüpfung - Ausschlussfilter vorrangig\n", 
 | 
				
			||||||
 | 
					                   filters.combination_mode == 0 ? "UND" : "ODER");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -1054,7 +1180,7 @@ void show_filtered_entries() {
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    for (int i = 0; i < total_entries; i++) {
 | 
					    for (int i = 0; i < total_entries; i++) {
 | 
				
			||||||
        if (passes_filter(i)) {
 | 
					        if (passes_filter(i)) {
 | 
				
			||||||
            printf("%-16s | %-7s | %-22s | %-6d | %-5d | %02d.%02d.%d %02d:%02d:%02d\n",
 | 
					            printf("%-16s | %-7s | %-22s | %-6d | %-5d | %-36s | %02d.%02d.%d %02d:%02d:%02d\n",
 | 
				
			||||||
                   all_entries[i].ip_address,
 | 
					                   all_entries[i].ip_address,
 | 
				
			||||||
                   all_entries[i].request_method,
 | 
					                   all_entries[i].request_method,
 | 
				
			||||||
                   all_entries[i].url_path,
 | 
					                   all_entries[i].url_path,
 | 
				
			||||||
@ -1327,7 +1453,7 @@ void menu_set_filters() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void menu_delete_filters() {
 | 
					void menu_delete_filters() {
 | 
				
			||||||
    int total_filters = filters.status_count + filters.ip_count + filters.time_count + filters.user_agent_count;  // UPDATE THIS LINE
 | 
					    int total_filters = filters.status_count + filters.ip_count + filters.time_count + filters.user_agent_count;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (total_filters == 0) {
 | 
					    if (total_filters == 0) {
 | 
				
			||||||
        printf("Keine Filter gesetzt zum Löschen.\n");
 | 
					        printf("Keine Filter gesetzt zum Löschen.\n");
 | 
				
			||||||
@ -1437,10 +1563,14 @@ void menu_delete_filters() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void menu_filter_mode() {
 | 
					void menu_filter_mode() {
 | 
				
			||||||
    printf("\n=== FILTER-MODUS ===\n");
 | 
					    printf("=== FILTER-MODUS ===\n");
 | 
				
			||||||
    printf("Aktueller Modus: %s\n", filters.combination_mode == 0 ? "AND (alle müssen zutreffen)" : "OR (einer muss zutreffen)");
 | 
					    printf("Aktueller Modus: %s\n", filters.combination_mode == 0 ? "AND" : "OR");
 | 
				
			||||||
    printf("1. AND-Modus (alle Filter müssen zutreffen)\n");
 | 
					    printf("\nDieser Modus bestimmt:\n");
 | 
				
			||||||
    printf("2. OR-Modus (mindestens ein Filter muss zutreffen)\n");
 | 
					    printf("1. Wie mehrere Filter desselben Typs kombiniert werden\n");
 | 
				
			||||||
 | 
					    printf("2. Wie verschiedene Filter-Typen kombiniert werden\n");
 | 
				
			||||||
 | 
					    printf("\nBeispiele:\n");
 | 
				
			||||||
 | 
					    printf("AND: IP=1.2.3.4 UND User-Agent=mozilla (beide müssen zutreffen)\n");
 | 
				
			||||||
 | 
					    printf("OR:  IP=1.2.3.4 ODER User-Agent=mozilla (einer muss zutreffen)\n");
 | 
				
			||||||
    printf("Auswahl: ");
 | 
					    printf("Auswahl: ");
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    int choice = read_safe_integer();
 | 
					    int choice = read_safe_integer();
 | 
				
			||||||
@ -1514,7 +1644,7 @@ void menu_show_entries() {
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
        if (choice == 1) {
 | 
					        if (choice == 1) {
 | 
				
			||||||
            if (filtered_count > 1000) {
 | 
					            if (filtered_count > 1000) {
 | 
				
			||||||
                printf("WARNUNG: %d Einträge sind sehr viele für die Anzeige!\n", filtered_count);
 | 
					                printf("WARNUNG: Die Anzeige von %d Einträgen ist in der Kommandozeile nur schlecht darstellbar.\n", filtered_count);
 | 
				
			||||||
                printf("Möchten Sie trotzdem fortfahren? (1=Ja, 0=Nein): ");
 | 
					                printf("Möchten Sie trotzdem fortfahren? (1=Ja, 0=Nein): ");
 | 
				
			||||||
                int confirm = read_safe_integer();
 | 
					                int confirm = read_safe_integer();
 | 
				
			||||||
                if (confirm != 1) {
 | 
					                if (confirm != 1) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user