diff options
Diffstat (limited to 'plugins/pychrysalide/analysis/db/client.c')
-rw-r--r-- | plugins/pychrysalide/analysis/db/client.c | 713 |
1 files changed, 6 insertions, 707 deletions
diff --git a/plugins/pychrysalide/analysis/db/client.c b/plugins/pychrysalide/analysis/db/client.c index d5d8b48..0cd9704 100644 --- a/plugins/pychrysalide/analysis/db/client.c +++ b/plugins/pychrysalide/analysis/db/client.c @@ -41,84 +41,13 @@ -/* Crée un nouvel objet Python de type 'HubClient'. */ -static PyObject *py_hub_client_new(PyTypeObject *, PyObject *, PyObject *); - -/* Démarre la connexion à la base de données. */ -static PyObject *py_hub_client_start(PyObject *, PyObject *); - -/* Arrête la connexion à la base de données. */ -static PyObject *py_hub_client_stop(PyObject *, PyObject *); - -/* Effectue une demande de sauvegarde de l'état courant. */ -static PyObject *py_hub_client_save(PyObject *, PyObject *); - -/* Active les éléments en amont d'un horodatage donné. */ -static PyObject *py_hub_client_set_last_active(PyObject *, PyObject *); - -/* Définit la désignation d'un instantané donné. */ -static PyObject *py_hub_client_set_snapshot_name(PyObject *, PyObject *); - -/* Définit la désignation d'un instantané donné. */ -static PyObject *py_hub_client_set_snapshot_desc(PyObject *, PyObject *); - -/* Restaure un ancien instantané. */ -static PyObject *py_hub_client_restore_snapshot(PyObject *, PyObject *); - -/* Crée un nouvel instantané à partir d'un autre. */ -static PyObject *py_hub_client_create_snapshot(PyObject *, PyObject *); - -/* Supprime un ancien instantané. */ -static PyObject *py_hub_client_remove_snapshot(PyObject *, PyObject *); - -/* Fournit la liste des instantanés existants. */ -static PyObject *py_hub_client_get_snapshots(PyObject *, void *); - -/* Fournit l'identifiant de l'instantané courant. */ -static PyObject *py_hub_client_get_current_snapshot(PyObject *, void *); - - - -/****************************************************************************** -* * -* Paramètres : type = type de l'objet à instancier. * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Crée un nouvel objet Python de type 'HubClient'. * -* * -* Retour : Instance Python mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *result; /* Instance à retourner */ - const char *hash; /* Empreinte du binaire visé */ - PyObject *list; /* Liste Python de collections */ - int ret; /* Bilan de lecture des args. */ - Py_ssize_t length; /* Nombre d'éléments collectés */ - GList *collections; /* Liste native de collections */ - Py_ssize_t i; /* Boucle de parcours */ - PyObject *item; /* Elément de la liste Python */ - GDbCollection *collec; /* Version équivalente native */ - GHubClient *client; /* Serveur mis en place */ - #define HUB_CLIENT_DOC \ "HubClient provides and receives binary updates to and from a connected" \ " to a server.\n" \ "\n" \ "Such clients must be authenticated and communications are encrypted using TLS.\n" \ "\n" \ - "Instances can be created using the following constructor:\n" \ - "\n" \ - " HubClient(hash, list)" \ - "\n" \ - "Where hash is a SHA256 fingerprint of the studied binary and list is a list of" \ - " pychrysalide.analysis.db.DbCollection instances ; this kind of list can be" \ - " retrived with the pychrysalide.analysis.LoadedBinary.collections attribute." \ + "Instances can be created directly." \ "\n" \ "HubClient instances emit the following signals:\n" \ "* 'snapshots-updated'\n" \ @@ -132,53 +61,14 @@ static PyObject *py_hub_client_new(PyTypeObject *type, PyObject *args, PyObject " Handlers are expected to have only one argument: the client managing the" \ " snapshots." - ret = PyArg_ParseTuple(args, "sO", &hash, &list); - if (!ret) return NULL; - - if (!PySequence_Check(list)) - { - PyErr_SetString(PyExc_TypeError, _("The second argument must be a collection list")); - return NULL; - } - - length = PySequence_Length(list); - - collections = NULL; - - for (i = 0; i < length; i++) - { - item = PySequence_GetItem(list, i); - - ret = convert_to_db_collection(item, &collec); - - Py_DECREF(item); - if (ret != 1) - { - delete_collections_list(&collections); - result = NULL; - goto exit; - } - g_object_ref(G_OBJECT(collec)); - collections = g_list_append(collections, collec); - - } - - client = g_hub_client_new(hash, collections); - - if (client != NULL) - { - result = pygobject_new(G_OBJECT(client)); - g_object_unref(client); - } - else result = NULL; - - exit: +/* Démarre la connexion à la base de données. */ +static PyObject *py_hub_client_start(PyObject *, PyObject *); - return result; +/* Arrête la connexion à la base de données. */ +static PyObject *py_hub_client_stop(PyObject *, PyObject *); -} /****************************************************************************** @@ -275,588 +165,6 @@ static PyObject *py_hub_client_stop(PyObject *self, PyObject *args) /****************************************************************************** * * -* Paramètres : self = client à manipuler. * -* args = arguments d'appel non utilisés ici. * -* * -* Description : Effectue une demande de sauvegarde de l'état courant. * -* * -* Retour : True si la commande a bien été envoyée, False sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_save(PyObject *self, PyObject *args) -{ - PyObject *result; /* Bilan à retourner */ - GHubClient *client; /* Version native du serveur */ - bool status; /* Bilan de l'opération */ - -#define HUB_CLIENT_SAVE_METHOD PYTHON_METHOD_DEF \ -( \ - save, "$self, /", \ - METH_NOARGS, py_hub_client, \ - "Ask the server for saving the current state of the analyzed binary" \ - " and returns the status of the request transmission." \ -) - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_save(client); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = client à manipuler. * -* args = arguments d'appel à consulter. * -* * -* Description : Active les éléments en amont d'un horodatage donné. * -* * -* Retour : True si la commande a bien été envoyée, False sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_set_last_active(PyObject *self, PyObject *args) -{ - PyObject *result; /* Bilan à retourner */ - unsigned long long timestamp; /* Horodatage de limite */ - int ret; /* Bilan de lecture des args. */ - GHubClient *client; /* Version native du serveur */ - bool status; /* Bilan de l'opération */ - -#define HUB_CLIENT_SET_LAST_ACTIVE_METHOD PYTHON_METHOD_DEF \ -( \ - set_last_active, "$self, timestamp, /", \ - METH_VARARGS, py_hub_client, \ - "Define the timestamp of the last active item in the collection" \ - " and returns the status of the request transmission." \ - "\n" \ - "This method should not be used directly. Prefer calling" \ - " pychrysalide.analysis.LoadedBinary.set_last_active() instead," \ - " as some items may be volatile and thus not handled by clients." \ -) - - ret = PyArg_ParseTuple(args, "K", ×tamp); - if (!ret) return NULL; - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_set_last_active(client, timestamp); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = client à manipuler. * -* args = arguments d'appel à consulter. * -* * -* Description : Définit la désignation d'un instantané donné. * -* * -* Retour : True si la commande a bien été envoyée, False sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_set_snapshot_name(PyObject *self, PyObject *args) -{ - PyObject *result; /* Bilan à retourner */ - const char *raw_id; /* Identifiant brut */ - const char *text; /* Texte fourni à transmettre */ - int ret; /* Bilan de lecture des args. */ - snapshot_id_t id; /* Identifiant utilisable */ - bool status; /* Bilan d'opération */ - GHubClient *client; /* Version native du serveur */ - -#define HUB_CLIENT_SET_SNAPSHOT_NAME_METHOD PYTHON_METHOD_DEF \ -( \ - set_snapshot_name, "$self, id, name, /", \ - METH_VARARGS, py_hub_client, \ - "Ask the server for defining a new name of for a snapshot using its" \ - " identifier and returns the status of the request transmission." \ - "\n" \ - "A 'snapshots-updated' signal is emitted once the request has been" \ - " processed with success." \ -) - - ret = PyArg_ParseTuple(args, "ss", &raw_id, &text); - if (!ret) return NULL; - - status = init_snapshot_id_from_text(&id, raw_id); - if (!status) - { - PyErr_SetString(PyExc_TypeError, _("provided value is not a valid snapshot identifier.")); - return NULL; - } - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_set_snapshot_name(client, &id, text); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = client à manipuler. * -* args = arguments d'appel à consulter. * -* * -* Description : Définit la désignation d'un instantané donné. * -* * -* Retour : True si la commande a bien été envoyée, False sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_set_snapshot_desc(PyObject *self, PyObject *args) -{ - PyObject *result; /* Bilan à retourner */ - const char *raw_id; /* Identifiant brut */ - const char *text; /* Texte fourni à transmettre */ - int ret; /* Bilan de lecture des args. */ - snapshot_id_t id; /* Identifiant utilisable */ - bool status; /* Bilan d'opération */ - GHubClient *client; /* Version native du serveur */ - -#define HUB_CLIENT_SET_SNAPSHOT_DESC_METHOD PYTHON_METHOD_DEF \ -( \ - set_snapshot_desc, "$self, id, desc, /", \ - METH_VARARGS, py_hub_client, \ - "Ask the server for defining a new description for a snapshot using" \ - " its identifier and returns the status of the request transmission." \ - "\n" \ - "A 'snapshots-updated' signal is emitted once the request has been" \ - " processed with success." \ -) - - ret = PyArg_ParseTuple(args, "ss", &raw_id, &text); - if (!ret) return NULL; - - status = init_snapshot_id_from_text(&id, raw_id); - if (!status) - { - PyErr_SetString(PyExc_TypeError, _("provided value is not a valid snapshot identifier.")); - return NULL; - } - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_set_snapshot_desc(client, &id, text); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = client à manipuler. * -* args = arguments d'appel à consulter. * -* * -* Description : Restaure un ancien instantané. * -* * -* Retour : True si la commande a bien été envoyée, False sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_restore_snapshot(PyObject *self, PyObject *args) -{ - PyObject *result; /* Bilan à retourner */ - const char *raw_id; /* Identifiant brut */ - int ret; /* Bilan de lecture des args. */ - snapshot_id_t id; /* Identifiant utilisable */ - bool status; /* Bilan d'opération */ - GHubClient *client; /* Version native du serveur */ - -#define HUB_CLIENT_RESTORE_SNAPSHOT_METHOD PYTHON_METHOD_DEF \ -( \ - restore_snapshot, "$self, id, /", \ - METH_VARARGS, py_hub_client, \ - "Ask the server for restoring a given snapshot using" \ - " its identifier and returns the status of the request transmission." \ - "\n" \ - "A 'snapshot-changed' signal is emitted once the request has been" \ - " processed with success." \ -) - - ret = PyArg_ParseTuple(args, "s", &raw_id); - if (!ret) return NULL; - - status = init_snapshot_id_from_text(&id, raw_id); - if (!status) - { - PyErr_SetString(PyExc_TypeError, _("provided value is not a valid snapshot identifier.")); - return NULL; - } - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_restore_snapshot(client, &id); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = client à manipuler. * -* args = arguments d'appel à consulter. * -* * -* Description : Crée un nouvel instantané à partir d'un autre. * -* * -* Retour : True si la commande a bien été envoyée, False sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_create_snapshot(PyObject *self, PyObject *args) -{ - PyObject *result; /* Bilan à retourner */ - GHubClient *client; /* Version native du serveur */ - bool status; /* Bilan d'opération */ - -#define HUB_CLIENT_CREATE_SNAPSHOT_METHOD PYTHON_METHOD_DEF \ -( \ - create_snapshot, "$self, /", \ - METH_NOARGS, py_hub_client, \ - "Ask the server for creating a new snapshot of the current state" \ - " and returns the status of the request transmission." \ - "\n" \ - "A 'snapshots-updated' signal is emitted once the request has been" \ - " processed with success." \ -) - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_create_snapshot(client); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = client à manipuler. * -* args = arguments d'appel à consulter. * -* * -* Description : Supprime un ancien instantané. * -* * -* Retour : True si la commande a bien été envoyée, False sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_remove_snapshot(PyObject *self, PyObject *args) -{ - PyObject *result; /* Bilan à retourner */ - const char *raw_id; /* Identifiant brut */ - int rec; /* Indicateur de récursivité */ - int ret; /* Bilan de lecture des args. */ - snapshot_id_t id; /* Identifiant utilisable */ - bool status; /* Bilan d'opération */ - GHubClient *client; /* Version native du serveur */ - -#define HUB_CLIENT_REMOVE_SNAPSHOT_METHOD PYTHON_METHOD_DEF \ -( \ - remove_snapshot, "$self, id, recursive, /", \ - METH_VARARGS, py_hub_client, \ - "Ask the server for removing a given snapshot using" \ - " its identifier and returns the status of the request transmission." \ - "\n" \ - "If this removal has not to be recursive, all children snapshots get" \ - " reassigned to the parent snapshot of the target." \ - "\n" \ - "A 'snapshots-updated' signal is emitted once the request has been" \ - " processed with success." \ -) - - ret = PyArg_ParseTuple(args, "sp", &raw_id, &rec); - if (!ret) return NULL; - - status = init_snapshot_id_from_text(&id, raw_id); - if (!status) - { - PyErr_SetString(PyExc_TypeError, _("provided value is not a valid snapshot identifier.")); - return NULL; - } - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_remove_snapshot(client, &id, rec); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la liste des instantanés existants. * -* * -* Retour : Liste d'instantanés ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_get_snapshots(PyObject *self, void *closure) -{ - PyObject *result; /* Valeur à retourner */ - GHubClient *client; /* Version native du serveur */ - snapshot_info_t *info; /* Liste d'instantanés présents*/ - size_t count; /* Taille de cette liste */ - bool status; /* Validité de cet identifiant */ - PyTypeObject *base; /* Modèle d'objet à créer */ - size_t i; /* Boucle de parcours */ - PyObject *item; /* Nouvelle description */ - char *text; /* Valeur textuelle à placer */ - PyObject *attrib; /* Attribut à constituer */ - int ret; /* Bilan d'une mise en place */ - bool failed; /* Détection d'une erreur */ - -#define HUB_CLIENT_SNAPSHOTS_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - snapshots, py_hub_client, \ - "List of all existing snapshots, provided as a tuple of pychrysalide.StructObject." \ - "\n" \ - "Each snapshot is characterised by the following properties :\n" \ - "* parent_id : identifier of the parent snapshot;\n" \ - "* id : identifier of the snapshot;\n" \ - "* created : timestamp of the creation date;\n" \ - "* name : name of the snapshot, or None;\n" \ - "* desc : description of the snapshot, or None." \ -) - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_get_snapshots(client, &info, &count); - - if (status) - { - result = PyTuple_New(count); - - base = get_python_py_struct_type(); - - failed = false; - - for (i = 0; i < count; i++) - { - item = PyObject_CallFunction((PyObject *)base, NULL); - assert(item != NULL); - - text = snapshot_id_as_string(get_snapshot_info_parent_id(&info[i])); - attrib = PyUnicode_FromString(text); - ret = PyDict_SetItemString(item, "parent_id", attrib); - if (ret != 0) break; - - text = snapshot_id_as_string(get_snapshot_info_id(&info[i])); - attrib = PyUnicode_FromString(text); - ret = PyDict_SetItemString(item, "id", attrib); - if (ret != 0) break; - - attrib = PyLong_FromUnsignedLongLong(get_snapshot_info_created(&info[i])); - ret = PyDict_SetItemString(item, "created", attrib); - if (ret != 0) break; - - text = get_snapshot_info_name(&info[i]); - - if (text != NULL) - attrib = PyUnicode_FromString(text); - else - { - attrib = Py_None; - Py_INCREF(attrib); - } - - ret = PyDict_SetItemString(item, "name", attrib); - if (ret != 0) break; - - text = get_snapshot_info_desc(&info[i]); - - if (text != NULL) - attrib = PyUnicode_FromString(text); - else - { - attrib = Py_None; - Py_INCREF(attrib); - } - - ret = PyDict_SetItemString(item, "desc", attrib); - if (ret != 0) break; - - PyTuple_SetItem(result, i, item); - - } - - failed = (i < count); - - for (i = 0; i < count; i++) - exit_snapshot_info(&info[i]); - - free(info); - - if (failed) - goto on_failure; - - } - - else - { - result = Py_None; - Py_INCREF(result); - } - - return result; - - on_failure: - - Py_DECREF(result); - - return NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit l'identifiant de l'instantané courant. * -* * -* Retour : Identifiant d'instantané ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_hub_client_get_current_snapshot(PyObject *self, void *closure) -{ - PyObject *result; /* Valeur à retourner */ - GHubClient *client; /* Version native du serveur */ - snapshot_id_t id; /* Identifiant à transmettre */ - bool status; /* Validité de cet identifiant */ - -#define HUB_CLIENT_CURRENT_SNAPSHOT_ATTRIB PYTHON_GETSET_DEF_FULL \ -( \ - current_snapshot, py_hub_client, \ - "Identifier of the current snapshot, provided as a string." \ - "\n" \ - "The returned value is a cached version of the value stored at" \ - " server side. Thus, defining a new current snapshot is" \ - " successful as soon as the request to this server is sent." \ -) - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_get_current_snapshot(client, &id); - - if (status) - result = PyUnicode_FromString(snapshot_id_as_string(&id)); - - else - { - result = Py_None; - Py_INCREF(result); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* value = valeur fournie à intégrer ou prendre en compte. * -* closure = adresse non utilisée ici. * -* * -* Description : Définit l'identifiant de l'instantané courant. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static int py_hub_client_set_current_snapshot(PyObject *self, PyObject *value, void *closure) -{ - int ret; /* Bilan d'analyse */ - void *raw; /* Valeur brute d'identifiant */ - snapshot_id_t id; /* Identifiant reconnu */ - bool status; /* Bilan d'une conversion */ - GHubClient *client; /* Version native du serveur */ - - ret = PyUnicode_Check(value); - if (!ret) return -1; - - raw = PyUnicode_DATA(value); - - status = init_snapshot_id_from_text(&id, raw); - if (!status) - { - PyErr_SetString(PyExc_TypeError, _("provided value is not a valid snapshot identifier.")); - return -1; - } - - client = G_HUB_CLIENT(pygobject_get(self)); - - status = g_hub_client_set_current_snapshot(client, &id); - if (!status) - { - PyErr_SetString(PyExc_TypeError, "unable to send the provided snapshot identifier"); - return -1; - } - - return 0; - -} - - -/****************************************************************************** -* * * Paramètres : - * * * * Description : Fournit un accès à une définition de type à diffuser. * @@ -872,19 +180,10 @@ PyTypeObject *get_python_hub_client_type(void) static PyMethodDef py_hub_client_methods[] = { HUB_CLIENT_START_METHOD, HUB_CLIENT_STOP_METHOD, - HUB_CLIENT_SAVE_METHOD, - HUB_CLIENT_SET_LAST_ACTIVE_METHOD, - HUB_CLIENT_SET_SNAPSHOT_NAME_METHOD, - HUB_CLIENT_SET_SNAPSHOT_DESC_METHOD, - HUB_CLIENT_RESTORE_SNAPSHOT_METHOD, - HUB_CLIENT_CREATE_SNAPSHOT_METHOD, - HUB_CLIENT_REMOVE_SNAPSHOT_METHOD, { NULL } }; static PyGetSetDef py_hub_client_getseters[] = { - HUB_CLIENT_SNAPSHOTS_ATTRIB, - HUB_CLIENT_CURRENT_SNAPSHOT_ATTRIB, { NULL } }; @@ -901,7 +200,7 @@ PyTypeObject *get_python_hub_client_type(void) .tp_methods = py_hub_client_methods, .tp_getset = py_hub_client_getseters, - .tp_new = py_hub_client_new, + .tp_new = no_python_constructor_allowed, }; |