Skip to content

Commit f6ddea8

Browse files
committed
add partial denied
1 parent efacd4d commit f6ddea8

File tree

5 files changed

+51
-24
lines changed

5 files changed

+51
-24
lines changed

ext/os/lib.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use deno_core::op2;
1414
use deno_core::v8;
1515
use deno_path_util::normalize_path;
1616
use deno_permissions::PermissionCheckError;
17+
use deno_permissions::PermissionState;
1718
use deno_permissions::PermissionsContainer;
1819
use serde::Serialize;
1920

@@ -181,7 +182,9 @@ fn check_env_with_maybe_exit(
181182
) -> Result<ControlFlow<()>, PermissionCheckError> {
182183
match state.borrow_mut::<PermissionsContainer>().check_env(key) {
183184
Ok(()) => Ok(ControlFlow::Continue(())),
184-
Err(PermissionCheckError::PermissionDenied(err)) if err.is_ignored => {
185+
Err(PermissionCheckError::PermissionDenied(err))
186+
if err.state == PermissionState::Ignored =>
187+
{
185188
Ok(ControlFlow::Break(()))
186189
}
187190
Err(err) => Err(err),
@@ -203,24 +206,33 @@ fn op_env(
203206
let permissions_container = state.borrow_mut::<PermissionsContainer>();
204207
let grant_all = match permissions_container.check_env_all() {
205208
Ok(()) => true,
206-
Err(PermissionCheckError::PermissionDenied(err)) if err.is_ignored => false,
209+
Err(PermissionCheckError::PermissionDenied(err)) => match err.state {
210+
PermissionState::Granted
211+
| PermissionState::Prompt
212+
| PermissionState::Denied => return Err(err.into()),
213+
PermissionState::GrantedPartial
214+
| PermissionState::DeniedPartial
215+
| PermissionState::Ignored => false,
216+
},
207217
Err(err) => return Err(err),
208218
};
209219
Ok(
210220
env::vars_os()
211221
.filter_map(|kv| {
212222
let (k, v) = map_kv(kv)?;
213223
let state = if grant_all {
214-
deno_permissions::PermissionState::Granted
224+
PermissionState::Granted
215225
} else {
216226
permissions_container.query_env(Some(&k))
217227
};
218228
match state {
219-
deno_permissions::PermissionState::Granted
220-
| deno_permissions::PermissionState::GrantedPartial => Some((k, v)),
221-
deno_permissions::PermissionState::Ignored
222-
| deno_permissions::PermissionState::Prompt
223-
| deno_permissions::PermissionState::Denied => None,
229+
PermissionState::Granted | PermissionState::GrantedPartial => {
230+
Some((k, v))
231+
}
232+
PermissionState::Ignored
233+
| PermissionState::Prompt
234+
| PermissionState::Denied
235+
| PermissionState::DeniedPartial => None,
224236
}
225237
})
226238
.collect(),

runtime/ops/permissions.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ impl From<PermissionState> for PermissionStatus {
3737
PermissionStatus {
3838
state: match state {
3939
PermissionState::GrantedPartial => PermissionState::Granted.to_string(),
40-
PermissionState::Ignored => PermissionState::Denied.to_string(),
40+
PermissionState::Ignored | PermissionState::DeniedPartial => {
41+
PermissionState::Denied.to_string()
42+
}
4143
PermissionState::Granted
4244
| PermissionState::Prompt
4345
| PermissionState::Denied => state.to_string(),

runtime/permissions/lib.rs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub struct PermissionDeniedError {
6262
pub access: String,
6363
pub name: &'static str,
6464
pub custom_message: Option<String>,
65-
pub is_ignored: bool,
65+
pub state: PermissionState,
6666
}
6767

6868
fn format_permission_error(name: &'static str) -> String {
@@ -134,7 +134,8 @@ pub enum PermissionState {
134134
#[default]
135135
Prompt = 2,
136136
Denied = 3,
137-
Ignored = 4,
137+
DeniedPartial = 4,
138+
Ignored = 5,
138139
}
139140

140141
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -446,12 +447,13 @@ impl PermissionState {
446447
fn permission_denied_error(
447448
name: &'static str,
448449
info: Option<&str>,
450+
state: PermissionState,
449451
) -> PermissionDeniedError {
450452
PermissionDeniedError {
451453
access: Self::fmt_access(name, info),
452454
name,
453455
custom_message: None,
454-
is_ignored: false,
456+
state,
455457
}
456458
}
457459

@@ -474,9 +476,14 @@ impl PermissionState {
474476
Self::log_perm_access(name, || info.map(|i| i.to_string()));
475477
(Ok(()), true)
476478
}
477-
PromptResponse::Deny => {
478-
(Err(Self::permission_denied_error(name, info)), false)
479-
}
479+
PromptResponse::Deny => (
480+
Err(Self::permission_denied_error(
481+
name,
482+
info,
483+
PermissionState::Denied,
484+
)),
485+
false,
486+
),
480487
}
481488
}
482489

@@ -501,7 +508,7 @@ impl PermissionState {
501508
access: Self::fmt_access(name, info().as_deref()),
502509
name,
503510
custom_message: message,
504-
is_ignored: false,
511+
state: PermissionState::Denied,
505512
}),
506513
false,
507514
false,
@@ -535,9 +542,8 @@ impl PermissionState {
535542
});
536543
(result, true, is_allow_all)
537544
}
538-
_ => {
539-
let mut err = Self::permission_denied_error(name, info().as_deref());
540-
err.is_ignored = matches!(self, PermissionState::Ignored);
545+
state => {
546+
let err = Self::permission_denied_error(name, info().as_deref(), state);
541547
(Err(err), false, false)
542548
}
543549
}
@@ -550,7 +556,9 @@ impl fmt::Display for PermissionState {
550556
PermissionState::Granted => f.pad("granted"),
551557
PermissionState::GrantedPartial => f.pad("granted-partial"),
552558
PermissionState::Prompt => f.pad("prompt"),
553-
PermissionState::Denied => f.pad("denied"),
559+
PermissionState::Denied | PermissionState::DeniedPartial => {
560+
f.pad("denied")
561+
}
554562
PermissionState::Ignored => f.pad("ignored"),
555563
}
556564
}
@@ -852,7 +860,7 @@ impl<
852860
AllowPartial::TreatAsGranted => PermissionState::Granted,
853861
AllowPartial::TreatAsDenied => {
854862
if self.is_partial_flag_denied(desc) {
855-
PermissionState::Denied
863+
PermissionState::DeniedPartial
856864
} else {
857865
PermissionState::Granted
858866
}
@@ -870,7 +878,7 @@ impl<
870878
} else if matches!(allow_partial, AllowPartial::TreatAsDenied)
871879
&& self.is_partial_flag_denied(desc)
872880
{
873-
PermissionState::Denied
881+
PermissionState::DeniedPartial
874882
} else {
875883
PermissionState::Prompt
876884
}
@@ -3780,6 +3788,7 @@ impl PermissionsContainer {
37803788
PermissionState::permission_denied_error(
37813789
"all",
37823790
Some(display_name.as_ref()),
3791+
PermissionState::Denied,
37833792
)
37843793
.into(),
37853794
)

tests/specs/permission/ignore_env/__test__.jsonc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
},
1616
"some_allow_env": {
1717
"args": "run --ignore-env=VAR1 --allow-env main.ts",
18-
"output": "undefined\n2\n"
18+
"output": "undefined\n2\n[WILDCARD]"
1919
}
2020
}
2121
}
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
console.log(Deno.env.get("VAR1"));
22
console.log(Deno.env.get("VAR2"));
3-
console.log(Deno.env.toObject());
3+
const object = Deno.env.toObject();
4+
console.log(object);
5+
if ("VAR1" in object) {
6+
throw "FAILED";
7+
}

0 commit comments

Comments
 (0)