From b6e340937fd06abbfeeefc18cc1f17943a05e0e6 Mon Sep 17 00:00:00 2001 From: "Lam, Doris T (319E)" Date: Fri, 19 Feb 2021 17:14:53 -0800 Subject: [PATCH 1/5] limit ref id to 50 char, add checks for 500 and 409 errors --- .../main/java/org/openmbee/mms/core/config/Constants.java | 2 +- .../org/openmbee/mms/crud/controllers/BaseController.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/openmbee/mms/core/config/Constants.java b/core/src/main/java/org/openmbee/mms/core/config/Constants.java index ee6b30275..ec3502756 100644 --- a/core/src/main/java/org/openmbee/mms/core/config/Constants.java +++ b/core/src/main/java/org/openmbee/mms/core/config/Constants.java @@ -18,7 +18,7 @@ public class Constants { public static final String MASTER_BRANCH = "master"; - public static final Pattern BRANCH_ID_VALID_PATTERN = Pattern.compile("^[\\w-]+$"); + public static final Pattern BRANCH_ID_VALID_PATTERN = Pattern.compile("^[\\w-]{1,50}$"); public static final Map RPmap = new LinkedHashMap<>(); public static final List aPriv; diff --git a/crud/src/main/java/org/openmbee/mms/crud/controllers/BaseController.java b/crud/src/main/java/org/openmbee/mms/crud/controllers/BaseController.java index 8b6aa6ad2..e8171935d 100644 --- a/crud/src/main/java/org/openmbee/mms/crud/controllers/BaseController.java +++ b/crud/src/main/java/org/openmbee/mms/crud/controllers/BaseController.java @@ -5,8 +5,10 @@ import org.openmbee.mms.core.dao.ProjectDAO; import org.openmbee.mms.core.exceptions.BadRequestException; +import org.openmbee.mms.core.exceptions.ConflictException; import org.openmbee.mms.core.exceptions.DeletedException; import org.openmbee.mms.core.exceptions.ForbiddenException; +import org.openmbee.mms.core.exceptions.InternalErrorException; import org.openmbee.mms.core.exceptions.NotFoundException; import org.openmbee.mms.core.exceptions.NotModifiedException; import org.openmbee.mms.core.exceptions.UnauthorizedException; @@ -95,8 +97,12 @@ protected void handleSingleResponse(BaseResponse res) { throw new ForbiddenException(res); case 404: throw new NotFoundException(res); + case 409: + throw new ConflictException(res); case 410: throw new DeletedException(res); + case 500: + throw new InternalErrorException(res); default: break; } From 1f3e92ef9e644e421a0066d1ac20d315668cc3b1 Mon Sep 17 00:00:00 2001 From: "Lam, Doris T (319E)" Date: Tue, 23 Feb 2021 18:16:46 -0800 Subject: [PATCH 2/5] sha-1 hash to get branch table suffix for branch id > 50 length --- .../openmbee/mms/core/config/Constants.java | 2 +- example/crud.postman_collection.json | 86 +++++++++++++++++++ .../rdb/config/DatabaseDefinitionService.java | 26 +++++- .../SuffixedPhysicalNamingStrategy.java | 3 +- .../mms/rdb/repositories/BaseDAOImpl.java | 6 +- 5 files changed, 115 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/openmbee/mms/core/config/Constants.java b/core/src/main/java/org/openmbee/mms/core/config/Constants.java index ec3502756..ee6b30275 100644 --- a/core/src/main/java/org/openmbee/mms/core/config/Constants.java +++ b/core/src/main/java/org/openmbee/mms/core/config/Constants.java @@ -18,7 +18,7 @@ public class Constants { public static final String MASTER_BRANCH = "master"; - public static final Pattern BRANCH_ID_VALID_PATTERN = Pattern.compile("^[\\w-]{1,50}$"); + public static final Pattern BRANCH_ID_VALID_PATTERN = Pattern.compile("^[\\w-]+$"); public static final Map RPmap = new LinkedHashMap<>(); public static final List aPriv; diff --git a/example/crud.postman_collection.json b/example/crud.postman_collection.json index a3f223e61..e51faf156 100644 --- a/example/crud.postman_collection.json +++ b/example/crud.postman_collection.json @@ -3477,6 +3477,92 @@ } }, "response": [] + }, + { + "name": "create branch with long id", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"refs\": [\n\t\t{\n\t\t\t\"name\": \"long\",\n \"id\": \"a123456789012345678901234567890123456789012345678901234567890\"\n\t\t}\n\t]\n}" + }, + "url": { + "raw": "{{host}}/projects/aa/refs", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "aa", + "refs" + ] + } + }, + "response": [] + }, + { + "name": "post to long branch", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"elements\": [\n\t\t{\n\t\t\t\"name\": \"blah\",\n\t\t\t\"id\": \"blah\"\n\t\t}\n\t]\n}" + }, + "url": { + "raw": "{{host}}/projects/aa/refs/a123456789012345678901234567890123456789012345678901234567890/elements", + "host": [ + "{{host}}" + ], + "path": [ + "projects", + "aa", + "refs", + "a123456789012345678901234567890123456789012345678901234567890", + "elements" + ] + } + }, + "response": [] } ], "auth": { diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java b/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java index 84de0561e..15ff6014f 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java @@ -1,5 +1,9 @@ package org.openmbee.mms.rdb.config; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -158,11 +162,11 @@ public void copyTablesFromParent(String target, String parent, String parentComm return; } - final String targetNodeTable = String.format("nodes%s", target); + final String targetNodeTable = String.format("nodes%s", getSuffix(target)); StringBuilder parentNodeTable = new StringBuilder("nodes"); if (parent != null && !parent.equalsIgnoreCase("master")) { - parentNodeTable.append(String.format("%s", parent)); + parentNodeTable.append(String.format("%s", getSuffix(parent))); } JdbcTemplate jdbcTemplate = new JdbcTemplate( @@ -203,4 +207,22 @@ private Map getSchemaProperties() { return properties; } + + static public String getSuffix(String refId) { + String res = refId; + if (refId.equals(ContextObject.MASTER_BRANCH)) { + res = ""; + } else if (refId.length() <= 50) { + res = refId.toLowerCase(); + } else { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-1"); + byte[] encodedhash = digest.digest(refId.getBytes(StandardCharsets.UTF_8)); + res = new BigInteger(1, encodedhash).toString(16).toLowerCase(); + } catch (NoSuchAlgorithmException e) { + res = refId.toLowerCase().substring(0, 50); + } + } + return res; + } } diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java b/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java index 7e3584bb1..c60f33339 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java @@ -6,7 +6,6 @@ import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.openmbee.mms.core.config.ContextHolder; -import org.openmbee.mms.core.config.ContextObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +32,7 @@ public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEn @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String refId = ContextHolder.getContext().getBranchId(); - refId = refId.equals(ContextObject.MASTER_BRANCH) ? "" : refId.toLowerCase(); + refId = DatabaseDefinitionService.getSuffix(refId); return new Identifier(compoundKey(name.getText(), refId), name.isQuoted()); } diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java index d2f878092..425d98110 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java @@ -1,7 +1,7 @@ package org.openmbee.mms.rdb.repositories; import org.openmbee.mms.core.config.ContextHolder; -import org.openmbee.mms.core.config.ContextObject; +import org.openmbee.mms.rdb.config.DatabaseDefinitionService; import org.openmbee.mms.rdb.datasources.CrudDataSources; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,8 +38,8 @@ public JdbcTemplate getConn() { public String getSuffix() { String refId = ContextHolder.getContext().getBranchId(); - if(BRANCH_ID_VALID_PATTERN.matcher(refId).matches()) { - return refId.equals(ContextObject.MASTER_BRANCH) ? "" : refId.toLowerCase(); + if (BRANCH_ID_VALID_PATTERN.matcher(refId).matches()) { + return DatabaseDefinitionService.getSuffix(refId); } else { throw new IllegalArgumentException("Bad branch id, aborting current operation."); } From 3db4e3d416421344ac93537244dba55b74a3a8e0 Mon Sep 17 00:00:00 2001 From: "Lam, Doris T (319E)" Date: Wed, 24 Feb 2021 10:16:32 -0800 Subject: [PATCH 3/5] rename --- .../mms/rdb/config/DatabaseDefinitionService.java | 13 ++++++++++--- .../rdb/config/SuffixedPhysicalNamingStrategy.java | 2 +- .../openmbee/mms/rdb/repositories/BaseDAOImpl.java | 5 +++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java b/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java index 15ff6014f..1be5c9cc7 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/config/DatabaseDefinitionService.java @@ -162,11 +162,11 @@ public void copyTablesFromParent(String target, String parent, String parentComm return; } - final String targetNodeTable = String.format("nodes%s", getSuffix(target)); + final String targetNodeTable = String.format("nodes%s", getNodeTableName(target)); StringBuilder parentNodeTable = new StringBuilder("nodes"); if (parent != null && !parent.equalsIgnoreCase("master")) { - parentNodeTable.append(String.format("%s", getSuffix(parent))); + parentNodeTable.append(String.format("%s", getNodeTableName(parent))); } JdbcTemplate jdbcTemplate = new JdbcTemplate( @@ -208,7 +208,14 @@ private Map getSchemaProperties() { return properties; } - static public String getSuffix(String refId) { + /** + * Returns the suffix that should be appended to 'nodes' table given refId + * Empty for 'master', lowercased refId if refId.length <= 50, SHA-1 hash of refId otherwise + * + * @param refId + * @return + */ + static public String getNodeTableName(String refId) { String res = refId; if (refId.equals(ContextObject.MASTER_BRANCH)) { res = ""; diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java b/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java index c60f33339..4c6169f72 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/config/SuffixedPhysicalNamingStrategy.java @@ -32,7 +32,7 @@ public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEn @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { String refId = ContextHolder.getContext().getBranchId(); - refId = DatabaseDefinitionService.getSuffix(refId); + refId = DatabaseDefinitionService.getNodeTableName(refId); return new Identifier(compoundKey(name.getText(), refId), name.isQuoted()); } diff --git a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java index 425d98110..49a8c3218 100644 --- a/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java +++ b/rdb/src/main/java/org/openmbee/mms/rdb/repositories/BaseDAOImpl.java @@ -1,6 +1,7 @@ package org.openmbee.mms.rdb.repositories; import org.openmbee.mms.core.config.ContextHolder; +import org.openmbee.mms.core.exceptions.BadRequestException; import org.openmbee.mms.rdb.config.DatabaseDefinitionService; import org.openmbee.mms.rdb.datasources.CrudDataSources; import org.slf4j.Logger; @@ -39,9 +40,9 @@ public JdbcTemplate getConn() { public String getSuffix() { String refId = ContextHolder.getContext().getBranchId(); if (BRANCH_ID_VALID_PATTERN.matcher(refId).matches()) { - return DatabaseDefinitionService.getSuffix(refId); + return DatabaseDefinitionService.getNodeTableName(refId); } else { - throw new IllegalArgumentException("Bad branch id, aborting current operation."); + throw new BadRequestException("Bad branch id, aborting current operation."); } } } From 3888951a40279b4bb1c8c34f3f10698abd929348 Mon Sep 17 00:00:00 2001 From: "Lam, Doris T (319E)" Date: Wed, 24 Feb 2021 12:00:56 -0800 Subject: [PATCH 4/5] trying ci signing --- .circleci/config.yml | 2 +- build.gradle | 5 +++++ gradle.properties | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 58425046b..e433ba38d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,7 +54,7 @@ jobs: at: ~/ - run: name: Deploy snapshot to sonatype - command: echo "CircleCI publishing not implemented yet." + command: ./gradlew -PsigningKey=$signingKey -PsigningPassword=$signingPassword -PossrhUsername=$ossrhUsername -PossrhPassword=$ossrhPassword publish deploy_release: executor: openjdk_executor working_directory: /home/circleci/mms diff --git a/build.gradle b/build.gradle index 2742a3896..2e472dd6a 100644 --- a/build.gradle +++ b/build.gradle @@ -153,6 +153,11 @@ subprojects { signing { if (project.hasProperty('signing.keyId') && project.hasProperty('signing.password') && project.hasProperty('signing.secretKeyRingFile')) { sign publishing.publications.mavenJava + } else if (project.hasProperty('signingKey') && project.hasProperty('signingPassword')) { + def signingKey = findProperty("signingKey") + def signingPassword = findProperty("signingPassword") + useInMemoryPgpKeys(signingKey, signingPassword) + sign publishing.publications.mavenJava } } diff --git a/gradle.properties b/gradle.properties index efead23bc..b145c5e77 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=4.0.2 +version=4.0.3 group=org.openmbee.mms springBootVersion=2.2.6.RELEASE From 949cbfccc54f1de1f9c9c0eedcccd263949191b0 Mon Sep 17 00:00:00 2001 From: "Lam, Doris T (319E)" Date: Wed, 24 Feb 2021 13:12:30 -0800 Subject: [PATCH 5/5] revert ci --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e433ba38d..58425046b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,7 +54,7 @@ jobs: at: ~/ - run: name: Deploy snapshot to sonatype - command: ./gradlew -PsigningKey=$signingKey -PsigningPassword=$signingPassword -PossrhUsername=$ossrhUsername -PossrhPassword=$ossrhPassword publish + command: echo "CircleCI publishing not implemented yet." deploy_release: executor: openjdk_executor working_directory: /home/circleci/mms