bwrap 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +7 -0
- data/lib/bwrap/args/args.rb +33 -4
- data/lib/bwrap/args/bind/device.rb +48 -0
- data/lib/bwrap/args/bind/library.rb +63 -47
- data/lib/bwrap/args/bind.rb +43 -41
- data/lib/bwrap/args/construct.rb +22 -35
- data/lib/bwrap/args/environment.rb +5 -1
- data/lib/bwrap/args/features/ruby_binds.rb +3 -1
- data/lib/bwrap/args/features.rb +3 -4
- data/lib/bwrap/args/mount.rb +1 -7
- data/lib/bwrap/args/network.rb +2 -2
- data/lib/bwrap/args/user.rb +36 -0
- data/lib/bwrap/bwrap.rb +57 -27
- data/lib/bwrap/config.rb +34 -7
- data/lib/bwrap/execution/exec.rb +78 -0
- data/lib/bwrap/execution/execute.rb +25 -43
- data/lib/bwrap/execution/execution.rb +77 -50
- data/lib/bwrap/execution/logging.rb +49 -0
- data/lib/bwrap/execution/popen2e.rb +84 -12
- data/lib/bwrap/resolvers/executable.rb +70 -0
- data/lib/bwrap/{args → resolvers}/library.rb +38 -13
- data/lib/bwrap/resolvers/mime.rb +75 -0
- data/lib/bwrap/resolvers/resolvers.rb +7 -0
- data/lib/bwrap/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +10 -4
- metadata.gz.sig +0 -0
- data/lib/bwrap/args/bind/mime.rb +0 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d341ff2f9550758a2fcbcdac6812c1b85a77acf6154015654d1d4980c3cf00e1
|
4
|
+
data.tar.gz: 680c94999f6c1bbe5524a11ead5e380d07c46a51978b5b51827f373a73836cee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c28d8c5653480c209e00178ee0b78d0eda49eb5b75addeddfd2837425f66af0576939bf1c18374614350fac1032f468494d79964015bfd1e6f03422e2114171
|
7
|
+
data.tar.gz: d1f3febe2016fb724dda28e13e0b3f2ad054e3eb146794dbdca179e04a3641c9fdc8f92c91d79ec4e5614cd75946db5672c3397fd57a718e91e0050ae0f224b3
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
## 1.2.0 (20.07.2022)
|
4
|
+
|
5
|
+
* Properly throw execution failure exception
|
6
|
+
* Config is now optional argument for Bwrap#initialize
|
7
|
+
* Allow passing kwargs to Bwrap#run
|
8
|
+
* Allow passing config to execute
|
9
|
+
|
3
10
|
## 1.1.1 (07.06.2022)
|
4
11
|
|
5
12
|
* Added Bwrap::Execution.popen2e
|
data/lib/bwrap/args/args.rb
CHANGED
@@ -10,12 +10,12 @@ require "bwrap/version"
|
|
10
10
|
module Bwrap::Args
|
11
11
|
# Used as container for arguments constructed via {Construct}.
|
12
12
|
#
|
13
|
-
# Where
|
14
|
-
#
|
13
|
+
# Where `Hash` defaults to nil as default argument, {Args} defaults to
|
14
|
+
# `Array`.
|
15
15
|
class Args < Hash
|
16
16
|
# Creates new instance of a hash for storing arguments.
|
17
17
|
#
|
18
|
-
# Where
|
18
|
+
# Where `Hash` defaults to nil as default argument, {Args} defaults to
|
19
19
|
# `[]`.
|
20
20
|
#
|
21
21
|
# @see Hash#initialize
|
@@ -31,9 +31,10 @@ module Bwrap::Args
|
|
31
31
|
#
|
32
32
|
# Following types are meant to be used, though everything is accepted:
|
33
33
|
# - :mount
|
34
|
+
# - (and many others, they are not documented here)
|
34
35
|
#
|
35
36
|
# @param type [Symbol] Type of the argument
|
36
|
-
# @
|
37
|
+
# @return self
|
37
38
|
def add(type, *data)
|
38
39
|
if data.respond_to? :each
|
39
40
|
self[type] += data.flatten
|
@@ -43,5 +44,33 @@ module Bwrap::Args
|
|
43
44
|
|
44
45
|
self
|
45
46
|
end
|
47
|
+
|
48
|
+
# Adds ugiven data to array identified by given type if they
|
49
|
+
# have not been already added.
|
50
|
+
#
|
51
|
+
# Following types are meant to be used, though everything is accepted:
|
52
|
+
# - :mount
|
53
|
+
# - (and many others, they are not documented here)
|
54
|
+
#
|
55
|
+
# @param type [Symbol] Type of the argument
|
56
|
+
# @return self
|
57
|
+
def add_uniq(type, *data)
|
58
|
+
if data.respond_to? :each
|
59
|
+
self[type] |= data
|
60
|
+
else
|
61
|
+
self[type] << data unless include? data
|
62
|
+
end
|
63
|
+
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
# Adds a read-only bind to bind given path from host to same path inside sandbox.
|
68
|
+
#
|
69
|
+
# @see bwrap argument `--ro-bind`.
|
70
|
+
#
|
71
|
+
# TODO: doc for params
|
72
|
+
def ro_bind(type, path)
|
73
|
+
add(type, %W{ --ro-bind #{path} #{path} })
|
74
|
+
end
|
46
75
|
end
|
47
76
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bwrap/output"
|
4
|
+
|
5
|
+
class Bwrap::Args::Bind
|
6
|
+
# Device related binds.
|
7
|
+
class Device
|
8
|
+
include Bwrap::Output
|
9
|
+
|
10
|
+
# Instance of {Config}.
|
11
|
+
attr_writer :config
|
12
|
+
|
13
|
+
# @param args [Args] Args created by {Construct}
|
14
|
+
def initialize args
|
15
|
+
@args = args
|
16
|
+
end
|
17
|
+
|
18
|
+
# Arguments for mounting devtmpfs to /dev.
|
19
|
+
def dev_mount
|
20
|
+
return unless @config&.dev_mount
|
21
|
+
|
22
|
+
debug "Mounting new devtmpfs to /dev"
|
23
|
+
@args.add :dev_mounts, "--dev", "/dev"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Arguments to bind /dev/dri from host to sandbox.
|
27
|
+
def bind_dev_dri
|
28
|
+
return unless @config&.graphics_acceleration
|
29
|
+
|
30
|
+
@args.add :dev_mounts, %w{ --dev-bind /dev/dri /dev/dri }
|
31
|
+
end
|
32
|
+
|
33
|
+
# Arguments to bind /sys/dev/char from host to sandbox.
|
34
|
+
def bind_sys_dev_char
|
35
|
+
return unless @config&.graphics_acceleration
|
36
|
+
|
37
|
+
@args.add :dev_mounts, %w{ --ro-bind /sys/dev/char /sys/dev/char }
|
38
|
+
end
|
39
|
+
|
40
|
+
# Arguments to bind /sys/devices/pci0000:00 from host to sandbox.
|
41
|
+
def bind_pci_devices
|
42
|
+
return unless @config&.graphics_acceleration
|
43
|
+
|
44
|
+
@args.add :dev_mounts, %w{ --ro-bind /sys/devices/pci0000:00 /sys/devices/pci0000:00 }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
require "bwrap/execution/path"
|
4
4
|
require "bwrap/output"
|
5
|
-
|
6
|
-
|
5
|
+
require "bwrap/resolvers/executable"
|
6
|
+
require "bwrap/resolvers/library"
|
7
|
+
require "bwrap/resolvers/mime"
|
7
8
|
|
8
9
|
class Bwrap::Args::Bind
|
9
10
|
# TODO: documentation
|
@@ -21,22 +22,20 @@ class Bwrap::Args::Bind
|
|
21
22
|
include Bwrap::Execution::Path
|
22
23
|
include Bwrap::Output
|
23
24
|
|
24
|
-
# The command given to {Bwrap#run}.
|
25
|
-
#
|
26
|
-
# @see Bwrap::Args::Construct#command=
|
27
|
-
#
|
28
|
-
# @see (see Bwrap::Args::Construct#command=)
|
29
|
-
attr_writer :command
|
30
|
-
|
31
25
|
# Instance of {Bwrap::Config}.
|
32
26
|
attr_writer :config
|
33
27
|
|
34
28
|
# Instance of {Bwrap::Args::Environment}.
|
35
29
|
attr_writer :environment
|
36
30
|
|
37
|
-
|
31
|
+
# Instance of {Bwrap::Resolvers::Executable}.
|
32
|
+
attr_writer :executable
|
38
33
|
|
39
|
-
|
34
|
+
# TODO: Remove?
|
35
|
+
#attr_writer :executable_name
|
36
|
+
|
37
|
+
# TODO: Remove?
|
38
|
+
#attr_writer :executable_path
|
40
39
|
|
41
40
|
def initialize args
|
42
41
|
@args = args
|
@@ -45,29 +44,15 @@ class Bwrap::Args::Bind
|
|
45
44
|
def extra_executables_mounts
|
46
45
|
return unless @config&.extra_executables
|
47
46
|
|
48
|
-
@config.extra_executables.each do |
|
49
|
-
|
50
|
-
@executable_path = resolve_executable_path @executable_name, not_inside_root: true
|
51
|
-
|
52
|
-
@args.add :extra_executable_mounts, %W{ --ro-bind #{@executable_path} #{@executable_path} }
|
47
|
+
@config.extra_executables.each do |extra_executable|
|
48
|
+
executable = Bwrap::Resolvers::Executable.new extra_executable
|
53
49
|
|
54
|
-
|
50
|
+
generate_binds_for_command :extra_executable_mounts, executable, inside_root: false
|
55
51
|
end
|
56
52
|
end
|
57
53
|
|
58
|
-
# Checks the command given to {Bwrap#run} and adds the libraries it needs.
|
59
|
-
#
|
60
|
-
# Convenience method to call {#resolve_executable_libraries}.
|
61
54
|
def handle_given_command
|
62
|
-
|
63
|
-
@executable_path = resolve_executable_path @executable_name
|
64
|
-
|
65
|
-
# Actually add the executable to be bound to the sandbox.
|
66
|
-
unless @config&.command_inside_root
|
67
|
-
@args.add :given_command, %W{ --ro-bind #{@executable_path} #{@executable_path} }
|
68
|
-
end
|
69
|
-
|
70
|
-
resolve_executable_libraries
|
55
|
+
generate_binds_for_command :given_command, @executable
|
71
56
|
end
|
72
57
|
|
73
58
|
# Does some inspection to find out libraries given executable needs in order to work.
|
@@ -77,14 +62,15 @@ class Bwrap::Args::Bind
|
|
77
62
|
#
|
78
63
|
# @todo Ensure scanelf is available (and throw proper error if it is not, telling to not use
|
79
64
|
# full_system_mounts option.)
|
80
|
-
|
81
|
-
|
65
|
+
#
|
66
|
+
# @param executable_name [String] Executable to be run inside bwrap
|
67
|
+
def resolve_executable_libraries executable_name, executable_path
|
68
|
+
debug "Resolving executable libraries of #{executable_path}"
|
82
69
|
|
83
|
-
|
84
|
-
|
70
|
+
mime = Bwrap::Resolvers::Mime.new executable_name, executable_path
|
71
|
+
mime.resolve_mime_type
|
85
72
|
|
86
|
-
|
87
|
-
return unless mime.resolve_mime_type
|
73
|
+
return if shell_executable_binds mime
|
88
74
|
|
89
75
|
# TODO: Ideally mime stuff should be handled as config,
|
90
76
|
# but then shebang parsing logic would be necessary to move to config classes.
|
@@ -101,7 +87,7 @@ class Bwrap::Args::Bind
|
|
101
87
|
|
102
88
|
library_mounts = []
|
103
89
|
|
104
|
-
library_object = ::Bwrap::
|
90
|
+
library_object = ::Bwrap::Resolvers::Library.new
|
105
91
|
libraries = library_object.libraries_needed_by mime.executable_path
|
106
92
|
|
107
93
|
# TODO: following is bad?
|
@@ -110,7 +96,7 @@ class Bwrap::Args::Bind
|
|
110
96
|
library_mounts << "--ro-bind" << library << library
|
111
97
|
end
|
112
98
|
|
113
|
-
@args.
|
99
|
+
@args.add_uniq :extra_executable_libraries, library_mounts
|
114
100
|
end
|
115
101
|
|
116
102
|
# Some features, like {Bwrap::Config::Features::Nscd}, requires some binds
|
@@ -124,22 +110,52 @@ class Bwrap::Args::Bind
|
|
124
110
|
ruby_binds_for_features
|
125
111
|
end
|
126
112
|
|
127
|
-
private def
|
128
|
-
|
129
|
-
|
130
|
-
end
|
113
|
+
private def shell_executable_binds mime
|
114
|
+
# TODO: Put this behind additional flag for extra control/sanity.
|
115
|
+
# Some executables are shell scripts and similar. For them we need to use the interpreter.
|
131
116
|
|
132
|
-
|
133
|
-
|
134
|
-
|
117
|
+
if mime.mime_type[0..6] != "text/x-"
|
118
|
+
# All is good as this is not an interpreter.
|
119
|
+
elsif mime.interpreter?
|
120
|
+
# TODO: For less unmessiness, this should be done before actual
|
121
|
+
# handle_given_command() and extra_executable_mounts() are run.
|
122
|
+
# I guess that needs some refactoring...
|
123
|
+
mime_executable = Bwrap::Resolvers::Executable.new mime.resolve_real_executable
|
124
|
+
generate_binds_for_command :extra_executable_mounts, mime_executable
|
125
|
+
else
|
126
|
+
warn "Executable #{mime.executable_name} was recognized as #{mime.mime_type} but does not have " \
|
127
|
+
"proper shebang line. Skipping automatic library mounts."
|
128
|
+
return true
|
135
129
|
end
|
136
130
|
|
137
|
-
|
131
|
+
false
|
132
|
+
end
|
133
|
+
|
134
|
+
# @param executable [Bwrap::Resolvers::Executable] Executable to be resolved
|
135
|
+
private def generate_binds_for_command args_flag, executable, inside_root: true
|
136
|
+
# Type can be :path or :symlink. It is not used for now.
|
137
|
+
executable.executable_paths.each do |path, _type|
|
138
|
+
executable_path = resolve_executable_path path, inside_root: inside_root
|
139
|
+
|
140
|
+
# Actually add the executable to be bound to the sandbox.
|
141
|
+
if @config and !@config.command_inside_root
|
142
|
+
# Avoid double-binding the executable.
|
143
|
+
executable_dir = File.dirname(executable_path)
|
144
|
+
unless @config.binaries_from&.include? executable_dir
|
145
|
+
@args.ro_bind args_flag, executable_path
|
146
|
+
|
147
|
+
# Also add the directory where the executable is to PATH, for convenience.
|
148
|
+
@environment.add_to_path executable_dir unless executable.absolute_path?
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
resolve_executable_libraries path, executable_path
|
153
|
+
end
|
138
154
|
end
|
139
155
|
|
140
156
|
# @warning Requires environment paths to be resolved beforehand.
|
141
|
-
private def resolve_executable_path executable_name,
|
142
|
-
if @config&.command_inside_root.nil? or
|
157
|
+
private def resolve_executable_path executable_name, inside_root: true
|
158
|
+
if @config&.command_inside_root.nil? or !inside_root
|
143
159
|
return which executable_name
|
144
160
|
end
|
145
161
|
|
data/lib/bwrap/args/bind.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require "bwrap/execution"
|
4
4
|
require "bwrap/output"
|
5
5
|
require_relative "args"
|
6
|
+
require_relative "bind/device"
|
6
7
|
require_relative "bind/library"
|
7
8
|
|
8
9
|
# Bind arguments for bwrap.
|
@@ -13,40 +14,21 @@ class Bwrap::Args::Bind
|
|
13
14
|
# Array of parameters passed to bwrap.
|
14
15
|
attr_writer :args
|
15
16
|
|
16
|
-
# The command given to {Bwrap#run}.
|
17
|
-
#
|
18
|
-
# @see Bwrap::Args::Construct#command=
|
19
|
-
#
|
20
|
-
# @see (see Bwrap::Args::Construct#command=)
|
21
|
-
attr_writer :command
|
22
|
-
|
23
17
|
# Instance of {Bwrap::Config}.
|
24
18
|
attr_writer :config
|
25
19
|
|
26
20
|
# Instance of {Bwrap::Args::Environment}.
|
27
21
|
attr_writer :environment
|
28
22
|
|
29
|
-
#
|
30
|
-
|
31
|
-
@args.add :dev_mounts, %w{ --dev-bind /dev/dri /dev/dri }
|
32
|
-
end
|
33
|
-
|
34
|
-
# Arguments to bind /sys/dev/char from host to sandbox.
|
35
|
-
def bind_sys_dev_char
|
36
|
-
@args.add :dev_mounts, %w{ --ro-bind /sys/dev/char /sys/dev/char }
|
37
|
-
end
|
38
|
-
|
39
|
-
# Arguments to bind /sys/devices/pci0000:00 from host to sandbox.
|
40
|
-
def bind_pci_devices
|
41
|
-
@args.add :dev_mounts, %w{ --ro-bind /sys/devices/pci0000:00 /sys/devices/pci0000:00 }
|
42
|
-
end
|
23
|
+
# Instance of {Bwrap::Resolvers::Executable}.
|
24
|
+
attr_writer :executable
|
43
25
|
|
44
26
|
# Arguments to bind home directory from sandbox directory (`#{@config.sandbox_directory}/home`)
|
45
27
|
# as `/home/#{@config.user}`.
|
46
28
|
#
|
47
29
|
# @note Requires @config.user to be set.
|
48
30
|
def bind_home_directory
|
49
|
-
return unless @config
|
31
|
+
return unless @config&.user
|
50
32
|
|
51
33
|
home_directory = "#{@config.sandbox_directory}/home"
|
52
34
|
|
@@ -71,28 +53,20 @@ class Bwrap::Args::Bind
|
|
71
53
|
#
|
72
54
|
# Or maybe the data should be calculated and these are excluded in
|
73
55
|
# Construct#bwrap_arguments?
|
74
|
-
|
56
|
+
#
|
57
|
+
# NOTE: After making Config optional, now this requires config to be preset
|
58
|
+
# for full_system_mounts option to have any effect. Maybe it should always
|
59
|
+
# be like so by default...?
|
60
|
+
return if @config && !@config&.full_system_mounts
|
75
61
|
|
76
62
|
@library_bind.handle_given_command
|
77
63
|
end
|
78
64
|
|
79
65
|
# Arguments to read-only bind whole system inside sandbox.
|
80
66
|
def handle_system_mounts
|
81
|
-
|
82
|
-
binaries_from = @config.binaries_from
|
83
|
-
binaries_from.each do |path|
|
84
|
-
bindir_mounts << "--ro-bind" << path << path
|
85
|
-
end
|
86
|
-
@environment.add_to_path binaries_from
|
87
|
-
|
88
|
-
@args.add :bindir, bindir_mounts
|
89
|
-
|
90
|
-
if debug?
|
91
|
-
debug "Using following bindir mounts:\n" \
|
92
|
-
"#{bindir_mounts}\n" \
|
93
|
-
"(Odd is key, even is value)"
|
94
|
-
end
|
67
|
+
return unless @config&.binaries_from
|
95
68
|
|
69
|
+
bindir_mounts
|
96
70
|
libdir_mounts
|
97
71
|
|
98
72
|
binds_for_features
|
@@ -100,9 +74,19 @@ class Bwrap::Args::Bind
|
|
100
74
|
@library_bind.extra_executables_mounts
|
101
75
|
end
|
102
76
|
|
77
|
+
def device_binds
|
78
|
+
device = Bwrap::Args::Bind::Device.new @args
|
79
|
+
device.config = @config
|
80
|
+
|
81
|
+
device.dev_mount
|
82
|
+
device.bind_dev_dri
|
83
|
+
device.bind_sys_dev_char
|
84
|
+
device.bind_pci_devices
|
85
|
+
end
|
86
|
+
|
103
87
|
# These are something user can specify to do custom --ro-bind binds.
|
104
88
|
def custom_read_only_binds
|
105
|
-
return unless @config
|
89
|
+
return unless @config&.ro_binds
|
106
90
|
|
107
91
|
binds = []
|
108
92
|
@config.ro_binds.each do |source_path, destination_path|
|
@@ -114,12 +98,30 @@ class Bwrap::Args::Bind
|
|
114
98
|
|
115
99
|
# Performs cleanup operations after execution.
|
116
100
|
def cleanup
|
117
|
-
Bwrap::
|
101
|
+
Bwrap::Resolvers::Library.clear_needed_libraries_cache
|
102
|
+
end
|
103
|
+
|
104
|
+
# Used by {#handle_system_mounts}.
|
105
|
+
private def bindir_mounts
|
106
|
+
bindir_mounts = []
|
107
|
+
binaries_from = @config.binaries_from
|
108
|
+
binaries_from.each do |path|
|
109
|
+
bindir_mounts << "--ro-bind" << path << path
|
110
|
+
end
|
111
|
+
@environment.add_to_path binaries_from
|
112
|
+
|
113
|
+
@args.add :bindir, bindir_mounts
|
114
|
+
|
115
|
+
return unless debug? and !bindir_mounts.empty?
|
116
|
+
|
117
|
+
debug "Using following bindir mounts:\n" \
|
118
|
+
"#{bindir_mounts}\n" \
|
119
|
+
"(Odd is key, even is value)"
|
118
120
|
end
|
119
121
|
|
120
122
|
# Used by {#handle_system_mounts}.
|
121
123
|
private def libdir_mounts
|
122
|
-
return unless @config
|
124
|
+
return unless @config&.libdir_mounts
|
123
125
|
|
124
126
|
libdir_mounts = %w{
|
125
127
|
--ro-bind /lib /lib
|
@@ -139,9 +141,9 @@ class Bwrap::Args::Bind
|
|
139
141
|
|
140
142
|
private def construct_library_bind
|
141
143
|
library_bind = Bwrap::Args::Bind::Library.new @args
|
142
|
-
library_bind.command = @command
|
143
144
|
library_bind.config = @config
|
144
145
|
library_bind.environment = @environment
|
146
|
+
library_bind.executable = @executable
|
145
147
|
|
146
148
|
@library_bind = library_bind
|
147
149
|
end
|
data/lib/bwrap/args/construct.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require "tempfile"
|
4
4
|
|
5
5
|
require "bwrap/output"
|
6
|
+
require "bwrap/resolvers/executable"
|
6
7
|
require_relative "args"
|
7
8
|
require_relative "bind"
|
8
9
|
require_relative "environment"
|
@@ -10,6 +11,7 @@ require_relative "features"
|
|
10
11
|
require_relative "machine_id"
|
11
12
|
require_relative "mount"
|
12
13
|
require_relative "network"
|
14
|
+
require_relative "user"
|
13
15
|
|
14
16
|
# Constructs arguments for bwrap execution.
|
15
17
|
class Bwrap::Args::Construct
|
@@ -18,6 +20,13 @@ class Bwrap::Args::Construct
|
|
18
20
|
|
19
21
|
attr_writer :config
|
20
22
|
|
23
|
+
def initialize
|
24
|
+
# If a key is not found, it is initialized with an empty array.
|
25
|
+
@args = Bwrap::Args::Args.new
|
26
|
+
|
27
|
+
@executable = Bwrap::Resolvers::Executable.new
|
28
|
+
end
|
29
|
+
|
21
30
|
# Command that is executed inside bwrap sandbox.
|
22
31
|
#
|
23
32
|
# @note This is not used for anything vital, but some things, like
|
@@ -25,17 +34,14 @@ class Bwrap::Args::Construct
|
|
25
34
|
# additional data.
|
26
35
|
#
|
27
36
|
# @param value [Array, String] Command with arguments
|
28
|
-
|
29
|
-
|
30
|
-
def initialize
|
31
|
-
# If a key is not found, it is initialized with an empty array.
|
32
|
-
@args = Bwrap::Args::Args.new
|
37
|
+
def command= value
|
38
|
+
@executable.command = value
|
33
39
|
end
|
34
40
|
|
35
41
|
# Parses data given with {Config} so it can be outputted in proper
|
36
42
|
# order by {#bwrap_arguments}.
|
37
43
|
#
|
38
|
-
# @note Command given to {Bwrap#run} is set to {Bind#command}.
|
44
|
+
# @note Command given to {Bwrap#run} is set to {Bind#command=}.
|
39
45
|
def calculate
|
40
46
|
create_objects
|
41
47
|
|
@@ -51,12 +57,9 @@ class Bwrap::Args::Construct
|
|
51
57
|
@bind.handle_system_mounts
|
52
58
|
@features.feature_binds
|
53
59
|
@bind.custom_read_only_binds
|
54
|
-
create_user_dir
|
55
|
-
read_only_pulseaudio
|
56
|
-
|
57
|
-
@bind.bind_dev_dri
|
58
|
-
@bind.bind_sys_dev_char
|
59
|
-
@bind.bind_pci_devices
|
60
|
+
@user.create_user_dir
|
61
|
+
@user.read_only_pulseaudio
|
62
|
+
@bind.device_binds
|
60
63
|
proc_mount
|
61
64
|
tmp_as_tmpfs
|
62
65
|
@bind.bind_home_directory
|
@@ -70,7 +73,7 @@ class Bwrap::Args::Construct
|
|
70
73
|
|
71
74
|
# Returns arguments to pass to bwrap.
|
72
75
|
#
|
73
|
-
# @note Command given to {Bwrap#run} is set to {Bind#command}.
|
76
|
+
# @note Command given to {Bwrap#run} is set to {Bind#command=}.
|
74
77
|
def bwrap_arguments
|
75
78
|
args = []
|
76
79
|
|
@@ -124,11 +127,11 @@ class Bwrap::Args::Construct
|
|
124
127
|
@bind&.cleanup
|
125
128
|
end
|
126
129
|
|
127
|
-
# Used by {#
|
130
|
+
# Used by {#calculate}.
|
128
131
|
private def create_objects
|
129
132
|
@bind = Bwrap::Args::Bind.new
|
130
133
|
@bind.args = @args
|
131
|
-
@bind.
|
134
|
+
@bind.executable = @executable
|
132
135
|
@bind.config = @config
|
133
136
|
|
134
137
|
@environment = Bwrap::Args::Environment.new
|
@@ -144,33 +147,17 @@ class Bwrap::Args::Construct
|
|
144
147
|
|
145
148
|
@network = Bwrap::Args::Network.new @args
|
146
149
|
@network.config = @config
|
150
|
+
|
151
|
+
@user = Bwrap::Args::User.new @args
|
152
|
+
@user.config = @config
|
147
153
|
end
|
148
154
|
|
149
155
|
# Arguments for generating .Xauthority file.
|
150
156
|
private def xauthority_args
|
151
|
-
return unless @config
|
157
|
+
return unless @config&.xorg_application
|
152
158
|
|
153
159
|
xauth_args = %W{ --ro-bind #{Dir.home}/.Xauthority #{Dir.home}/.Xauthority }
|
154
160
|
debug "Binding following .Xauthority file: #{Dir.home}/.Xauthority"
|
155
161
|
@args.add :xauthority, xauth_args
|
156
162
|
end
|
157
|
-
|
158
|
-
# Arguments to create `/run/user/#{uid}`.
|
159
|
-
private def create_user_dir
|
160
|
-
trace "Creating directory /run/user/#{uid}"
|
161
|
-
@args.add :user_dir, %W{ --dir /run/user/#{uid} }
|
162
|
-
end
|
163
|
-
|
164
|
-
# Arguments to bind necessary pulseaudio data for audio support.
|
165
|
-
private def read_only_pulseaudio
|
166
|
-
return unless @config.audio.include? :pulseaudio
|
167
|
-
|
168
|
-
debug "Binding pulseaudio"
|
169
|
-
@args.add :audio, %W{ --ro-bind /run/user/#{uid}/pulse /run/user/#{uid}/pulse }
|
170
|
-
end
|
171
|
-
|
172
|
-
# Returns current user id.
|
173
|
-
private def uid
|
174
|
-
Process.uid
|
175
|
-
end
|
176
163
|
end
|
@@ -27,6 +27,9 @@ class Bwrap::Args::Environment < Hash
|
|
27
27
|
|
28
28
|
env_paths
|
29
29
|
|
30
|
+
# If nothing has been added to path, the map would result to empty --setenv.
|
31
|
+
return self if empty?
|
32
|
+
|
30
33
|
map do |key, value|
|
31
34
|
if key == "PATH" and value.respond_to? :join
|
32
35
|
value = value.join ":"
|
@@ -38,7 +41,7 @@ class Bwrap::Args::Environment < Hash
|
|
38
41
|
|
39
42
|
# @return [Array] All environment paths added via {Config#add_env_path} and other parsing logic
|
40
43
|
def env_paths
|
41
|
-
if @config.env_paths.respond_to? :each
|
44
|
+
if @config and @config.env_paths.respond_to? :each
|
42
45
|
self["PATH"] |= @config.env_paths
|
43
46
|
end
|
44
47
|
|
@@ -66,6 +69,7 @@ class Bwrap::Args::Environment < Hash
|
|
66
69
|
|
67
70
|
# Ruby feature specific environment path handling.
|
68
71
|
private def ruby_env_paths
|
72
|
+
return unless @config
|
69
73
|
return unless @config.features.ruby.enabled?
|
70
74
|
return unless @config.features.ruby.gem_env_paths?
|
71
75
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "bwrap/resolvers/library"
|
4
|
+
|
3
5
|
# Implementation for Ruby feature set.
|
4
6
|
#
|
5
7
|
# @api private
|
@@ -33,7 +35,7 @@ class Bwrap::Args::Features::RubyBinds < Bwrap::Args::Features::BindsBase
|
|
33
35
|
ruby_config = @config.features.ruby.ruby_config
|
34
36
|
|
35
37
|
library_mounts = []
|
36
|
-
library = Bwrap::
|
38
|
+
library = Bwrap::Resolvers::Library.new
|
37
39
|
stdlib.each do |lib|
|
38
40
|
path = "#{ruby_config["rubyarchdir"]}/#{lib}.so"
|
39
41
|
|
data/lib/bwrap/args/features.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require "bwrap/output"
|
4
4
|
require_relative "args"
|
5
|
-
require_relative "library"
|
6
5
|
|
7
6
|
# Feature parameter construction.
|
8
7
|
#
|
@@ -68,7 +67,7 @@ class Bwrap::Args::Features < Hash
|
|
68
67
|
end
|
69
68
|
|
70
69
|
private def bash_binds
|
71
|
-
return unless @config.features.bash.enabled?
|
70
|
+
return unless @config and @config.features.bash.enabled?
|
72
71
|
|
73
72
|
binds = BashBinds.new
|
74
73
|
|
@@ -76,7 +75,7 @@ class Bwrap::Args::Features < Hash
|
|
76
75
|
end
|
77
76
|
|
78
77
|
private def nscd_binds
|
79
|
-
return unless @config.features.nscd.enabled?
|
78
|
+
return unless @config and @config.features.nscd.enabled?
|
80
79
|
|
81
80
|
binds = NscdBinds.new
|
82
81
|
|
@@ -86,7 +85,7 @@ class Bwrap::Args::Features < Hash
|
|
86
85
|
# @note This does not allow development headers needed for compilation for now.
|
87
86
|
# I’ll look at it after I have an use for it.
|
88
87
|
private def ruby_binds
|
89
|
-
return unless @config.features.ruby.enabled?
|
88
|
+
return unless @config and @config.features.ruby.enabled?
|
90
89
|
|
91
90
|
binds = RubyBinds.new @config
|
92
91
|
|