Bill-

Thank you for the detailed and thoughtful response.  I have done some
further poking about and found instructions on granting accessibility
permissions from the command line.  After doing this on my working app, the
AppleScripts no longer execute (error -2709), leading me to conclude that
the only way to do what I want is to have the users activate universal
access for assistive devices.

To clarify, my app is trying to execute AppleScripts, not receive scripting.
I am going to post a follow-up to accessibility-dev to see if there is a way
around this.

For now, it seems that an application that has been granted
AXMakeProcessTrusted cannot access the scripting dictionaries of other
applications.

Thanks again.


> From: Bill Cheeseman <b...@cheeseman.name>
> Subject: Re: Using NSAppleScript With AXMakeProcessTrusted -- and/or,
> How To Indirectly Launch A Secure Agent
> To: Cocoa-Dev Mail <cocoa-dev@lists.apple.com>
> Message-ID: <c5aaeb5d.79854%b...@cheeseman.name>
> Content-Type: text/plain; charset="ISO-8859-1"
> 
> on 2009-01-31 4:44 PM, Tobias Zimmerman at automa...@gmail.com wrote:
> 
>> So, I have read up on the AXMakeProcessTrusted function, and seen the
>> example at http://caffeinatedcocoa.com/blog/?p=12 on how to use this
>> function.  The problem is, using that approach causes the AppleScripts in my
>> application to fail with the error �2709 (can�t access dictionary).
> 
> I can't answer your AppleScript question because I haven't yet made my
> scriptable app trusted. But I can comment from personal experience on
> AXMakeProcessTrusted because I have it working in the next version of my
> PreFab UI Brower product, which is not itself scriptable (I have not yet
> released the next version).
> 
> The example code at caffeinatedcocoa.com for the TrustMe application is OK
> as an example of how to call the AXMakeProcessTrusted function, but you
> shouldn't write a real application that runs as root the way TrustMe does.
> It isn't secure to leave an application running as root, and running as root
> may be what is killing your scriptability.
> 
> Instead, follow the Apple Authorization Services examples and documentation:
> Place a very simple helper application in your main application's bundle.
> The only job of the helper application should be to run AXMakeProcessTrusted
> against your main application executable. Your helper application has to run
> as root for a brief moment because AXMakeProcessTrusted requires root
> access, but then the helper application should quit. You might also find
> that your main application's scripting interface starts working once it
> isn't running as root.
> 
> You can write your main application's executable so that it runs the helper
> application at launch time automatically, or as I do you can run it from a
> menu item or a button when the user chooses to make the main application
> trusted.
> 
>> First question:  I have seen a message saying that AXMakeProcessTrusted was
>> broken in Tiger.  Was it fixed in Leopard?  It seems to work correctly, save
>> causing my AppleScripts to fail.
> 
> AXMakeProcessTrusted works perfectly well in Leopard.
> 
> I have long suspected that the comments about its being broken in Tiger were
> based on misunderstandings about the right way to use it, but I haven't
> actually tried to make it work on Tiger so I'm not sure.
> 
>> Next question:  Are the AppleScripts failing because the application process
>> has elevated rights due to AXMakeProcessTrusted, or is it because the
>> application links to the Security Framework?  I have seen posts/messages
>> that suggest both.  If I can get my application the status of
>> AXProcessIsTrusted without linking to the Security Framework, will the
>> AppleScripts work?  (And is this a bug or a security feature?)
> 
> I think I might have read somewhere that scriptability is disabled in an
> application that is running as root, for security reasons. If that is
> correct, then you should be able to solve your AppleScript problem by moving
> AXMakeProcessTrusted into a separate helper application as described above.
> Since you should move AXMakeProcessTrusted into a separate helper
> application anyway for security reasons, you will be able to answer your
> AppleScript question yourself.
> 
>> Third question: Assuming the answers to the first two questions are
>> favorable, how would you more experienced and wise developers go about doing
>> something like this?  How can I do a one-time operation as root without
>> linking the Security Framework into my main application?  It seems to me I
>> need to include two separate agents in my app � one that is run with normal
>> permissions from the main app (thus, no need to link to the Security
>> Framework or give the main app generally elevated permissions), and then a
>> second one, called from the first agent with privileges, that actually
>> executes the AXMakeProcessTrusted function on the main app.  Does this seem
>> right?  I am a novice programmer, but I have looked at both NSTask and the
>> NSWorkspace - launchedApplication: method and can�t discern the easier way
>> to go in terms of passing the main app�s path to the first, and then the
>> second agent applications.  I am not even sure of the proper build settings
>> for a project using two helpers in this manner.  Could I use a shell/perl
>> script as the middle agent?
> 
> I don't think you need a second "agent" for this purpose. I'm pretty sure
> linking to the Security Framework is not your problem. Just put
> AXMakeProcessTrusted in a very simple helper application that runs as root.
> Then put all the rest of your functionality in your main application's
> executable, which is trusted but does not run as root. My main application
> puts up the authentication dialog, then it uses NSTask to launch the
> AXMakeProcessTrusted helper application and communicates the authorization
> ref to it. Apple's authorization example code shows how to communicate the
> authorization ref from your main application which puts up the authorization
> dialog, to the helper application which runs as root.
> 
> There is one complication that can be resolved by a second "agent": you must
> quit and relaunch the main application executable immediately after making
> it trusted. The main executable doesn't actually run as trusted until it is
> relaunched after AXMakeProcessTrusted is run against it, as the
> documentation states somewhere. An easy way to relaunch the main application
> executable is to include a second helper application in your main
> application's bundle. Example code for doing this can be found at
> <http://0xced.blogspot.com/2006/06/relaunch-your-cocoa-application-by.html>.
> 
>> Sorry for the longwinded/semi-ranging question(s), but any and all advice
>> the more experienced can offer would be really really appreciated.
> 
> You're in pretty deep territory here, but you've made good progress. Search
> Apple's accessibility-dev mailing list archives for more information.
> 
> --
> 
> Bill Cheeseman - b...@cheeseman.name
> Quechee Software, Quechee, Vermont, USA
> www.quecheesoftware.com
> 
> PreFab Software - www.prefabsoftware.com


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to