diff options
Diffstat (limited to 'src/zope/security/_proxy.c')
-rw-r--r-- | src/zope/security/_proxy.c | 1010 |
1 files changed, 0 insertions, 1010 deletions
diff --git a/src/zope/security/_proxy.c b/src/zope/security/_proxy.c deleted file mode 100644 index b0e3a81..0000000 --- a/src/zope/security/_proxy.c +++ /dev/null @@ -1,1010 +0,0 @@ -/***************************************************************************** -* -* Copyright (c) 2003, 2004 Zope Corporation and Contributors. -* All Rights Reserved. -* -* This software is subject to the provisions of the Zope Public License, -* Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -* WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -* FOR A PARTICULAR PURPOSE. -* -****************************************************************************** -Security Proxy Implementation - -$Id$ -*/ - -#include <Python.h> -#include "zope.proxy/proxy.h" - -static PyObject *__class__str = 0, *__name__str = 0, *__module__str = 0; - -#define DECLARE_STRING(N) static PyObject *str_##N - -DECLARE_STRING(__3pow__); -DECLARE_STRING(__call__); -DECLARE_STRING(check); -DECLARE_STRING(check_getattr); -DECLARE_STRING(check_setattr); -DECLARE_STRING(__cmp__); -DECLARE_STRING(__coerce__); -DECLARE_STRING(__contains__); -DECLARE_STRING(__delitem__); -DECLARE_STRING(__getitem__); -DECLARE_STRING(__getslice__); -DECLARE_STRING(__hash__); -DECLARE_STRING(__iter__); -DECLARE_STRING(__len__); -DECLARE_STRING(next); -DECLARE_STRING(__nonzero__); -DECLARE_STRING(op_abs); -DECLARE_STRING(op_add); -DECLARE_STRING(op_and); -DECLARE_STRING(op_div); -DECLARE_STRING(op_divmod); -DECLARE_STRING(op_float); -DECLARE_STRING(op_floordiv); -DECLARE_STRING(op_hex); -DECLARE_STRING(op_iadd); -DECLARE_STRING(op_iand); -DECLARE_STRING(op_idiv); -DECLARE_STRING(op_ifloordiv); -DECLARE_STRING(op_ilshift); -DECLARE_STRING(op_imod); -DECLARE_STRING(op_imul); -DECLARE_STRING(op_int); -DECLARE_STRING(op_invert); -DECLARE_STRING(op_ior); -DECLARE_STRING(op_ipow); -DECLARE_STRING(op_irshift); -DECLARE_STRING(op_isub); -DECLARE_STRING(op_itruediv); -DECLARE_STRING(op_ixor); -DECLARE_STRING(op_long); -DECLARE_STRING(op_lshift); -DECLARE_STRING(op_mod); -DECLARE_STRING(op_mul); -DECLARE_STRING(op_neg); -DECLARE_STRING(op_oct); -DECLARE_STRING(op_or); -DECLARE_STRING(op_pos); -DECLARE_STRING(op_radd); -DECLARE_STRING(op_rand); -DECLARE_STRING(op_rdiv); -DECLARE_STRING(op_rdivmod); -DECLARE_STRING(op_rfloordiv); -DECLARE_STRING(op_rlshift); -DECLARE_STRING(op_rmod); -DECLARE_STRING(op_rmul); -DECLARE_STRING(op_ror); -DECLARE_STRING(op_rrshift); -DECLARE_STRING(op_rshift); -DECLARE_STRING(op_rsub); -DECLARE_STRING(op_rtruediv); -DECLARE_STRING(op_rxor); -DECLARE_STRING(op_sub); -DECLARE_STRING(op_truediv); -DECLARE_STRING(op_xor); -DECLARE_STRING(__pow__); -DECLARE_STRING(proxy); -DECLARE_STRING(__repr__); -DECLARE_STRING(__rpow__); -DECLARE_STRING(__setitem__); -DECLARE_STRING(__setslice__); -DECLARE_STRING(__str__); - -typedef struct { - ProxyObject proxy; - PyObject *proxy_checker; -} SecurityProxy; - -#define CLEAR(O) if (O) {PyObject *t = O; O = 0; Py_DECREF(t); } - -#undef Proxy_Check -#define Proxy_Check(proxy) \ - PyObject_TypeCheck(proxy, &SecurityProxyType) - -static PyTypeObject SecurityProxyType; - -/* - * Machinery to call the checker. - */ - -static int -check(SecurityProxy *self, PyObject *meth, PyObject *name) -{ - PyObject *r; - - /* If the checker has __setitem__, we call it's slot rather than - calling check or check_getattr. Why? Because calling operator slots - is much faster than calling methods and security checks are done so - often that speed matters. So we have this hack of using - almost-arbitrary operations to represent methods that we call - alot. */ - if (self->proxy_checker->ob_type->tp_as_mapping != NULL - && self->proxy_checker->ob_type->tp_as_mapping->mp_ass_subscript != NULL - && meth != str_check_setattr) - return self->proxy_checker->ob_type->tp_as_mapping-> - mp_ass_subscript(self->proxy_checker, self->proxy.proxy_object, name); - - r = PyObject_CallMethodObjArgs(self->proxy_checker, meth, - self->proxy.proxy_object, name, - NULL); - if (r == NULL) - return -1; - - Py_DECREF(r); - return 0; -} - -/* If the checker has __getitem__, we call it's slot rather than - calling proxy. Why? Because calling operator slots - is much faster than calling methods and security checks are done so - often that speed matters. So we have this hack of using - almost-arbitrary operations to represent methods that we call - alot. */ -#define PROXY_RESULT(self, result) \ -if (result != NULL) { \ - PyObject *tmp; \ - if (self->proxy_checker->ob_type->tp_as_mapping != NULL \ - && self->proxy_checker->ob_type->tp_as_mapping->mp_subscript != NULL) \ - tmp = self->proxy_checker->ob_type->tp_as_mapping-> \ - mp_subscript(self->proxy_checker, result); \ - else \ - tmp = PyObject_CallMethodObjArgs(self->proxy_checker, str_proxy, \ - result, NULL); \ - Py_DECREF(result); \ - result = tmp; \ -} - -typedef PyObject *(*function1)(PyObject *); - -static PyObject * -check1(SecurityProxy *self, PyObject *opname, function1 operation) -{ - PyObject *result = NULL; - - if (check(self, str_check, opname) >= 0) { - result = operation(self->proxy.proxy_object); - PROXY_RESULT(self, result); - } - return result; -} - -static PyObject * -check2(PyObject *self, PyObject *other, - PyObject *opname, PyObject *ropname, binaryfunc operation) -{ - PyObject *result = NULL; - - if (Proxy_Check(self)) - { - if (check((SecurityProxy*)self, str_check, opname) >= 0) - { - result = operation(((SecurityProxy*)self)->proxy.proxy_object, - other); - PROXY_RESULT(((SecurityProxy*)self), result); - } - } - else if (Proxy_Check(other)) - { - if (check((SecurityProxy*)other, str_check, ropname) >= 0) - { - result = operation(self, - ((SecurityProxy*)other)->proxy.proxy_object); - - PROXY_RESULT(((SecurityProxy*)other), result); - } - } - else - { - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - - return result; -} - -static PyObject * -check2i(SecurityProxy *self, PyObject *other, - PyObject *opname, binaryfunc operation) -{ - PyObject *result = NULL; - - if (check(self, str_check, opname) >= 0) - { - result = operation(self->proxy.proxy_object, other); - if (result == self->proxy.proxy_object) - { - /* If the operation was really carried out inplace, - don't create a new proxy, but use the old one. */ - Py_DECREF(result); - Py_INCREF((PyObject *)self); - result = (PyObject *)self; - } - else - PROXY_RESULT(self, result); - } - return result; -} - -#define UNOP(NAME, CALL) \ - static PyObject *proxy_##NAME(PyObject *self) \ - { return check1((SecurityProxy *)self, str_op_##NAME, CALL); } - -#define BINOP(NAME, CALL) \ - static PyObject *proxy_##NAME(PyObject *self, PyObject *other) \ - { return check2(self, other, str_op_##NAME, str_op_r##NAME, CALL); } - -#define INPLACE(NAME, CALL) \ - static PyObject *proxy_i##NAME(PyObject *self, PyObject *other) \ - { return check2i((SecurityProxy *)self, other, str_op_i##NAME, CALL); } - - -/* - * Slot methods. - */ - -static PyObject * -proxy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"object", "checker", 0}; - SecurityProxy *self; - PyObject *object; - PyObject *checker; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, - "OO:_Proxy.__new__", kwlist, - &object, &checker)) - return NULL; - - if (checker == Py_None) - { - PyErr_SetString(PyExc_ValueError, "None passed as proxy checker"); - return NULL; - } - - self = (SecurityProxy *)type->tp_alloc(type, 0); - if (self == NULL) - return NULL; - Py_INCREF(object); - Py_INCREF(checker); - self->proxy.proxy_object = object; - self->proxy_checker = checker; - return (PyObject *)self; -} - -/* This is needed to avoid calling the base class tp_init, which we - don't need. */ -static int -proxy_init(PyObject *self, PyObject *args, PyObject *kw) -{ - return 0; -} - -static int -proxy_clear(SecurityProxy *self) -{ - CLEAR(self->proxy_checker); - SecurityProxyType.tp_base->tp_clear((PyObject*)self); - return 0; -} - -static void -proxy_dealloc(SecurityProxy *self) -{ - proxy_clear(self); - SecurityProxyType.tp_base->tp_dealloc((PyObject*)self); -} - -static int -proxy_traverse(SecurityProxy *self, visitproc visit, void *arg) -{ - if (visit(self->proxy.proxy_object, arg) < 0) - return -1; - if (visit(self->proxy_checker, arg) < 0) - return -1; - return 0; -} - -static PyObject * -proxy_richcompare(SecurityProxy* self, PyObject* other, int op) -{ - PyObject *result = NULL; - - result = PyObject_RichCompare(self->proxy.proxy_object, other, op); - if (result == Py_True || result == Py_False) - return result; - PROXY_RESULT(self, result); - return result; -} - -static PyObject * -proxy_iter(SecurityProxy *self) -{ - PyObject *result = NULL; - - if (check(self, str_check, str___iter__) >= 0) - { - result = PyObject_GetIter(self->proxy.proxy_object); - PROXY_RESULT(self, result); - } - return result; -} - -static PyObject * -proxy_iternext(SecurityProxy *self) -{ - PyObject *result = NULL; - - if (check(self, str_check_getattr, str_next) >= 0) - { - result = PyIter_Next(self->proxy.proxy_object); - PROXY_RESULT(self, result); - } - return result; -} - -static PyObject * -proxy_getattro(SecurityProxy *self, PyObject *name) -{ - PyObject *result = NULL; - - if (check(self, str_check_getattr, name) >= 0) - { - result = PyObject_GetAttr(self->proxy.proxy_object, name); - PROXY_RESULT(self, result); - } - return result; -} - -static int -proxy_setattro(SecurityProxy *self, PyObject *name, PyObject *value) -{ - if (check(self, str_check_setattr, name) >= 0) - return PyObject_SetAttr(self->proxy.proxy_object, name, value); - return -1; -} - -static PyObject * -default_repr(PyObject *object) -{ - PyObject *klass, *name = 0, *module = 0, *result = 0; - char *sname, *smodule; - - klass = PyObject_GetAttr(object, __class__str); - if (klass == NULL) - return NULL; - - name = PyObject_GetAttr(klass, __name__str); - if (name == NULL) - goto err; - sname = PyString_AsString(name); - if (sname == NULL) - goto err; - - module = PyObject_GetAttr(klass, __module__str); - if (module != NULL) { - smodule = PyString_AsString(module); - if (smodule == NULL) - goto err; - result = PyString_FromFormat("<security proxied %s.%s instance at %p>", - smodule, sname, object); - } - else { - PyErr_Clear(); - result = PyString_FromFormat("<security proxied %s instance at %p>", - sname, object); - } - - err: - Py_DECREF(klass); - Py_XDECREF(name); - Py_XDECREF(module); - - return result; -} - -static PyObject * -proxy_str(SecurityProxy *self) -{ - PyObject *result = NULL; - - if (check(self, str_check, str___str__) >= 0) - { - result = PyObject_Str(self->proxy.proxy_object); - } - else - { - PyErr_Clear(); - result = default_repr(self->proxy.proxy_object); - } - return result; -} - -static PyObject * -proxy_repr(SecurityProxy *self) -{ - PyObject *result = NULL; - - if (check(self, str_check, str___repr__) >= 0) { - result = PyObject_Repr(self->proxy.proxy_object); - } - else { - PyErr_Clear(); - result = default_repr(self->proxy.proxy_object); - } - return result; -} - -static int -proxy_compare(SecurityProxy *self, PyObject *other) -{ - return PyObject_Compare(self->proxy.proxy_object, other); -} - -static long -proxy_hash(SecurityProxy *self) -{ - return PyObject_Hash(self->proxy.proxy_object); -} - -static PyObject * -proxy_call(SecurityProxy *self, PyObject *args, PyObject *kwds) -{ - PyObject *result = NULL; - - if (check(self, str_check, str___call__) >= 0) - { - result = PyObject_Call(self->proxy.proxy_object, args, kwds); - PROXY_RESULT(self, result); - } - return result; -} - -/* - * Number methods. - */ - -#define NUMBER_METHOD(M) \ -static PyObject * \ -call_##M(PyObject *self) \ -{ \ - PyNumberMethods *nb = self->ob_type->tp_as_number; \ - if (nb == NULL || nb->nb_##M == NULL) { \ - PyErr_SetString(PyExc_TypeError, \ - "object can't be converted to " #M); \ - return NULL; \ - } \ - return nb->nb_##M(self); \ -} - -NUMBER_METHOD(int) -NUMBER_METHOD(long) -NUMBER_METHOD(float) -NUMBER_METHOD(oct) -NUMBER_METHOD(hex) - -static PyObject * -call_ipow(PyObject *self, PyObject *other) -{ - /* PyNumber_InPlacePower has three args. How silly. :-) */ - return PyNumber_InPlacePower(self, other, Py_None); -} - -BINOP(add, PyNumber_Add) -BINOP(sub, PyNumber_Subtract) -BINOP(mul, PyNumber_Multiply) -BINOP(div, PyNumber_Divide) -BINOP(mod, PyNumber_Remainder) -BINOP(divmod, PyNumber_Divmod) - -static PyObject * -proxy_pow(PyObject *self, PyObject *other, PyObject *modulus) -{ - PyObject *result = NULL; - - if (Proxy_Check(self)) - { - if (check((SecurityProxy*)self, str_check, str___pow__) >= 0) - { - result = PyNumber_Power(((SecurityProxy*)self)->proxy.proxy_object, - other, modulus); - PROXY_RESULT(((SecurityProxy*)self), result); - } - } - else if (Proxy_Check(other)) - { - if (check((SecurityProxy*)other, str_check, str___rpow__) >= 0) - { - result = PyNumber_Power(self, - ((SecurityProxy*)other)->proxy.proxy_object, - modulus); - PROXY_RESULT(((SecurityProxy*)other), result); - } - } - else if (modulus != NULL && Proxy_Check(modulus)) - { - if (check((SecurityProxy*)modulus, str_check, str___3pow__) >= 0) - { - result = PyNumber_Power(self, other, - ((SecurityProxy*)modulus)->proxy.proxy_object); - PROXY_RESULT(((SecurityProxy*)modulus), result); - } - } - else { - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - return result; -} - -BINOP(lshift, PyNumber_Lshift) -BINOP(rshift, PyNumber_Rshift) -BINOP(and, PyNumber_And) -BINOP(xor, PyNumber_Xor) -BINOP(or, PyNumber_Or) - -static int -proxy_coerce(PyObject **p_self, PyObject **p_other) -{ - PyObject *self = *p_self; - PyObject *other = *p_other; - - assert(Proxy_Check(self)); - - if (check((SecurityProxy*)self, str_check, str___coerce__) >= 0) - { - PyObject *left = ((SecurityProxy*)self)->proxy.proxy_object; - PyObject *right = other; - int r; - r = PyNumber_CoerceEx(&left, &right); - if (r != 0) - return r; - /* Now left and right have been INCREF'ed. - Any new value that comes out is proxied; - any unchanged value is left unchanged. */ - if (left == ((SecurityProxy*)self)->proxy.proxy_object) { - /* Keep the old proxy */ - Py_DECREF(left); - Py_INCREF(self); - left = self; - } - else { - PROXY_RESULT(((SecurityProxy*)self), left); - if (left == NULL) { - Py_DECREF(right); - return -1; - } - } - if (right != other) { - PROXY_RESULT(((SecurityProxy*)self), right); - if (right == NULL) { - Py_DECREF(left); - return -1; - } - } - *p_self = left; - *p_other = right; - return 0; - } - return -1; -} - -UNOP(neg, PyNumber_Negative) -UNOP(pos, PyNumber_Positive) -UNOP(abs, PyNumber_Absolute) - -static int -proxy_nonzero(PyObject *self) -{ - return PyObject_IsTrue(((SecurityProxy*)self)->proxy.proxy_object); -} - -UNOP(invert, PyNumber_Invert) -UNOP(int, call_int) -UNOP(long, call_long) -UNOP(float, call_float) -UNOP(oct, call_oct) -UNOP(hex, call_hex) - -INPLACE(add, PyNumber_InPlaceAdd) -INPLACE(sub, PyNumber_InPlaceSubtract) -INPLACE(mul, PyNumber_InPlaceMultiply) -INPLACE(div, PyNumber_InPlaceDivide) -INPLACE(mod, PyNumber_InPlaceRemainder) -INPLACE(pow, call_ipow) -INPLACE(lshift, PyNumber_InPlaceLshift) -INPLACE(rshift, PyNumber_InPlaceRshift) -INPLACE(and, PyNumber_InPlaceAnd) -INPLACE(xor, PyNumber_InPlaceXor) -INPLACE(or, PyNumber_InPlaceOr) - -BINOP(floordiv, PyNumber_FloorDivide) -BINOP(truediv, PyNumber_TrueDivide) -INPLACE(floordiv, PyNumber_InPlaceFloorDivide) -INPLACE(truediv, PyNumber_InPlaceTrueDivide) - -/* - * Sequence methods. - */ - -static int -proxy_length(SecurityProxy *self) -{ - if (check(self, str_check, str___len__) >= 0) - return PyObject_Length(self->proxy.proxy_object); - return -1; -} - -/* sq_item and sq_ass_item may be called by PySequece_{Get,Set}Item(). */ -static PyObject *proxy_getitem(SecurityProxy *, PyObject *); -static int proxy_setitem(SecurityProxy *, PyObject *, PyObject *); - -static PyObject * -proxy_igetitem(SecurityProxy *self, int i) -{ - PyObject *key = PyInt_FromLong(i); - PyObject *res = NULL; - - if (key != NULL) { - res = proxy_getitem(self, key); - Py_DECREF(key); - } - return res; -} - - -static int -proxy_isetitem(SecurityProxy *self, int i, PyObject *value) -{ - PyObject *key = PyInt_FromLong(i); - int res = -1; - - if (key != NULL) { - res = proxy_setitem(self, key, value); - Py_DECREF(key); - } - return res; -} - -static PyObject * -proxy_slice(SecurityProxy *self, int start, int end) -{ - PyObject *result = NULL; - - if (check(self, str_check, str___getslice__) >= 0) { - result = PySequence_GetSlice(self->proxy.proxy_object, start, end); - PROXY_RESULT(self, result); - } - return result; -} - -static int -proxy_ass_slice(SecurityProxy *self, int i, int j, PyObject *value) -{ - if (check(self, str_check, str___setslice__) >= 0) - return PySequence_SetSlice(self->proxy.proxy_object, i, j, value); - return -1; -} - -static int -proxy_contains(SecurityProxy *self, PyObject *value) -{ - if (check(self, str_check, str___contains__) >= 0) - return PySequence_Contains(self->proxy.proxy_object, value); - return -1; -} - -/* - * Mapping methods. - */ - -static PyObject * -proxy_getitem(SecurityProxy *self, PyObject *key) -{ - PyObject *result = NULL; - - if (check(self, str_check, str___getitem__) >= 0) - { - result = PyObject_GetItem(self->proxy.proxy_object, key); - PROXY_RESULT(self, result); - } - return result; -} - -static int -proxy_setitem(SecurityProxy *self, PyObject *key, PyObject *value) -{ - if (value == NULL) { - if (check(self, str_check, str___delitem__) >= 0) - return PyObject_DelItem(self->proxy.proxy_object, key); - } - else { - if (check(self, str_check, str___setitem__) >= 0) - return PyObject_SetItem(self->proxy.proxy_object, key, value); - } - return -1; -} - -/* - * Normal methods. - */ - -static PyNumberMethods -proxy_as_number = { - proxy_add, /* nb_add */ - proxy_sub, /* nb_subtract */ - proxy_mul, /* nb_multiply */ - proxy_div, /* nb_divide */ - proxy_mod, /* nb_remainder */ - proxy_divmod, /* nb_divmod */ - proxy_pow, /* nb_power */ - proxy_neg, /* nb_negative */ - proxy_pos, /* nb_positive */ - proxy_abs, /* nb_absolute */ - proxy_nonzero, /* nb_nonzero */ - proxy_invert, /* nb_invert */ - proxy_lshift, /* nb_lshift */ - proxy_rshift, /* nb_rshift */ - proxy_and, /* nb_and */ - proxy_xor, /* nb_xor */ - proxy_or, /* nb_or */ - proxy_coerce, /* nb_coerce */ - proxy_int, /* nb_int */ - proxy_long, /* nb_long */ - proxy_float, /* nb_float */ - proxy_oct, /* nb_oct */ - proxy_hex, /* nb_hex */ - - /* Added in release 2.0 */ - /* These require the Py_TPFLAGS_HAVE_INPLACEOPS flag */ - proxy_iadd, /* nb_inplace_add */ - proxy_isub, /* nb_inplace_subtract */ - proxy_imul, /* nb_inplace_multiply */ - proxy_idiv, /* nb_inplace_divide */ - proxy_imod, /* nb_inplace_remainder */ - (ternaryfunc)proxy_ipow, /* nb_inplace_power */ - proxy_ilshift, /* nb_inplace_lshift */ - proxy_irshift, /* nb_inplace_rshift */ - proxy_iand, /* nb_inplace_and */ - proxy_ixor, /* nb_inplace_xor */ - proxy_ior, /* nb_inplace_or */ - - /* Added in release 2.2 */ - /* These require the Py_TPFLAGS_HAVE_CLASS flag */ - proxy_floordiv, /* nb_floor_divide */ - proxy_truediv, /* nb_true_divide */ - proxy_ifloordiv, /* nb_inplace_floor_divide */ - proxy_itruediv, /* nb_inplace_true_divide */ -}; - -static PySequenceMethods -proxy_as_sequence = { - (inquiry)proxy_length, /* sq_length */ - 0, /* sq_concat */ - 0, /* sq_repeat */ - (intargfunc)proxy_igetitem, /* sq_item */ - (intintargfunc)proxy_slice, /* sq_slice */ - (intobjargproc)proxy_isetitem, /* sq_ass_item */ - (intintobjargproc)proxy_ass_slice, /* sq_ass_slice */ - (objobjproc)proxy_contains, /* sq_contains */ -}; - -static PyMappingMethods -proxy_as_mapping = { - (inquiry)proxy_length, /* mp_length */ - (binaryfunc)proxy_getitem, /* mp_subscript */ - (objobjargproc)proxy_setitem, /* mp_ass_subscript */ -}; - -static char proxy_doc[] = "\ -Security proxy class. Constructor: _Proxy(object, checker)\n\ -where 'object' is an arbitrary object, and 'checker' is an object\n\ -whose signature is described by the IChecker interface.\n\ -A checker should have the following methods:\n\ - check(object, operation) # operation is e.g. '__add__' or '__hash__'\n\ - check_getattr(object, name)\n\ - check_setattr(object, name)\n\ - proxy(object)\n\ -The check methods should raise an exception if the operation is\n\ -disallowed. The proxy method should return a proxy for the object\n\ -if one is needed, otherwise the object itself.\n\ -"; - -statichere PyTypeObject -SecurityProxyType = { - PyObject_HEAD_INIT(NULL) - 0, - "zope.security._proxy._Proxy", - sizeof(SecurityProxy), - 0, - (destructor)proxy_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - (cmpfunc)proxy_compare, /* tp_compare */ - (reprfunc)proxy_repr, /* tp_repr */ - &proxy_as_number, /* tp_as_number */ - &proxy_as_sequence, /* tp_as_sequence */ - &proxy_as_mapping, /* tp_as_mapping */ - (hashfunc)proxy_hash, /* tp_hash */ - (ternaryfunc)proxy_call, /* tp_call */ - (reprfunc)proxy_str, /* tp_str */ - (getattrofunc)proxy_getattro, /* tp_getattro */ - (setattrofunc)proxy_setattro, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_HAVE_GC, /* tp_flags */ - proxy_doc, /* tp_doc */ - (traverseproc)proxy_traverse, /* tp_traverse */ - 0, /* tp_clear */ - (richcmpfunc)proxy_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)proxy_iter, /* tp_iter */ - (iternextfunc)proxy_iternext, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - proxy_init, /* tp_init */ - 0, /*PyType_GenericAlloc,*/ /* tp_alloc */ - proxy_new, /* tp_new */ - 0, /*_PyObject_GC_Del,*/ /* tp_free */ -}; - -static PyObject * -module_getChecker(PyObject *self, PyObject *arg) -{ - PyObject *result; - - if (!Proxy_Check(arg)) { - PyErr_SetString(PyExc_TypeError, - "getChecker argument must be a _Proxy"); - return NULL; - } - result = ((SecurityProxy*)arg)->proxy_checker; - Py_INCREF(result); - return result; -} - -static PyObject * -module_getObject(PyObject *self, PyObject *arg) -{ - PyObject *result; - - if (!Proxy_Check(arg)) - result = arg; - else - result = ((SecurityProxy*)arg)->proxy.proxy_object; - - Py_INCREF(result); - return result; -} - -static PyMethodDef -module_functions[] = { - {"getChecker", module_getChecker, METH_O, "get checker from proxy"}, - {"getObject", module_getObject, METH_O, - "Get the proxied object\n\nReturn the original object if not proxied."}, - {NULL} -}; - -static char -module___doc__[] = "Security proxy implementation."; - -void -init_proxy(void) -{ - PyObject *m; - - if (Proxy_Import() < 0) - return; - -#define INIT_STRING(S) \ -if((str_##S = PyString_InternFromString(#S)) == NULL) return -#define INIT_STRING_OP(S) \ -if((str_op_##S = PyString_InternFromString("__" #S "__")) == NULL) return - - INIT_STRING(__3pow__); - INIT_STRING(__call__); - INIT_STRING(check); - INIT_STRING(check_getattr); - INIT_STRING(check_setattr); - INIT_STRING(__cmp__); - INIT_STRING(__coerce__); - INIT_STRING(__contains__); - INIT_STRING(__delitem__); - INIT_STRING(__getitem__); - INIT_STRING(__getslice__); - INIT_STRING(__hash__); - INIT_STRING(__iter__); - INIT_STRING(__len__); - INIT_STRING(next); - INIT_STRING(__nonzero__); - INIT_STRING_OP(abs); - INIT_STRING_OP(add); - INIT_STRING_OP(and); - INIT_STRING_OP(div); - INIT_STRING_OP(divmod); - INIT_STRING_OP(float); - INIT_STRING_OP(floordiv); - INIT_STRING_OP(hex); - INIT_STRING_OP(iadd); - INIT_STRING_OP(iand); - INIT_STRING_OP(idiv); - INIT_STRING_OP(ifloordiv); - INIT_STRING_OP(ilshift); - INIT_STRING_OP(imod); - INIT_STRING_OP(imul); - INIT_STRING_OP(int); - INIT_STRING_OP(invert); - INIT_STRING_OP(ior); - INIT_STRING_OP(ipow); - INIT_STRING_OP(irshift); - INIT_STRING_OP(isub); - INIT_STRING_OP(itruediv); - INIT_STRING_OP(ixor); - INIT_STRING_OP(long); - INIT_STRING_OP(lshift); - INIT_STRING_OP(mod); - INIT_STRING_OP(mul); - INIT_STRING_OP(neg); - INIT_STRING_OP(oct); - INIT_STRING_OP(or); - INIT_STRING_OP(pos); - INIT_STRING_OP(radd); - INIT_STRING_OP(rand); - INIT_STRING_OP(rdiv); - INIT_STRING_OP(rdivmod); - INIT_STRING_OP(rfloordiv); - INIT_STRING_OP(rlshift); - INIT_STRING_OP(rmod); - INIT_STRING_OP(rmul); - INIT_STRING_OP(ror); - INIT_STRING_OP(rrshift); - INIT_STRING_OP(rshift); - INIT_STRING_OP(rsub); - INIT_STRING_OP(rtruediv); - INIT_STRING_OP(rxor); - INIT_STRING_OP(sub); - INIT_STRING_OP(truediv); - INIT_STRING_OP(xor); - INIT_STRING(__pow__); - INIT_STRING(proxy); - INIT_STRING(__repr__); - INIT_STRING(__rpow__); - INIT_STRING(__setitem__); - INIT_STRING(__setslice__); - INIT_STRING(__str__); - - - __class__str = PyString_FromString("__class__"); - if (! __class__str) return; - - __name__str = PyString_FromString("__name__"); - if (! __name__str) return; - - __module__str = PyString_FromString("__module__"); - if (! __module__str) return; - - SecurityProxyType.ob_type = &PyType_Type; - SecurityProxyType.tp_alloc = PyType_GenericAlloc; - SecurityProxyType.tp_free = _PyObject_GC_Del; - SecurityProxyType.tp_base = &ProxyType; - if (PyType_Ready(&SecurityProxyType) < 0) - return; - - m = Py_InitModule3("_proxy", module_functions, module___doc__); - if (m == NULL) - return; - - Py_INCREF(&SecurityProxyType); - PyModule_AddObject(m, "_Proxy", (PyObject *)&SecurityProxyType); -} |