#include <Python.h>
#define crypto_MODULE
#include "crypto.h"
static char *CVSid = "@(#) $Id: x509name.c,v 1.2 2004/09/23 14:25:28 murata Exp $";
crypto_X509NameObj *
crypto_X509Name_New(X509_NAME *name, int dealloc)
{
crypto_X509NameObj *self;
self = PyObject_New(crypto_X509NameObj, &crypto_X509Name_Type);
if (self == NULL)
return NULL;
self->x509_name = name;
self->dealloc = dealloc;
self->parent_cert = NULL;
return self;
}
static void
crypto_X509Name_dealloc(crypto_X509NameObj *self)
{
if (self->dealloc)
X509_NAME_free(self->x509_name);
Py_XDECREF(self->parent_cert);
PyObject_Del(self);
}
static PyObject *
get_name_by_nid(X509_NAME *name, int nid)
{
void *buf;
int len, xlen;
PyObject *str;
if ((len = X509_NAME_get_text_by_NID(name, nid, NULL, 0)) == -1)
{
Py_INCREF(Py_None);
return Py_None;
}
len++;
buf = PyMem_Malloc(len);
if (buf == NULL)
return NULL;
xlen = X509_NAME_get_text_by_NID(name, nid, buf, len);
str = PyString_FromStringAndSize(buf, xlen);
PyMem_Free(buf);
return str;
}
static int
set_name_by_nid(X509_NAME *name, int nid, PyObject *value)
{
X509_NAME_ENTRY *ne;
int i, entry_count, temp_nid;
entry_count = X509_NAME_entry_count(name);
for (i = 0; i < entry_count; i++)
{
ne = X509_NAME_get_entry(name, i);
temp_nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(ne));
if (temp_nid == nid)
{
ne = X509_NAME_delete_entry(name, i);
X509_NAME_ENTRY_free(ne);
break;
}
}
if (!X509_NAME_add_entry_by_NID(name, nid, MBSTRING_ASC,
PyString_AsString(value), -1, -1, 0))
{
exception_from_error_queue();
return -1;
}
return 0;
}
static PyObject *
crypto_X509Name_getattr(crypto_X509NameObj *self, char *name)
{
int nid;
if ((nid = OBJ_txt2nid(name)) == NID_undef)
{
PyErr_SetString(PyExc_AttributeError, "No such attribute");
return NULL;
}
return get_name_by_nid(self->x509_name, nid);
}
static int
crypto_X509Name_setattr(crypto_X509NameObj *self, char *name, PyObject *value)
{
PyObject *strval;
int nid;
if ((nid = OBJ_txt2nid(name)) == NID_undef)
{
PyErr_SetString(PyExc_AttributeError, "No such attribute");
return -1;
}
strval = PyObject_Str(value);
if (strval == NULL)
return -1;
return set_name_by_nid(self->x509_name, nid, strval);
}
static int
crypto_X509Name_compare(crypto_X509NameObj *n, crypto_X509NameObj *m)
{
return X509_NAME_cmp(n->x509_name, m->x509_name);
}
static PyObject *
crypto_X509Name_repr(crypto_X509NameObj *self)
{
char tmpbuf[512] = "";
char realbuf[512+64];
if (X509_NAME_oneline(self->x509_name, tmpbuf, 512) == NULL)
{
exception_from_error_queue();
return NULL;
}
else
{
sprintf(realbuf, "<X509Name object '%s'>", tmpbuf);
return PyString_FromString(realbuf);
}
}
PyTypeObject crypto_X509Name_Type = {
PyObject_HEAD_INIT(NULL)
0,
"X509Name",
sizeof(crypto_X509NameObj),
0,
(destructor)crypto_X509Name_dealloc,
NULL,
(getattrfunc)crypto_X509Name_getattr,
(setattrfunc)crypto_X509Name_setattr,
(cmpfunc)crypto_X509Name_compare,
(reprfunc)crypto_X509Name_repr,
NULL,
NULL,
NULL,
NULL
};
int
init_crypto_x509name(PyObject *dict)
{
crypto_X509Name_Type.ob_type = &PyType_Type;
Py_INCREF(&crypto_X509Name_Type);
PyDict_SetItemString(dict, "X509NameType", (PyObject *)&crypto_X509Name_Type);
return 1;
}