Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skip AppleScript actions if Automation Access isn't granted. #6449

Merged
merged 1 commit into from Sep 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 11 additions & 1 deletion Library/Homebrew/cask/artifact/abstract_uninstall.rb
Expand Up @@ -130,7 +130,12 @@ def uninstall_quit(*bundle_ids, command: nil, **_)
next if running_processes(bundle_id).empty?

unless User.current.gui?
ohai "Not logged into a GUI; skipping quitting application ID '#{bundle_id}'."
opoo "Not logged into a GUI; skipping quitting application ID '#{bundle_id}'."
next
end

unless User.automation_access?
opoo "Skipping quitting application ID '#{bundle_id}'. #{User.automation_access_instructions}"
next
end

Expand Down Expand Up @@ -216,6 +221,11 @@ def uninstall_login_item(*login_items, command: nil, upgrade: false, **_)
["name", item]
end

unless User.automation_access?
opoo "Skipping removal of login item #{id}. #{User.automation_access_instructions}"
next
end

ohai "Removing login item #{id}"
system_command!(
"osascript",
Expand Down
Expand Up @@ -116,16 +116,27 @@
let(:cask) { Cask::CaskLoader.load(cask_path("with-#{artifact_dsl_key}-quit")) }
let(:bundle_id) { "my.fancy.package.app" }

it "is skipped when the user does not have automation access" do
allow(User).to receive(:automation_access?).and_return false
allow(User.current).to receive(:gui?).and_return true
allow(subject).to receive(:running_processes).with(bundle_id).and_return([[0, "", bundle_id]])

expect {
subject.public_send(:"#{artifact_dsl_key}_phase", command: fake_system_command)
}.to output(/Skipping quitting application ID 'my.fancy.package.app'\./).to_stderr
end

it "is skipped when the user is not a GUI user" do
allow(User.current).to receive(:gui?).and_return false
allow(subject).to receive(:running_processes).with(bundle_id).and_return([[0, "", bundle_id]])

expect {
subject.public_send(:"#{artifact_dsl_key}_phase", command: fake_system_command)
}.to output(/Not logged into a GUI; skipping quitting application ID 'my.fancy.package.app'\./).to_stdout
}.to output(/Not logged into a GUI; skipping quitting application ID 'my.fancy.package.app'\./).to_stderr
end

it "quits a running application" do
allow(User).to receive(:automation_access?).and_return true
allow(User.current).to receive(:gui?).and_return true

expect(subject).to receive(:running_processes).with(bundle_id).ordered.and_return([[0, "", bundle_id]])
Expand All @@ -139,6 +150,7 @@
end

it "tries to quit the application for 10 seconds" do
allow(User).to receive(:automation_access?).and_return true
allow(User.current).to receive(:gui?).and_return true

allow(subject).to receive(:running_processes).with(bundle_id).and_return([[0, "", bundle_id]])
Expand Down Expand Up @@ -247,6 +259,8 @@
let(:cask) { Cask::CaskLoader.load(cask_path("with-#{artifact_dsl_key}-login-item")) }

it "is supported" do
allow(User).to receive(:automation_access?).and_return true

expect(subject).to receive(:system_command!)
.with(
"osascript",
Expand Down
17 changes: 17 additions & 0 deletions Library/Homebrew/utils/user.rb
Expand Up @@ -6,6 +6,23 @@
require "system_command"

class User < DelegateClass(String)
def self.automation_access?
return @automation_access if defined?(@automation_access)

*_, status = system_command "osascript", args: [
"-e", "with timeout of 0.5 seconds",
"-e", 'tell application "System Events" to get volume settings',
"-e", "end timeout"
], print_stderr: false

@automation_access = status.success?
end

def self.automation_access_instructions
"Enable Automation Access for “Terminal > System Events” in " \
"“System Preferences > Security > Privacy > Automation”."
end

def gui?
out, _, status = system_command "who"
return false unless status.success?
Expand Down