scope_management.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use crate::{schema, UIDCError};
  2. use microrm::prelude::*;
  3. pub fn create_scope(realm: &microrm::Stored<schema::Realm>, name: &str) -> Result<(), UIDCError> {
  4. realm.scopes.insert(schema::Scope {
  5. realm: realm.id(),
  6. shortname: name.into(),
  7. roles: Default::default(),
  8. })?;
  9. Ok(())
  10. }
  11. pub fn list_scopes(realm: &schema::Realm) -> Result<(), UIDCError> {
  12. for scope in realm.scopes.get()? {
  13. println!("{}", scope.shortname);
  14. }
  15. Ok(())
  16. }
  17. pub fn inspect_scope(
  18. realm: &microrm::Stored<schema::Realm>,
  19. scope_name: &str,
  20. ) -> Result<(), UIDCError> {
  21. let scope = realm
  22. .scopes
  23. .keyed((realm.id(), scope_name))
  24. .get()?
  25. .ok_or(UIDCError::Abort("no such scope"))?;
  26. println!("scope name: {}", scope.shortname);
  27. println!("attached roles:");
  28. for role in scope.roles.get()? {
  29. println!(" - {}", role.shortname);
  30. }
  31. Ok(())
  32. }
  33. pub fn attach_role(
  34. realm: &microrm::Stored<schema::Realm>,
  35. scope_name: &str,
  36. role_name: &str,
  37. ) -> Result<(), UIDCError> {
  38. let scope = realm.scopes.keyed((realm.id(), scope_name)).get()?;
  39. let role = realm.roles.keyed((realm.id(), role_name)).get()?;
  40. match (scope, role) {
  41. (None, _) => Err(UIDCError::Abort("no such scope")),
  42. (_, None) => Err(UIDCError::Abort("no such role")),
  43. (Some(scope), Some(role)) => {
  44. scope.roles.connect_to(role.id())?;
  45. Ok(())
  46. }
  47. }
  48. }
  49. pub fn detach_role(
  50. realm: &microrm::Stored<schema::Realm>,
  51. scope_name: &str,
  52. role_name: &str,
  53. ) -> Result<(), UIDCError> {
  54. let scope = realm.scopes.keyed((realm.id(), scope_name)).get()?;
  55. let role = realm.roles.keyed((realm.id(), role_name)).get()?;
  56. if let Some((scope, role)) = scope.as_ref().zip(role) {
  57. scope.roles.disconnect_from(role.id())?;
  58. } else if scope.is_none() {
  59. println!("No such scope!");
  60. } else {
  61. println!("No such role!");
  62. }
  63. Ok(())
  64. }