From 7adf04858ef533b10a9cd11ff1a11d7b7752bba9 Mon Sep 17 00:00:00 2001 From: denglertai <50700317+denglertai@users.noreply.github.com> Date: Fri, 29 Sep 2023 11:34:27 +0200 Subject: [PATCH] feat(backend): parse expires_in from string in TokenResponse (#2353) * feat(backend): parse expires_in from string in TokenResponse * Update more_serde.rs --------- Co-authored-by: Ruben Fiszel --- backend/windmill-api/src/oauth2.rs | 3 +++ backend/windmill-common/src/more_serde.rs | 31 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/backend/windmill-api/src/oauth2.rs b/backend/windmill-api/src/oauth2.rs index fe06b35450..bba919fb5d 100644 --- a/backend/windmill-api/src/oauth2.rs +++ b/backend/windmill-api/src/oauth2.rs @@ -37,6 +37,7 @@ use windmill_common::db::UserDB; use windmill_common::jobs::JobPayload; use windmill_common::users::username_to_permissioned_as; use windmill_common::utils::{not_found_if_none, now_from_db}; +use windmill_common::more_serde::maybe_number_opt; use crate::db::ApiAuthed; use crate::saml::SamlSsoLogin; @@ -340,6 +341,8 @@ pub struct SlackTokenResponse { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct TokenResponse { access_token: AccessToken, + #[serde(deserialize_with = "maybe_number_opt")] + #[serde(default)] expires_in: Option, refresh_token: Option, #[serde(deserialize_with = "helpers::deserialize_space_delimited_vec")] diff --git a/backend/windmill-common/src/more_serde.rs b/backend/windmill-common/src/more_serde.rs index f51ca71d29..f879a07abb 100644 --- a/backend/windmill-common/src/more_serde.rs +++ b/backend/windmill-common/src/more_serde.rs @@ -9,6 +9,8 @@ //! helpers for serde + serde derive attributes use crate::utils::rd_string; +use serde::{Deserialize, Deserializer}; +use std::{fmt::Display, str::FromStr}; pub fn default_true() -> bool { true @@ -33,3 +35,32 @@ pub fn default_id() -> String { pub fn is_default(t: &T) -> bool { &T::default() == t } + +pub fn maybe_number_opt<'de, T, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, + T: FromStr + serde::Deserialize<'de>, + ::Err: Display, +{ + #[derive(Deserialize)] + #[serde(untagged)] + enum NumericOrNull<'a, T> { + String(String), + Str(&'a str), + RawT(T), + Null, + } + + match NumericOrNull::::deserialize(deserializer)? { + NumericOrNull::String(s) => match s.as_str() { + "" => Ok(None), + _ => T::from_str(&s).map(Some).map_err(serde::de::Error::custom), + }, + NumericOrNull::Str(s) => match s { + "" => Ok(None), + _ => T::from_str(s).map(Some).map_err(serde::de::Error::custom), + }, + NumericOrNull::RawT(i) => Ok(Some(i)), + NumericOrNull::Null => Ok(None), + } +}