diff --git a/keyserver/src/endpoints.js b/keyserver/src/endpoints.js --- a/keyserver/src/endpoints.js +++ b/keyserver/src/endpoints.js @@ -1,5 +1,6 @@ // @flow +import { policyTypes } from 'lib/facts/policies.js'; import type { Endpoint } from 'lib/types/endpoints'; import { @@ -56,48 +57,173 @@ import { codeVerificationResponder } from './responders/verification-responders'; import { uploadDeletionResponder } from './uploads/uploads'; +const baseLegalPolicies = [policyTypes.tosAndPrivacyPolicy]; + const jsonEndpoints: { [id: Endpoint]: JSONResponder } = { - create_account: accountCreationResponder, - create_entry: entryCreationResponder, - create_error_report: reportCreationResponder, - create_message_report: messageReportCreationResponder, - create_multimedia_message: multimediaMessageCreationResponder, - create_report: reportCreationResponder, - create_reports: reportMultiCreationResponder, - create_text_message: textMessageCreationResponder, - create_thread: threadCreationResponder, - delete_account: accountDeletionResponder, - delete_entry: entryDeletionResponder, - delete_thread: threadDeletionResponder, - delete_upload: uploadDeletionResponder, - fetch_entries: entryFetchResponder, - fetch_entry_revisions: entryRevisionFetchResponder, - fetch_error_report_infos: errorReportFetchInfosResponder, - fetch_messages: messageFetchResponder, - get_session_public_keys: getSessionPublicKeysResponder, - join_thread: threadJoinResponder, - leave_thread: threadLeaveResponder, - log_in: logInResponder, - log_out: logOutResponder, - policy_acknowledgment: policyAcknowledgmentResponder, - remove_members: memberRemovalResponder, - restore_entry: entryRestorationResponder, - search_users: userSearchResponder, - send_password_reset_email: sendPasswordResetEmailResponder, - send_verification_email: sendVerificationEmailResponder, - set_thread_unread_status: threadSetUnreadStatusResponder, - update_account: passwordUpdateResponder, - update_activity: updateActivityResponder, - update_calendar_query: calendarQueryUpdateResponder, - update_user_settings: updateUserSettingsResponder, - update_device_token: deviceTokenUpdateResponder, - update_entry: entryUpdateResponder, - update_password: oldPasswordUpdateResponder, - update_relationships: updateRelationshipsResponder, - update_role: roleUpdateResponder, - update_thread: threadUpdateResponder, - update_user_subscription: userSubscriptionUpdateResponder, - verify_code: codeVerificationResponder, + create_account: { + responder: accountCreationResponder, + requiredPolicies: [], + }, + create_entry: { + responder: entryCreationResponder, + requiredPolicies: baseLegalPolicies, + }, + create_error_report: { + responder: reportCreationResponder, + requiredPolicies: [], + }, + create_message_report: { + responder: messageReportCreationResponder, + requiredPolicies: baseLegalPolicies, + }, + create_multimedia_message: { + responder: multimediaMessageCreationResponder, + requiredPolicies: baseLegalPolicies, + }, + create_report: { + responder: reportCreationResponder, + requiredPolicies: [], + }, + create_reports: { + responder: reportMultiCreationResponder, + requiredPolicies: [], + }, + create_text_message: { + responder: textMessageCreationResponder, + requiredPolicies: baseLegalPolicies, + }, + create_thread: { + responder: threadCreationResponder, + requiredPolicies: baseLegalPolicies, + }, + delete_account: { + responder: accountDeletionResponder, + requiredPolicies: [], + }, + delete_entry: { + responder: entryDeletionResponder, + requiredPolicies: baseLegalPolicies, + }, + delete_thread: { + responder: threadDeletionResponder, + requiredPolicies: baseLegalPolicies, + }, + delete_upload: { + responder: uploadDeletionResponder, + requiredPolicies: baseLegalPolicies, + }, + fetch_entries: { + responder: entryFetchResponder, + requiredPolicies: baseLegalPolicies, + }, + fetch_entry_revisions: { + responder: entryRevisionFetchResponder, + requiredPolicies: baseLegalPolicies, + }, + fetch_error_report_infos: { + responder: errorReportFetchInfosResponder, + requiredPolicies: baseLegalPolicies, + }, + fetch_messages: { + responder: messageFetchResponder, + requiredPolicies: baseLegalPolicies, + }, + get_session_public_keys: { + responder: getSessionPublicKeysResponder, + requiredPolicies: baseLegalPolicies, + }, + join_thread: { + responder: threadJoinResponder, + requiredPolicies: baseLegalPolicies, + }, + leave_thread: { + responder: threadLeaveResponder, + requiredPolicies: baseLegalPolicies, + }, + log_in: { + responder: logInResponder, + requiredPolicies: [], + }, + log_out: { + responder: logOutResponder, + requiredPolicies: [], + }, + policy_acknowledgment: { + responder: policyAcknowledgmentResponder, + requiredPolicies: [], + }, + remove_members: { + responder: memberRemovalResponder, + requiredPolicies: baseLegalPolicies, + }, + restore_entry: { + responder: entryRestorationResponder, + requiredPolicies: baseLegalPolicies, + }, + search_users: { + responder: userSearchResponder, + requiredPolicies: baseLegalPolicies, + }, + send_password_reset_email: { + responder: sendPasswordResetEmailResponder, + requiredPolicies: [], + }, + send_verification_email: { + responder: sendVerificationEmailResponder, + requiredPolicies: [], + }, + set_thread_unread_status: { + responder: threadSetUnreadStatusResponder, + requiredPolicies: baseLegalPolicies, + }, + update_account: { + responder: passwordUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + update_activity: { + responder: updateActivityResponder, + requiredPolicies: baseLegalPolicies, + }, + update_calendar_query: { + responder: calendarQueryUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + update_user_settings: { + responder: updateUserSettingsResponder, + requiredPolicies: baseLegalPolicies, + }, + update_device_token: { + responder: deviceTokenUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + update_entry: { + responder: entryUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + update_password: { + responder: oldPasswordUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + update_relationships: { + responder: updateRelationshipsResponder, + requiredPolicies: baseLegalPolicies, + }, + update_role: { + responder: roleUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + update_thread: { + responder: threadUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + update_user_subscription: { + responder: userSubscriptionUpdateResponder, + requiredPolicies: baseLegalPolicies, + }, + verify_code: { + responder: codeVerificationResponder, + requiredPolicies: baseLegalPolicies, + }, }; export { jsonEndpoints }; diff --git a/keyserver/src/responders/handlers.js b/keyserver/src/responders/handlers.js --- a/keyserver/src/responders/handlers.js +++ b/keyserver/src/responders/handlers.js @@ -5,6 +5,7 @@ import { ServerError } from 'lib/utils/errors'; import { deleteCookie } from '../deleters/cookie-deleters'; +import type { PolicyType } from '../lib/facts/policies.js'; import { fetchViewerForJSONRequest, addCookieToJSONResponse, @@ -16,7 +17,11 @@ import { type AppURLFacts, getAppURLFactsFromRequestURL } from '../utils/urls'; import { getMessageForException } from './utils'; -export type JSONResponder = (viewer: Viewer, input: any) => Promise<*>; +export type JSONResponder = { + responder: (viewer: Viewer, input: any) => Promise<*>, + requiredPolicies: $ReadOnlyArray, +}; + export type DownloadResponder = ( viewer: Viewer, req: $Request, @@ -37,7 +42,7 @@ } const { input } = req.body; viewer = await fetchViewerForJSONRequest(req); - const responderResult = await responder(viewer, input); + const responderResult = await responder.responder(viewer, input); if (res.headersSent) { return; } diff --git a/keyserver/src/socket/socket.js b/keyserver/src/socket/socket.js --- a/keyserver/src/socket/socket.js +++ b/keyserver/src/socket/socket.js @@ -628,7 +628,7 @@ const { viewer } = this; invariant(viewer, 'should be set'); const responder = jsonEndpoints[message.payload.endpoint]; - const response = await responder(viewer, message.payload.input); + const response = await responder.responder(viewer, message.payload.input); return [ { type: serverSocketMessageTypes.API_RESPONSE,