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_identifiers::{DeviceId, UserId};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde::{Deserialize, Serialize};
use crate::r0::thirdparty::Medium;
@ -58,7 +58,8 @@ ruma_api! {
}
/// 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 {
/// Either a fully qualified Matrix user ID, or just the localpart (as part of the 'identifier'
/// field).
@ -125,24 +126,6 @@ pub struct IdentityServerInfo {
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)]
mod tests {
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
// that one is arguably much easier to deal with.
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub(crate) struct UserInfo<'a> {
#[serde(borrow)]
pub identifier: UserIdentifier<'a>,
pub(crate) struct UserInfo {
pub identifier: UserIdentifier,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(tag = "type")]
pub(crate) enum UserIdentifier<'a> {
pub(crate) enum UserIdentifier {
#[serde(rename = "m.id.user")]
MatrixId { user: &'a str },
MatrixId { user: String },
#[serde(rename = "m.id.thirdparty")]
ThirdPartyId { medium: Medium, address: &'a str },
ThirdPartyId { medium: Medium, address: String },
#[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> {
fn from(su: &'a super::UserInfo) -> Self {
impl From<super::UserInfo> for UserInfo {
fn from(info: super::UserInfo) -> Self {
use super::UserInfo::*;
match su {
match info {
MatrixId(user) => UserInfo {
identifier: UserIdentifier::MatrixId { user },
},
ThirdPartyId { address, medium } => UserInfo {
identifier: UserIdentifier::ThirdPartyId {
address,
medium: *medium,
},
identifier: UserIdentifier::ThirdPartyId { address, medium },
},
PhoneNumber { country, phone } => UserInfo {
identifier: UserIdentifier::PhoneNumber { country, phone },
@ -45,20 +41,14 @@ impl<'a> From<&'a super::UserInfo> for UserInfo<'a> {
}
}
impl Into<super::UserInfo> for UserInfo<'_> {
fn into(self) -> super::UserInfo {
impl From<UserInfo> for super::UserInfo {
fn from(info: UserInfo) -> super::UserInfo {
use super::UserInfo::*;
match self.identifier {
UserIdentifier::MatrixId { user } => MatrixId(user.to_owned()),
UserIdentifier::ThirdPartyId { address, medium } => ThirdPartyId {
address: address.to_owned(),
medium: medium.to_owned(),
},
UserIdentifier::PhoneNumber { country, phone } => PhoneNumber {
country: country.to_owned(),
phone: phone.to_owned(),
},
match info.identifier {
UserIdentifier::MatrixId { user } => MatrixId(user),
UserIdentifier::ThirdPartyId { address, medium } => ThirdPartyId { address, medium },
UserIdentifier::PhoneNumber { country, phone } => PhoneNumber { country, phone },
}
}
}