1
1
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
2
2
use super :: dispatch_json:: { Deserialize , JsonOp , Value } ;
3
3
use crate :: ops:: json_op;
4
+ use crate :: permissions;
4
5
use crate :: state:: ThreadSafeState ;
5
6
use deno:: * ;
6
7
@@ -19,37 +20,40 @@ pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
19
20
) ;
20
21
}
21
22
22
- pub fn op_permissions (
23
- state : & ThreadSafeState ,
24
- _args : Value ,
25
- _zero_copy : Option < PinnedBuf > ,
26
- ) -> Result < JsonOp , ErrBox > {
27
- Ok ( JsonOp :: Sync ( json ! ( {
28
- "run" : state. permissions. allows_run( ) ,
29
- "read" : state. permissions. allows_read( ) ,
30
- "write" : state. permissions. allows_write( ) ,
31
- "net" : state. permissions. allows_net( ) ,
32
- "env" : state. permissions. allows_env( ) ,
33
- "hrtime" : state. permissions. allows_hrtime( ) ,
34
- } ) ) )
35
- }
36
-
37
23
#[ derive( Deserialize ) ]
38
24
struct PermissionArgs {
39
25
name : String ,
40
26
url : Option < String > ,
41
27
path : Option < String > ,
42
28
}
43
29
30
+ fn get_current_permission (
31
+ state : & ThreadSafeState ,
32
+ args : & PermissionArgs ,
33
+ ) -> Result < permissions:: PermissionAccessorState , ErrBox > {
34
+ Ok (
35
+ state
36
+ . permissions
37
+ . get_permission_state ( & args. name , & args. path , & args. url ) ?,
38
+ )
39
+ }
40
+
41
+ fn permission_state_to_json_op (
42
+ state : permissions:: PermissionAccessorState ,
43
+ ) -> JsonOp {
44
+ JsonOp :: Sync ( json ! ( {
45
+ "state" : state. to_string( )
46
+ } ) )
47
+ }
48
+
44
49
pub fn op_query_permission (
45
50
state : & ThreadSafeState ,
46
51
args : Value ,
47
52
_zero_copy : Option < PinnedBuf > ,
48
53
) -> Result < JsonOp , ErrBox > {
49
54
let args: PermissionArgs = serde_json:: from_value ( args) ?;
50
- Ok ( JsonOp :: Sync ( json ! ( {
51
- "state" : state. permissions. get_permission_string( args. name) ?
52
- } ) ) )
55
+ let perm = get_current_permission ( state, & args) ?;
56
+ Ok ( permission_state_to_json_op ( perm) )
53
57
}
54
58
55
59
pub fn op_request_permission (
@@ -58,19 +62,26 @@ pub fn op_request_permission(
58
62
_zero_copy : Option < PinnedBuf > ,
59
63
) -> Result < JsonOp , ErrBox > {
60
64
let args: PermissionArgs = serde_json:: from_value ( value) ?;
65
+ let path = args. path . as_ref ( ) ;
66
+ let url = args. url . as_ref ( ) ;
61
67
let name = args. name . as_ref ( ) ;
68
+ let perm = get_current_permission ( state, & args) ?;
69
+ if perm != permissions:: PermissionAccessorState :: Ask {
70
+ return Ok ( permission_state_to_json_op ( perm) ) ;
71
+ }
72
+
62
73
match name {
63
74
"run" => state. permissions . request_run ( ) ,
64
- "read" => state. permissions . request_read ( args . path . unwrap ( ) . as_ref ( ) ) ,
65
- "write" => state. permissions . request_write ( args . path . unwrap ( ) . as_ref ( ) ) ,
66
- "net" => state. permissions . request_net ( args . url . unwrap ( ) . as_ref ( ) ) ,
75
+ "read" => state. permissions . request_read ( path. unwrap ( ) . as_ref ( ) ) ,
76
+ "write" => state. permissions . request_write ( path. unwrap ( ) . as_ref ( ) ) ,
77
+ "net" => state. permissions . request_net ( url. unwrap ( ) . as_ref ( ) ) ,
67
78
"env" => state. permissions . request_env ( ) ,
68
79
"hrtime" => state. permissions . request_hrtime ( ) ,
69
80
_ => Ok ( ( ) ) ,
70
81
} ?;
71
- Ok ( JsonOp :: Sync ( json ! ( {
72
- "state" : state . permissions . get_permission_string ( args. name ) ?
73
- } ) ) )
82
+
83
+ let perm1 = get_current_permission ( state , & args) ? ;
84
+ Ok ( permission_state_to_json_op ( perm1 ) )
74
85
}
75
86
76
87
pub fn op_revoke_permission (
@@ -86,9 +97,9 @@ pub fn op_revoke_permission(
86
97
"net" => state. permissions . revoke_net ( ) ,
87
98
"env" => state. permissions . revoke_env ( ) ,
88
99
"hrtime" => state. permissions . revoke_hrtime ( ) ,
89
- _ => Ok ( ( ) ) ,
90
- } ? ;
91
- Ok ( JsonOp :: Sync ( json ! ( {
92
- "state" : state . permissions . get_permission_string ( args. name ) ?
93
- } ) ) )
100
+ _ => { }
101
+ } ;
102
+
103
+ let perm = get_current_permission ( state , & args) ? ;
104
+ Ok ( permission_state_to_json_op ( perm ) )
94
105
}
0 commit comments