/**
  * Constructor.
  *
  * @param configurations varargs array of configuration instances
  */
 public EncryptionConfigurationCriterion(
     @Nonnull @NonnullElements @NotEmpty EncryptionConfiguration... configurations) {
   Constraint.isNotNull(configurations, "List of configurations cannot be null");
   configs =
       new ArrayList<>(Collections2.filter(Arrays.asList(configurations), Predicates.notNull()));
   Constraint.isGreaterThanOrEqual(1, configs.size(), "At least one configuration is required");
 }
  /**
   * Set the strategy used to locate the principal name for this attribute filtering.
   *
   * @param strategy lookup strategy
   */
  public void setPrincipalNameLookupStrategy(
      @Nonnull final Function<ProfileRequestContext, String> strategy) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);

    principalNameLookupStrategy =
        Constraint.isNotNull(strategy, "Principal name lookup strategy cannot be null");
  }
  /**
   * Set the strategy used to locate or create the {@link AttributeFilterContext} to populate.
   *
   * @param strategy lookup/creation strategy
   */
  public void setFilterContextCreationStrategy(
      @Nonnull final Function<ProfileRequestContext, AttributeFilterContext> strategy) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);

    filterContextCreationStrategy =
        Constraint.isNotNull(strategy, "AttributeContext creation strategy cannot be null");
  }
 @Override
 @Nullable
 public ProxyGrantingTicket removeProxyGrantingTicket(@Nonnull final String id) {
   Constraint.isNotNull(id, "Id cannot be null");
   final ProxyGrantingTicket pgt = delete(id, ProxyGrantingTicket.class);
   return pgt;
 }
  /**
   * Set the flows available for possible use.
   *
   * @param flows the flows available for possible use
   */
  public void setAvailableFlows(
      @Nonnull @NonnullElements final Collection<SubjectCanonicalizationFlowDescriptor> flows) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
    Constraint.isNotNull(flows, "Flow collection cannot be null");

    availableFlows = new ArrayList<>(Collections2.filter(flows, Predicates.notNull()));
  }
  /**
   * Set the creation/lookup strategy for the {@link LogoutPropagationContext}.
   *
   * @param strategy creation/lookup strategy
   */
  public void setLogoutPropagationContextCreationStrategy(
      @Nonnull final Function<ProfileRequestContext, LogoutPropagationContext> strategy) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);

    contextCreationStrategy =
        Constraint.isNotNull(strategy, "LogoutPropagationContext creation strategy cannot be null");
  }
  /** {@inheritDoc} */
  @Override
  @Nonnull
  public Iterable<EncryptedKey> resolve(@Nonnull final EncryptedData encryptedData) {
    Constraint.isNotNull(encryptedData, "EncryptedData cannot be null");

    return resolveKeyInfo(encryptedData.getKeyInfo(), depthLimit);
  }
  /**
   * Set the strategy used to locate the {@link AuthenticationContext} associated with a given
   * {@link ProfileRequestContext}.
   *
   * @param strategy strategy used to locate the {@link AuthenticationContext} associated with a
   *     given {@link ProfileRequestContext}
   */
  public void setAuthenticationContextLookupStrategy(
      @Nonnull final Function<ProfileRequestContext, AuthenticationContext> strategy) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);

    authnContextLookupStrategy =
        Constraint.isNotNull(strategy, "AuthenticationContext lookup strategy cannot be null");
  }
 @Override
 @Nonnull
 public ProxyGrantingTicket createProxyGrantingTicket(
     @Nonnull final String id,
     @Nonnull final Instant expiry,
     @Nonnull final ProxyTicket proxyTicket) {
   Constraint.isNotNull(proxyTicket, "ProxyTicket cannot be null");
   final ProxyGrantingTicket pgt =
       new ProxyGrantingTicket(
           Constraint.isNotNull(id, "ID cannot be null"),
           proxyTicket.getSessionId(),
           proxyTicket.getService(),
           Constraint.isNotNull(expiry, "Expiry cannot be null"),
           proxyTicket.getPgtId());
   store(pgt);
   return pgt;
 }
 @Override
 @Nonnull
 public ServiceTicket createServiceTicket(
     @Nonnull final String id,
     @Nonnull final Instant expiry,
     @Nonnull final String sessionId,
     @Nonnull final String service,
     final boolean renew) {
   final ServiceTicket st =
       new ServiceTicket(
           Constraint.isNotNull(id, "ID cannot be null"),
           Constraint.isNotNull(sessionId, "Session ID cannot be null"),
           Constraint.isNotNull(service, "Service cannot be null"),
           Constraint.isNotNull(expiry, "Expiry cannot be null"),
           renew);
   store(st);
   return st;
 }
 @Nonnull
 @Override
 public ProxyTicket createProxyTicket(
     @Nonnull final String id,
     @Nonnull final Instant expiry,
     @Nonnull final ProxyGrantingTicket pgt,
     @Nonnull final String service) {
   Constraint.isNotNull(pgt, "ProxyGrantingTicket cannot be null");
   final ProxyTicket pt =
       new ProxyTicket(
           Constraint.isNotNull(id, "ID cannot be null"),
           pgt.getSessionId(),
           Constraint.isNotNull(service, "Service cannot be null"),
           Constraint.isNotNull(expiry, "Expiry cannot be null"),
           pgt.getId());
   store(pt);
   return pt;
 }
  /**
   * Set the strategy used to locate the {@link SAMLMetadataContext} associated with a given {@link
   * ProfileRequestContext}. Also sets the strategy to find the {@link SAMLMetadataContext} from the
   * {@link AttributeFilterContext}; SAMLMetadataContext
   *
   * @param strategy strategy used to locate the {@link AuthenticationContext} associated with a
   *     given {@link ProfileRequestContext}
   */
  public void setMetadataContextLookupStrategy(
      @Nonnull final Function<ProfileRequestContext, SAMLMetadataContext> strategy) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);

    metadataContextLookupStrategy =
        Constraint.isNotNull(strategy, "MetadataContext lookup strategy cannot be null");
    metadataFromFilterLookupStrategy =
        Functions.compose(
            metadataContextLookupStrategy,
            new RootContextLookup<AttributeFilterContext, ProfileRequestContext>());
  }
  /**
   * Constructor.
   *
   * @param filterService engine used to filter attributes
   */
  public FilterAttributes(@Nonnull final ReloadableService<AttributeFilter> filterService) {
    attributeFilterService = Constraint.isNotNull(filterService, "Service cannot be null");

    issuerLookupStrategy = new ResponderIdLookupFunction();
    recipientLookupStrategy = new RelyingPartyIdLookupFunction();

    attributeContextLookupStrategy =
        Functions.compose(
            new ChildContextLookup<>(AttributeContext.class),
            new ChildContextLookup<ProfileRequestContext, RelyingPartyContext>(
                RelyingPartyContext.class));

    principalNameLookupStrategy =
        Functions.compose(
            new SubjectContextPrincipalLookupFunction(),
            new ChildContextLookup<ProfileRequestContext, SubjectContext>(SubjectContext.class));

    authnContextLookupStrategy = new ChildContextLookup<>(AuthenticationContext.class);

    // Default: inbound msg context -> SAMLPeerEntityContext -> SAMLMetadataContext
    metadataContextLookupStrategy =
        Functions.compose(
            new ChildContextLookup<>(SAMLMetadataContext.class),
            Functions.compose(
                new ChildContextLookup<>(SAMLPeerEntityContext.class),
                new InboundMessageContextLookup()));

    // This is always set to navigate to the root context and then apply the previous function.
    metadataFromFilterLookupStrategy =
        Functions.compose(
            new Function<ProfileRequestContext, SAMLMetadataContext>() {
              @Override
              public SAMLMetadataContext apply(ProfileRequestContext input) {
                return metadataContextLookupStrategy.apply(input);
              }
            },
            new RootContextLookup<AttributeFilterContext, ProfileRequestContext>());

    // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeFilterContext.
    filterContextCreationStrategy =
        Functions.compose(
            new ChildContextLookup<>(AttributeFilterContext.class, true),
            new ChildContextLookup<ProfileRequestContext, RelyingPartyContext>(
                RelyingPartyContext.class));

    maskFailures = true;
  }
  /**
   * Set the {@link SPSessionSerializerRegistry} to use.
   *
   * @param registry a registry of SPSession class to serializer mappings
   */
  public void setSPSessionSerializerRegistry(@Nonnull final SPSessionSerializerRegistry registry) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);

    spSessionSerializerRegistry = Constraint.isNotNull(registry, "Registry cannot be null");
  }
  /** {@inheritDoc} */
  protected void doInitialize() throws ComponentInitializationException {
    super.doInitialize();

    Constraint.isNotNull(getHttpServletRequest(), "HttpServletRequest may not be null");
  }
 /**
  * Set the HTTP servlet request instance being evaluated.
  *
  * @param request the request instance
  */
 public void setHttpServletRequest(HttpServletRequest request) {
   ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
   httpServletRequest = Constraint.isNotNull(request, "HttpServletRequest may not be null");
 }
 /**
  * Set the strategy for locating {@link SAMLConsentContext}.
  *
  * @param strategy lookup strategy
  */
 public void setConsentContextLookupStrategy(
     @Nonnull final Function<MessageContext, SAMLConsentContext> strategy) {
   consentContextStrategy =
       Constraint.isNotNull(strategy, "SAMLConsentContext lookup strategy cannot be null");
 }
 /**
  * Constructor.
  *
  * @param entityId the entity ID, can not be null or empty
  */
 public EntityIdCriterion(@Nonnull @NotEmpty final String entityId) {
   id =
       Constraint.isNotNull(
           StringSupport.trimOrNull(entityId), "Entity ID cannot be null or empty");
 }
 /**
  * Creates a new instance.
  *
  * @param ticketService Ticket service component.
  */
 public GrantProxyTicketAction(final TicketServiceEx ticketService) {
   this.ticketService = Constraint.isNotNull(ticketService, "TicketService cannot be null");
 }
 @Override
 @Nullable
 public ProxyGrantingTicket fetchProxyGrantingTicket(@Nonnull final String id) {
   Constraint.isNotNull(id, "Id cannot be null");
   return read(id, ProxyGrantingTicket.class);
 }
  /**
   * Set the {@link DataSealer} to use.
   *
   * @param sealer the {@link DataSealer} to use
   */
  public void setDataSealer(@Nonnull final DataSealer sealer) {
    ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);

    dataSealer = Constraint.isNotNull(sealer, "DataSealer cannot be null");
  }
 @Override
 @Nullable
 public ServiceTicket removeServiceTicket(@Nonnull final String id) {
   Constraint.isNotNull(id, "Id cannot be null");
   return delete(id, ServiceTicket.class);
 }
 /**
  * Creates a new instance with given parameters.
  *
  * @param pt Proxy ticket ID.
  */
 public ProxyTicketResponse(@Nonnull final String pt) {
   Constraint.isNotNull(pt, "PT cannot be null");
   this.pt = pt;
 }
 /*
  * Constructor
  */
 public MobileUserPrincipal(@Nonnull @NotEmpty final String mobile) {
   this.mobileNumber =
       Constraint.isNotNull(
           StringSupport.trimOrNull(mobile), "MobileNumber cannot be null or empty");
 }
  /** {@inheritDoc} */
  @Override
  protected void doV2Parse(
      @Nonnull final Element config,
      @Nonnull final ParserContext parserContext,
      @Nonnull final BeanDefinitionBuilder builder) {
    log.debug("{} Parsing v2 configuration {}", getLogPrefix(), config);

    final String targetResolvingStrategy =
        AttributeSupport.getAttributeValue(config, new QName("targetDeterminationStrategy"));
    Constraint.isNotNull(
        StringSupport.trimOrNull(targetResolvingStrategy),
        "The targetDeterminationStrategy can not be null or empty, please adjust entityID from the AQ DataConnector");

    if (targetResolvingStrategy.equals("mysql")) {
      // Constructor is MySQLTargetResolvingStrategy(String url, String username, String password),
      // adding arguments in this order:
      final BeanDefinitionBuilder mysqlTargetResolvingStrategy =
          BeanDefinitionBuilder.genericBeanDefinition(MySQLTargetDeterminationStrategy.class);

      final String dbURL = AttributeSupport.getAttributeValue(config, new QName("dbURL"));
      Constraint.isNotNull(
          StringSupport.trimOrNull(dbURL),
          "The dbURL attribute is required if the targetResolvingStrategy is mysql, please adjust entityID from the AQ DataConnector");
      mysqlTargetResolvingStrategy.addConstructorArgValue(dbURL);

      final String dbUsername = AttributeSupport.getAttributeValue(config, new QName("dbUsername"));
      Constraint.isNotNull(
          StringSupport.trimOrNull(dbUsername),
          "The dbUsername attribute is required if the targetResolvingStrategy is mysql, please adjust entityID from the AQ DataConnector");
      mysqlTargetResolvingStrategy.addConstructorArgValue(dbUsername);

      final String dbPassword = AttributeSupport.getAttributeValue(config, new QName("dbPassword"));
      Constraint.isNotNull(
          StringSupport.trimOrNull(dbPassword),
          "The dbPassword attribute is required if the targetResolvingStrategy is mysql, please adjust entityID from the AQ DataConnector");
      mysqlTargetResolvingStrategy.addConstructorArgValue(dbPassword);

      builder.addPropertyValue(
          "targetResolvingStrategy", mysqlTargetResolvingStrategy.getBeanDefinition());
    } else if (targetResolvingStrategy.equals("ldap")) {
      final BeanDefinitionBuilder ldapTargetResolvingStrategy =
          BeanDefinitionBuilder.genericBeanDefinition(LDAPTargetDeterminationStrategy.class);

      final String sourceAttributeID =
          AttributeSupport.getAttributeValue(config, new QName("sourceAttributeID"));
      Constraint.isNotNull(
          StringSupport.trimOrNull(sourceAttributeID),
          "The sourceAttributeID attribute is required if the targetResolvingStrategy is ldap, please adjust entityID from the AQ DataConnector");
      ldapTargetResolvingStrategy.addConstructorArgValue(sourceAttributeID);

      final List<Element> dependencyElements =
          ElementSupport.getChildElements(config, ResolverPluginDependencyParser.ELEMENT_NAME);
      ldapTargetResolvingStrategy.addPropertyValue(
          "dependencies", SpringSupport.parseCustomElements(dependencyElements, parserContext));

      final String connectorID = AttributeSupport.getAttributeValue(config, new QName("id"));
      Constraint.isNotNull(
          StringSupport.trimOrNull(sourceAttributeID),
          "The connectorID can not be empty, please adjust it for the AQ DataConnector");
      ldapTargetResolvingStrategy.addConstructorArgValue(connectorID);

      builder.addPropertyValue(
          "targetResolvingStrategy", ldapTargetResolvingStrategy.getBeanDefinition());

    } else {
      log.error(
          "{} Unsupported targetResolvingStrategy: {}. Change it to mysql or ldap! ",
          getLogPrefix(),
          targetResolvingStrategy);
    }

    final BeanDefinitionBuilder attributeQueryBuilder =
        BeanDefinitionBuilder.genericBeanDefinition(AttributeQueryBuilder.class);

    // Parse value of the entityID attribute
    final String issuer = AttributeSupport.getAttributeValue(config, new QName("entityID"));
    Constraint.isNotNull(
        StringSupport.trimOrNull(issuer),
        "The entityID of the Issuer can not be empty, please adjust entityID from the AQ DataConnector");
    attributeQueryBuilder.addConstructorArgValue(issuer);

    // parsing of the defined AQAttributes for the attribute query
    final List<Element> children = ElementSupport.getChildElements(config, ATTRIBUTE_ELEMENT_NAME);
    final List<BeanDefinition> attributes = new ManagedList<>(children.size());
    for (final Element child : children) {
      final String name = AttributeSupport.getAttributeValue(child, new QName("name"));
      final String friendlyName =
          AttributeSupport.getAttributeValue(child, new QName("friendlyName"));

      final BeanDefinitionBuilder attribute =
          BeanDefinitionBuilder.genericBeanDefinition(AQAttribute.class);
      attribute.addConstructorArgValue(name);
      attribute.addConstructorArgValue(friendlyName);
      log.debug(
          "{} Added one AQAttribute to the resolving List. Friendly Name {}, Name {}",
          getLogPrefix(),
          friendlyName,
          name);
      attributes.add(attribute.getBeanDefinition());
    }

    attributeQueryBuilder.addConstructorArgValue(attributes);
    builder.addPropertyValue("attributeQueryBuilder", attributeQueryBuilder.getBeanDefinition());

    final BeanDefinitionBuilder keyManager =
        BeanDefinitionBuilder.genericBeanDefinition(AttributeQueryKeyManager.class);

    // parse the keyLocaton attribute from the AQ DataCOnnector
    final String keyLocation = AttributeSupport.getAttributeValue(config, new QName("keyLocation"));
    Constraint.isNotNull(
        StringSupport.trimOrNull(keyLocation),
        "Key location can not be empty, please adjust keyLocation from the AQ DataConnector");

    // parse the certLocaton attribute from the AQ DataCOnnector
    final String certLocation =
        AttributeSupport.getAttributeValue(config, new QName("certLocation"));
    Constraint.isNotNull(
        StringSupport.trimOrNull(certLocation),
        "Certificate location can not be empty, please adjust certLocation from the AQ DataConnector");

    keyManager.addConstructorArgValue(getPrivateKey(keyLocation));
    keyManager.addConstructorArgValue(getCertificate(certLocation));
    builder.addPropertyValue("attributeQueryKeyManager", keyManager.getBeanDefinition());

    // if the asertionSigned attribute is true, set the value to true
    final String signatureRequired =
        AttributeSupport.getAttributeValue(config, new QName("assertionSigned"));
    if (signatureRequired != null && signatureRequired.equals("true")) {
      builder.addPropertyValue("signatureRequired", Boolean.TRUE);
    }

    // if the requestedAttributesRequired attribute is true, set the value to true
    final String requireMetadataAttributes =
        AttributeSupport.getAttributeValue(config, new QName("requestedAttributesRequired"));
    if (requireMetadataAttributes != null && requireMetadataAttributes.equals("true")) {
      builder.addPropertyValue("requireMetadataAttributes", Boolean.TRUE);
    }

    builder.setInitMethodName("initialize");
    builder.setDestroyMethodName("destroy");
  }
 /**
  * Creates a new instance.
  *
  * @param service Storage service to which tickets are persisted.
  */
 public SimpleTicketService(@Nonnull final StorageService service) {
   this.storageService = Constraint.isNotNull(service, "StorageService cannot be null.");
 }