Merge pull request #5010 from reitermarkus/user-gui
Skip quitting applications when not logged into GUI.
This commit is contained in:
commit
f63e88c03b
@ -1,5 +1,6 @@
|
|||||||
require "timeout"
|
require "timeout"
|
||||||
|
|
||||||
|
require "utils/user"
|
||||||
require "cask/artifact/abstract_artifact"
|
require "cask/artifact/abstract_artifact"
|
||||||
|
|
||||||
module Cask
|
module Cask
|
||||||
@ -124,9 +125,14 @@ module Cask
|
|||||||
# :quit/:signal must come before :kext so the kext will not be in use by a running process
|
# :quit/:signal must come before :kext so the kext will not be in use by a running process
|
||||||
def uninstall_quit(*bundle_ids, command: nil, **_)
|
def uninstall_quit(*bundle_ids, command: nil, **_)
|
||||||
bundle_ids.each do |bundle_id|
|
bundle_ids.each do |bundle_id|
|
||||||
ohai "Quitting application ID #{bundle_id}"
|
|
||||||
next if running_processes(bundle_id, command: command).empty?
|
next if running_processes(bundle_id, command: command).empty?
|
||||||
|
|
||||||
|
unless User.current.gui?
|
||||||
|
ohai "Not logged into a GUI; skipping quitting application ID '#{bundle_id}'."
|
||||||
|
next
|
||||||
|
end
|
||||||
|
|
||||||
|
ohai "Quitting application ID '#{bundle_id}'."
|
||||||
command.run!("/usr/bin/osascript", args: ["-e", %Q(tell application id "#{bundle_id}" to quit)], sudo: true)
|
command.run!("/usr/bin/osascript", args: ["-e", %Q(tell application id "#{bundle_id}" to quit)], sudo: true)
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
require "plist"
|
require "plist"
|
||||||
|
|
||||||
|
require "utils/user"
|
||||||
require "cask/artifact/abstract_artifact"
|
require "cask/artifact/abstract_artifact"
|
||||||
|
|
||||||
require "extend/hash_validator"
|
require "extend/hash_validator"
|
||||||
@ -50,11 +51,10 @@ module Cask
|
|||||||
end
|
end
|
||||||
with_choices_file do |choices_path|
|
with_choices_file do |choices_path|
|
||||||
args << "-applyChoiceChangesXML" << choices_path if choices_path
|
args << "-applyChoiceChangesXML" << choices_path if choices_path
|
||||||
logged_in_user = Utils.current_user
|
|
||||||
env = {
|
env = {
|
||||||
"LOGNAME" => logged_in_user,
|
"LOGNAME" => User.current,
|
||||||
"USER" => logged_in_user,
|
"USER" => User.current,
|
||||||
"USERNAME" => logged_in_user,
|
"USERNAME" => User.current,
|
||||||
}
|
}
|
||||||
command.run!("/usr/sbin/installer", sudo: true, args: args, print_stdout: true, env: env)
|
command.run!("/usr/sbin/installer", sudo: true, args: args, print_stdout: true, env: env)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
require "utils/user"
|
||||||
|
|
||||||
module Cask
|
module Cask
|
||||||
module Caskroom
|
module Caskroom
|
||||||
module_function
|
module_function
|
||||||
@ -18,7 +20,7 @@ module Cask
|
|||||||
|
|
||||||
SystemCommand.run("/bin/mkdir", args: ["-p", path], sudo: sudo)
|
SystemCommand.run("/bin/mkdir", args: ["-p", path], sudo: sudo)
|
||||||
SystemCommand.run("/bin/chmod", args: ["g+rwx", path], sudo: sudo)
|
SystemCommand.run("/bin/chmod", args: ["g+rwx", path], sudo: sudo)
|
||||||
SystemCommand.run("/usr/sbin/chown", args: [Utils.current_user, path], sudo: sudo)
|
SystemCommand.run("/usr/sbin/chown", args: [User.current, path], sudo: sudo)
|
||||||
SystemCommand.run("/usr/bin/chgrp", args: ["admin", path], sudo: sudo)
|
SystemCommand.run("/usr/bin/chgrp", args: ["admin", path], sudo: sudo)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
require "utils/user"
|
||||||
|
|
||||||
module Cask
|
module Cask
|
||||||
module Staged
|
module Staged
|
||||||
def info_plist_file(index = 0)
|
def info_plist_file(index = 0)
|
||||||
@ -31,7 +33,7 @@ module Cask
|
|||||||
sudo: false)
|
sudo: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_ownership(paths, user: current_user, group: "staff")
|
def set_ownership(paths, user: User.current, group: "staff")
|
||||||
full_paths = remove_nonexistent(paths)
|
full_paths = remove_nonexistent(paths)
|
||||||
return if full_paths.empty?
|
return if full_paths.empty?
|
||||||
|
|
||||||
@ -40,10 +42,6 @@ module Cask
|
|||||||
sudo: true)
|
sudo: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
def current_user
|
|
||||||
Utils.current_user
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def remove_nonexistent(paths)
|
def remove_nonexistent(paths)
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
require "utils/user"
|
||||||
require "yaml"
|
require "yaml"
|
||||||
require "open3"
|
require "open3"
|
||||||
require "stringio"
|
require "stringio"
|
||||||
@ -52,7 +53,7 @@ module Cask
|
|||||||
# before using sudo+chown
|
# before using sudo+chown
|
||||||
ohai "Using sudo to gain ownership of path '#{path}'"
|
ohai "Using sudo to gain ownership of path '#{path}'"
|
||||||
command.run("/usr/sbin/chown",
|
command.run("/usr/sbin/chown",
|
||||||
args: command_args + ["--", current_user, path],
|
args: command_args + ["--", User.current, path],
|
||||||
sudo: true)
|
sudo: true)
|
||||||
tried_ownership = true
|
tried_ownership = true
|
||||||
# retry chflags/chmod after chown
|
# retry chflags/chmod after chown
|
||||||
@ -62,10 +63,6 @@ module Cask
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.current_user
|
|
||||||
Etc.getpwuid(Process.euid).name
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.path_occupied?(path)
|
def self.path_occupied?(path)
|
||||||
File.exist?(path) || File.symlink?(path)
|
File.exist?(path) || File.symlink?(path)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -8,12 +8,14 @@ require "extend/hash_validator"
|
|||||||
using HashValidator
|
using HashValidator
|
||||||
require "extend/predicable"
|
require "extend/predicable"
|
||||||
|
|
||||||
def system_command(*args)
|
module Kernel
|
||||||
SystemCommand.run(*args)
|
def system_command(*args)
|
||||||
end
|
SystemCommand.run(*args)
|
||||||
|
end
|
||||||
|
|
||||||
def system_command!(*args)
|
def system_command!(*args)
|
||||||
SystemCommand.run!(*args)
|
SystemCommand.run!(*args)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class SystemCommand
|
class SystemCommand
|
||||||
|
|||||||
@ -80,7 +80,7 @@ describe Cask::Artifact::App, :cask do
|
|||||||
let(:force) { true }
|
let(:force) { true }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(Cask::Utils).to receive(:current_user).and_return("fake_user")
|
allow(User).to receive(:current).and_return(User.new("fake_user"))
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "target is both writable and user-owned" do
|
describe "target is both writable and user-owned" do
|
||||||
|
|||||||
@ -76,7 +76,7 @@ shared_examples Cask::Staged do
|
|||||||
it "can set the ownership of a file" do
|
it "can set the ownership of a file" do
|
||||||
fake_pathname = existing_path
|
fake_pathname = existing_path
|
||||||
|
|
||||||
allow(staged).to receive(:current_user).and_return("fake_user")
|
allow(User).to receive(:current).and_return(User.new("fake_user"))
|
||||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||||
|
|
||||||
FakeSystemCommand.expects_command(
|
FakeSystemCommand.expects_command(
|
||||||
@ -89,7 +89,7 @@ shared_examples Cask::Staged do
|
|||||||
it "can set the ownership of multiple files" do
|
it "can set the ownership of multiple files" do
|
||||||
fake_pathname = existing_path
|
fake_pathname = existing_path
|
||||||
|
|
||||||
allow(staged).to receive(:current_user).and_return("fake_user")
|
allow(User).to receive(:current).and_return(User.new("fake_user"))
|
||||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||||
|
|
||||||
FakeSystemCommand.expects_command(
|
FakeSystemCommand.expects_command(
|
||||||
@ -112,7 +112,7 @@ shared_examples Cask::Staged do
|
|||||||
end
|
end
|
||||||
|
|
||||||
it "cannot set the ownership of a file that does not exist" do
|
it "cannot set the ownership of a file that does not exist" do
|
||||||
allow(staged).to receive(:current_user).and_return("fake_user")
|
allow(User).to receive(:current).and_return(User.new("fake_user"))
|
||||||
fake_pathname = non_existent_path
|
fake_pathname = non_existent_path
|
||||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||||
|
|
||||||
|
|||||||
36
Library/Homebrew/test/utils/user_spec.rb
Normal file
36
Library/Homebrew/test/utils/user_spec.rb
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
require "utils/user"
|
||||||
|
|
||||||
|
describe User do
|
||||||
|
subject { described_class.current }
|
||||||
|
|
||||||
|
it { is_expected.to eq ENV["USER"] }
|
||||||
|
|
||||||
|
describe "#gui?" do
|
||||||
|
before do
|
||||||
|
allow(SystemCommand).to receive(:run).with("who")
|
||||||
|
.and_return([who_output, "", instance_double(Process::Status, success?: true)])
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the current user is in a console session" do
|
||||||
|
let(:who_output) {
|
||||||
|
<<~EOS
|
||||||
|
#{ENV["USER"]} console Oct 1 11:23
|
||||||
|
#{ENV["USER"]} ttys001 Oct 1 11:25
|
||||||
|
EOS
|
||||||
|
}
|
||||||
|
|
||||||
|
its(:gui?) { is_expected.to be true }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the current user is not in a console session" do
|
||||||
|
let(:who_output) {
|
||||||
|
<<~EOS
|
||||||
|
#{ENV["USER"]} ttys001 Oct 1 11:25
|
||||||
|
fake_user ttys002 Oct 1 11:27
|
||||||
|
EOS
|
||||||
|
}
|
||||||
|
|
||||||
|
its(:gui?) { is_expected.to be false }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
18
Library/Homebrew/utils/user.rb
Normal file
18
Library/Homebrew/utils/user.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
require "delegate"
|
||||||
|
require "etc"
|
||||||
|
|
||||||
|
require "system_command"
|
||||||
|
|
||||||
|
class User < DelegateClass(String)
|
||||||
|
def gui?
|
||||||
|
out, _, status = system_command "who"
|
||||||
|
return false unless status.success?
|
||||||
|
out.lines
|
||||||
|
.map(&:split)
|
||||||
|
.any? { |user, type,| user == self && type == "console" }
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.current
|
||||||
|
@current ||= new(Etc.getpwuid(Process.euid).name)
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user