ddnet_account_client/
logout.rs1use ddnet_accounts_shared::client::{logout::prepare_logout_request, machine_id::machine_uid};
2use thiserror::Error;
3
4use crate::{
5 errors::{FsLikeError, HttpLikeError},
6 interface::Io,
7 safe_interface::{IoSafe, SafeIo},
8};
9
10#[derive(Error, Debug)]
12pub enum LogoutResult {
13 #[error("The session was not valid anymore.")]
15 SessionWasInvalid,
16 #[error("{0}")]
19 FsLikeError(FsLikeError),
20 #[error("{0}")]
22 HttpLikeError(HttpLikeError),
23 #[error("Logging out failed: {0}")]
25 Other(anyhow::Error),
26}
27
28impl From<HttpLikeError> for LogoutResult {
29 fn from(value: HttpLikeError) -> Self {
30 Self::HttpLikeError(value)
31 }
32}
33
34impl From<FsLikeError> for LogoutResult {
35 fn from(value: FsLikeError) -> Self {
36 Self::FsLikeError(value)
37 }
38}
39
40pub async fn logout(io: &dyn Io) -> anyhow::Result<(), LogoutResult> {
46 logout_impl(io.into()).await
47}
48
49async fn logout_impl(io: IoSafe<'_>) -> anyhow::Result<(), LogoutResult> {
50 let key_pair = io.read_serialized_session_key_pair().await?;
52
53 let hashed_hw_id = machine_uid().map_err(LogoutResult::Other)?;
54
55 let msg = prepare_logout_request(hashed_hw_id, &key_pair.private_key, key_pair.public_key);
57 io.request_logout(msg)
58 .await?
59 .map_err(|err| LogoutResult::Other(err.into()))?;
60
61 io.remove_serialized_session_key_pair().await?;
63 Ok(())
64}