Fix json escaping breaking login endpoint

This commit is contained in:
Jonas Platte 2020-04-24 22:30:22 +02:00
parent d85191d511
commit f4b9841590
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
2 changed files with 19 additions and 46 deletions

View File

@ -2,7 +2,7 @@
use ruma_api::ruma_api; use ruma_api::ruma_api;
use ruma_identifiers::{DeviceId, UserId}; use ruma_identifiers::{DeviceId, UserId};
use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Serialize};
use crate::r0::thirdparty::Medium; use crate::r0::thirdparty::Medium;
@ -58,7 +58,8 @@ ruma_api! {
} }
/// Identification information for the user. /// Identification information for the user.
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(from = "user_serde::UserInfo", into = "user_serde::UserInfo")]
pub enum UserInfo { pub enum UserInfo {
/// Either a fully qualified Matrix user ID, or just the localpart (as part of the 'identifier' /// Either a fully qualified Matrix user ID, or just the localpart (as part of the 'identifier'
/// field). /// field).
@ -125,24 +126,6 @@ pub struct IdentityServerInfo {
mod user_serde; mod user_serde;
impl Serialize for UserInfo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
user_serde::UserInfo::from(self).serialize(serializer)
}
}
impl<'de> Deserialize<'de> for UserInfo {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
user_serde::UserInfo::deserialize(deserializer).map(Into::into)
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::convert::TryInto; use std::convert::TryInto;

View File

@ -8,35 +8,31 @@ use super::Medium;
// The following three structs could just be used in place of the one in the parent module, but // The following three structs could just be used in place of the one in the parent module, but
// that one is arguably much easier to deal with. // that one is arguably much easier to deal with.
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub(crate) struct UserInfo<'a> { pub(crate) struct UserInfo {
#[serde(borrow)] pub identifier: UserIdentifier,
pub identifier: UserIdentifier<'a>,
} }
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(tag = "type")] #[serde(tag = "type")]
pub(crate) enum UserIdentifier<'a> { pub(crate) enum UserIdentifier {
#[serde(rename = "m.id.user")] #[serde(rename = "m.id.user")]
MatrixId { user: &'a str }, MatrixId { user: String },
#[serde(rename = "m.id.thirdparty")] #[serde(rename = "m.id.thirdparty")]
ThirdPartyId { medium: Medium, address: &'a str }, ThirdPartyId { medium: Medium, address: String },
#[serde(rename = "m.id.phone")] #[serde(rename = "m.id.phone")]
PhoneNumber { country: &'a str, phone: &'a str }, PhoneNumber { country: String, phone: String },
} }
impl<'a> From<&'a super::UserInfo> for UserInfo<'a> { impl From<super::UserInfo> for UserInfo {
fn from(su: &'a super::UserInfo) -> Self { fn from(info: super::UserInfo) -> Self {
use super::UserInfo::*; use super::UserInfo::*;
match su { match info {
MatrixId(user) => UserInfo { MatrixId(user) => UserInfo {
identifier: UserIdentifier::MatrixId { user }, identifier: UserIdentifier::MatrixId { user },
}, },
ThirdPartyId { address, medium } => UserInfo { ThirdPartyId { address, medium } => UserInfo {
identifier: UserIdentifier::ThirdPartyId { identifier: UserIdentifier::ThirdPartyId { address, medium },
address,
medium: *medium,
},
}, },
PhoneNumber { country, phone } => UserInfo { PhoneNumber { country, phone } => UserInfo {
identifier: UserIdentifier::PhoneNumber { country, phone }, identifier: UserIdentifier::PhoneNumber { country, phone },
@ -45,20 +41,14 @@ impl<'a> From<&'a super::UserInfo> for UserInfo<'a> {
} }
} }
impl Into<super::UserInfo> for UserInfo<'_> { impl From<UserInfo> for super::UserInfo {
fn into(self) -> super::UserInfo { fn from(info: UserInfo) -> super::UserInfo {
use super::UserInfo::*; use super::UserInfo::*;
match self.identifier { match info.identifier {
UserIdentifier::MatrixId { user } => MatrixId(user.to_owned()), UserIdentifier::MatrixId { user } => MatrixId(user),
UserIdentifier::ThirdPartyId { address, medium } => ThirdPartyId { UserIdentifier::ThirdPartyId { address, medium } => ThirdPartyId { address, medium },
address: address.to_owned(), UserIdentifier::PhoneNumber { country, phone } => PhoneNumber { country, phone },
medium: medium.to_owned(),
},
UserIdentifier::PhoneNumber { country, phone } => PhoneNumber {
country: country.to_owned(),
phone: phone.to_owned(),
},
} }
} }
} }