summaryrefslogtreecommitdiff
path: root/xmake
diff options
context:
space:
mode:
Diffstat (limited to 'xmake')
-rw-r--r--xmake/actions/install/main.lua23
-rw-r--r--xmake/actions/uninstall/main.lua23
-rw-r--r--xmake/core/base/os.lua29
-rw-r--r--xmake/core/base/privilege.lua92
-rw-r--r--xmake/core/main.lua9
-rw-r--r--xmake/core/sandbox/modules/import/core/base/privilege.lua26
6 files changed, 186 insertions, 16 deletions
diff --git a/xmake/actions/install/main.lua b/xmake/actions/install/main.lua
index 3ca155789..f9bca9419 100644
--- a/xmake/actions/install/main.lua
+++ b/xmake/actions/install/main.lua
@@ -26,6 +26,7 @@
import("core.base.option")
import("core.project.task")
import("core.platform.platform")
+import("core.base.privilege")
import("install")
-- main
@@ -57,6 +58,28 @@ function main()
-- failed or not permission? request administrator permission and install it again
function (errors)
+ -- try get privilege
+ if privilege.get() then
+ local ok = try
+ {
+ function ()
+ -- install target
+ install.install(targetname or ifelse(option.get("all"), "__all", "__def"))
+
+ -- trace
+ cprint("${bright}install ok!${clear}${ok_hand}")
+
+ -- ok
+ return true
+ end
+ }
+
+ -- release privilege
+ privilege.store()
+
+ if ok then return end
+ end
+
-- show tips
cprint("${bright red}error: ${default red}installation failed, may permission denied!")
diff --git a/xmake/actions/uninstall/main.lua b/xmake/actions/uninstall/main.lua
index a7cfec3db..2b25a058d 100644
--- a/xmake/actions/uninstall/main.lua
+++ b/xmake/actions/uninstall/main.lua
@@ -26,6 +26,7 @@
import("core.base.option")
import("core.project.task")
import("core.platform.platform")
+import("core.base.privilege")
import("uninstall")
-- main
@@ -57,6 +58,28 @@ function main()
-- failed or not permission? request administrator permission and uninstall it again
function (errors)
+ -- try get privilege
+ if privilege.get() then
+ local ok = try
+ {
+ function ()
+ -- uninstall target
+ uninstall.uninstall(targetname)
+
+ -- trace
+ cprint("${bright}uninstall ok!${clear}${ok_hand}")
+
+ -- ok
+ return true
+ end
+ }
+
+ -- release privilege
+ privilege.store()
+
+ if ok then return end
+ end
+
-- show tips
cprint("${bright red}error: ${default red}failed to uninstall, may permission denied!")
diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua
index 02d96ad7e..ea6d3a9b0 100644
--- a/xmake/core/base/os.lua
+++ b/xmake/core/base/os.lua
@@ -34,6 +34,7 @@ local string = require("base/string")
-- save original interfaces
os._uid = os._uid or os.uid
+os._gid = os._gid or os.gid
os._mkdir = os._mkdir or os.mkdir
os._rmdir = os._rmdir or os.rmdir
os._tmpdir = os._tmpdir or os.tmpdir
@@ -627,30 +628,32 @@ function os.nuldev()
end
-- get uid
-function os.uid()
-
- -- get it from cache first
- if os._UID then
- return os._UID
- end
-
+function os.uid(...)
-- get uid
os._UID = {}
if os._uid then
- os._UID = os._uid() or {}
+ os._UID = os._uid(...) or {}
end
-- ok?
return os._UID
end
+-- get gid
+function os.gid(...)
+ -- get gid
+ os._GID = {}
+ if os._gid then
+ os._GID = os._gid(...) or {}
+ end
+
+ -- ok?
+ return os._GID
+end
+
-- check run command as root
function os.isroot()
-
- -- get it from cache
- if os._ISROOT ~= nil then
- return os._ISROOT
- end
+ os._ISROOT = nil
-- check it
if os.uid().euid == 0 then
diff --git a/xmake/core/base/privilege.lua b/xmake/core/base/privilege.lua
new file mode 100644
index 000000000..275a7e7b5
--- /dev/null
+++ b/xmake/core/base/privilege.lua
@@ -0,0 +1,92 @@
+--!The Make-like Build Utility based on Lua
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015 - 2017, TBOOX Open Source Group.
+--
+-- @author TitanSnow
+-- @file privilege.lua
+--
+
+-- define module
+local privilege = privilege or {}
+
+-- load modules
+local os = require("base/os")
+
+-- store privilege
+function privilege.store()
+ -- check if root
+ if not os.isroot() then
+ return false
+ end
+
+ -- find projectdir's owner
+ local projectdir = xmake._PROJECT_DIR
+ assert(projectdir)
+ local owner = os.getown(projectdir)
+ if not owner then
+ -- fallback to current dir
+ owner = os.getown(".")
+ if not owner then
+ return false
+ end
+ end
+
+ -- set gid
+ if os.gid(owner.gid).errno ~= 0 then
+ return false
+ end
+
+ -- set uid
+ if os.uid({["ruid"] = owner.uid}).errno ~= 0 or os.uid({["euid"] = owner.uid}).errno ~= 0 then
+ return false
+ end
+
+ -- set flag
+ privilege._HAS_PRIVILEGE = true
+
+ -- ok
+ return true
+end
+
+-- check if has stored privilege
+function privilege.has()
+ return privilege._HAS_PRIVILEGE or false
+end
+
+function privilege.get()
+ -- has?
+ if privilege._HAS_PRIVILEGE ~= true then
+ return false
+ end
+
+ -- set uid
+ if os.uid({["euid"] = 0}).errno ~= 0 or os.uid({["ruid"] = 0}).errno ~= 0 then
+ return false
+ end
+
+ -- set gid
+ if os.gid(0).errno ~= 0 then
+ return false
+ end
+
+ return true
+end
+
+-- return module
+return privilege
diff --git a/xmake/core/main.lua b/xmake/core/main.lua
index b4ca6afab..cda338294 100644
--- a/xmake/core/main.lua
+++ b/xmake/core/main.lua
@@ -32,6 +32,7 @@ local utils = require("base/utils")
local option = require("base/option")
local profiler = require("base/profiler")
local deprecated = require("base/deprecated")
+local privilege = require("base/privilege")
local task = require("project/task")
local history = require("project/history")
@@ -143,12 +144,14 @@ function main.done()
-- check run command as root
if not option.get("root") then
if os.isroot() then
- utils.error([[Running xmake as root is extremely dangerous and no longer supported.
+ if not privilege.store() or os.isroot() then
+ utils.error([[Running xmake as root is extremely dangerous and no longer supported.
As xmake does not drop privileges on installation you would be giving all
build scripts full access to your system.
Or you can add `--root` option to allow run as root temporarily.
- ]])
- return -1
+ ]])
+ return -1
+ end
end
end
diff --git a/xmake/core/sandbox/modules/import/core/base/privilege.lua b/xmake/core/sandbox/modules/import/core/base/privilege.lua
new file mode 100644
index 000000000..8f94cdb79
--- /dev/null
+++ b/xmake/core/sandbox/modules/import/core/base/privilege.lua
@@ -0,0 +1,26 @@
+--!The Make-like Build Utility based on Lua
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015 - 2017, TBOOX Open Source Group.
+--
+-- @author TitanSnow
+-- @file privilege.lua
+--
+
+-- return module
+return require("base/privilege")