Class PushProps
- All Implemented Interfaces:
EventListener, IGProp<GProp<?>[]>, IPropCnr, ISecretsContext, Cloneable
- Direct Known Subclasses:
EditorPushProps
The two secrets live in the secrets store only (CC-PUSH-PWA-PAGES, rulings PP-1 and PP-3): an application's VAPID private key (VAPID_PRIVATE_KEY) and Firebase service account (FCM_SERVICE_ACCOUNT) are secret-marked members whose value is never written into .iiziPush and is taken from this machine's secrets store under app.<appID>/$push/<member> when the loader gives the context (setSecretsContext(String)). An inline value found in the file is dropped at that moment with one WARNING naming the member, never the value, and so is a key file reference (VAPID_PRIVATE_KEY_FILE, FCM_SERVICE_ACCOUNT_FILE), which only the server's own container (application *) still supports. The Designer's Push page generates or imports a secret into the store; iizi-secrets moves it to a production server.
A secret the store does not hold switches the transport off (CC-FIX-PUSH-SECRET-MISSING, ruling T5-D-1): a fresh installation holds no secret of any application, so the absence is a state of this machine, not an error. setSecretsContext(String) says so with ONE WARNING per application - which transports are off, the keys missing, the store read, how to add them - instead of the SEVERE per key of a missing secret (isSecretOptional(GProp)); the engine answers "not configured" for the transport (PushEngine.getTransportState), so nothing is sent for the application and no device is subscribed under its public half. The server's own container keeps the SEVERE.
The server's own $push (the $pushNotifications child of the server configuration, application *) is never given a context by a loader: it takes the context of its nearest ISecretsContext ancestor, the configuration's server.<name>, and its keys are the configuration's, server.<name>/$pushNotifications/$push/<member> (ruling PP-D-2). It is then not a root of its own (isSecretsRoot()): a member marked secret there is resolved and committed with the configuration's own secrets. Its inline pair and its key file references are untouched - the store-only rule above is applied by the loader's setSecretsContext(String) call only, which the server's container never gets.
- Author:
- Christopher Mindus
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final AtomThe atom for the Push Notification properties container: "$push".static final StringThe Firebase project ID property: "fcmProject".static final StringThe Firebase service account property: "fcmServiceAccount".static final StringThe Firebase service account key file property: "fcmServiceAccountFile".static final StringThe file name of the Push Notification properties container: ".iiziPush".static final StringThe "subscribe the device at sign-in" property: "subscribeAtSignIn".static final StringThe default Time-to-Live duration property: "TTL".static final StringThe private key property: "VPrivKey".static final StringThe VAPID key file property: "VPrivKeyFile".static final StringThe public key property: "VPubKey".static final StringThe VAPID subject property: "VSubject".Fields inherited from class PropCnr
EMPTY, EMPTY_CLASSES, EMPTY_CNRS, EXTENDS_FRAMEWORK_ERROR_IDFields inherited from class GProp
GPDEBUG, PROP_ATTR_STRING_EDITOR_PROP, PROP_ATTR_STRING_ERRORED_NAME, PROP_ATTR_STRING_EXTENDS, PROP_ATTR_STRING_EXTENDS_FINAL, PROP_ATTR_STRING_EXTENDS_PRIVATE, PROP_ATTR_STRING_NULLABLE, PROP_ATTR_STRING_PRIVATE, PROP_ATTR_STRING_PRIVATE_CHANGE_EVENT, PROP_ATTR_STRING_READ_ONLY, PROP_ATTR_STRING_SECRET, PROP_USER_1, PROP_USER_2Fields inherited from interface IGProp
EQC_ERROR_IGNORE_ALL, EQC_ERROR_IGNORE_REFERENCES, EQC_IGNORE_ARRAY, EQC_IGNORE_VOLATILE_OR_EDITOR, EQC_INCLUDE_PRIVATE, EQC_SAVE_FILE, EQC_SAVE_RELEVANT_ONLY, EXT_CONTAINER_EXTENDS, EXT_CONTAINER_EXTENDS_VALID, EXT_EXTENDED, EXT_FINAL, EXT_OVERRIDES, EXT_OVERRIDES_FINAL_ERR, EXT_PRIVATEFields inherited from interface ISecretsContext
KEY_SEPARATORConstructor Summary
ConstructorsMethod Summary
Modifier and TypeMethodDescriptionclone()Creates a clone out of this property.Gets the Firebase project ID for FCM HTTP v1 sends.Gets the Firebase service account key file as JSON text.Gets the reference to the Firebase service account key file of the server's own container (application*); an application's container holds none (ruling PP-1).Gets the VAPID private key.Gets the reference to the VAPID key file of the server's own container (application*); an application's container holds none (ruling PP-1).Gets the VAPID public key.Gets the secrets context of the application this.iiziPushbelongs to,app.<appID>, as its loader gave it withsetSecretsContext(String): the file itself carries no identity (decision SK3-D-3).getSecretsKey(GProp<?> prop) Gets the key of a secret-marked member: the context, then this container's atom$push, then the member's atom path, e.g.getSecretsKey(String member) Gets the secrets store key of a member of this container, present or not:<context>/$push/<member>, or, for a container that belongs to an ancestor root, the root's context and this container's atom path from it,server.<name>/$pushNotifications/$push/<member>.longgetTTL()Gets the default Time-to-Live of the application's Push Notifications: theTTLproperty of.iiziPush, in milliseconds as the Designer'sDurationPropEditorstores it.Gets the VAPID subject, i.e.booleanisSecretOptional(GProp<?> prop) Tells whether a secret-marked member is optional: an application's two store-only members,VAPID_PRIVATE_KEYandFCM_SERVICE_ACCOUNT, once a loader gave this container its context.booleanTells whether this container is a root of its own: when a loader gave it a context, or when no ancestor implementsISecretsContext(an application's.iiziPushbefore its loader speaks, a VAPID key file).booleanTells whether the server subscribes the device at sign-in: theSUBSCRIBE_AT_SIGNINproperty of.iiziPush(CC-PUSH-SUBSCRIBE-AT-SIGNIN, ruled 2026-10-22 LV-D-2).intsetSecretsContext(String context) Gives this container the secrets context of its application and resolves its secret-marked members from this machine's secrets store, called by the loader once the application is known:AppFactoryon the server, the project in iiziGo (decision SK3-D-3).booleanverify(PropVerification verification) Verifies this property container.Methods inherited from class PropCnr
__transferChildProps, addPredefinedProps, addProp, addProp, addProp2, addProp2, appendPropValue, canRequestFocus, completeVirtualize, containsProp, containsProp, convertLoadedProp, couldRequestFocusIfVirtualized, createCopyOfAtom, createUniqueAtom, createUniqueAtom, createUniqueAtom, createVSReference, doPropEqualsArrayValues, enablePropCommunication, enablePropHashMap, equalsTree, equalsTree, getAllProps, getAllProps, getAllProps, getAllProps, getAllProps, getAllProps, getAllProps, getAllProps, getBool, getBool, getBool, getBool, getChildPropError, getChildPropError, getChildPropErrorSeverity, getChildPropErrorSeverity, getErrorsProp, getExtendsContainer, getExtendsError, getExtendsName, getExtendsOverride, getExtendsPossibleClasses, getFirstProp, getFirstProp, getFocusEngine, getInt, getInt, getInt, getInt, getLong, getLong, getLong, getLong, getNumber, getNumber, getNumber, getNumber, getPossibleChildren, getPredefinedProps, getProp, getProp, getProp, getProp, getProp, getProp, getProp, getProp, getProp, getProp, getProp, getPropBaseReference, getPropCnr, getPropCount, getPropCount, getPropIndex, getPropIndex, getPropIndexes, getProps, getProps, getPropValue, getPropValue, getPropValue, getPropValue, getPropValue, getPropValue, getPropValue, getPropValue0, getRetargetedVerifyContainer, getString, getString, getString, getString, getValueClasses, getVSReference, hasFocus, hasSendData, initializeElement, initializeExtendsFramework, initializeProp, initializePropTree, initializeValue, initPropCnr, insertProp, insertProp2, isChild, isExtendsOverriden, isExtendsPropertyValid, isExtendsRoot, isPropAddRemoveAllowed, isPropCommunicating, isPropExtended, isPropValueTreeLockNeeded, list, list, logPropNotFound, maybeAddProp, onInsertProp, onPropDispose, onPropRemoved, onPropTreeInitialized, onReferenceEvent, onVirtualContainerCreated, onVirtualizationCompleted, paramString, prepare, removeAllProps, removeAllProps2, removeProp, removeProp, removeProp, removeProp, removeProp, removeProp, removeProp, removeProp2, removeProp2, removeProp2, removeProp2, removeProp2, removeProp2, removeProp2, reorderProps, replaceProps, requestFocus, requestFocus, requestFocusEx, requestFocusEx, resolveReferences, resolveRuntimeReferences, setBool, setBool, setBool, setBool, setCreateRequiredProp, setExtendsName, setExtendsOverride, setInt, setInt, setInt, setLong, setLong, setLong, setLong, setNumber, setNumber, setNumber, setNumber, setProp, setProp, setProp, setProp2, setProp2, setPropValue, setPropValue, setPropValue, setPropValue, setPropValue, setPropValue, setString, setString, setString, setString, shouldCreateProps, shouldSerializeToXML, toElementString, toNativeValue0, usePropHashMap, usesPropIndex, validateChildPropInValue, validateClassInstances, validatePropType, validatePropValue, verifyInternalUseOnly, verifyTree, virtualizeMethods inherited from class GProp
addPropError, addPropListener, appendProp, convertPropError, dispose, equals, equals, equalsErrors, equalsObj, equalsPropValue, equalValues, finalize, fine, fine, finer, finer, finest, finest, fromElementString, getAliasName, getAppSessionGyro, getAppWorker, getAtomPath, getAttribute, getChildReferencePropName, getClientSessionGyro, getClientWorker, getConstraints, getEnvironment, getErroredPropItems, getErroredProps, getErrorsProp, getExtendsRootContainer, getFullPropName, getFullPropName, getFullPropNameDebug, getFullPropNameDebug, getListeners, getModuleFolder, getModuleFolder, getParent, getParent, getProjectName, getPropAtom, getPropError, getPropError, getPropErroredName, getPropErrorSeverity, getPropExtendsFlags, getPropFromPath, getPropFromPath, getPropFromReference, getPropFromReference, getPropIndex, getPropName, getPropPath, getPropPath, getPropReferenceTarget, getPropRootPropMgr, getPropTreeErrorSeverity, getPropValue, getPropValue, getPropValueObject, getReferencePropName, getReferencePropNameNoAssert, getRelativePropName, getRootFromName, getRootName, getRootParent, getRootParentNoAssert, getTreeLock, hasChanged, hasCircularReferencesError, hashCode, hasPrivateChangeEventProp, hasPropError, hasPropTreeError, info, info, initializeGElement, initializeGProp, isDisposed, isPropChildOf, isPropClientCreated, isPropCreateRequired, isPropErrorPersisted, isPropExtended, isPropExtendsFinal, isPropExtendsPrivate, isPropExtendsPrivateInRoot, isPropExtendsPrivateInRoot, isPropFile, isPropFolder, isPropForEditor, isPropForEditorAtCreation, isPropNullable, isPropPrivate, isPropPrivateAtCreation, isPropReadOnly, isPropReferenceTreeValid, isPropRoot, isPropRootLoading, isPropRootTreeModificationsAllowed, isPropSaveRelevant, isPropSecret, isPropSecretCapable, isPropUSER, isPropVirtualized, isPropVirtualizing, isPropVolatile, isPropVolatileOrEditorOnly, isProxied, isSibling, list, list, list, mapAliasToReference, mapAliasToReference, mapReferenceToAlias, mapReferenceToAlias, mapReferenceToProjectRelative, modifyPropValue, moveProp, moveProp, moveProp, onEvent, onEventSelf, onInitialize, onPrepare, onPropInvalidateCache, onPropParentChanged, onPropValueSet, onRemoteEvent, paramString, paramValue, post, post, removePropError, removePropListener, removePropUSER, renameProp, renameProp2, resetChangedTree, setChanged, setConstraints, setConstraints, setParent, setPrivateChangeEventProp, setPrivateCreateRequiredProp, setPropError, setPropErroredName, setPropExtended, setPropExtendsFinal, setPropExtendsPrivate, setPropForEditor, setPropNullable, setPropPrivate, setPropReadOnly, setPropSecret, setPropUSER, setPropValue, setPropValue, setPropValue, setPropValueIncognito, setPropVolatile, severe, severe, severe, shouldSerializeToXML, throwIfReadOnly, toNativeValue, toShortString, toShortString, toString, toString, triggerRemoteEvent, triggerRemoteEvent, validateProp, warning, warning, warningMethods inherited from interface IGProp
addPropError, addPropListener, dispose, equals, fine, fine, finer, finer, finest, finest, fromElementString, getAppSessionGyro, getAtomPath, getClientSessionGyro, getConstraints, getEnvironment, getErroredPropItems, getErroredProps, getErrorsProp, getExtendsRootContainer, getFullPropName, getFullPropNameDebug, getModuleFolder, getModuleFolder, getParent, getParent, getPropAtom, getPropError, getPropError, getPropErrorSeverity, getPropExtendsFlags, getPropFromPath, getPropFromReference, getPropIndex, getPropName, getPropPath, getPropPath, getPropRootPropMgr, getPropTreeErrorSeverity, getPropValue, getPropValue, getReferencePropName, getRelativePropName, getRootParent, getTreeLock, hasChanged, hasCircularReferencesError, hasPrivateChangeEventProp, hasPropError, hasPropTreeError, info, info, initializeGElement, initializeGProp, isDisposed, isPropChildOf, isPropClientCreated, isPropCreateRequired, isPropExtended, isPropExtendsFinal, isPropExtendsPrivate, isPropExtendsPrivateInRoot, isPropExtendsPrivateInRoot, isPropFile, isPropFolder, isPropNullable, isPropPrivate, isPropReadOnly, isPropReferenceTreeValid, isPropRoot, isPropVirtualized, isSibling, list, list, list, mapAliasToReference, mapReferenceToAlias, mapReferenceToProjectRelative, moveProp, moveProp, moveProp, onEvent, onEventSelf, onRemoteEvent, removePropError, removePropListener, renameProp, setChanged, setConstraints, setConstraints, setParent, setPrivateChangeEventProp, setPropError, setPropExtendsFinal, setPropExtendsPrivate, setPropNullable, setPropPrivate, setPropReadOnly, setPropValue, setPropValue, severe, severe, severe, toNativeValue, triggerRemoteEvent, triggerRemoteEvent, validateProp, warning, warning, warningMethods inherited from interface IPropCnr
canRequestFocus, canRequestFocus, couldRequestFocusIfVirtualized, couldRequestFocusIfVirtualized
Field Details
FILE_NAME
The file name of the Push Notification properties container: ".iiziPush".- See Also:
ATOM
The atom for the Push Notification properties container: "$push".TTL
SUBSCRIBE_AT_SIGNIN
The "subscribe the device at sign-in" property: "subscribeAtSignIn". A boolean, false by default (CC-PUSH-SUBSCRIBE-AT-SIGNIN, ruled 2026-10-22 LV-D-2): when true, the server subscribes the device of a session to the application-level Topic once a user has signed in to the application - at the session's creation with a signed-in user, or at an in-app sign-in - where otherwise the application's Java callssubscribeitself (ClientSessionPushAPI.subscribeAtSignIn). Off by default: a phone is asked for its permission at the first sign-in, which not every application wants.- See Also:
VAPID_PRIVATE_KEY
The private key property: "VPrivKey". A SECRET held by this machine's secrets store only (ruling PP-1): the member is marked secret, saved as<string name="VPrivKey" secret="true"/>without a value, and takes its value from the store underapp.<appID>/$push/VPrivKeyonce the loader has given the context. An inline value in.iiziPushis dropped at that moment with one WARNING (ruling PP-3): the file is versioned and compiled into the application's jar, so a key written there travels with both.- See Also:
VAPID_PUBLIC_KEY
VAPID_SUBJECT
The VAPID subject property: "VSubject". Thesubclaim of the VAPID JWT (RFC 8292 section 2.1), amailto:orhttps:contact URI the push service may use to reach the operator. Optional.- See Also:
FCM_PROJECT_ID
The Firebase project ID property: "fcmProject". The{project_id}of the FCM HTTP v1 endpointhttps://fcm.googleapis.com/v1/projects/{project_id}/messages:send. Public: it is what the client receives asfcandifrom/iizi-push/keys.- See Also:
FCM_SERVICE_ACCOUNT
The Firebase service account property: "fcmServiceAccount". The JSON text of a Google service-account key file (client_email,private_key,token_uri, ...) with the Firebase Cloud Messaging API role, from which the server mints the OAuth 2.0 access token that authorizes each FCM v1 send. SECRET: this file is a credential, exactly asVAPID_PRIVATE_KEYis, and is held by the secrets store only, the same way (ruling PP-1): the Designer's Push page imports the downloaded JSON into the store; the file carries the mark and no value.- See Also:
VAPID_PRIVATE_KEY_FILE
The VAPID key file property: "VPrivKeyFile". A reference to a key file holding a VAPID pair - a$pushcontainer withVPubKeyandVPrivKey, the format of the server's ownserver-keys.iiziPush- written as a path: relative to the key directory of the machine that reads it (iizi.push.keys,IIZI_PUSH_KEYS, else~/.iizi/push-keys), or absolute,~and%NAME%expanded (PUSH-KEYFILES-DESIGN.md sections 2 to 4). Only the server's own container reads it: the credentials file's[server]section and the server settings'$push, application*(PUSH-CREDENTIALS.md 3.6, S-4). An application's.iiziPushdoes not support it since ruling PP-1: the member is removed at load with a WARNING, and the application's key comes from the secrets store.- See Also:
FCM_SERVICE_ACCOUNT_FILE
The Firebase service account key file property: "fcmServiceAccountFile". A reference to Google's service-account JSON as the Firebase console downloads it, written asVAPID_PRIVATE_KEY_FILEis; the name the credentials file's[server]section uses. AsVAPID_PRIVATE_KEY_FILE: the server's own container only, removed from an application's.iiziPushat load with a WARNING (ruling PP-1).- See Also:
Constructor Details
PushProps
public PushProps()Creates a PushProps container without name and with a null value.PushProps
Creates a PushProps container with the specified name with a null value.- Parameters:
propertyAtom- the property atom.
Method Details
clone
getSecretsContext
Gets the secrets context of the application this.iiziPushbelongs to,app.<appID>, as its loader gave it withsetSecretsContext(String): the file itself carries no identity (decision SK3-D-3). A container no loader gave a context takes the context of its nearestISecretsContextancestor - the server configuration'sserver.<name>for the server's own$push(ruling PP-D-2).- Specified by:
getSecretsContextin interfaceISecretsContext- Returns:
- The context, or null when none was given and no ancestor gives one.
isSecretsRoot
public boolean isSecretsRoot()Tells whether this container is a root of its own: when a loader gave it a context, or when no ancestor implementsISecretsContext(an application's.iiziPushbefore its loader speaks, a VAPID key file). The server's own$pushis not: it belongs to the server configuration (ruling PP-D-2).- Specified by:
isSecretsRootin interfaceISecretsContext- Returns:
- true when this container is a root of its own.
getSecretsKey
Gets the key of a secret-marked member: the context, then this container's atom$push, then the member's atom path, e.g.app.com.mindus.icu/$push/VPrivKey. The application's own members are keyed under the same context without it. A container that belongs to an ancestor root answers that root's key: the member's atom path from the root, e.g.server.Test2.config/$pushNotifications/$push/VPrivKey.- Specified by:
getSecretsKeyin interfaceISecretsContext- Parameters:
prop- The secret-marked member.- Returns:
- The key, or null when there is no context or the member is not below this container.
setSecretsContext
Gives this container the secrets context of its application and resolves its secret-marked members from this machine's secrets store, called by the loader once the application is known:AppFactoryon the server, the project in iiziGo (decision SK3-D-3). The first call makes the container store-only (rulings PP-1 and PP-3):VAPID_PRIVATE_KEYandFCM_SERVICE_ACCOUNTbecome secret-marked members without a value - an inline value found in the file is dropped with one WARNING naming the member, never the value - and a key file reference (VAPID_PRIVATE_KEY_FILE,FCM_SERVICE_ACCOUNT_FILE) is removed with one WARNING. The marked members then hold the store's value. A loader that gives no context - an application without an App ID - leaves them unconfigured, reported once. A secret the store does not hold leaves its transport off for the application, said once with a WARNING (isSecretOptional(GProp), ruling T5-D-1). Giving the same context again does nothing.The server's own container (application
*) and a VAPID key file are never given a context, so their inline pair and their references are untouched.- Parameters:
context- The context, e.g.app.com.mindus.icu, null for none.- Returns:
- The number of members that took a value.
isSecretOptional
Tells whether a secret-marked member is optional: an application's two store-only members,VAPID_PRIVATE_KEYandFCM_SERVICE_ACCOUNT, once a loader gave this container its context. Their absence from the store is this machine's configuration - a fresh installation holds no secret of any application - and switches the transport off for the application, whichsetSecretsContext(String)says once per application; the framework's SEVERE per key is for a secret a configuration cannot do without. The server's own container, which no loader gives a context, keeps that SEVERE for its marked members.- Specified by:
isSecretOptionalin interfaceISecretsContext- Parameters:
prop- The secret-marked property.- Returns:
- true for an application's store-only member.
getSecretsKey
Gets the secrets store key of a member of this container, present or not:<context>/$push/<member>, or, for a container that belongs to an ancestor root, the root's context and this container's atom path from it,server.<name>/$pushNotifications/$push/<member>. The Designer's Push page asks the store about a secret the file does not hold yet.- Parameters:
member- The member name, e.g.VAPID_PRIVATE_KEY.- Returns:
- The key, or null when there is no context.
getPublicVAPIDKey
Gets the VAPID public key.- Returns:
- A Base64-encoded String containing an ECDSA P-256 public key that the push server will use to authenticate the server. Returns
nullif undefined.
getPrivateVAPIDKey
Gets the VAPID private key.- Returns:
- A Base64url-encoded String containing the P-256 private scalar, 32 bytes, that signs the VAPID JWT. Returns
nullif undefined.
getVAPIDSubject
Gets the VAPID subject, i.e. thesubclaim of the VAPID JWT.- Returns:
- A
mailto:orhttps:contact URI, ornullif undefined.
getFCMProjectID
Gets the Firebase project ID for FCM HTTP v1 sends.- Returns:
- The project ID, or
nullif FCM is not configured for the application.
getFCMServiceAccount
Gets the Firebase service account key file as JSON text.- Returns:
- The service account JSON, or
nullif FCM is not configured.
getPrivateVAPIDKeyFile
Gets the reference to the VAPID key file of the server's own container (application*); an application's container holds none (ruling PP-1).- Returns:
- The reference as written, a relative or absolute path, or
nullif undefined;com.iizix.push.PushKeyFilesresolves it.
getFCMServiceAccountFile
Gets the reference to the Firebase service account key file of the server's own container (application*); an application's container holds none (ruling PP-1).- Returns:
- The reference as written, or
nullif undefined.
getTTL
public long getTTL()Gets the default Time-to-Live of the application's Push Notifications: theTTLproperty of.iiziPush, in milliseconds as the Designer'sDurationPropEditorstores it. The engine applies it to a send that carries no TTL of its own, for the HTTPpushand the Java API alike, clamped into [IPushSettings.TTL_MIN,IPushSettings.TTL_MAX] (PUSH-WIRE-CONTRACT.md section 6.4, P4-03).- Returns:
- The TTL in milliseconds, or -1 if undefined: the server-wide default (
IPushSettings.TTL_DEFAULT, 28 days) then applies.
isSubscribeAtSignIn
public boolean isSubscribeAtSignIn()Tells whether the server subscribes the device at sign-in: theSUBSCRIBE_AT_SIGNINproperty of.iiziPush(CC-PUSH-SUBSCRIBE-AT-SIGNIN, ruled 2026-10-22 LV-D-2). When true, a session whose user is signed in - at its creation, or by an in-app sign-in - has its device subscribed once to the application-level Topic by the server, through the session's Push Notification channel, as the application's Java would do withsubscribe(""): a Cordova device is asked for its permission the first time, a Browser follows only when its permission is already granted (a prompt outside a click is never shown), and a session without a channel to a device is left alone.- Returns:
- true when the application opted in; false by default, and when undefined.
verify
Verifies this property container. The check performed is the extension of classes and that no circular reference is present.