refactor(permission-manager): deduplicate kind mapping into CapabilityKind::index/from_index

This commit is contained in:
2026-10-18 03:17:03 +02:00
parent 36cab28506
commit 962df75f85
2 changed files with 40 additions and 51 deletions

View File

@@ -13,6 +13,37 @@ pub enum CapabilityKind {
Bluetooth,
}
impl CapabilityKind {
pub fn index(self) -> usize {
match self {
Self::Display => 0,
Self::Input => 1,
Self::AudioPlayback => 2,
Self::AudioCapture => 3,
Self::Camera => 4,
Self::Storage => 5,
Self::Network => 6,
Self::Gps => 7,
Self::Bluetooth => 8,
}
}
pub fn from_index(v: usize) -> Option<Self> {
match v {
0 => Some(Self::Display),
1 => Some(Self::Input),
2 => Some(Self::AudioPlayback),
3 => Some(Self::AudioCapture),
4 => Some(Self::Camera),
5 => Some(Self::Storage),
6 => Some(Self::Network),
7 => Some(Self::Gps),
8 => Some(Self::Bluetooth),
_ => None,
}
}
}
#[derive(Debug, PartialEq)]
pub enum PermissionRequest {
RequestCapability { process: u16, kind: CapabilityKind },
@@ -30,46 +61,18 @@ pub enum PermissionResponse {
GrantedList(u16),
}
fn encode_kind(kind: CapabilityKind) -> usize {
match kind {
CapabilityKind::Display => 0,
CapabilityKind::Input => 1,
CapabilityKind::AudioPlayback => 2,
CapabilityKind::AudioCapture => 3,
CapabilityKind::Camera => 4,
CapabilityKind::Storage => 5,
CapabilityKind::Network => 6,
CapabilityKind::Gps => 7,
CapabilityKind::Bluetooth => 8,
}
}
fn decode_kind(v: usize) -> Option<CapabilityKind> {
match v {
0 => Some(CapabilityKind::Display),
1 => Some(CapabilityKind::Input),
2 => Some(CapabilityKind::AudioPlayback),
3 => Some(CapabilityKind::AudioCapture),
4 => Some(CapabilityKind::Camera),
5 => Some(CapabilityKind::Storage),
6 => Some(CapabilityKind::Network),
7 => Some(CapabilityKind::Gps),
8 => Some(CapabilityKind::Bluetooth),
_ => None,
}
}
impl Encode for PermissionRequest {
fn encode(&self) -> [usize; 4] {
match self {
PermissionRequest::RequestCapability { process, kind } => {
[0, *process as usize, encode_kind(*kind), 0]
[0, *process as usize, kind.index(), 0]
}
PermissionRequest::RevokeCapability { process, kind } => {
[1, *process as usize, encode_kind(*kind), 0]
[1, *process as usize, kind.index(), 0]
}
PermissionRequest::CheckCapability { process, kind } => {
[2, *process as usize, encode_kind(*kind), 0]
[2, *process as usize, kind.index(), 0]
}
PermissionRequest::ListGranted { process } => {
[3, *process as usize, 0, 0]
@@ -83,15 +86,15 @@ impl Decode for PermissionRequest {
match words[0] {
0 => Some(PermissionRequest::RequestCapability {
process: words[1] as u16,
kind: decode_kind(words[2])?,
kind: CapabilityKind::from_index(words[2])?,
}),
1 => Some(PermissionRequest::RevokeCapability {
process: words[1] as u16,
kind: decode_kind(words[2])?,
kind: CapabilityKind::from_index(words[2])?,
}),
2 => Some(PermissionRequest::CheckCapability {
process: words[1] as u16,
kind: decode_kind(words[2])?,
kind: CapabilityKind::from_index(words[2])?,
}),
3 => Some(PermissionRequest::ListGranted {
process: words[1] as u16,

View File

@@ -16,20 +16,6 @@ impl PermissionManager {
}
}
fn kind_index(kind: CapabilityKind) -> usize {
match kind {
CapabilityKind::Display => 0,
CapabilityKind::Input => 1,
CapabilityKind::AudioPlayback => 2,
CapabilityKind::AudioCapture => 3,
CapabilityKind::Camera => 4,
CapabilityKind::Storage => 5,
CapabilityKind::Network => 6,
CapabilityKind::Gps => 7,
CapabilityKind::Bluetooth => 8,
}
}
fn granted_bits(&self, process: u16) -> u16 {
let idx = process as usize;
if idx >= MAX_PROCESSES {
@@ -56,7 +42,7 @@ impl Server for PermissionManager {
if idx >= MAX_PROCESSES {
return PermissionResponse::Denied;
}
self.grants[idx][Self::kind_index(kind)] = true;
self.grants[idx][kind.index()] = true;
PermissionResponse::Granted
}
PermissionRequest::RevokeCapability { process, kind } => {
@@ -64,7 +50,7 @@ impl Server for PermissionManager {
if idx >= MAX_PROCESSES {
return PermissionResponse::Denied;
}
self.grants[idx][Self::kind_index(kind)] = false;
self.grants[idx][kind.index()] = false;
PermissionResponse::Revoked
}
PermissionRequest::CheckCapability { process, kind } => {
@@ -72,7 +58,7 @@ impl Server for PermissionManager {
if idx >= MAX_PROCESSES {
return PermissionResponse::HasCapability(false);
}
PermissionResponse::HasCapability(self.grants[idx][Self::kind_index(kind)])
PermissionResponse::HasCapability(self.grants[idx][kind.index()])
}
PermissionRequest::ListGranted { process } => {
PermissionResponse::GrantedList(self.granted_bits(process))