mirror of
https://github.com/nsacyber/HIRS.git
synced 2024-12-22 14:22:29 +00:00
Checking in updated code. This set does build and load in a rocky
container. [no ci]
This commit is contained in:
parent
c1d39cd466
commit
6931d379b5
@ -27,6 +27,7 @@ dependencies {
|
|||||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.0.1'
|
implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.0.1'
|
||||||
implementation 'com.github.darrachequesne:spring-data-jpa-datatables:6.0.1'
|
implementation 'com.github.darrachequesne:spring-data-jpa-datatables:6.0.1'
|
||||||
implementation 'org.springframework.retry:spring-retry:2.0.0'
|
implementation 'org.springframework.retry:spring-retry:2.0.0'
|
||||||
|
implementation libs.springdatajpa
|
||||||
|
|
||||||
implementation libs.bouncycastle
|
implementation libs.bouncycastle
|
||||||
implementation libs.commons.codec
|
implementation libs.commons.codec
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package hirs.attestationca.persist;
|
package hirs.attestationca.persist;
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainSettings;
|
import hirs.attestationca.persist.entity.userdefined.PolicySettings;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@ -46,7 +46,7 @@ public class PCRQuoteValidator {
|
|||||||
private String[] baselinePCRS = new String[MAX_PCR_ID + 1];
|
private String[] baselinePCRS = new String[MAX_PCR_ID + 1];
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private SupplyChainSettings settings;
|
private PolicySettings settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor to parse PCR values.
|
* Constructor to parse PCR values.
|
||||||
@ -54,7 +54,7 @@ public class PCRQuoteValidator {
|
|||||||
* @param settings settings for the supply chain portal settings for provisioning
|
* @param settings settings for the supply chain portal settings for provisioning
|
||||||
*/
|
*/
|
||||||
public PCRQuoteValidator(final String[] pcrValues,
|
public PCRQuoteValidator(final String[] pcrValues,
|
||||||
final SupplyChainSettings settings) {
|
final PolicySettings settings) {
|
||||||
if (pcrValues != null) {
|
if (pcrValues != null) {
|
||||||
baselinePCRS = new String[MAX_PCR_ID + 1];
|
baselinePCRS = new String[MAX_PCR_ID + 1];
|
||||||
for (int i = 0; i <= MAX_PCR_ID; i++) {
|
for (int i = 0; i <= MAX_PCR_ID; i++) {
|
||||||
|
@ -7,5 +7,5 @@ import org.springframework.stereotype.Repository;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface CertificateRepository extends JpaRepository<Certificate, UUID> {
|
public interface CertificateRepository<T extends Certificate> extends JpaRepository<Certificate, UUID> {
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,9 @@ import hirs.attestationca.persist.entity.userdefined.Device;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface DeviceRepository extends JpaRepository<Device, UUID> {
|
public interface DeviceRepository extends JpaRepository<Device, UUID> {
|
||||||
List<Device> findByName(String deviceName);
|
// List<Device> findByName(String deviceName);
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,23 @@ package hirs.attestationca.persist.entity.manager;
|
|||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface ReferenceDigestValueRepository extends JpaRepository<ReferenceDigestValue, UUID> {
|
public interface ReferenceDigestValueRepository extends JpaRepository<ReferenceDigestValue, UUID> {
|
||||||
|
|
||||||
|
@Query(value = "SELECT * FROM ReferenceDigestValue", nativeQuery = true)
|
||||||
|
List<ReferenceDigestValue> listAll();
|
||||||
|
@Query(value = "SELECT * FROM ReferenceDigestValue WHERE u.model = ?1", nativeQuery = true)
|
||||||
|
List<ReferenceDigestValue> listByModel(String model);
|
||||||
|
@Query(value = "SELECT * FROM ReferenceDigestValue WHERE u.manufacturer = ?1", nativeQuery = true)
|
||||||
|
List<ReferenceDigestValue> listByManufacturer(String manufacturer);
|
||||||
|
@Query(value = "SELECT * FROM ReferenceDigestValue WHERE u.baseRimId = ?1 OR u.supportRimId = ?1", nativeQuery = true)
|
||||||
|
List<ReferenceDigestValue> getValuesByRimId(UUID associatedRimId);
|
||||||
|
@Query(value = "SELECT * FROM ReferenceDigestValue WHERE u.supportRimId = ?1", nativeQuery = true)
|
||||||
|
List<ReferenceDigestValue> getValuesBySupportRimId(UUID supportRimId);
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,21 @@
|
|||||||
package hirs.attestationca.persist.entity.manager;
|
package hirs.attestationca.persist.entity.manager;
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
|
import hirs.attestationca.persist.entity.userdefined.rim.BaseReferenceManifest;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface ReferenceManifestRepository extends JpaRepository<ReferenceManifest, UUID> {
|
public interface ReferenceManifestRepository extends JpaRepository<ReferenceManifest, UUID> {
|
||||||
|
|
||||||
|
@Query(value = "SELECT * FROM ReferenceManifest WHERE u.hexDecHash = ?1", nativeQuery = true)
|
||||||
|
ReferenceManifest findByHash(String rimHash);
|
||||||
|
@Query(value = "SELECT * FROM ReferenceManifest WHERE u.hexDecHash = ?1 AND u.rimType = ?2", nativeQuery = true)
|
||||||
|
ReferenceManifest findByHash(String rimHash, String rimType);
|
||||||
|
@Query(value = "SELECT * FROM ReferenceManifest WHERE u.platformManufacturer = ?1 AND u.platformModel = ?2 AND u.rimType = 'Base'", nativeQuery = true)
|
||||||
|
List<BaseReferenceManifest> getBaseByManufacturerModel(String manufacturer, String model);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
package hirs.attestationca.persist.entity.manager;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainSettings;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface SettingsRepository extends JpaRepository<SupplyChainSettings, UUID> {
|
|
||||||
SupplyChainSettings findByName(String name);
|
|
||||||
}
|
|
@ -2,8 +2,10 @@ package hirs.attestationca.persist.entity.manager;
|
|||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainValidation;
|
import hirs.attestationca.persist.entity.userdefined.SupplyChainValidation;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Repository
|
||||||
public interface SupplyChainValidationRepository extends JpaRepository<SupplyChainValidation, UUID> {
|
public interface SupplyChainValidationRepository extends JpaRepository<SupplyChainValidation, UUID> {
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ import hirs.attestationca.persist.entity.userdefined.certificate.CertificateVari
|
|||||||
import hirs.utils.HexUtils;
|
import hirs.utils.HexUtils;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Inheritance;
|
||||||
|
import jakarta.persistence.InheritanceType;
|
||||||
import jakarta.persistence.Transient;
|
import jakarta.persistence.Transient;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
@ -75,6 +77,7 @@ import java.util.Objects;
|
|||||||
* It stores certain attributes separately from the serialized certificate to enable querying on
|
* It stores certain attributes separately from the serialized certificate to enable querying on
|
||||||
* those attributes.
|
* those attributes.
|
||||||
*/
|
*/
|
||||||
|
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Entity
|
@Entity
|
||||||
public abstract class Certificate extends ArchivableEntity {
|
public abstract class Certificate extends ArchivableEntity {
|
||||||
|
@ -7,6 +7,8 @@ import jakarta.persistence.Access;
|
|||||||
import jakarta.persistence.AccessType;
|
import jakarta.persistence.AccessType;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Inheritance;
|
||||||
|
import jakarta.persistence.InheritanceType;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -29,6 +31,7 @@ import java.util.UUID;
|
|||||||
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
|
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Entity
|
@Entity
|
||||||
|
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
|
||||||
@Table(name = "ReferenceManifest")
|
@Table(name = "ReferenceManifest")
|
||||||
@Access(AccessType.FIELD)
|
@Access(AccessType.FIELD)
|
||||||
public class ReferenceManifest extends ArchivableEntity {
|
public class ReferenceManifest extends ArchivableEntity {
|
||||||
|
@ -1,123 +0,0 @@
|
|||||||
package hirs.attestationca.persist.entity.userdefined;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.UserDefinedEntity;
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.Table;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class represents Supply Chain policy. Supply Chain Policy identifies the methods in
|
|
||||||
* SupplyChainValidator that should be used in order to validate a supply chain.
|
|
||||||
* By default, the policy does not enable any validations.
|
|
||||||
*/
|
|
||||||
@Table(name = "SupplyChainSettings")
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@Entity
|
|
||||||
@ToString(callSuper = true)
|
|
||||||
public class SupplyChainSettings extends UserDefinedEntity {
|
|
||||||
/**
|
|
||||||
* Name of the default Supply Chain Policy.
|
|
||||||
*/
|
|
||||||
public static final String DEFAULT_POLICY = "Default Supply Chain Policy";
|
|
||||||
/**
|
|
||||||
* Number of days in 10 years.
|
|
||||||
*/
|
|
||||||
public static final String TEN_YEARS = "3651";
|
|
||||||
/**
|
|
||||||
* Number of days in 1 year.
|
|
||||||
*/
|
|
||||||
public static final String YEAR = "365";
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean ecValidationEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean pcValidationEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean pcAttributeValidationEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean firmwareValidationEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean utcValidationEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean expiredCertificateValidationEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean replaceEC = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default true")
|
|
||||||
private boolean issueAttestationCertificate = true;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default true")
|
|
||||||
private boolean issueDevIdCertificate = true;
|
|
||||||
|
|
||||||
@Column(nullable = false)
|
|
||||||
private String validityDays = TEN_YEARS;
|
|
||||||
|
|
||||||
@Column(nullable = false)
|
|
||||||
private String devIdValidityDays = TEN_YEARS;
|
|
||||||
|
|
||||||
@Column(nullable = false)
|
|
||||||
private String reissueThreshold = YEAR;
|
|
||||||
|
|
||||||
@Column(nullable = false)
|
|
||||||
private String devIdReissueThreshold = YEAR;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean generateOnExpiration = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean devIdExpirationFlag = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean ignoreImaEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean ignoretBootEnabled = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean linuxOs = false;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default true")
|
|
||||||
private boolean ignoreGptEnabled = true;
|
|
||||||
|
|
||||||
@Column(nullable = false, columnDefinition = "boolean default false")
|
|
||||||
private boolean ignoreOsEvtEnabled = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default constructor necessary for Hibernate.
|
|
||||||
*/
|
|
||||||
protected SupplyChainSettings() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor used to initialize SupplyChainSettings object.
|
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* A name used to uniquely identify and reference the Supply Chain policy.
|
|
||||||
*/
|
|
||||||
public SupplyChainSettings(final String name) {
|
|
||||||
super(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor used to initialize SupplyChainSettings object.
|
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* A name used to uniquely identify and reference the supply chain policy.
|
|
||||||
* @param description
|
|
||||||
* Optional description of the policy that can be added by the user
|
|
||||||
*/
|
|
||||||
public SupplyChainSettings(final String name, final String description) {
|
|
||||||
super(name, description);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
package hirs.attestationca.persist.entity.userdefined.certificate;
|
package hirs.attestationca.persist.entity.userdefined.certificate;
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
||||||
import hirs.attestationca.persist.service.CertificateService;
|
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
||||||
import hirs.attestationca.persist.service.selector.CertificateSelector;
|
import hirs.attestationca.persist.service.selector.CertificateSelector;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
@ -51,13 +51,13 @@ public class CertificateAuthorityCredential extends Certificate {
|
|||||||
*/
|
*/
|
||||||
public static class Selector extends CertificateSelector<CertificateAuthorityCredential> {
|
public static class Selector extends CertificateSelector<CertificateAuthorityCredential> {
|
||||||
/**
|
/**
|
||||||
* Construct a new CertificateSelector that will use the given {@link CertificateService} to
|
* Construct a new CertificateSelector that will use the given {@link CertificateServiceImpl} to
|
||||||
* retrieve one or many CertificateAuthorityCredentials.
|
* retrieve one or many CertificateAuthorityCredentials.
|
||||||
*
|
*
|
||||||
* @param certificateManager the certificate manager to be used to retrieve certificates
|
* @param certificateService the certificate manager to be used to retrieve certificates
|
||||||
*/
|
*/
|
||||||
public Selector(final CertificateService certificateManager) {
|
public Selector(final CertificateServiceImpl certificateService) {
|
||||||
super(certificateManager, CertificateAuthorityCredential.class);
|
super(certificateService, CertificateAuthorityCredential.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,7 +79,7 @@ public class CertificateAuthorityCredential extends Certificate {
|
|||||||
* @param certMan the CertificateService to be used to retrieve persisted certificates
|
* @param certMan the CertificateService to be used to retrieve persisted certificates
|
||||||
* @return a CertificateAuthorityCredential.Selector instance to use for retrieving certificates
|
* @return a CertificateAuthorityCredential.Selector instance to use for retrieving certificates
|
||||||
*/
|
*/
|
||||||
public static Selector select(final CertificateService certMan) {
|
public static Selector select(final CertificateServiceImpl certMan) {
|
||||||
return new Selector(certMan);
|
return new Selector(certMan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ import hirs.attestationca.persist.entity.userdefined.certificate.attributes.Plat
|
|||||||
import hirs.attestationca.persist.entity.userdefined.certificate.attributes.TBBSecurityAssertion;
|
import hirs.attestationca.persist.entity.userdefined.certificate.attributes.TBBSecurityAssertion;
|
||||||
import hirs.attestationca.persist.entity.userdefined.certificate.attributes.URIReference;
|
import hirs.attestationca.persist.entity.userdefined.certificate.attributes.URIReference;
|
||||||
import hirs.attestationca.persist.entity.userdefined.certificate.attributes.V2.PlatformConfigurationV2;
|
import hirs.attestationca.persist.entity.userdefined.certificate.attributes.V2.PlatformConfigurationV2;
|
||||||
import hirs.attestationca.persist.service.CertificateService;
|
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
||||||
import hirs.attestationca.persist.service.selector.CertificateSelector;
|
import hirs.attestationca.persist.service.selector.CertificateSelector;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
@ -133,13 +133,13 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
*/
|
*/
|
||||||
public static class Selector extends CertificateSelector<PlatformCredential> {
|
public static class Selector extends CertificateSelector<PlatformCredential> {
|
||||||
/**
|
/**
|
||||||
* Construct a new CertificateSelector that will use the given {@link CertificateService} to
|
* Construct a new CertificateSelector that will use the given {@link CertificateServiceImpl} to
|
||||||
* retrieve one or many PlatformCredentials.
|
* retrieve one or many PlatformCredentials.
|
||||||
*
|
*
|
||||||
* @param certificateManager the certificate manager to be used to retrieve certificates
|
* @param certificateService the certificate manager to be used to retrieve certificates
|
||||||
*/
|
*/
|
||||||
public Selector(final CertificateService certificateManager) {
|
public Selector(final CertificateServiceImpl certificateService) {
|
||||||
super(certificateManager, PlatformCredential.class);
|
super(certificateService, PlatformCredential.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -275,11 +275,11 @@ public class PlatformCredential extends DeviceAssociatedCertificate {
|
|||||||
/**
|
/**
|
||||||
* Get a Selector for use in retrieving PlatformCredentials.
|
* Get a Selector for use in retrieving PlatformCredentials.
|
||||||
*
|
*
|
||||||
* @param certMan the CertificateManager to be used to retrieve persisted certificates
|
* @param certificateService the CertificateManager to be used to retrieve persisted certificates
|
||||||
* @return a PlatformCredential.Selector instance to use for retrieving certificates
|
* @return a PlatformCredential.Selector instance to use for retrieving certificates
|
||||||
*/
|
*/
|
||||||
public static Selector select(final CertificateService certMan) {
|
public static Selector select(final CertificateServiceImpl certificateService) {
|
||||||
return new Selector(certMan);
|
return new Selector(certificateService);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,7 +2,6 @@ package hirs.attestationca.persist.entity.userdefined.rim;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestService;
|
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
||||||
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
||||||
import hirs.utils.SwidResource;
|
import hirs.utils.SwidResource;
|
||||||
@ -107,7 +106,7 @@ public class BaseReferenceManifest extends ReferenceManifest {
|
|||||||
* @param referenceManifestManager the reference manifest manager to be used to retrieve
|
* @param referenceManifestManager the reference manifest manager to be used to retrieve
|
||||||
* reference manifests.
|
* reference manifests.
|
||||||
*/
|
*/
|
||||||
public Selector(final ReferenceManifestService referenceManifestManager) {
|
public Selector(final ReferenceManifestServiceImpl referenceManifestManager) {
|
||||||
super(referenceManifestManager, BaseReferenceManifest.class);
|
super(referenceManifestManager, BaseReferenceManifest.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,7 +349,7 @@ public class BaseReferenceManifest extends ReferenceManifest {
|
|||||||
* persisted RIMs
|
* persisted RIMs
|
||||||
* @return a Selector instance to use for retrieving RIMs
|
* @return a Selector instance to use for retrieving RIMs
|
||||||
*/
|
*/
|
||||||
public static Selector select(final ReferenceManifestService rimMan) {
|
public static Selector select(final ReferenceManifestServiceImpl rimMan) {
|
||||||
return new Selector(rimMan);
|
return new Selector(rimMan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package hirs.attestationca.persist.entity.userdefined.rim;
|
|||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
import hirs.attestationca.persist.enums.AppraisalStatus;
|
import hirs.attestationca.persist.enums.AppraisalStatus;
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestService;
|
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
||||||
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
||||||
import hirs.utils.tpm.eventlog.TCGEventLog;
|
import hirs.utils.tpm.eventlog.TCGEventLog;
|
||||||
import hirs.utils.tpm.eventlog.TpmPcrEvent;
|
import hirs.utils.tpm.eventlog.TpmPcrEvent;
|
||||||
@ -53,7 +53,7 @@ public class EventLogMeasurements extends ReferenceManifest {
|
|||||||
* @param referenceManifestManager the reference manifest manager to be used to retrieve
|
* @param referenceManifestManager the reference manifest manager to be used to retrieve
|
||||||
* reference manifests.
|
* reference manifests.
|
||||||
*/
|
*/
|
||||||
public Selector(final ReferenceManifestService referenceManifestManager) {
|
public Selector(final ReferenceManifestServiceImpl referenceManifestManager) {
|
||||||
super(referenceManifestManager, EventLogMeasurements.class, false);
|
super(referenceManifestManager, EventLogMeasurements.class, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ public class EventLogMeasurements extends ReferenceManifest {
|
|||||||
* persisted RIMs
|
* persisted RIMs
|
||||||
* @return a Selector instance to use for retrieving RIMs
|
* @return a Selector instance to use for retrieving RIMs
|
||||||
*/
|
*/
|
||||||
public static Selector select(final ReferenceManifestService rimMan) {
|
public static Selector select(final ReferenceManifestServiceImpl rimMan) {
|
||||||
return new Selector(rimMan);
|
return new Selector(rimMan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ package hirs.attestationca.persist.entity.userdefined.rim;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestService;
|
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
||||||
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
||||||
import hirs.utils.tpm.eventlog.TCGEventLog;
|
import hirs.utils.tpm.eventlog.TCGEventLog;
|
||||||
import hirs.utils.tpm.eventlog.TpmPcrEvent;
|
import hirs.utils.tpm.eventlog.TpmPcrEvent;
|
||||||
@ -48,7 +48,7 @@ public class SupportReferenceManifest extends ReferenceManifest {
|
|||||||
* @param referenceManifestManager the reference manifest manager to be used to retrieve
|
* @param referenceManifestManager the reference manifest manager to be used to retrieve
|
||||||
* reference manifests.
|
* reference manifests.
|
||||||
*/
|
*/
|
||||||
public Selector(final ReferenceManifestService referenceManifestManager) {
|
public Selector(final ReferenceManifestServiceImpl referenceManifestManager) {
|
||||||
super(referenceManifestManager, SupportReferenceManifest.class);
|
super(referenceManifestManager, SupportReferenceManifest.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ public class SupportReferenceManifest extends ReferenceManifest {
|
|||||||
* persisted RIMs
|
* persisted RIMs
|
||||||
* @return a Selector instance to use for retrieving RIMs
|
* @return a Selector instance to use for retrieving RIMs
|
||||||
*/
|
*/
|
||||||
public static Selector select(final ReferenceManifestService rimMan) {
|
public static Selector select(final ReferenceManifestServiceImpl rimMan) {
|
||||||
return new Selector(rimMan);
|
return new Selector(rimMan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
package hirs.attestationca.persist.service;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
|
||||||
import hirs.attestationca.persist.service.selector.CertificateSelector;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public interface CertificateService<T extends Certificate> {
|
|
||||||
|
|
||||||
Certificate saveCertificate(Certificate certificate);
|
|
||||||
|
|
||||||
<T extends Certificate> List<T> fetchCertificates(Class<T> classType);
|
|
||||||
|
|
||||||
Certificate updateCertificate(Certificate certificate, UUID certificateId);
|
|
||||||
|
|
||||||
Certificate updateCertificate(Certificate certificate);
|
|
||||||
|
|
||||||
void deleteCertificate(Certificate certificate);
|
|
||||||
|
|
||||||
<T extends Certificate> Set<T> get(CertificateSelector certificateSelector);
|
|
||||||
}
|
|
@ -1,45 +1,35 @@
|
|||||||
package hirs.attestationca.persist.service;
|
package hirs.attestationca.persist.service;
|
||||||
|
|
||||||
|
import hirs.attestationca.persist.DBManagerException;
|
||||||
|
import hirs.attestationca.persist.entity.ArchivableEntity;
|
||||||
import hirs.attestationca.persist.entity.manager.CertificateRepository;
|
import hirs.attestationca.persist.entity.manager.CertificateRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
||||||
import hirs.attestationca.persist.service.selector.CertificateSelector;
|
import hirs.attestationca.persist.service.selector.CertificateSelector;
|
||||||
import jakarta.persistence.EntityManager;
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.Sort;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Log4j2
|
||||||
|
@NoArgsConstructor
|
||||||
@Service
|
@Service
|
||||||
public class CertificateServiceImpl<T extends Certificate> extends DefaultDbService<Certificate> implements CertificateService<Certificate> {
|
public class CertificateServiceImpl<T extends Certificate> extends DefaultDbService<T> {
|
||||||
|
|
||||||
@Autowired(required = false)
|
// @PersistenceContext // I'll need this if I want to make custom native calls
|
||||||
private EntityManager entityManager;
|
// private EntityManager entityManager;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CertificateRepository repository;
|
private CertificateRepository certificateRepository;
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public Certificate saveCertificate(Certificate certificate) {
|
* Default Constructor.
|
||||||
return repository.save(certificate);
|
*/
|
||||||
}
|
public CertificateServiceImpl(final Class<T> clazz) {
|
||||||
|
super(clazz);
|
||||||
@Override
|
this.defineRepository(certificateRepository);
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <T extends Certificate> List<T> fetchCertificates(Class<T> classType) {
|
|
||||||
return (List<T>) repository.findAll(Sort.sort(classType));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Certificate updateCertificate(Certificate certificate, UUID certificateId) {
|
|
||||||
return saveCertificate(certificate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Certificate updateCertificate(Certificate certificate) {
|
|
||||||
return saveCertificate(certificate);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -73,13 +63,29 @@ public class CertificateServiceImpl<T extends Certificate> extends DefaultDbServ
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a certificate from the database.
|
* Archives the named object and updates it in the database.
|
||||||
*
|
*
|
||||||
* @param certificate the certificate to delete
|
* @param id UUID of the object to archive
|
||||||
* @return true if deletion was successful, false otherwise
|
* @return true if the object was successfully found and archived, false if the object was not
|
||||||
|
* found
|
||||||
|
* @throws hirs.attestationca.persist.DBManagerException if the object is not an instance of <code>ArchivableEntity</code>
|
||||||
*/
|
*/
|
||||||
public void deleteCertificate(final Certificate certificate) {
|
public final boolean archive(final UUID id) throws DBManagerException {
|
||||||
repository.delete(certificate);
|
log.debug("archiving object: {}", id);
|
||||||
|
if (id == null) {
|
||||||
|
log.debug("null id argument");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
T target = get(id);
|
||||||
|
if (target == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
((ArchivableEntity) target).archive();
|
||||||
|
this.certificateRepository.save(target);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package hirs.attestationca.persist.service;
|
package hirs.attestationca.persist.service;
|
||||||
|
|
||||||
import hirs.attestationca.persist.DBManagerException;
|
import hirs.attestationca.persist.DBManagerException;
|
||||||
import hirs.attestationca.persist.entity.ArchivableEntity;
|
import hirs.attestationca.persist.entity.AbstractEntity;
|
||||||
import jakarta.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import jakarta.persistence.PersistenceContext;
|
import jakarta.persistence.PersistenceContext;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@ -19,12 +19,14 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Service
|
@Service
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class DefaultDbService<T extends ArchivableEntity> extends HibernateDbService<T> {
|
public class DefaultDbService<T extends AbstractEntity> {
|
||||||
/**
|
/**
|
||||||
* The default maximum number of retries to attempt a database transaction.
|
* The default maximum number of retries to attempt a database transaction.
|
||||||
*/
|
*/
|
||||||
@ -49,10 +51,29 @@ public class DefaultDbService<T extends ArchivableEntity> extends HibernateDbSer
|
|||||||
* unfortunately class type of T cannot be determined using only T
|
* unfortunately class type of T cannot be determined using only T
|
||||||
*/
|
*/
|
||||||
public DefaultDbService(final Class<T> clazz) {
|
public DefaultDbService(final Class<T> clazz) {
|
||||||
super(clazz, null);
|
|
||||||
setRetryTemplate();
|
setRetryTemplate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void defineRepository(final JpaRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> listAll() {
|
||||||
|
return this.repository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save(final T entity) {
|
||||||
|
this.repository.save(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(final T entity) {
|
||||||
|
this.repository.delete(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(final UUID id) {
|
||||||
|
this.repository.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the parameters used to retry database transactions. The retry template will
|
* Set the parameters used to retry database transactions. The retry template will
|
||||||
* retry transactions that throw a LockAcquisitionException or StaleObjectStateException.
|
* retry transactions that throw a LockAcquisitionException or StaleObjectStateException.
|
||||||
@ -167,33 +188,4 @@ public class DefaultDbService<T extends ArchivableEntity> extends HibernateDbSer
|
|||||||
|
|
||||||
return clazz.cast(entity);
|
return clazz.cast(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Archives the named object and updates it in the database.
|
|
||||||
*
|
|
||||||
* @param name name of the object to archive
|
|
||||||
* @return true if the object was successfully found and archived, false if the object was not
|
|
||||||
* found
|
|
||||||
* @throws DBManagerException if the object is not an instance of <code>ArchivableEntity</code>
|
|
||||||
*/
|
|
||||||
// @Override
|
|
||||||
// public final boolean archive(final String name) throws DBManagerException {
|
|
||||||
// log.debug("archiving object: {}", name);
|
|
||||||
// if (name == null) {
|
|
||||||
// log.debug("null name argument");
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// T target = get(name);
|
|
||||||
// if (target == null) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// if (!(target instanceof ArchivableEntity)) {
|
|
||||||
// throw new DBManagerException("unable to archive non-archivable object");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ((ArchivableEntity) target).archive();
|
|
||||||
// repository.save(target);
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
package hirs.attestationca.persist.service;
|
|
||||||
|
|
||||||
public interface DefaultService {
|
|
||||||
}
|
|
@ -12,9 +12,9 @@ import java.util.List;
|
|||||||
* https://github.com/darrachequesne/spring-data-jpa-datatables
|
* https://github.com/darrachequesne/spring-data-jpa-datatables
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class DeviceServiceImpl {
|
public class DeviceServiceImpl extends DefaultDbService<Device> {
|
||||||
|
|
||||||
@Autowired(required = false)
|
@Autowired
|
||||||
private EntityManager entityManager;
|
private EntityManager entityManager;
|
||||||
@Autowired
|
@Autowired
|
||||||
private DeviceRepository deviceRepository;
|
private DeviceRepository deviceRepository;
|
||||||
|
@ -1,132 +0,0 @@
|
|||||||
package hirs.attestationca.persist.service;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.DBManagerException;
|
|
||||||
import jakarta.persistence.EntityManager;
|
|
||||||
import jakarta.persistence.PersistenceContext;
|
|
||||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
|
||||||
import jakarta.persistence.criteria.CriteriaQuery;
|
|
||||||
import lombok.extern.log4j.Log4j2;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract class that has the underlying Hibernate commands used by other DB Managers.
|
|
||||||
* This class exists primarily to reduce code in {@link hirs.attestationca.persist.service.DefaultDbService} which retries these methods
|
|
||||||
* using a RetryTemplate.
|
|
||||||
*
|
|
||||||
* @param <T> type of objects to manage by this manager
|
|
||||||
*/
|
|
||||||
@Log4j2
|
|
||||||
public abstract class HibernateDbService<T> {
|
|
||||||
|
|
||||||
private static final int MAX_CLASS_CACHE_ENTRIES = 500;
|
|
||||||
|
|
||||||
private final Class<T> clazz;
|
|
||||||
@PersistenceContext
|
|
||||||
private EntityManager entityManager;
|
|
||||||
private CriteriaBuilder criteriaBuilder;
|
|
||||||
private CriteriaQuery<T> criteriaQuery;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new <code>AbstractDbManager</code>.
|
|
||||||
*
|
|
||||||
* @param clazz Class to search for when doing Hibernate queries,
|
|
||||||
* unfortunately class type of T cannot be determined using only T
|
|
||||||
* @param entityManager the session factory to use to interact with the database
|
|
||||||
*/
|
|
||||||
public HibernateDbService(final Class<T> clazz, final EntityManager entityManager) {
|
|
||||||
if (clazz == null) {
|
|
||||||
log.error("HibernateDbService cannot be instantiated with a null class");
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"HibernateDbService cannot be instantiated with a null class"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// if (entityManager == null) {
|
|
||||||
// log.error("HibernateDbService cannot be instantiated with a null SessionFactory");
|
|
||||||
// throw new IllegalArgumentException(
|
|
||||||
// "HibernateDbService cannot be instantiated with a null SessionFactory"
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
this.clazz = clazz;
|
|
||||||
this.entityManager = entityManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HibernateDbService() {
|
|
||||||
clazz = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of all <code>T</code>s of type <code>clazz</code> in the database, with an
|
|
||||||
* additional restriction also specified in the query.
|
|
||||||
* <p>
|
|
||||||
* This would be useful if <code>T</code> has several subclasses being
|
|
||||||
* managed. This class argument allows the caller to limit which types of
|
|
||||||
* <code>T</code> should be returned.
|
|
||||||
*
|
|
||||||
* @param clazz class type of <code>T</code>s to search for (may be null to
|
|
||||||
* use Class<T>)
|
|
||||||
* @param additionalRestriction - an added Criterion to use in the query, null for none
|
|
||||||
* @return list of <code>T</code> names
|
|
||||||
* @throws DBManagerException if unable to search the database
|
|
||||||
*/
|
|
||||||
protected List<T> doGetList(final Class<? extends T> clazz)
|
|
||||||
throws DBManagerException {
|
|
||||||
log.debug("Getting object list");
|
|
||||||
Class<? extends T> searchClass = clazz;
|
|
||||||
if (clazz == null) {
|
|
||||||
log.debug("clazz is null");
|
|
||||||
searchClass = this.clazz;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<T> objects = new ArrayList<>();
|
|
||||||
|
|
||||||
return objects;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes the object from the database. This removes all of the database
|
|
||||||
* entries that stored information with regards to the this object.
|
|
||||||
* <p>
|
|
||||||
* If the object is referenced by any other tables then this will throw a
|
|
||||||
* <code>DBManagerException</code>.
|
|
||||||
*
|
|
||||||
* @param name name of the object to delete
|
|
||||||
* @return true if successfully found and deleted the object
|
|
||||||
* @throws DBManagerException if unable to find the baseline or delete it
|
|
||||||
* from the database
|
|
||||||
*/
|
|
||||||
// protected boolean doDelete(final String name) throws DBManagerException {
|
|
||||||
// log.debug("deleting object: {}", name);
|
|
||||||
// if (name == null) {
|
|
||||||
// log.debug("null name argument");
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// boolean deleted = false;
|
|
||||||
// Session session = entityManager.unwrap(Session.class);
|
|
||||||
// try {
|
|
||||||
// log.debug("retrieving object from db");
|
|
||||||
// criteriaBuilder = session.getCriteriaBuilder();
|
|
||||||
// criteriaQuery = criteriaBuilder.createQuery(clazz);
|
|
||||||
// Root<T> root = criteriaQuery.from(clazz);
|
|
||||||
// criteriaQuery.select(root).where(criteriaBuilder.equal(root.get("name"), name));
|
|
||||||
//
|
|
||||||
// Object object = session.createQuery(criteriaQuery).getSingleResult();
|
|
||||||
//
|
|
||||||
// if (clazz.isInstance(object)) {
|
|
||||||
// T objectOfTypeT = clazz.cast(object);
|
|
||||||
// log.debug("found object, deleting it");
|
|
||||||
// session.delete(objectOfTypeT);
|
|
||||||
// deleted = true;
|
|
||||||
// }
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// final String msg = "unable to retrieve object";
|
|
||||||
// log.error(msg, e);
|
|
||||||
// throw new DBManagerException(msg, e);
|
|
||||||
// }
|
|
||||||
// return deleted;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,25 @@
|
|||||||
|
package hirs.attestationca.persist.service;
|
||||||
|
|
||||||
|
import hirs.attestationca.persist.entity.manager.PolicyRepository;
|
||||||
|
import hirs.attestationca.persist.entity.userdefined.PolicySettings;
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
//@Service
|
||||||
|
public class PolicyServiceImpl extends DefaultDbService<PolicySettings> {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PolicyRepository repository;
|
||||||
|
|
||||||
|
public void saveSettings(PolicySettings settings) {
|
||||||
|
repository.save(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public Policy getDefaultPolicy(Appraiser appraiser) {
|
||||||
|
// return repository.findByAppraiser(appraiser);
|
||||||
|
// }
|
||||||
|
}
|
@ -1,20 +0,0 @@
|
|||||||
package hirs.attestationca.persist.service;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public interface ReferenceDigestValueService {
|
|
||||||
|
|
||||||
ReferenceDigestValue saveReferenceDigestValue(ReferenceDigestValue referenceDigestValue);
|
|
||||||
|
|
||||||
List<ReferenceDigestValue> fetchDigestValues();
|
|
||||||
|
|
||||||
ReferenceDigestValue updateRefDigestValue(ReferenceDigestValue referenceDigestValue, UUID rdvId);
|
|
||||||
|
|
||||||
List<ReferenceDigestValue> getValuesByRimId(ReferenceManifest baseRim);
|
|
||||||
|
|
||||||
void deleteRefDigestValueById(UUID rdvId);
|
|
||||||
}
|
|
@ -1,11 +1,8 @@
|
|||||||
package hirs.attestationca.persist.service;
|
package hirs.attestationca.persist.service;
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.manager.ReferenceDigestValueRepository;
|
import hirs.attestationca.persist.entity.manager.ReferenceDigestValueRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.jpa.datatables.mapping.DataTablesInput;
|
|
||||||
import org.springframework.data.jpa.datatables.mapping.DataTablesOutput;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@ -13,52 +10,12 @@ import java.util.List;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class ReferenceDigestValueServiceImpl extends DefaultDbService<ReferenceDigestValue> implements ReferenceDigestValueService {
|
public class ReferenceDigestValueServiceImpl extends DefaultDbService<ReferenceDigestValue> {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ReferenceDigestValueRepository repository;
|
private ReferenceDigestValueRepository repository;
|
||||||
|
|
||||||
@Override
|
public List<ReferenceDigestValue> getValuesByRimId(final UUID baseId) {
|
||||||
public ReferenceDigestValue saveReferenceDigestValue(ReferenceDigestValue referenceDigestValue) {
|
return new LinkedList<>();
|
||||||
return repository.save(referenceDigestValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ReferenceDigestValue> findAll() {
|
|
||||||
return repository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<ReferenceDigestValue> fetchDigestValues() {
|
|
||||||
return repository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReferenceDigestValue updateRefDigestValue(ReferenceDigestValue referenceDigestValue, UUID rdvId) {
|
|
||||||
return saveReferenceDigestValue(referenceDigestValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReferenceDigestValue updateRefDigestValue(ReferenceDigestValue referenceDigestValue) {
|
|
||||||
if (referenceDigestValue.getId() != null) {
|
|
||||||
return updateRefDigestValue(referenceDigestValue, referenceDigestValue.getId());
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ReferenceDigestValue> getValuesByRimId(ReferenceManifest baseRim) {
|
|
||||||
List<ReferenceDigestValue> results = new LinkedList<>();
|
|
||||||
if (baseRim != null) {
|
|
||||||
for (ReferenceDigestValue rdv : repository.findAll()) {
|
|
||||||
if (rdv.getBaseRimId() == baseRim.getId()) {
|
|
||||||
results.add(rdv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteRefDigestValueById(UUID rdvId) {
|
|
||||||
repository.getReferenceById(rdvId).archive();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
package hirs.attestationca.persist.service;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.OrderedListQuerier;
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
|
||||||
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public interface ReferenceManifestService<T extends ReferenceManifest> extends OrderedListQuerier<T> {
|
|
||||||
|
|
||||||
ReferenceManifest saveReferenceManifest(ReferenceManifest referenceManifest);
|
|
||||||
|
|
||||||
List<ReferenceManifest> fetchReferenceManifests();
|
|
||||||
// DataTablesOutput<ReferenceManifest> fetchReferenceManifests(DataTablesInput input);
|
|
||||||
|
|
||||||
ReferenceManifest updateReferenceManifest(ReferenceManifest referenceManifest, UUID rimId);
|
|
||||||
|
|
||||||
void deleteReferenceManifestById(UUID rimId);
|
|
||||||
|
|
||||||
<T extends ReferenceManifest> Set<T> get(ReferenceManifestSelector referenceManifestSelector);
|
|
||||||
}
|
|
@ -3,13 +3,13 @@ package hirs.attestationca.persist.service;
|
|||||||
import hirs.attestationca.persist.CriteriaModifier;
|
import hirs.attestationca.persist.CriteriaModifier;
|
||||||
import hirs.attestationca.persist.DBManagerException;
|
import hirs.attestationca.persist.DBManagerException;
|
||||||
import hirs.attestationca.persist.FilteredRecordsList;
|
import hirs.attestationca.persist.FilteredRecordsList;
|
||||||
|
import hirs.attestationca.persist.OrderedListQuerier;
|
||||||
import hirs.attestationca.persist.entity.manager.ReferenceManifestRepository;
|
import hirs.attestationca.persist.entity.manager.ReferenceManifestRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
import hirs.attestationca.persist.service.selector.ReferenceManifestSelector;
|
||||||
import jakarta.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.Sort;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
@ -20,12 +20,10 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Service
|
@Service
|
||||||
public class ReferenceManifestServiceImpl<T extends ReferenceManifest> extends DefaultDbService<ReferenceManifest> implements ReferenceManifestService<ReferenceManifest> {
|
public class ReferenceManifestServiceImpl<T extends ReferenceManifest> extends DefaultDbService<ReferenceManifest> implements OrderedListQuerier<ReferenceManifest> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The variable that establishes a schema factory for xml processing.
|
* The variable that establishes a schema factory for xml processing.
|
||||||
@ -33,7 +31,7 @@ public class ReferenceManifestServiceImpl<T extends ReferenceManifest> extends D
|
|||||||
public static final SchemaFactory SCHEMA_FACTORY
|
public static final SchemaFactory SCHEMA_FACTORY
|
||||||
= SchemaFactory.newInstance(ReferenceManifest.SCHEMA_LANGUAGE);
|
= SchemaFactory.newInstance(ReferenceManifest.SCHEMA_LANGUAGE);
|
||||||
|
|
||||||
@Autowired(required = false)
|
@Autowired
|
||||||
private EntityManager entityManager;
|
private EntityManager entityManager;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@ -77,29 +75,18 @@ public class ReferenceManifestServiceImpl<T extends ReferenceManifest> extends D
|
|||||||
return schema;
|
return schema;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReferenceManifest saveReferenceManifest(ReferenceManifest referenceManifest) {
|
|
||||||
return repository.save(referenceManifest);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<ReferenceManifest> fetchReferenceManifests() {
|
|
||||||
return repository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method does not need to be used directly as it is used by
|
* This method does not need to be used directly as it is used by
|
||||||
* {@link ReferenceManifestSelector}'s get* methods. Regardless, it may be
|
* {@link ReferenceManifestSelector}'s get* methods. Regardless, it may be
|
||||||
* used to retrieve ReferenceManifest by other code in this package, given a
|
* used to retrieve ReferenceManifest by other code in this package, given a
|
||||||
* configured ReferenceManifestSelector.
|
* configured ReferenceManifestSelector.
|
||||||
*
|
*
|
||||||
* @param referenceManifestSelector a configured
|
|
||||||
* {@link ReferenceManifestSelector} to use for querying
|
* {@link ReferenceManifestSelector} to use for querying
|
||||||
* @return the resulting set of ReferenceManifest, possibly empty
|
* @return the resulting set of ReferenceManifest, possibly empty
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <T extends ReferenceManifest> List<T> get(
|
public <T extends ReferenceManifest> List<T> get(
|
||||||
Class<T> classType) {
|
final ReferenceManifestSelector referenceManifestSelector) {
|
||||||
log.info("Getting the full set of Reference Manifest files.");
|
log.info("Getting the full set of Reference Manifest files.");
|
||||||
// return new HashSet<>(
|
// return new HashSet<>(
|
||||||
// (List<T>) getWithCriteria(
|
// (List<T>) getWithCriteria(
|
||||||
@ -107,22 +94,7 @@ public class ReferenceManifestServiceImpl<T extends ReferenceManifest> extends D
|
|||||||
// Collections.singleton(referenceManifestSelector.getCriterion())
|
// Collections.singleton(referenceManifestSelector.getCriterion())
|
||||||
// )
|
// )
|
||||||
// );
|
// );
|
||||||
return (List<T>) repository.findAll(Sort.sort(classType));
|
return (List<T>) repository.findAll();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReferenceManifest updateReferenceManifest(ReferenceManifest referenceManifest, UUID rimId) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteReferenceManifestById(UUID rimId) {
|
|
||||||
repository.deleteById(rimId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends ReferenceManifest> Set<T> get(ReferenceManifestSelector referenceManifestSelector) {
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -130,7 +102,7 @@ public class ReferenceManifestServiceImpl<T extends ReferenceManifest> extends D
|
|||||||
String columnToOrder, boolean ascending, int firstResult,
|
String columnToOrder, boolean ascending, int firstResult,
|
||||||
int maxResults, String search,
|
int maxResults, String search,
|
||||||
Map<String, Boolean> searchableColumns) throws DBManagerException {
|
Map<String, Boolean> searchableColumns) throws DBManagerException {
|
||||||
return null;
|
return new FilteredRecordsList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -139,6 +111,6 @@ public class ReferenceManifestServiceImpl<T extends ReferenceManifest> extends D
|
|||||||
int firstResult, int maxResults, String search,
|
int firstResult, int maxResults, String search,
|
||||||
Map<String, Boolean> searchableColumns,
|
Map<String, Boolean> searchableColumns,
|
||||||
CriteriaModifier<ReferenceManifest> criteriaModifier) throws DBManagerException {
|
CriteriaModifier<ReferenceManifest> criteriaModifier) throws DBManagerException {
|
||||||
return null;
|
return new FilteredRecordsList<>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
package hirs.attestationca.persist.service;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.manager.SettingsRepository;
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainSettings;
|
|
||||||
import jakarta.persistence.EntityManager;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class SettingsServiceImpl {
|
|
||||||
|
|
||||||
@Autowired(required = false)
|
|
||||||
private EntityManager entityManager;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private SettingsRepository repository;
|
|
||||||
|
|
||||||
public SupplyChainSettings updateSettings(SupplyChainSettings settings) {
|
|
||||||
SupplyChainSettings existing = repository.findByName(settings.getName());
|
|
||||||
|
|
||||||
if (existing != null) {
|
|
||||||
settings.setId(existing.getId());
|
|
||||||
}
|
|
||||||
return repository.save(settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void saveSettings(SupplyChainSettings settings) {
|
|
||||||
repository.save(settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SupplyChainSettings getByName(String name) {
|
|
||||||
if (name == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return repository.findByName(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// public Policy getDefaultPolicy(Appraiser appraiser) {
|
|
||||||
// return repository.findByAppraiser(appraiser);
|
|
||||||
// }
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
package hirs.attestationca.persist.service;
|
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainValidation;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public interface SupplyChainValidationService {
|
|
||||||
SupplyChainValidation saveSupplyChainValidation(SupplyChainValidation supplyChainValidation);
|
|
||||||
|
|
||||||
List<SupplyChainValidation> fetchSupplyChainValidations();
|
|
||||||
|
|
||||||
SupplyChainValidation updateSupplyChainValidation(SupplyChainValidation supplyChainValidation, UUID scvId);
|
|
||||||
|
|
||||||
void deleteSupplyChainValidation(UUID scvId);
|
|
||||||
}
|
|
@ -9,7 +9,6 @@ import hirs.utils.BouncyCastleUtils;
|
|||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.bouncycastle.util.encoders.Hex;
|
import org.bouncycastle.util.encoders.Hex;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.KeyStore;
|
import java.security.KeyStore;
|
||||||
@ -20,43 +19,22 @@ import java.util.Collections;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Service
|
//@Service
|
||||||
public class SupplyChainValidationServiceImpl extends DefaultDbService<SupplyChainValidation> implements SupplyChainValidationService {
|
public class SupplyChainValidationServiceImpl extends DefaultDbService<SupplyChainValidation> {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
SupplyChainValidationRepository repository;
|
SupplyChainValidationRepository repository;
|
||||||
@Autowired
|
@Autowired
|
||||||
private CertificateService certificateService;
|
private CertificateServiceImpl certificateService;
|
||||||
|
|
||||||
public SupplyChainValidationServiceImpl(final CertificateService certificateService) {
|
public SupplyChainValidationServiceImpl(final CertificateServiceImpl certificateService) {
|
||||||
super();
|
super();
|
||||||
this.certificateService = certificateService;
|
this.certificateService = certificateService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public SupplyChainValidation saveSupplyChainValidation(SupplyChainValidation supplyChainValidation) {
|
|
||||||
return repository.save(supplyChainValidation);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<SupplyChainValidation> fetchSupplyChainValidations() {
|
|
||||||
return repository.findAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SupplyChainValidation updateSupplyChainValidation(SupplyChainValidation supplyChainValidation, UUID scvId) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteSupplyChainValidation(UUID scvId) {
|
|
||||||
repository.deleteById(scvId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is used to retrieve the entire CA chain (up to a trusted
|
* This method is used to retrieve the entire CA chain (up to a trusted
|
||||||
* self-signed certificate) for the given certificate. This method will look
|
* self-signed certificate) for the given certificate. This method will look
|
||||||
|
@ -2,7 +2,6 @@ package hirs.attestationca.persist.service.selector;
|
|||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
||||||
import hirs.attestationca.persist.service.CertificateService;
|
|
||||||
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
||||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
import jakarta.persistence.criteria.CriteriaQuery;
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
@ -77,7 +76,7 @@ import java.util.UUID;
|
|||||||
*/
|
*/
|
||||||
public abstract class CertificateSelector<T extends Certificate> {
|
public abstract class CertificateSelector<T extends Certificate> {
|
||||||
|
|
||||||
private final CertificateService certificateManager;
|
private final CertificateServiceImpl certificateService;
|
||||||
private final Class<T> certificateClass;
|
private final Class<T> certificateClass;
|
||||||
|
|
||||||
private final Map<String, Object> fieldValueSelections;
|
private final Map<String, Object> fieldValueSelections;
|
||||||
@ -87,28 +86,28 @@ public abstract class CertificateSelector<T extends Certificate> {
|
|||||||
* Construct a new CertificateSelector that will use the given {@link CertificateServiceImpl} to
|
* Construct a new CertificateSelector that will use the given {@link CertificateServiceImpl} to
|
||||||
* retrieve certificates of the given type.
|
* retrieve certificates of the given type.
|
||||||
*
|
*
|
||||||
* @param certificateManager the certificate manager to be used to retrieve certificates
|
* @param certificateService the certificate manager to be used to retrieve certificates
|
||||||
* @param certificateClass the class of certificate to be retrieved
|
* @param certificateClass the class of certificate to be retrieved
|
||||||
*/
|
*/
|
||||||
public CertificateSelector(
|
public CertificateSelector(
|
||||||
final CertificateService certificateManager,
|
final CertificateServiceImpl certificateService,
|
||||||
final Class<T> certificateClass) {
|
final Class<T> certificateClass) {
|
||||||
this(certificateManager, certificateClass, true);
|
this(certificateService, certificateClass, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new CertificateSelector that will use the given {@link CertificateService} to
|
* Construct a new CertificateSelector that will use the given {@link CertificateServiceImpl } to
|
||||||
* retrieve certificates of the given type.
|
* retrieve certificates of the given type.
|
||||||
*
|
*
|
||||||
* @param certificateManager the certificate manager to be used to retrieve certificates
|
* @param certificateService the certificate manager to be used to retrieve certificates
|
||||||
* @param certificateClass the class of certificate to be retrieved
|
* @param certificateClass the class of certificate to be retrieved
|
||||||
* @param excludeArchivedCertificates true if excluding archived certificates
|
* @param excludeArchivedCertificates true if excluding archived certificates
|
||||||
*/
|
*/
|
||||||
public CertificateSelector(
|
public CertificateSelector(
|
||||||
final CertificateService certificateManager,
|
final CertificateServiceImpl certificateService,
|
||||||
final Class<T> certificateClass, final boolean excludeArchivedCertificates) {
|
final Class<T> certificateClass, final boolean excludeArchivedCertificates) {
|
||||||
Preconditions.checkArgument(
|
Preconditions.checkArgument(
|
||||||
certificateManager != null,
|
certificateService != null,
|
||||||
"certificate manager cannot be null"
|
"certificate manager cannot be null"
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -117,7 +116,7 @@ public abstract class CertificateSelector<T extends Certificate> {
|
|||||||
"type cannot be null"
|
"type cannot be null"
|
||||||
);
|
);
|
||||||
|
|
||||||
this.certificateManager = certificateManager;
|
this.certificateService = certificateService;
|
||||||
this.certificateClass = certificateClass;
|
this.certificateClass = certificateClass;
|
||||||
this.fieldValueSelections = new HashMap<>();
|
this.fieldValueSelections = new HashMap<>();
|
||||||
this.excludeArchivedCertificates = excludeArchivedCertificates;
|
this.excludeArchivedCertificates = excludeArchivedCertificates;
|
||||||
@ -459,7 +458,7 @@ public abstract class CertificateSelector<T extends Certificate> {
|
|||||||
|
|
||||||
// construct and execute query
|
// construct and execute query
|
||||||
private Set<T> execute() {
|
private Set<T> execute() {
|
||||||
return certificateManager.get(this);
|
return certificateService.get(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3,7 +3,7 @@ package hirs.attestationca.persist.service.selector;
|
|||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestService;
|
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
||||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
import jakarta.persistence.criteria.CriteriaQuery;
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
import jakarta.persistence.criteria.Predicate;
|
import jakarta.persistence.criteria.Predicate;
|
||||||
@ -12,16 +12,15 @@ import org.apache.commons.lang3.ArrayUtils;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is used to select one or many RIMs in conjunction
|
* This class is used to select one or many RIMs in conjunction
|
||||||
* with a {@link ReferenceManifestService}. To make use of this object,
|
* with a {@link ReferenceManifestServiceImpl}. To make use of this object,
|
||||||
* use (some ReferenceManifest).select(ReferenceManifestManager).
|
* use (some ReferenceManifest).select(ReferenceManifestManager).
|
||||||
*
|
*
|
||||||
* @param <T> the type of Reference Integrity Manifest that will be retrieved.
|
* @param <T> the type of Reference Integrity Manifest that will be retrieved.
|
||||||
@ -45,7 +44,7 @@ public abstract class ReferenceManifestSelector<T extends ReferenceManifest> {
|
|||||||
public static final String RIM_FILENAME_FIELD = "fileName";
|
public static final String RIM_FILENAME_FIELD = "fileName";
|
||||||
private static final String RIM_TYPE_FIELD = "rimType";
|
private static final String RIM_TYPE_FIELD = "rimType";
|
||||||
|
|
||||||
private final ReferenceManifestService referenceManifestManager;
|
private final ReferenceManifestServiceImpl referenceManifestManager;
|
||||||
private final Class<T> referenceTypeClass;
|
private final Class<T> referenceTypeClass;
|
||||||
|
|
||||||
private final Map<String, Object> fieldValueSelections;
|
private final Map<String, Object> fieldValueSelections;
|
||||||
@ -57,7 +56,7 @@ public abstract class ReferenceManifestSelector<T extends ReferenceManifest> {
|
|||||||
* @param referenceManifestManager the RIM manager to be used to retrieve RIMs
|
* @param referenceManifestManager the RIM manager to be used to retrieve RIMs
|
||||||
* @param referenceTypeClass the type of Reference Manifest to process.
|
* @param referenceTypeClass the type of Reference Manifest to process.
|
||||||
*/
|
*/
|
||||||
public ReferenceManifestSelector(final ReferenceManifestService referenceManifestManager,
|
public ReferenceManifestSelector(final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
final Class<T> referenceTypeClass) {
|
final Class<T> referenceTypeClass) {
|
||||||
this(referenceManifestManager, referenceTypeClass, true);
|
this(referenceManifestManager, referenceTypeClass, true);
|
||||||
}
|
}
|
||||||
@ -69,7 +68,7 @@ public abstract class ReferenceManifestSelector<T extends ReferenceManifest> {
|
|||||||
* @param referenceTypeClass the type of Reference Manifest to process.
|
* @param referenceTypeClass the type of Reference Manifest to process.
|
||||||
* @param excludeArchivedRims true if excluding archived RIMs
|
* @param excludeArchivedRims true if excluding archived RIMs
|
||||||
*/
|
*/
|
||||||
public ReferenceManifestSelector(final ReferenceManifestService referenceManifestManager,
|
public ReferenceManifestSelector(final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
final Class<T> referenceTypeClass,
|
final Class<T> referenceTypeClass,
|
||||||
final boolean excludeArchivedRims) {
|
final boolean excludeArchivedRims) {
|
||||||
Preconditions.checkArgument(
|
Preconditions.checkArgument(
|
||||||
@ -164,7 +163,7 @@ public abstract class ReferenceManifestSelector<T extends ReferenceManifest> {
|
|||||||
* @return a matching RIM or null if none is found
|
* @return a matching RIM or null if none is found
|
||||||
*/
|
*/
|
||||||
public T getRIM() {
|
public T getRIM() {
|
||||||
Set<T> rims = execute();
|
List<T> rims = execute();
|
||||||
if (rims.isEmpty()) {
|
if (rims.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -216,8 +215,8 @@ public abstract class ReferenceManifestSelector<T extends ReferenceManifest> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// construct and execute query
|
// construct and execute query
|
||||||
private Set<T> execute() {
|
private List<T> execute() {
|
||||||
Set<T> results = this.referenceManifestManager.get(this);
|
List<T> results = this.referenceManifestManager.get(this);
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ plugins {
|
|||||||
id 'java'
|
id 'java'
|
||||||
id 'war'
|
id 'war'
|
||||||
id "nebula.ospackage" version "9.1.1"
|
id "nebula.ospackage" version "9.1.1"
|
||||||
id 'org.springframework.boot' version '3.0.6'
|
id 'org.springframework.boot' version '3.1.0'
|
||||||
id 'io.spring.dependency-management' version '1.1.0'
|
id 'io.spring.dependency-management' version '1.1.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,6 +34,7 @@ dependencies {
|
|||||||
implementation project(':HIRS_AttestationCA')
|
implementation project(':HIRS_AttestationCA')
|
||||||
|
|
||||||
implementation libs.pci
|
implementation libs.pci
|
||||||
|
implementation libs.gson
|
||||||
implementation libs.bouncycastle
|
implementation libs.bouncycastle
|
||||||
implementation libs.guava
|
implementation libs.guava
|
||||||
implementation libs.jakarta.servlet
|
implementation libs.jakarta.servlet
|
||||||
@ -41,8 +42,10 @@ dependencies {
|
|||||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||||
implementation 'com.github.darrachequesne:spring-data-jpa-datatables:6.0.1'
|
|
||||||
implementation 'org.projectlombok:lombok'
|
implementation 'org.projectlombok:lombok'
|
||||||
|
implementation 'commons-fileupload:commons-fileupload:1.5'
|
||||||
|
implementation 'org.junit.jupiter:junit-jupiter:5.4.2'
|
||||||
|
implementation 'org.junit.jupiter:junit-jupiter:5.4.2'
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok'
|
compileOnly 'org.projectlombok:lombok'
|
||||||
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
|
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
|
||||||
@ -50,7 +53,13 @@ dependencies {
|
|||||||
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
|
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
|
||||||
|
|
||||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||||
|
testImplementation libs.testng
|
||||||
|
testImplementation libs.mockito
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
//test {
|
||||||
|
// useTestNG()
|
||||||
|
//}
|
||||||
|
|
||||||
war {
|
war {
|
||||||
from(buildDir) {
|
from(buildDir) {
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
package hirs.attestationca.portal;
|
package hirs.attestationca.portal;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletContext;
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.ServletRegistration;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.web.context.support.GenericWebApplicationContext;
|
||||||
|
import org.springframework.web.servlet.DispatcherServlet;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
@EnableAutoConfiguration
|
@EnableAutoConfiguration
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@ComponentScan({"hirs.attestationca.portal", "hirs.attestationca.portal.page.controllers", "hirs.attestationca.persist.entity", "hirs.attestationca.persist.service"})
|
|
||||||
public class HIRSApplication extends SpringBootServletInitializer {
|
public class HIRSApplication extends SpringBootServletInitializer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -21,16 +24,24 @@ public class HIRSApplication extends SpringBootServletInitializer {
|
|||||||
return application.sources(HIRSApplication.class);
|
return application.sources(HIRSApplication.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartup(ServletContext servletContext) throws ServletException {
|
||||||
|
ServletRegistration.Dynamic appServlet = servletContext.addServlet("mvc", new DispatcherServlet(
|
||||||
|
new GenericWebApplicationContext()));
|
||||||
|
|
||||||
|
appServlet.setLoadOnStartup(1);
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication springApplication = new SpringApplication(HIRSApplication.class);
|
SpringApplication springApplication = new SpringApplication(HIRSApplication.class);
|
||||||
springApplication.setDefaultProperties(Collections.singletonMap("server.servlet.context-path", "/portal"));
|
springApplication.setDefaultProperties(Collections.singletonMap("server.servlet.context-path", "/portal"));
|
||||||
springApplication.run(args);
|
springApplication.run(args);
|
||||||
|
|
||||||
log.debug("Debug log message");
|
// log.debug("Debug log message");
|
||||||
log.info("Info log message");
|
log.info("Info log message");
|
||||||
log.error("Error log message");
|
log.error("Error log message");
|
||||||
log.warn("Warn log message");
|
log.warn("Warn log message");
|
||||||
log.fatal("Fatal log message");
|
log.fatal("Fatal log message");
|
||||||
log.trace("Trace log message");
|
// log.trace("Trace log message");
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,16 +1,55 @@
|
|||||||
package hirs.attestationca.portal;
|
package hirs.attestationca.portal;
|
||||||
|
|
||||||
import hirs.attestationca.persist.service.SettingsServiceImpl;
|
import jakarta.servlet.ServletContextEvent;
|
||||||
import jakarta.servlet.ServletContextListener;
|
import jakarta.servlet.ServletContextListener;
|
||||||
import jakarta.servlet.annotation.WebListener;
|
import jakarta.servlet.annotation.WebListener;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
|
||||||
|
|
||||||
|
@Log4j2
|
||||||
@WebListener
|
@WebListener
|
||||||
public class HIRSDbInitializer implements ServletContextListener {
|
public class HIRSDbInitializer extends AbstractAnnotationConfigDispatcherServletInitializer implements ServletContextListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextInitialized(final ServletContextEvent servletContextEvent) {
|
||||||
|
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
|
||||||
|
applicationContext.getEnvironment().addActiveProfile("Server");
|
||||||
|
|
||||||
|
// applicationContext.register(PersistenceConfiguration.class);
|
||||||
|
try {
|
||||||
|
applicationContext.refresh();
|
||||||
|
|
||||||
|
} catch (NoSuchBeanDefinitionException nsbdEx) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Unable to locate MultipartResolver with name 'multipartResolver': no multipart request handling provided");
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.error("DAVY********************************************************************************");
|
||||||
|
log.error(ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class <?>[] getRootConfigClasses() {
|
||||||
|
return new Class[] {
|
||||||
|
PersistenceJPAConfig.class
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class <?>[] getServletConfigClasses() {
|
||||||
|
return new Class[] {
|
||||||
|
PageConfiguration.class
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String[] getServletMappings() {
|
||||||
|
return new String[] {
|
||||||
|
"/"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Autowired
|
|
||||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
|
|
||||||
@Autowired
|
|
||||||
static SettingsServiceImpl settingsService = new SettingsServiceImpl();
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package hirs.attestationca.portal;
|
||||||
|
|
||||||
|
import hirs.attestationca.portal.datatables.DataTableView;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
||||||
|
import org.springframework.web.servlet.ViewResolver;
|
||||||
|
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||||
|
import org.springframework.web.servlet.view.InternalResourceViewResolver;
|
||||||
|
import org.springframework.web.servlet.view.UrlBasedViewResolver;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the location to scan for page controllers, view resolver for JSON data, and view
|
||||||
|
* resolver to map view names to jsp files.
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
@EnableWebMvc
|
||||||
|
@ComponentScan("hirs.attestationca.portal.page.controllers")
|
||||||
|
public class PageConfiguration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bean to resolve injected annotation.Value
|
||||||
|
* property expressions for beans.
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
|
||||||
|
return new PropertySourcesPlaceholderConfigurer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes all URLs that end in "dataTable" use DataTableView to serialize DataTableResponse.
|
||||||
|
*
|
||||||
|
* @return ViewResolver that uses DataTableView.
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public ViewResolver dataTableViewResolver() {
|
||||||
|
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
|
||||||
|
resolver.setViewClass(DataTableView.class);
|
||||||
|
resolver.setViewNames("*dataTable");
|
||||||
|
resolver.setOrder(0);
|
||||||
|
return resolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps view names to the appropriate jsp file.
|
||||||
|
* <p>
|
||||||
|
* Only seems to apply to GET requests.
|
||||||
|
*
|
||||||
|
* @return a ViewResolver bean containing the mapping.
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public ViewResolver pageViewResolver() {
|
||||||
|
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
|
||||||
|
resolver.setPrefix("/WEB-INF/jsp/");
|
||||||
|
resolver.setSuffix(".jsp");
|
||||||
|
return resolver;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package hirs.attestationca.portal;
|
package hirs.attestationca.portal;
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainSettings;
|
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
@ -18,6 +17,9 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
|||||||
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
|
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
|
||||||
import org.springframework.transaction.PlatformTransactionManager;
|
import org.springframework.transaction.PlatformTransactionManager;
|
||||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
|
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
|
||||||
|
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
@ -27,9 +29,9 @@ import java.util.Properties;
|
|||||||
@Configuration
|
@Configuration
|
||||||
@EnableTransactionManagement
|
@EnableTransactionManagement
|
||||||
@PropertySource({ "classpath:hibernate.properties", "classpath:portal.properties" })
|
@PropertySource({ "classpath:hibernate.properties", "classpath:portal.properties" })
|
||||||
@ComponentScan({ "hirs.attestationca.portal.page.controllers", "hirs.attestationca.persist.entity" })
|
@ComponentScan({"hirs.attestationca.portal", "hirs.attestationca.portal.page.controllers", "hirs.attestationca.persist.entity"})//, "hirs.attestationca.persist.service"})
|
||||||
@EnableJpaRepositories(basePackages = "hirs.attestationca.persist.entity.manager")
|
@EnableJpaRepositories(basePackages = "hirs.attestationca.persist.entity.manager")
|
||||||
public class PersistenceJPAConfig {
|
public class PersistenceJPAConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
@Value("${aca.directories.certificates}")
|
@Value("${aca.directories.certificates}")
|
||||||
private String certificatesLocation;
|
private String certificatesLocation;
|
||||||
@ -50,7 +52,7 @@ public class PersistenceJPAConfig {
|
|||||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
||||||
final LocalContainerEntityManagerFactoryBean entityManagerBean = new LocalContainerEntityManagerFactoryBean();
|
final LocalContainerEntityManagerFactoryBean entityManagerBean = new LocalContainerEntityManagerFactoryBean();
|
||||||
entityManagerBean.setDataSource(dataSource());
|
entityManagerBean.setDataSource(dataSource());
|
||||||
entityManagerBean.setPackagesToScan(new String[] {"hirs.attestationca.persist"});
|
entityManagerBean.setPackagesToScan("hirs.attestationca.persist.entity");
|
||||||
|
|
||||||
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
|
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
|
||||||
entityManagerBean.setJpaVendorAdapter(vendorAdapter);
|
entityManagerBean.setJpaVendorAdapter(vendorAdapter);
|
||||||
@ -62,7 +64,8 @@ public class PersistenceJPAConfig {
|
|||||||
@Bean
|
@Bean
|
||||||
public DataSource dataSource() {
|
public DataSource dataSource() {
|
||||||
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
|
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
|
||||||
dataSource.setDriverClassName(environment.getProperty("hibernate.connection.driver_class"));
|
dataSource.setDriverClassName(environment.getProperty("hibernate.connection.driver_class",
|
||||||
|
"org.mariadb.jdbc.Driver"));
|
||||||
dataSource.setUrl(environment.getProperty("hibernate.connection.url"));
|
dataSource.setUrl(environment.getProperty("hibernate.connection.url"));
|
||||||
dataSource.setUsername(environment.getProperty("hibernate.connection.username"));
|
dataSource.setUsername(environment.getProperty("hibernate.connection.username"));
|
||||||
dataSource.setPassword(environment.getProperty("hibernate.connection.password"));
|
dataSource.setPassword(environment.getProperty("hibernate.connection.password"));
|
||||||
@ -185,10 +188,28 @@ public class PersistenceJPAConfig {
|
|||||||
return hibernateProperties;
|
return hibernateProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean(name="default-settings")
|
/**
|
||||||
public SupplyChainSettings supplyChainSettings() {
|
* Creates a Spring Resolver for Multi-part form uploads. This is required
|
||||||
SupplyChainSettings scSettings = new SupplyChainSettings("Default", "Settings are configured for no validation flags set.");
|
* for spring controllers to be able to process Spring MultiPartFiles
|
||||||
|
*
|
||||||
return scSettings;
|
* @return bean to handle multipart form requests
|
||||||
|
*/
|
||||||
|
@Bean(name = "multipartResolver")
|
||||||
|
public StandardServletMultipartResolver multipartResolver() {
|
||||||
|
return new StandardServletMultipartResolver();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Bean(name="default-settings")
|
||||||
|
// public PolicySettings supplyChainSettings() {
|
||||||
|
// PolicySettings scSettings = new PolicySettings("Default", "Settings are configured for no validation flags set.");
|
||||||
|
//
|
||||||
|
// return scSettings;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
|
||||||
|
configurer.enable();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
package hirs.attestationca.portal.datatables;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import java.util.Map;
|
||||||
|
import jakarta.servlet.ServletOutputStream;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.web.servlet.view.AbstractUrlBasedView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes the DataTableResponse from the view as JSON and writes it to the HTTP response.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DataTableView extends AbstractUrlBasedView {
|
||||||
|
|
||||||
|
private static final Gson GSON = new GsonBuilder().create();
|
||||||
|
private static final String MODEL_FIELD;
|
||||||
|
static {
|
||||||
|
final String name = DataTableResponse.class.getSimpleName();
|
||||||
|
MODEL_FIELD = name.substring(0, 1).toLowerCase() + name.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes the DataTableResponse from the view as JSON and writes it to the HTTP response.
|
||||||
|
*
|
||||||
|
* @param model combined output Map (never {@code null}), with dynamic values taking precedence
|
||||||
|
* over static attributes
|
||||||
|
* @param request current HTTP request
|
||||||
|
* @param response current HTTP response
|
||||||
|
* @throws Exception if rendering failed
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void renderMergedOutputModel(
|
||||||
|
final Map<String, Object> model,
|
||||||
|
final HttpServletRequest request,
|
||||||
|
final HttpServletResponse response) throws Exception {
|
||||||
|
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
|
||||||
|
DataTableResponse dataTable = (DataTableResponse) model.get(MODEL_FIELD);
|
||||||
|
ServletOutputStream out = response.getOutputStream();
|
||||||
|
String json = GSON.toJson(dataTable);
|
||||||
|
out.print(json);
|
||||||
|
}
|
||||||
|
}
|
@ -146,7 +146,7 @@ public abstract class PageController<P extends PageParams> {
|
|||||||
|
|
||||||
if (params != null) {
|
if (params != null) {
|
||||||
for (Map.Entry<String, ?> e : params.asMap().entrySet()) {
|
for (Map.Entry<String, ?> e : params.asMap().entrySet()) {
|
||||||
Object v = Optional.ofNullable(e.getValue()).orElse("");
|
Object v = Optional.ofNullable(e.getValue()).orElse(null);
|
||||||
uri.addParameter(e.getKey(), v.toString());
|
uri.addParameter(e.getKey(), v.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package hirs.attestationca.portal.page;
|
package hirs.attestationca.portal.page;
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainSettings;
|
import hirs.attestationca.persist.entity.userdefined.PolicySettings;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@ -55,7 +55,7 @@ public class PolicyPageModel {
|
|||||||
*
|
*
|
||||||
* @param policy The supply chain policy
|
* @param policy The supply chain policy
|
||||||
*/
|
*/
|
||||||
public PolicyPageModel(final SupplyChainSettings policy) {
|
public PolicyPageModel(final PolicySettings policy) {
|
||||||
this.enableEcValidation = policy.isEcValidationEnabled();
|
this.enableEcValidation = policy.isEcValidationEnabled();
|
||||||
this.enablePcCertificateValidation = policy.isPcValidationEnabled();
|
this.enablePcCertificateValidation = policy.isPcValidationEnabled();
|
||||||
this.enablePcCertificateAttributeValidation = policy.isPcAttributeValidationEnabled();
|
this.enablePcCertificateAttributeValidation = policy.isPcAttributeValidationEnabled();
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package hirs.attestationca.portal.page.controllers;
|
package hirs.attestationca.portal.page.controllers;
|
||||||
|
|
||||||
|
import hirs.attestationca.persist.entity.manager.CertificateRepository;
|
||||||
import hirs.attestationca.portal.page.Page;
|
import hirs.attestationca.portal.page.Page;
|
||||||
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
|
||||||
import hirs.attestationca.portal.page.PageController;
|
import hirs.attestationca.portal.page.PageController;
|
||||||
import hirs.attestationca.portal.page.PageMessages;
|
import hirs.attestationca.portal.page.PageMessages;
|
||||||
import hirs.attestationca.portal.page.params.CertificateDetailsPageParams;
|
import hirs.attestationca.portal.page.params.CertificateDetailsPageParams;
|
||||||
@ -29,16 +29,16 @@ public class CertificateDetailsPageController extends PageController<Certificate
|
|||||||
* Model attribute name used by initPage for the initial data passed to the page.
|
* Model attribute name used by initPage for the initial data passed to the page.
|
||||||
*/
|
*/
|
||||||
static final String INITIAL_DATA = "initialData";
|
static final String INITIAL_DATA = "initialData";
|
||||||
private final CertificateServiceImpl certificateServiceImpl;
|
private final CertificateRepository certificateRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor providing the Page's display and routing specification.
|
* Constructor providing the Page's display and routing specification.
|
||||||
* @param certificateServiceImpl the certificate manager
|
* @param certificateRepository the certificate repository
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
public CertificateDetailsPageController(final CertificateServiceImpl certificateServiceImpl) {
|
public CertificateDetailsPageController(final CertificateRepository certificateRepository) {
|
||||||
super(Page.CERTIFICATE_DETAILS);
|
super(Page.CERTIFICATE_DETAILS);
|
||||||
this.certificateServiceImpl = certificateServiceImpl;
|
this.certificateRepository = certificateRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,19 +76,19 @@ public class CertificateDetailsPageController extends PageController<Certificate
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case "certificateauthority":
|
case "certificateauthority":
|
||||||
data.putAll(CertificateStringMapBuilder.getCertificateAuthorityInformation(
|
data.putAll(CertificateStringMapBuilder.getCertificateAuthorityInformation(
|
||||||
uuid, certificateServiceImpl));
|
uuid, null));
|
||||||
break;
|
break;
|
||||||
case "endorsement":
|
case "endorsement":
|
||||||
data.putAll(CertificateStringMapBuilder.getEndorsementInformation(uuid,
|
data.putAll(CertificateStringMapBuilder.getEndorsementInformation(uuid,
|
||||||
certificateServiceImpl));
|
null));
|
||||||
break;
|
break;
|
||||||
case "platform":
|
case "platform":
|
||||||
data.putAll(CertificateStringMapBuilder.getPlatformInformation(uuid,
|
data.putAll(CertificateStringMapBuilder.getPlatformInformation(uuid,
|
||||||
certificateServiceImpl));
|
null));
|
||||||
break;
|
break;
|
||||||
case "issued":
|
case "issued":
|
||||||
data.putAll(CertificateStringMapBuilder.getIssuedInformation(uuid,
|
data.putAll(CertificateStringMapBuilder.getIssuedInformation(uuid,
|
||||||
certificateServiceImpl));
|
null));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
String typeError = "Invalid certificate type: " + params.getType();
|
String typeError = "Invalid certificate type: " + params.getType();
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
package hirs.attestationca.portal.page.controllers;
|
package hirs.attestationca.portal.page.controllers;
|
||||||
|
|
||||||
import hirs.attestationca.persist.DBServiceException;
|
import hirs.attestationca.persist.DBServiceException;
|
||||||
|
import hirs.attestationca.persist.entity.manager.CertificateRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
||||||
import hirs.attestationca.persist.entity.userdefined.certificate.CertificateAuthorityCredential;
|
import hirs.attestationca.persist.entity.userdefined.certificate.CertificateAuthorityCredential;
|
||||||
import hirs.attestationca.persist.entity.userdefined.certificate.EndorsementCredential;
|
import hirs.attestationca.persist.entity.userdefined.certificate.EndorsementCredential;
|
||||||
import hirs.attestationca.persist.entity.userdefined.certificate.IssuedAttestationCertificate;
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.certificate.PlatformCredential;
|
import hirs.attestationca.persist.entity.userdefined.certificate.PlatformCredential;
|
||||||
import hirs.attestationca.persist.service.CertificateService;
|
|
||||||
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
||||||
import hirs.attestationca.portal.page.Page;
|
import hirs.attestationca.portal.page.Page;
|
||||||
import hirs.attestationca.portal.page.PageController;
|
import hirs.attestationca.portal.page.PageController;
|
||||||
@ -32,8 +31,6 @@ import org.springframework.web.servlet.view.RedirectView;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
//import java.security.cert.CertificateEncodingException;
|
|
||||||
//import java.security.cert.X509Certificate;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -41,6 +38,9 @@ import java.util.stream.Collectors;
|
|||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
//import java.security.cert.CertificateEncodingException;
|
||||||
|
//import java.security.cert.X509Certificate;
|
||||||
|
|
||||||
// note uploading base64 certs, old or new having decode issues check ACA channel
|
// note uploading base64 certs, old or new having decode issues check ACA channel
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@ -48,8 +48,9 @@ import java.util.zip.ZipOutputStream;
|
|||||||
@RequestMapping("/certificate-request")
|
@RequestMapping("/certificate-request")
|
||||||
public class CertificatePageController extends PageController<NoPageParams> {
|
public class CertificatePageController extends PageController<NoPageParams> {
|
||||||
|
|
||||||
private final CertificateServiceImpl certificateServiceImpl;
|
// private final CertificateServiceImpl certificateService;
|
||||||
private CertificateAuthorityCredential certificateAuthorityCredential;
|
private CertificateAuthorityCredential certificateAuthorityCredential;
|
||||||
|
private final CertificateRepository certificateRepository;
|
||||||
|
|
||||||
private static final String TRUSTCHAIN = "trust-chain";
|
private static final String TRUSTCHAIN = "trust-chain";
|
||||||
private static final String PLATFORMCREDENTIAL = "platform-credentials";
|
private static final String PLATFORMCREDENTIAL = "platform-credentials";
|
||||||
@ -64,18 +65,19 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
/**
|
/**
|
||||||
* Constructor providing the Page's display and routing specification.
|
* Constructor providing the Page's display and routing specification.
|
||||||
*
|
*
|
||||||
* @param certificateServiceImpl the certificate manager
|
* @param certificateRepository the certificate manager
|
||||||
// * @param crudManager the CRUD manager for certificates
|
// * @param crudManager the CRUD manager for certificates
|
||||||
// * @param acaCertificate the ACA's X509 certificate
|
// * @param acaCertificate the ACA's X509 certificate
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
public CertificatePageController(
|
public CertificatePageController(final CertificateRepository certificateRepository
|
||||||
final CertificateServiceImpl certificateServiceImpl//,
|
//final CertificateServiceImpl certificateService,
|
||||||
// final CrudManager<Certificate> crudManager,
|
// final CrudManager<Certificate> crudManager,
|
||||||
// final X509Certificate acaCertificate
|
// final X509Certificate acaCertificate
|
||||||
) {
|
) {
|
||||||
super(Page.TRUST_CHAIN);
|
super(Page.TRUST_CHAIN);
|
||||||
this.certificateServiceImpl = certificateServiceImpl;
|
// this.certificateService = certificateService;
|
||||||
|
this.certificateRepository = certificateRepository;
|
||||||
// this.dataTableQuerier = crudManager;
|
// this.dataTableQuerier = crudManager;
|
||||||
|
|
||||||
// try {
|
// try {
|
||||||
@ -132,7 +134,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
mav = getBaseModelAndView(Page.TRUST_CHAIN);
|
mav = getBaseModelAndView(Page.TRUST_CHAIN);
|
||||||
// Map with the ACA certificate information
|
// Map with the ACA certificate information
|
||||||
data.putAll(CertificateStringMapBuilder.getCertificateAuthorityInformation(
|
data.putAll(CertificateStringMapBuilder.getCertificateAuthorityInformation(
|
||||||
certificateAuthorityCredential, this.certificateServiceImpl));
|
certificateAuthorityCredential, null));
|
||||||
mav.addObject(ACA_CERT_DATA, data);
|
mav.addObject(ACA_CERT_DATA, data);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -171,7 +173,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
certificateType,
|
certificateType,
|
||||||
file.getOriginalFilename(),
|
file.getOriginalFilename(),
|
||||||
messages, certificate,
|
messages, certificate,
|
||||||
certificateServiceImpl);
|
null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,7 +226,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
|
|
||||||
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
||||||
// get all files
|
// get all files
|
||||||
bulkDownload(zipOut, this.certificateServiceImpl.fetchCertificates(CertificateAuthorityCredential.class), singleFileName);
|
// bulkDownload(zipOut, this.certificateRepository.fetchCertificates(CertificateAuthorityCredential.class), singleFileName);
|
||||||
// write cert to output stream
|
// write cert to output stream
|
||||||
} catch (IllegalArgumentException ex) {
|
} catch (IllegalArgumentException ex) {
|
||||||
String uuidError = "Failed to parse ID from: ";
|
String uuidError = "Failed to parse ID from: ";
|
||||||
@ -256,7 +258,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
|
|
||||||
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
||||||
// get all files
|
// get all files
|
||||||
bulkDownload(zipOut, this.certificateServiceImpl.fetchCertificates(PlatformCredential.class), singleFileName);
|
// bulkDownload(zipOut, this.certificateRepository.fetchCertificates(PlatformCredential.class), singleFileName);
|
||||||
// write cert to output stream
|
// write cert to output stream
|
||||||
} catch (IllegalArgumentException ex) {
|
} catch (IllegalArgumentException ex) {
|
||||||
String uuidError = "Failed to parse ID from: ";
|
String uuidError = "Failed to parse ID from: ";
|
||||||
@ -288,7 +290,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
|
|
||||||
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
||||||
// get all files
|
// get all files
|
||||||
bulkDownload(zipOut, this.certificateServiceImpl.fetchCertificates(IssuedAttestationCertificate.class), singleFileName);
|
// bulkDownload(zipOut, this.certificateRepository.fetchCertificates(IssuedAttestationCertificate.class), singleFileName);
|
||||||
// write cert to output stream
|
// write cert to output stream
|
||||||
} catch (IllegalArgumentException ex) {
|
} catch (IllegalArgumentException ex) {
|
||||||
String uuidError = "Failed to parse ID from: ";
|
String uuidError = "Failed to parse ID from: ";
|
||||||
@ -319,7 +321,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
|
|
||||||
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
|
||||||
// get all files
|
// get all files
|
||||||
bulkDownload(zipOut, this.certificateServiceImpl.fetchCertificates(EndorsementCredential.class), singleFileName);
|
// bulkDownload(zipOut, this.certificateService.findAll(), singleFileName);
|
||||||
// write cert to output stream
|
// write cert to output stream
|
||||||
} catch (IllegalArgumentException ex) {
|
} catch (IllegalArgumentException ex) {
|
||||||
String uuidError = "Failed to parse ID from: ";
|
String uuidError = "Failed to parse ID from: ";
|
||||||
@ -372,18 +374,18 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
*
|
*
|
||||||
* @param certificateType String containing the certificate type
|
* @param certificateType String containing the certificate type
|
||||||
* @param certificateHash the hash of the certificate's bytes
|
* @param certificateHash the hash of the certificate's bytes
|
||||||
* @param certificateManager the certificate manager to query
|
* @param certificateService the certificate manager to query
|
||||||
* @return the certificate or null if none is found
|
* @return the certificate or null if none is found
|
||||||
*/
|
*/
|
||||||
private Certificate getCertificateByHash(
|
private Certificate getCertificateByHash(
|
||||||
final String certificateType,
|
final String certificateType,
|
||||||
final int certificateHash,
|
final int certificateHash,
|
||||||
final CertificateService certificateManager) {
|
final CertificateServiceImpl certificateService) {
|
||||||
|
|
||||||
switch (certificateType) {
|
switch (certificateType) {
|
||||||
case PLATFORMCREDENTIAL:
|
case PLATFORMCREDENTIAL:
|
||||||
return PlatformCredential
|
return PlatformCredential
|
||||||
.select(certificateManager)
|
.select(certificateService)
|
||||||
.includeArchived()
|
.includeArchived()
|
||||||
.byHashCode(certificateHash)
|
.byHashCode(certificateHash)
|
||||||
.getCertificate();
|
.getCertificate();
|
||||||
@ -395,7 +397,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
// .getCertificate();
|
// .getCertificate();
|
||||||
case TRUSTCHAIN:
|
case TRUSTCHAIN:
|
||||||
return CertificateAuthorityCredential
|
return CertificateAuthorityCredential
|
||||||
.select(certificateManager)
|
.select(certificateService)
|
||||||
.includeArchived()
|
.includeArchived()
|
||||||
.byHashCode(certificateHash)
|
.byHashCode(certificateHash)
|
||||||
.getCertificate();
|
.getCertificate();
|
||||||
@ -409,13 +411,13 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
*
|
*
|
||||||
* @param certificateType String containing the certificate type
|
* @param certificateType String containing the certificate type
|
||||||
* @param serialNumber the platform serial number
|
* @param serialNumber the platform serial number
|
||||||
* @param certificateManager the certificate manager to query
|
* @param certificateService the certificate manager to query
|
||||||
* @return the certificate or null if none is found
|
* @return the certificate or null if none is found
|
||||||
*/
|
*/
|
||||||
private List<PlatformCredential> getCertificateByBoardSN(
|
private List<PlatformCredential> getCertificateByBoardSN(
|
||||||
final String certificateType,
|
final String certificateType,
|
||||||
final String serialNumber,
|
final String serialNumber,
|
||||||
final CertificateService certificateManager) {
|
final CertificateServiceImpl certificateService) {
|
||||||
|
|
||||||
if (serialNumber == null) {
|
if (serialNumber == null) {
|
||||||
return null;
|
return null;
|
||||||
@ -424,7 +426,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
switch (certificateType) {
|
switch (certificateType) {
|
||||||
case PLATFORMCREDENTIAL:
|
case PLATFORMCREDENTIAL:
|
||||||
return PlatformCredential
|
return PlatformCredential
|
||||||
.select(certificateManager)
|
.select(certificateService)
|
||||||
.byBoardSerialNumber(serialNumber)
|
.byBoardSerialNumber(serialNumber)
|
||||||
.getCertificates().stream().collect(Collectors.toList());
|
.getCertificates().stream().collect(Collectors.toList());
|
||||||
default:
|
default:
|
||||||
@ -504,7 +506,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
* be stored
|
* be stored
|
||||||
* @param messages contains any messages that will be display on the page
|
* @param messages contains any messages that will be display on the page
|
||||||
* @param certificate the certificate to store
|
* @param certificate the certificate to store
|
||||||
* @param certificateManager the DB manager to use
|
* @param certificateService the DB manager to use
|
||||||
* @return the messages for the page
|
* @return the messages for the page
|
||||||
*/
|
*/
|
||||||
private void storeCertificate(
|
private void storeCertificate(
|
||||||
@ -512,7 +514,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
final String fileName,
|
final String fileName,
|
||||||
final PageMessages messages,
|
final PageMessages messages,
|
||||||
final Certificate certificate,
|
final Certificate certificate,
|
||||||
final CertificateService certificateManager) {
|
final CertificateServiceImpl certificateService) {
|
||||||
|
|
||||||
Certificate existingCertificate;
|
Certificate existingCertificate;
|
||||||
|
|
||||||
@ -521,7 +523,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
existingCertificate = getCertificateByHash(
|
existingCertificate = getCertificateByHash(
|
||||||
certificateType,
|
certificateType,
|
||||||
certificate.getCertificateHash(),
|
certificate.getCertificateHash(),
|
||||||
certificateManager);
|
certificateService);
|
||||||
} catch (DBServiceException e) {
|
} catch (DBServiceException e) {
|
||||||
final String failMessage = "Querying for existing certificate failed ("
|
final String failMessage = "Querying for existing certificate failed ("
|
||||||
+ fileName + "): ";
|
+ fileName + "): ";
|
||||||
@ -539,7 +541,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
List<PlatformCredential> sharedCertificates = getCertificateByBoardSN(
|
List<PlatformCredential> sharedCertificates = getCertificateByBoardSN(
|
||||||
certificateType,
|
certificateType,
|
||||||
platformCertificate.getPlatformSerial(),
|
platformCertificate.getPlatformSerial(),
|
||||||
certificateManager);
|
certificateService);
|
||||||
|
|
||||||
if (sharedCertificates != null) {
|
if (sharedCertificates != null) {
|
||||||
for (PlatformCredential pc : sharedCertificates) {
|
for (PlatformCredential pc : sharedCertificates) {
|
||||||
@ -575,7 +577,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
}**/
|
}**/
|
||||||
}
|
}
|
||||||
|
|
||||||
certificateManager.saveCertificate(certificate);
|
certificateService.save(certificate);
|
||||||
|
|
||||||
final String successMsg
|
final String successMsg
|
||||||
= String.format("New certificate successfully uploaded (%s): ", fileName);
|
= String.format("New certificate successfully uploaded (%s): ", fileName);
|
||||||
@ -597,7 +599,7 @@ public class CertificatePageController extends PageController<NoPageParams> {
|
|||||||
if (existingCertificate.isArchived()) {
|
if (existingCertificate.isArchived()) {
|
||||||
existingCertificate.restore();
|
existingCertificate.restore();
|
||||||
existingCertificate.resetCreateTime();
|
existingCertificate.resetCreateTime();
|
||||||
certificateManager.updateCertificate(existingCertificate);
|
certificateService.save(existingCertificate);
|
||||||
|
|
||||||
final String successMsg = String.format("Pre-existing certificate "
|
final String successMsg = String.format("Pre-existing certificate "
|
||||||
+ "found and unarchived (%s): ", fileName);
|
+ "found and unarchived (%s): ", fileName);
|
||||||
|
@ -3,7 +3,6 @@ package hirs.attestationca.portal.page.controllers;
|
|||||||
import hirs.attestationca.persist.entity.manager.DeviceRepository;
|
import hirs.attestationca.persist.entity.manager.DeviceRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.Device;
|
import hirs.attestationca.persist.entity.userdefined.Device;
|
||||||
import hirs.attestationca.portal.page.Page;
|
import hirs.attestationca.portal.page.Page;
|
||||||
import hirs.attestationca.persist.service.DeviceServiceImpl;
|
|
||||||
import hirs.attestationca.portal.page.PageController;
|
import hirs.attestationca.portal.page.PageController;
|
||||||
import hirs.attestationca.portal.page.params.NoPageParams;
|
import hirs.attestationca.portal.page.params.NoPageParams;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -23,14 +22,11 @@ public class DevicePageController extends PageController<NoPageParams> {
|
|||||||
* Autowiring property vs constructor
|
* Autowiring property vs constructor
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private final DeviceServiceImpl deviceServiceImpl;
|
|
||||||
private final DeviceRepository deviceRepository;
|
private final DeviceRepository deviceRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public DevicePageController(DeviceServiceImpl deviceServiceImpl,
|
public DevicePageController(final DeviceRepository deviceRepository) {
|
||||||
DeviceRepository deviceRepository) {
|
|
||||||
super(Page.DEVICES);
|
super(Page.DEVICES);
|
||||||
this.deviceServiceImpl = deviceServiceImpl;
|
|
||||||
this.deviceRepository = deviceRepository;
|
this.deviceRepository = deviceRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package hirs.attestationca.portal.page.controllers;
|
package hirs.attestationca.portal.page.controllers;
|
||||||
|
|
||||||
import hirs.attestationca.persist.entity.userdefined.SupplyChainSettings;
|
import hirs.attestationca.persist.entity.manager.PolicyRepository;
|
||||||
import hirs.attestationca.persist.service.SettingsServiceImpl;
|
import hirs.attestationca.persist.entity.userdefined.PolicySettings;
|
||||||
import hirs.attestationca.portal.page.Page;
|
import hirs.attestationca.portal.page.Page;
|
||||||
import hirs.attestationca.portal.page.PageController;
|
import hirs.attestationca.portal.page.PageController;
|
||||||
import hirs.attestationca.portal.page.PageMessages;
|
import hirs.attestationca.portal.page.PageMessages;
|
||||||
@ -39,7 +39,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
|
|
||||||
private static final String ENABLED_EXPIRES_PARAMETER_VALUE = "expires";
|
private static final String ENABLED_EXPIRES_PARAMETER_VALUE = "expires";
|
||||||
|
|
||||||
private SettingsServiceImpl settingsService;
|
private final PolicyRepository policyRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model attribute name used by initPage for the initial data passed to the
|
* Model attribute name used by initPage for the initial data passed to the
|
||||||
@ -56,16 +56,16 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param policyService the policy service
|
* @param policyRepository the policy service
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
public PolicyPageController(final SettingsServiceImpl policyService) {
|
public PolicyPageController(final PolicyRepository policyRepository) {
|
||||||
super(Page.POLICY);
|
super(Page.POLICY);
|
||||||
this.settingsService = policyService;
|
this.policyRepository = policyRepository;
|
||||||
|
|
||||||
if (this.settingsService.getByName("Default") == null) {
|
// if (this.settingsService.findByName("Default") == null) {
|
||||||
this.settingsService.saveSettings(new SupplyChainSettings("Default", "Settings are configured for no validation flags set."));
|
// this.settingsService.saveSettings(new PolicySettings("Default", "Settings are configured for no validation flags set."));
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,7 +82,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
// get the basic information to render the page
|
// get the basic information to render the page
|
||||||
ModelAndView mav = getBaseModelAndView();
|
ModelAndView mav = getBaseModelAndView();
|
||||||
|
|
||||||
SupplyChainSettings policy = getDefaultPolicy();
|
PolicySettings policy = getDefaultPolicy();
|
||||||
log.debug(policy);
|
log.debug(policy);
|
||||||
PolicyPageModel pageModel = new PolicyPageModel(policy);
|
PolicyPageModel pageModel = new PolicyPageModel(policy);
|
||||||
mav.addObject(INITIAL_DATA, pageModel);
|
mav.addObject(INITIAL_DATA, pageModel);
|
||||||
@ -113,7 +113,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
= ppModel.getPcValidate().equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
= ppModel.getPcValidate().equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
// If PC policy setting change results in invalid policy, inform user
|
// If PC policy setting change results in invalid policy, inform user
|
||||||
if (!isPolicyValid(policy.isEcValidationEnabled(), pcValidationOptionEnabled,
|
if (!isPolicyValid(policy.isEcValidationEnabled(), pcValidationOptionEnabled,
|
||||||
@ -164,7 +164,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
// If PC Attribute Validation is enabled without PC Validation, disallow change
|
// If PC Attribute Validation is enabled without PC Validation, disallow change
|
||||||
if (!isPolicyValid(policy.isEcValidationEnabled(),
|
if (!isPolicyValid(policy.isEcValidationEnabled(),
|
||||||
@ -216,7 +216,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
if (issuedAttestationOptionEnabled) {
|
if (issuedAttestationOptionEnabled) {
|
||||||
successMessage = "Attestation Certificate generation enabled.";
|
successMessage = "Attestation Certificate generation enabled.";
|
||||||
@ -260,7 +260,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
if (issuedDevIdOptionEnabled) {
|
if (issuedDevIdOptionEnabled) {
|
||||||
successMessage = "DevID Certificate generation enabled.";
|
successMessage = "DevID Certificate generation enabled.";
|
||||||
@ -312,7 +312,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
boolean issuedAttestationOptionEnabled
|
boolean issuedAttestationOptionEnabled
|
||||||
= policy.isIssueAttestationCertificate();
|
= policy.isIssueAttestationCertificate();
|
||||||
|
|
||||||
@ -326,7 +326,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
if (generateCertificateEnabled) {
|
if (generateCertificateEnabled) {
|
||||||
numOfDays = ppModel.getExpirationValue();
|
numOfDays = ppModel.getExpirationValue();
|
||||||
if (numOfDays == null) {
|
if (numOfDays == null) {
|
||||||
numOfDays = SupplyChainSettings.TEN_YEARS;
|
numOfDays = PolicySettings.TEN_YEARS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
numOfDays = policy.getValidityDays();
|
numOfDays = policy.getValidityDays();
|
||||||
@ -382,7 +382,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
boolean issuedDevIdOptionEnabled
|
boolean issuedDevIdOptionEnabled
|
||||||
= policy.isIssueDevIdCertificate();
|
= policy.isIssueDevIdCertificate();
|
||||||
|
|
||||||
@ -396,7 +396,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
if (generateDevIdCertificateEnabled) {
|
if (generateDevIdCertificateEnabled) {
|
||||||
numOfDays = ppModel.getDevIdExpirationValue();
|
numOfDays = ppModel.getDevIdExpirationValue();
|
||||||
if (numOfDays == null) {
|
if (numOfDays == null) {
|
||||||
numOfDays = SupplyChainSettings.TEN_YEARS;
|
numOfDays = PolicySettings.TEN_YEARS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
numOfDays = policy.getDevIdValidityDays();
|
numOfDays = policy.getDevIdValidityDays();
|
||||||
@ -452,7 +452,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
boolean issuedAttestationOptionEnabled
|
boolean issuedAttestationOptionEnabled
|
||||||
= policy.isIssueAttestationCertificate();
|
= policy.isIssueAttestationCertificate();
|
||||||
|
|
||||||
@ -470,7 +470,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (threshold == null || threshold.isEmpty()) {
|
if (threshold == null || threshold.isEmpty()) {
|
||||||
threshold = SupplyChainSettings.YEAR;
|
threshold = PolicySettings.YEAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
policy.setReissueThreshold(threshold);
|
policy.setReissueThreshold(threshold);
|
||||||
@ -522,7 +522,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
boolean issuedDevIdOptionEnabled
|
boolean issuedDevIdOptionEnabled
|
||||||
= policy.isIssueDevIdCertificate();
|
= policy.isIssueDevIdCertificate();
|
||||||
|
|
||||||
@ -540,7 +540,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (threshold == null || threshold.isEmpty()) {
|
if (threshold == null || threshold.isEmpty()) {
|
||||||
threshold = SupplyChainSettings.YEAR;
|
threshold = PolicySettings.YEAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
policy.setDevIdReissueThreshold(threshold);
|
policy.setDevIdReissueThreshold(threshold);
|
||||||
@ -584,7 +584,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
= ppModel.getEcValidate().equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
= ppModel.getEcValidate().equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
//If PC Validation is enabled without EC Validation, disallow change
|
//If PC Validation is enabled without EC Validation, disallow change
|
||||||
if (!isPolicyValid(ecValidationOptionEnabled, policy.isPcValidationEnabled(),
|
if (!isPolicyValid(ecValidationOptionEnabled, policy.isPcValidationEnabled(),
|
||||||
@ -636,7 +636,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
//If firmware is enabled without PC attributes, disallow change
|
//If firmware is enabled without PC attributes, disallow change
|
||||||
if (firmwareValidationOptionEnabled && !policy.isPcAttributeValidationEnabled()) {
|
if (firmwareValidationOptionEnabled && !policy.isPcAttributeValidationEnabled()) {
|
||||||
@ -692,7 +692,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
//If Ignore IMA is enabled without firmware, disallow change
|
//If Ignore IMA is enabled without firmware, disallow change
|
||||||
if (ignoreImaOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
if (ignoreImaOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
||||||
@ -743,7 +743,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
//If Ignore TBoot is enabled without firmware, disallow change
|
//If Ignore TBoot is enabled without firmware, disallow change
|
||||||
if (ignoreTbootOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
if (ignoreTbootOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
||||||
@ -794,7 +794,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
//If Ignore TBoot is enabled without firmware, disallow change
|
//If Ignore TBoot is enabled without firmware, disallow change
|
||||||
if (ignoreGptOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
if (ignoreGptOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
||||||
@ -847,7 +847,7 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
.equalsIgnoreCase(ENABLED_CHECKED_PARAMETER_VALUE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SupplyChainSettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
PolicySettings policy = getDefaultPolicyAndSetInModel(ppModel, model);
|
||||||
|
|
||||||
//If Ignore TBoot is enabled without firmware, disallow change
|
//If Ignore TBoot is enabled without firmware, disallow change
|
||||||
if (ignoreOsEvtOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
if (ignoreOsEvtOptionEnabled && !policy.isFirmwareValidationEnabled()) {
|
||||||
@ -918,12 +918,12 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
*
|
*
|
||||||
* @return The default Supply Chain Policy
|
* @return The default Supply Chain Policy
|
||||||
*/
|
*/
|
||||||
private SupplyChainSettings getDefaultPolicy() {
|
private PolicySettings getDefaultPolicy() {
|
||||||
SupplyChainSettings defaultSettings = this.settingsService.getByName("Default");
|
PolicySettings defaultSettings = null;//this.policyRepository.findByName("Default");
|
||||||
|
|
||||||
if (defaultSettings == null) {
|
// if (defaultSettings == null) {
|
||||||
defaultSettings = new SupplyChainSettings("Default", "Settings are configured for no validation flags set.");
|
// defaultSettings = new PolicySettings("Default", "Settings are configured for no validation flags set.");
|
||||||
}
|
// }
|
||||||
return defaultSettings;
|
return defaultSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -935,10 +935,10 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
* @param model the map of string messages to be displayed on the view
|
* @param model the map of string messages to be displayed on the view
|
||||||
* @return The default Supply Chain Policy
|
* @return The default Supply Chain Policy
|
||||||
*/
|
*/
|
||||||
private SupplyChainSettings getDefaultPolicyAndSetInModel(
|
private PolicySettings getDefaultPolicyAndSetInModel(
|
||||||
final PolicyPageModel ppModel, final Map<String, Object> model) {
|
final PolicyPageModel ppModel, final Map<String, Object> model) {
|
||||||
// load the current default policy from the DB
|
// load the current default policy from the DB
|
||||||
SupplyChainSettings policy = getDefaultPolicy();
|
PolicySettings policy = getDefaultPolicy();
|
||||||
|
|
||||||
// set the data received to be populated back into the form
|
// set the data received to be populated back into the form
|
||||||
model.put(RESULT_DATA, ppModel);
|
model.put(RESULT_DATA, ppModel);
|
||||||
@ -948,9 +948,9 @@ public class PolicyPageController extends PageController<NoPageParams> {
|
|||||||
private void savePolicyAndApplySuccessMessage(
|
private void savePolicyAndApplySuccessMessage(
|
||||||
final PolicyPageModel ppModel, final Map<String, Object> model,
|
final PolicyPageModel ppModel, final Map<String, Object> model,
|
||||||
final PageMessages messages, final String successMessage,
|
final PageMessages messages, final String successMessage,
|
||||||
final SupplyChainSettings settings) {
|
final PolicySettings settings) {
|
||||||
// save the policy to the DB
|
// save the policy to the DB
|
||||||
settingsService.updateSettings(settings);
|
policyRepository.saveAndFlush(settings);
|
||||||
|
|
||||||
// Log and set the success message
|
// Log and set the success message
|
||||||
messages.addSuccess(successMessage);
|
messages.addSuccess(successMessage);
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
package hirs.attestationca.portal.page.controllers;
|
package hirs.attestationca.portal.page.controllers;
|
||||||
|
|
||||||
import hirs.attestationca.persist.DBServiceException;
|
import hirs.attestationca.persist.DBServiceException;
|
||||||
|
import hirs.attestationca.persist.entity.manager.ReferenceManifestRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
import hirs.attestationca.persist.entity.userdefined.certificate.CertificateAuthorityCredential;
|
import hirs.attestationca.persist.entity.userdefined.certificate.CertificateAuthorityCredential;
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.BaseReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.rim.BaseReferenceManifest;
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.EventLogMeasurements;
|
import hirs.attestationca.persist.entity.userdefined.rim.EventLogMeasurements;
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.SupportReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.rim.SupportReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.CertificateService;
|
import hirs.attestationca.persist.service.CertificateServiceImpl;
|
||||||
import hirs.attestationca.persist.service.ReferenceDigestValueService;
|
|
||||||
import hirs.attestationca.persist.service.ReferenceDigestValueServiceImpl;
|
import hirs.attestationca.persist.service.ReferenceDigestValueServiceImpl;
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestService;
|
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
||||||
import hirs.attestationca.persist.service.SupplyChainValidationServiceImpl;
|
import hirs.attestationca.persist.service.SupplyChainValidationServiceImpl;
|
||||||
import hirs.attestationca.persist.validation.ReferenceManifestValidator;
|
import hirs.attestationca.persist.validation.ReferenceManifestValidator;
|
||||||
@ -52,28 +51,32 @@ import java.util.UUID;
|
|||||||
@RequestMapping("/rim-details")
|
@RequestMapping("/rim-details")
|
||||||
public class ReferenceManifestDetailsPageController extends PageController<ReferenceManifestDetailsPageParams> {
|
public class ReferenceManifestDetailsPageController extends PageController<ReferenceManifestDetailsPageParams> {
|
||||||
|
|
||||||
private final ReferenceManifestService referenceManifestManager;
|
private final ReferenceManifestRepository referenceManifestRepository;
|
||||||
private final ReferenceDigestValueService referenceEventManager;
|
// private final ReferenceManifestServiceImpl referenceManifestManager;
|
||||||
private final CertificateService certificateService;
|
// private final ReferenceDigestValueServiceImpl referenceEventManager;
|
||||||
|
// private final CertificateServiceImpl certificateService;
|
||||||
private static final ReferenceManifestValidator RIM_VALIDATOR
|
private static final ReferenceManifestValidator RIM_VALIDATOR
|
||||||
= new ReferenceManifestValidator();
|
= new ReferenceManifestValidator();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor providing the Page's display and routing specification.
|
* Constructor providing the Page's display and routing specification.
|
||||||
*
|
*
|
||||||
* @param referenceManifestManager the reference manifest manager.
|
* @param referenceManifestRepository the repository for RIM.
|
||||||
* @param referenceEventManager the reference event manager.
|
// * @param referenceManifestManager the reference manifest manager.
|
||||||
* @param certificateService the certificate manager.
|
// * @param referenceEventManager the reference event manager.
|
||||||
|
// * @param certificateService the certificate manager.
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
public ReferenceManifestDetailsPageController(
|
public ReferenceManifestDetailsPageController(final ReferenceManifestRepository referenceManifestRepository
|
||||||
final ReferenceManifestServiceImpl referenceManifestManager,
|
// final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
final ReferenceDigestValueServiceImpl referenceEventManager,
|
// final ReferenceDigestValueServiceImpl referenceEventManager,
|
||||||
final CertificateService certificateService) {
|
// final CertificateServiceImpl certificateService
|
||||||
|
) {
|
||||||
super(Page.RIM_DETAILS);
|
super(Page.RIM_DETAILS);
|
||||||
this.referenceManifestManager = referenceManifestManager;
|
this.referenceManifestRepository = referenceManifestRepository;
|
||||||
this.referenceEventManager = referenceEventManager;
|
// this.referenceManifestManager = referenceManifestManager;
|
||||||
this.certificateService = certificateService;
|
// this.referenceEventManager = referenceEventManager;
|
||||||
|
// this.certificateService = certificateService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,8 +106,10 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
UUID uuid = UUID.fromString(params.getId());
|
UUID uuid = UUID.fromString(params.getId());
|
||||||
data.putAll(getRimDetailInfo(uuid, referenceManifestManager,
|
data.putAll(getRimDetailInfo(uuid, null,
|
||||||
referenceEventManager, certificateService));
|
null, null));
|
||||||
|
// data.putAll(getRimDetailInfo(uuid, referenceManifestManager,
|
||||||
|
// referenceEventManager, certificateService));
|
||||||
} catch (IllegalArgumentException iaEx) {
|
} catch (IllegalArgumentException iaEx) {
|
||||||
String uuidError = "Failed to parse ID from: " + params.getId();
|
String uuidError = "Failed to parse ID from: " + params.getId();
|
||||||
messages.addError(uuidError);
|
messages.addError(uuidError);
|
||||||
@ -133,16 +138,16 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
* @param uuid database reference for the requested RIM.
|
* @param uuid database reference for the requested RIM.
|
||||||
* @param referenceManifestManager the reference manifest manager.
|
* @param referenceManifestManager the reference manifest manager.
|
||||||
* @param referenceEventManager the reference event manager.
|
* @param referenceEventManager the reference event manager.
|
||||||
* @param certificateManager the certificate manager.
|
* @param certificateService the certificate manager.
|
||||||
* @return mapping of the RIM information from the database.
|
* @return mapping of the RIM information from the database.
|
||||||
* @throws java.io.IOException error for reading file bytes.
|
* @throws java.io.IOException error for reading file bytes.
|
||||||
* @throws NoSuchAlgorithmException If an unknown Algorithm is encountered.
|
* @throws NoSuchAlgorithmException If an unknown Algorithm is encountered.
|
||||||
* @throws CertificateException if a certificate doesn't parse.
|
* @throws CertificateException if a certificate doesn't parse.
|
||||||
*/
|
*/
|
||||||
public static HashMap<String, Object> getRimDetailInfo(final UUID uuid,
|
public static HashMap<String, Object> getRimDetailInfo(final UUID uuid,
|
||||||
final ReferenceManifestService referenceManifestManager,
|
final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
final ReferenceDigestValueService referenceEventManager,
|
final ReferenceDigestValueServiceImpl referenceEventManager,
|
||||||
final CertificateService certificateManager)
|
final CertificateServiceImpl certificateService)
|
||||||
throws IOException,
|
throws IOException,
|
||||||
CertificateException, NoSuchAlgorithmException {
|
CertificateException, NoSuchAlgorithmException {
|
||||||
HashMap<String, Object> data = new HashMap<>();
|
HashMap<String, Object> data = new HashMap<>();
|
||||||
@ -151,7 +156,7 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
.byEntityId(uuid).getRIM();
|
.byEntityId(uuid).getRIM();
|
||||||
|
|
||||||
if (bRim != null) {
|
if (bRim != null) {
|
||||||
data.putAll(getBaseRimInfo(bRim, referenceManifestManager, certificateManager));
|
data.putAll(getBaseRimInfo(bRim, referenceManifestManager, certificateService));
|
||||||
}
|
}
|
||||||
|
|
||||||
SupportReferenceManifest sRim = SupportReferenceManifest.select(referenceManifestManager)
|
SupportReferenceManifest sRim = SupportReferenceManifest.select(referenceManifestManager)
|
||||||
@ -178,7 +183,7 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
*
|
*
|
||||||
* @param baseRim established ReferenceManifest Type.
|
* @param baseRim established ReferenceManifest Type.
|
||||||
* @param referenceManifestManager the reference manifest manager.
|
* @param referenceManifestManager the reference manifest manager.
|
||||||
* @param certificateManager the certificate manager.
|
* @param certificateService the certificate manager.
|
||||||
* @return mapping of the RIM information from the database.
|
* @return mapping of the RIM information from the database.
|
||||||
* @throws java.io.IOException error for reading file bytes.
|
* @throws java.io.IOException error for reading file bytes.
|
||||||
* @throws NoSuchAlgorithmException If an unknown Algorithm is encountered.
|
* @throws NoSuchAlgorithmException If an unknown Algorithm is encountered.
|
||||||
@ -186,8 +191,8 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
*/
|
*/
|
||||||
private static HashMap<String, Object> getBaseRimInfo(
|
private static HashMap<String, Object> getBaseRimInfo(
|
||||||
final BaseReferenceManifest baseRim,
|
final BaseReferenceManifest baseRim,
|
||||||
final ReferenceManifestService referenceManifestManager,
|
final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
final CertificateService certificateManager)
|
final CertificateServiceImpl certificateService)
|
||||||
throws IOException, CertificateException, NoSuchAlgorithmException {
|
throws IOException, CertificateException, NoSuchAlgorithmException {
|
||||||
HashMap<String, Object> data = new HashMap<>();
|
HashMap<String, Object> data = new HashMap<>();
|
||||||
|
|
||||||
@ -292,13 +297,13 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
}
|
}
|
||||||
|
|
||||||
Set<CertificateAuthorityCredential> certificates =
|
Set<CertificateAuthorityCredential> certificates =
|
||||||
CertificateAuthorityCredential.select(certificateManager)
|
CertificateAuthorityCredential.select(certificateService)
|
||||||
.getCertificates();
|
.getCertificates();
|
||||||
//Report invalid signature unless RIM_VALIDATOR validates it and cert path is valid
|
//Report invalid signature unless RIM_VALIDATOR validates it and cert path is valid
|
||||||
data.put("signatureValid", false);
|
data.put("signatureValid", false);
|
||||||
for (CertificateAuthorityCredential cert : certificates) {
|
for (CertificateAuthorityCredential cert : certificates) {
|
||||||
SupplyChainValidationServiceImpl scvsImpl =
|
SupplyChainValidationServiceImpl scvsImpl =
|
||||||
new SupplyChainValidationServiceImpl(certificateManager);
|
new SupplyChainValidationServiceImpl(certificateService);
|
||||||
KeyStore keystore = scvsImpl.getCaChain(cert);
|
KeyStore keystore = scvsImpl.getCaChain(cert);
|
||||||
if (RIM_VALIDATOR.validateXmlSignature(cert)) {
|
if (RIM_VALIDATOR.validateXmlSignature(cert)) {
|
||||||
try {
|
try {
|
||||||
@ -339,7 +344,7 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
*/
|
*/
|
||||||
private static HashMap<String, Object> getSupportRimInfo(
|
private static HashMap<String, Object> getSupportRimInfo(
|
||||||
final SupportReferenceManifest support,
|
final SupportReferenceManifest support,
|
||||||
final ReferenceManifestService referenceManifestManager)
|
final ReferenceManifestServiceImpl referenceManifestManager)
|
||||||
throws IOException, CertificateException, NoSuchAlgorithmException {
|
throws IOException, CertificateException, NoSuchAlgorithmException {
|
||||||
HashMap<String, Object> data = new HashMap<>();
|
HashMap<String, Object> data = new HashMap<>();
|
||||||
EventLogMeasurements measurements = null;
|
EventLogMeasurements measurements = null;
|
||||||
@ -353,7 +358,7 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
&& baseRim.getAssociatedRim().equals(support.getId())) {
|
&& baseRim.getAssociatedRim().equals(support.getId())) {
|
||||||
support.setAssociatedRim(baseRim.getId());
|
support.setAssociatedRim(baseRim.getId());
|
||||||
try {
|
try {
|
||||||
referenceManifestManager.updateReferenceManifest(support, support.getId());
|
referenceManifestManager.save(support);
|
||||||
} catch (DBServiceException ex) {
|
} catch (DBServiceException ex) {
|
||||||
log.error("Failed to update Support RIM", ex);
|
log.error("Failed to update Support RIM", ex);
|
||||||
}
|
}
|
||||||
@ -500,8 +505,8 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
*/
|
*/
|
||||||
private static HashMap<String, Object> getMeasurementsRimInfo(
|
private static HashMap<String, Object> getMeasurementsRimInfo(
|
||||||
final EventLogMeasurements measurements,
|
final EventLogMeasurements measurements,
|
||||||
final ReferenceManifestService referenceManifestManager,
|
final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
final ReferenceDigestValueService referenceEventManager)
|
final ReferenceDigestValueServiceImpl referenceEventManager)
|
||||||
throws IOException, CertificateException, NoSuchAlgorithmException {
|
throws IOException, CertificateException, NoSuchAlgorithmException {
|
||||||
HashMap<String, Object> data = new HashMap<>();
|
HashMap<String, Object> data = new HashMap<>();
|
||||||
LinkedList<TpmPcrEvent> livelogEvents = new LinkedList<>();
|
LinkedList<TpmPcrEvent> livelogEvents = new LinkedList<>();
|
||||||
@ -543,7 +548,7 @@ public class ReferenceManifestDetailsPageController extends PageController<Refer
|
|||||||
data.put("associatedRim", base.getId());
|
data.put("associatedRim", base.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
eventValues.addAll(referenceEventManager.getValuesByRimId(base));
|
eventValues.addAll(referenceEventManager.getValuesByRimId(base.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,25 +1,34 @@
|
|||||||
package hirs.attestationca.portal.page.controllers;
|
package hirs.attestationca.portal.page.controllers;
|
||||||
|
|
||||||
import hirs.attestationca.persist.CriteriaModifier;
|
import hirs.attestationca.persist.CriteriaModifier;
|
||||||
|
import hirs.attestationca.persist.DBManagerException;
|
||||||
import hirs.attestationca.persist.FilteredRecordsList;
|
import hirs.attestationca.persist.FilteredRecordsList;
|
||||||
|
import hirs.attestationca.persist.entity.manager.ReferenceDigestValueRepository;
|
||||||
|
import hirs.attestationca.persist.entity.manager.ReferenceManifestRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
import hirs.attestationca.persist.entity.userdefined.Certificate;
|
||||||
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
import hirs.attestationca.persist.entity.userdefined.ReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.ReferenceDigestValueService;
|
import hirs.attestationca.persist.entity.userdefined.rim.BaseReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.ReferenceDigestValueServiceImpl;
|
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestService;
|
import hirs.attestationca.persist.entity.userdefined.rim.SupportReferenceManifest;
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
|
||||||
import hirs.attestationca.portal.datatables.DataTableInput;
|
import hirs.attestationca.portal.datatables.DataTableInput;
|
||||||
import hirs.attestationca.portal.datatables.DataTableResponse;
|
import hirs.attestationca.portal.datatables.DataTableResponse;
|
||||||
import hirs.attestationca.portal.datatables.OrderedListQueryDataTableAdapter;
|
import hirs.attestationca.portal.datatables.OrderedListQueryDataTableAdapter;
|
||||||
import hirs.attestationca.portal.page.Page;
|
import hirs.attestationca.portal.page.Page;
|
||||||
import hirs.attestationca.portal.page.PageController;
|
import hirs.attestationca.portal.page.PageController;
|
||||||
|
import hirs.attestationca.portal.page.PageMessages;
|
||||||
import hirs.attestationca.portal.page.params.NoPageParams;
|
import hirs.attestationca.portal.page.params.NoPageParams;
|
||||||
|
import hirs.utils.SwidResource;
|
||||||
|
import hirs.utils.tpm.eventlog.TCGEventLog;
|
||||||
|
import hirs.utils.tpm.eventlog.TpmPcrEvent;
|
||||||
import jakarta.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
import jakarta.persistence.criteria.CriteriaQuery;
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
import jakarta.persistence.criteria.Root;
|
import jakarta.persistence.criteria.Root;
|
||||||
|
import jakarta.servlet.annotation.MultipartConfig;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
import org.apache.commons.codec.binary.Hex;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
@ -27,38 +36,62 @@ import org.springframework.stereotype.Controller;
|
|||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||||
|
import org.springframework.web.servlet.view.RedirectView;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.ref.Reference;
|
import java.lang.ref.Reference;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for the Reference Manifest page.
|
* Controller for the Reference Manifest page.
|
||||||
*/
|
*/
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Controller
|
@Controller
|
||||||
|
@MultipartConfig
|
||||||
@RequestMapping("/reference-manifests")
|
@RequestMapping("/reference-manifests")
|
||||||
public class ReferenceManifestPageController extends PageController<NoPageParams> {
|
public class ReferenceManifestPageController extends PageController<NoPageParams> {
|
||||||
|
|
||||||
|
private static final String LOG_FILE_PATTERN = "([^\\s]+(\\.(?i)(rimpcr|rimel|bin|log))$)";
|
||||||
|
|
||||||
@Autowired(required = false)
|
@Autowired(required = false)
|
||||||
private EntityManager entityManager;
|
private EntityManager entityManager;
|
||||||
|
|
||||||
private final ReferenceManifestService referenceManifestManager;
|
private final ReferenceManifestRepository referenceManifestRepository;
|
||||||
private final ReferenceDigestValueService referenceEventManager;
|
private final ReferenceDigestValueRepository referenceDigestValueRepository;
|
||||||
|
// private final ReferenceManifestServiceImpl referenceManifestManager;
|
||||||
|
// private final ReferenceDigestValueServiceImpl referenceEventManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor providing the Page's display and routing specification.
|
* Constructor providing the Page's display and routing specification.
|
||||||
*
|
*
|
||||||
* @param referenceManifestManager the reference manifest manager
|
* @param referenceManifestRepository the reference manifest manager
|
||||||
* @param referenceEventManager this is the reference event manager
|
* @param referenceDigestValueRepository this is the reference event manager
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
public ReferenceManifestPageController(
|
public ReferenceManifestPageController(final ReferenceManifestRepository referenceManifestRepository,
|
||||||
final ReferenceManifestServiceImpl referenceManifestManager,
|
final ReferenceDigestValueRepository referenceDigestValueRepository
|
||||||
final ReferenceDigestValueServiceImpl referenceEventManager) {
|
// final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
|
// final ReferenceDigestValueServiceImpl referenceEventManager
|
||||||
|
) {
|
||||||
super(Page.REFERENCE_MANIFESTS);
|
super(Page.REFERENCE_MANIFESTS);
|
||||||
this.referenceManifestManager = referenceManifestManager;
|
this.referenceManifestRepository = referenceManifestRepository;
|
||||||
this.referenceEventManager = referenceEventManager;
|
this.referenceDigestValueRepository = referenceDigestValueRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -111,10 +144,359 @@ public class ReferenceManifestPageController extends PageController<NoPageParams
|
|||||||
FilteredRecordsList<ReferenceManifest> records
|
FilteredRecordsList<ReferenceManifest> records
|
||||||
= OrderedListQueryDataTableAdapter.getOrderedList(
|
= OrderedListQueryDataTableAdapter.getOrderedList(
|
||||||
ReferenceManifest.class,
|
ReferenceManifest.class,
|
||||||
referenceManifestManager,
|
null,
|
||||||
input, orderColumnName, criteriaModifier);
|
input, orderColumnName, criteriaModifier);
|
||||||
|
|
||||||
log.debug("Returning list of size: " + records.size());
|
log.debug("Returning list of size: " + records.size());
|
||||||
return new DataTableResponse<>(records, input);
|
return new DataTableResponse<>(records, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upload and processes a reference manifest(s).
|
||||||
|
*
|
||||||
|
* @param files the files to process
|
||||||
|
* @param attr the redirection attributes
|
||||||
|
* @return the redirection view
|
||||||
|
* @throws URISyntaxException if malformed URI
|
||||||
|
* @throws Exception if malformed URI
|
||||||
|
*/
|
||||||
|
@RequestMapping(value = "/upload", method = RequestMethod.POST)
|
||||||
|
protected RedirectView upload(
|
||||||
|
@RequestParam("files") final MultipartFile[] files,
|
||||||
|
final RedirectAttributes attr) throws URISyntaxException, Exception {
|
||||||
|
Map<String, Object> model = new HashMap<>();
|
||||||
|
PageMessages messages = new PageMessages();
|
||||||
|
String fileName;
|
||||||
|
Pattern logPattern = Pattern.compile(LOG_FILE_PATTERN);
|
||||||
|
Matcher matcher;
|
||||||
|
boolean supportRIM = false;
|
||||||
|
List<BaseReferenceManifest> baseRims = new ArrayList<>();
|
||||||
|
List<SupportReferenceManifest> supportRims = new ArrayList<>();
|
||||||
|
|
||||||
|
// loop through the files
|
||||||
|
for (MultipartFile file : files) {
|
||||||
|
fileName = file.getOriginalFilename();
|
||||||
|
matcher = logPattern.matcher(fileName);
|
||||||
|
supportRIM = matcher.matches();
|
||||||
|
|
||||||
|
//Parse reference manifests
|
||||||
|
parseRIM(file, supportRIM, messages, baseRims, supportRims);
|
||||||
|
}
|
||||||
|
baseRims.stream().forEach((rim) -> {
|
||||||
|
log.info(String.format("Storing swidtag %s", rim.getFileName()));
|
||||||
|
storeManifest(messages, rim, false);
|
||||||
|
});
|
||||||
|
supportRims.stream().forEach((rim) -> {
|
||||||
|
log.info(String.format("Storing event log %s", rim.getFileName()));
|
||||||
|
storeManifest(messages, rim, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Prep a map to associated the swidtag payload hash to the swidtag.
|
||||||
|
// pass it in to update support rims that either were uploaded
|
||||||
|
// or already exist
|
||||||
|
// create a map of the supports rims in case an uploaded swidtag
|
||||||
|
// isn't one to one with the uploaded support rims.
|
||||||
|
Map<String, SupportReferenceManifest> updatedSupportRims
|
||||||
|
= updateSupportRimInfo(generatePayloadHashMap(baseRims));
|
||||||
|
|
||||||
|
// look for missing uploaded support rims
|
||||||
|
// for (SupportReferenceManifest support : supportRims) {
|
||||||
|
// if (!updatedSupportRims.containsKey(support.getHexDecHash())) {
|
||||||
|
// // Make sure we are getting the db version of the file
|
||||||
|
// updatedSupportRims.put(support.getHexDecHash(),
|
||||||
|
// SupportReferenceManifest
|
||||||
|
// .select(referenceManifestManager)
|
||||||
|
// .byHexDecHash(support.getHexDecHash())
|
||||||
|
// .getRIM());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// pass in the updated support rims
|
||||||
|
// and either update or add the events
|
||||||
|
processTpmEvents(new ArrayList<SupportReferenceManifest>(updatedSupportRims.values()));
|
||||||
|
|
||||||
|
//Add messages to the model
|
||||||
|
model.put(MESSAGES_ATTRIBUTE, messages);
|
||||||
|
|
||||||
|
return redirectTo(Page.REFERENCE_MANIFESTS,
|
||||||
|
new NoPageParams(), model, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method takes the parameter and looks for this information in the
|
||||||
|
* Database.
|
||||||
|
*
|
||||||
|
* @param id of the RIM
|
||||||
|
* @return the associated RIM from the DB
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
*/
|
||||||
|
private ReferenceManifest getRimFromDb(final String id) throws IllegalArgumentException {
|
||||||
|
UUID uuid = UUID.fromString(id);
|
||||||
|
// ReferenceManifest rim = BaseReferenceManifest.select(referenceManifestManager)
|
||||||
|
// .byEntityId(uuid).getRIM();
|
||||||
|
//
|
||||||
|
// if (rim == null) {
|
||||||
|
// rim = SupportReferenceManifest.select(referenceManifestManager)
|
||||||
|
// .byEntityId(uuid).getRIM();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (rim == null) {
|
||||||
|
// rim = EventLogMeasurements.select(referenceManifestManager)
|
||||||
|
// .byEntityId(uuid).getRIM();
|
||||||
|
// }
|
||||||
|
|
||||||
|
return this.referenceManifestRepository.getReferenceById(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes the rim files provided and returns a {@link ReferenceManifest}
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @param file the provide user file via browser.
|
||||||
|
* @param supportRIM matcher result
|
||||||
|
* @param messages the object that handles displaying information to the
|
||||||
|
* user.
|
||||||
|
* @param baseRims object to store multiple files
|
||||||
|
* @param supportRims object to store multiple files
|
||||||
|
* @return a single or collection of reference manifest files.
|
||||||
|
*/
|
||||||
|
private void parseRIM(
|
||||||
|
final MultipartFile file, final boolean supportRIM,
|
||||||
|
final PageMessages messages, final List<BaseReferenceManifest> baseRims,
|
||||||
|
final List<SupportReferenceManifest> supportRims) {
|
||||||
|
|
||||||
|
byte[] fileBytes = new byte[0];
|
||||||
|
String fileName = file.getOriginalFilename();
|
||||||
|
|
||||||
|
// build the manifest from the uploaded bytes
|
||||||
|
try {
|
||||||
|
fileBytes = file.getBytes();
|
||||||
|
} catch (IOException e) {
|
||||||
|
final String failMessage
|
||||||
|
= String.format("Failed to read uploaded file (%s): ", fileName);
|
||||||
|
log.error(failMessage, e);
|
||||||
|
messages.addError(failMessage + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (supportRIM) {
|
||||||
|
supportRims.add(new SupportReferenceManifest(fileName, fileBytes));
|
||||||
|
} else {
|
||||||
|
baseRims.add(new BaseReferenceManifest(fileName, fileBytes));
|
||||||
|
}
|
||||||
|
} catch (IOException ioEx) {
|
||||||
|
final String failMessage
|
||||||
|
= String.format("Failed to parse uploaded file (%s): ", fileName);
|
||||||
|
log.error(failMessage, ioEx);
|
||||||
|
messages.addError(failMessage + ioEx.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores the {@link ReferenceManifest} objects.
|
||||||
|
*
|
||||||
|
* @param messages message object for user display of statuses
|
||||||
|
* @param referenceManifest the object to store
|
||||||
|
* @param supportRim boolean flag indicating if this is a support RIM
|
||||||
|
* process.
|
||||||
|
*/
|
||||||
|
private void storeManifest(
|
||||||
|
final PageMessages messages,
|
||||||
|
final ReferenceManifest referenceManifest,
|
||||||
|
final boolean supportRim) {
|
||||||
|
|
||||||
|
ReferenceManifest existingManifest = null;
|
||||||
|
String fileName = referenceManifest.getFileName();
|
||||||
|
MessageDigest digest = null;
|
||||||
|
String rimHash = "";
|
||||||
|
try {
|
||||||
|
digest = MessageDigest.getInstance("SHA-256");
|
||||||
|
} catch (NoSuchAlgorithmException noSaEx) {
|
||||||
|
log.error(noSaEx);
|
||||||
|
}
|
||||||
|
|
||||||
|
// look for existing manifest in the database
|
||||||
|
try {
|
||||||
|
if (supportRim) {
|
||||||
|
if (digest != null) {
|
||||||
|
rimHash = Hex.encodeHexString(
|
||||||
|
digest.digest(referenceManifest.getRimBytes()));
|
||||||
|
}
|
||||||
|
existingManifest = referenceManifestRepository.findByHash(rimHash, ReferenceManifest.SUPPORT_RIM);
|
||||||
|
// SupportReferenceManifest
|
||||||
|
// .select(referenceManifestManager)
|
||||||
|
// .byHexDecHash(rimHash)
|
||||||
|
// .includeArchived()
|
||||||
|
// .getRIM();
|
||||||
|
} else {
|
||||||
|
if (digest != null) {
|
||||||
|
rimHash = Base64.encodeBase64String(
|
||||||
|
digest.digest(referenceManifest.getRimBytes()));
|
||||||
|
}
|
||||||
|
existingManifest = referenceManifestRepository.findByHash(rimHash, ReferenceManifest.BASE_RIM);
|
||||||
|
// BaseReferenceManifest
|
||||||
|
// .select(referenceManifestManager).byBase64Hash(rimHash)
|
||||||
|
// .includeArchived()
|
||||||
|
// .getRIM();
|
||||||
|
}
|
||||||
|
} catch (DBManagerException dbMEx) {
|
||||||
|
final String failMessage = String.format("Querying for existing certificate "
|
||||||
|
+ "failed (%s): ", fileName);
|
||||||
|
messages.addError(failMessage + dbMEx.getMessage());
|
||||||
|
log.error(failMessage, dbMEx);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// save the new certificate if no match is found
|
||||||
|
if (existingManifest == null) {
|
||||||
|
referenceManifestRepository.save(referenceManifest);
|
||||||
|
|
||||||
|
final String successMsg = String.format("RIM successfully uploaded (%s): ",
|
||||||
|
fileName);
|
||||||
|
messages.addSuccess(successMsg);
|
||||||
|
log.info(successMsg);
|
||||||
|
}
|
||||||
|
} catch (DBManagerException dbmEx) {
|
||||||
|
final String failMessage = String.format("Storing RIM failed (%s): ",
|
||||||
|
fileName);
|
||||||
|
messages.addError(failMessage + dbmEx.getMessage());
|
||||||
|
log.error(failMessage, dbmEx);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// if an identical RIM is archived, update the existing RIM to
|
||||||
|
// unarchive it and change the creation date
|
||||||
|
if (existingManifest != null && existingManifest.isArchived()) {
|
||||||
|
existingManifest.restore();
|
||||||
|
existingManifest.resetCreateTime();
|
||||||
|
referenceManifestRepository.save(existingManifest);
|
||||||
|
|
||||||
|
final String successMsg
|
||||||
|
= String.format("Pre-existing RIM found and unarchived (%s): ", fileName);
|
||||||
|
messages.addSuccess(successMsg);
|
||||||
|
log.info(successMsg);
|
||||||
|
}
|
||||||
|
} catch (DBManagerException dbmEx) {
|
||||||
|
final String failMessage = String.format("Found an identical pre-existing RIM in the "
|
||||||
|
+ "archive, but failed to unarchive it (%s): ", fileName);
|
||||||
|
messages.addError(failMessage + dbmEx.getMessage());
|
||||||
|
log.error(failMessage, dbmEx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, BaseReferenceManifest> generatePayloadHashMap(
|
||||||
|
final List<BaseReferenceManifest> uploadedBaseRims) {
|
||||||
|
BaseReferenceManifest dbBaseRim;
|
||||||
|
HashMap<String, BaseReferenceManifest> tempMap = new HashMap<>();
|
||||||
|
for (BaseReferenceManifest base : uploadedBaseRims) {
|
||||||
|
// this is done to make sure we have the version with the UUID
|
||||||
|
dbBaseRim = (BaseReferenceManifest) referenceManifestRepository.findByHash(base.getBase64Hash(), ReferenceManifest.BASE_RIM);
|
||||||
|
// BaseReferenceManifest.select(referenceManifestManager)
|
||||||
|
// .byBase64Hash(base.getBase64Hash()).getRIM();
|
||||||
|
if (dbBaseRim != null) {
|
||||||
|
for (SwidResource swid : dbBaseRim.parseResource()) {
|
||||||
|
tempMap.put(swid.getHashValue(), dbBaseRim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tempMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, SupportReferenceManifest> updateSupportRimInfo(
|
||||||
|
final Map<String, BaseReferenceManifest> dbBaseRims) {
|
||||||
|
BaseReferenceManifest dbBaseRim;
|
||||||
|
SupportReferenceManifest supportRim;
|
||||||
|
Map<String, SupportReferenceManifest> updatedSupportRims = new HashMap<>();
|
||||||
|
List<String> hashValues = new LinkedList<>(dbBaseRims.keySet());
|
||||||
|
for (String supportHash : hashValues) {
|
||||||
|
supportRim = (SupportReferenceManifest) referenceManifestRepository.findByHash(supportHash, ReferenceManifest.SUPPORT_RIM);
|
||||||
|
// SupportReferenceManifest.select(referenceManifestManager)
|
||||||
|
// .byHexDecHash(supportHash).getRIM();
|
||||||
|
// I have to assume the baseRim is from the database
|
||||||
|
// Updating the id values, manufacturer, model
|
||||||
|
if (supportRim != null && !supportRim.isUpdated()) {
|
||||||
|
dbBaseRim = dbBaseRims.get(supportHash);
|
||||||
|
supportRim.setSwidTagVersion(dbBaseRim.getSwidTagVersion());
|
||||||
|
supportRim.setPlatformManufacturer(dbBaseRim.getPlatformManufacturer());
|
||||||
|
supportRim.setPlatformModel(dbBaseRim.getPlatformModel());
|
||||||
|
supportRim.setTagId(dbBaseRim.getTagId());
|
||||||
|
supportRim.setAssociatedRim(dbBaseRim.getId());
|
||||||
|
supportRim.setUpdated(true);
|
||||||
|
referenceManifestRepository.save(supportRim);
|
||||||
|
updatedSupportRims.put(supportHash, supportRim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return updatedSupportRims;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the support rim is a supplemental or base, this method looks for the
|
||||||
|
* original oem base rim to associate with each event.
|
||||||
|
* @param supportRim assumed db object
|
||||||
|
* @return reference to the base rim
|
||||||
|
*/
|
||||||
|
private ReferenceManifest findBaseRim(final SupportReferenceManifest supportRim) {
|
||||||
|
if (supportRim != null && (supportRim.getId() != null
|
||||||
|
&& !supportRim.getId().toString().equals(""))) {
|
||||||
|
List<BaseReferenceManifest> baseRims = this.referenceManifestRepository.getBaseByManufacturerModel(supportRim.getPlatformManufacturer(), supportRim.getPlatformModel());
|
||||||
|
// Set<BaseReferenceManifest> baseRims = BaseReferenceManifest
|
||||||
|
// .select(referenceManifestManager)
|
||||||
|
// .byManufacturerModel(supportRim.getPlatformManufacturer(),
|
||||||
|
// supportRim.getPlatformModel()).getRIMs();
|
||||||
|
|
||||||
|
for (BaseReferenceManifest base : baseRims) {
|
||||||
|
if (base.isBase()) {
|
||||||
|
// there should be only one
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processTpmEvents(final List<SupportReferenceManifest> dbSupportRims) {
|
||||||
|
List<ReferenceDigestValue> tpmEvents;
|
||||||
|
TCGEventLog logProcessor = null;
|
||||||
|
ReferenceManifest baseRim;
|
||||||
|
|
||||||
|
for (SupportReferenceManifest dbSupport : dbSupportRims) {
|
||||||
|
// So first we'll have to pull values based on support rim
|
||||||
|
// get by support rim id NEXT
|
||||||
|
|
||||||
|
if (dbSupport.getPlatformManufacturer() != null) {
|
||||||
|
tpmEvents = referenceDigestValueRepository.getValuesBySupportRimId(dbSupport.getAssociatedRim());
|
||||||
|
baseRim = findBaseRim(dbSupport);
|
||||||
|
if (tpmEvents.isEmpty()) {
|
||||||
|
ReferenceDigestValue rdv;
|
||||||
|
try {
|
||||||
|
logProcessor = new TCGEventLog(dbSupport.getRimBytes());
|
||||||
|
for (TpmPcrEvent tpe : logProcessor.getEventList()) {
|
||||||
|
rdv = new ReferenceDigestValue(baseRim.getId(),
|
||||||
|
dbSupport.getId(), dbSupport.getPlatformManufacturer(),
|
||||||
|
dbSupport.getPlatformModel(), tpe.getPcrIndex(),
|
||||||
|
tpe.getEventDigestStr(), tpe.getEventTypeStr(),
|
||||||
|
false, false, true, tpe.getEventContent());
|
||||||
|
|
||||||
|
this.referenceDigestValueRepository.save(rdv);
|
||||||
|
}
|
||||||
|
} catch (CertificateException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (ReferenceDigestValue rdv : tpmEvents) {
|
||||||
|
if (!rdv.isUpdated()) {
|
||||||
|
rdv.updateInfo(dbSupport, baseRim.getId());
|
||||||
|
this.referenceDigestValueRepository.save(rdv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
package hirs.attestationca.portal.page.controllers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restful implementation of the {@link }.
|
||||||
|
* Exposes the ACA methods as REST endpoints.
|
||||||
|
*/
|
||||||
|
//@RestController
|
||||||
|
//@RequestMapping("/")
|
||||||
|
public class RestfulAttestationCertificateAuthority {
|
||||||
|
// private final ReferenceManifestRepository referenceManifestRepository;
|
||||||
|
// private final ReferenceDigestValueRepository referenceDigestValueRepository;
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// public RestfulAttestationCertificateAuthority(
|
||||||
|
// final ReferenceManifestRepository referenceManifestRepository,
|
||||||
|
// final ReferenceDigestValueRepository referenceDigestValueRepository) {
|
||||||
|
//
|
||||||
|
// this.referenceManifestRepository = referenceManifestRepository;
|
||||||
|
// this.referenceDigestValueRepository = referenceDigestValueRepository;
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @ResponseBody
|
||||||
|
// @RequestMapping(value = "/upload-swidtag", method = RequestMethod.POST, consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
||||||
|
// public byte[] uploadSwidtag(@RequestBody final byte[] request) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @ResponseBody
|
||||||
|
// @RequestMapping(value = "/upload-rimel", method = RequestMethod.POST, consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
||||||
|
// public byte[] uploadRimel(@RequestBody final byte[] request) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
}
|
@ -1,17 +1,14 @@
|
|||||||
package hirs.attestationca.portal.page.controllers;
|
package hirs.attestationca.portal.page.controllers;
|
||||||
|
|
||||||
|
import hirs.attestationca.persist.entity.manager.ReferenceDigestValueRepository;
|
||||||
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
import hirs.attestationca.persist.entity.userdefined.rim.ReferenceDigestValue;
|
||||||
import hirs.attestationca.persist.service.ReferenceDigestValueService;
|
import hirs.attestationca.portal.datatables.DataTableInput;
|
||||||
import hirs.attestationca.persist.service.ReferenceDigestValueServiceImpl;
|
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestService;
|
|
||||||
import hirs.attestationca.persist.service.ReferenceManifestServiceImpl;
|
|
||||||
import hirs.attestationca.portal.page.Page;
|
import hirs.attestationca.portal.page.Page;
|
||||||
import hirs.attestationca.portal.page.PageController;
|
import hirs.attestationca.portal.page.PageController;
|
||||||
import hirs.attestationca.portal.page.params.NoPageParams;
|
import hirs.attestationca.portal.page.params.NoPageParams;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.jpa.datatables.mapping.DataTablesInput;
|
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
@ -30,21 +27,24 @@ import java.util.List;
|
|||||||
@RequestMapping("/rim-database")
|
@RequestMapping("/rim-database")
|
||||||
public class RimDatabasePageController extends PageController<NoPageParams> {
|
public class RimDatabasePageController extends PageController<NoPageParams> {
|
||||||
|
|
||||||
private final ReferenceManifestService referenceManifestManager;
|
private final ReferenceDigestValueRepository referenceDigestValueRepository;
|
||||||
private final ReferenceDigestValueService referenceEventManager;
|
// private final ReferenceManifestServiceImpl referenceManifestManager;
|
||||||
|
// private final ReferenceDigestValueServiceImpl referenceEventManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor providing the Page's display and routing specification.
|
* Constructor providing the Page's display and routing specification.
|
||||||
*
|
*
|
||||||
* @param referenceManifestManager the ReferenceManifestManager object
|
* @param referenceDigestValueRepository the referenceDigestValueRepository object
|
||||||
* @param referenceEventManager the referenceEventManager object
|
// * @param referenceEventManager the referenceEventManager object
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
public RimDatabasePageController(final ReferenceManifestServiceImpl referenceManifestManager,
|
public RimDatabasePageController(final ReferenceDigestValueRepository referenceDigestValueRepository
|
||||||
final ReferenceDigestValueServiceImpl referenceEventManager) {
|
// , final ReferenceManifestServiceImpl referenceManifestManager,
|
||||||
|
// final ReferenceDigestValueServiceImpl referenceEventManager
|
||||||
|
) {
|
||||||
super(Page.RIM_DATABASE);
|
super(Page.RIM_DATABASE);
|
||||||
this.referenceManifestManager = referenceManifestManager;
|
this.referenceDigestValueRepository = referenceDigestValueRepository;
|
||||||
this.referenceEventManager = referenceEventManager;
|
// this.referenceEventManager = referenceEventManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,10 +74,10 @@ public class RimDatabasePageController extends PageController<NoPageParams> {
|
|||||||
produces = MediaType.APPLICATION_JSON_VALUE,
|
produces = MediaType.APPLICATION_JSON_VALUE,
|
||||||
method = RequestMethod.GET)
|
method = RequestMethod.GET)
|
||||||
public List<ReferenceDigestValue> getTableData(
|
public List<ReferenceDigestValue> getTableData(
|
||||||
@Valid final DataTablesInput input) {
|
@Valid final DataTableInput input) {
|
||||||
log.info("Handling request for summary list: " + input);
|
log.info("Handling request for summary list: " + input);
|
||||||
|
|
||||||
return this.referenceEventManager.fetchDigestValues();
|
return this.referenceDigestValueRepository.listAll();
|
||||||
|
|
||||||
|
|
||||||
// String orderColumnName = input.getOrderColumnName();
|
// String orderColumnName = input.getOrderColumnName();
|
||||||
|
@ -56,11 +56,11 @@ public final class CertificateStringMapBuilder {
|
|||||||
* Returns the Certificate Authority information.
|
* Returns the Certificate Authority information.
|
||||||
*
|
*
|
||||||
* @param uuid ID for the certificate.
|
* @param uuid ID for the certificate.
|
||||||
* @param certificateServiceImpl the certificate manager for retrieving certs.
|
* @param certificateService the certificate manager for retrieving certs.
|
||||||
* @return a hash map with the endorsement certificate information.
|
* @return a hash map with the endorsement certificate information.
|
||||||
*/
|
*/
|
||||||
public static HashMap<String, String> getCertificateAuthorityInformation(final UUID uuid,
|
public static HashMap<String, String> getCertificateAuthorityInformation(final UUID uuid,
|
||||||
final CertificateServiceImpl certificateServiceImpl) {
|
final CertificateServiceImpl certificateService) {
|
||||||
// CertificateAuthorityCredential certificate =
|
// CertificateAuthorityCredential certificate =
|
||||||
// CertificateAuthorityCredential
|
// CertificateAuthorityCredential
|
||||||
// .select(certificateManager)
|
// .select(certificateManager)
|
||||||
@ -77,12 +77,12 @@ public final class CertificateStringMapBuilder {
|
|||||||
* Returns the Trust Chain credential information.
|
* Returns the Trust Chain credential information.
|
||||||
*
|
*
|
||||||
* @param certificate the certificate
|
* @param certificate the certificate
|
||||||
* @param certificateServiceImpl the certificate manager for retrieving certs.
|
* @param certificateService the certificate manager for retrieving certs.
|
||||||
* @return a hash map with the endorsement certificate information.
|
* @return a hash map with the endorsement certificate information.
|
||||||
*/
|
*/
|
||||||
public static HashMap<String, String> getCertificateAuthorityInformation(
|
public static HashMap<String, String> getCertificateAuthorityInformation(
|
||||||
final CertificateAuthorityCredential certificate,
|
final CertificateAuthorityCredential certificate,
|
||||||
final CertificateServiceImpl certificateServiceImpl) {
|
final CertificateServiceImpl certificateService) {
|
||||||
// return getCertificateAuthorityInfoHelper(certificateManager, certificate,
|
// return getCertificateAuthorityInfoHelper(certificateManager, certificate,
|
||||||
// "No cert provided for mapping");
|
// "No cert provided for mapping");
|
||||||
return null;
|
return null;
|
||||||
@ -100,11 +100,11 @@ public final class CertificateStringMapBuilder {
|
|||||||
* Returns the endorsement credential information.
|
* Returns the endorsement credential information.
|
||||||
*
|
*
|
||||||
* @param uuid ID for the certificate.
|
* @param uuid ID for the certificate.
|
||||||
* @param certificateServiceImpl the certificate manager for retrieving certs.
|
* @param certificateService the certificate manager for retrieving certs.
|
||||||
* @return a hash map with the endorsement certificate information.
|
* @return a hash map with the endorsement certificate information.
|
||||||
*/
|
*/
|
||||||
public static HashMap<String, String> getEndorsementInformation(final UUID uuid,
|
public static HashMap<String, String> getEndorsementInformation(final UUID uuid,
|
||||||
final CertificateServiceImpl certificateServiceImpl) {
|
final CertificateServiceImpl certificateService) {
|
||||||
HashMap<String, String> data = new HashMap<>();
|
HashMap<String, String> data = new HashMap<>();
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
@ -114,13 +114,13 @@ public final class CertificateStringMapBuilder {
|
|||||||
* Returns the Platform credential information.
|
* Returns the Platform credential information.
|
||||||
*
|
*
|
||||||
* @param uuid ID for the certificate.
|
* @param uuid ID for the certificate.
|
||||||
* @param certificateServiceImpl the certificate manager for retrieving certs.
|
* @param certificateService the certificate manager for retrieving certs.
|
||||||
* @return a hash map with the endorsement certificate information.
|
* @return a hash map with the endorsement certificate information.
|
||||||
* @throws IOException when parsing the certificate
|
* @throws IOException when parsing the certificate
|
||||||
* @throws IllegalArgumentException invalid argument on parsing the certificate
|
* @throws IllegalArgumentException invalid argument on parsing the certificate
|
||||||
*/
|
*/
|
||||||
public static HashMap<String, Object> getPlatformInformation(final UUID uuid,
|
public static HashMap<String, Object> getPlatformInformation(final UUID uuid,
|
||||||
final CertificateServiceImpl certificateServiceImpl)
|
final CertificateServiceImpl certificateService)
|
||||||
throws IllegalArgumentException, IOException {
|
throws IllegalArgumentException, IOException {
|
||||||
HashMap<String, Object> data = new HashMap<>();
|
HashMap<String, Object> data = new HashMap<>();
|
||||||
|
|
||||||
@ -158,11 +158,11 @@ public final class CertificateStringMapBuilder {
|
|||||||
* Returns the Issued Attestation Certificate information.
|
* Returns the Issued Attestation Certificate information.
|
||||||
*
|
*
|
||||||
* @param uuid ID for the certificate.
|
* @param uuid ID for the certificate.
|
||||||
* @param certificateServiceImpl the certificate manager for retrieving certs.
|
* @param certificateService the certificate manager for retrieving certs.
|
||||||
* @return a hash map with the endorsement certificate information.
|
* @return a hash map with the endorsement certificate information.
|
||||||
*/
|
*/
|
||||||
public static HashMap<String, String> getIssuedInformation(final UUID uuid,
|
public static HashMap<String, String> getIssuedInformation(final UUID uuid,
|
||||||
final CertificateServiceImpl certificateServiceImpl) {
|
final CertificateServiceImpl certificateService) {
|
||||||
HashMap<String, String> data = new HashMap<>();
|
HashMap<String, String> data = new HashMap<>();
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
@ -1,18 +1,22 @@
|
|||||||
|
|
||||||
server.error.path=/error
|
server.error.path=/error
|
||||||
|
spring.http.multipart=true
|
||||||
|
spring.http.multipart.max-file-size=-1
|
||||||
spring.mvc.view.prefix=/WEB-INF/jsp/
|
spring.mvc.view.prefix=/WEB-INF/jsp/
|
||||||
spring.mvc.view.suffix=.jsp
|
spring.mvc.view.suffix=.jsp
|
||||||
|
|
||||||
logging.level.org.springframework=INFO
|
spring.servlet.multipart.max-file-size=1MB
|
||||||
|
spring.servlet.multipart.max-request-size=1MB
|
||||||
|
spring.servlet.multipart.enabled=true
|
||||||
|
spring.servlet.multipart.location=${java.io.tmpdir}
|
||||||
|
|
||||||
|
logging.level.org.springframework=WARN
|
||||||
spring.jpa.hibernate.ddl-auto=update
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
spring.jpa.show-sql=false
|
||||||
|
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
|
||||||
spring.datasource.url=jdbc:mariadb://localhost:3306/hirs_db?autoReconnect=true&useSSL=false
|
spring.datasource.url=jdbc:mariadb://localhost:3306/hirs_db?autoReconnect=true&useSSL=false
|
||||||
spring.datasource.username=hirs_db
|
spring.datasource.username=hirs_db
|
||||||
spring.datasource.password=hirs_db
|
spring.datasource.password=hirs_db
|
||||||
jakarta.persistence.sharedCache.mode = UNSPECIFIED
|
jakarta.persistence.sharedCache.mode=UNSPECIFIED
|
||||||
|
|
||||||
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
|
|
||||||
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
|
||||||
#spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
|
|
||||||
|
|
||||||
server.tomcat.accesslog.enabled=true
|
server.tomcat.accesslog.enabled=true
|
||||||
server.tomcat.accesslog.directory=logs
|
server.tomcat.accesslog.directory=logs
|
||||||
|
@ -40,8 +40,8 @@
|
|||||||
<link type="text/css" rel="stylesheet" href="${common}/common.css"/>
|
<link type="text/css" rel="stylesheet" href="${common}/common.css"/>
|
||||||
<link type="text/css" rel="stylesheet" href="${common}/sidebar.css"/>
|
<link type="text/css" rel="stylesheet" href="${common}/sidebar.css"/>
|
||||||
|
|
||||||
<link type="text/css" rel="stylesheet" href="${lib}/bootstrap-3.3.7/css/bootstrap.min.css"/>
|
<link type="text/css" rel="stylesheet" href="${lib}/bootstrap-3.3.7/css/bootstrap.min.css" />
|
||||||
<link type="text/css" rel="stylesheet" href="${lib}/jquery.dataTables-1.10.13/media/css/jquery.dataTables.min.css"></link>
|
<link type="text/css" rel="stylesheet" href="${lib}/jquery.dataTables-1.10.13/media/css/jquery.dataTables.min.css" />
|
||||||
|
|
||||||
<%-- page-specific style --%>
|
<%-- page-specific style --%>
|
||||||
<jsp:invoke fragment="style"/>
|
<jsp:invoke fragment="style"/>
|
||||||
|
@ -10,10 +10,10 @@
|
|||||||
</welcome-file-list>
|
</welcome-file-list>
|
||||||
|
|
||||||
<!-- Specify the location of the LOG4J file -->
|
<!-- Specify the location of the LOG4J file -->
|
||||||
<context-param>
|
<!-- <context-param>-->
|
||||||
<param-name>log4j.configurationFile</param-name>
|
<!-- <param-name>log4j.configurationFile</param-name>-->
|
||||||
<param-value>classpath:log4j2-spring.xml</param-value>
|
<!-- <param-value>classpath:log4j2-spring.xml</param-value>-->
|
||||||
</context-param>
|
<!-- </context-param>-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Dispatches page requests via PageConfiguration to PageControllers
|
Dispatches page requests via PageConfiguration to PageControllers
|
||||||
@ -31,7 +31,12 @@
|
|||||||
<url-pattern>/portal/*</url-pattern>
|
<url-pattern>/portal/*</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<listener>
|
||||||
|
<listener-class>hirs.attestationca.portal.HIRSDbInitializer</listener-class>
|
||||||
|
</listener>
|
||||||
<error-page>
|
<error-page>
|
||||||
<location>/errors</location>
|
<location>/errors</location>
|
||||||
</error-page>
|
</error-page>
|
||||||
|
|
||||||
|
|
||||||
</web-app>
|
</web-app>
|
@ -0,0 +1,59 @@
|
|||||||
|
# DataTables plug-in for jQuery
|
||||||
|
|
||||||
|
DataTables is a table enhancing plug-in for the [jQuery](//jquery.com) Javascript library, adding sorting, paging and filtering abilities to plain HTML tables with minimal effort. The stated goal of DataTables is:
|
||||||
|
|
||||||
|
> To enhance the accessibility of data in HTML tables.
|
||||||
|
|
||||||
|
To meet this goal, DataTables is developed with two distinct groups of users in mind:
|
||||||
|
|
||||||
|
* You the developers using DataTables. For developers DataTables provides a wide array of options for how data should be obtained, displayed and acted upon, along with an extensive API for accessing and manipulating the table.
|
||||||
|
|
||||||
|
* End users. For those using the interface DataTables presents, actions to get the most from the information contained in tables, such as sorting and filtering, along with paging and scrolling of the data in table, are easy to use, intuitive and fast.
|
||||||
|
|
||||||
|
|
||||||
|
## Installing DataTables
|
||||||
|
|
||||||
|
To use DataTables, the primary way to obtain the software is to use the [DataTables downloader](//datatables.net/download). You can also include the individual files from the [DataTables CDN](//cdn.datatables.net). See the [documentation](//datatables.net/manual/installation) for full details.
|
||||||
|
|
||||||
|
### NPM and Bower
|
||||||
|
|
||||||
|
If you prefer to use a package manager such as NPM or Bower, distribution repositories are available with software built from this repository under the name `datatables.net`. Styling packages for Bootstrap, Foundation and other styling libraries are also available by adding a suffix to the package name.
|
||||||
|
|
||||||
|
Please see the DataTables [NPM](//datatables.net/download/npm) and [Bower](//datatables.net/download/bower) installation pages for further information. The [DataTables installation manual](//datatables.net/manual/installation) also has details on how to use package managers with DataTables.
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
In its simplest case, DataTables can be initialised with a single line of Javascript:
|
||||||
|
|
||||||
|
```js
|
||||||
|
$('table').dataTable();
|
||||||
|
```
|
||||||
|
|
||||||
|
where the jQuery selector is used to obtain a reference to the table you want to enhance with DataTables. Optional configuration parameters can be passed in to DataTables to have it perform certain actions by using a configuration object as the parameter passed in to the DataTables constructor. For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
$('table').dataTable( {
|
||||||
|
paginate: false,
|
||||||
|
scrollY: 300
|
||||||
|
} );
|
||||||
|
```
|
||||||
|
|
||||||
|
will disable paging and enable scrolling.
|
||||||
|
|
||||||
|
A full list of the options available for DataTables are available in the [documentation](//datatables.net).
|
||||||
|
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Full documentation of the DataTables options, API and plug-in interface are available on the [DataTables web-site](//datatables.net). The site also contains information on the wide variety of plug-ins that are available for DataTables, which can be used to enhance and customise your table even further.
|
||||||
|
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
Support for DataTables is available through the [DataTables forums](//datatables.net/forums) and [commercial support options](//datatables.net/support) are available.
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
DataTables is release under the [MIT license](//datatables.net/license). You are free to use, modify and distribute this software, as long as the copyright header is left intact (specifically the comment block which starts with `/*!`.
|
@ -0,0 +1,22 @@
|
|||||||
|
MIT license
|
||||||
|
|
||||||
|
Copyright (c) 2008-2015 SpryMedia Limited
|
||||||
|
http://datatables.net
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
@ -0,0 +1,39 @@
|
|||||||
|
# AutoFill
|
||||||
|
|
||||||
|
AutoFill adds an Excel data fill like option to a DataTable to click and drag over multiple cells, filling in information over the selected cells and incrementing numbers as needed.
|
||||||
|
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
To use AutoFill the best way to obtain the software is to use the [DataTables downloader](//datatables.net/download). You can also include the individual files from the [DataTables CDN](//cdn.datatables.net). See the [documentation](http://datatables.net/extensions/autofill/) for full details.
|
||||||
|
|
||||||
|
## NPM and Bower
|
||||||
|
|
||||||
|
If you prefer to use a package manager such as NPM or Bower, distribution repositories are available with software built from this repository under the name `datatables.net-autofill`. Styling packages for Bootstrap, Foundation and other styling libraries are also available by adding a suffix to the package name.
|
||||||
|
|
||||||
|
Please see the DataTables [NPM](//datatables.net/download/npm) and [Bower](//datatables.net/download/bower) installation pages for further information. The [DataTables installation manual](//datatables.net/manual/installation) also has details on how to use package managers with DataTables.
|
||||||
|
|
||||||
|
|
||||||
|
# Basic usage
|
||||||
|
|
||||||
|
AutoFill is initialised using the `autoFill` option in the DataTables constructor. Further options can be specified using this option as an object - see the documentation for details. For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
$(document).ready( function () {
|
||||||
|
$('#example').DataTable( {
|
||||||
|
autoFill: true
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Documentation / support
|
||||||
|
|
||||||
|
* [Documentation](https://datatables.net/extensions/autofill/)
|
||||||
|
* [DataTables support forums](http://datatables.net/forums)
|
||||||
|
|
||||||
|
|
||||||
|
# GitHub
|
||||||
|
|
||||||
|
If you fancy getting involved with the development of AutoFill and help make it better, please refer to its [GitHub repo](https://github.com/DataTables/AutoFill)
|
||||||
|
|
@ -0,0 +1,81 @@
|
|||||||
|
div.dt-autofill-handle {
|
||||||
|
position: absolute;
|
||||||
|
height: 8px;
|
||||||
|
width: 8px;
|
||||||
|
z-index: 102;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #337ab7;
|
||||||
|
background: #337ab7;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-select {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1001;
|
||||||
|
background-color: #337ab7;
|
||||||
|
background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.top, div.dt-autofill-select.bottom {
|
||||||
|
height: 3px;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.left, div.dt-autofill-select.right {
|
||||||
|
width: 3px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 500px;
|
||||||
|
margin-left: -250px;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 0 5px #555;
|
||||||
|
border: 2px solid #444;
|
||||||
|
z-index: 11;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 1.5em 2em;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul {
|
||||||
|
display: table;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:last-child div.dt-autofill-question, div.dt-autofill-list ul li:last-child div.dt-autofill-button {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:hover {
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question input[type=number] {
|
||||||
|
padding: 6px;
|
||||||
|
width: 30px;
|
||||||
|
margin: -2px 0;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-button {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #337ab7;background:#337ab7}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#337ab7;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list ul li{display:table-row}div.dt-autofill-list ul li:last-child div.dt-autofill-question,div.dt-autofill-list ul li:last-child div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul li:hover{background-color:#f6f6f6}div.dt-autofill-list div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-list div.dt-autofill-question input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}
|
@ -0,0 +1,81 @@
|
|||||||
|
div.dt-autofill-handle {
|
||||||
|
position: absolute;
|
||||||
|
height: 8px;
|
||||||
|
width: 8px;
|
||||||
|
z-index: 102;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #0275d8;
|
||||||
|
background: #0275d8;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-select {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1001;
|
||||||
|
background-color: #0275d8;
|
||||||
|
background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.top, div.dt-autofill-select.bottom {
|
||||||
|
height: 3px;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.left, div.dt-autofill-select.right {
|
||||||
|
width: 3px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 500px;
|
||||||
|
margin-left: -250px;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 0 5px #555;
|
||||||
|
border: 2px solid #444;
|
||||||
|
z-index: 11;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 1.5em 2em;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul {
|
||||||
|
display: table;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:last-child div.dt-autofill-question, div.dt-autofill-list ul li:last-child div.dt-autofill-button {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:hover {
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question input[type=number] {
|
||||||
|
padding: 6px;
|
||||||
|
width: 30px;
|
||||||
|
margin: -2px 0;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-button {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #0275d8;background:#0275d8}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#0275d8;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list ul li{display:table-row}div.dt-autofill-list ul li:last-child div.dt-autofill-question,div.dt-autofill-list ul li:last-child div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul li:hover{background-color:#f6f6f6}div.dt-autofill-list div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-list div.dt-autofill-question input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}
|
@ -0,0 +1,92 @@
|
|||||||
|
div.dt-autofill-handle {
|
||||||
|
position: absolute;
|
||||||
|
height: 8px;
|
||||||
|
width: 8px;
|
||||||
|
z-index: 102;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #316ad1;
|
||||||
|
background: linear-gradient(to bottom, #abcffb 0%, #4989de 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-select {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1001;
|
||||||
|
background-color: #4989de;
|
||||||
|
background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.top, div.dt-autofill-select.bottom {
|
||||||
|
height: 3px;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.left, div.dt-autofill-select.right {
|
||||||
|
width: 3px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 500px;
|
||||||
|
margin-left: -250px;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 0 5px #555;
|
||||||
|
border: 2px solid #444;
|
||||||
|
z-index: 11;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 1.5em 2em;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul {
|
||||||
|
display: table;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:last-child div.dt-autofill-question, div.dt-autofill-list ul li:last-child div.dt-autofill-button {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:hover {
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question input[type=number] {
|
||||||
|
padding: 6px;
|
||||||
|
width: 30px;
|
||||||
|
margin: -2px 0;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-button {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-button button {
|
||||||
|
color: white;
|
||||||
|
margin: 0;
|
||||||
|
padding: 6px 12px;
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #2e6da4;
|
||||||
|
background-color: #337ab7;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #316ad1;background:linear-gradient(to bottom, #abcffb 0%, #4989de 100%)}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#4989de;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list ul li{display:table-row}div.dt-autofill-list ul li:last-child div.dt-autofill-question,div.dt-autofill-list ul li:last-child div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul li:hover{background-color:#f6f6f6}div.dt-autofill-list div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-list div.dt-autofill-question input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-list div.dt-autofill-button button{color:white;margin:0;padding:6px 12px;text-align:center;border:1px solid #2e6da4;background-color:#337ab7;border-radius:4px;cursor:pointer;vertical-align:middle}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}
|
@ -0,0 +1,85 @@
|
|||||||
|
div.dt-autofill-handle {
|
||||||
|
position: absolute;
|
||||||
|
height: 8px;
|
||||||
|
width: 8px;
|
||||||
|
z-index: 102;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #008CBA;
|
||||||
|
background: #008CBA;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-select {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1001;
|
||||||
|
background-color: #008CBA;
|
||||||
|
background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.top, div.dt-autofill-select.bottom {
|
||||||
|
height: 3px;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.left, div.dt-autofill-select.right {
|
||||||
|
width: 3px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 500px;
|
||||||
|
margin-left: -250px;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 0 5px #555;
|
||||||
|
border: 2px solid #444;
|
||||||
|
z-index: 11;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 1.5em 2em;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul {
|
||||||
|
display: table;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:last-child div.dt-autofill-question, div.dt-autofill-list ul li:last-child div.dt-autofill-button {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:hover {
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question input[type=number] {
|
||||||
|
padding: 6px;
|
||||||
|
width: 30px;
|
||||||
|
margin: -2px 0;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-button {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list button {
|
||||||
|
margin: 0;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #008CBA;background:#008CBA}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#008CBA;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list ul li{display:table-row}div.dt-autofill-list ul li:last-child div.dt-autofill-question,div.dt-autofill-list ul li:last-child div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul li:hover{background-color:#f6f6f6}div.dt-autofill-list div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-list div.dt-autofill-question input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.dt-autofill-list button{margin:0}
|
@ -0,0 +1,85 @@
|
|||||||
|
div.dt-autofill-handle {
|
||||||
|
position: absolute;
|
||||||
|
height: 8px;
|
||||||
|
width: 8px;
|
||||||
|
z-index: 102;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #316ad1;
|
||||||
|
background: linear-gradient(to bottom, #abcffb 0%, #4989de 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-select {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1001;
|
||||||
|
background-color: #4989de;
|
||||||
|
background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.top, div.dt-autofill-select.bottom {
|
||||||
|
height: 3px;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.left, div.dt-autofill-select.right {
|
||||||
|
width: 3px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 500px;
|
||||||
|
margin-left: -250px;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 0 5px #555;
|
||||||
|
border: 2px solid #444;
|
||||||
|
z-index: 11;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 1.5em 2em;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul {
|
||||||
|
display: table;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:last-child div.dt-autofill-question, div.dt-autofill-list ul li:last-child div.dt-autofill-button {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:hover {
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question input[type=number] {
|
||||||
|
padding: 6px;
|
||||||
|
width: 30px;
|
||||||
|
margin: -2px 0;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-button {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list button {
|
||||||
|
padding: 0.35em 1em;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #316ad1;background:linear-gradient(to bottom, #abcffb 0%, #4989de 100%)}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#4989de;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list ul li{display:table-row}div.dt-autofill-list ul li:last-child div.dt-autofill-question,div.dt-autofill-list ul li:last-child div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul li:hover{background-color:#f6f6f6}div.dt-autofill-list div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-list div.dt-autofill-question input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.dt-autofill-list button{padding:0.35em 1em}
|
@ -0,0 +1,81 @@
|
|||||||
|
div.dt-autofill-handle {
|
||||||
|
position: absolute;
|
||||||
|
height: 8px;
|
||||||
|
width: 8px;
|
||||||
|
z-index: 102;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #888;
|
||||||
|
background: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-select {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1001;
|
||||||
|
background-color: #888;
|
||||||
|
background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.top, div.dt-autofill-select.bottom {
|
||||||
|
height: 3px;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
div.dt-autofill-select.left, div.dt-autofill-select.right {
|
||||||
|
width: 3px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-list {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 500px;
|
||||||
|
margin-left: -250px;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0 0 5px #555;
|
||||||
|
border: 2px solid #444;
|
||||||
|
z-index: 11;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 1.5em 2em;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul {
|
||||||
|
display: table;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:last-child div.dt-autofill-question, div.dt-autofill-list ul li:last-child div.dt-autofill-button {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list ul li:hover {
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-question input[type=number] {
|
||||||
|
padding: 6px;
|
||||||
|
width: 30px;
|
||||||
|
margin: -2px 0;
|
||||||
|
}
|
||||||
|
div.dt-autofill-list div.dt-autofill-button {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-autofill-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
z-index: 10;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px solid #888;background:#888}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#888;background-image:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list ul li{display:table-row}div.dt-autofill-list ul li:last-child div.dt-autofill-question,div.dt-autofill-list ul li:last-child div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul li:hover{background-color:#f6f6f6}div.dt-autofill-list div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-list div.dt-autofill-question input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px solid #ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*! Bootstrap integration for DataTables' AutoFill
|
||||||
|
* ©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net-bs', 'datatables.net-autofill'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net-bs')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.AutoFill ) {
|
||||||
|
require('datatables.net-autofill')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
|
||||||
|
DataTable.AutoFill.classes.btn = 'btn btn-primary';
|
||||||
|
|
||||||
|
|
||||||
|
return DataTable;
|
||||||
|
}));
|
@ -0,0 +1,5 @@
|
|||||||
|
/*!
|
||||||
|
Bootstrap integration for DataTables' AutoFill
|
||||||
|
©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-bs")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="btn btn-primary";return a});
|
@ -0,0 +1,43 @@
|
|||||||
|
/*! Bootstrap integration for DataTables' AutoFill
|
||||||
|
* ©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net-bs4', 'datatables.net-autofill'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net-bs4')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.AutoFill ) {
|
||||||
|
require('datatables.net-autofill')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
|
||||||
|
DataTable.AutoFill.classes.btn = 'btn btn-primary';
|
||||||
|
|
||||||
|
|
||||||
|
return DataTable;
|
||||||
|
}));
|
@ -0,0 +1,5 @@
|
|||||||
|
/*!
|
||||||
|
Bootstrap integration for DataTables' AutoFill
|
||||||
|
©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs4","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-bs4")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="btn btn-primary";return a});
|
@ -0,0 +1,43 @@
|
|||||||
|
/*! Foundation integration for DataTables' AutoFill
|
||||||
|
* ©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net-zf', 'datatables.net-autofill'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net-zf')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.AutoFill ) {
|
||||||
|
require('datatables.net-autofill')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
|
||||||
|
DataTable.AutoFill.classes.btn = 'button tiny';
|
||||||
|
|
||||||
|
|
||||||
|
return DataTable;
|
||||||
|
}));
|
@ -0,0 +1,5 @@
|
|||||||
|
/*!
|
||||||
|
Foundation integration for DataTables' AutoFill
|
||||||
|
©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-zf","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-zf")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="button tiny";return a});
|
@ -0,0 +1,43 @@
|
|||||||
|
/*! jQuery UI integration for DataTables' AutoFill
|
||||||
|
* ©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net-jqui', 'datatables.net-autofill'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net-jqui')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.AutoFill ) {
|
||||||
|
require('datatables.net-autofill')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
|
||||||
|
DataTable.AutoFill.classes.btn = 'ui-button ui-state-default ui-corner-all';
|
||||||
|
|
||||||
|
|
||||||
|
return DataTable;
|
||||||
|
}));
|
@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
jQuery UI integration for DataTables' AutoFill
|
||||||
|
©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-jqui","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-jqui")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="ui-button ui-state-default ui-corner-all";
|
||||||
|
return a});
|
@ -0,0 +1,43 @@
|
|||||||
|
/*! Bootstrap integration for DataTables' AutoFill
|
||||||
|
* ©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net-se', 'datatables.net-autofill'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net-se')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.AutoFill ) {
|
||||||
|
require('datatables.net-autofill')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
|
||||||
|
DataTable.AutoFill.classes.btn = 'ui button';
|
||||||
|
|
||||||
|
|
||||||
|
return DataTable;
|
||||||
|
}));
|
@ -0,0 +1,5 @@
|
|||||||
|
/*!
|
||||||
|
Bootstrap integration for DataTables' AutoFill
|
||||||
|
©2015 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net-se","datatables.net-autofill"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-se")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="ui button";return a});
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,23 @@
|
|||||||
|
/*!
|
||||||
|
AutoFill 2.1.3
|
||||||
|
©2008-2016 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(e){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(l){return e(l,window,document)}):"object"===typeof exports?module.exports=function(l,i){l||(l=window);if(!i||!i.fn.dataTable)i=require("datatables.net")(l,i).$;return e(i,l,l.document)}:e(jQuery,window,document)})(function(e,l,i,q){var k=e.fn.dataTable,o=0,j=function(c,b){if(!k.versionCheck||!k.versionCheck("1.10.8"))throw"Warning: AutoFill requires DataTables 1.10.8 or greater";this.c=e.extend(!0,{},k.defaults.autoFill,
|
||||||
|
j.defaults,b);this.s={dt:new k.Api(c),namespace:".autoFill"+o++,scroll:{},scrollInterval:null,handle:{height:0,width:0}};this.dom={handle:e('<div class="dt-autofill-handle"/>'),select:{top:e('<div class="dt-autofill-select top"/>'),right:e('<div class="dt-autofill-select right"/>'),bottom:e('<div class="dt-autofill-select bottom"/>'),left:e('<div class="dt-autofill-select left"/>')},background:e('<div class="dt-autofill-background"/>'),list:e('<div class="dt-autofill-list">'+this.s.dt.i18n("autoFill.info",
|
||||||
|
"")+"<ul/></div>"),dtScroll:null,offsetParent:null};this._constructor()};e.extend(j.prototype,{_constructor:function(){var c=this,b=this.s.dt,a=e("div.dataTables_scrollBody",this.s.dt.table().container());a.length&&(this.dom.dtScroll=a,"static"===a.css("position")&&a.css("position","relative"));this._focusListener();this.dom.handle.on("mousedown",function(a){c._mousedown(a);return false});b.on("destroy.autoFill",function(){b.off(".autoFill");e(b.table().body()).off(c.s.namespace);e(i.body).off(c.s.namespace)})},
|
||||||
|
_attach:function(c){var b=this.s.dt,a=b.cell(c).index(),d=this.dom.handle,f=this.s.handle;if(!a||-1===b.columns(this.c.columns).indexes().indexOf(a.column))this._detach();else{this.dom.offsetParent||(this.dom.offsetParent=e(b.table().node()).offsetParent());if(!f.height||!f.width)d.appendTo("body"),f.height=d.outerHeight(),f.width=d.outerWidth();b=this._getPosition(c,this.dom.offsetParent);this.dom.attachedTo=c;d.css({top:b.top+c.offsetHeight-f.height,left:b.left+c.offsetWidth-f.width}).appendTo(this.dom.offsetParent)}},
|
||||||
|
_actionSelector:function(c){var b=this,a=this.s.dt,d=j.actions,f=[];e.each(d,function(b,d){d.available(a,c)&&f.push(b)});if(1===f.length&&!1===this.c.alwaysAsk){var h=d[f[0]].execute(a,c);this._update(h,c)}else{var g=this.dom.list.children("ul").empty();f.push("cancel");e.each(f,function(f,h){g.append(e("<li/>").append('<div class="dt-autofill-question">'+d[h].option(a,c)+"<div>").append(e('<div class="dt-autofill-button">').append(e('<button class="'+j.classes.btn+'">'+a.i18n("autoFill.button",">")+
|
||||||
|
"</button>").on("click",function(){var f=d[h].execute(a,c,e(this).closest("li"));b._update(f,c);b.dom.background.remove();b.dom.list.remove()}))))});this.dom.background.appendTo("body");this.dom.list.appendTo("body");this.dom.list.css("margin-top",-1*(this.dom.list.outerHeight()/2))}},_detach:function(){this.dom.attachedTo=null;this.dom.handle.detach()},_drawSelection:function(c){var b=this.s.dt,a=this.s.start,d=e(this.dom.start),f=e(c),h={row:b.rows({page:"current"}).nodes().indexOf(f.parent()[0]),
|
||||||
|
column:f.index()},c=b.column.index("toData",h.column);if(b.cell(f).any()&&-1!==b.columns(this.c.columns).indexes().indexOf(c)){this.s.end=h;var g,b=a.row<h.row?d:f;g=a.row<h.row?f:d;c=a.column<h.column?d:f;d=a.column<h.column?f:d;b=this._getPosition(b).top;c=this._getPosition(c).left;a=this._getPosition(g).top+g.outerHeight()-b;d=this._getPosition(d).left+d.outerWidth()-c;f=this.dom.select;f.top.css({top:b,left:c,width:d});f.left.css({top:b,left:c,height:a});f.bottom.css({top:b+a,left:c,width:d});
|
||||||
|
f.right.css({top:b,left:c+d,height:a})}},_editor:function(c){var b=this.s.dt,a=this.c.editor;if(a){for(var d={},f=[],e=a.fields(),g=0,i=c.length;g<i;g++)for(var j=0,l=c[g].length;j<l;j++){var n=c[g][j],k=b.settings()[0].aoColumns[n.index.column],m=k.editField;if(m===q)for(var k=k.mData,p=0,o=e.length;p<o;p++){var r=a.field(e[p]);if(r.dataSrc()===k){m=r.name();break}}if(!m)throw"Could not automatically determine field data. Please see https://datatables.net/tn/11";d[m]||(d[m]={});k=b.row(n.index.row).id();
|
||||||
|
d[m][k]=n.set;f.push(n.index)}a.bubble(f,!1).multiSet(d).submit()}},_emitEvent:function(c,b){this.s.dt.iterator("table",function(a){e(a.nTable).triggerHandler(c+".dt",b)})},_focusListener:function(){var c=this,b=this.s.dt,a=this.s.namespace,d=null!==this.c.focus?this.c.focus:b.init().keys||b.settings()[0].keytable?"focus":"hover";if("focus"===d)b.on("key-focus.autoFill",function(a,b,d){c._attach(d.node())}).on("key-blur.autoFill",function(){c._detach()});else if("click"===d)e(b.table().body()).on("click"+
|
||||||
|
a,"td, th",function(){c._attach(this)}),e(i.body).on("click"+a,function(a){e(a.target).parents().filter(b.table().body()).length||c._detach()});else e(b.table().body()).on("mouseenter"+a,"td, th",function(){c._attach(this)}).on("mouseleave"+a,function(a){e(a.relatedTarget).hasClass("dt-autofill-handle")||c._detach()})},_getPosition:function(c,b){var a=e(c),d,f,h=0,g=0;b||(b=e(this.s.dt.table().node()).offsetParent());do{f=a.position();d=a.offsetParent();h+=f.top+d.scrollTop();g+=f.left+d.scrollLeft();
|
||||||
|
if("body"===a.get(0).nodeName.toLowerCase())break;a=d}while(d.get(0)!==b.get(0));return{top:h,left:g}},_mousedown:function(c){var b=this,a=this.s.dt;this.dom.start=this.dom.attachedTo;this.s.start={row:a.rows({page:"current"}).nodes().indexOf(e(this.dom.start).parent()[0]),column:e(this.dom.start).index()};e(i.body).on("mousemove.autoFill",function(a){b._mousemove(a)}).on("mouseup.autoFill",function(a){b._mouseup(a)});var d=this.dom.select,a=e(a.table().node()).offsetParent();d.top.appendTo(a);d.left.appendTo(a);
|
||||||
|
d.right.appendTo(a);d.bottom.appendTo(a);this._drawSelection(this.dom.start,c);this.dom.handle.css("display","none");c=this.dom.dtScroll;this.s.scroll={windowHeight:e(l).height(),windowWidth:e(l).width(),dtTop:c?c.offset().top:null,dtLeft:c?c.offset().left:null,dtHeight:c?c.outerHeight():null,dtWidth:c?c.outerWidth():null}},_mousemove:function(c){var b=c.target.nodeName.toLowerCase();"td"!==b&&"th"!==b||(this._drawSelection(c.target,c),this._shiftScroll(c))},_mouseup:function(){e(i.body).off(".autoFill");
|
||||||
|
var c=this.s.dt,b=this.dom.select;b.top.remove();b.left.remove();b.right.remove();b.bottom.remove();this.dom.handle.css("display","block");var b=this.s.start,a=this.s.end;if(!(b.row===a.row&&b.column===a.column)){for(var d=this._range(b.row,a.row),b=this._range(b.column,a.column),a=[],f=c.settings()[0],h=f.aoColumns,g=0;g<d.length;g++)a.push(e.map(b,function(a){var a=c.cell(":eq("+d[g]+")",a+":visible",{page:"current"}),b=a.data(),e=a.index(),i=h[e.column].editField;i!==q&&(b=f.oApi._fnGetObjectDataFn(i)(c.row(e.row).data()));
|
||||||
|
return{cell:a,data:b,label:a.data(),index:e}}));this._actionSelector(a);clearInterval(this.s.scrollInterval);this.s.scrollInterval=null}},_range:function(c,b){var a=[],d;if(c<=b)for(d=c;d<=b;d++)a.push(d);else for(d=c;d>=b;d--)a.push(d);return a},_shiftScroll:function(c){var b=this,a=this.s.scroll,d=!1,f=c.pageY-i.body.scrollTop,e=c.pageX-i.body.scrollLeft,g,j,k,l;65>f?g=-5:f>a.windowHeight-65&&(g=5);65>e?j=-5:e>a.windowWidth-65&&(j=5);null!==a.dtTop&&c.pageY<a.dtTop+65?k=-5:null!==a.dtTop&&c.pageY>
|
||||||
|
a.dtTop+a.dtHeight-65&&(k=5);null!==a.dtLeft&&c.pageX<a.dtLeft+65?l=-5:null!==a.dtLeft&&c.pageX>a.dtLeft+a.dtWidth-65&&(l=5);g||j||k||l?(a.windowVert=g,a.windowHoriz=j,a.dtVert=k,a.dtHoriz=l,d=!0):this.s.scrollInterval&&(clearInterval(this.s.scrollInterval),this.s.scrollInterval=null);!this.s.scrollInterval&&d&&(this.s.scrollInterval=setInterval(function(){if(a.windowVert)i.body.scrollTop=i.body.scrollTop+a.windowVert;if(a.windowHoriz)i.body.scrollLeft=i.body.scrollLeft+a.windowHoriz;if(a.dtVert||
|
||||||
|
a.dtHoriz){var c=b.dom.dtScroll[0];if(a.dtVert)c.scrollTop=c.scrollTop+a.dtVert;if(a.dtHoriz)c.scrollLeft=c.scrollLeft+a.dtHoriz}},20))},_update:function(c,b){if(!1!==c){var a=this.s.dt,d;this._emitEvent("preAutoFill",[a,b]);this._editor(b);if(null!==this.c.update?this.c.update:!this.c.editor){for(var f=0,e=b.length;f<e;f++)for(var g=0,i=b[f].length;g<i;g++)d=b[f][g],d.cell.data(d.set);a.draw(!1)}this._emitEvent("autoFill",[a,b])}}});j.actions={increment:{available:function(c,b){return e.isNumeric(b[0][0].label)},
|
||||||
|
option:function(c){return c.i18n("autoFill.increment",'Increment / decrement each cell by: <input type="number" value="1">')},execute:function(c,b,a){for(var c=1*b[0][0].data,a=1*e("input",a).val(),d=0,f=b.length;d<f;d++)for(var h=0,g=b[d].length;h<g;h++)b[d][h].set=c,c+=a}},fill:{available:function(){return!0},option:function(c,b){return c.i18n("autoFill.fill","Fill all cells with <i>"+b[0][0].label+"</i>")},execute:function(c,b){for(var a=b[0][0].data,d=0,f=b.length;d<f;d++)for(var e=0,g=b[d].length;e<
|
||||||
|
g;e++)b[d][e].set=a}},fillHorizontal:{available:function(c,b){return 1<b.length&&1<b[0].length},option:function(c){return c.i18n("autoFill.fillHorizontal","Fill cells horizontally")},execute:function(c,b){for(var a=0,d=b.length;a<d;a++)for(var e=0,h=b[a].length;e<h;e++)b[a][e].set=b[a][0].data}},fillVertical:{available:function(c,b){return 1<b.length&&1<b[0].length},option:function(c){return c.i18n("autoFill.fillVertical","Fill cells vertically")},execute:function(c,b){for(var a=0,d=b.length;a<d;a++)for(var e=
|
||||||
|
0,h=b[a].length;e<h;e++)b[a][e].set=b[0][e].data}},cancel:{available:function(){return!1},option:function(c){return c.i18n("autoFill.cancel","Cancel")},execute:function(){return!1}}};j.version="2.1.3";j.defaults={alwaysAsk:!1,focus:null,columns:"",update:null,editor:null};j.classes={btn:"btn"};e(i).on("preInit.dt.autofill",function(c,b){if("dt"===c.namespace){var a=b.oInit.autoFill,d=k.defaults.autoFill;if(a||d)d=e.extend({},a,d),!1!==a&&new j(b,d)}});k.AutoFill=j;return k.AutoFill=j});
|
@ -0,0 +1,22 @@
|
|||||||
|
MIT license
|
||||||
|
|
||||||
|
Copyright (c) 2015-2016 SpryMedia Limited
|
||||||
|
http://datatables.net
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
@ -0,0 +1,39 @@
|
|||||||
|
# Buttons
|
||||||
|
|
||||||
|
The Buttons extension for DataTables provides a common set of options, API methods and styling to display buttons on a page that will interact with a DataTable. Modules are also provided for data export, printing and column visibility control.
|
||||||
|
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
To use Buttons the primary way to obtain the software is to use the [DataTables downloader](//datatables.net/download). You can also include the individual files from the [DataTables CDN](//cdn.datatables.net). See the [documentation](http://datatables.net/extensions/buttons/) for full details.
|
||||||
|
|
||||||
|
## NPM and Bower
|
||||||
|
|
||||||
|
If you prefer to use a package manager such as NPM or Bower, distribution repositories are available with software built from this repository under the name `datatables.net-buttons`. Styling packages for Bootstrap, Foundation and other styling libraries are also available by adding a suffix to the package name.
|
||||||
|
|
||||||
|
Please see the DataTables [NPM](//datatables.net/download/npm) and [Bower](//datatables.net/download/bower) installation pages for further information. The [DataTables installation manual](//datatables.net/manual/installation) also has details on how to use package managers with DataTables.
|
||||||
|
|
||||||
|
|
||||||
|
# Basic usage
|
||||||
|
|
||||||
|
Buttons is initialised using the `buttons` option in the DataTables constructor, giving an array of the buttons that should be shown. Further options can be specified using this option as an object - see the documentation for details. For example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
$(document).ready( function () {
|
||||||
|
$('#example').DataTable( {
|
||||||
|
buttons: [ 'csv', 'excel', 'pdf', 'print' ]
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Documentation / support
|
||||||
|
|
||||||
|
* [Documentation](https://datatables.net/extensions/buttons/)
|
||||||
|
* [DataTables support forums](http://datatables.net/forums)
|
||||||
|
|
||||||
|
|
||||||
|
# GitHub
|
||||||
|
|
||||||
|
If you fancy getting involved with the development of Buttons and help make it better, please refer to its [GitHub repo](https://github.com/DataTables/Buttons)
|
||||||
|
|
@ -0,0 +1,102 @@
|
|||||||
|
div.dt-button-info {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 400px;
|
||||||
|
margin-top: -100px;
|
||||||
|
margin-left: -200px;
|
||||||
|
background-color: white;
|
||||||
|
border: 2px solid #111;
|
||||||
|
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 21;
|
||||||
|
}
|
||||||
|
div.dt-button-info h2 {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
div.dt-button-info > div {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.dt-button-collection.dropdown-menu {
|
||||||
|
display: block;
|
||||||
|
z-index: 2002;
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu > * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 2001;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px) {
|
||||||
|
div.dt-buttons {
|
||||||
|
float: none;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
div.dt-buttons a.btn {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.dropdown-menu.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.dropdown-menu.fixed.two-column{margin-left:-150px}ul.dt-button-collection.dropdown-menu.fixed.three-column{margin-left:-225px}ul.dt-button-collection.dropdown-menu.fixed.four-column{margin-left:-300px}ul.dt-button-collection.dropdown-menu>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.dropdown-menu.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.dropdown-menu.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.dropdown-menu.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2001}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons a.btn{float:none}}
|
@ -0,0 +1,163 @@
|
|||||||
|
div.dt-button-info {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 400px;
|
||||||
|
margin-top: -100px;
|
||||||
|
margin-left: -200px;
|
||||||
|
background-color: white;
|
||||||
|
border: 2px solid #111;
|
||||||
|
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 21;
|
||||||
|
}
|
||||||
|
div.dt-button-info h2 {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
div.dt-button-info > div {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.dt-button-collection.dropdown-menu {
|
||||||
|
display: block;
|
||||||
|
z-index: 2002;
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.fixed.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu > * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.dropdown-menu.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.dt-button-collection {
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.fixed.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.fixed.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.fixed.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection > * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.fixed {
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.fixed:before, ul.dt-button-collection.fixed:after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 999;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px) {
|
||||||
|
div.dt-buttons {
|
||||||
|
float: none;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
div.dt-buttons a.btn {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.dropdown-menu.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.dropdown-menu.fixed.two-column{margin-left:-150px}ul.dt-button-collection.dropdown-menu.fixed.three-column{margin-left:-225px}ul.dt-button-collection.dropdown-menu.fixed.four-column{margin-left:-300px}ul.dt-button-collection.dropdown-menu>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.dropdown-menu.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.dropdown-menu.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.dropdown-menu.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}ul.dt-button-collection{-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.fixed.two-column{margin-left:-150px}ul.dt-button-collection.fixed.three-column{margin-left:-225px}ul.dt-button-collection.fixed.four-column{margin-left:-300px}ul.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}ul.dt-button-collection.fixed{max-width:none}ul.dt-button-collection.fixed:before,ul.dt-button-collection.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:999}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons a.btn{float:none}}
|
@ -0,0 +1,298 @@
|
|||||||
|
div.dt-button-info {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 400px;
|
||||||
|
margin-top: -100px;
|
||||||
|
margin-left: -200px;
|
||||||
|
background-color: white;
|
||||||
|
border: 2px solid #111;
|
||||||
|
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 21;
|
||||||
|
}
|
||||||
|
div.dt-button-info h2 {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
div.dt-button-info > div {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.dt-button,
|
||||||
|
div.dt-button,
|
||||||
|
a.dt-button {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-right: 0.333em;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
border: 1px solid #999;
|
||||||
|
border-radius: 2px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 0.88em;
|
||||||
|
color: black;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #e9e9e9;
|
||||||
|
/* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, white 0%, #e9e9e9 100%);
|
||||||
|
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, white 0%, #e9e9e9 100%);
|
||||||
|
/* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, white 0%, #e9e9e9 100%);
|
||||||
|
/* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, white 0%, #e9e9e9 100%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, white 0%, #e9e9e9 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
text-decoration: none;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
button.dt-button.disabled,
|
||||||
|
div.dt-button.disabled,
|
||||||
|
a.dt-button.disabled {
|
||||||
|
color: #999;
|
||||||
|
border: 1px solid #d0d0d0;
|
||||||
|
cursor: default;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
/* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
|
||||||
|
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
|
||||||
|
/* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
|
||||||
|
/* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, #ffffff 0%, #f9f9f9 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9');
|
||||||
|
}
|
||||||
|
button.dt-button:active:not(.disabled), button.dt-button.active:not(.disabled),
|
||||||
|
div.dt-button:active:not(.disabled),
|
||||||
|
div.dt-button.active:not(.disabled),
|
||||||
|
a.dt-button:active:not(.disabled),
|
||||||
|
a.dt-button.active:not(.disabled) {
|
||||||
|
background-color: #e2e2e2;
|
||||||
|
/* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
|
||||||
|
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
|
||||||
|
/* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
|
||||||
|
/* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');
|
||||||
|
box-shadow: inset 1px 1px 3px #999999;
|
||||||
|
}
|
||||||
|
button.dt-button:active:not(.disabled):hover:not(.disabled), button.dt-button.active:not(.disabled):hover:not(.disabled),
|
||||||
|
div.dt-button:active:not(.disabled):hover:not(.disabled),
|
||||||
|
div.dt-button.active:not(.disabled):hover:not(.disabled),
|
||||||
|
a.dt-button:active:not(.disabled):hover:not(.disabled),
|
||||||
|
a.dt-button.active:not(.disabled):hover:not(.disabled) {
|
||||||
|
box-shadow: inset 1px 1px 3px #999999;
|
||||||
|
background-color: #cccccc;
|
||||||
|
/* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
|
||||||
|
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
|
||||||
|
/* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
|
||||||
|
/* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, #eaeaea 0%, #cccccc 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc');
|
||||||
|
}
|
||||||
|
button.dt-button:hover,
|
||||||
|
div.dt-button:hover,
|
||||||
|
a.dt-button:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
button.dt-button:hover:not(.disabled),
|
||||||
|
div.dt-button:hover:not(.disabled),
|
||||||
|
a.dt-button:hover:not(.disabled) {
|
||||||
|
border: 1px solid #666;
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
/* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
|
||||||
|
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
|
||||||
|
/* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
|
||||||
|
/* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0');
|
||||||
|
}
|
||||||
|
button.dt-button:focus:not(.disabled),
|
||||||
|
div.dt-button:focus:not(.disabled),
|
||||||
|
a.dt-button:focus:not(.disabled) {
|
||||||
|
border: 1px solid #426c9e;
|
||||||
|
text-shadow: 0 1px 0 #c4def1;
|
||||||
|
outline: none;
|
||||||
|
background-color: #79ace9;
|
||||||
|
/* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);
|
||||||
|
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);
|
||||||
|
/* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);
|
||||||
|
/* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, #bddef4 0%, #79ace9 100%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, #bddef4 0%, #79ace9 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9');
|
||||||
|
}
|
||||||
|
|
||||||
|
.dt-button embed {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-buttons {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
div.dt-buttons.buttons-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-collection {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 150px;
|
||||||
|
margin-top: 3px;
|
||||||
|
padding: 8px 8px 4px 8px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.4);
|
||||||
|
background-color: white;
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 2002;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
|
||||||
|
z-index: 2002;
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection button.dt-button,
|
||||||
|
div.dt-button-collection div.dt-button,
|
||||||
|
div.dt-button-collection a.dt-button {
|
||||||
|
position: relative;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
display: block;
|
||||||
|
float: none;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
div.dt-button-collection button.dt-button:active:not(.disabled), div.dt-button-collection button.dt-button.active:not(.disabled),
|
||||||
|
div.dt-button-collection div.dt-button:active:not(.disabled),
|
||||||
|
div.dt-button-collection div.dt-button.active:not(.disabled),
|
||||||
|
div.dt-button-collection a.dt-button:active:not(.disabled),
|
||||||
|
div.dt-button-collection a.dt-button.active:not(.disabled) {
|
||||||
|
background-color: #dadada;
|
||||||
|
/* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
|
||||||
|
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
|
||||||
|
/* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
|
||||||
|
/* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');
|
||||||
|
box-shadow: inset 1px 1px 3px #666;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection > * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
/* Fallback */
|
||||||
|
background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* IE10 Consumer Preview */
|
||||||
|
background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* Firefox */
|
||||||
|
background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* Opera */
|
||||||
|
background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
|
||||||
|
/* Webkit (Safari/Chrome 10) */
|
||||||
|
background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* Webkit (Chrome 11+) */
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* W3C Markup, IE10 Release Preview */
|
||||||
|
z-index: 2001;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 640px) {
|
||||||
|
div.dt-buttons {
|
||||||
|
float: none !important;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,129 @@
|
|||||||
|
div.dt-button-info {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 400px;
|
||||||
|
margin-top: -100px;
|
||||||
|
margin-left: -200px;
|
||||||
|
background-color: white;
|
||||||
|
border: 2px solid #111;
|
||||||
|
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 21;
|
||||||
|
}
|
||||||
|
div.dt-button-info h2 {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
div.dt-button-info > div {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.dt-buttons li {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
ul.dt-buttons li.active a {
|
||||||
|
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.dt-buttons.button-group a {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.dt-button-collection.f-dropdown {
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.fixed.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.fixed.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.fixed.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown > * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.fixed {
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
ul.dt-button-collection.f-dropdown.fixed:before, ul.dt-button-collection.f-dropdown.fixed:after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 88;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px) {
|
||||||
|
ul.dt-buttons {
|
||||||
|
float: none;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
ul.dt-buttons li {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
div.button-group.stacked.dropdown-pane {
|
||||||
|
margin-top: 2px;
|
||||||
|
padding: 1px;
|
||||||
|
z-index: 89;
|
||||||
|
}
|
||||||
|
div.button-group.stacked.dropdown-pane a.button {
|
||||||
|
margin-bottom: 1px;
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
div.button-group.stacked.dropdown-pane a.button:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-buttons li{margin:0}ul.dt-buttons li.active a{box-shadow:inset 0 0 10px rgba(0,0,0,0.6)}ul.dt-buttons.button-group a{margin-bottom:0}ul.dt-button-collection.f-dropdown{-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.f-dropdown.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.f-dropdown.fixed.two-column{margin-left:-150px}ul.dt-button-collection.f-dropdown.fixed.three-column{margin-left:-225px}ul.dt-button-collection.f-dropdown.fixed.four-column{margin-left:-300px}ul.dt-button-collection.f-dropdown>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.f-dropdown.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.f-dropdown.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.f-dropdown.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}ul.dt-button-collection.f-dropdown.fixed{max-width:none}ul.dt-button-collection.f-dropdown.fixed:before,ul.dt-button-collection.f-dropdown.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:88}@media screen and (max-width: 767px){ul.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5rem}ul.dt-buttons li{float:none}}div.button-group.stacked.dropdown-pane{margin-top:2px;padding:1px;z-index:89}div.button-group.stacked.dropdown-pane a.button{margin-bottom:1px;border-right:none}div.button-group.stacked.dropdown-pane a.button:last-child{margin-bottom:0}
|
@ -0,0 +1,162 @@
|
|||||||
|
div.dt-button-info {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 400px;
|
||||||
|
margin-top: -100px;
|
||||||
|
margin-left: -200px;
|
||||||
|
background-color: white;
|
||||||
|
border: 2px solid #111;
|
||||||
|
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 21;
|
||||||
|
}
|
||||||
|
div.dt-button-info h2 {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
div.dt-button-info > div {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-buttons {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
div.dt-buttons .dt-button {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
div.dt-buttons .dt-button span.ui-icon {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-top: -2px;
|
||||||
|
}
|
||||||
|
div.dt-buttons .dt-button:active {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
div.dt-buttons .dt-button:hover > span {
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-collection {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 150px;
|
||||||
|
margin-top: 3px;
|
||||||
|
padding: 8px 8px 4px 8px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.4);
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
background-color: rgba(255, 255, 255, 0.3);
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 2002;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
|
||||||
|
z-index: 2002;
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
-webkit-column-gap: 0;
|
||||||
|
-moz-column-gap: 0;
|
||||||
|
-ms-column-gap: 0;
|
||||||
|
-o-column-gap: 0;
|
||||||
|
column-gap: 0;
|
||||||
|
}
|
||||||
|
div.dt-button-collection .dt-button {
|
||||||
|
position: relative;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
display: block;
|
||||||
|
float: none;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
div.dt-button-collection .dt-button:last-child {
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection .dt-button:hover > span {
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection > * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
/* Fallback */
|
||||||
|
background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* IE10 Consumer Preview */
|
||||||
|
background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* Firefox */
|
||||||
|
background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* Opera */
|
||||||
|
background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
|
||||||
|
/* Webkit (Safari/Chrome 10) */
|
||||||
|
background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* Webkit (Chrome 11+) */
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
|
||||||
|
/* W3C Markup, IE10 Release Preview */
|
||||||
|
z-index: 2001;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 640px) {
|
||||||
|
div.dt-buttons {
|
||||||
|
float: none !important;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-buttons{position:relative;float:left}div.dt-buttons .dt-button{margin-right:0}div.dt-buttons .dt-button span.ui-icon{display:inline-block;vertical-align:middle;margin-top:-2px}div.dt-buttons .dt-button:active{outline:none}div.dt-buttons .dt-button:hover>span{background-color:rgba(0,0,0,0.05)}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px;-webkit-column-gap:0;-moz-column-gap:0;-ms-column-gap:0;-o-column-gap:0;column-gap:0}div.dt-button-collection .dt-button{position:relative;left:0;right:0;display:block;float:none;margin-right:0}div.dt-button-collection .dt-button:last-child{margin-bottom:4px}div.dt-button-collection .dt-button:hover>span{background-color:rgba(0,0,0,0.05)}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}
|
@ -0,0 +1,114 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
div.dt-button-info {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 400px;
|
||||||
|
margin-top: -100px;
|
||||||
|
margin-left: -200px;
|
||||||
|
background-color: white;
|
||||||
|
border: 2px solid #111;
|
||||||
|
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 21;
|
||||||
|
}
|
||||||
|
div.dt-button-info h2 {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
div.dt-button-info > div {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-collection {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 150px;
|
||||||
|
margin-top: 3px !important;
|
||||||
|
z-index: 2002;
|
||||||
|
background: white;
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.fixed.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
div.dt-button-collection > * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
div.dt-button-collection.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.buttons-collection.ui.button span:after {
|
||||||
|
display: inline-block;
|
||||||
|
content: "▾";
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.dt-button-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 2001;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px) {
|
||||||
|
div.dt-buttons {
|
||||||
|
float: none;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
div.dt-buttons a.btn {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px !important;z-index:2002;background:white;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}button.buttons-collection.ui.button span:after{display:inline-block;content:"▾";padding-left:0.5em}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2001}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons a.btn{float:none}}
|
@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
div.dt-button-info {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 400px;
|
||||||
|
margin-top: -100px;
|
||||||
|
margin-left: -200px;
|
||||||
|
background-color: white;
|
||||||
|
border: 2px solid #111;
|
||||||
|
box-shadow: 3px 3px 8px rgba( 0, 0, 0, 0.3);
|
||||||
|
border-radius: 3px;
|
||||||
|
text-align: center;
|
||||||
|
z-index: 21;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
> div {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
|
||||||
|
@mixin dtb-two-stop-gradient($fromColor, $toColor) {
|
||||||
|
background-color: $toColor; /* Fallback */
|
||||||
|
background-image: -webkit-linear-gradient(top, $fromColor 0%, $toColor 100%); /* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||||
|
background-image: -moz-linear-gradient(top, $fromColor 0%, $toColor 100%); /* FF3.6 */
|
||||||
|
background-image: -ms-linear-gradient(top, $fromColor 0%, $toColor 100%); /* IE10 */
|
||||||
|
background-image: -o-linear-gradient(top, $fromColor 0%, $toColor 100%); /* Opera 11.10+ */
|
||||||
|
background-image: linear-gradient(to bottom, $fromColor 0%, $toColor 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#{nth( $fromColor, 1 )}', EndColorStr='#{nth( $toColor, 1 )}');
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin dtb-radial-gradient ($fromColor, $toColor ) {
|
||||||
|
background: $toColor; /* Fallback */
|
||||||
|
background: -ms-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* IE10 Consumer Preview */
|
||||||
|
background: -moz-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Firefox */
|
||||||
|
background: -o-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Opera */
|
||||||
|
background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, $fromColor), color-stop(1, $toColor)); /* Webkit (Safari/Chrome 10) */
|
||||||
|
background: -webkit-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Webkit (Chrome 11+) */
|
||||||
|
background: radial-gradient(ellipse farthest-corner at center, $fromColor 0%, $toColor 100%); /* W3C Markup, IE10 Release Preview */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@mixin dtb-fixed-collection {
|
||||||
|
// Fixed positioning feature
|
||||||
|
&.fixed {
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -75px;
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
&.two-column {
|
||||||
|
margin-left: -150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.three-column {
|
||||||
|
margin-left: -225px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.four-column {
|
||||||
|
margin-left: -300px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multi-column layout feature
|
||||||
|
-webkit-column-gap: 8px;
|
||||||
|
-moz-column-gap: 8px;
|
||||||
|
-ms-column-gap: 8px;
|
||||||
|
-o-column-gap: 8px;
|
||||||
|
column-gap: 8px;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
-webkit-column-break-inside: avoid;
|
||||||
|
break-inside: avoid;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.two-column {
|
||||||
|
width: 300px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
-ms-column-count: 2;
|
||||||
|
-o-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.three-column {
|
||||||
|
width: 450px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
-ms-column-count: 3;
|
||||||
|
-o-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.four-column {
|
||||||
|
width: 600px;
|
||||||
|
padding-bottom: 1px;
|
||||||
|
|
||||||
|
-webkit-column-count: 4;
|
||||||
|
-moz-column-count: 4;
|
||||||
|
-ms-column-count: 4;
|
||||||
|
-o-column-count: 4;
|
||||||
|
column-count: 4;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
/*! Bootstrap integration for DataTables' Buttons
|
||||||
|
* ©2016 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net-bs', 'datatables.net-buttons'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net-bs')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.Buttons ) {
|
||||||
|
require('datatables.net-buttons')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
|
||||||
|
$.extend( true, DataTable.Buttons.defaults, {
|
||||||
|
dom: {
|
||||||
|
container: {
|
||||||
|
className: 'dt-buttons btn-group'
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
className: 'btn btn-default'
|
||||||
|
},
|
||||||
|
collection: {
|
||||||
|
tag: 'ul',
|
||||||
|
className: 'dt-button-collection dropdown-menu',
|
||||||
|
button: {
|
||||||
|
tag: 'li',
|
||||||
|
className: 'dt-button'
|
||||||
|
},
|
||||||
|
buttonLiner: {
|
||||||
|
tag: 'a',
|
||||||
|
className: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
DataTable.ext.buttons.collection.text = function ( dt ) {
|
||||||
|
return dt.i18n('buttons.collection', 'Collection <span class="caret"/>');
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
return DataTable.Buttons;
|
||||||
|
}));
|
@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
Bootstrap integration for DataTables' Buttons
|
||||||
|
©2016 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{className:"dt-buttons btn-group"},
|
||||||
|
button:{className:"btn btn-default"},collection:{tag:"ul",className:"dt-button-collection dropdown-menu",button:{tag:"li",className:"dt-button"},buttonLiner:{tag:"a",className:""}}}});a.ext.buttons.collection.text=function(a){return a.i18n("buttons.collection",'Collection <span class="caret"/>')};return a.Buttons});
|
@ -0,0 +1,60 @@
|
|||||||
|
/*! Bootstrap integration for DataTables' Buttons
|
||||||
|
* ©2016 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net-bs4', 'datatables.net-buttons'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net-bs4')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.Buttons ) {
|
||||||
|
require('datatables.net-buttons')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
$.extend( true, DataTable.Buttons.defaults, {
|
||||||
|
dom: {
|
||||||
|
container: {
|
||||||
|
className: 'dt-buttons btn-group'
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
className: 'btn btn-secondary'
|
||||||
|
},
|
||||||
|
collection: {
|
||||||
|
tag: 'div',
|
||||||
|
className: 'dt-button-collection dropdown-menu',
|
||||||
|
button: {
|
||||||
|
tag: 'a',
|
||||||
|
className: 'dt-button dropdown-item'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
DataTable.ext.buttons.collection.className += ' dropdown-toggle';
|
||||||
|
|
||||||
|
return DataTable.Buttons;
|
||||||
|
}));
|
@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
Bootstrap integration for DataTables' Buttons
|
||||||
|
©2016 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs4","datatables.net-buttons"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs4")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{className:"dt-buttons btn-group"},
|
||||||
|
button:{className:"btn btn-secondary"},collection:{tag:"div",className:"dt-button-collection dropdown-menu",button:{tag:"a",className:"dt-button dropdown-item"}}}});a.ext.buttons.collection.className+=" dropdown-toggle";return a.Buttons});
|
@ -0,0 +1,198 @@
|
|||||||
|
/*!
|
||||||
|
* Column visibility buttons for Buttons and DataTables.
|
||||||
|
* 2016 SpryMedia Ltd - datatables.net/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( factory ){
|
||||||
|
if ( typeof define === 'function' && define.amd ) {
|
||||||
|
// AMD
|
||||||
|
define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
|
||||||
|
return factory( $, window, document );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else if ( typeof exports === 'object' ) {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = function (root, $) {
|
||||||
|
if ( ! root ) {
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $ || ! $.fn.dataTable ) {
|
||||||
|
$ = require('datatables.net')(root, $).$;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $.fn.dataTable.Buttons ) {
|
||||||
|
require('datatables.net-buttons')(root, $);
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory( $, root, root.document );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Browser
|
||||||
|
factory( jQuery, window, document );
|
||||||
|
}
|
||||||
|
}(function( $, window, document, undefined ) {
|
||||||
|
'use strict';
|
||||||
|
var DataTable = $.fn.dataTable;
|
||||||
|
|
||||||
|
|
||||||
|
$.extend( DataTable.ext.buttons, {
|
||||||
|
// A collection of column visibility buttons
|
||||||
|
colvis: function ( dt, conf ) {
|
||||||
|
return {
|
||||||
|
extend: 'collection',
|
||||||
|
text: function ( dt ) {
|
||||||
|
return dt.i18n( 'buttons.colvis', 'Column visibility' );
|
||||||
|
},
|
||||||
|
className: 'buttons-colvis',
|
||||||
|
buttons: [ {
|
||||||
|
extend: 'columnsToggle',
|
||||||
|
columns: conf.columns
|
||||||
|
} ]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
// Selected columns with individual buttons - toggle column visibility
|
||||||
|
columnsToggle: function ( dt, conf ) {
|
||||||
|
var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) {
|
||||||
|
return {
|
||||||
|
extend: 'columnToggle',
|
||||||
|
columns: idx
|
||||||
|
};
|
||||||
|
} ).toArray();
|
||||||
|
|
||||||
|
return columns;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Single button to toggle column visibility
|
||||||
|
columnToggle: function ( dt, conf ) {
|
||||||
|
return {
|
||||||
|
extend: 'columnVisibility',
|
||||||
|
columns: conf.columns
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
// Selected columns with individual buttons - set column visibility
|
||||||
|
columnsVisibility: function ( dt, conf ) {
|
||||||
|
var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) {
|
||||||
|
return {
|
||||||
|
extend: 'columnVisibility',
|
||||||
|
columns: idx,
|
||||||
|
visibility: conf.visibility
|
||||||
|
};
|
||||||
|
} ).toArray();
|
||||||
|
|
||||||
|
return columns;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Single button to set column visibility
|
||||||
|
columnVisibility: {
|
||||||
|
columns: undefined, // column selector
|
||||||
|
text: function ( dt, button, conf ) {
|
||||||
|
return conf._columnText( dt, conf.columns );
|
||||||
|
},
|
||||||
|
className: 'buttons-columnVisibility',
|
||||||
|
action: function ( e, dt, button, conf ) {
|
||||||
|
var col = dt.columns( conf.columns );
|
||||||
|
var curr = col.visible();
|
||||||
|
|
||||||
|
col.visible( conf.visibility !== undefined ?
|
||||||
|
conf.visibility :
|
||||||
|
! (curr.length ? curr[0] : false )
|
||||||
|
);
|
||||||
|
},
|
||||||
|
init: function ( dt, button, conf ) {
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
dt
|
||||||
|
.on( 'column-visibility.dt'+conf.namespace, function (e, settings) {
|
||||||
|
if ( ! settings.bDestroying ) {
|
||||||
|
that.active( dt.column( conf.columns ).visible() );
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.on( 'column-reorder.dt'+conf.namespace, function (e, settings, details) {
|
||||||
|
// Don't rename buttons based on column name if the button
|
||||||
|
// controls more than one column!
|
||||||
|
if ( dt.columns( conf.columns ).count() !== 1 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( typeof conf.columns === 'number' ) {
|
||||||
|
conf.columns = details.mapping[ conf.columns ];
|
||||||
|
}
|
||||||
|
|
||||||
|
var col = dt.column( conf.columns );
|
||||||
|
|
||||||
|
that.text( conf._columnText( dt, conf.columns ) );
|
||||||
|
that.active( col.visible() );
|
||||||
|
} );
|
||||||
|
|
||||||
|
this.active( dt.column( conf.columns ).visible() );
|
||||||
|
},
|
||||||
|
destroy: function ( dt, button, conf ) {
|
||||||
|
dt
|
||||||
|
.off( 'column-visibility.dt'+conf.namespace )
|
||||||
|
.off( 'column-reorder.dt'+conf.namespace );
|
||||||
|
},
|
||||||
|
|
||||||
|
_columnText: function ( dt, col ) {
|
||||||
|
// Use DataTables' internal data structure until this is presented
|
||||||
|
// is a public API. The other option is to use
|
||||||
|
// `$( column(col).node() ).text()` but the node might not have been
|
||||||
|
// populated when Buttons is constructed.
|
||||||
|
var idx = dt.column( col ).index();
|
||||||
|
return dt.settings()[0].aoColumns[ idx ].sTitle
|
||||||
|
.replace(/\n/g," ") // remove new lines
|
||||||
|
.replace( /<.*?>/g, "" ) // strip HTML
|
||||||
|
.replace(/^\s+|\s+$/g,""); // trim
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
colvisRestore: {
|
||||||
|
className: 'buttons-colvisRestore',
|
||||||
|
|
||||||
|
text: function ( dt ) {
|
||||||
|
return dt.i18n( 'buttons.colvisRestore', 'Restore visibility' );
|
||||||
|
},
|
||||||
|
|
||||||
|
init: function ( dt, button, conf ) {
|
||||||
|
conf._visOriginal = dt.columns().indexes().map( function ( idx ) {
|
||||||
|
return dt.column( idx ).visible();
|
||||||
|
} ).toArray();
|
||||||
|
},
|
||||||
|
|
||||||
|
action: function ( e, dt, button, conf ) {
|
||||||
|
dt.columns().every( function ( i ) {
|
||||||
|
// Take into account that ColReorder might have disrupted our
|
||||||
|
// indexes
|
||||||
|
var idx = dt.colReorder && dt.colReorder.transpose ?
|
||||||
|
dt.colReorder.transpose( i, 'toOriginal' ) :
|
||||||
|
i;
|
||||||
|
|
||||||
|
this.visible( conf._visOriginal[ idx ] );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
colvisGroup: {
|
||||||
|
className: 'buttons-colvisGroup',
|
||||||
|
|
||||||
|
action: function ( e, dt, button, conf ) {
|
||||||
|
dt.columns( conf.show ).visible( true, false );
|
||||||
|
dt.columns( conf.hide ).visible( false, false );
|
||||||
|
|
||||||
|
dt.columns.adjust();
|
||||||
|
},
|
||||||
|
|
||||||
|
show: [],
|
||||||
|
|
||||||
|
hide: []
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
|
||||||
|
return DataTable.Buttons;
|
||||||
|
}));
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user