Class User

java.lang.Object
com.erudika.para.core.User
All Implemented Interfaces:
Linkable, ParaObject, Votable, Serializable

public class User extends Object implements ParaObject
The core user object. Stores information about users.
Author:
Alex Bogdanovski [[email protected]]
See Also:
  • Field Details

    • MAX_PASSWORD_LENGTH

      public static final int MAX_PASSWORD_LENGTH
      Maximum password length.
      See Also:
  • Constructor Details

    • User

      public User()
      No-args constructor.
    • User

      public User(String id)
      Default constructor.
      Parameters:
      id - the id
  • Method Details

    • getTokenSecret

      public String getTokenSecret()
      Token secret - used for generating JWT tokens. Changing this secret would invalidate all existing user tokens. A kind of global "logout".
      Returns:
      a random string
    • setTokenSecret

      public void setTokenSecret(String tokenSecret)
      Sets the token secret.
      Parameters:
      tokenSecret - a random string
    • getPicture

      public String getPicture()
      The profile picture URL.
      Returns:
      a URL or null
    • setPicture

      public void setPicture(String picture)
      Sets the profile picture URL.
      Parameters:
      picture - the picture URL.
    • getActive

      public Boolean getActive()
      Returns true if this account is active.
      Returns:
      true if active
    • setActive

      public void setActive(Boolean active)
      Sets the account active.
      Parameters:
      active - true if active
    • getTwoFA

      public Boolean getTwoFA()
      Returns:
      true if 2FA is enabled
    • setTwoFA

      public void setTwoFA(Boolean twoFA)
      Sets 2FA enabled/disabled.
      Parameters:
      twoFA - true if 2FA is enabled
    • getTwoFAkey

      public String getTwoFAkey()
      Returns:
      the 2FA secret key. Used for checking the TOTP code.
    • setTwoFAkey

      public void setTwoFAkey(String twoFAkey)
      Sets the 2FA secret key.
      Parameters:
      twoFAkey - secret key
    • getTwoFAbackupKeyHash

      public String getTwoFAbackupKeyHash()
      Returns:
      the hashed backup key (shown only once). Used for disabling 2FA.
    • setTwoFAbackupKeyHash

      public void setTwoFAbackupKeyHash(String twoFAbackupKeyHash)
      Sets the 2FA backup key hash.
      Parameters:
      twoFAbackupKeyHash - bcrypt hash
    • getGroups

      public String getGroups()
      Returns the security groups for this user.
      Returns:
      the groups string
    • setGroups

      public void setGroups(String groups)
      Sets the security groups for this user.
      Parameters:
      groups - the groups string
    • getIdentifier

      public String getIdentifier()
      Returns the main identifier for this user. An identifier is basically a unique username that identifies a user.
      Returns:
      the main identifier
    • setIdentifier

      public void setIdentifier(String identifier)
      Sets the main identifier.
      Parameters:
      identifier - the main identifier
    • getEmail

      public String getEmail()
      The user's email.
      Returns:
      email
    • setEmail

      public void setEmail(String email)
      Sets the email.
      Parameters:
      email - email
    • getCurrency

      public String getCurrency()
      The user's currency preference.
      Returns:
      a currency 3-letter code in uppercase
    • setCurrency

      public void setCurrency(String currency)
      Sets a preferred currency. Default is "EUR".
      Parameters:
      currency - a 3-letter currency code
    • resetTokenSecret

      public void resetTokenSecret()
      Generates a new token secret. This is whould be equivalent to "logout everywhere".
    • canModify

      public boolean canModify(ParaObject obj)
      Note: this method assumes that child objects can be modified by their parents. This might not work for special cases where a parent has no rights over a child.
      Parameters:
      obj - an object
      Returns:
      true if the user is the creator or parent of this object or an admin user
    • create

      public String create()
      Description copied from interface: ParaObject
      Stores this object in the data store.
      Specified by:
      create in interface ParaObject
      Returns:
      the id of the object (a new id if object is new)
      See Also:
    • delete

      public void delete()
      Description copied from interface: ParaObject
      Deletes the object permanently by removing it from the data store.
      Specified by:
      delete in interface ParaObject
      See Also:
    • attachIdentifier

      public void attachIdentifier(String identifier)
      Attaches a new identifier to this user.
      Parameters:
      identifier - a new identifier
    • detachIdentifier

      public void detachIdentifier(String identifier)
      Detaches a secondary identifier which is not already used by this user.
      Parameters:
      identifier - an attached identifier
    • isFacebookUser

      public boolean isFacebookUser()
      Is the main identifier a Facebook id.
      Returns:
      true if user is signed in with Facebook
    • isGooglePlusUser

      public boolean isGooglePlusUser()
      Is the main identifier a Google+ id.
      Returns:
      true if user is signed in with Google+
    • isLinkedInUser

      public boolean isLinkedInUser()
      Is the main identifier a LinkedIn id.
      Returns:
      true if user is signed in with LinkedIn
    • isTwitterUser

      public boolean isTwitterUser()
      Is the main identifier a Twitter id.
      Returns:
      true if user is signed in with Twitter
    • isGitHubUser

      public boolean isGitHubUser()
      Is the main identifier a GitHub id.
      Returns:
      true if user is signed in with GitHub
    • isMicrosoftUser

      public boolean isMicrosoftUser()
      Is the main identifier a Microsoft/Windows account id.
      Returns:
      true if user is signed in with a Microsoft account
    • isSlackUser

      public boolean isSlackUser()
      Is the main identifier a Slack account id.
      Returns:
      true if user is signed in with a Slack account
    • isMattermostUser

      public boolean isMattermostUser()
      Is the main identifier a Mattermost account id.
      Returns:
      true if user is signed in with a Mattermost account
    • isAmazonUser

      public boolean isAmazonUser()
      Is the main identifier a Amazon account id.
      Returns:
      true if user is signed in with a Amazon account
    • isLDAPUser

      public boolean isLDAPUser()
      Is the main identifier a LDAP account.
      Returns:
      true if user is signed in with a LDAP account
    • isSAMLUser

      public boolean isSAMLUser()
      Is the main identifier a SAML account.
      Returns:
      true if user is signed in with a SAML account
    • isPasswordlessUser

      public boolean isPasswordlessUser()
      Is the main identifier a custom SSO account.
      Returns:
      true if user is signed in with a custom SSO JWT token
    • isOAuth2User

      public boolean isOAuth2User()
      Is the main identifier from a generic OAuth 2.0/OpenID Connect provider.
      Returns:
      true if user is signed in with a generic OAauth 2.0 account
    • isAdmin

      public boolean isAdmin()
      Checks for admin rights.
      Returns:
      true if user has admin rights
    • isModerator

      public boolean isModerator()
      Checks for moderator rights.
      Returns:
      true if user has mod rights
    • getIdentityProvider

      public String getIdentityProvider()
      Returns the name of the identity provider.
      Returns:
      "facebook", "google"... etc.
    • hasValidIdentifier

      public boolean hasValidIdentifier()
      Validates the identifier property value.
      Returns:
      true if the user identifier has valid syntax.
    • getPassword

      public String getPassword()
      The password. A transient field used for validation.
      Returns:
      the password.
    • setPassword

      public void setPassword(String password)
      Sets a password.
      Parameters:
      password - a password
    • getIdpIdToken

      public String getIdpIdToken()
      Used for storing the ID token from an OpenID Connect/OAuth 2.0 identity provider.
      Returns:
      an ID token (JWT is always assumed to be the format)
    • setIdpIdToken

      public void setIdpIdToken(String idpIdToken)
      Sets the IDP ID token.
      Parameters:
      idpIdToken - a token
    • getIdpAccessToken

      public String getIdpAccessToken()
      Used for storing the access token from an OpenID Connect/OAuth 2.0 identity provider.
      Returns:
      a JWT access token (JWT is always assumed to be the format)
    • setIdpAccessToken

      public void setIdpAccessToken(String idpAccessToken)
      Sets the IDP access token.
      Parameters:
      idpAccessToken - a token
    • getIdpRefreshToken

      public String getIdpRefreshToken()
      Stores the refresh token from the identity provider.
      Returns:
      a JWT refresh token
    • setIdpRefreshToken

      public void setIdpRefreshToken(String idpRefreshToken)
      Sets the refresh token.
      Parameters:
      idpRefreshToken - a refresh token
    • getIdpIdTokenPayload

      public String getIdpIdTokenPayload()
      Returns the JWT payload for the ID token coming from the IDP. Used for delegating user attributes data to clients. This must be a Base64-encoded JSON string.
      Returns:
      the payload part in Base64
    • getIdpAccessTokenPayload

      public String getIdpAccessTokenPayload()
      Returns the JWT payload for the access token coming from the IDP. Used for delegating user attributes data to clients. This must be a Base64-encoded JSON string.
      Returns:
      the payload part in Base64
    • readUserForIdentifier

      public static final User readUserForIdentifier(User u)
      Returns a user object for a given identifier.
      Parameters:
      u - a user having a valid identifier set.
      Returns:
      a user or null if no user is found for this identifier
    • passwordMatches

      public static final boolean passwordMatches(User u) throws LimitExceededException
      Checks if a user has entered the correct password. Compares password hashes.
      Parameters:
      u - a user with a set password
      Returns:
      true if password matches the one in the data store
      Throws:
      LimitExceededException - if rate limit is exceeded when password doesn't match.
    • generatePasswordResetToken

      public final String generatePasswordResetToken()
      Generates a new password reset token. Sent via email for pass reset.
      Returns:
      the pass reset token
    • resetPassword

      public final boolean resetPassword(String token, String newpass)
      Changes the user password permanently.
      Parameters:
      token - the reset token. see generatePasswordResetToken()
      newpass - the new password
      Returns:
      true if successful
    • generateEmailConfirmationToken

      public String generateEmailConfirmationToken()
      Generates a new email confirmation token. Sent via email for user activation.
      Returns:
      a Base64 encoded UUID
    • activateWithEmailToken

      public final boolean activateWithEmailToken(String token)
      Activates a user if a given token matches the one stored.
      Parameters:
      token - the email confirmation token. see generateEmailConfirmationToken()
      Returns:
      true if successful
    • isValidPasswordResetToken

      public final boolean isValidPasswordResetToken(String token)
      Validates a token sent via email for password reset.
      Parameters:
      token - a token
      Returns:
      true if valid
    • isValidEmailConfirmationToken

      public final boolean isValidEmailConfirmationToken(String token)
      Validates a token sent for email confirmation.
      Parameters:
      token - a token
      Returns:
      true if valid
    • getId

      public final String getId()
      Description copied from interface: ParaObject
      The id of an object. Usually an autogenerated unique string of numbers.
      Specified by:
      getId in interface ParaObject
      Returns:
      the id
    • setId

      public final void setId(String id)
      Description copied from interface: ParaObject
      Sets a new id. Must not be null or empty.
      Specified by:
      setId in interface ParaObject
      Parameters:
      id - the new id
    • getType

      public final String getType()
      Description copied from interface: ParaObject
      The name of the object's class. This is equivalent to Class.getSimpleName().toLowerCase()
      Specified by:
      getType in interface ParaObject
      Returns:
      the simple name of the class
    • setType

      public final void setType(String type)
      Description copied from interface: ParaObject
      Sets a new object type. Must not be null or empty.
      Specified by:
      setType in interface ParaObject
      Parameters:
      type - a new type
    • getAppid

      public String getAppid()
      Description copied from interface: ParaObject
      The application name. Added to support multiple separate apps. Every object must belong to an app.
      Specified by:
      getAppid in interface ParaObject
      Returns:
      the app id (name). default: para
    • setAppid

      public void setAppid(String appid)
      Description copied from interface: ParaObject
      Sets a new app name. Must not be null or empty.
      Specified by:
      setAppid in interface ParaObject
      Parameters:
      appid - the new app id (name)
    • getObjectURI

      public String getObjectURI()
      Description copied from interface: ParaObject
      The URI of this object. For example: /users/123
      Specified by:
      getObjectURI in interface ParaObject
      Returns:
      the URI
      See Also:
    • getTags

      public List<String> getTags()
      Description copied from interface: ParaObject
      The tags associated with this object. Tags must not be null or empty.
      Specified by:
      getTags in interface ParaObject
      Returns:
      a set of tags, or an empty set
      See Also:
    • setTags

      public void setTags(List<String> tags)
      Description copied from interface: ParaObject
      Merges the given tags with existing tags.
      Specified by:
      setTags in interface ParaObject
      Parameters:
      tags - the additional tags, or clears all tags if set to null
    • getStored

      public Boolean getStored()
      Description copied from interface: ParaObject
      Boolean flag which controls whether this object is stored in the database or not. Default is true.
      Specified by:
      getStored in interface ParaObject
      Returns:
      true if this object is stored in DB.
    • setStored

      public void setStored(Boolean stored)
      Description copied from interface: ParaObject
      Sets the "isStored" flag.
      Specified by:
      setStored in interface ParaObject
      Parameters:
      stored - when set to true, object is stored in DB.
    • getIndexed

      public Boolean getIndexed()
      Description copied from interface: ParaObject
      Boolean flag which controls whether this object is indexed by the search engine. Default is true.
      Specified by:
      getIndexed in interface ParaObject
      Returns:
      true if this object is indexed
    • setIndexed

      public void setIndexed(Boolean indexed)
      Description copied from interface: ParaObject
      Sets the "isIndexed" flag.
      Specified by:
      setIndexed in interface ParaObject
      Parameters:
      indexed - when set to true, object is indexed.
    • getCached

      public Boolean getCached()
      Description copied from interface: ParaObject
      Boolean flag which controls whether this object is cached. Default is true.
      Specified by:
      getCached in interface ParaObject
      Returns:
      true if this object is cached on update() and create().
    • setCached

      public void setCached(Boolean cached)
      Description copied from interface: ParaObject
      Sets the "isCached" flag.
      Specified by:
      setCached in interface ParaObject
      Parameters:
      cached - when set to true, object is cached.
    • getTimestamp

      public Long getTimestamp()
      Description copied from interface: ParaObject
      The time when the object was created, in milliseconds.
      Specified by:
      getTimestamp in interface ParaObject
      Returns:
      the timestamp of creation
    • setTimestamp

      public void setTimestamp(Long timestamp)
      Description copied from interface: ParaObject
      Sets the timestamp.
      Specified by:
      setTimestamp in interface ParaObject
      Parameters:
      timestamp - a new timestamp in milliseconds.
    • getCreatorid

      public String getCreatorid()
      Description copied from interface: ParaObject
      The id of the user who created this. Should point to a User id.
      Specified by:
      getCreatorid in interface ParaObject
      Returns:
      the id or null
    • setCreatorid

      public void setCreatorid(String creatorid)
      Description copied from interface: ParaObject
      Sets a new creator id. Must not be null or empty.
      Specified by:
      setCreatorid in interface ParaObject
      Parameters:
      creatorid - a new id
    • getName

      public final String getName()
      Description copied from interface: ParaObject
      The name of the object. Can be anything.
      Specified by:
      getName in interface ParaObject
      Returns:
      the name. default: [type id]
    • setName

      public final void setName(String name)
      Description copied from interface: ParaObject
      Sets a new name. Must not be null or empty.
      Specified by:
      setName in interface ParaObject
      Parameters:
      name - the new name
    • getPlural

      public String getPlural()
      Description copied from interface: ParaObject
      The plural name of the object. For example: user - users
      Specified by:
      getPlural in interface ParaObject
      Returns:
      the plural name
    • getParentid

      public String getParentid()
      Description copied from interface: ParaObject
      The id of the parent object.
      Specified by:
      getParentid in interface ParaObject
      Returns:
      the id of the parent or null
    • setParentid

      public void setParentid(String parentid)
      Description copied from interface: ParaObject
      Sets a new parent id. Must not be null or empty.
      Specified by:
      setParentid in interface ParaObject
      Parameters:
      parentid - a new id
    • getUpdated

      public Long getUpdated()
      Description copied from interface: ParaObject
      The last time this object was updated. Timestamp in ms.
      Specified by:
      getUpdated in interface ParaObject
      Returns:
      timestamp in milliseconds
    • setUpdated

      public void setUpdated(Long updated)
      Description copied from interface: ParaObject
      Sets the last updated timestamp.
      Specified by:
      setUpdated in interface ParaObject
      Parameters:
      updated - a new timestamp
    • update

      public void update()
      Description copied from interface: ParaObject
      Updates the object permanently. Changes to Locked fields are ignored.
      Specified by:
      update in interface ParaObject
      See Also:
    • exists

      public boolean exists()
      Description copied from interface: ParaObject
      Checks if an object is stored in the data store.
      Specified by:
      exists in interface ParaObject
      Returns:
      true if the object is persisted to the data store.
      See Also:
    • voteUp

      public boolean voteUp(String userid)
      Description copied from interface: Votable
      Upvotes the object.
      Specified by:
      voteUp in interface Votable
      Parameters:
      userid - id of voter
      Returns:
      true if successful
    • voteDown

      public boolean voteDown(String userid)
      Description copied from interface: Votable
      Downvotes the object.
      Specified by:
      voteDown in interface Votable
      Parameters:
      userid - id of voter
      Returns:
      true if successful
    • getVotes

      public Integer getVotes()
      Description copied from interface: Votable
      Returns the total sum of all votes for this object. For example: (+6) + (-4) = 2
      Specified by:
      getVotes in interface Votable
      Returns:
      the total sum of votes
    • setVotes

      public void setVotes(Integer votes)
      Description copied from interface: Votable
      Sets the total votes for this object.
      Specified by:
      setVotes in interface Votable
      Parameters:
      votes - the number of votes
    • getVersion

      public Long getVersion()
      Description copied from interface: ParaObject
      Returns the version number for this object. Used primarily for optimistic locking.
      Specified by:
      getVersion in interface ParaObject
      Returns:
      a positive number, 0 if unused or -1, indicating a failed update.
    • setVersion

      public void setVersion(Long version)
      Description copied from interface: ParaObject
      Sets the version of this object. This value should come from the database.
      Specified by:
      setVersion in interface ParaObject
      Parameters:
      version - a positive number, different than the current value of the version field
    • countLinks

      public Long countLinks(String type2)
      Description copied from interface: Linkable
      Count the total number of links between this object and another type of object.
      Specified by:
      countLinks in interface Linkable
      Parameters:
      type2 - the other type of object
      Returns:
      the number of links
    • getLinks

      public List<Linker> getLinks(String type2, Pager... pager)
      Description copied from interface: Linkable
      Returns all links between this type object and another type of object.
      Specified by:
      getLinks in interface Linkable
      Parameters:
      type2 - the other type of object
      pager - a Pager
      Returns:
      a list of Linker objects in a many-to-many relationship with this object.
    • getLinkedObjects

      public <P extends ParaObject> List<P> getLinkedObjects(String type, Pager... pager)
      Description copied from interface: Linkable
      Specified by:
      getLinkedObjects in interface Linkable
      Type Parameters:
      P - type of linked objects
      Parameters:
      type - type of linked objects to look for
      pager - a Pager
      Returns:
      a list of linked objects
    • findLinkedObjects

      public <P extends ParaObject> List<P> findLinkedObjects(String type, String field, String query, Pager... pager)
      Description copied from interface: Linkable
      Similar to Linkable.findChildren(java.lang.String, java.lang.String, com.erudika.para.core.utils.Pager...) but for many-to-many relationships. Searches through all linked objects connected to this via a Linker object.
      Specified by:
      findLinkedObjects in interface Linkable
      Type Parameters:
      P - type of linked objects
      Parameters:
      type - type of linked objects to look for
      field - the name of the field to target (within a nested field "nstd")
      query - a query string
      pager - a Pager
      Returns:
      a list of linked objects matching the search query
    • isLinked

      public boolean isLinked(String type2, String id2)
      Description copied from interface: Linkable
      Checks if this object is linked to another.
      Specified by:
      isLinked in interface Linkable
      Parameters:
      type2 - the other type
      id2 - the other id
      Returns:
      true if the two are linked
    • isLinked

      public boolean isLinked(ParaObject toObj)
      Description copied from interface: Linkable
      Checks if a given object is linked to this one.
      Specified by:
      isLinked in interface Linkable
      Parameters:
      toObj - the other object
      Returns:
      true if linked
    • link

      public String link(String id2)
      Description copied from interface: Linkable
      Links an object to this one in a many-to-many relationship. Only a link is created. Objects are left untouched. The type of the second object is automatically determined on read.
      Specified by:
      link in interface Linkable
      Parameters:
      id2 - the other id
      Returns:
      the id of the Linker object that is created
    • unlink

      public void unlink(String type, String id2)
      Description copied from interface: Linkable
      Unlinks an object from this one. Only a link is deleted. Objects are left untouched.
      Specified by:
      unlink in interface Linkable
      Parameters:
      type - the other type
      id2 - the other id
    • unlinkAll

      public void unlinkAll()
      Description copied from interface: Linkable
      Unlinks all objects that are linked to this one. Deletes all Linker objects. Only the links are deleted. Objects are left untouched.
      Specified by:
      unlinkAll in interface Linkable
    • countChildren

      public Long countChildren(String type)
      Description copied from interface: Linkable
      Count the total number of child objects for this object.
      Specified by:
      countChildren in interface Linkable
      Parameters:
      type - the other type of object
      Returns:
      the number of links
    • getChildren

      public <P extends ParaObject> List<P> getChildren(String type, Pager... pager)
      Description copied from interface: Linkable
      Returns all child objects linked to this object.
      Specified by:
      getChildren in interface Linkable
      Type Parameters:
      P - the type of children
      Parameters:
      type - the type of children to look for
      pager - a Pager
      Returns:
      a list of ParaObject in a one-to-many relationship with this object
    • getChildren

      public <P extends ParaObject> List<P> getChildren(String type, String field, String term, Pager... pager)
      Description copied from interface: Linkable
      Returns all child objects linked to this object.
      Specified by:
      getChildren in interface Linkable
      Type Parameters:
      P - the type of children
      Parameters:
      type - the type of children to look for
      field - the field name to use as filter
      term - the field value to use as filter
      pager - a Pager
      Returns:
      a list of ParaObject in a one-to-many relationship with this object
    • findChildren

      public <P extends ParaObject> List<P> findChildren(String type, String query, Pager... pager)
      Description copied from interface: Linkable
      Search through all child objects. Only searches child objects directly connected to this parent via the parentid field.
      Specified by:
      findChildren in interface Linkable
      Type Parameters:
      P - the type of children
      Parameters:
      type - the type of children to look for
      query - a query string
      pager - a Pager
      Returns:
      a list of ParaObject in a one-to-many relationship with this object
    • deleteChildren

      public void deleteChildren(String type)
      Description copied from interface: Linkable
      Deletes all child objects permanently.
      Specified by:
      deleteChildren in interface Linkable
      Parameters:
      type - the children's type.
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • equals

      public boolean equals(Object obj)
      Overrides:
      equals in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object