2002-04-14 13:04:12 +04:00
/*
Python wrappers for DCERPC / SMB client routines .
Copyright ( C ) Tim Potter , 2002
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program 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 General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2003-02-20 01:47:49 +03:00
# include "python/py_common.h"
2002-04-14 13:04:12 +04:00
/* Convert a SID to a Python dict */
BOOL py_from_SID ( PyObject * * obj , DOM_SID * sid )
{
fstring sidstr ;
if ( ! sid ) {
Py_INCREF ( Py_None ) ;
* obj = Py_None ;
return True ;
}
if ( ! sid_to_string ( sidstr , sid ) )
return False ;
* obj = PyString_FromString ( sidstr ) ;
return True ;
}
2002-04-18 07:35:05 +04:00
BOOL py_to_SID ( DOM_SID * sid , PyObject * obj )
2002-04-14 13:04:12 +04:00
{
2002-04-18 07:35:05 +04:00
if ( ! PyString_Check ( obj ) )
return False ;
2002-05-01 08:19:22 +04:00
return string_to_sid ( sid , PyString_AsString ( obj ) ) ;
2002-04-14 13:04:12 +04:00
}
BOOL py_from_ACE ( PyObject * * dict , SEC_ACE * ace )
{
PyObject * obj ;
if ( ! ace ) {
Py_INCREF ( Py_None ) ;
* dict = Py_None ;
return True ;
}
2003-07-29 04:15:23 +04:00
* dict = Py_BuildValue ( " {sisisi} " , " type " , ace - > type ,
" flags " , ace - > flags ,
2006-09-22 03:10:40 +04:00
" mask " , ace - > access_mask ) ;
2002-04-14 13:04:12 +04:00
2003-07-29 04:15:23 +04:00
if ( py_from_SID ( & obj , & ace - > trustee ) ) {
2002-04-14 13:04:12 +04:00
PyDict_SetItemString ( * dict , " trustee " , obj ) ;
2003-07-29 04:15:23 +04:00
Py_DECREF ( obj ) ;
}
2002-04-14 13:04:12 +04:00
return True ;
}
BOOL py_to_ACE ( SEC_ACE * ace , PyObject * dict )
{
2002-04-18 07:35:05 +04:00
PyObject * obj ;
uint8 ace_type , ace_flags ;
DOM_SID trustee ;
SEC_ACCESS sec_access ;
if ( ! PyDict_Check ( dict ) )
return False ;
if ( ! ( obj = PyDict_GetItemString ( dict , " type " ) ) | |
! PyInt_Check ( obj ) )
return False ;
ace_type = PyInt_AsLong ( obj ) ;
if ( ! ( obj = PyDict_GetItemString ( dict , " flags " ) ) | |
! PyInt_Check ( obj ) )
return False ;
ace_flags = PyInt_AsLong ( obj ) ;
if ( ! ( obj = PyDict_GetItemString ( dict , " trustee " ) ) | |
! PyString_Check ( obj ) )
return False ;
if ( ! py_to_SID ( & trustee , obj ) )
return False ;
if ( ! ( obj = PyDict_GetItemString ( dict , " mask " ) ) | |
! PyInt_Check ( obj ) )
return False ;
2006-09-22 03:10:40 +04:00
sec_access = PyInt_AsLong ( obj ) ;
2002-04-18 07:35:05 +04:00
init_sec_ace ( ace , & trustee , ace_type , sec_access , ace_flags ) ;
2002-05-01 08:19:22 +04:00
/* Fill in size field */
ace - > size = SEC_ACE_HEADER_SIZE + sid_size ( & trustee ) ;
2002-04-18 07:35:05 +04:00
return True ;
2002-04-14 13:04:12 +04:00
}
BOOL py_from_ACL ( PyObject * * dict , SEC_ACL * acl )
{
PyObject * ace_list ;
int i ;
if ( ! acl ) {
Py_INCREF ( Py_None ) ;
* dict = Py_None ;
return True ;
}
ace_list = PyList_New ( acl - > num_aces ) ;
for ( i = 0 ; i < acl - > num_aces ; i + + ) {
PyObject * obj ;
2006-09-22 03:10:40 +04:00
if ( py_from_ACE ( & obj , & acl - > aces [ i ] ) )
2002-04-14 13:04:12 +04:00
PyList_SetItem ( ace_list , i , obj ) ;
}
2003-07-29 04:15:23 +04:00
* dict = Py_BuildValue ( " {sisN} " , " revision " , acl - > revision ,
" ace_list " , ace_list ) ;
2002-04-14 13:04:12 +04:00
return True ;
}
2002-04-18 07:35:05 +04:00
BOOL py_to_ACL ( SEC_ACL * acl , PyObject * dict , TALLOC_CTX * mem_ctx )
2002-04-14 13:04:12 +04:00
{
2002-04-18 07:35:05 +04:00
PyObject * obj ;
uint32 i ;
if ( ! ( obj = PyDict_GetItemString ( dict , " revision " ) ) | |
! PyInt_Check ( obj ) )
return False ;
acl - > revision = PyInt_AsLong ( obj ) ;
if ( ! ( obj = PyDict_GetItemString ( dict , " ace_list " ) ) | |
! PyList_Check ( obj ) )
return False ;
acl - > num_aces = PyList_Size ( obj ) ;
2007-04-28 03:18:41 +04:00
acl - > aces = TALLOC_ARRAY ( mem_ctx , struct security_ace , acl - > num_aces ) ;
2002-05-01 08:19:22 +04:00
acl - > size = SEC_ACL_HEADER_SIZE ;
2002-04-18 07:35:05 +04:00
for ( i = 0 ; i < acl - > num_aces ; i + + ) {
PyObject * py_ace = PyList_GetItem ( obj , i ) ;
2006-09-22 03:10:40 +04:00
if ( ! py_to_ACE ( & acl - > aces [ i ] , py_ace ) )
2002-04-18 07:35:05 +04:00
return False ;
2006-09-22 03:10:40 +04:00
acl - > size + = acl - > aces [ i ] . size ;
2002-04-18 07:35:05 +04:00
}
return True ;
2002-04-14 13:04:12 +04:00
}
BOOL py_from_SECDESC ( PyObject * * dict , SEC_DESC * sd )
{
PyObject * obj ;
* dict = PyDict_New ( ) ;
2003-07-29 04:15:23 +04:00
obj = PyInt_FromLong ( sd - > revision ) ;
PyDict_SetItemString ( * dict , " revision " , obj ) ;
Py_DECREF ( obj ) ;
2002-04-14 13:04:12 +04:00
2004-10-06 06:05:39 +04:00
obj = PyInt_FromLong ( sd - > type ) ;
PyDict_SetItemString ( * dict , " type " , obj ) ;
Py_DECREF ( obj ) ;
2003-07-29 04:15:23 +04:00
if ( py_from_SID ( & obj , sd - > owner_sid ) ) {
2002-04-14 13:04:12 +04:00
PyDict_SetItemString ( * dict , " owner_sid " , obj ) ;
2003-07-29 04:15:23 +04:00
Py_DECREF ( obj ) ;
}
2002-04-14 13:04:12 +04:00
2006-09-22 03:10:40 +04:00
if ( py_from_SID ( & obj , sd - > group_sid ) ) {
2002-04-14 13:04:12 +04:00
PyDict_SetItemString ( * dict , " group_sid " , obj ) ;
2003-07-29 04:15:23 +04:00
Py_DECREF ( obj ) ;
}
2002-04-14 13:04:12 +04:00
2003-07-29 04:15:23 +04:00
if ( py_from_ACL ( & obj , sd - > dacl ) ) {
2002-04-14 13:04:12 +04:00
PyDict_SetItemString ( * dict , " dacl " , obj ) ;
2003-07-29 04:15:23 +04:00
Py_DECREF ( obj ) ;
}
2002-04-14 13:04:12 +04:00
2003-07-29 04:15:23 +04:00
if ( py_from_ACL ( & obj , sd - > sacl ) ) {
2002-04-14 13:04:12 +04:00
PyDict_SetItemString ( * dict , " sacl " , obj ) ;
2003-07-29 04:15:23 +04:00
Py_DECREF ( obj ) ;
}
2002-04-14 13:04:12 +04:00
return True ;
}
2002-04-18 07:35:05 +04:00
BOOL py_to_SECDESC ( SEC_DESC * * sd , PyObject * dict , TALLOC_CTX * mem_ctx )
2002-04-14 13:04:12 +04:00
{
2002-04-18 07:35:05 +04:00
PyObject * obj ;
uint16 revision ;
2004-10-06 06:05:39 +04:00
uint16 type = SEC_DESC_SELF_RELATIVE ;
2002-04-18 07:35:05 +04:00
DOM_SID owner_sid , group_sid ;
SEC_ACL sacl , dacl ;
BOOL got_dacl = False , got_sacl = False ;
2002-05-01 08:19:22 +04:00
BOOL got_owner_sid = False , got_group_sid = False ;
2002-04-18 07:35:05 +04:00
ZERO_STRUCT ( dacl ) ; ZERO_STRUCT ( sacl ) ;
ZERO_STRUCT ( owner_sid ) ; ZERO_STRUCT ( group_sid ) ;
if ( ! ( obj = PyDict_GetItemString ( dict , " revision " ) ) )
return False ;
revision = PyInt_AsLong ( obj ) ;
2004-10-06 06:05:39 +04:00
if ( ( obj = PyDict_GetItemString ( dict , " type " ) ) ) {
if ( obj ! = Py_None ) {
type = PyInt_AsLong ( obj ) ;
}
}
2002-05-01 08:19:22 +04:00
if ( ( obj = PyDict_GetItemString ( dict , " owner_sid " ) ) ) {
2002-04-18 07:35:05 +04:00
2002-05-01 08:19:22 +04:00
if ( obj ! = Py_None ) {
2002-04-18 07:35:05 +04:00
2002-05-01 08:19:22 +04:00
if ( ! py_to_SID ( & owner_sid , obj ) )
return False ;
2002-04-18 07:35:05 +04:00
2002-05-01 08:19:22 +04:00
got_owner_sid = True ;
}
}
2002-04-18 07:35:05 +04:00
2002-05-01 08:19:22 +04:00
if ( ( obj = PyDict_GetItemString ( dict , " group_sid " ) ) ) {
2002-04-18 07:35:05 +04:00
2002-05-01 08:19:22 +04:00
if ( obj ! = Py_None ) {
2002-04-18 07:35:05 +04:00
2002-05-01 08:19:22 +04:00
if ( ! py_to_SID ( & group_sid , obj ) )
return False ;
got_group_sid = True ;
}
2002-04-18 07:35:05 +04:00
}
2002-05-01 08:19:22 +04:00
if ( ( obj = PyDict_GetItemString ( dict , " dacl " ) ) ) {
if ( obj ! = Py_None ) {
if ( ! py_to_ACL ( & dacl , obj , mem_ctx ) )
return False ;
got_dacl = True ;
}
}
2002-04-18 07:35:05 +04:00
if ( ( obj = PyDict_GetItemString ( dict , " sacl " ) ) ) {
2002-05-01 08:19:22 +04:00
2002-04-18 07:35:05 +04:00
if ( obj ! = Py_None ) {
if ( ! py_to_ACL ( & sacl , obj , mem_ctx ) )
return False ;
got_sacl = True ;
}
}
2002-05-08 08:19:52 +04:00
#if 0 /* For new secdesc code */
2002-05-01 08:19:22 +04:00
* sd = make_sec_desc ( mem_ctx , revision ,
got_owner_sid ? & owner_sid : NULL ,
got_group_sid ? & group_sid : NULL ,
2002-04-18 07:35:05 +04:00
got_sacl ? & sacl : NULL ,
2002-05-01 08:19:22 +04:00
got_dacl ? & dacl : NULL ) ;
2002-05-08 08:19:52 +04:00
# else
{
size_t sd_size ;
2004-10-06 06:05:39 +04:00
* sd = make_sec_desc ( mem_ctx , revision , type ,
2002-05-08 08:19:52 +04:00
got_owner_sid ? & owner_sid : NULL ,
got_group_sid ? & group_sid : NULL ,
got_sacl ? & sacl : NULL ,
got_dacl ? & dacl : NULL , & sd_size ) ;
}
# endif
2002-04-18 07:35:05 +04:00
return True ;
2002-04-14 13:04:12 +04:00
}