Skip to main content

ServerConfig

Struct ServerConfig 

Source
#[non_exhaustive]
pub struct ServerConfig {
Show 25 fields pub app_id: String, pub master_key: String, pub master_key_ips: IpAllowlist, pub maintenance_key: Option<String>, pub maintenance_key_ips: IpAllowlist, pub javascript_key: Option<String>, pub rest_api_key: Option<String>, pub client_key: Option<String>, pub dot_net_key: Option<String>, pub mount_path: String, pub enable_sanitized_error_response: bool, pub has_push_support: bool, pub has_push_scheduled_support: bool, pub security_check_enabled: bool, pub features: FeatureSupport, pub session: SessionConfig, pub protected_fields: ProtectedFieldsConfig, pub protected_fields_owner_exempt: bool, pub protected_fields_save_response_exempt: bool, pub allow_custom_object_id: bool, pub allow_client_class_creation: bool, pub allow_origin: Vec<String>, pub allow_headers: Vec<String>, pub batch_request_limit: i64, pub create_index_role_name: bool,
}
Expand description

The keys and identity a request is checked against.

#[non_exhaustive], decided at 0.2.1 rather than inherited. This release adds two public fields, which already breaks any ServerConfig { .. } literal outside this crate, and cargo resolves 0.2.1 as compatible with 0.2.0 and will upgrade into it unasked. Marking it here means the break happens once, in the release that was going to cause it anyway, instead of again every time an option is added. Construction is ServerConfig::new followed by field assignment, which is what every call site in this repository already does and what the attribute still permits.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§app_id: String§master_key: String§master_key_ips: IpAllowlist

masterKeyIps, default ['127.0.0.1', '::1'] (Options/Definitions.js:396-399), enforced at middlewares.js:452.

The default is a control and 0.2.0 shipped without it, so the master key was honoured from any source address on a server nobody had configured. A master key presented from an address outside this list is refused outright rather than downgraded to a client request: upstream throws a bare 403 (middlewares.js:453-462) instead of falling through.

§maintenance_key: Option<String>

maintenanceKey. Grants the same ACL treatment as the master key and is not the same authority: validateClientClassCreation exempts both on a write and master alone on a read (RestWrite.js:200-202, RestQuery.js:486-489).

Reachable only from Rust, deliberately. The binary exposes no variable for it, and the reason changed in 0.2.1: it used to be that parse-rust had no IP filter, and now it has one. What remains is that master and maintenance are one AclScope internally, so every decision other than the one corrected above treats them alike. Shipping the key through the CLI would advertise an authority this server only partly distinguishes.

Not to be confused with the read-only master key, which is a third credential, sets isMaster upstream (Auth.js:63), and is not modeled at all.

§maintenance_key_ips: IpAllowlist

maintenanceKeyIps, same default and same enforcement (Options/Definitions.js:385-388, middlewares.js:438).

Carried alongside master_key_ips rather than deferred. The two options are one mechanism with two call sites, and filtering one key while leaving the other unfiltered would close a hole and leave its twin open one header away. The exposure is narrower, because a maintenance key has no default value and only exists once an operator sets one.

§javascript_key: Option<String>§rest_api_key: Option<String>§client_key: Option<String>§dot_net_key: Option<String>§mount_path: String

Where the API is mounted, e.g. /parse. A builder input, never inferred from the request path: axum’s nest and Express’s app.use differ here, and every generated file URL is built from this value.

§enable_sanitized_error_response: bool

enableSanitizedErrorResponse, default true (Options/Definitions.js:253-258).

When true, every denial upstream routes through createSanitizedError or createSanitizedHttpError (Error.js:13-43) says Permission denied instead of naming the rule that refused. That is the configuration an unmodified deployment runs, so it is what every SDK sees by default. Read it as ServerConfig::error_detail rather than as a bare bool at a call site.

§has_push_support: bool§has_push_scheduled_support: bool§security_check_enabled: bool§features: FeatureSupport

What /serverInfo advertises. Defaults to the truth: nothing unimplemented.

§session: SessionConfig

sessionLength and expireInactiveSessions, which together decide _Session.expiresAt. Defaults are upstream’s (Options/Definitions.js:629-634, :269-274).

§protected_fields: ProtectedFieldsConfig

protectedFields. See default_protected_fields for the merge rule.

§protected_fields_owner_exempt: bool

protectedFieldsOwnerExempt, default true (Options/Definitions.js:501-506). When true a user reading their own _User row sees every field regardless of protectedFields.

§protected_fields_save_response_exempt: bool

protectedFieldsSaveResponseExempt, default true (Options/Definitions.js:507-512).

When true, a create or update response carries protected fields the write touched. When false they are stripped from the response as they are from a query result. parse-rust only ever echoes back the keys whose request value was an operation, so this narrows that echo rather than a whole object.

§allow_custom_object_id: bool

allowCustomObjectId, default false (Options/Definitions.js:73-78).

Two effects, and the second is easy to forget because it is in a different file. It gates whether a create may carry its own objectId (RestWrite.js:50-65, enforced by enforce_object_id_policy), and it widens the objectId grammar a CLP entity key is matched against, from ^[a-zA-Z0-9]{1,}$ to ^.{1,}$ (SchemaController.js:726-731).

The two are one option because a CLP naming a user by id has to be able to name a user whose id the client chose.

§allow_client_class_creation: bool

allowClientClassCreation, default false (Options/Definitions.js:67-72).

Gates whether a write may bring a class into existence. Enforced by validateClientClassCreation in the write pipeline, which exempts master, maintenance and the classes Parse defines itself.

The default matters more than the option. Left unimplemented, a server behaves as though this were true, which lets a caller holding only the app id and client key create classes without limit on a database parse-server nodes also read, each with a default-open CLP.

§allow_origin: Vec<String>

allowOrigin, default ["*"] (middlewares.js:407-408).

A list rather than one value, because upstream accepts either and echoes back whichever entry matches the request’s Origin. An unmatched origin gets the first entry, so a single-element list is an allowlist of one rather than a wildcard.

§allow_headers: Vec<String>

allowHeaders. Appended to DEFAULT_ALLOWED_HEADERS rather than replacing it (middlewares.js:402-405), so a deployment adding one custom header does not have to restate the twelve a Parse SDK needs.

§batch_request_limit: i64

requestComplexity.batchRequestLimit, default -1, which disables it (Options/Definitions.js:733-738). Master and maintenance bypass it (batch.js:73).

§create_index_role_name: bool

databaseOptions.createIndexRoleName, default true (Options/Definitions.js:1318-1323), created at DatabaseController.js:2033-2038.

Not cosmetic. Without the index two _Role rows can carry the same name, and an ACL entry of role:X then grants every member of both, which is a privilege-escalation path rather than a duplicate-data annoyance. Upstream tests !== false, so anything other than an explicit false creates it.

Implementations§

Source§

impl ServerConfig

Source

pub fn new(app_id: impl Into<String>, master_key: impl Into<String>) -> Self

Source

pub fn error_detail(&self) -> ErrorDetail

Whether a denial tells the client why.

The one place enable_sanitized_error_response becomes an ErrorDetail, so no call site has to remember which way round the bool runs.

Source

pub fn object_id_form(&self) -> ObjectIdForm

How a CLP entity key that looks like an objectId is matched.

Source

pub fn clp_validation(&self) -> ClpValidation

What CLP validation accepts.

Unenforceable::Accept, because the read and write pipelines enforce all three of the features the toggle guards: per-operation pointerFields, the class-wide readUserFields and writeUserFields arrays (ClassLevelPermissions::applicable_pointer_fields), and userField: protected-field entries (ProtectedFieldPlan::user_field_rules). Refusing them would reject a CLP this server honors.

Source

pub fn permission_options(&self) -> PermissionOptions

The permission options the read and write pipelines take.

Source

pub fn javascript_key(self, k: impl Into<String>) -> Self

Source

pub fn rest_api_key(self, k: impl Into<String>) -> Self

Source

pub fn mount_path(self, p: impl Into<String>) -> Self

Source

pub fn requires_client_key(&self) -> bool

True when any client key is configured. Upstream’s rule is all-or-nothing: if any of these is set, a non-master request must present one that matches (middlewares.js:255-265). If none is configured, none is required.

Trait Implementations§

Source§

impl Clone for ServerConfig

Source§

fn clone(&self) -> ServerConfig

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ServerConfig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more