| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use serde::Deserialize; |
| |
| /// Privilege group for a crate. They are ordered with higher values being |
| /// higher privilege. |
| #[derive(Copy, Clone, Debug, Deserialize, Hash, PartialEq, Eq, Ord, PartialOrd)] |
| #[serde(rename_all = "lowercase")] |
| pub enum Group { |
| /// Test-only code (or for tools that don't contribute directly to the |
| /// shipping product). |
| Test, |
| /// Crates that do not satisfy the Rule of Two, and thus must be used from |
| /// a sandboxed process. |
| Sandbox, |
| /// Crates that satisfy the Rule of Two, and can be used without |
| /// restriction from any process. |
| Safe, |
| } |
| |
| #[derive(Debug)] |
| pub struct GroupParseError; |
| impl std::error::Error for GroupParseError {} |
| impl std::fmt::Display for GroupParseError { |
| fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { |
| write!(f, "failed ot parse group, should be one of: safe|sandbox|test") |
| } |
| } |
| |
| #[cfg(test)] |
| mod test { |
| use super::*; |
| |
| #[test] |
| fn least_privilege() { |
| assert_eq!(std::cmp::min(Group::Safe, Group::Safe), Group::Safe); |
| assert_eq!(std::cmp::min(Group::Safe, Group::Sandbox), Group::Sandbox); |
| assert_eq!(std::cmp::min(Group::Sandbox, Group::Safe), Group::Sandbox); |
| assert_eq!(std::cmp::min(Group::Safe, Group::Test), Group::Test); |
| assert_eq!(std::cmp::min(Group::Test, Group::Safe), Group::Test); |
| assert_eq!(std::cmp::min(Group::Sandbox, Group::Sandbox), Group::Sandbox); |
| assert_eq!(std::cmp::min(Group::Sandbox, Group::Test), Group::Test); |
| assert_eq!(std::cmp::min(Group::Test, Group::Sandbox), Group::Test); |
| assert_eq!(std::cmp::min(Group::Test, Group::Test), Group::Test); |
| } |
| } |