Thread: [Pyobjc-dev] Calling SMJobBless with valid AuthorizationRef
Brought to you by:
ronaldoussoren
From: Kunal P. <kun...@gm...> - 2012-11-05 01:59:14
|
I'm getting an error when calling SMJobBless - "ValueError: depythonifying 'pointer', got 'LP_c_void_p'". I've tried a few things without luck. Any help will be appreciated. Here's my code - from ServiceManagement import ( kSMDomainSystemLaunchd, SMJobBless, ) security = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Security')) class AuthorizationItem(ctypes.Structure): _fields_ = [ ('name', ctypes.c_char_p), ('valueLength', ctypes.c_uint32), ('value', ctypes.c_void_p), ('flags', ctypes.c_uint32), ] class AuthorizationRights(ctypes.Structure): _fields_ = [ ('count', ctypes.c_uint32), ('items', ctypes.POINTER(AuthorizationItem)), ] authorization_item = AuthorizationItem( name='com.apple.ServiceManagement.blesshelper', valueLength=0, value=None, flags=0, ) authorization_rights = AuthorizationRights( count=1, items=ctypes.pointer(authorization_item), ) authorization_flags = 19 authorization_ref = ctypes.POINTER(ctypes.c_void_p)() status = security.AuthorizationCreate( ctypes.pointer(authorization_rights), None, authorization_flags, ctypes.pointer(authorization_ref), ) SMJobBless( kSMDomainSystemLaunchd, 'app.helper', authorization_ref, None, ) |
From: Ronald O. <ron...@ma...> - 2012-11-05 09:57:15
|
On 5 Nov, 2012, at 2:59, Kunal Parmar <kun...@gm...> wrote: > I'm getting an error when calling SMJobBless - "ValueError: depythonifying 'pointer', got 'LP_c_void_p'". I've tried a few things without luck. Any help will be appreciated. It's currently not easily possible to use ctypes with PyObjC, I've filed an issue in my bitbucket about adding ctypes support to pyobjc <https://bitbucket.org/ronaldoussoren/pyobjc/issue/23/add-ctypes-support>. Anoyingly the Security framework is not easily wrapped using the normal PyObjC mechanism's either, in particular support for C structs that contain pointers is lacking right now. I'll have to experiment a little to see if I can get your example to work properly using some other hacks. Ronald > > Here's my code - > > from ServiceManagement import ( > kSMDomainSystemLaunchd, > SMJobBless, > ) > > security = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Security')) > > class AuthorizationItem(ctypes.Structure): > _fields_ = [ > ('name', ctypes.c_char_p), > ('valueLength', ctypes.c_uint32), > ('value', ctypes.c_void_p), > ('flags', ctypes.c_uint32), > ] > > class AuthorizationRights(ctypes.Structure): > _fields_ = [ > ('count', ctypes.c_uint32), > ('items', ctypes.POINTER(AuthorizationItem)), > ] > > authorization_item = AuthorizationItem( > name='com.apple.ServiceManagement.blesshelper', > valueLength=0, > value=None, > flags=0, > ) > authorization_rights = AuthorizationRights( > count=1, > items=ctypes.pointer(authorization_item), > ) > authorization_flags = 19 > authorization_ref = ctypes.POINTER(ctypes.c_void_p)() > status = security.AuthorizationCreate( > ctypes.pointer(authorization_rights), > None, > authorization_flags, > ctypes.pointer(authorization_ref), > ) > SMJobBless( > kSMDomainSystemLaunchd, > 'app.helper', > authorization_ref, > None, > ) > ------------------------------------------------------------------------------ > LogMeIn Central: Instant, anywhere, Remote PC access and management. > Stay in control, update software, and manage PCs from one command center > Diagnose problems and improve visibility into emerging IT issues > Automate, monitor and manage. Do more in less time with Central > http://p.sf.net/sfu/logmein12331_d2d_______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev |
From: Michael M. <mic...@gm...> - 2012-11-05 16:16:15
|
Hi Kunal, I recently wrote some code to call SMJobBless and SMJobRemove using only ctypes. This was lots of boilerplate but works reliably. It's GPL, so you can see the code here: http://bazaar.launchpad.net/~ubuntuone-control-tower/ubuntuone-control-panel/trunk/view/head:/ubuntuone/controlpanel/utils/darwin.py Please feel free to ask me if you have any questions. -mike On Mon, Nov 5, 2012 at 1:56 AM, Ronald Oussoren <ron...@ma...>wrote: > > On 5 Nov, 2012, at 2:59, Kunal Parmar <kun...@gm...> wrote: > > > I'm getting an error when calling SMJobBless - "ValueError: > depythonifying 'pointer', got 'LP_c_void_p'". I've tried a few things > without luck. Any help will be appreciated. > > It's currently not easily possible to use ctypes with PyObjC, I've filed > an issue in my bitbucket about adding ctypes support to pyobjc < > https://bitbucket.org/ronaldoussoren/pyobjc/issue/23/add-ctypes-support>. > > Anoyingly the Security framework is not easily wrapped using the normal > PyObjC mechanism's either, in particular support for C structs that contain > pointers is lacking right now. I'll have to experiment a little to see if I > can get your example to work properly using some other hacks. > > Ronald > > > > > > Here's my code - > > > > from ServiceManagement import ( > > kSMDomainSystemLaunchd, > > SMJobBless, > > ) > > > > security = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Security')) > > > > class AuthorizationItem(ctypes.Structure): > > _fields_ = [ > > ('name', ctypes.c_char_p), > > ('valueLength', ctypes.c_uint32), > > ('value', ctypes.c_void_p), > > ('flags', ctypes.c_uint32), > > ] > > > > class AuthorizationRights(ctypes.Structure): > > _fields_ = [ > > ('count', ctypes.c_uint32), > > ('items', ctypes.POINTER(AuthorizationItem)), > > ] > > > > authorization_item = AuthorizationItem( > > name='com.apple.ServiceManagement.blesshelper', > > valueLength=0, > > value=None, > > flags=0, > > ) > > authorization_rights = AuthorizationRights( > > count=1, > > items=ctypes.pointer(authorization_item), > > ) > > authorization_flags = 19 > > authorization_ref = ctypes.POINTER(ctypes.c_void_p)() > > status = security.AuthorizationCreate( > > ctypes.pointer(authorization_rights), > > None, > > authorization_flags, > > ctypes.pointer(authorization_ref), > > ) > > SMJobBless( > > kSMDomainSystemLaunchd, > > 'app.helper', > > authorization_ref, > > None, > > ) > > > ------------------------------------------------------------------------------ > > LogMeIn Central: Instant, anywhere, Remote PC access and management. > > Stay in control, update software, and manage PCs from one command center > > Diagnose problems and improve visibility into emerging IT issues > > Automate, monitor and manage. Do more in less time with Central > > > http://p.sf.net/sfu/logmein12331_d2d_______________________________________________ > > Pyobjc-dev mailing list > > Pyo...@li... > > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev > > > > ------------------------------------------------------------------------------ > LogMeIn Central: Instant, anywhere, Remote PC access and management. > Stay in control, update software, and manage PCs from one command center > Diagnose problems and improve visibility into emerging IT issues > Automate, monitor and manage. Do more in less time with Central > http://p.sf.net/sfu/logmein12331_d2d > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev > |
From: Kunal P. <kun...@gm...> - 2012-11-07 22:23:32
|
Thanks Mike. I was able to get it working on my end as well. For reference, here's my code - # CoreFoundation framework. _CoreFoundation = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation')) _CFStringCreateWithCString = _CoreFoundation.CFStringCreateWithCString _CFStringCreateWithCString.restype = ctypes.c_void_p _CFStringCreateWithCString.argtypes = [ ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ] _CFRelease = _CoreFoundation.CFRelease _CFRelease.restype = None _CFRelease.argtypes = [ctypes.c_void_p] _kCFStringEncodingUTF8 = 0x08000100 # Security framework. _Security = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Security')) _AuthorizationCreate = _Security.AuthorizationCreate _AuthorizationFree = _Security.AuthorizationFree _kAuthorizationFlagDefaults = 0 _kAuthorizationFlagInteractionAllowed = (1 << 0) _kAuthorizationFlagExtendRights = (1 << 1) _kAuthorizationFlagPartialRights = (1 << 2) _kAuthorizationFlagDestroyRights = (1 << 3) _kAuthorizationFlagPreAuthorize = (1 << 4) _kAuthorizationFlagNoData = (1 << 20) # ServiceManagement framework. _ServiceManagement = ctypes.cdll.LoadLibrary(ctypes.util.find_library('ServiceManagement')) _SMJobBless = _ServiceManagement.SMJobBless _SMJobBless.restype = ctypes.c_bool _SMJobBless.argtypes = [ ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.POINTER(ctypes.c_void_p), ] _kSMDomainSystemLaunchd = ctypes.c_void_p.in_dll(_ServiceManagement, 'kSMDomainSystemLaunchd') _kSMRightBlessPrivilegedHelper = 'com.apple.ServiceManagement.blesshelper' class _AuthorizationItem(ctypes.Structure): _fields_ = [ ('name', ctypes.c_char_p), ('valueLength', ctypes.c_uint32), ('value', ctypes.c_void_p), ('flags', ctypes.c_uint32), ] class _AuthorizationRights(ctypes.Structure): _fields_ = [ ('count', ctypes.c_uint32), ('items', ctypes.POINTER(_AuthorizationItem)), ] authorization_item = _AuthorizationItem( name=_kSMRightBlessPrivilegedHelper, valueLength=0, value=None, flags=0, ) authorization_rights = _AuthorizationRights( count=1, items=ctypes.pointer(authorization_item), ) authorization_flags = ( _kAuthorizationFlagDefaults | _kAuthorizationFlagInteractionAllowed | _kAuthorizationFlagPreAuthorize | _kAuthorizationFlagExtendRights ) authorization_ref = ctypes.c_void_p() status = _AuthorizationCreate( ctypes.byref(authorization_rights), None, authorization_flags, ctypes.byref(authorization_ref), ) if status: print('Failed to get rights to install helper, status %d', status) return try: executable_label = _CFStringCreateWithCString( None, b'com.kunalparmar.helper'.encode('utf-8'), _kCFStringEncodingUTF8, ) try: if _SMJobBless( _kSMDomainSystemLaunchd, executable_label, authorization_ref, None, ): print('Helper installed') else: print('Failed to install helper') finally: _CFRelease(executable_label) finally: _AuthorizationFree(authorization_ref, _kAuthorizationFlagDefaults) On Mon, Nov 5, 2012 at 8:15 AM, Michael McCracken < mic...@gm...> wrote: > Hi Kunal, I recently wrote some code to call SMJobBless and SMJobRemove > using only ctypes. > This was lots of boilerplate but works reliably. > It's GPL, so you can see the code here: > http://bazaar.launchpad.net/~ubuntuone-control-tower/ubuntuone-control-panel/trunk/view/head:/ubuntuone/controlpanel/utils/darwin.py > > Please feel free to ask me if you have any questions. > > -mike > > > On Mon, Nov 5, 2012 at 1:56 AM, Ronald Oussoren <ron...@ma...>wrote: > >> >> On 5 Nov, 2012, at 2:59, Kunal Parmar <kun...@gm...> wrote: >> >> > I'm getting an error when calling SMJobBless - "ValueError: >> depythonifying 'pointer', got 'LP_c_void_p'". I've tried a few things >> without luck. Any help will be appreciated. >> >> It's currently not easily possible to use ctypes with PyObjC, I've filed >> an issue in my bitbucket about adding ctypes support to pyobjc < >> https://bitbucket.org/ronaldoussoren/pyobjc/issue/23/add-ctypes-support>. >> >> Anoyingly the Security framework is not easily wrapped using the normal >> PyObjC mechanism's either, in particular support for C structs that contain >> pointers is lacking right now. I'll have to experiment a little to see if I >> can get your example to work properly using some other hacks. >> >> Ronald >> >> >> > >> > Here's my code - >> > >> > from ServiceManagement import ( >> > kSMDomainSystemLaunchd, >> > SMJobBless, >> > ) >> > >> > security = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Security')) >> > >> > class AuthorizationItem(ctypes.Structure): >> > _fields_ = [ >> > ('name', ctypes.c_char_p), >> > ('valueLength', ctypes.c_uint32), >> > ('value', ctypes.c_void_p), >> > ('flags', ctypes.c_uint32), >> > ] >> > >> > class AuthorizationRights(ctypes.Structure): >> > _fields_ = [ >> > ('count', ctypes.c_uint32), >> > ('items', ctypes.POINTER(AuthorizationItem)), >> > ] >> > >> > authorization_item = AuthorizationItem( >> > name='com.apple.ServiceManagement.blesshelper', >> > valueLength=0, >> > value=None, >> > flags=0, >> > ) >> > authorization_rights = AuthorizationRights( >> > count=1, >> > items=ctypes.pointer(authorization_item), >> > ) >> > authorization_flags = 19 >> > authorization_ref = ctypes.POINTER(ctypes.c_void_p)() >> > status = security.AuthorizationCreate( >> > ctypes.pointer(authorization_rights), >> > None, >> > authorization_flags, >> > ctypes.pointer(authorization_ref), >> > ) >> > SMJobBless( >> > kSMDomainSystemLaunchd, >> > 'app.helper', >> > authorization_ref, >> > None, >> > ) >> > >> ------------------------------------------------------------------------------ >> > LogMeIn Central: Instant, anywhere, Remote PC access and management. >> > Stay in control, update software, and manage PCs from one command center >> > Diagnose problems and improve visibility into emerging IT issues >> > Automate, monitor and manage. Do more in less time with Central >> > >> http://p.sf.net/sfu/logmein12331_d2d_______________________________________________ >> > Pyobjc-dev mailing list >> > Pyo...@li... >> > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev >> >> >> >> ------------------------------------------------------------------------------ >> LogMeIn Central: Instant, anywhere, Remote PC access and management. >> Stay in control, update software, and manage PCs from one command center >> Diagnose problems and improve visibility into emerging IT issues >> Automate, monitor and manage. Do more in less time with Central >> http://p.sf.net/sfu/logmein12331_d2d >> _______________________________________________ >> Pyobjc-dev mailing list >> Pyo...@li... >> https://lists.sourceforge.net/lists/listinfo/pyobjc-dev >> > > |