@@ -47,12 +47,72 @@ struct PluginCommand: SwiftCommand {
47
47
)
48
48
var additionalAllowedWritableDirectories : [ String ] = [ ]
49
49
50
- enum NetworkPermission : String , EnumerableFlag , ExpressibleByArgument {
50
+ enum NetworkPermission : EnumerableFlag , ExpressibleByArgument {
51
+ static var allCases : [ PluginCommand . PluginOptions . NetworkPermission ] {
52
+ return [ . none, . local( ports: [ ] ) , . all( ports: [ ] ) , . docker, . unixDomainSocket]
53
+ }
54
+
51
55
case none
52
- case local
53
- case all
56
+ case local( ports : [ Int ] )
57
+ case all( ports : [ Int ] )
54
58
case docker
55
59
case unixDomainSocket
60
+
61
+ init ? ( argument: String ) {
62
+ let arg = argument. lowercased ( )
63
+ switch arg {
64
+ case " none " :
65
+ self = . none
66
+ case " docker " :
67
+ self = . docker
68
+ case " unixdomainsocket " :
69
+ self = . unixDomainSocket
70
+ default :
71
+ if " all " == arg. prefix ( 3 ) {
72
+ let ports = Self . parsePorts ( arg)
73
+ self = . all( ports: ports)
74
+ } else if " local " == arg. prefix ( 5 ) {
75
+ let ports = Self . parsePorts ( arg)
76
+ self = . local( ports: ports)
77
+ } else {
78
+ return nil
79
+ }
80
+ }
81
+ }
82
+
83
+ static func parsePorts( _ string: String ) -> [ Int ] {
84
+ let parts = string. split ( separator: " : " )
85
+ guard parts. count == 2 else {
86
+ return [ ]
87
+ }
88
+ return parts [ 1 ]
89
+ . split ( separator: " , " )
90
+ . compactMap { String ( $0) . spm_chuzzle ( ) }
91
+ . compactMap { Int ( $0) }
92
+ }
93
+
94
+ var remedyDescription : String {
95
+ switch self {
96
+ case . none:
97
+ return " none "
98
+ case . local( let ports) :
99
+ if ports. isEmpty {
100
+ return " local "
101
+ } else {
102
+ return " local: \( ports. map ( String . init) . joined ( separator: " , " ) ) "
103
+ }
104
+ case . all( let ports) :
105
+ if ports. isEmpty {
106
+ return " all "
107
+ } else {
108
+ return " all: \( ports. map ( String . init) . joined ( separator: " , " ) ) "
109
+ }
110
+ case . docker:
111
+ return " docker "
112
+ case . unixDomainSocket:
113
+ return " unixDomainSocket "
114
+ }
115
+ }
56
116
}
57
117
58
118
@Option ( name: . customLong( " allow-network-connections " ) )
@@ -211,7 +271,7 @@ struct PluginCommand: SwiftCommand {
211
271
212
272
reasonString = reason
213
273
remedyOption =
214
- " --allow-network-connections \( PluginCommand . PluginOptions. NetworkPermission ( scope) . defaultValueDescription ) "
274
+ " --allow-network-connections \( PluginCommand . PluginOptions. NetworkPermission ( scope) . remedyDescription ) "
215
275
}
216
276
217
277
let problem = " Plugin ‘ \( plugin. name) ’ wants permission to \( permissionString) . "
@@ -377,8 +437,8 @@ extension PluginCommand.PluginOptions.NetworkPermission {
377
437
case . unixDomainSocket: self = . unixDomainSocket
378
438
case . docker: self = . docker
379
439
case . none: self = . none
380
- case . all: self = . all
381
- case . local: self = . local
440
+ case . all( let ports ) : self = . all( ports : ports )
441
+ case . local( let ports ) : self = . local( ports : ports )
382
442
}
383
443
}
384
444
}
@@ -387,8 +447,8 @@ extension SandboxNetworkPermission {
387
447
init ( _ permission: PluginCommand . PluginOptions . NetworkPermission ) {
388
448
switch permission {
389
449
case . none: self = . none
390
- case . local: self = . local( ports: [ ] )
391
- case . all: self = . all( ports: [ ] )
450
+ case . local( let ports ) : self = . local( ports: ports )
451
+ case . all( let ports ) : self = . all( ports: ports )
392
452
case . docker: self = . docker
393
453
case . unixDomainSocket: self = . unixDomainSocket
394
454
}
0 commit comments