summaryrefslogtreecommitdiff
path: root/src/analysis/scan/patterns/token.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/patterns/token.c')
-rw-r--r--src/analysis/scan/patterns/token.c240
1 files changed, 139 insertions, 101 deletions
diff --git a/src/analysis/scan/patterns/token.c b/src/analysis/scan/patterns/token.c
index f44680c..b3c6d53 100644
--- a/src/analysis/scan/patterns/token.c
+++ b/src/analysis/scan/patterns/token.c
@@ -30,6 +30,7 @@
#include "token-int.h"
+#include "tokens/nodes/plain.h"
#include "../../../common/cpp.h"
#include "../../../core/logs.h"
@@ -39,16 +40,16 @@
/* Initialise la classe des bribes de recherche textuelle. */
-static void g_string_token_class_init(GStringTokenClass *);
+static void g_bytes_token_class_init(GBytesTokenClass *);
/* Initialise une instance de bribe de recherche textuelle. */
-static void g_string_token_init(GStringToken *);
+static void g_bytes_token_init(GBytesToken *);
/* Supprime toutes les références externes. */
-static void g_string_token_dispose(GStringToken *);
+static void g_bytes_token_dispose(GBytesToken *);
/* Procède à la libération totale de la mémoire. */
-static void g_string_token_finalize(GStringToken *);
+static void g_bytes_token_finalize(GBytesToken *);
@@ -56,10 +57,10 @@ static void g_string_token_finalize(GStringToken *);
/* Affiche un motif de recherche au format texte. */
-static void g_string_token_output_to_text(const GStringToken *, GScanContext *, int);
+static void g_bytes_token_output_to_text(const GBytesToken *, GScanContext *, int);
/* Affiche un motif de recherche au format JSON. */
-static void g_string_token_output_to_json(const GStringToken *, GScanContext *, const sized_string_t *, unsigned int, int);
+static void g_bytes_token_output_to_json(const GBytesToken *, GScanContext *, const sized_string_t *, unsigned int, int);
@@ -69,7 +70,7 @@ static void g_string_token_output_to_json(const GStringToken *, GScanContext *,
/* Indique le type défini pour une bribe de recherche textuelle. */
-G_DEFINE_TYPE(GStringToken, g_string_token, G_TYPE_SEARCH_PATTERN);
+G_DEFINE_TYPE(GBytesToken, g_bytes_token, G_TYPE_SEARCH_PATTERN);
/******************************************************************************
@@ -84,20 +85,20 @@ G_DEFINE_TYPE(GStringToken, g_string_token, G_TYPE_SEARCH_PATTERN);
* *
******************************************************************************/
-static void g_string_token_class_init(GStringTokenClass *klass)
+static void g_bytes_token_class_init(GBytesTokenClass *klass)
{
GObjectClass *object; /* Autre version de la classe */
GSearchPatternClass *pattern; /* Version de classe parente */
object = G_OBJECT_CLASS(klass);
- object->dispose = (GObjectFinalizeFunc/* ! */)g_string_token_dispose;
- object->finalize = (GObjectFinalizeFunc)g_string_token_finalize;
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_bytes_token_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_bytes_token_finalize;
pattern = G_SEARCH_PATTERN_CLASS(klass);
- pattern->to_text = (output_pattern_to_text_fc)g_string_token_output_to_text;
- pattern->to_json = (output_pattern_to_json_fc)g_string_token_output_to_json;
+ pattern->to_text = (output_pattern_to_text_fc)g_bytes_token_output_to_text;
+ pattern->to_json = (output_pattern_to_json_fc)g_bytes_token_output_to_json;
}
@@ -114,7 +115,7 @@ static void g_string_token_class_init(GStringTokenClass *klass)
* *
******************************************************************************/
-static void g_string_token_init(GStringToken *token)
+static void g_bytes_token_init(GBytesToken *token)
{
token->root = NULL;
token->slow = 0;
@@ -138,9 +139,11 @@ static void g_string_token_init(GStringToken *token)
* *
******************************************************************************/
-static void g_string_token_dispose(GStringToken *token)
+static void g_bytes_token_dispose(GBytesToken *token)
{
- G_OBJECT_CLASS(g_string_token_parent_class)->dispose(G_OBJECT(token));
+ g_clear_object(&token->root);
+
+ G_OBJECT_CLASS(g_bytes_token_parent_class)->dispose(G_OBJECT(token));
}
@@ -157,9 +160,9 @@ static void g_string_token_dispose(GStringToken *token)
* *
******************************************************************************/
-static void g_string_token_finalize(GStringToken *token)
+static void g_bytes_token_finalize(GBytesToken *token)
{
- G_OBJECT_CLASS(g_string_token_parent_class)->finalize(G_OBJECT(token));
+ G_OBJECT_CLASS(g_bytes_token_parent_class)->finalize(G_OBJECT(token));
}
@@ -179,7 +182,7 @@ static void g_string_token_finalize(GStringToken *token)
* *
******************************************************************************/
-bool g_string_token_create(GStringToken *token, GScanTokenNode *root, bool fullword, bool private)
+bool g_bytes_token_create(GBytesToken *token, GScanTokenNode *root, bool fullword, bool private)
{
bool result; /* Bilan à retourner */
@@ -208,7 +211,7 @@ bool g_string_token_create(GStringToken *token, GScanTokenNode *root, bool fullw
* *
******************************************************************************/
-bool g_string_token_target_fullword(const GStringToken *token)
+bool g_bytes_token_target_fullword(const GBytesToken *token)
{
bool result; /* Statut à renvoyer */
@@ -231,7 +234,7 @@ bool g_string_token_target_fullword(const GStringToken *token)
* *
******************************************************************************/
-bool g_string_token_is_private(const GStringToken *token)
+bool g_bytes_token_is_private(const GBytesToken *token)
{
bool result; /* Statut à renvoyer */
@@ -245,7 +248,6 @@ bool g_string_token_is_private(const GStringToken *token)
/******************************************************************************
* *
* Paramètres : token = définition de la bribe à enregistrer. *
-* context = contexte de l'analyse à mener. *
* backend = moteur de recherche à préchauffer. *
* maxsize = taille max. des atomes (mise en commun optimisée). *
* *
@@ -257,13 +259,37 @@ bool g_string_token_is_private(const GStringToken *token)
* *
******************************************************************************/
-bool g_string_token_enroll(GStringToken *token, GScanContext *context, GEngineBackend *backend, size_t maxsize)
+bool g_bytes_token_enroll(GBytesToken *token, GEngineBackend *backend, size_t maxsize)
{
bool result; /* Statut à retourner */
token->need_backward = g_scan_token_node_setup_tree(token->root);
- result = g_scan_token_node_enroll(token->root, context, backend, maxsize, &token->slow);
+ result = g_scan_token_node_enroll(token->root, backend, maxsize, &token->slow);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : token = définition de la bribe à peaufiner. *
+* backend = moteur de recherche à préchauffer. *
+* *
+* Description : Récupère les identifiants finaux pour un motif recherché. *
+* *
+* Retour : Bilan de l'opération à renvoyer. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_bytes_token_build_id(GBytesToken *token, GEngineBackend *backend)
+{
+ bool result; /* Statut à retourner */
+
+ result = g_scan_token_node_build_id(token->root, backend);
return result;
@@ -273,9 +299,8 @@ bool g_string_token_enroll(GStringToken *token, GScanContext *context, GEngineBa
/******************************************************************************
* *
* Paramètres : token = définition de la bribe à manipuler. *
-* context = contexte de l'analyse à mener. *
-* content = accès au contenu brut pour vérifications (optim.) *
* matches = suivi des correspondances à consolider. *
+* params = paramètres des opérations de validation. *
* *
* Description : Transforme les correspondances locales en trouvailles. *
* *
@@ -285,60 +310,108 @@ bool g_string_token_enroll(GStringToken *token, GScanContext *context, GEngineBa
* *
******************************************************************************/
-void g_string_token_check(const GStringToken *token, GScanContext *context, GBinContent *content, pending_matches_t *matches)
+void g_bytes_token_check(const GBytesToken *token, GScanBytesMatches *matches, scan_node_check_params_t *params)
{
- size_t p; /* Boucle de parcours #3 */
- match_area_t *pending; /* Correspondance à traiter */
+ match_area_t *area; /* Correspondance à valider */
+ match_area_t *next; /* Correspondance suivante */
vmpa2t pos; /* Tête de lecture */
const bin_t *byte; /* Octet à valider */
- g_scan_token_node_check_forward(token->root, context, content, matches);
+ /* Réinitialisation */
+
+ // TODO: offset
+
+ params->initialized = false;
+
+ params->main_areas = NULL;
+ params->main_count = 0;
+
+ params->created_areas = NULL;
+ params->created_count = 0;
+
+ params->kept_areas = NULL;
+ params->kept_count = 0;
+
+ /* Lancement des analyses */
+
+ g_scan_token_node_check_forward(token->root, params);
if (token->need_backward)
- g_scan_token_node_check_backward(token->root, context, content, matches);
+ g_scan_token_node_check_backward(token->root, params);
- sort_and_filter_pending_matches(matches);
+ // REMME ? sort_and_filter_pending_matches(matches);
if (token->fullword)
{
- reset_pending_matches_ttl(matches);
-
- for (p = 0; p < matches->used; p++)
+ for_each_match_area_safe(area, &params->main_areas, next)
{
- pending = &matches->areas[p];
-
/* Validation de l'octet précédent, s'il existe */
- if (pending->start > matches->content_start)
+ if (area->start > params->content_start)
{
- init_vmpa(&pos, pending->start - 1, VMPA_NO_VIRTUAL);
+ init_vmpa(&pos, area->start - 1, VMPA_NO_VIRTUAL);
- byte = g_binary_content_get_raw_access(content, &pos, 1);
+ byte = g_binary_content_get_raw_access(params->content, &pos, 1);
if (isalnum(*byte))
+ {
+ del_match_area(area, &params->main_areas);
+ assert(&params->main_count > 0);
+ params->main_count--;
continue;
+ }
}
/* Validation de l'octet suivant, s'il existe */
- if (pending->end < matches->content_end)
+ if (area->end < params->content_end)
{
- init_vmpa(&pos, pending->end, VMPA_NO_VIRTUAL);
+ init_vmpa(&pos, area->end, VMPA_NO_VIRTUAL);
- byte = g_binary_content_get_raw_access(content, &pos, 1);
+ byte = g_binary_content_get_raw_access(params->content, &pos, 1);
if (isalnum(*byte))
+ {
+ del_match_area(area, &params->main_areas);
+ assert(&params->main_count > 0);
+ params->main_count--;
continue;
+ }
}
- keep_pending_match(pending);
-
}
- purge_pending_matches(matches);
-
}
+ g_scan_bytes_matches_set_list(matches, params->main_areas, params->main_count);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : token = définition de la bribe à consulter. *
+* index = indice de la combinaison de modificateurs ciblée. *
+* *
+* Description : Retrouve l'origine d'une correspondance à partir d'un indice.*
+* *
+* Retour : Version humainement lisible de la combinaison gagnante. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *g_bytes_token_get_modifier_path(const GBytesToken *token, size_t index)
+{
+ char *result; /* Combinaison à retourner */
+
+ if (G_IS_SCAN_TOKEN_NODE_PLAIN(token->root))
+ result = g_scan_token_node_plain_get_modifier_path(G_SCAN_TOKEN_NODE_PLAIN(token->root), index);
+ else
+ result = NULL;
+
+ return result;
+
}
@@ -362,19 +435,22 @@ void g_string_token_check(const GStringToken *token, GScanContext *context, GBin
* *
******************************************************************************/
-static void g_string_token_output_to_text(const GStringToken *pattern, GScanContext *context, int fd)
+static void g_bytes_token_output_to_text(const GBytesToken *pattern, GScanContext *context, int fd)
{
- const GScanMatch **matches; /* Correspondances établies */
- size_t count; /* Quantité de cette liste */
- size_t i; /* Boucle de parcours */
+ GScanMatches *matches; /* Correspondances établies */
- if (g_string_token_is_private(pattern))
+ if (g_bytes_token_is_private(pattern))
return;
- matches = g_scan_context_get_full_matches(context, G_SEARCH_PATTERN(pattern), &count);
+ matches = g_scan_context_get_full_matches(context, G_SEARCH_PATTERN(pattern));
+
+ if (matches != NULL)
+ {
+ g_scan_matches_output_to_text(matches, fd);
+
+ g_object_unref(G_OBJECT(matches));
- for (i = 0; i < count; i++)
- g_scan_match_output_to_text(matches[i], fd);
+ }
}
@@ -395,59 +471,21 @@ static void g_string_token_output_to_text(const GStringToken *pattern, GScanCont
* *
******************************************************************************/
-static void g_string_token_output_to_json(const GStringToken *pattern, GScanContext *context, const sized_string_t *padding, unsigned int level, int fd)
+static void g_bytes_token_output_to_json(const GBytesToken *pattern, GScanContext *context, const sized_string_t *padding, unsigned int level, int fd)
{
- unsigned int i; /* Boucle de parcours #1 */
- const GScanMatch **matches; /* Correspondances établies */
- size_t count; /* Quantité de cette liste */
- char value[ULLONG_MAXLEN]; /* Impression de la position */
- int ret; /* Bilan d'une conversion */
- size_t k; /* Boucle de parcours #2 */
- bool trailing; /* Virgule finale */
-
- if (g_string_token_is_private(pattern))
- return;
-
- matches = g_scan_context_get_full_matches(context, G_SEARCH_PATTERN(pattern), &count);
-
- /* Nombre de correspondances */
-
- for (i = 0; i < level; i++)
- write(fd, padding->data, padding->len);
-
- write(fd, "\"match_count\": ", 15);
-
- ret = snprintf(value, ULLONG_MAXLEN, "%zu", count);
-
- if (ret > 0)
- write(fd, value, ret);
-
- else
- {
- log_simple_message(LMT_EXT_ERROR, "Error while converting value!");
- write(fd, "null", 4);
- }
-
- write(fd, ",\n", 2);
-
- /* Détail des correspondances */
+ GScanMatches *matches; /* Correspondances établies */
- for (i = 0; i < level; i++)
- write(fd, padding->data, padding->len);
+ if (g_bytes_token_is_private(pattern))
+ return;
- write(fd, "\"matches\": [\n", 13);
+ matches = g_scan_context_get_full_matches(context, G_SEARCH_PATTERN(pattern));
- for (k = 0; k < count; k++)
+ if (matches != NULL)
{
- trailing = ((k + 1) < count);
-
- g_scan_match_output_to_json(matches[k], padding, level + 1, fd, trailing);
+ g_scan_matches_output_to_json(matches, padding, level, fd);
+
+ g_object_unref(G_OBJECT(matches));
}
- for (i = 0; i < level; i++)
- write(fd, padding->data, padding->len);
-
- write(fd, "]\n", 2);
-
}