Fix JMAP: Require accountId argument on requests
This commit is contained in:
@@ -49,8 +49,10 @@ use common::{Server, auth::AccessToken};
|
||||
use http_proto::HttpSessionData;
|
||||
use jmap_proto::{
|
||||
request::{
|
||||
Call, CopyRequestMethod, GetRequestMethod, ParseRequestMethod, QueryRequestMethod, Request,
|
||||
RequestMethod, SetRequestMethod, capability::Capability, method::MethodName,
|
||||
Call, CopyRequestMethod, GetRequestMethod, INVALID_ACCOUNT_ID, ParseRequestMethod,
|
||||
QueryRequestMethod, Request, RequestMethod, SetRequestMethod,
|
||||
capability::Capability,
|
||||
method::{MethodName, MethodObject},
|
||||
},
|
||||
response::{Response, ResponseMethod, SetResponseMethod},
|
||||
};
|
||||
@@ -249,47 +251,47 @@ impl RequestHandler for Server {
|
||||
let response = match method {
|
||||
RequestMethod::Get(req) => match req {
|
||||
GetRequestMethod::Email(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Email)?;
|
||||
|
||||
self.email_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::Mailbox(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Mailbox)?;
|
||||
|
||||
self.mailbox_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::Thread(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Email)?;
|
||||
|
||||
self.thread_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::Identity(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.identity_get(*req).await?.into()
|
||||
}
|
||||
GetRequestMethod::EmailSubmission(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.email_submission_get(*req).await?.into()
|
||||
}
|
||||
GetRequestMethod::PushSubscription(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
self.push_subscription_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::Sieve(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.sieve_script_get(*req).await?.into()
|
||||
}
|
||||
GetRequestMethod::VacationResponse(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.vacation_response_get(*req).await?.into()
|
||||
@@ -298,31 +300,31 @@ impl RequestHandler for Server {
|
||||
self.principal_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::Quota(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.quota_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::Blob(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.blob_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::AddressBook(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::AddressBook)?;
|
||||
|
||||
self.address_book_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::ContactCard(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::ContactCard)?;
|
||||
|
||||
self.contact_card_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::FileNode(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::FileNode)?;
|
||||
|
||||
self.file_node_get(*req, access_token).await?.into()
|
||||
@@ -332,19 +334,19 @@ impl RequestHandler for Server {
|
||||
.await?
|
||||
.into(),
|
||||
GetRequestMethod::Calendar(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Calendar)?;
|
||||
|
||||
self.calendar_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::CalendarEvent(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?;
|
||||
|
||||
self.calendar_event_get(*req, access_token).await?.into()
|
||||
}
|
||||
GetRequestMethod::CalendarEventNotification(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.calendar_event_notification_get(*req, access_token)
|
||||
@@ -352,19 +354,19 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
GetRequestMethod::ParticipantIdentity(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.participant_identity_get(*req).await?.into()
|
||||
}
|
||||
GetRequestMethod::ShareNotification(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.share_notification_get(*req).await?.into()
|
||||
}
|
||||
GetRequestMethod::Registry(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
Box::pin(self.registry_get(
|
||||
@@ -378,25 +380,25 @@ impl RequestHandler for Server {
|
||||
},
|
||||
RequestMethod::Query(req) => match req {
|
||||
QueryRequestMethod::Email(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Email)?;
|
||||
|
||||
self.email_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::Mailbox(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Mailbox)?;
|
||||
|
||||
self.mailbox_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::EmailSubmission(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.email_submission_query(*req).await?.into()
|
||||
}
|
||||
QueryRequestMethod::Sieve(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.sieve_script_query(*req).await?.into()
|
||||
@@ -405,43 +407,43 @@ impl RequestHandler for Server {
|
||||
self.principal_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::Quota(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.quota_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::AddressBook(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::AddressBook)?;
|
||||
|
||||
self.address_book_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::ContactCard(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::ContactCard)?;
|
||||
|
||||
self.contact_card_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::FileNode(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::FileNode)?;
|
||||
|
||||
self.file_node_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::Calendar(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Calendar)?;
|
||||
|
||||
self.calendar_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::CalendarEvent(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?;
|
||||
|
||||
self.calendar_event_query(*req, access_token).await?.into()
|
||||
}
|
||||
QueryRequestMethod::CalendarEventNotification(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.calendar_event_notification_query(*req, access_token)
|
||||
@@ -449,13 +451,13 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
QueryRequestMethod::ShareNotification(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.share_notification_query(*req).await?.into()
|
||||
}
|
||||
QueryRequestMethod::Registry(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
Box::pin(self.registry_query(
|
||||
@@ -469,25 +471,25 @@ impl RequestHandler for Server {
|
||||
},
|
||||
RequestMethod::Set(req) => match req {
|
||||
SetRequestMethod::Email(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Email)?;
|
||||
|
||||
self.email_set(*req, access_token, session).await?.into()
|
||||
}
|
||||
SetRequestMethod::Mailbox(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Mailbox)?;
|
||||
|
||||
self.mailbox_set(*req, access_token).await?.into()
|
||||
}
|
||||
SetRequestMethod::Identity(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.identity_set(*req).await?.into()
|
||||
}
|
||||
SetRequestMethod::EmailSubmission(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.email_submission_set(*req, &session.instance, next_call)
|
||||
@@ -495,11 +497,11 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
SetRequestMethod::PushSubscription(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
self.push_subscription_set(*req, access_token).await?.into()
|
||||
}
|
||||
SetRequestMethod::Sieve(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.sieve_script_set(*req, access_token, session)
|
||||
@@ -507,13 +509,13 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
SetRequestMethod::VacationResponse(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.vacation_response_set(*req, access_token).await?.into()
|
||||
}
|
||||
SetRequestMethod::AddressBook(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::AddressBook)?;
|
||||
|
||||
self.address_book_set(*req, access_token, session)
|
||||
@@ -521,7 +523,7 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
SetRequestMethod::ContactCard(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::ContactCard)?;
|
||||
|
||||
self.contact_card_set(*req, access_token, session)
|
||||
@@ -529,7 +531,7 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
SetRequestMethod::FileNode(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::FileNode)?;
|
||||
|
||||
self.file_node_set(*req, access_token, session)
|
||||
@@ -537,19 +539,19 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
SetRequestMethod::ShareNotification(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.share_notification_set(*req).await?.into()
|
||||
}
|
||||
SetRequestMethod::Calendar(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Calendar)?;
|
||||
|
||||
self.calendar_set(*req, access_token, session).await?.into()
|
||||
}
|
||||
SetRequestMethod::CalendarEvent(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?;
|
||||
|
||||
self.calendar_event_set(*req, access_token, session)
|
||||
@@ -557,7 +559,7 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
SetRequestMethod::CalendarEventNotification(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.calendar_event_notification_set(*req, access_token, session)
|
||||
@@ -565,13 +567,13 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
SetRequestMethod::ParticipantIdentity(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.participant_identity_set(*req).await?.into()
|
||||
}
|
||||
SetRequestMethod::Registry(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
Box::pin(self.registry_set(
|
||||
@@ -585,7 +587,7 @@ impl RequestHandler for Server {
|
||||
}
|
||||
},
|
||||
RequestMethod::Changes(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
|
||||
self.changes(*req, method_name.obj, access_token)
|
||||
.await?
|
||||
@@ -593,8 +595,8 @@ impl RequestHandler for Server {
|
||||
}
|
||||
RequestMethod::Copy(req) => match req {
|
||||
CopyRequestMethod::Email(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
set_account_id_if_missing(&mut req.from_account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
resolve_account_id(&mut req.from_account_id, method_name.obj, access_token)?;
|
||||
|
||||
access_token
|
||||
.assert_has_access(req.account_id, Collection::Email)?
|
||||
@@ -605,14 +607,14 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
CopyRequestMethod::Blob(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.blob_copy(*req, access_token).await?.into()
|
||||
}
|
||||
CopyRequestMethod::ContactCard(mut req) => {
|
||||
set_account_id_if_missing(&mut req.from_account_id, access_token);
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.from_account_id, method_name.obj, access_token)?;
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
|
||||
access_token
|
||||
.assert_has_access(req.account_id, Collection::ContactCard)?
|
||||
@@ -623,8 +625,8 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
CopyRequestMethod::CalendarEvent(mut req) => {
|
||||
set_account_id_if_missing(&mut req.from_account_id, access_token);
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.from_account_id, method_name.obj, access_token)?;
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
|
||||
access_token
|
||||
.assert_has_access(req.account_id, Collection::CalendarEvent)?
|
||||
@@ -635,8 +637,8 @@ impl RequestHandler for Server {
|
||||
.into()
|
||||
}
|
||||
CopyRequestMethod::FileNode(mut req) => {
|
||||
set_account_id_if_missing(&mut req.from_account_id, access_token);
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.from_account_id, method_name.obj, access_token)?;
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
|
||||
access_token
|
||||
.assert_has_access(req.account_id, Collection::FileNode)?
|
||||
@@ -648,26 +650,26 @@ impl RequestHandler for Server {
|
||||
}
|
||||
},
|
||||
RequestMethod::ImportEmail(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Email)?;
|
||||
|
||||
self.email_import(*req, access_token, session).await?.into()
|
||||
}
|
||||
RequestMethod::Parse(req) => match req {
|
||||
ParseRequestMethod::Email(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Email)?;
|
||||
|
||||
self.email_parse(*req, access_token).await?.into()
|
||||
}
|
||||
ParseRequestMethod::ContactCard(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::ContactCard)?;
|
||||
|
||||
self.contact_card_parse(*req, access_token).await?.into()
|
||||
}
|
||||
ParseRequestMethod::CalendarEvent(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::CalendarEvent)?;
|
||||
|
||||
self.calendar_event_parse(*req, access_token).await?.into()
|
||||
@@ -675,25 +677,25 @@ impl RequestHandler for Server {
|
||||
},
|
||||
RequestMethod::QueryChanges(req) => self.query_changes(req, access_token).await?.into(),
|
||||
RequestMethod::SearchSnippet(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_has_access(req.account_id, Collection::Email)?;
|
||||
|
||||
self.email_search_snippet(*req, access_token).await?.into()
|
||||
}
|
||||
RequestMethod::ValidateScript(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.sieve_script_validate(*req, access_token).await?.into()
|
||||
}
|
||||
RequestMethod::LookupBlob(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.blob_lookup(*req).await?.into()
|
||||
}
|
||||
RequestMethod::UploadBlob(mut req) => {
|
||||
set_account_id_if_missing(&mut req.account_id, access_token);
|
||||
resolve_account_id(&mut req.account_id, method_name.obj, access_token)?;
|
||||
access_token.assert_is_member(req.account_id)?;
|
||||
|
||||
self.blob_upload_many(*req, access_token).await?.into()
|
||||
@@ -714,9 +716,24 @@ impl RequestHandler for Server {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn set_account_id_if_missing(account_id: &mut Id, access_token: &AccessToken) {
|
||||
if !account_id.is_valid() {
|
||||
pub(crate) fn resolve_account_id(
|
||||
account_id: &mut Id,
|
||||
obj: MethodObject,
|
||||
access_token: &AccessToken,
|
||||
) -> trc::Result<()> {
|
||||
if account_id.id() < INVALID_ACCOUNT_ID {
|
||||
Ok(())
|
||||
} else if matches!(
|
||||
obj,
|
||||
MethodObject::Core | MethodObject::PushSubscription | MethodObject::Registry(_)
|
||||
) {
|
||||
*account_id = Id::from(access_token.account_id());
|
||||
Ok(())
|
||||
} else if account_id.id() == INVALID_ACCOUNT_ID {
|
||||
Err(trc::JmapEvent::AccountNotFound.into_err())
|
||||
} else {
|
||||
Err(trc::JmapEvent::InvalidArguments
|
||||
.into_err()
|
||||
.details("The \"accountId\" property is required."))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
use super::get::ChangesLookup;
|
||||
use crate::{
|
||||
api::request::set_account_id_if_missing, calendar_event::query::CalendarEventQuery,
|
||||
api::request::resolve_account_id, calendar_event::query::CalendarEventQuery,
|
||||
calendar_event_notification::query::CalendarEventNotificationQuery,
|
||||
contact::query::ContactCardQuery, email::query::EmailQuery, file::query::FileNodeQuery,
|
||||
mailbox::query::MailboxQuery, share_notification::query::ShareNotificationQuery,
|
||||
@@ -47,7 +47,7 @@ impl QueryChanges for Server {
|
||||
match request {
|
||||
QueryChangesRequestMethod::Email(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(&mut request.account_id, MethodObject::Email, access_token)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
@@ -75,7 +75,7 @@ impl QueryChanges for Server {
|
||||
}
|
||||
QueryChangesRequestMethod::Mailbox(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(&mut request.account_id, MethodObject::Mailbox, access_token)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
@@ -97,7 +97,11 @@ impl QueryChanges for Server {
|
||||
}
|
||||
QueryChangesRequestMethod::EmailSubmission(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(
|
||||
&mut request.account_id,
|
||||
MethodObject::EmailSubmission,
|
||||
access_token,
|
||||
)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
@@ -119,7 +123,11 @@ impl QueryChanges for Server {
|
||||
}
|
||||
QueryChangesRequestMethod::ContactCard(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(
|
||||
&mut request.account_id,
|
||||
MethodObject::ContactCard,
|
||||
access_token,
|
||||
)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
@@ -143,7 +151,7 @@ impl QueryChanges for Server {
|
||||
}
|
||||
QueryChangesRequestMethod::FileNode(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(&mut request.account_id, MethodObject::FileNode, access_token)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
@@ -167,7 +175,11 @@ impl QueryChanges for Server {
|
||||
}
|
||||
QueryChangesRequestMethod::CalendarEvent(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(
|
||||
&mut request.account_id,
|
||||
MethodObject::CalendarEvent,
|
||||
access_token,
|
||||
)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
@@ -191,7 +203,11 @@ impl QueryChanges for Server {
|
||||
}
|
||||
QueryChangesRequestMethod::CalendarEventNotification(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(
|
||||
&mut request.account_id,
|
||||
MethodObject::CalendarEventNotification,
|
||||
access_token,
|
||||
)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
@@ -215,7 +231,11 @@ impl QueryChanges for Server {
|
||||
}
|
||||
QueryChangesRequestMethod::ShareNotification(mut request) => {
|
||||
// Query changes
|
||||
set_account_id_if_missing(&mut request.account_id, access_token);
|
||||
resolve_account_id(
|
||||
&mut request.account_id,
|
||||
MethodObject::ShareNotification,
|
||||
access_token,
|
||||
)?;
|
||||
changes = self
|
||||
.changes(
|
||||
build_changes_request(&request),
|
||||
|
||||
Reference in New Issue
Block a user