client_management.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. use crate::{
  2. key::{HMacType, KeyType},
  3. schema, UIDCError,
  4. };
  5. use microrm::prelude::*;
  6. pub fn create(
  7. lease: &mut microrm::ConnectionLease,
  8. realm: &microrm::Stored<schema::Realm>,
  9. name: &String,
  10. key_type: KeyType,
  11. ) -> Result<(), UIDCError> {
  12. let rng = ring::rand::SystemRandom::new();
  13. let client_secret: [u8; 32] = ring::rand::generate(&rng).unwrap().expose();
  14. realm.clients.insert(
  15. lease,
  16. schema::Client {
  17. realm: realm.id(),
  18. shortname: name.into(),
  19. secret: base64::encode(client_secret),
  20. access_key_type: key_type.into(),
  21. refresh_key_type: KeyType::HMac(HMacType::Sha256).into_serialized(),
  22. direct_grant_enabled: false,
  23. redirects: Default::default(),
  24. scopes: Default::default(),
  25. },
  26. )?;
  27. Ok(())
  28. }
  29. pub fn rotate_secret(
  30. lease: &mut microrm::ConnectionLease,
  31. realm: &microrm::Stored<schema::Realm>,
  32. name: &str,
  33. ) -> Result<(), UIDCError> {
  34. let rng = ring::rand::SystemRandom::new();
  35. let client_secret: [u8; 32] = ring::rand::generate(&rng).unwrap().expose();
  36. let mut client = realm
  37. .clients
  38. .with(schema::Client::Shortname, name)
  39. .first()
  40. .get(lease)?
  41. .ok_or(UIDCError::Abort("no such client"))?;
  42. client.secret = base64::encode(client_secret);
  43. client.sync(lease)?;
  44. Ok(())
  45. }
  46. pub fn add_redirect(
  47. lease: &mut microrm::ConnectionLease,
  48. realm: &microrm::Stored<schema::Realm>,
  49. name: &str,
  50. pattern: &str,
  51. ) -> Result<(), UIDCError> {
  52. let Some(client) = realm.clients.keyed((realm.id(), name)).get(lease)? else {
  53. return Err(UIDCError::Abort("no such client"));
  54. };
  55. client.redirects.insert(
  56. lease,
  57. schema::ClientRedirect {
  58. redirect_pattern: pattern.into(),
  59. },
  60. )?;
  61. Ok(())
  62. }