bwrap 1.1.1 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 352b23610ac14344695cc17c4bcdaeaf7307b3742983f520581251b4bb7f85a5
4
- data.tar.gz: e4cfa7fb8ca749e5dfddf11f6eb030fd82af1bd2a15dad5062d9ba4fd9be72fb
3
+ metadata.gz: 2d50d32e5158e20f7a5a1f75124c8b657a12b54b3392612d5aa11e9717add289
4
+ data.tar.gz: 7ac4aede1519880cd7c4e48d233688d1fb0d2ade75e8dc202bd27969d9c28428
5
5
  SHA512:
6
- metadata.gz: cb7feb42474faa52ab6cce4cafd66daabf20f8490519a0f950885b1347332d38a6c335de40d6db4c7371e9eb0a0a722352d6e4613db3e3df193688ae896c584e
7
- data.tar.gz: 90892a26e8efddc5112c4fa22bd1b95e8380f1860df1680031549f0addf485b4229fcdd11d786a63d476bf151483db60eba7682d045d35b08dfccea88e6b5f44
6
+ metadata.gz: 88dfdab0abd2342289724060107c1a8fcc681eac5a4b24f402e316cc8d4470e33cb9fe11f7be1072b2dc0b97f3b1fc10e7df92bce192f0de9de9978f423237c0
7
+ data.tar.gz: 76fc0bd2dc04e98b3254a540813212a6b9fb7cba1b7c0f64f49a19577106eb0dc8efac79215e4f689a229e1bfce57e9b9ca0926347d552d28000aa815697892f
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changes
2
2
 
3
+ ## 1.3.1 (06.01.2023)
4
+
5
+ * Renewed expired key
6
+
7
+ ## 1.3.0 (06.01.2023)
8
+
9
+ NOTE: No gem was released due expired key.
10
+
11
+ * Introduced llvm-readelf as additional dependency for library resolution.
12
+ * Fix library resolution on newer systems.
13
+ * Made resolv.conf binding to require a configuration option.
14
+ * Added option for --unshare-all (enabled by default, which is previous behaviour).
15
+ * Return output of the command with Bwrap#run
16
+
17
+ ## 1.2.0 (20.07.2022)
18
+
19
+ * Properly throw execution failure exception
20
+ * Config is now optional argument for Bwrap#initialize
21
+ * Allow passing kwargs to Bwrap#run
22
+ * Allow passing config to execute
23
+
3
24
  ## 1.1.1 (07.06.2022)
4
25
 
5
26
  * Added Bwrap::Execution.popen2e
data/README.md CHANGED
@@ -20,6 +20,15 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install bwrap
22
22
 
23
+ Running system must have following executables present:
24
+ - scanelf (from pax-utils)
25
+
26
+ Additionally, for musl executables and libraries, following are necessary:
27
+ - ldd
28
+
29
+ Additionally, for glibc executables and libraries, following are necessary:
30
+ - llvm-readelf
31
+
23
32
  ## Usage
24
33
 
25
34
  For now this is under ongoing development, though semantic versioning will apply.
@@ -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 {Hash} defaults to nil as default argument, `Args` defaults to
14
- # {Array}.
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 {Hash} defaults to nil as default argument, `Args` defaults to
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
- # @returns self
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
- require_relative "../library"
6
- require_relative "mime"
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
- attr_writer :executable_name
31
+ # Instance of {Bwrap::Resolvers::Executable}.
32
+ attr_writer :executable
38
33
 
39
- attr_writer :executable_path
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 |executable|
49
- @executable_name = resolve_executable_name executable
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
- resolve_executable_libraries
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
- @executable_name = resolve_executable_name @command
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
- def resolve_executable_libraries
81
- debug "Resolving executable libraries of #{@executable_path}"
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
- # TODO: Put this behind additional flag for extra control/sanity.
84
- # Some executables are shell scripts and similar. For them we need to use the interpreter.
70
+ mime = Bwrap::Resolvers::Mime.new executable_name, executable_path
71
+ mime.resolve_mime_type
85
72
 
86
- mime = Mime.new @executable_name, @executable_path
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::Args::Library.new
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.add :extra_executable_libraries, library_mounts
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 resolve_executable_name command
128
- if command.is_a? String
129
- return command
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
- # Array-like.
133
- if command.respond_to? :at
134
- return command.at(0)
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
- raise "Can’t recognize type of given command. Type: #{command.class}"
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, not_inside_root: nil
142
- if @config&.command_inside_root.nil? or not_inside_root
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
 
@@ -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
- # Arguments to bind /dev/dri from host to sandbox.
30
- def bind_dev_dri
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.user
31
+ return unless @config&.user
50
32
 
51
33
  home_directory = "#{@config.sandbox_directory}/home"
52
34
 
@@ -71,28 +53,16 @@ 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
- return unless @config.full_system_mounts
56
+ return if @config && !@config&.full_system_mounts
75
57
 
76
58
  @library_bind.handle_given_command
77
59
  end
78
60
 
79
61
  # Arguments to read-only bind whole system inside sandbox.
80
62
  def handle_system_mounts
81
- bindir_mounts = []
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
63
+ return unless @config&.binaries_from
95
64
 
65
+ bindir_mounts
96
66
  libdir_mounts
97
67
 
98
68
  binds_for_features
@@ -100,9 +70,19 @@ class Bwrap::Args::Bind
100
70
  @library_bind.extra_executables_mounts
101
71
  end
102
72
 
73
+ def device_binds
74
+ device = Bwrap::Args::Bind::Device.new @args
75
+ device.config = @config
76
+
77
+ device.dev_mount
78
+ device.bind_dev_dri
79
+ device.bind_sys_dev_char
80
+ device.bind_pci_devices
81
+ end
82
+
103
83
  # These are something user can specify to do custom --ro-bind binds.
104
84
  def custom_read_only_binds
105
- return unless @config.ro_binds
85
+ return unless @config&.ro_binds
106
86
 
107
87
  binds = []
108
88
  @config.ro_binds.each do |source_path, destination_path|
@@ -114,12 +94,30 @@ class Bwrap::Args::Bind
114
94
 
115
95
  # Performs cleanup operations after execution.
116
96
  def cleanup
117
- Bwrap::Args::Library.clear_needed_libraries_cache
97
+ Bwrap::Resolvers::Library.clear_needed_libraries_cache
98
+ end
99
+
100
+ # Used by {#handle_system_mounts}.
101
+ private def bindir_mounts
102
+ bindir_mounts = []
103
+ binaries_from = @config.binaries_from
104
+ binaries_from.each do |path|
105
+ bindir_mounts << "--ro-bind" << path << path
106
+ end
107
+ @environment.add_to_path binaries_from
108
+
109
+ @args.add :bindir, bindir_mounts
110
+
111
+ return unless debug? and !bindir_mounts.empty?
112
+
113
+ debug "Using following bindir mounts:\n" \
114
+ "#{bindir_mounts}\n" \
115
+ "(Odd is key, even is value)"
118
116
  end
119
117
 
120
118
  # Used by {#handle_system_mounts}.
121
119
  private def libdir_mounts
122
- return unless @config.libdir_mounts
120
+ return unless @config&.libdir_mounts
123
121
 
124
122
  libdir_mounts = %w{
125
123
  --ro-bind /lib /lib
@@ -139,9 +137,9 @@ class Bwrap::Args::Bind
139
137
 
140
138
  private def construct_library_bind
141
139
  library_bind = Bwrap::Args::Bind::Library.new @args
142
- library_bind.command = @command
143
140
  library_bind.config = @config
144
141
  library_bind.environment = @environment
142
+ library_bind.executable = @executable
145
143
 
146
144
  @library_bind = library_bind
147
145
  end
@@ -3,13 +3,16 @@
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"
9
10
  require_relative "features"
10
11
  require_relative "machine_id"
11
12
  require_relative "mount"
13
+ require_relative "namespace"
12
14
  require_relative "network"
15
+ require_relative "user"
13
16
 
14
17
  # Constructs arguments for bwrap execution.
15
18
  class Bwrap::Args::Construct
@@ -18,6 +21,13 @@ class Bwrap::Args::Construct
18
21
 
19
22
  attr_writer :config
20
23
 
24
+ def initialize
25
+ # If a key is not found, it is initialized with an empty array.
26
+ @args = Bwrap::Args::Args.new
27
+
28
+ @executable = Bwrap::Resolvers::Executable.new
29
+ end
30
+
21
31
  # Command that is executed inside bwrap sandbox.
22
32
  #
23
33
  # @note This is not used for anything vital, but some things, like
@@ -25,17 +35,14 @@ class Bwrap::Args::Construct
25
35
  # additional data.
26
36
  #
27
37
  # @param value [Array, String] Command with arguments
28
- attr_writer :command
29
-
30
- def initialize
31
- # If a key is not found, it is initialized with an empty array.
32
- @args = Bwrap::Args::Args.new
38
+ def command= value
39
+ @executable.command = value
33
40
  end
34
41
 
35
42
  # Parses data given with {Config} so it can be outputted in proper
36
43
  # order by {#bwrap_arguments}.
37
44
  #
38
- # @note Command given to {Bwrap#run} is set to {Bind#command}.
45
+ # @note Command given to {Bwrap#run} is set to {Bind#command=}.
39
46
  def calculate
40
47
  create_objects
41
48
 
@@ -51,16 +58,13 @@ class Bwrap::Args::Construct
51
58
  @bind.handle_system_mounts
52
59
  @features.feature_binds
53
60
  @bind.custom_read_only_binds
54
- create_user_dir
55
- read_only_pulseaudio
56
- dev_mount
57
- @bind.bind_dev_dri
58
- @bind.bind_sys_dev_char
59
- @bind.bind_pci_devices
61
+ @user.create_user_dir
62
+ @user.read_only_pulseaudio
63
+ @bind.device_binds
60
64
  proc_mount
61
65
  tmp_as_tmpfs
62
66
  @bind.bind_home_directory
63
- @args.add :unshare_all, "--unshare-all" # Practically means that there would be nothing in the sandbox by default.
67
+ @namespace.shares
64
68
  @network.share_net
65
69
  @network.hostname
66
70
  @args.add :environment, @environment.environment_variables
@@ -70,7 +74,7 @@ class Bwrap::Args::Construct
70
74
 
71
75
  # Returns arguments to pass to bwrap.
72
76
  #
73
- # @note Command given to {Bwrap#run} is set to {Bind#command}.
77
+ # @note Command given to {Bwrap#run} is set to {Bind#command=}.
74
78
  def bwrap_arguments
75
79
  args = []
76
80
 
@@ -124,11 +128,11 @@ class Bwrap::Args::Construct
124
128
  @bind&.cleanup
125
129
  end
126
130
 
127
- # Used by {#construct_bwrap_args}.
131
+ # Used by {#calculate}.
128
132
  private def create_objects
129
133
  @bind = Bwrap::Args::Bind.new
130
134
  @bind.args = @args
131
- @bind.command = @command
135
+ @bind.executable = @executable
132
136
  @bind.config = @config
133
137
 
134
138
  @environment = Bwrap::Args::Environment.new
@@ -142,35 +146,22 @@ class Bwrap::Args::Construct
142
146
  @machine_id = Bwrap::Args::MachineId.new
143
147
  @machine_id.config = @config
144
148
 
149
+ @namespace = Bwrap::Args::Namespace.new @args
150
+ @namespace.config = @config
151
+
145
152
  @network = Bwrap::Args::Network.new @args
146
153
  @network.config = @config
154
+
155
+ @user = Bwrap::Args::User.new @args
156
+ @user.config = @config
147
157
  end
148
158
 
149
159
  # Arguments for generating .Xauthority file.
150
160
  private def xauthority_args
151
- return unless @config.xorg_application
161
+ return unless @config&.xorg_application
152
162
 
153
163
  xauth_args = %W{ --ro-bind #{Dir.home}/.Xauthority #{Dir.home}/.Xauthority }
154
164
  debug "Binding following .Xauthority file: #{Dir.home}/.Xauthority"
155
165
  @args.add :xauthority, xauth_args
156
166
  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
167
  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::Args::Library.new
38
+ library = Bwrap::Resolvers::Library.new
37
39
  stdlib.each do |lib|
38
40
  path = "#{ruby_config["rubyarchdir"]}/#{lib}.so"
39
41