Class LicenseManager

java.lang.Object
org.zkoss.zkex.license.LicenseManager
All Implemented Interfaces:
Remote, LicenseCreator, LicenseVerifier

public class LicenseManager extends Object implements LicenseCreator, LicenseVerifier
This is the top level class which manages all licensing aspects like for instance the creation, installation and verification of license keys. The license manager knows how to install, verify and uninstall full and trial licenses for a given subject and ensures the privacy of the license content in its persistent form (i.e. the license key). For signing, verifying and validating licenses, this class cooperates with a LicenseNotary.

This class is thread safe.

Version:
$Id$
Author:
Christian Schlichtherle
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected static final String
    => "CN="
    static final String
    The suffix for files which hold license certificates
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    Constructs a License Manager.
     
    Constructs a License Manager.
  • Method Summary

    Modifier and Type
    Method
    Description
    final byte[]
    Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and returns it as a license key.
    protected byte[]
    Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and returns it as a license key.
    Returns the license certificate cached from the last installation/verification of a license key or null if there wasn't an installation/verification or a timeout has occured.
    Returns a suitable file filter for the subject of this license manager.
    protected byte[]
    Returns the current license key.
    protected LicenseNotary
    Returns a license notary configured to use the keystore parameters contained in the current license parameters - null is never returned.
    Returns the license configuration parameters.
    protected PrivacyGuard
    Returns a privacy guard configured to use the cipher parameters contained in the current license parameters - null is never returned.
    protected void
    Initializes the given license content with some reasonable defaults unless the respective properties have already been set.
    protected LicenseContent
    install(byte[] key, LicenseNotary notary)
    Decrypts, decompresses, decodes and verifies the license key in key, validates its license content and installs it as the current license key.
    install(File keyFile)
    Loads, decrypts, decompresses, decodes and verifies the license key in keyFile, validates its license content and installs it as the current license key.
    protected LicenseContent
    install(File keyFile, LicenseNotary notary)
    Loads, decrypts, decompresses, decodes and verifies the license key in keyFile, validates its license content and installs it as the current license key.
    protected static byte[]
    Loads and returns the first megabyte of content from keyFile as license key in a newly created byte array.
    protected static Date
    Returns midnight local time today.
    protected void
    Sets the given license certificate as installed or verified.
    protected void
    setLicenseKey(byte[] key)
    Installs the given license key as the current license key.
    void
    Sets the license configuration parameters.
    final void
    store(LicenseContent content, File keyFile)
    Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and stores it to the given file as a license key.
    protected void
    store(LicenseContent content, LicenseNotary notary, File keyFile)
    Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and stores it to the given file as a license key.
    protected static void
    storeLicenseKey(byte[] key, File keyFile)
    Stores the given license key to the given file.
    void
    Uninstalls the current license key.
    protected void
    Validates the license content.
    Decrypts, decompresses, decodes and verifies the current license key, validates its license content and returns it.
    verify(byte[] key)
    Decrypts, decompresses, decodes and verifies the given license key, validates its license content and returns it.
    protected LicenseContent
    verify(byte[] key, LicenseNotary notary)
    Decrypts, decompresses, decodes and verifies the given license key, validates its license content and returns it.
    protected LicenseContent
    Decrypts, decompresses, decodes and verifies the current license key, validates its license content and returns it.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • LICENSE_SUFFIX

      public static final String LICENSE_SUFFIX
      The suffix for files which hold license certificates. => ".lic" - must be lowercase!
    • CN

      protected static final String CN
      => "CN="
  • Constructor Details

    • LicenseManager

      protected LicenseManager()
      Constructs a License Manager.

      Warning: The manager created by this constructor is not valid and cannot be used unless setLicenseParam(LicenseParam) is called!

    • LicenseManager

      public LicenseManager(LicenseParam param)
      Constructs a License Manager.
      Parameters:
      param - the license configuration parameters - may not be null.
      Throws:
      NullPointerException - If the given parameter object does not obey the contract of its interface due to a null pointer.
      IllegalPasswordException - If any password in the parameter object does not comply to the current policy.
  • Method Details

    • midnight

      protected static Date midnight()
      Returns midnight local time today.
    • getLicenseParam

      public LicenseParam getLicenseParam()
      Returns the license configuration parameters.
    • setLicenseParam

      public void setLicenseParam(LicenseParam param)
      Sets the license configuration parameters. Calling this method resets the manager as if it had been newly created. Some plausibility checks are applied to the given parameter object to ensure that it adheres to the contract of the parameter interfaces.
      Parameters:
      param - the license configuration parameters - may not be null.
      Throws:
      NullPointerException - If the given parameter object does not obey the contract of its interface due to a null pointer.
      IllegalPasswordException - If any password in the parameter object does not comply to the current policy.
    • store

      public final void store(LicenseContent content, File keyFile) throws Exception
      Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and stores it to the given file as a license key.

      As a side effect, the given license content is initialized with some reasonable defaults unless the respective properties have already been set.

      Parameters:
      content - the license content - may not be null.
      keyFile - the file to save the license key to - may not be null. This should have a LICENSE_SUFFIX.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • store

      protected void store(LicenseContent content, LicenseNotary notary, File keyFile) throws Exception
      Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and stores it to the given file as a license key.

      As a side effect, the given license content is initialized with some reasonable defaults unless the respective properties have already been set.

      Parameters:
      content - the license content - may not be null.
      notary - the license notary used to sign the license key - may not be null.
      keyFile - the file to save the license key to - may not be null. This should have a LICENSE_SUFFIX.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • create

      public final byte[] create(LicenseContent content) throws Exception
      Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and returns it as a license key.

      As a side effect, the given license content is initialized with some reasonable defaults unless the respective properties have already been set.

      Specified by:
      create in interface LicenseCreator
      Parameters:
      content - the license content - may not be null.
      Returns:
      The license key - null is never returned.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • create

      protected byte[] create(LicenseContent content, LicenseNotary notary) throws Exception
      Initializes and validates the license content, creates a new signed license certificate for it and compresses, encrypts and returns it as a license key.

      As a side effect, the given license content is initialized with some reasonable defaults unless the respective properties have already been set.

      Parameters:
      content - the license content - may not be null.
      notary - the license notary used to sign the license key - may not be null.
      Returns:
      The license key - null is never returned.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • install

      public final LicenseContent install(File keyFile) throws Exception
      Loads, decrypts, decompresses, decodes and verifies the license key in keyFile, validates its license content and installs it as the current license key.
      Parameters:
      keyFile - the file to load the license key from - may not be null.
      Returns:
      A clone of the verified and validated content of the license key - null is never returned.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • install

      protected LicenseContent install(File keyFile, LicenseNotary notary) throws Exception
      Loads, decrypts, decompresses, decodes and verifies the license key in keyFile, validates its license content and installs it as the current license key.
      Parameters:
      keyFile - The file to load the license key from - may not be null.
      notary - The license notary used to verify the license key - may not be null.
      Returns:
      A clone of the verified and validated content of the license key - null is never returned.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • install

      protected LicenseContent install(byte[] key, LicenseNotary notary) throws Exception
      Decrypts, decompresses, decodes and verifies the license key in key, validates its license content and installs it as the current license key.
      Parameters:
      key - the license key - may not be null.
      notary - the license notary used to verify the license key - may not be null.
      Returns:
      A clone of the verified and validated content of the license key - null is never returned.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • verify

      public final LicenseContent verify() throws Exception
      Decrypts, decompresses, decodes and verifies the current license key, validates its license content and returns it.
      Returns:
      A clone of the verified and validated content of the license key - null is never returned.
      Throws:
      NoLicenseInstalledException - if no license key is installed.
      Exception - for any other reason. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • verify

      protected LicenseContent verify(LicenseNotary notary) throws Exception
      Decrypts, decompresses, decodes and verifies the current license key, validates its license content and returns it.
      Parameters:
      notary - the license notary used to verify the current license key - may not be null.
      Returns:
      A clone of the verified and validated content of the license key - null is never returned.
      Throws:
      NoLicenseInstalledException - if no license key is installed.
      Exception - for any other reason. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • verify

      public final LicenseContent verify(byte[] key) throws Exception
      Decrypts, decompresses, decodes and verifies the given license key, validates its license content and returns it.
      Specified by:
      verify in interface LicenseVerifier
      Parameters:
      key - the license key - may not be null.
      Returns:
      A clone of the verified and validated content of the license key - null is never returned.
      Throws:
      Exception - an instance of a subclass of this class for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • verify

      protected LicenseContent verify(byte[] key, LicenseNotary notary) throws Exception
      Decrypts, decompresses, decodes and verifies the given license key, validates its license content and returns it.
      Parameters:
      key - the license key - may not be null.
      notary - the license notary used to verify the license key - may not be null.
      Returns:
      A clone of the verified and validated content of the license key - null is never returned.
      Throws:
      Exception - for various reasons. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • uninstall

      public void uninstall() throws Exception
      Uninstalls the current license key.
      Throws:
      Exception - An instance of a subclass of this class for various reasons.
    • initialize

      protected void initialize(LicenseContent content)
      Initializes the given license content with some reasonable defaults unless the respective properties have already been set.
      See Also:
    • validate

      protected void validate(LicenseContent content) throws LicenseContentException
      Validates the license content. This method is called whenever a license certificate is created, installed or verified.

      Validation consists of the following plausability checks for the properties of this class:

      • 'subject' must match the subject required by the application via the LicenseParam interface.
      • 'holder', 'issuer' and 'issued' must be provided (i.e. not null).
      • If 'notBefore' or 'notAfter' are provided, the current date and time must match their restrictions.
      • 'consumerType' must be provided and 'consumerAmount' must be positive. If a user preference node is provided in the license parameters, 'consumerType' must also match "User" (whereby case is ignored) and 'consumerAmount' must equal 1.

      If you need more or less rigid restrictions, you should override this method in a subclass.

      Parameters:
      content - the license content - may not be null.
      Throws:
      NullPointerException - if content is null.
      LicenseContentException - if any validation test fails. Note that you should always use Throwable.getLocalizedMessage() to get a (possibly localized) meaningful detail message.
      See Also:
    • getCertificate

      protected GenericCertificate getCertificate()
      Returns the license certificate cached from the last installation/verification of a license key or null if there wasn't an installation/verification or a timeout has occured.
    • setCertificate

      protected void setCertificate(GenericCertificate certificate)
      Sets the given license certificate as installed or verified.
      Parameters:
      certificate - the license certificate - may be null to clear.
    • getLicenseKey

      protected byte[] getLicenseKey()
      Returns the current license key.
    • setLicenseKey

      protected void setLicenseKey(byte[] key)
      Installs the given license key as the current license key. If key is null, the current license key gets uninstalled (but the cached license certificate is not cleared).
    • storeLicenseKey

      protected static void storeLicenseKey(byte[] key, File keyFile) throws IOException
      Stores the given license key to the given file.
      Parameters:
      key - the license key - may not be null.
      keyFile - the file to save the license key to - may not be null. This should have a LICENSE_SUFFIX.
      Throws:
      IOException
    • loadLicenseKey

      protected static byte[] loadLicenseKey(File keyFile) throws IOException
      Loads and returns the first megabyte of content from keyFile as license key in a newly created byte array.
      Parameters:
      keyFile - the file holding the license key - may not be null.
      Throws:
      IOException
    • getLicenseNotary

      protected LicenseNotary getLicenseNotary()
      Returns a license notary configured to use the keystore parameters contained in the current license parameters - null is never returned.
    • getPrivacyGuard

      protected PrivacyGuard getPrivacyGuard()
      Returns a privacy guard configured to use the cipher parameters contained in the current license parameters - null is never returned.
    • getFileFilter

      public FileFilter getFileFilter()
      Returns a suitable file filter for the subject of this license manager. On Windows systems, the case of the suffix is ignored when browsing directories.
      Returns:
      A valid FileFilter.