Permalink
Switch branches/tags
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
321 lines (296 sloc) 15.2 KB
/*
* Copyright (c) 2017 Cossack Labs Limited
*
* This file is a part of Hermes-core.
*
* Hermes-core is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Hermes-core is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Hermes-core. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "py_midhermes.h"
typedef struct {
PyObject_HEAD
PyObject *credential_store_transport;
PyObject *data_store_transport;
PyObject *key_store_transport;
mid_hermes_t *mid_hermes;
} pyhermes_MidHermesObject;
static void MidHermes_dealloc(pyhermes_MidHermesObject *self) {
mid_hermes_destroy(&(self->mid_hermes));
Py_DECREF(self->credential_store_transport);
Py_DECREF(self->key_store_transport);
Py_DECREF(self->data_store_transport);
Py_TYPE(self)->tp_free((PyObject *) self);
}
static int MidHermes_init(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
PyObject *credential_store_transport = NULL, *data_store_transport = NULL, *key_store_transport = NULL;
const char *id = NULL, *sk = NULL;
Py_ssize_t id_length = 0, sk_length = 0;
static char *kwlist[] = {"id", "private_key", "cs_transport", "ds_transport", "ks_transport", NULL};
if (!PyArg_ParseTupleAndKeywords(
args, kwds, "s#s#OOO", kwlist, &id, &id_length, &sk, &sk_length, &credential_store_transport,
&data_store_transport, &key_store_transport)) {
return -1;
}
PyObject *transport = PyObject_CallMethod(credential_store_transport, "get_hermes_transport", NULL);
if (!HermesTransportWrapper_Check(transport)) {
PyErr_SetString(PyExc_TypeError, "credential_store return transport with incorrect type");
return -1;
}
hm_rpc_transport_t *credential_hermes_transport = ((pyhermes_HermesTransportWrapperObject_t *) transport)->hermes_transport;
transport = PyObject_CallMethod(key_store_transport, "get_hermes_transport", NULL);
if (HermesTransportWrapper_Check(transport) != 1) {
PyErr_SetString(PyExc_TypeError, "credential_store return transport with incorrect type");
return -1;
}
hm_rpc_transport_t *key_hermes_transport = ((pyhermes_HermesTransportWrapperObject_t *) transport)->hermes_transport;
transport = PyObject_CallMethod(data_store_transport, "get_hermes_transport", NULL);
if (HermesTransportWrapper_Check(transport) != 1) {
PyErr_SetString(PyExc_TypeError, "credential_store return transport with incorrect type");
return -1;
}
hm_rpc_transport_t *data_hermes_transport = ((pyhermes_HermesTransportWrapperObject_t *) transport)->hermes_transport;
if (!(credential_store_transport)
|| !(data_store_transport)
|| !(key_store_transport)
|| !(self->mid_hermes = mid_hermes_create(
(const uint8_t *) id, (size_t) id_length, (const uint8_t *) sk, (size_t) sk_length,
key_hermes_transport, data_hermes_transport, credential_hermes_transport))) {
return -1;
}
self->credential_store_transport = credential_store_transport;
Py_INCREF(credential_store_transport);
self->data_store_transport = data_store_transport;
Py_INCREF(data_store_transport);
self->key_store_transport = key_store_transport;
Py_INCREF(key_store_transport);
return 0;
}
static PyObject *MidHermes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
pyhermes_MidHermesObject *self;
self = (pyhermes_MidHermesObject *) type->tp_alloc(type, 0);
if (!self) {
PyErr_SetString(HermesError, "MidHermes memory allocation error");
return NULL;
}
if (0 != MidHermes_init(self, args, kwds)) {
PyErr_SetString(HermesError, "MidHermes object creation error");
return NULL;
}
return (PyObject *) self;
}
static PyObject *MidHermes_addBlock(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL, *block = NULL, *meta = NULL;
size_t block_id_length = 0, block_length = 0, meta_length = 0;
static char *kwlist[] = {"id", "data", "meta", NULL};
if (!PyArg_ParseTupleAndKeywords(
args, kwds, "s#s#s#", kwlist, &block_id, &block_id_length, &block, &block_length, &meta, &meta_length)) {
PyErr_SetString(HermesError, "MidHermes.addBlock invalid parameters");
return NULL;
}
if (0 != mid_hermes_create_block(
self->mid_hermes, (uint8_t **) (&block_id), &block_id_length, (const uint8_t *) block, block_length,
(const uint8_t *) meta, meta_length)) {
PyErr_SetString(HermesError, "MidHermes.addBlock error");
return NULL;
}
Py_RETURN_NONE;
}
static PyObject *MidHermes_updBlock(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL, *block = NULL, *meta = NULL;
size_t block_id_length = 0, block_length = 0, meta_length = 0;
static char *kwlist[] = {"id", "data", "meta", NULL};
if (!PyArg_ParseTupleAndKeywords(
args, kwds, "s#s#s#", kwlist, &block_id, &block_id_length, &block, &block_length, &meta, &meta_length)) {
PyErr_SetString(HermesError, "MidHermes.updBlock invalid parameters");
return NULL;
}
if (0 != mid_hermes_update_block(
self->mid_hermes, (const uint8_t *) block_id, block_id_length, (const uint8_t *) block, block_length,
(const uint8_t *) meta, meta_length)) {
PyErr_SetString(HermesError, "MidHermes.updBlock error");
return NULL;
}
Py_RETURN_NONE;
}
static PyObject *MidHermes_delBlock(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL;
size_t block_id_length = 0;
static char *kwlist[] = {"id", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwlist, &block_id, &block_id_length)) {
PyErr_SetString(HermesError, "MidHermes.delBlock invalid parameters");
return NULL;
}
if (0 != mid_hermes_delete_block(self->mid_hermes, (const uint8_t *) block_id, block_id_length)) {
PyErr_SetString(HermesError, "MidHermes.delBlock error");
return NULL;
}
Py_RETURN_NONE;
}
static PyObject *MidHermes_getBlock(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL, *block = NULL, *meta = NULL;
size_t block_id_length = 0, block_length = 0, meta_length = 0;
static char *kwlist[] = {"id", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwlist, &block_id, &block_id_length)) {
PyErr_SetString(HermesError, "MidHermes.getBlock invalid parameters");
return NULL;
}
if (0 != mid_hermes_read_block(
self->mid_hermes, (const uint8_t *) block_id, block_id_length, (uint8_t **) (&block), &block_length,
(uint8_t **) (&meta), &meta_length)) {
PyErr_SetString(HermesError, "MidHermes.getBlock error");
return NULL;
}
return Py_BuildValue("OO", PyBytes_FromStringAndSize(block, block_length), PyBytes_FromStringAndSize(meta, meta_length));
}
static PyObject *MidHermes_rotateBlock(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL;
size_t block_id_length = 0;
static char *kwlist[] = {"id", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwlist, &block_id, &block_id_length)) {
PyErr_SetString(HermesError, "MidHermes.rotateBlock invalid parameters");
return NULL;
}
if (0 != mid_hermes_rotate_block(
self->mid_hermes, (const uint8_t *) block_id, block_id_length)) {
PyErr_SetString(HermesError, "MidHermes.rotateBlock error");
return NULL;
}
Py_RETURN_NONE;
}
static PyObject *MidHermes_grantReadAccess(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL, *user_id = NULL;
size_t block_id_length = 0, user_id_length = 0;
static char *kwlist[] = {"id", "user", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#s#", kwlist, &block_id, &block_id_length, &user_id,
&user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.grantReadAccess invalid parameters");
return NULL;
}
if (0 != mid_hermes_grant_read_access(
self->mid_hermes, (const uint8_t *) block_id, block_id_length, (const uint8_t *) user_id, user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.grantReadAccess error");
return NULL;
}
Py_RETURN_NONE;
}
static PyObject *MidHermes_grantUpdateAccess(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL, *user_id = NULL;
size_t block_id_length = 0, user_id_length = 0;
static char *kwlist[] = {"id", "user", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#s#", kwlist, &block_id, &block_id_length, &user_id,
&user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.grantUpdateAccess invalid parameters");
return NULL;
}
if (0 != mid_hermes_grant_update_access(
self->mid_hermes, (const uint8_t *) block_id, block_id_length, (const uint8_t *) user_id, user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.grantUpdateAccess error");
return NULL;
}
Py_RETURN_NONE;
}
static PyObject *MidHermes_denyReadAccess(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL, *user_id = NULL;
size_t block_id_length = 0, user_id_length = 0;
static char *kwlist[] = {"id", "user", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#s#", kwlist, &block_id, &block_id_length, &user_id,
&user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.denyReadAccess invalid parameters");
return NULL;
}
if (0 != mid_hermes_deny_read_access(
self->mid_hermes, (const uint8_t *) block_id, block_id_length, (const uint8_t *) user_id, user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.denyReadAccess error");
return NULL;
}
Py_RETURN_NONE;
}
static PyObject *MidHermes_denyUpdateAccess(pyhermes_MidHermesObject *self, PyObject *args, PyObject *kwds) {
const char *block_id = NULL, *user_id = NULL;
size_t block_id_length = 0, user_id_length = 0;
static char *kwlist[] = {"id", "user", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#s#", kwlist, &block_id, &block_id_length, &user_id,
&user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.denyUpdateAccess invalid parameters");
return NULL;
}
if (0 != mid_hermes_deny_update_access(
self->mid_hermes, (const uint8_t *) block_id, block_id_length, (const uint8_t *) user_id, user_id_length)) {
PyErr_SetString(HermesError, "MidHermes.denyUpdateAccess error");
return NULL;
}
Py_RETURN_NONE;
}
static PyMethodDef MidHermes_methods[] = {
{"addBlock", (PyCFunction) MidHermes_addBlock,
METH_VARARGS |
METH_KEYWORDS, "add (block, meta) to hermes"},
{"getBlock", (PyCFunction) MidHermes_getBlock, METH_VARARGS |
METH_KEYWORDS, "return (block, meta) from hermes"},
{"updBlock", (PyCFunction) MidHermes_updBlock, METH_VARARGS |
METH_KEYWORDS, "update (block, meta) in hermes"},
{"delBlock", (PyCFunction) MidHermes_delBlock, METH_VARARGS |
METH_KEYWORDS, "delete (block, meta) from hermes"},
{"rotateBlock", (PyCFunction) MidHermes_rotateBlock, METH_VARARGS |
METH_KEYWORDS, "rotete block in hermes"},
{"grantReadAccess", (PyCFunction) MidHermes_grantReadAccess, METH_VARARGS |
METH_KEYWORDS, "grant read access to user for block"},
{"grantUpdateAccess", (PyCFunction) MidHermes_grantUpdateAccess, METH_VARARGS |
METH_KEYWORDS, "grant update access to user for block"},
{"denyReadAccess", (PyCFunction) MidHermes_denyReadAccess, METH_VARARGS |
METH_KEYWORDS, "deny read access to user for block"},
{"denyUpdateAccess", (PyCFunction) MidHermes_denyUpdateAccess, METH_VARARGS |
METH_KEYWORDS, "deny update access to user for block"},
{NULL} /* Sentinel */
};
PyTypeObject pyhermes_MidHermesType = {
PyVarObject_HEAD_INIT(NULL, 0)
"hermes_core.MidHermes", /* tp_name */
sizeof(pyhermes_MidHermesObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor) MidHermes_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_reserved */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
"MidHermes objects", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
MidHermes_methods, /* tp_methods */
NULL, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
NULL,//(initproc)MidHermes_init, /* tp_init */
0, /* tp_alloc */
MidHermes_new, /* tp_new */
};