UNCLASSIFIED

Commits (2)
#! bash
mvn -Dliquibase.url=jdbc:postgresql://localhost:5432/common_slim -Dliquibase.username=${USER} -Dliquibase.password='' -Pproduction liquibase:diff
...@@ -68,10 +68,6 @@ ...@@ -68,10 +68,6 @@
<artifactId>spring-boot-starter-aop</artifactId> <artifactId>spring-boot-starter-aop</artifactId>
<version>2.5.2</version> <version>2.5.2</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId> <groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId> <artifactId>jackson-dataformat-yaml</artifactId>
...@@ -159,23 +155,6 @@ ...@@ -159,23 +155,6 @@
<artifactId>json-patch</artifactId> <artifactId>json-patch</artifactId>
<version>1.12</version> <version>1.12</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-spring</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.jayway.jsonpath</groupId> <groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId> <artifactId>json-path</artifactId>
...@@ -191,22 +170,6 @@ ...@@ -191,22 +170,6 @@
<artifactId>camel-spring-boot-starter</artifactId> <artifactId>camel-spring-boot-starter</artifactId>
<version>${camel.version}</version> <version>${camel.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-servlet</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springdoc</groupId> <groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-data-rest</artifactId> <artifactId>springdoc-openapi-data-rest</artifactId>
......
export DB_NAME='common_slim'
createdb ${DB_NAME}
if [[ "$1" == "clean" ]]; then if [[ "$1" == "clean" ]]; then
echo "Cleaning and re-creating db..."; echo "Cleaning and re-creating db...";
dropdb common; dropdb ${DB_NAME};
createdb common; createdb ${DB_NAME};
fi; fi;
export SPRING_PROFILES_ACTIVE=production; export SPRING_PROFILES_ACTIVE=production;
export SECURITY_ENABLED=true; export SECURITY_ENABLED=true;
export PGHOST='localhost'; export PGHOST='localhost';
export PGPORT='5432'; export PGPORT='5432';
export PG_DATABASE=common_slim; export PG_DATABASE=${DB_NAME};
export APP_DB_ADMIN_PASSWORD=''; export APP_DB_ADMIN_PASSWORD='';
export PG_USER=${USER}; export PG_USER=${USER};
export APP_DB_RW_PASSWORD=''; export APP_DB_RW_PASSWORD='';
......
...@@ -24,7 +24,6 @@ public class SpringdocConfig { ...@@ -24,7 +24,6 @@ public class SpringdocConfig {
String[] paths = { String[] paths = {
String.format("%s/person/**", apiPrefix), String.format("%s/person/**", apiPrefix),
String.format("%s/organization/**", apiPrefix), String.format("%s/organization/**", apiPrefix),
String.format("%s/airman/**", apiPrefix),
String.format("%s/userinfo/**", apiPrefix), String.format("%s/userinfo/**", apiPrefix),
String.format("%s/version/**", apiPrefix), String.format("%s/version/**", apiPrefix),
}; };
...@@ -49,7 +48,6 @@ public class SpringdocConfig { ...@@ -49,7 +48,6 @@ public class SpringdocConfig {
String.format("%s/person/**", apiPrefix), String.format("%s/person/**", apiPrefix),
String.format("%s/organization/**", apiPrefix), String.format("%s/organization/**", apiPrefix),
String.format("%s/userinfo/**", apiPrefix), String.format("%s/userinfo/**", apiPrefix),
String.format("%s/scratch/**", apiPrefix),
}; };
return GroupedOpenApi.builder().group("common-api-v2").pathsToMatch(paths).build(); return GroupedOpenApi.builder().group("common-api-v2").pathsToMatch(paths).build();
......
package mil.tron.commonapi.entity.config;
import java.time.Clock;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ClockConfig {
@Bean
public Clock systemUtcClock() {
return Clock.systemUTC();
}
}
package mil.tron.commonapi.security;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
@Slf4j
public class Utility {
private Utility() {}
public static String hmac(String secret, String message) {
try {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
return Base64.getEncoder().encodeToString(mac.doFinal(message.getBytes(StandardCharsets.UTF_8)));
} catch (NoSuchAlgorithmException | InvalidKeyException ex) {
log.error("Error computing HMAC", ex);
return null;
}
}
}
...@@ -60,9 +60,6 @@ public class OrganizationServiceImpl implements OrganizationService { ...@@ -60,9 +60,6 @@ public class OrganizationServiceImpl implements OrganizationService {
private static final String ORG_IS_IN_ANCESTRY_MSG = "Organization %s is already an ancestor to this organization."; private static final String ORG_IS_IN_ANCESTRY_MSG = "Organization %s is already an ancestor to this organization.";
private static final String ORG_IS_ALREADY_SUBORG_ELSEWHERE = "Organization %s is already a subordinate to another organization."; private static final String ORG_IS_ALREADY_SUBORG_ELSEWHERE = "Organization %s is already a subordinate to another organization.";
@Value("${efa-enabled}")
private boolean efaEnabled;
private static final Map<Unit, Set<String>> validProperties = Map.of( private static final Map<Unit, Set<String>> validProperties = Map.of(
Unit.FLIGHT, fields(Flight.class), Unit.FLIGHT, fields(Flight.class),
Unit.GROUP, fields(Group.class), Unit.GROUP, fields(Group.class),
......
...@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.JsonNode; ...@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.fge.jsonpatch.JsonPatch; import com.github.fge.jsonpatch.JsonPatch;
import com.github.fge.jsonpatch.JsonPatchException; import com.github.fge.jsonpatch.JsonPatchException;
import com.google.common.collect.Lists;
import mil.tron.commonapi.dto.PersonDto; import mil.tron.commonapi.dto.PersonDto;
import mil.tron.commonapi.dto.PlatformJwtDto; import mil.tron.commonapi.dto.PlatformJwtDto;
import mil.tron.commonapi.dto.mapper.DtoMapper; import mil.tron.commonapi.dto.mapper.DtoMapper;
...@@ -23,7 +24,6 @@ import mil.tron.commonapi.repository.filter.SpecificationBuilder; ...@@ -23,7 +24,6 @@ import mil.tron.commonapi.repository.filter.SpecificationBuilder;
import mil.tron.commonapi.repository.ranks.RankRepository; import mil.tron.commonapi.repository.ranks.RankRepository;
import mil.tron.commonapi.service.utility.PersonUniqueChecksService; import mil.tron.commonapi.service.utility.PersonUniqueChecksService;
import mil.tron.commonapi.service.utility.ValidatorService; import mil.tron.commonapi.service.utility.ValidatorService;
import org.assertj.core.util.Lists;
import org.modelmapper.Conditions; import org.modelmapper.Conditions;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
......
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.1.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
<changeSet author="czell" id="1629825599822-1">
<createTable tableName="dashboard_user">
<column name="id" type="UUID">
<constraints nullable="false" primaryKey="true" primaryKeyName="dashboard_userPK"/>
</column>
<column name="email" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="email_as_lower" type="VARCHAR(255)"/>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-2">
<createTable tableName="dashboard_user_privileges">
<column name="dashboard_user_id" type="UUID">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="privileges_id" type="BIGINT">
<constraints nullable="false" primaryKey="true"/>
</column>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-3">
<createTable tableName="http_logs">
<column name="id" type="UUID">
<constraints nullable="false" primaryKey="true" primaryKeyName="http_logsPK"/>
</column>
<column name="query_string" type="VARCHAR(255)"/>
<column name="remote_ip" type="VARCHAR(255)"/>
<column name="request_body" type="VARCHAR(255)"/>
<column name="request_host" type="VARCHAR(255)"/>
<column name="request_method" type="VARCHAR(255)"/>
<column name="request_timestamp" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="requested_url" type="VARCHAR(255)"/>
<column name="response_body" type="VARCHAR(255)"/>
<column name="status_code" type="INTEGER">
<constraints nullable="false"/>
</column>
<column name="time_taken_ms" type="BIGINT"/>
<column name="user_agent" type="VARCHAR(255)"/>
<column name="user_name" type="VARCHAR(255)"/>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-4">
<createTable tableName="organization">
<column name="id" type="UUID">
<constraints nullable="false" primaryKey="true" primaryKeyName="organizationPK"/>
</column>
<column name="branch_type" type="VARCHAR(255)"/>
<column name="date_created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="date_modified" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="name" type="VARCHAR(255)"/>
<column name="name_as_lower" type="VARCHAR(255)"/>
<column name="org_type" type="VARCHAR(255)"/>
<column name="leader_id" type="UUID"/>
<column name="parent_organization_id" type="UUID"/>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-5">
<createTable tableName="organization_members">
<column name="members_id" type="UUID">
<constraints nullable="false"/>
</column>
<column name="organization_id" type="UUID">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-6">
<createTable tableName="organization_subordinate_organizations">
<column name="organization_id" type="UUID">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="subordinate_organizations_id" type="UUID">
<constraints nullable="false" primaryKey="true"/>
</column>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-7">
<createTable tableName="person">
<column name="id" type="UUID">
<constraints nullable="false" primaryKey="true" primaryKeyName="personPK"/>
</column>
<column name="address" type="VARCHAR(255)"/>
<column name="date_created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="date_modified" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="dodid" type="VARCHAR(255)"/>
<column name="duty_phone" type="VARCHAR(255)"/>
<column name="duty_title" type="VARCHAR(255)"/>
<column name="email" type="VARCHAR(255)"/>
<column name="email_as_lower" type="VARCHAR(255)"/>
<column name="first_name" type="VARCHAR(255)"/>
<column name="last_name" type="VARCHAR(255)"/>
<column name="middle_name" type="VARCHAR(255)"/>
<column name="phone" type="VARCHAR(255)"/>
<column name="title" type="VARCHAR(255)"/>
<column name="primary_organization_id" type="UUID"/>
<column name="rank_id" type="UUID"/>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-8">
<createTable tableName="privilege">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="privilegePK"/>
</column>
<column name="name" type="VARCHAR(255)"/>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-9">
<createTable tableName="rank">
<column name="id" type="UUID">
<constraints nullable="false" primaryKey="true" primaryKeyName="rankPK"/>
</column>
<column name="abbreviation" type="VARCHAR(255)"/>
<column name="branch_type" type="VARCHAR(255)"/>
<column name="name" type="VARCHAR(255)"/>
<column name="pay_grade" type="VARCHAR(255)"/>
</createTable>
</changeSet>
<changeSet author="czell" id="1629825599822-10">
<addPrimaryKey columnNames="organization_id, members_id" tableName="organization_members"/>
</changeSet>
<changeSet author="czell" id="1629825599822-11">
<addUniqueConstraint columnNames="email" constraintName="UC_DASHBOARD_USEREMAIL_COL" tableName="dashboard_user"/>
</changeSet>
<changeSet author="czell" id="1629825599822-12">
<addUniqueConstraint columnNames="subordinate_organizations_id" constraintName="UK_4e93l3qvpbprrhgllufmx67v1" tableName="organization_subordinate_organizations"/>
</changeSet>
<changeSet author="czell" id="1629825599822-13">
<addUniqueConstraint columnNames="dodid" constraintName="UKdmd3uvvpjgtxrl73rr27epyyl" tableName="person"/>
</changeSet>
<changeSet author="czell" id="1629825599822-14">
<addUniqueConstraint columnNames="name_as_lower" constraintName="UKgr7bo3kbeekg6pujbmtw37rnd" tableName="organization"/>
</changeSet>
<changeSet author="czell" id="1629825599822-15">
<addUniqueConstraint columnNames="email_as_lower" constraintName="UKov8vo1f3r327ttcseg6mrboch" tableName="person"/>
</changeSet>
<changeSet author="czell" id="1629825599822-16">
<addUniqueConstraint columnNames="email_as_lower" constraintName="dashboardUser_emailAsLower_key" tableName="dashboard_user"/>
</changeSet>
<changeSet author="czell" id="1629825599822-17">
<addForeignKeyConstraint baseColumnNames="rank_id" baseTableName="person" constraintName="FK1g22rbc0fbb7kt8fd46oxfbmt" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="rank" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-18">
<addForeignKeyConstraint baseColumnNames="dashboard_user_id" baseTableName="dashboard_user_privileges" constraintName="FK2mytcxpxyqvhpl6ufvj9s3va" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="dashboard_user" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-19">
<addForeignKeyConstraint baseColumnNames="parent_organization_id" baseTableName="organization" constraintName="FK58g5hrlhy91008gw2qpjj92td" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="organization" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-20">
<addForeignKeyConstraint baseColumnNames="organization_id" baseTableName="organization_subordinate_organizations" constraintName="FK8o5wkofu6krxlm4gvfntb7979" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="organization" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-21">
<addForeignKeyConstraint baseColumnNames="primary_organization_id" baseTableName="person" constraintName="FKesouswawv46ntkh072krwg4ai" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="organization" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-22">
<addForeignKeyConstraint baseColumnNames="organization_id" baseTableName="organization_members" constraintName="FKl40alv514imwvjr8fn96m0ysc" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="organization" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-23">
<addForeignKeyConstraint baseColumnNames="subordinate_organizations_id" baseTableName="organization_subordinate_organizations" constraintName="FKlwgehjfafk600a4mwcv4jwalh" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="organization" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-24">
<addForeignKeyConstraint baseColumnNames="leader_id" baseTableName="organization" constraintName="FKqlyg8damucorlbgbvm68dbb03" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="person" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-25">
<addForeignKeyConstraint baseColumnNames="members_id" baseTableName="organization_members" constraintName="FKsryhxbelv0adpllqsic7yd2t0" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="person" validate="true"/>
</changeSet>
<changeSet author="czell" id="1629825599822-26">
<addForeignKeyConstraint baseColumnNames="privileges_id" baseTableName="dashboard_user_privileges" constraintName="FKt6lxco0il6m5bmw7ibgyi902i" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="privilege" validate="true"/>
</changeSet>
<changeSet author="czell" id="1617980646261-1">
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">
SELECT COUNT(*) FROM rank WHERE name='Unknown';
</sqlCheck>
</preConditions>
<!-- entry to cover for an unknown rank -->
<insert tableName="rank">
<column name="id" value="af9e2a49-15da-4df8-9108-a8d5da983998" />
<column name="name" value="Unknown" />
<column name="abbreviation" value="Unk" />
<column name="pay_grade" value="Unk" />
<column name="branch_type" value="OTHER" />
</insert>
</changeSet>
<changeSet author="czell" id="seed-1">
<loadData file="../ranks/ranks.csv"
tableName="rank"
relativeToChangelogFile="true" />
</changeSet>
</databaseChangeLog>
...@@ -39,7 +39,7 @@ import static org.junit.jupiter.api.Assertions.*; ...@@ -39,7 +39,7 @@ import static org.junit.jupiter.api.Assertions.*;
*/ */
@ExtendWith(SpringExtension.class) @ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { "efa-enabled=false", "security.enabled=false"}) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { "security.enabled=false"})
@ActiveProfiles(value = { "development", "test" }) // enable at least dev so we get tracing enabled for full integration @ActiveProfiles(value = { "development", "test" }) // enable at least dev so we get tracing enabled for full integration
public class ErrorValidationIntegrationTest { public class ErrorValidationIntegrationTest {
......
...@@ -58,7 +58,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. ...@@ -58,7 +58,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@ExtendWith(SpringExtension.class) @ExtendWith(SpringExtension.class)
@SpringBootTest @SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties", properties = { "efa-enabled=false" }) @TestPropertySource(locations = "classpath:application-test.properties")
@ActiveProfiles(value = { "development", "test" }) // enable at least dev so we get tracing enabled for full integration @ActiveProfiles(value = { "development", "test" }) // enable at least dev so we get tracing enabled for full integration
@AutoConfigureMockMvc @AutoConfigureMockMvc
public class OrganizationIntegrationTest { public class OrganizationIntegrationTest {
......
...@@ -46,7 +46,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. ...@@ -46,7 +46,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@ExtendWith(SpringExtension.class) @ExtendWith(SpringExtension.class)
@SpringBootTest(properties = { "spring.liquibase.contexts=None" }) @SpringBootTest(properties = { "spring.liquibase.contexts=None" })
@TestPropertySource(locations = "classpath:application-test.properties", properties = { "efa-enabled=false"}) @TestPropertySource(locations = "classpath:application-test.properties")
@ActiveProfiles(value = { "development", "test" }) // enable at least dev so we get tracing enabled for full integration @ActiveProfiles(value = { "development", "test" }) // enable at least dev so we get tracing enabled for full integration
@AutoConfigureMockMvc @AutoConfigureMockMvc
public class PersonIntegrationTest { public class PersonIntegrationTest {
......