#include "attack_repertoire.h"
#include "scan_repertoire.h"
#include "active_attack.h"
#include "active_scan.h"
#include <stddef.h>
#include <stdbool.h>
#include <pthread.h>
#ifndef PENTEST_STATE_H
#define PENTEST_STATE_H
//Only access through the syncronized functions below in a thread context
struct pentest_state
{
pthread_mutex_t lock;
char **targets;
size_t num_targets;
size_t max_targets;
//active attacks (store pointers to be able to remove cleanly)
struct active_attack **attacks;
size_t num_attacks;
size_t max_attacks;
//ditto for scans
struct active_scan **scans;
size_t num_scans;
size_t max_scans;
//failed attacks
struct past_attack *failed;
size_t num_failed;
size_t max_failed;
//successful attacks
struct past_attack *worked;
size_t num_worked;
size_t max_worked;
//completed scans as they can't fail
struct past_scan *done;
size_t num_done;
size_t max_done;
};
//init/teardown
void pentest_state_init(struct pentest_state *p_s, size_t max_targets,
size_t max_attacks, size_t max_scans);
void pentest_state_cleanup(struct pentest_state *p_s);
//actions
void pentest_state_add_target(struct pentest_state *p_s, char *target);
void pentest_state_add_attack(struct pentest_state *p_s, struct active_attack *attack);
void pentest_state_add_failed(struct pentest_state *p_s, char *a_p, char *target);
void pentest_state_add_worked(struct pentest_state *p_s, char *a_p, char *target);
void pentest_state_rem_attack(struct pentest_state *p_s, struct active_attack *attack);
void pentest_state_rem_target(struct pentest_state *p_s, char *target);
void pentest_state_add_scan(struct pentest_state *p_s, struct active_scan *scan);
void pentest_state_add_done(struct pentest_state *p_s, char *scan, char *target);
void pentest_state_rem_scan(struct pentest_state *p_s, struct active_scan *scan);
void pentest_state_active_attack_update(struct pentest_state *p_s, struct active_attack *a_a);
void pentest_state_active_scan_update(struct pentest_state *p_s, struct active_scan *a_s);
//syncronized setters/getters
size_t pentest_state_num_attacks(struct pentest_state *p_s);
size_t pentest_state_max_attacks(struct pentest_state *p_s);
size_t pentest_state_num_targets(struct pentest_state *p_s);
size_t pentest_state_max_targets(struct pentest_state *p_s);
size_t pentest_state_num_scans(struct pentest_state *p_s);
size_t pentest_state_max_scans(struct pentest_state *p_s);
size_t pentest_state_num_failed(struct pentest_state *p_s);
size_t pentest_state_max_failed(struct pentest_state *p_s);
size_t pentest_state_num_worked(struct pentest_state *p_s);
size_t pentest_state_max_worked(struct pentest_state *p_s);
//accessors
char *pentest_state_get_target(struct pentest_state *p_s, size_t idx);
struct active_attack *pentest_state_get_attack(struct pentest_state *p_s, size_t idx);
struct active_scan *pentest_state_get_scan(struct pentest_state *p_s, size_t idx);
//status functions
bool pentest_active_target(struct pentest_state *p_s, char *target);
bool pentest_exploited_target(struct pentest_state *p_s, char *target);
bool pentest_attack_active(struct pentest_state *p_s, char *attack, char *target);
bool pentest_attack_failed(struct pentest_state *p_s, char *attack, char *target);
bool pentest_attack_worked(struct pentest_state *p_s, char *attack, char *target);
bool pentest_scan_active(struct pentest_state *p_s, char *scan, char *target);
bool pentest_scan_done(struct pentest_state *p_s, char *scan, char *target);
#endif