From e760c331500234cedae831b8ed8904e28d420b56 Mon Sep 17 00:00:00 2001 From: eskander Date: Tue, 23 Apr 2024 14:08:17 +0200 Subject: [PATCH 01/17] [DSC-1510] handled Processes are not updated when the eperson that launched them gets deleted --- ...ble_process_add_foreign_key_on_user_id.sql | 17 +++++++ ...ble_process_add_foreign_key_on_user_id.sql | 17 +++++++ .../java/org/dspace/proccess/ProcessIT.java | 44 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/h2/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql create mode 100644 dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/postgres/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql diff --git a/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/h2/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/h2/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql new file mode 100644 index 00000000000..85ae350f459 --- /dev/null +++ b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/h2/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql @@ -0,0 +1,17 @@ +-- +-- The contents of this file are subject to the license and copyright +-- detailed in the LICENSE and NOTICE files at the root of the source +-- tree and available online at +-- +-- http://www.dspace.org/license/ +-- + +----------------------------------------------------------------------------------- +-- Alter TABLE process +----------------------------------------------------------------------------------- + +-- Drop the NOT NULL constraint on user_id column +ALTER TABLE process ALTER COLUMN user_id DROP NOT NULL; + +-- Add the foreign key constraint with ON DELETE SET NULL +ALTER TABLE process ADD CONSTRAINT user_id FOREIGN KEY (user_id) REFERENCES eperson (uuid) ON DELETE SET NULL; \ No newline at end of file diff --git a/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/postgres/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/postgres/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql new file mode 100644 index 00000000000..85ae350f459 --- /dev/null +++ b/dspace-api/src/main/resources/org/dspace/storage/rdbms/sqlmigration/postgres/V7.6_2024.04.23__alter_table_process_add_foreign_key_on_user_id.sql @@ -0,0 +1,17 @@ +-- +-- The contents of this file are subject to the license and copyright +-- detailed in the LICENSE and NOTICE files at the root of the source +-- tree and available online at +-- +-- http://www.dspace.org/license/ +-- + +----------------------------------------------------------------------------------- +-- Alter TABLE process +----------------------------------------------------------------------------------- + +-- Drop the NOT NULL constraint on user_id column +ALTER TABLE process ALTER COLUMN user_id DROP NOT NULL; + +-- Add the foreign key constraint with ON DELETE SET NULL +ALTER TABLE process ADD CONSTRAINT user_id FOREIGN KEY (user_id) REFERENCES eperson (uuid) ON DELETE SET NULL; \ No newline at end of file diff --git a/dspace-api/src/test/java/org/dspace/proccess/ProcessIT.java b/dspace-api/src/test/java/org/dspace/proccess/ProcessIT.java index b79bb04fa59..45e834546e4 100644 --- a/dspace-api/src/test/java/org/dspace/proccess/ProcessIT.java +++ b/dspace-api/src/test/java/org/dspace/proccess/ProcessIT.java @@ -6,7 +6,9 @@ * http://www.dspace.org/license/ */ package org.dspace.proccess; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.Collections; @@ -15,10 +17,13 @@ import java.util.UUID; import org.dspace.AbstractIntegrationTestWithDatabase; +import org.dspace.builder.EPersonBuilder; import org.dspace.builder.GroupBuilder; import org.dspace.builder.ProcessBuilder; +import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.factory.EPersonServiceFactory; +import org.dspace.eperson.service.EPersonService; import org.dspace.eperson.service.GroupService; import org.dspace.scripts.Process; import org.dspace.scripts.factory.ScriptServiceFactory; @@ -34,6 +39,7 @@ public class ProcessIT extends AbstractIntegrationTestWithDatabase { protected ProcessService processService = ScriptServiceFactory.getInstance().getProcessService(); protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); + protected EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); @Test public void checkProcessGroupsTest() throws Exception { @@ -90,4 +96,42 @@ public void removeOneGroupTest() throws Exception { assertFalse(isPresent); } + + @Test + public void checkProcessCreatorTest() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson userA = EPersonBuilder.createEPerson(context) + .withEmail("userA@email.com") + .withPassword(password) + .withCanLogin(true).build(); + + Process processA = ProcessBuilder.createProcess(context, userA, "mock-script", new LinkedList<>()).build(); + + context.restoreAuthSystemState(); + + Process process = processService.find(context, processA.getID()); + assertEquals(process.getEPerson(), context.reloadEntity(userA)); + } + @Test + public void removeProcessCreatorTest() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson userA = EPersonBuilder.createEPerson(context) + .withEmail("userA@email.com") + .withPassword(password) + .withCanLogin(true).build(); + + Process processA = ProcessBuilder.createProcess(context, userA, "mock-script", new LinkedList<>()).build(); + + ePersonService.delete(context, userA); + context.commit(); + + context.restoreAuthSystemState(); + + Process process = processService.find(context, processA.getID()); + assertNull(process.getEPerson()); + } } From 6f51d238460572cea1ad9f918297e4bea559efe2 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Tue, 21 May 2024 10:58:05 +0200 Subject: [PATCH 02/17] [DSC-1520]Configured the ROR badge in the OrgUnit details page --- .../cris-layout-tool-render-validation.xml | 1 + .../conftool/cris-layout-configuration.xls | Bin 126976 -> 127488 bytes 2 files changed, 1 insertion(+) diff --git a/dspace/config/spring/api/cris-layout-tool-render-validation.xml b/dspace/config/spring/api/cris-layout-tool-render-validation.xml index 62befb64940..9f2082832a2 100644 --- a/dspace/config/spring/api/cris-layout-tool-render-validation.xml +++ b/dspace/config/spring/api/cris-layout-tool-render-validation.xml @@ -58,6 +58,7 @@ scopus researcherid mailto + ror diff --git a/dspace/etc/conftool/cris-layout-configuration.xls b/dspace/etc/conftool/cris-layout-configuration.xls index e99967668468954f5e45e87edf4d6f8a01ffc4b2..df133a96846ee04a13f730596f531ad5d2bd68a5 100644 GIT binary patch delta 9743 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 Sp8p-Ma7(+<^5=Kl%l&^sXe@aE delta 9581 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 From e7bf84e3538eb1e919298d548eccee6a9d996d9c Mon Sep 17 00:00:00 2001 From: Nikita Krivonosov Date: Thu, 23 May 2024 15:01:04 +0200 Subject: [PATCH 03/17] [DSC-1698] - Refactoring of BulkImportFileUtil (REST) --- .../org/dspace/app/bulkedit/BulkImport.java | 14 +- ...mportFileUtil.java => ImportFileUtil.java} | 74 ++++-- .../add-bitstream-to-item-bundle.xls | Bin 9817 -> 9715 bytes .../add-bitstream-to-item-update.xls | Bin 9813 -> 9728 bytes .../bulk-import/add-bitstream-to-item.xls | Bin 9465 -> 9778 bytes ...add-bitstream-to-multiple-items-update.xls | Bin 9956 -> 9843 bytes .../add-bitstream-with-http-url-to-item.xls | Bin 0 -> 9738 bytes .../add-multiple-bitstreams-to-items.xls | Bin 10075 -> 9979 bytes ...dd-multiple-bitstreams-with-local-path.xls | Bin 0 -> 9821 bytes ...itstreams-with-path-traversal-to-items.xls | Bin 10086 -> 9946 bytes ...tiple-bitstreams-with-wrong-local-path.xls | Bin 0 -> 9905 bytes .../bulk-import/items-with-bitstreams.xlsx | Bin 12056 -> 11886 bytes .../org/dspace/app/bulkedit/BulkImportIT.java | 218 +++++++++++++++++- .../service/BulkImportWorkbookBuilderIT.java | 2 +- dspace/config/dspace.cfg | 7 +- 15 files changed, 289 insertions(+), 26 deletions(-) rename dspace-api/src/main/java/org/dspace/app/bulkimport/util/{BulkImportFileUtil.java => ImportFileUtil.java} (50%) create mode 100644 dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-with-http-url-to-item.xls create mode 100644 dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-with-local-path.xls create mode 100644 dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-with-wrong-local-path.xls diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/BulkImport.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/BulkImport.java index ba348be0fe4..999839ed3ce 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkedit/BulkImport.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/BulkImport.java @@ -59,7 +59,7 @@ import org.dspace.app.bulkimport.model.ImportAction; import org.dspace.app.bulkimport.model.MetadataGroup; import org.dspace.app.bulkimport.model.UploadDetails; -import org.dspace.app.bulkimport.util.BulkImportFileUtil; +import org.dspace.app.bulkimport.util.ImportFileUtil; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; import org.dspace.authority.service.ItemSearchService; @@ -210,7 +210,7 @@ public class BulkImport extends DSpaceRunnable inputStream = bulkImportFileUtil.getInputStream(filePath); + Optional inputStream = importFileUtil.getInputStream(filePath); if (inputStream.isEmpty()) { handler.logError("Cannot create bitstream from file at path " + filePath); @@ -1633,6 +1635,10 @@ private boolean isAppendModeDisabled() { return !configurationService.getBooleanProperty("core.authorization.installitem.inheritance-read.append-mode"); } + public void setImportFileUtil(ImportFileUtil importFileUtil) { + this.importFileUtil = importFileUtil; + } + @Override @SuppressWarnings("unchecked") public BulkImportScriptConfiguration getScriptConfiguration() { diff --git a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/BulkImportFileUtil.java b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java similarity index 50% rename from dspace-api/src/main/java/org/dspace/app/bulkimport/util/BulkImportFileUtil.java rename to dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java index d9c1c6785c2..d42b2abac8b 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/BulkImportFileUtil.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java @@ -13,18 +13,21 @@ import java.io.InputStream; import java.net.URL; import java.net.URLConnection; +import java.util.Arrays; +import java.util.Objects; import java.util.Optional; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.scripts.handler.DSpaceRunnableHandler; import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.utils.DSpace; /* * @author Jurgen Mamani */ -public class BulkImportFileUtil { +public class ImportFileUtil { public static final String REMOTE = "REMOTE"; @@ -44,7 +47,7 @@ public class BulkImportFileUtil { protected DSpaceRunnableHandler handler; - public BulkImportFileUtil(DSpaceRunnableHandler handler) { + public ImportFileUtil(DSpaceRunnableHandler handler) { this.handler = handler; } @@ -79,11 +82,11 @@ private Optional getInputStream(String path, String fileLocationTyp try { switch (fileLocationType) { case REMOTE: - return Optional.of(getInputStreamOfRemoteFile(path)); + return getInputStreamOfRemoteFile(path); case LOCAL: - return Optional.of(getInputStreamOfLocalFile(path)); + return getInputStreamOfLocalFile(path); case FTP: - return Optional.of(getInputStreamOfFtpFile(path)); + return getInputStreamOfFtpFile(path); default: } } catch (IOException e) { @@ -94,32 +97,71 @@ private Optional getInputStream(String path, String fileLocationTyp } - private InputStream getInputStreamOfLocalFile(String path) throws IOException { - String orginalPath = path; + private Optional getInputStreamOfLocalFile(String path) throws IOException { + String originalPath = path; path = path.replace(LOCAL_PREFIX + "//", ""); ConfigurationService configurationService = new DSpace().getConfigurationService(); - String bulkUploadFolder = configurationService.getProperty("bulk-uploads.local-folder"); - if (!StringUtils.startsWith(path, "/")) { + String bulkUploadFolder = configurationService.getProperty("uploads.local-folder"); + if (path.startsWith("../")) { + validateRelativePath(bulkUploadFolder, originalPath, path); path = bulkUploadFolder + (StringUtils.endsWith(bulkUploadFolder, "/") ? path : "/" + path); + } else if (path.startsWith("/") && !path.startsWith(bulkUploadFolder)) { + throw new IOException("Access to the specified file " + originalPath + " is not allowed"); } + File file = new File(path); String canonicalPath = file.getCanonicalPath(); if (!StringUtils.startsWith(canonicalPath, bulkUploadFolder)) { - throw new IOException("Access to the specified file " + orginalPath + " is not allowed"); + throw new IOException("Access to the specified file " + originalPath + " is not allowed"); } if (!file.exists()) { - throw new IOException("file " + orginalPath + " is not found"); + throw new IOException("file " + originalPath + " is not found"); + } + return Optional.of(FileUtils.openInputStream(file)); + } + + private void validateRelativePath(String bulkUploadFolder, String originalPath, String path) throws IOException { + String[] splittedUploadFolderPath = bulkUploadFolder.split("/"); + String endUploadFolderPath = splittedUploadFolderPath[splittedUploadFolderPath.length - 1]; + if (!path.contains(endUploadFolderPath)) { + throw new IOException("Access to the specified file " + originalPath + " is not allowed"); + } + String[] splittedFilePath = path.split("/"); + int endUploadFolderPathPlace = 0; + for ( int i = 0; i < splittedFilePath.length - 1; i++) { + if (Objects.equals(splittedFilePath[i], endUploadFolderPath)) { + endUploadFolderPathPlace = i; + break; + } + } + String relativePath = "/" + splittedFilePath[endUploadFolderPathPlace]; + int iterator = endUploadFolderPathPlace - 1; + while (iterator > 0 || !splittedFilePath[iterator].equals("..")) { + relativePath = "/" + splittedFilePath[iterator] + relativePath; + iterator--; + } + if (!bulkUploadFolder.contains(relativePath) || relativePath.equals(bulkUploadFolder)) { + throw new IOException("Access to the specified file " + originalPath + " is not allowed"); + } + } + + private Optional getInputStreamOfRemoteFile(String path) throws IOException { + String url = path.replace(HTTPS_PREFIX + "//", "").replace(HTTP_PREFIX + "//", ""); + String[] allowedIpsImport = DSpaceServicesFactory.getInstance().getConfigurationService() + .getArrayProperty("allowed.ips.import"); + if (Arrays.stream(allowedIpsImport).noneMatch(allowedIp -> allowedIp.equals(url))) { + return Optional.empty(); } - return FileUtils.openInputStream(file); + return Optional.of(generateUrl(path)); } - private InputStream getInputStreamOfRemoteFile(String url) throws IOException { - return new URL(url).openStream(); + public InputStream generateUrl(String path) throws IOException { + return new URL(path).openStream(); } - private InputStream getInputStreamOfFtpFile(String url) throws IOException { + private Optional getInputStreamOfFtpFile(String url) throws IOException { URL urlObject = new URL(url); URLConnection urlConnection = urlObject.openConnection(); - return urlConnection.getInputStream(); + return Optional.of(urlConnection.getInputStream()); } } diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item-bundle.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item-bundle.xls index a3372b130ddcc5318a3208148d52efdb3c046512..8aa2d3061fceec96f3e95e8e70d35697085f8631 100644 GIT binary patch delta 7141 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 delta 7240 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 Xrhi?z5VFyLBjKEEY>4Cv|7 delta 6677 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 CAVdrR delta 7581 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 RVXY`)WoW1o8K{1N{tqJqMnnJr diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-with-http-url-to-item.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-with-http-url-to-item.xls new file mode 100644 index 0000000000000000000000000000000000000000..b0b97f20c78003f6eb48a424bc750eef197eb7fe GIT binary patch literal 9738 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 literal 0 HcmV?d00001 diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-to-items.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-to-items.xls index e891108a169ff028851a3d0ab2904d1912719377..c1ee1f4bf4740a0508c6e14e64cf15a402c046ee 100644 GIT binary patch delta 6786 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 delta 6892 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 diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-with-local-path.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-with-local-path.xls new file mode 100644 index 0000000000000000000000000000000000000000..08c3e05db7aa005bd2162def48ccebca319c336b GIT binary patch literal 9821 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

|MnutQ zh^0C9$V%(x9QS-X?GVBn5kl>?#4`+(P`m(^J_KDQ@m`-GM{rsAhePkbpl7`hi+uqE#|U~+;pDUc}w_6iUriFeV-spD<-Ue z(^DjW^>hB}as57L_}S%ZPx%Dta-l^Y2cQ(+Y|tHkBm(*phnhAWLB|#M6-GPL9jmVf zQji*<&>v`kc#;o~FUdkA>kmBL{Ot7G~e>AtRDc<2DAE zC*2F`nOmVEs3ADVw@4f8TJ4e<({4aef%8WbtWCJ7;_hmn$m;)Gj0#qmVlC z&nr>9zry7X8J_^GwLL)gF1A1Wl`%l%Jh>ko2!~hOt+5ZNH|Kfv7BYk4S2AAng*b=PgfmCETk0cu=8H%<~?0zHczX9 zRsnmvubTO?Z-yjmUG!9bZKbDgUlaF>;-Dl@Zb9Z-g{xN7Yq2UFb1t^iur0`;!+820 zxlQvsrUB9Ruth?$Ua8{;d-LQ4z)NWQ%ynBneQsEe`IbnO*e@Md7^RZ7P$n!Z#9+-_ zW$y7YLDEh^&1~x}(e><^f;D!OyqnXkP0qY5aq4Lnv+}%zt6S<|vW=OCEvTB>zb6 zmzo4di4$3}6%m1xIrEyP7yG`ltG8}Hs**g<{SfM}`Mt(?U0xn0^Nr-iiZD?%oeb}5 zF?^6DL#45*-EuIaSrn)3yrPsp&=dby2J`&H=EVgAIG((DlFWEGNMJYS{NS$h`e(bN ztnf0Q7Se(iMf$fS!-gc8wX2l|$kolA)5;YDcwF2BXql+@KqfGk&)5Peml5}z%=;1& zGZpA8WHyZsIW(4A%GlBF+YbjASWXUC+|@qa?b+3FqPij~ohrp?3L+&UhUf|r?sFU3 zXp2kc^XqKYzk!RJgyzdGA*5wMev3D%OD{=`vGiU}3YTHf&MJe&GgS?bh&As*3~PHE2#S|6f;2DhP%kC=NI*Ma_7x%Z!LqTCTp>K@HAkXZP68s zs;o>mZX%sxrkJ8=#6O(%a-mi!k|iL2L}rT1$wklcqWtaX&aOH zjnz{JLGg3G(RV%E)5f|7O)B^fkv9}9jUHS-Bm3SOdM+6Hygg0+;9)(&jLl+b(+ql;-cBn$aPgbILot4thRQ&ESTV^N8F6}4(5>0by%E*Ywe>B8$$NGxxK znGF9R9422l6*CY>`11q~R)opuE! zBezYM+@sX5bYSW^3(v?_?*bdE{tjtjC=opObu6Lz^irvF&<`iKC z+X!r}p7X}E@KM9iv20Y1La*^0N*Bi0&@+UrIA~>Eweo>leDUKwSqB@?DZ)Clnv3DM z*EIe@*C%^V?vydCSC6k&T&ew>ivw-JKTGTS98_=y7> zbpENyxFR@3MXwSiy?_t@DLNuh94#0(Nz=4sedK_;1%q+Zl*dSU;>FmuFuJnU7P?e+ zYFABsIGhV@vj!Szt1f(U<|q)_ZsFLBn&tzv3(clr4-kYXWU9mP!EABUaK5K^t#RC4 z%RZ{KlBs(jA}O{=E;mG}2`b|$*qzWhx1ZpvyN6 z{ZAJ?S+ga%`aeFkw85Qt`xdUBe15v5zG5O$<5Ylp2j~YTosr4chRLErwV|#}M{z4t zhU%?YsOIiXeJH9PYk^sAXkomQ-lixJAivB>dJpPZaV5I~OaMt6ZxMeG(m?S%2KO@yi$?KlR5hjz67$pG`gv-+$RFh#rAB{~E>r>H7QJj`o)y zBWWGXDhpy(j=pvj01Z5QK66%YXUV2>cV}cPadL6c31?`!6Uzdjfx={H_omW%DnKCjN=?4V!0&h8-vPED0RM$CHI(5YnG6Mm0eKWdZif<@$4~zQoK(Nn literal 0 HcmV?d00001 diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-with-path-traversal-to-items.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-multiple-bitstreams-with-path-traversal-to-items.xls index 0bd098205ed4ab7ee8582088b5e057a0a416098a..b4585e611959986f81aa5c316ce0a6a72098a9a3 100644 GIT binary patch delta 6817 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 delta 6917 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≧|UK)^=GIAuyt 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 diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java index e1d04f314c6..186a79a8767 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java @@ -39,7 +39,11 @@ import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.CombinableMatcher.both; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -54,6 +58,7 @@ import org.apache.commons.io.IOUtils; import org.dspace.AbstractIntegrationTestWithDatabase; +import org.dspace.app.bulkimport.util.ImportFileUtil; import org.dspace.app.launcher.ScriptLauncher; import org.dspace.app.matcher.DSpaceObjectMatcher; import org.dspace.app.scripts.handler.impl.TestDSpaceRunnableHandler; @@ -85,6 +90,12 @@ import org.dspace.eperson.Group; import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.service.GroupService; +import org.dspace.scripts.DSpaceRunnable; +import org.dspace.scripts.configuration.ScriptConfiguration; +import org.dspace.scripts.factory.ScriptServiceFactory; +import org.dspace.scripts.service.ScriptService; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.workflow.WorkflowItem; import org.junit.Before; import org.junit.Test; @@ -117,6 +128,10 @@ public class BulkImportIT extends AbstractIntegrationTestWithDatabase { private SearchService searchService = SearchUtils.getSearchService(); + private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + + private final ScriptService scriptService = ScriptServiceFactory.getInstance().getScriptService(); + private Community community; private Collection collection; @@ -1464,9 +1479,9 @@ public void testUploadMultipleBitstreams() throws Exception { assertThat(getItemBitstreamsByBundle(item, "TEST-BUNDLE2"), contains( bitstreamWith("Test title 2", "test file description 2", - "this is a second test file for uploading bitstreams"), - bitstreamWith("Test title 3", "test file description 3", - "this is a second test file for uploading bitstreams"))); + "this is a test file for uploading bitstreams"), + bitstreamWith("Test title 3", "test file description 3", + "this is a second test file for uploading bitstreams"))); assertThat(getItemBitstreams(item), hasSize(4)); @@ -1523,6 +1538,203 @@ public void testUploadMultipleBitstreamWithPathTraversal() throws Exception { } + @Test + public void testUploadBitstreamWithRemoteFilePathNotFromAllowedIps() throws Exception { + + try { + context.turnOffAuthorisationSystem(); + Collection publication = createCollection(context, community) + .withSubmissionDefinition("publication") + .withAdminGroup(eperson) + .build(); + context.commit(); + context.restoreAuthSystemState(); + + configurationService.setProperty("allowed.ips.import", new String[]{"127.0.1.2"}); + + String fileLocation = getXlsFilePath("add-bitstream-with-http-url-to-item.xls"); + + String[] args = new String[] { "bulk-import", "-c", publication.getID().toString(), "-f", fileLocation, + "-e", eperson.getEmail()}; + TestDSpaceRunnableHandler handler = new TestDSpaceRunnableHandler(); + + handleScript(args, ScriptLauncher.getConfig(kernelImpl), handler, kernelImpl, eperson); + + assertThat(handler.getErrorMessages(), contains( + "Cannot create bitstream from file at path http://127.0.1.1")); + assertThat(handler.getWarningMessages(), contains( + containsString("Row 2 - Invalid item left in workspace"), + containsString("Row 3 - Invalid item left in workspace"))); + assertThat(handler.getInfoMessages(), contains( + is("Start reading all the metadata group rows"), + is("Found 4 metadata groups to process"), + is("Start reading all the bitstream rows"), + is("Found 1 bitstreams to process"), + is("Found 2 items to process"))); + + Item item = getItemFromMessage(handler.getWarningMessages().get(0)); + Item item2 = getItemFromMessage(handler.getWarningMessages().get(1)); + + assertThat(getItemBitstreamsByBundle(item, "TEST-BUNDLE"), empty()); + assertThat(getItemBitstreamsByBundle(item, "TEST-BUNDLE2"), empty()); + assertThat(getItemBitstreamsByBundle(item2, "SECOND-BUNDLE"), empty()); + + } finally { + configurationService.setProperty("allowed.ips.import", new String[]{}); + } + } + + @Test + public void testUploadBitstreamWithRemoteFilePathFromAllowedIps() throws Exception { + try { + InputStream mockInputStream = new ByteArrayInputStream("mocked content".getBytes()); + + context.turnOffAuthorisationSystem(); + Collection publication = createCollection(context, community) + .withSubmissionDefinition("publication") + .withAdminGroup(eperson) + .build(); + context.commit(); + context.restoreAuthSystemState(); + + configurationService.setProperty("allowed.ips.import", new String[]{"127.0.1.1"}); + + String fileLocation = getXlsFilePath("add-bitstream-with-http-url-to-item.xls"); + + String[] args = new String[] { "bulk-import", "-c", publication.getID().toString(), "-f", fileLocation, + "-e", eperson.getEmail()}; + TestDSpaceRunnableHandler handler = new TestDSpaceRunnableHandler(); + + ImportFileUtil importFileUtilSpy = spy(new ImportFileUtil(handler)); + doReturn(mockInputStream).when(importFileUtilSpy).generateUrl(anyString()); + + ScriptService scriptService = ScriptServiceFactory.getInstance().getScriptService(); + ScriptConfiguration scriptConfiguration = scriptService.getScriptConfiguration(args[0]); + + BulkImport script = null; + if (scriptConfiguration != null) { + script = (BulkImport) scriptService.createDSpaceRunnableForScriptConfiguration(scriptConfiguration); + script.setImportFileUtil(importFileUtilSpy); + } + if (script != null) { + if (DSpaceRunnable.StepResult.Continue.equals(script.initialize(args, handler, eperson))) { + script.run(); + } + } + + assertThat(handler.getErrorMessages(), empty()); + assertThat(handler.getWarningMessages(), contains( + containsString("Row 2 - Invalid item left in workspace"), + containsString("Row 3 - Invalid item left in workspace"))); + assertThat(handler.getInfoMessages(), contains( + is("Start reading all the metadata group rows"), + is("Found 4 metadata groups to process"), + is("Start reading all the bitstream rows"), + is("Found 1 bitstreams to process"), + is("Found 2 items to process"), + containsString("Sheet bitstream-metadata - Row 2 - Bitstream created successfully"))); + + Item item = getItemFromMessage(handler.getWarningMessages().get(0)); + + assertThat(getItemBitstreamsByBundle(item, "TEST-BUNDLE"), contains( + bitstreamWith("Test title", "test file description", + "mocked content"))); + + } finally { + configurationService.setProperty("allowed.ips.import", new String[]{}); + } + } + + @Test + public void testUploadMultipleBitstreamWithCorrectLocalPath() throws Exception { + + context.turnOffAuthorisationSystem(); + Collection publication = createCollection(context, community) + .withSubmissionDefinition("publication") + .withAdminGroup(eperson) + .build(); + context.commit(); + context.restoreAuthSystemState(); + + String fileLocation = getXlsFilePath("add-multiple-bitstreams-with-local-path.xls"); + + String[] args = new String[] { "bulk-import", "-c", publication.getID().toString(), "-f", fileLocation, + "-e", eperson.getEmail()}; + TestDSpaceRunnableHandler handler = new TestDSpaceRunnableHandler(); + + handleScript(args, ScriptLauncher.getConfig(kernelImpl), handler, kernelImpl, eperson); + + assertThat(handler.getErrorMessages(), empty()); + assertThat(handler.getWarningMessages(), contains( + containsString("Row 2 - Invalid item left in workspace"), + containsString("Row 3 - Invalid item left in workspace"))); + assertThat(handler.getInfoMessages(), contains( + is("Start reading all the metadata group rows"), + is("Found 4 metadata groups to process"), + is("Start reading all the bitstream rows"), + is("Found 2 bitstreams to process"), + is("Found 2 items to process"), + containsString("Sheet bitstream-metadata - Row 2 - Bitstream created successfully"), + containsString("Sheet bitstream-metadata - Row 3 - Bitstream created successfully"))); + + Item item = getItemFromMessage(handler.getWarningMessages().get(0)); + Item item2 = getItemFromMessage(handler.getWarningMessages().get(1)); + + assertThat(getItemBitstreamsByBundle(item, "FIRST-BUNDLE"), contains( + bitstreamWith("Test title 2", "test file description 2", + "this is a second test file for uploading bitstreams"))); + assertThat(getItemBitstreamsByBundle(item, "TEST-BUNDLE2"), empty()); + assertThat(getItemBitstreamsByBundle(item2, "SECOND-BUNDLE"), contains( + bitstreamWith("Test title 3", "test file description 3", + "this is a third test file for uploading bitstreams"))); + + } + + @Test + public void testUploadMultipleBitstreamWithWrongLocalPath() throws Exception { + + context.turnOffAuthorisationSystem(); + Collection publication = createCollection(context, community) + .withSubmissionDefinition("publication") + .withAdminGroup(eperson) + .build(); + context.commit(); + context.restoreAuthSystemState(); + + String fileLocation = getXlsFilePath("add-multiple-bitstreams-with-wrong-local-path.xls"); + + String[] args = new String[] { "bulk-import", "-c", publication.getID().toString(), "-f", fileLocation, + "-e", eperson.getEmail()}; + TestDSpaceRunnableHandler handler = new TestDSpaceRunnableHandler(); + + handleScript(args, ScriptLauncher.getConfig(kernelImpl), handler, kernelImpl, eperson); + + assertThat(handler.getErrorMessages(), contains( + "Access to the specified file file://../test_2.txt is not allowed", + "Cannot create bitstream from file at path file://../test_2.txt", + "Access to the specified file file:///bulk-uploads/test_2.txt is not allowed", + "Cannot create bitstream from file at path file:///bulk-uploads/test_2.txt", + "Access to the specified file file:///subfolder/test_2.txt is not allowed", + "Cannot create bitstream from file at path file:///subfolder/test_2.txt")); + assertThat(handler.getWarningMessages(), contains( + containsString("Row 2 - Invalid item left in workspace"), + containsString("Row 3 - Invalid item left in workspace"))); + assertThat(handler.getInfoMessages(), contains( + is("Start reading all the metadata group rows"), + is("Found 4 metadata groups to process"), + is("Start reading all the bitstream rows"), + is("Found 3 bitstreams to process"), + is("Found 2 items to process"))); + + Item item = getItemFromMessage(handler.getWarningMessages().get(0)); + Item item2 = getItemFromMessage(handler.getWarningMessages().get(1)); + + assertThat(getItemBitstreamsByBundle(item, "FIRST-BUNDLE"), empty()); + assertThat(getItemBitstreamsByBundle(item, "TEST-BUNDLE2"), empty()); + assertThat(getItemBitstreamsByBundle(item2, "SECOND-BUNDLE"), empty()); + + } + @Test public void testUploadSingleBitstreamUpdate() throws Exception { context.turnOffAuthorisationSystem(); diff --git a/dspace-api/src/test/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderIT.java b/dspace-api/src/test/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderIT.java index 4d4af87ddaa..43035f8b197 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderIT.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkimport/service/BulkImportWorkbookBuilderIT.java @@ -118,7 +118,7 @@ public void setup() throws SQLException, AuthorizeException { @SuppressWarnings("unchecked") public void testWorkbookBuildingFromItemDtos() throws Exception { - configurationService.setProperty("bulk-uploads.local-folder", System.getProperty("java.io.tmpdir")); + configurationService.setProperty("uploads.local-folder", System.getProperty("java.io.tmpdir")); context.turnOffAuthorisationSystem(); diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index 62b82851f9d..fe94feee162 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -1589,8 +1589,11 @@ google-metadata.enable = true # Where to temporarily store uploaded files upload.temp.dir = ${dspace.dir}/upload -# Where to lookup for local files to upload via the bulk import -bulk-uploads.local-folder = ${dspace.dir}/bulk-uploads +# Where to lookup for local files to upload via the import +uploads.local-folder = ${dspace.dir}/bulk-uploads + +# Allowed domain list from which we can retrieve remote files +#allowed.ips.import = 127.10.10.10, 127.10.10.11 ###### Statistical Report Configuration Settings ###### From 2eeafe1f5736271ccce2cd57fcbc855763767bf9 Mon Sep 17 00:00:00 2001 From: Vincenzo Mecca Date: Tue, 28 May 2024 16:17:31 +0200 Subject: [PATCH 04/17] [DSC-1698] Filepath check improvements --- .../app/bulkimport/util/ImportFileUtil.java | 77 ++++++++----------- 1 file changed, 33 insertions(+), 44 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java index d42b2abac8b..281d9f38339 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java @@ -13,16 +13,15 @@ import java.io.InputStream; import java.net.URL; import java.net.URLConnection; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; -import java.util.Objects; import java.util.Optional; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.scripts.handler.DSpaceRunnableHandler; -import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; -import org.dspace.utils.DSpace; /* * @author Jurgen Mamani @@ -45,6 +44,25 @@ public class ImportFileUtil { private static final String UNKNOWN = "UNKNOWN"; + /** + * This method check if the given {@param possibleChild} is contained in the specified + * {@param possibleParent}, i.e. it's a sub-path of it. + * + * @param possibleParent + * @param possibleChild + * @return true if sub-path, false otherwise. + */ + private static boolean isChild(File possibleParent, File possibleChild) { + File parent = possibleChild.getParentFile(); + while (parent != null) { + if (parent.equals(possibleParent)) { + return true; + } + parent = parent.getParentFile(); + } + return false; + } + protected DSpaceRunnableHandler handler; public ImportFileUtil(DSpaceRunnableHandler handler) { @@ -98,53 +116,24 @@ private Optional getInputStream(String path, String fileLocationTyp private Optional getInputStreamOfLocalFile(String path) throws IOException { - String originalPath = path; - path = path.replace(LOCAL_PREFIX + "//", ""); - ConfigurationService configurationService = new DSpace().getConfigurationService(); - String bulkUploadFolder = configurationService.getProperty("uploads.local-folder"); - if (path.startsWith("../")) { - validateRelativePath(bulkUploadFolder, originalPath, path); - path = bulkUploadFolder + (StringUtils.endsWith(bulkUploadFolder, "/") ? path : "/" + path); - } else if (path.startsWith("/") && !path.startsWith(bulkUploadFolder)) { - throw new IOException("Access to the specified file " + originalPath + " is not allowed"); - } - - File file = new File(path); - String canonicalPath = file.getCanonicalPath(); - if (!StringUtils.startsWith(canonicalPath, bulkUploadFolder)) { - throw new IOException("Access to the specified file " + originalPath + " is not allowed"); + Path uploadPath = Paths.get( + DSpaceServicesFactory.getInstance() + .getConfigurationService() + .getProperty("uploads.local-folder") + ); + File file = uploadPath.resolve(path.replace(LOCAL_PREFIX + "//", "")) + .toFile() + .getCanonicalFile(); + File possibleParent = uploadPath.toFile().getCanonicalFile(); + if (!isChild(possibleParent, file)) { + throw new IOException("Access to the specified file " + path + " is not allowed"); } if (!file.exists()) { - throw new IOException("file " + originalPath + " is not found"); + throw new IOException("file " + path + " is not found"); } return Optional.of(FileUtils.openInputStream(file)); } - private void validateRelativePath(String bulkUploadFolder, String originalPath, String path) throws IOException { - String[] splittedUploadFolderPath = bulkUploadFolder.split("/"); - String endUploadFolderPath = splittedUploadFolderPath[splittedUploadFolderPath.length - 1]; - if (!path.contains(endUploadFolderPath)) { - throw new IOException("Access to the specified file " + originalPath + " is not allowed"); - } - String[] splittedFilePath = path.split("/"); - int endUploadFolderPathPlace = 0; - for ( int i = 0; i < splittedFilePath.length - 1; i++) { - if (Objects.equals(splittedFilePath[i], endUploadFolderPath)) { - endUploadFolderPathPlace = i; - break; - } - } - String relativePath = "/" + splittedFilePath[endUploadFolderPathPlace]; - int iterator = endUploadFolderPathPlace - 1; - while (iterator > 0 || !splittedFilePath[iterator].equals("..")) { - relativePath = "/" + splittedFilePath[iterator] + relativePath; - iterator--; - } - if (!bulkUploadFolder.contains(relativePath) || relativePath.equals(bulkUploadFolder)) { - throw new IOException("Access to the specified file " + originalPath + " is not allowed"); - } - } - private Optional getInputStreamOfRemoteFile(String path) throws IOException { String url = path.replace(HTTPS_PREFIX + "//", "").replace(HTTP_PREFIX + "//", ""); String[] allowedIpsImport = DSpaceServicesFactory.getInstance().getConfigurationService() From 933d980faaed67254de3deaa6ef580406f5f8468 Mon Sep 17 00:00:00 2001 From: Vincenzo Mecca Date: Tue, 28 May 2024 16:31:47 +0200 Subject: [PATCH 05/17] [DSC-1698] Reverts unchanged xls files --- .../add-bitstream-to-item-bundle.xls | Bin 9715 -> 9817 bytes .../add-bitstream-to-item-update.xls | Bin 9728 -> 9813 bytes .../bulk-import/add-bitstream-to-item.xls | Bin 9778 -> 9465 bytes ...add-bitstream-to-multiple-items-update.xls | Bin 9843 -> 9956 bytes ...itstreams-with-path-traversal-to-items.xls | Bin 9946 -> 10086 bytes .../bulk-import/items-with-bitstreams.xlsx | Bin 11886 -> 12056 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item-bundle.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item-bundle.xls index 8aa2d3061fceec96f3e95e8e70d35697085f8631..a3372b130ddcc5318a3208148d52efdb3c046512 100644 GIT binary patch delta 7240 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 diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item-update.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item-update.xls index 5aeb10706c8018a8981809230449201fcd4dba12..e6dba0d87ddb199224f92722b2307a587197eaa9 100644 GIT binary patch delta 6677 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 Xrhi?z5VFyLBjKEEY>4Cv|7 diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-item.xls index 0e0f4eab4282c8dadb7b1796d68dcd26d3b13e3f..5878ccdd227fce8592d2c58230a4f727be97d110 100644 GIT binary patch delta 7581 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 CAVdrR diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-multiple-items-update.xls b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/add-bitstream-to-multiple-items-update.xls index 30f7e1b64e87678c9e6d6bf3e07ed8ee8d452b0e..c98bf482f109bdd5ee03f66fd762d7cf6b65c7bf 100644 GIT binary patch delta 6760 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 RVXY`)WoW1o8K{1N{tqJqMnnJr delta 6646 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 SMDW)X&}Ld1#&%my{sg-JnBCNvCu-NW)KjzrXeI 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 diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/items-with-bitstreams.xlsx b/dspace-api/src/test/data/dspaceFolder/assetstore/bulk-import/items-with-bitstreams.xlsx index 4291f80e8d03b0cc80cc318789919b5fc054a3ef..b99836ce10f0fadd61e5a24b73c65884f6d8a55f 100644 GIT binary patch delta 8895 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 delta 8731 zcmaKy1yGw?w}ykeYjJm%qQyP96{omcfMSIdcMT=b0!53LQrwF}ad&rjigRhto&TKk z-y>4fibDK9OrHXjf04LjLMLA}>@^IDQ7o_#%`YzX2pT-F_pE*r&@JFXnCeEi% zwiPPdQi{UTU!$#<_anL*X5&J_zxs9F&cA;g(k61rvM{-)m^dsM0UwB>w~Y!ldS-Wm zOMfWlkw||;sP?3L$rYl|ZXZkOknZIWIeQzX9Lw)=kJn_)DbVDo%s-3FMERqU=wewN zh=j~HB8$=m004ww0DymA1jrN;KN!9JGxjJkMG5cw7&JO}s0~(vX`8_kFM%lhZ z_Rh5XTZZ0Q-}Ky5ZAe#GDGOm!u@WBX7TsUIQI|1H8EeNA>d&&FwNxTl_zAv~Oa#iU zpJnsCz+R@r()`I=8+BsvsES@OdlHcmZ43RbtRqPWEDXAcW*RGE{G&T7dh3WP}GQsJ)=pSD)N*UA{|iePLpee=qYV>aDWj4-H8{-)#`lN+&!S@ zJlEA8FGV$!18}(q`okCyg2656OO>QwS~jg(8wjRH-ZUWf-(&@N3&jg56c#KdI##;A zZrh)vA5FkL&8UEfXyt?{1j!-w*dD|y^r#-%$Q8XY}gTQzB?EoMy+y3p=nZ= zM#vYKN;6Gn!=`v4Vazx-gC)U5(J%zT-c^yoOJF{En0nYgb8FN=^OdFS`Z|$+G`Z=@ z*ct3R=H~xOWs|GwhtOocmd&a#zQM23p|Gms68Vg^&-O~aZrvU$SJi2sqCtZ{ET@&; zql$Z%)+7+&y9=K8SWbX@;VVIXRa+xK(ZU19RE%*=2X>Z>@|jHf_nhZ;wJ?(WO>HPo zAk2@1o2F&XQs+7Rfump5Y0B_QtZn<(Q>~bs`qIWs6X@@^^>13$<9)-brgTyhj}x;A zcdVE@J|Ca`Rg_4az&MR53Z>i{4VCv2F}55#r&d_ZJdM=*-s0 zoxi&MdmWS&Og$9+NQx@50q5DSYq5S@p+AT<-V5R24;03ST9z{XXhJ?HC-RAXfsjh7 z626p&rD-7#vn3Bc5hlH?@QtNLNTo%{MnY{8Waf^O;gUyfL+YR?g%Sg4Qt1;F#ijXE zWHM)S;r(N(W{J#F@Rge=_L7O^X@(DCf+)x$pS@JtP%+11KPvt>nM}7lJIXT>d77O^ z+pU{dsc_FDj*#QtTkp0ZM!L}j36BkYx={a;?Usk_1*VI?khDiQ0(~%z5ogn2A&vzmBs_u;~8FMEYiqW_D&-j7M#AYk&#}hwDb(T?!DOV?v*ot>R z99?aRn^-$hEw{}}TomF6dPUkhPuDNi&%6*(ET%nfNr4(PE32>uzkpz|nSFSN&Up?R zLD_Uq9PkFd+mdWZL4=oa=Lx>ssBDZX&T(VJDf8O*=+tx?F%O(^tv3(Q4$BR(p0>_Bgy@;WMF2Ir%C3VprPEQ+xV&W>Z5ngo7x4g$tID|4K*4qJ|PQm zn)&z3FN?fI-V=w!+S|0B3!Anj(v!C_TLg;KX!acF&(2Vmv_CaE`J`tb%Sm!! ztTdCwp`3=F49FpedSQIzO*1~);Ilak6R+5FFy0@@7A@g6J=&k&GHl-8!FJI9-m{jl z=&WB8rqSL2Aw$&91hX#~DbO>&PVklj=Z5PLKFxq8$({r&^2#775%hg&3YU@w*~3cT z@id0rzt(t`{aTrjHbTd5HWHF`w*odr4wh*>ug0DwNSe`f*MTD|8qKnv#K@OE-6(*?%Q z3!=9imvg;yx$n(Q3xwo+nsp>fec5H*fN=Fi55yM3=1WhXHc)P=^qqV=&>YiUkuGUX zJ|J1a=CcV4&OzE3*#?_3q8l++8r&vG1Pv_8F0R}mK}y4nLp94L%0nLT@hOE|;?;f< zH(nN8k&T(1vOlG)Feg}F_5xtfprQ4?IHIj=POd>WM%}9rSA(PnQb=PIw$#z=8;!+; znpug|>qP+R7ST|~4qn|)nr^tfl3Lz~X94}tp7-{p7V}ow=6qp%Q{w$qLfQ;bNL$5r zT7OB_%f?6d#t^n7!gpzsa>OmR)@YsVaYJI(#k7y*GOtO#5#QNe+L^D+A?gJF&J zmi*zx7D`KQmX7>6n?2?*@6SXj!z+mjbHV`CBch^eSHvgRwy(JUB{WS7ZSO;t;5gn|HuIVYKbhkm^+B`1pJIl~rBa-j>yltS4ofiZ4Ht;#6 z@so%$+kxMM4nn{c+*A~Wx-C5kHrZA0P%lubyY#rI9W%`m4Ch<1-|(OYzkY9@ffvX| z@3t@xcJJZLPZ^d6g=DPfkIqehgYmAR*%zqM0omyVIGCHN;>i+YCm-qKsmv|ksb)@nmF{x z^iytGywzOei=JQ)%UvJS-l{-l7YS8J8=pV8*9=am3Fd~ILb>}0*E_)9f+lQ$7a?3i z$XWCor))TQa_X7}-sLVjN93YpgUbfZ`g7b{LT|lX4{^#a{i@nieuma%F2x}gLILHm zA-eX?hJ!IvD=6ld;|x<@^4SxbR#JxC=zHhX7|ye3-w&k(P-~q=6vE^g9=E-8gM+IH z6HfY>t;SD?QLRCIGHkAFJd=%3!Fi0~a)QLq1g4STIS@SISCpRMcojqEshO$;)bcSz zbkO{f()9eHb2{BPUF7&Goys~+CNp5bNoQiPz&O^p!rFe&^t5}K+M*frU`uzt`=irz zUHgv)J?3!LRjSWQ46jq^2@Two$NbR-+DVc%LM&Prk(0#1DHk?G#bQ5Q|^N z5?111mMU_xvzUqSkLz&N+0~AjbV3sgx{MXGKDsG!@86&0NOb4xgYwnXGrVPYDeuNN zGi)S^DAT+peI1N^<4qRI?%vcLw)Ad2!Tp9k&nJGW84duLMEN)DwR+EW;D3zx+4FYf z^l||?xI@Hn@xU(gg4oT+<=7tOmu5ZHaI>=0`YuEY`{o(Wfz6{dRyf&$21zyR_qXIp zNo?S(UTSCv8RmAgkMyA6-Gyf4o8jawDjPGNh>rJtWK7U`{p)qR8#7$QIc&v9K%ez$ z;_k`#eeD5YPahhS27ps|g$A_PyJH&j>0`-3Qs<3i1S1qi5ib-wHE#_nO=89d;Kyw}L6OY09aJ==O`Zb|T!DxwBo3cPEU-O_m-6 zAAvR2x;E(w^X z@~NbFMZqO~DP?Il8jbGf@XMnk6u;T$cxGSYpX^_{V*bs3;<76CVwiikI6*E0p@9iGc7_+5mZ|co1(5SgXU>iKkWes?ZMxA~KM zHwtmz+#C1`t{i3nqK1%I(s`D8zS0){3RBe%8g%663eXI4_3P0->*<_8Q4OIo@NU26 zCGeN!x2ag%!ge)PmB^+OLkiV(H{a>L5S^R$(k<_(De&u3*+!RS#PT!RdEUUKIF;qF zRe#Xvi(64?+3GuoYJ$9}=Ce%^r!0Hho7?1cO$L{C;en_oD*5~2{JZkO(WxGm!;Xcn zXZAP$!~S@i>)B&M2O`KD4wQ->=5>VQ?f*CXPJh^cMn5R%*Mls0l>Al)lv;^U`OH3r zw|=hYU+mwLK$l(WVupVY^HvNoWWK&r|na36m{^ZBHX5Qo@@?{-M63`3K4^Tf z9?;|K@?~SjfJlAT6n#z=!G~c_dhirjIbmSHua-h)?_2_zIcQ=5GD=AJXk@L8vDJ?; z77jJ#T*N=@S`G1LO$jCVE-q@^Zico z&3Y>CxqmRv5*)CDdx;3PbX22P6`d^}p!;C?w)l!6n2QCiQ=vWXe7~07>__UNl9LZ4 z*vVkfue_0dXXv8eL8**=E9je}^{=y%MtJvb}$kQ)^BO7zyZ4rG|H|~AswLfHl+dYC_1CFYF1F3MxKjO(f*~cw16yK zB}O|v7z;7l0(Xs+kdS#O4`wx$2IWjv3gjl?7rPWnoTAeI{i!SL=zXp zpvRVxke^>Q&ct}M!8FA8F8&+-sY;?Lz!kHt44EEO&Odivgb3aM>nay^-jhaWad79r zb{ND>UBBq3tT%yj9^jydTX~6j_J7(QkB~ssnPrb#PxGH_Z6amCIy_-)6B)gBiVQhS z$turMAX}+AWn~9*Nq{kE~C*-2-&N#0L)rz*K*kE@h;o(a-^SVXhSr0wgThpAfBUW2Vy zJ5yMH^>KPj7kEF05LjJof?9WTr~Wa2iCcY-2QMM?GhGr2cxO+9c6mQuUh)G2(@%0; z=5U?iK=%j4EtRKP=yF?wXC2yMuoQ@vdpOIfIzb^ zQYeu$>7HZuL-@@>O4kf&kA$FdmOPMgw}2}Z->-#a6UALmjkxqkuYjMDib6X%>4L$J zH_Q)7W5+oc;EdDj`(#PQ7ar=quL^#N%LuVChm$75@D!J!xqW^&>4-U#*yO0Pab4!6rP<)?O7JEa*u6 zULV(q+$1Hwc^92!iv#_rKNtg>mw|NJnLi(lFT~fA5dGYysC=5X?Yz7I?O6Bs7lW(W z5l(;bt98De1qM|jMG!^}qrjIiwx?zAatP6kye(%!6?m-w? z-@XdpKA<-)$q#}zDR{A0I+c>JDWjuU%gykZA4l?5j!b%sx1P>uLi@uFb(C}MWmqOy zO&>q4&F&E;|7JV%@&2OZ&Dl9xjAQ#P=K2gCP~++j&!j`Ndobr}-|u$ces78kbu{9} zCBlBA;^J5y!_d4<%()W_)GJH z*pV@UK?`*_{==`czFY_j7_%4AIWZ@t7ye8k2dZXDVyCx-(bd%r_&$jhxKS6Wuym!d zh%0=g9+mjDJ6`ZfG%Jog(ZcA2=qPfAtgS+{juFV+zp84m-=oggKfjrpG!NtaKyJ3IwXH=PEo$;P3xTa3aZrnAz+`966Mq*QyA+xbox$4w@ zv`&YPh=tVM)Z!4wko7?Ao&YE1TIhNI>|(5rm%wU*!@OHyWkvJ{YepNd;dlX7FR#iR z`X`&&hmQGkC{z&$tkBMP%qULg>(?xSD=i(#s6`@X@#}Rn&ix5DPqxzW-%P6 zd6c4^Text&dw1`R^nxbn`%%om;RYa74ji8qLiyg-r4cLVIVK{G*+OK|!0ABO(+`f; z!%#8!rC>b;V*3l@+g%xQ=16sCPHp)%)&0=;ao;Vbwga!tni!FuuA0Ey0k7(nAvd^HN-tW|NFs)O4!e{+3{bue3eV$dZRmMw9 zrMN|H5gQ}qWxb{Egvd`@K5!08P4fXVO`)L%dS9Fhx|9p zeXsA`nLoe3zfSUxN1N>KXvQ9G0%I{#pkNu9_?xnVn9}2IV`>yYil5qL_%rzOgEAI= zz$p73@Is|(7I+v*mBmKeMRZvlr6TyGNcFgN);_vQRO=$>BEUJN9NciG&cLGzlIJgXi&7x%BR4x zAGPWyu4$ma;yUa~4lC&kZW|{mOpfr47%KWF*!r!3BHcpVVD7}C&K3kCIA@OuT@)pD z1r1*WQRyS0)FQzWbmU@NFnC}y1uv4sx>{W?*i8yAhIpzTjTBa~9qX6Uy?UrcQckgp z$3ES=@YggWXvp{W*O0MjNKWlJHUo#ezhKIb`*# z%9o)(OMCg=Lp=qvh<>C~i)srOx9z}D5`>SazGvjIbC{^K*WwT{Dw&&Rw4VW;Pg~B#&T%e#C%PGCK z4citsTsEIp(;ND!_w+)ajvXNzNDUzmKv}k`;%pP{Bfo@iVjrKt1pXuO6aL*fi%O{4 z-ocjWA-#+F$6gubUd5XXIGkQd6s^wvi4Gk-hVNv2tq9$J{(NUkEt#%apkOkH6bmR* z=%AgOA*W^yVoqX|PdtUg6=lG7(yPHem+Wwh+onG@#L($VPwBo&i^#0qlNH3oFJq}8 z#*x_(A?@%&710m@5AVMkgZ6~~NSg?vv42B5NR)_17r>9?g~K%|JLGP^*O!q|E^@rn z2k~D7p~bZ~W>bgIp!o}rWkK~KJ2dL0d5P^Cq$9jBiAR9m`Clmt5M=dgTL}Eiu1au| zXXOAL}Yko@6oB`|1mGe6v{sW2y5%2cHY8zx>Z{Urx zv=&(%6Hpf_vm}VTMTSWLt+Hifv9tY|FFfFflSyZ;xaylD3%dbB8zbWl>M#0|g_1v- z3}d6U-fIp{HXd}M25}dDK=T+;fLd35-Z>^;1T5yWcAtPpcMXS>hmci+d+n2Uf+P zMQs8fYSpA)blzV+&X4!co3EkWoR}AMMTR0p0FM@R)%*%d>v^!La*HjiH*`YV-rR~n zTudJk1j@_R7+O$lQ86R74kRt8*e^#l+=lw2`=cwnZm;u<(v6Kx*f};yKGzjqpPt^x z>X?v|8<$Q)Fa`Z&wH!l5h1Ys)5X6PVOe4Ua)h6i#ltYAFecYy{oT|g+QBg#jvo{z1 zPw*9NyRX_?u;ojdsa4f0;=^cpSVund#L3GuzV4wE!`Eah-Xk;1%rN2*6c;fjdu`?E z>8n}RKR&)|7Vz%zqUzfB>FSqa$u)Uj&d0}m zp<{=eqvfeeu$Lk-ak^v@R3F6h=!dgBF#92wdf_4UO7ozQWfaTWY!H2In);$zOb7ESmHmd`BttJBaY2LsenW?2 z!#;#?maa)IutIsOw2&@l1O}a?fJpi)Q#s#&N4|t141=rOnEF>aTc@%dV$zndq_j*e z1$houW1fA@W^jAdsag#znfxdK`bK|Mo)z-09R@Kj2gN4}%m&Jlv9^Q^2AdCSi z3PHHJl>Job#v}EoEWWrk!5Bp9NFLnLJhi^bdF&@&Q!r_bTmHCVZ3{nq<#vz3_NqZr z@TvjR{@1jZ8(2R!5g;Y8hW@BLMgydg;d{A+12aV;Pnr?|Uak~2-@ewKMLdWbiN|ns z2=*yR;Ysxk_PJ(AYUy|APPB5VC}>S?d(K;*Kf)~3@ZNNG>CV6!)S*4S8@%`ay^DlY9@=wZiq1UjA7Duyo$)k&)C=1}ZJJZx)OfJVK^ob=2r zPXRD|E25trTc<4U==T*%4gg{b4hGr;^gn;NvgXZJ?^OErlO~7u#=QASVmpchYcP&< zwps>9Ngu+7qij1WCRf`oc=F1YFpBO|9{Q96q1LX~3}*1giTzC>xJ||gx(VBX--e7` z-v~PzS|{B3Bo(?@aMxZV($JZk2X}}cErHUKpAoCtB!hkZJBq~xsXT$9yC2%(1 zap!|#LU?YjKT#RWw>|;pj}ACZUBtN9jig+`8SbC$XZq0V5Oi$Dcy?v}vMe)-r^{!h zT>fP6_3fXlv;2aN(D&}SHc$V*yVAi-bl{;1)aP{@y1H0^JUg$AlsHxuEhwV>D`BYy z#@(e?CEDMQHs~lWoKj46{MCbWDfTRmeLW{DGk_fflabx!Azx6jt#9QGMM%~rB3t9z zX(L*Mh(4HTHYx|90(|@YnV}U7sE`E*t*nb?rkf^T+)#Vk!5R!iSbI`qHWcrMhX0+= z&FLQh0}#`4`S^Oth1$<4H^63|=(o7KIt6$SeV+O0^W)$9>6K;7E&tnLxUlm7b(Elx zRp>8glT`rY_kn}|Y{x^G*<`4Gzw*zmnctf1-!_K?p~fVj`p>@yLdN|)5QKvr=TG22Tc>{qA`(I*2}vM6?C5_2U05jq+t2eEcvh8u zcT#^F3MoW^l#KPiXZ6p!(ev8>hY3Os*l8($|K7jI_zMi2e?$NPTo4Wpsy|=6{Ey}F z+~57fHW(nz929?o{`pVf{UZbbAZLOkG7(_^_v|2}93-%pOprqkdc Date: Tue, 28 May 2024 17:42:52 +0200 Subject: [PATCH 06/17] [DSC-1698] Improves domain check for ImportFileUtil --- .../app/bulkimport/util/ImportFileUtil.java | 27 +++++++++++-------- .../org/dspace/app/bulkedit/BulkImportIT.java | 20 +++++++++++--- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java index 281d9f38339..970708a356d 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java @@ -15,8 +15,8 @@ import java.net.URLConnection; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Arrays; import java.util.Optional; +import java.util.Set; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; @@ -63,6 +63,12 @@ private static boolean isChild(File possibleParent, File possibleChild) { return false; } + private static String[] getAllowedIps() { + return DSpaceServicesFactory.getInstance() + .getConfigurationService() + .getArrayProperty("allowed.ips.import"); + } + protected DSpaceRunnableHandler handler; public ImportFileUtil(DSpaceRunnableHandler handler) { @@ -114,7 +120,6 @@ private Optional getInputStream(String path, String fileLocationTyp return Optional.empty(); } - private Optional getInputStreamOfLocalFile(String path) throws IOException { Path uploadPath = Paths.get( DSpaceServicesFactory.getInstance() @@ -135,17 +140,17 @@ private Optional getInputStreamOfLocalFile(String path) throws IOEx } private Optional getInputStreamOfRemoteFile(String path) throws IOException { - String url = path.replace(HTTPS_PREFIX + "//", "").replace(HTTP_PREFIX + "//", ""); - String[] allowedIpsImport = DSpaceServicesFactory.getInstance().getConfigurationService() - .getArrayProperty("allowed.ips.import"); - if (Arrays.stream(allowedIpsImport).noneMatch(allowedIp -> allowedIp.equals(url))) { - return Optional.empty(); - } - return Optional.of(generateUrl(path)); + return Optional.of(new URL(path)) + .filter(url -> Set.of(getAllowedIps()).contains(url.getHost())) + .map(this::openStream); } - public InputStream generateUrl(String path) throws IOException { - return new URL(path).openStream(); + protected InputStream openStream(URL url) { + try { + return url.openStream(); + } catch (IOException e) { + throw new RuntimeException(e); + } } private Optional getInputStreamOfFtpFile(String url) throws IOException { diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java index 186a79a8767..601d77d8b91 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/BulkImportIT.java @@ -39,7 +39,7 @@ import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.CombinableMatcher.both; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -47,6 +47,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.Iterator; @@ -93,6 +94,7 @@ import org.dspace.scripts.DSpaceRunnable; import org.dspace.scripts.configuration.ScriptConfiguration; import org.dspace.scripts.factory.ScriptServiceFactory; +import org.dspace.scripts.handler.DSpaceRunnableHandler; import org.dspace.scripts.service.ScriptService; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -109,6 +111,18 @@ @SuppressWarnings("unchecked") public class BulkImportIT extends AbstractIntegrationTestWithDatabase { + protected static final class ImportFileUtilMockClass extends ImportFileUtil { + + public ImportFileUtilMockClass(DSpaceRunnableHandler handler) { + super(handler); + } + + @Override + public InputStream openStream(URL url) { + return super.openStream(url); + } + } + private static final String BASE_XLS_DIR_PATH = "./target/testing/dspace/assetstore/bulk-import/"; private static final String PLACEHOLDER = CrisConstants.PLACEHOLDER_PARENT_METADATA_VALUE; @@ -1605,8 +1619,8 @@ public void testUploadBitstreamWithRemoteFilePathFromAllowedIps() throws Excepti "-e", eperson.getEmail()}; TestDSpaceRunnableHandler handler = new TestDSpaceRunnableHandler(); - ImportFileUtil importFileUtilSpy = spy(new ImportFileUtil(handler)); - doReturn(mockInputStream).when(importFileUtilSpy).generateUrl(anyString()); + ImportFileUtilMockClass importFileUtilSpy = spy(new ImportFileUtilMockClass(handler)); + doReturn(mockInputStream).when(importFileUtilSpy).openStream(any(URL.class)); ScriptService scriptService = ScriptServiceFactory.getInstance().getScriptService(); ScriptConfiguration scriptConfiguration = scriptService.getScriptConfiguration(args[0]); From 721b0d32afcaab4940e91c75842cb13d19aedf11 Mon Sep 17 00:00:00 2001 From: Vincenzo Mecca Date: Mon, 3 Jun 2024 12:32:40 +0200 Subject: [PATCH 07/17] [DSC-1746] Fixes region for S3 IAM role --- .../storage/bitstore/S3BitStoreService.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java index 4bebcd95cf0..4a42c77f8d1 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java @@ -189,10 +189,12 @@ protected static Supplier amazonClientBuilderBy( * Utility method for generate AmazonS3 builder * * @param clientConfigurationSupplier client connection details + * @param regions the region of the configured endpoint * @param endpoint optional custom endpoint * @return builder with the specified parameters */ protected static Supplier amazonClientBuilderBy( + @NotNull Regions regions, @NotNull Supplier clientConfigurationSupplier, String endpoint ) { @@ -200,7 +202,7 @@ protected static Supplier amazonClientBuilderBy( withEndpointConfiguration( AmazonS3ClientBuilder.standard() .withClientConfiguration(clientConfigurationSupplier.get()), - Regions.DEFAULT_REGION, + regions, endpoint ).build(); } @@ -282,17 +284,17 @@ public void init() throws IOException { } try { + // region + Regions regions = Regions.DEFAULT_REGION; + if (StringUtils.isNotBlank(awsRegionName)) { + try { + regions = Regions.fromName(awsRegionName); + } catch (IllegalArgumentException e) { + log.warn("Invalid aws_region: " + awsRegionName); + } + } if (StringUtils.isNotBlank(getAwsAccessKey()) && StringUtils.isNotBlank(getAwsSecretKey())) { log.warn("Use local defined S3 credentials"); - // region - Regions regions = Regions.DEFAULT_REGION; - if (StringUtils.isNotBlank(awsRegionName)) { - try { - regions = Regions.fromName(awsRegionName); - } catch (IllegalArgumentException e) { - log.warn("Invalid aws_region: " + awsRegionName); - } - } // init client s3Service = FunctionalUtils.getDefaultOrBuild( @@ -304,18 +306,19 @@ public void init() throws IOException { endpoint ) ); - log.warn("S3 Region set to: " + regions.getName()); } else { log.info("Using a IAM role or aws environment credentials"); s3Service = FunctionalUtils.getDefaultOrBuild( this.s3Service, amazonClientBuilderBy( + regions, getClientConfiguration(maxConnections, connectionTimeout), endpoint ) ); } + log.warn("S3 Region set to: " + regions.getName()); // bucket name if (StringUtils.isEmpty(bucketName)) { From 3164ae8cfc46a519f257d25473e884448ea6cd75 Mon Sep 17 00:00:00 2001 From: Vincenzo Mecca Date: Tue, 4 Jun 2024 11:42:22 +0200 Subject: [PATCH 08/17] [DSC-1746] Fixes S3 Connection using default credentials and region resolver --- .../storage/bitstore/S3BitStoreService.java | 137 +++++++++++------- .../storage/bitstore/S3BitStoreServiceIT.java | 4 +- 2 files changed, 85 insertions(+), 56 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java index 4a42c77f8d1..02203db4e8b 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java @@ -26,11 +26,14 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.ClientConfiguration; -import com.amazonaws.SystemDefaultDnsResolver; +import com.amazonaws.ClientConfigurationFactory; import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration; +import com.amazonaws.regions.DefaultAwsRegionProviderChain; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; @@ -42,6 +45,8 @@ import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.TransferManagerBuilder; import com.amazonaws.services.s3.transfer.Upload; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.HelpFormatter; @@ -75,6 +80,7 @@ public class S3BitStoreService extends BaseBitStoreService { protected static final String DEFAULT_BUCKET_PREFIX = "dspace-asset-"; + protected static final Gson GSON = new GsonBuilder().serializeNulls().setPrettyPrinting().create(); // Prefix indicating a registered bitstream protected final String REGISTERED_FLAG = "-R"; /** @@ -147,30 +153,37 @@ public class S3BitStoreService extends BaseBitStoreService { protected static Supplier getClientConfiguration( Integer maxConnections, Integer connectionTimeout ) { - return () -> new ClientConfiguration() - .withDnsResolver( - new SystemDefaultDnsResolver() - ) - .withMaxConnections( - Optional.ofNullable(maxConnections).orElse(ClientConfiguration.DEFAULT_MAX_CONNECTIONS) - ) - .withConnectionTimeout( - Optional.ofNullable(connectionTimeout).orElse(ClientConfiguration.DEFAULT_CONNECTION_TIMEOUT) + return () -> { + ClientConfiguration clientConfiguration = + new ClientConfigurationFactory().getConfig() + .withMaxConnections( + Optional.ofNullable(maxConnections) + .orElse(ClientConfiguration.DEFAULT_MAX_CONNECTIONS) + ) + .withConnectionTimeout( + Optional.ofNullable(connectionTimeout) + .orElse(ClientConfiguration.DEFAULT_CONNECTION_TIMEOUT) + ); + log.debug( + "AmazonS3Client client configuration: {}", + GSON.toJson(clientConfiguration) ); + return clientConfiguration; + }; } /** * Utility method for generate AmazonS3 builder * - * @param regions wanted regions in client + * @param regionsSupplier wanted regionsSupplier in client * @param credentialsProvider credentials of the client * @param clientConfiguration client connection details * @param endpoint optional custom endpoint * @return builder with the specified parameters */ protected static Supplier amazonClientBuilderBy( - @NotNull Regions regions, - @NotNull Supplier credentialsProvider, + @NotNull Supplier regionsSupplier, + @NotNull Supplier credentialsProvider, @NotNull Supplier clientConfiguration, String endpoint ) { @@ -178,9 +191,8 @@ protected static Supplier amazonClientBuilderBy( withEndpointConfiguration( AmazonS3ClientBuilder.standard() .withCredentials(credentialsProvider.get()) - //.withClientConfiguration(clientConfiguration.get()) - , - regions, + .withClientConfiguration(clientConfiguration.get()), + regionsSupplier.get(), endpoint ).build(); } @@ -189,12 +201,12 @@ protected static Supplier amazonClientBuilderBy( * Utility method for generate AmazonS3 builder * * @param clientConfigurationSupplier client connection details - * @param regions the region of the configured endpoint + * @param regionsSupplier the region of the configured endpoint * @param endpoint optional custom endpoint * @return builder with the specified parameters */ protected static Supplier amazonClientBuilderBy( - @NotNull Regions regions, + @NotNull Supplier regionsSupplier, @NotNull Supplier clientConfigurationSupplier, String endpoint ) { @@ -202,7 +214,7 @@ protected static Supplier amazonClientBuilderBy( withEndpointConfiguration( AmazonS3ClientBuilder.standard() .withClientConfiguration(clientConfigurationSupplier.get()), - regions, + regionsSupplier.get(), endpoint ).build(); } @@ -226,8 +238,16 @@ protected static AmazonS3ClientBuilder withEndpointConfiguration( if (StringUtils.isNotBlank(endpoint)) { clientBuilder = clientBuilder.withEndpointConfiguration(getEndpointConfiguration(endpoint, regions)); + log.info( + "AmazonS3Client endpoint-configuration: {}", + GSON.toJson(clientBuilder.getEndpoint()) + ); } else { clientBuilder = clientBuilder.withRegion(regions); + log.info( + "AmazonS3Client regions: {}", + GSON.toJson(clientBuilder.getRegion()) + ); } return clientBuilder; } @@ -241,9 +261,13 @@ protected static EndpointConfiguration getEndpointConfiguration(String endpoint, protected static Supplier getAwsCredentialsSupplier( String awsAccessKey, String awsSecretKey ) { - return getAwsCredentialsSupplier( - new BasicAWSCredentials(awsAccessKey, awsSecretKey) + BasicAWSCredentials credentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey); + log.info( + "AmazonS3Client credentials - accessKey: {}, secretKey: {}", + credentials.getAWSAccessKeyId().replaceFirst("^(.{3})(.*)(.{3})$", "$1***$3"), + credentials.getAWSSecretKey().replaceFirst("^(.{3})(.*)(.{3})$", "$1***$3") ); + return getAwsCredentialsSupplier(credentials); } protected static Supplier getAwsCredentialsSupplier( @@ -252,6 +276,21 @@ protected static Supplier getAwsCredentialsSupplie return () -> new AWSStaticCredentialsProvider(credentials); } + protected static Regions getDefaultRegion() { + return Optional.ofNullable(new DefaultAwsRegionProviderChain().getRegion()) + .filter(StringUtils::isNotBlank) + .map(S3BitStoreService::parseRegion) + .orElse(Regions.DEFAULT_REGION); + } + + private static Regions parseRegion(String awsRegionName) { + try { + return Regions.fromName(awsRegionName); + } catch (IllegalArgumentException e) { + log.warn("Invalid aws_region: " + awsRegionName); + } + return null; + } public S3BitStoreService() {} @@ -284,41 +323,25 @@ public void init() throws IOException { } try { - // region - Regions regions = Regions.DEFAULT_REGION; - if (StringUtils.isNotBlank(awsRegionName)) { - try { - regions = Regions.fromName(awsRegionName); - } catch (IllegalArgumentException e) { - log.warn("Invalid aws_region: " + awsRegionName); - } - } + Supplier awsCredentialsSupplier; if (StringUtils.isNotBlank(getAwsAccessKey()) && StringUtils.isNotBlank(getAwsSecretKey())) { log.warn("Use local defined S3 credentials"); - // init client - s3Service = - FunctionalUtils.getDefaultOrBuild( - this.s3Service, - amazonClientBuilderBy( - regions, - getAwsCredentialsSupplier(getAwsAccessKey(), getAwsSecretKey()), - getClientConfiguration(maxConnections, connectionTimeout), - endpoint - ) - ); + awsCredentialsSupplier = getAwsCredentialsSupplier(getAwsAccessKey(), getAwsSecretKey()); } else { - log.info("Using a IAM role or aws environment credentials"); - s3Service = - FunctionalUtils.getDefaultOrBuild( - this.s3Service, - amazonClientBuilderBy( - regions, - getClientConfiguration(maxConnections, connectionTimeout), - endpoint - ) - ); + log.info("Use an IAM role or aws environment credentials"); + awsCredentialsSupplier = DefaultAWSCredentialsProviderChain::new; } - log.warn("S3 Region set to: " + regions.getName()); + // init client + s3Service = + FunctionalUtils.getDefaultOrBuild( + this.s3Service, + amazonClientBuilderBy( + this::getRegions, + awsCredentialsSupplier, + getClientConfiguration(maxConnections, connectionTimeout), + endpoint + ) + ); // bucket name if (StringUtils.isEmpty(bucketName)) { @@ -344,14 +367,20 @@ public void init() throws IOException { log.error("Can't initialize this store!", e); } - log.info("AWS S3 Assetstore ready to go! bucket:" + bucketName); - tm = FunctionalUtils.getDefaultOrBuild(tm, () -> TransferManagerBuilder.standard() .withAlwaysCalculateMultipartMd5(true) .withS3Client(s3Service) .build()); } + protected Regions getRegions() { + // region + return Optional.ofNullable(awsRegionName) + .filter(StringUtils::isNotBlank) + .map(S3BitStoreService::parseRegion) + .orElseGet(S3BitStoreService::getDefaultRegion); + } + /** * Return an identifier unique to this asset store instance * diff --git a/dspace-api/src/test/java/org/dspace/storage/bitstore/S3BitStoreServiceIT.java b/dspace-api/src/test/java/org/dspace/storage/bitstore/S3BitStoreServiceIT.java index fb581d8361b..d6001da9de6 100644 --- a/dspace-api/src/test/java/org/dspace/storage/bitstore/S3BitStoreServiceIT.java +++ b/dspace-api/src/test/java/org/dspace/storage/bitstore/S3BitStoreServiceIT.java @@ -7,7 +7,6 @@ */ package org.dspace.storage.bitstore; -import static com.amazonaws.regions.Regions.DEFAULT_REGION; import static java.nio.charset.StandardCharsets.UTF_8; import static org.dspace.storage.bitstore.S3BitStoreService.CSA; import static org.dspace.storage.bitstore.S3BitStoreService.getAwsCredentialsSupplier; @@ -34,6 +33,7 @@ import java.util.Map; import com.amazonaws.auth.AnonymousAWSCredentials; +import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.Bucket; @@ -406,7 +406,7 @@ private byte[] generateChecksum(String content) { private AmazonS3 createAmazonS3Client(String endpoint) { return S3BitStoreService.amazonClientBuilderBy( - DEFAULT_REGION, + () -> Regions.DEFAULT_REGION, getAwsCredentialsSupplier(new AnonymousAWSCredentials()), getClientConfiguration(MAX_CONNECTIONS, CONNECTION_TIMEOUT), endpoint From 2b1edc920960136a13ef2d699db6c7d69d9a880e Mon Sep 17 00:00:00 2001 From: Francesco Pio Scognamiglio Date: Fri, 7 Jun 2024 13:18:52 +0200 Subject: [PATCH 09/17] [DSC-1765] configure a specific consumers list for the item poller --- .../app/rest/enhancer/RelatedItemEnhancerUpdatePoller.java | 1 + dspace/config/dspace.cfg | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/enhancer/RelatedItemEnhancerUpdatePoller.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/enhancer/RelatedItemEnhancerUpdatePoller.java index b4af863e654..391a5fc7963 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/enhancer/RelatedItemEnhancerUpdatePoller.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/enhancer/RelatedItemEnhancerUpdatePoller.java @@ -36,6 +36,7 @@ public void pollItemToUpdateAndProcess() { try { log.debug("item enhancer poller executed"); Context context = new Context(); + context.setDispatcher(RelatedItemEnhancerUpdatePoller.class.getSimpleName()); context.turnOffAuthorisationSystem(); UUID extractedUuid; while ((extractedUuid = itemEnhancerService.pollItemToUpdate(context)) != null) { diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index aabdfecba4b..f7c1c5dbf27 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -799,12 +799,16 @@ aip.disseminate.dmd = MODS, DIM # default synchronous dispatcher (same behavior as traditional DSpace) event.dispatcher.default.class = org.dspace.event.BasicDispatcher +# default synchronous dispatcher with custom consumers (same behavior as traditional DSpace) +event.dispatcher.RelatedItemEnhancerUpdatePoller.class = org.dspace.event.BasicDispatcher + # Add doi here if you are using org.dspace.identifier.DOIIdentifierProvider to generate DOIs. # Adding doi here makes DSpace send metadata updates to your doi registration agency. # Add rdf here, if you are using dspace-rdf to export your repository content as RDF. # Add iiif here, if you are using dspace-iiif. # Add orcidqueue here, if the integration with ORCID is configured and wish to enable the synchronization queue functionality event.dispatcher.default.consumers = versioning, discovery, eperson, dedup, crisconsumer, orcidqueue, audit, nbeventsdelete, referenceresolver, orcidwebhook, itemenhancer, customurl, iiif, reciprocal, filetypemetadataenhancer, authoritylink +event.dispatcher.RelatedItemEnhancerUpdatePoller.consumers = versioning, discovery, eperson, dedup, crisconsumer, orcidqueue, audit, nbeventsdelete, referenceresolver, orcidwebhook, itemenhancer, customurl, iiif, reciprocal, filetypemetadataenhancer, authoritylink # enable the item enhancer poller related-item-enhancer-poller.enabled = true From a658cf10bb91af1ea12d8fac0d280fecf63ae82d Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Tue, 4 Jun 2024 09:43:10 -0500 Subject: [PATCH 10/17] Ensure work directory is cleaned up whether zip file is created successfully or an error occurs. --- .../app/itemexport/ItemExportServiceImpl.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java index a884f9b0756..7c80e1ea7dc 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java @@ -490,7 +490,7 @@ public void exportAsZip(Context context, Iterator items, File wkDir = new File(workDir); if (!wkDir.exists() && !wkDir.mkdirs()) { - logError("Unable to create working direcory"); + logError("Unable to create working directory"); } File dnDir = new File(destDirName); @@ -498,11 +498,18 @@ public void exportAsZip(Context context, Iterator items, logError("Unable to create destination directory"); } - // export the items using normal export method - exportItem(context, items, workDir, seqStart, migrate, excludeBitstreams); + try { + // export the items using normal export method (this exports items to our workDir) + exportItem(context, items, workDir, seqStart, migrate, excludeBitstreams); - // now zip up the export directory created above - zip(workDir, destDirName + System.getProperty("file.separator") + zipFileName); + // now zip up the workDir directory created above + zip(workDir, destDirName + System.getProperty("file.separator") + zipFileName); + } finally { + // Cleanup workDir created above, if it still exists + if (wkDir.exists()) { + deleteDirectory(wkDir); + } + } } @Override From 30af20c9179153007434531ebe2c4fefa00f2d3f Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 14 Jun 2024 15:18:17 +0200 Subject: [PATCH 11/17] [DSC-1777] Removed cris.owner metadata in favour of dspace.object.owner --- dspace/config/submission-forms.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dspace/config/submission-forms.xml b/dspace/config/submission-forms.xml index 55068bc250a..f5c1d18373d 100644 --- a/dspace/config/submission-forms.xml +++ b/dspace/config/submission-forms.xml @@ -2511,8 +2511,9 @@ it, please enter the types and the actual numbers or codes.

- cris - owner + dspace + object + owner onebox false From cc8767eb1c835187ecc95526f48cbf7cf93569ce Mon Sep 17 00:00:00 2001 From: Vincenzo Mecca Date: Mon, 17 Jun 2024 13:51:40 +0200 Subject: [PATCH 12/17] [DSC-1698] Improvements of logger inside ImportFileUtil --- .../app/bulkimport/util/ImportFileUtil.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java index 970708a356d..35277373794 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkimport/util/ImportFileUtil.java @@ -20,6 +20,8 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.scripts.handler.DSpaceRunnableHandler; import org.dspace.services.factory.DSpaceServicesFactory; @@ -28,6 +30,8 @@ */ public class ImportFileUtil { + private static final Logger log = LogManager.getLogger(ImportFileUtil.class); + public static final String REMOTE = "REMOTE"; private static final String LOCAL = "LOCAL"; @@ -71,6 +75,8 @@ private static String[] getAllowedIps() { protected DSpaceRunnableHandler handler; + public ImportFileUtil() {} + public ImportFileUtil(DSpaceRunnableHandler handler) { this.handler = handler; } @@ -79,13 +85,20 @@ public Optional getInputStream(String path) { String fileLocationType = getFileLocationTypeByPath(path); if (UNKNOWN.equals(fileLocationType)) { - handler.logWarning("File path is of UNKNOWN type: [" + path + "]"); + logWarning("File path is of UNKNOWN type: [" + path + "]"); return Optional.empty(); } return getInputStream(path, fileLocationType); } + protected void logWarning(String message) { + log.warn(message); + if (handler != null) { + handler.logWarning(message); + } + } + private String getFileLocationTypeByPath(String path) { if (StringUtils.isNotBlank(path)) { if (path.startsWith(HTTP_PREFIX) || path.startsWith(HTTPS_PREFIX)) { @@ -114,12 +127,19 @@ private Optional getInputStream(String path, String fileLocationTyp default: } } catch (IOException e) { - handler.logError(e.getMessage()); + logError(e.getMessage()); } return Optional.empty(); } + private void logError(String message) { + log.error(message); + if (handler != null) { + handler.logError(message); + } + } + private Optional getInputStreamOfLocalFile(String path) throws IOException { Path uploadPath = Paths.get( DSpaceServicesFactory.getInstance() From 840510ed8d0bb457fc821a05915ba7879ef3e5b2 Mon Sep 17 00:00:00 2001 From: eskander Date: Fri, 21 Jun 2024 15:51:18 +0300 Subject: [PATCH 13/17] [DSC-1757] ORCID authority fixes and improvements --- .../content/authority/OrcidAuthority.java | 11 ++++++++ .../org/dspace/app/rest/OrcidAuthorityIT.java | 26 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/dspace-api/src/main/java/org/dspace/content/authority/OrcidAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/OrcidAuthority.java index 1b88b784c01..df21cbc8b3c 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/OrcidAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/OrcidAuthority.java @@ -18,6 +18,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.lang3.ArrayUtils; @@ -49,6 +51,10 @@ public class OrcidAuthority extends ItemAuthority { public static final String DEFAULT_INSTITUTION_KEY = "oairecerif_author_affiliation"; + public static final String ORCID_REGEX = "\\d{4}-\\d{4}-\\d{4}-\\d{4}"; + + public static final Pattern ORCID_PATTERN = Pattern.compile(ORCID_REGEX); + private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); private static String accessToken; @@ -92,6 +98,11 @@ private Choices performOrcidSearch(String text, int start, int rows) { } private String formatQuery(String text) { + text = text.trim(); + Matcher matcher = ORCID_PATTERN.matcher(text); + if (matcher.matches()) { + return format("(orcid:%s)", text); + } return Arrays.stream(replaceCommaWithSpace(text).split(" ")) .map(name -> format("(given-names:%s+OR+family-name:%s+OR+other-names:%s)", name, name, name)) .collect(Collectors.joining("+AND+")); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/OrcidAuthorityIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/OrcidAuthorityIT.java index fed87df674f..f05587d1c90 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/OrcidAuthorityIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/OrcidAuthorityIT.java @@ -804,6 +804,32 @@ public void testMultipleSourcesReferences() throws Exception { .andExpect(jsonPath("$.page.totalElements", Matchers.is(4))); } + @Test + public void testWithORCIDIdentifier() throws Exception { + + List orcidSearchResults = List.of( + expandedResult("Author", "From Orcid 1", "0000-1111-2222-3333")); + + String expectedQuery = "(orcid:0000-1111-2222-3333)"; + + when(orcidClientMock.expandedSearch(READ_PUBLIC_TOKEN, expectedQuery, 0, 20)) + .thenReturn(expandedSearch(2, orcidSearchResults)); + + String token = getAuthToken(eperson.getEmail(), password); + getClient(token).perform(get("/api/submission/vocabularies/AuthorAuthority/entries") + .param("filter", "0000-1111-2222-3333")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.entries", containsInAnyOrder( + orcidEntry("From Orcid 1 Author", REFERENCE, "0000-1111-2222-3333", getSource())))) + .andExpect(jsonPath("$.page.size", Matchers.is(20))) + .andExpect(jsonPath("$.page.totalPages", Matchers.is(1))) + .andExpect(jsonPath("$.page.totalElements", Matchers.is(1))); + + verify(orcidClientMock).getReadPublicAccessToken(); + verify(orcidClientMock).expandedSearch(READ_PUBLIC_TOKEN, expectedQuery, 0, 20); + verifyNoMoreInteractions(orcidClientMock); + } + private ExpandedSearch buildExpandedSearchFromSublist(List totalResults, int start, int rows) { int total = totalResults.size(); if (start > total) { From 4b9fecb4e97ac1a755de53724a3c2b9b5e50c6d3 Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Mon, 24 Jun 2024 18:25:48 +0200 Subject: [PATCH 14/17] [DSC-1669] Fix cris-layout-configuration.xls according to new i18n key format --- .../conftool/cris-layout-configuration.xls | Bin 127488 -> 139776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dspace/etc/conftool/cris-layout-configuration.xls b/dspace/etc/conftool/cris-layout-configuration.xls index df133a96846ee04a13f730596f531ad5d2bd68a5..87e84f9c1921a6d997455ee48ec898a03cbb1f0d 100644 GIT binary patch literal 139776 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 z z9?r*#_{M?tuvB9dULEr-oAfx>-&)}h{c5U@Z|B(K_;yZD z>|vepcQlE)CAdzM;5y*}y>xm5hj08?549#w+q>0@I>EPrY)!5e9%_XL^!cd=zC~m` z@GT-+W_*jt&UflWo!}cr)?c0QS10^oJW2iW%_QrOZzfrP^`cJH3x9m0$@;4o{_2Il z^}-+DgtGqlCY1HJUet;8!XMwDvi{Z!f9r)mjDx8@zIkQ+@y#n+CpL&W!MC!~J>6Qj zL3qHZn%=JB+g$dzjiOF$6m^1cdRYw{g@%p71IFmo1K$v{9{7fsEi=9$X6wWzQD%I5 z%=+6T{B08cF#f0hHj7oJ&E^K2^|x8niOs^_X45ZOf18EB&B7n%7OB52!rvC*Z;PlC zTZF$Y!rvC*Z;SAUc}wbVtMIqg__K9ltEdxOMNhj`c-WeFaBn_taBn_Ngx4~k4yR+V z^83A;k2Fc;zc=!N=_lxv<>9{5N zbHy}{MR4~PBo?WEa$=f}Taurhna0P{^OSB`^kt(K%Xzre!rv6-7HExki?Kla`L;2Ntx~a} zVo&z+t5WvEkm~zDZSZZp7%!hWNB86Jhb3;`FSWB#`(c5{KbDtsr4O73e?OF<+>aM{q>Yzkq>YzNq>Yz7q>UFU zq>YyrQX3|j_=7&4a`H3m*OJ)iXV`m_G~5F1OJcYM+MmR53-swEhFhQmNes6@QJdNO zc!~`sF+68Fl*A@bY&eNcq}YxmHi=>nCb7vByPm}GqU((~Rzd%!%e8!y70a1FV_r+M z&(rg*o-u~0!VGp+3*UOZndDYYx!p=)<0*z(2`v@Wcet_16niF4jf}h!cHpvYX&m}RJq97>nP5P9A`wL6KH)}0L`mDc8!MAB`S@3Pz=VQNPsBf)_ z&L=UKVhoi>jro-al*|~xG)6FSe`T5YhAu84aemVG2wWzo2_lRSD@Ccf!xnbJ2cTqeHxY?=7x^E+Zs_;rPv=$%Q-Wf~`##) zCfhSi5=@gs?V2PACkZB=%ULGAHE)^Hw|(5&#W&?G6Tbswdxpt|$@UDB1=D1~G+8iV zuAbH|o=aLLzI|_*(l?1*CcbfRnfS)N?HTZqk+f&POWkRmK^`@c?HO=G-%WFwrckM; zHJ)$rTc-3aC6|d`?6*vOD46WGEFy3 zA5PL-rs;wS*DL95TYem2H`&ljrtf;Wy(B-DV0%gac)^|66F-(yG*s*khU|L|9elXsX*F z`k^G|o~=cO$+q`Jf@zUBcZ=!x^xW~|CYFgGH{p7pGVy~ZmWdxU`NuKEV#D;qNz7$h zESMGxro{=9eI&(S(_3OV)3qz?w^Xq$Bb&c|w_Mq8g<@N&*j6dF)rxJ6V#AsCb*xit zwTi7yvDGWK^@?qSV%wA)bK68ww27i< z6UC%WAQ!IxmWdz6u}u6h4!4Gsi66tUO#B$m=VOW`rk(y+5_6fB7^W{IY3|%}iC|)n zmWki(wM_hOFSn?ai67jtO#I-^KZ!jpHBA3BiMdQmMae7`6ln2j55^DmTqGOLR{Ex} zI|Js&d2Yv^_;H>)Nenlj?F^V7=dm;3WnyNx%#@Rz0WTAT%ft+r`yX3Q{7$kZUsPY;(COCp+6*E|``JisfPkyj+wT_kWg&9~`nw{NRw!#E%SFCVphd z&Z$-yrccLZxI!?k5KJos#Y&^wQt;zMmV)1&_9<41nFBv$WalsVXl@Pt;v~1bm4afW zpjas=xR19K`~Z@r;CHco3VsmDmIXhEWalsVTyIVE12M%aL9xoz89RSjC74zTCLUuf z6F;(KnfQ?Y3W&T9qJTEk>#QENrXtQAZ=s@sy`2cj$!KM*yU{JBi)L_OxW-fbVW&M^H%Ot?-k ztrHaM1O?9{ECoL_WhwY=`Dq>nKRjhih992#$=GkLq4;M>%J35q&F!80dI!4F?q3V!&?AJO@-D@(zT zU41_GTW=`7n8aL)dO=YyD0r@BDfp2rOTmw1`C~XgjAbeKVXU8y{jN6@Ka<2MB35WqW>l@P=~x677q2yFt{|4T55Wpy2ta zEen2_Yaiu;zJ$M7!2MfF!4GxWvfzihem3^I(NKIjiMeI5QBZ6Y6!4#x1wZg*Dfoe} z2h1KR1wZO#Dfm&Zuf%>g8H#_A#9WF^f?|`P;5j#ZpbYsjuqKM3Ech`nzbyCxFiXJ? zfZ27$&4%J%Cb_v3^t-I27i-__$z6TsS-z#(lQfrUizpes%CJoQ0NEir4kg16kohIERn%2}kn9&?Pg@PsFD5aUX{#ui zt%8EDYb?b!^B9{Q_qLhG*nEm@f?}JwA8g0HZK92AGi71Ny={VGo1ow;DNC{4Q0$M( zV!NU6&(C&4VduHq#a-#`=ApV@ipyfVSn1s^2)7$TJI~!N2)B!Q?smb;S9z9qhv41e z@PeBAnH{3kc8F5jVb0yZj(K+o!X1KXhnV&55KMfPX_+1rOb@C|4+^FS4b#7gDIPRT zuO~6LK0PRy9uyROU27?J3W}X7#ZE!7(@^|!?02W3__s;SrPwJbb_xpAIi8WAFL+2$ zJfu=QBq$y-6u%PteaKM!Y7%oP9ugD}2@1Y;w`K9Lpm_FBSTH>-n0W2LGCd-g9#NSd5loL5reBXK9ual*5kc{Ypm;=3@M?vncvMh4 zs!}{EC>}KwpN}aXH6`=!lbBmFj~b@mNYdQ?_))>Mi}p$D%r3#SOJ&+6n06Va{}6lH zWte_5iMdR>4AWPWG?!^t!h}`8-L#LtBGjPR_9(W!iVfqxpI@V5+ppLTD7J%&4dbfs z1LK;%a(P(U?}%bMs@R$pTZ>{lrr3@vwpPVYte=Z5+8ZzVCeP3$&p;y)#6 zZkyPhvUT*zX=g@n4ddOR+~#>=6{)#x2EOLxDDlIpkhLfi(Bpe6OI`Ybc(N{q8jsUrS;x z#a?rMUP#j1^RrhlaUWxu_6eqaPRU>oo*V5mOka=l-e;J8H;JLn{9Y1snf4i`|C*$^ zO#1{A_i>h~Q7|A%G# zbHFg&N@8v~9WYEkpQO3x?toz8F~%|-G)!~pIMnfjh6!nI9X}|T4jQI!#GVd{k~t{K z;-K)$XlRzy38zlknSQ{QhC=x5<>nA0;ujESgMNyeCO>%c4mzVH{0gj6P(T z#*qzWaY!wTLx#y-Cmk|OcVbV6%yrV;B<4Q7dq|YiAwy`dlMabeJ0z}?cvQz~5c=xF zg7C0YYA8Fd)rUo?9X5padh)O-wLeaBb4%^8pg1h9j1G%Z<5`7eIwF{k7$$E0Dbo?b zbi^>(HHagI>D8F&h$yEcg6W8$;CYOtI4UTP8VYXjDaBDianw+JGxmGbQ2a>}b4%u^ zpg1Zhc;;j&ngvC(q2LytQZx&SW<&9(vEOE)zS-0gJ4Q4Mie^F4LdT~stG5V>7DM5; z=@voJB5FyCDT_agnOX!>i=b!`6g)fJ5Fd9;P#iN9Cn2F}Ez*OpAGYlIHgOZGwrf zGAz?c!F19vE%KO73Z|2W>3_tYP70=zqGV1Arjw$aP70<|#-n9AC74bbrllU!DZzBg zF#T1`bjmRO&m`uS(<#ApN-&)gOnjAPnNAC)(}roK$8=gSoi zRPQmJ6-;Lh)3;-avxezANz7$BE11p-rn7>HuW~KZV}j{1!?ej`dQ31qW|%$_Q#@vv zUQ1#w(_@0-F+suC)t2IMLGieu*yd3@E+`&16!x0xaYOOlnBs9!gB~{}W5>(K1=Hh# ziLdJ|(-VT}3B$D0V|qd`Jz<#a4CV>L^lHrXgkX9?P&^?ho-{rz#gl^KNkj3dNAaYf zc+ybZkNrMrC~hS&_xwC5D4rA)PZ=K@PER^XX3~F}Hs>FIvI*q!r*euJM+lT~M?e3V$ZsE-2a!1@v)lprB0Rm`l+v zDB1-Dw=qj`K~P*U6tl>KJBPd=C@vU^irDW3(?1lFm`icN^bd9pc|kB;5KP?0H^<64 z4AVmt!|FkYVe)&<4#CtRN~S~fQXPf@xuMiL1Vx9S;9kX2bc&McR4F+{6PHD& zDVg=L-%i2QDJVJx1@~i?qDxS884ADu?h+JThN3d2=rR=cYP?HObP0+sLBTzzrMM_4 zE*c8I#at8=7Y)VOnBtX!_~xY+L{ zLs6Z?T#8GkmW)r*-0Pi7f{Dip%XC>VT{cX9`?)NbE*qu?Vo#S1(}X1EGF=u-mqj^U z7EC-=S*C8m)NPpNQHi*1x?7yBZo@P&rsy_IlaiRr)Ga8w1qF|emg0(_xMC<4c@$R! z#T7$g=ciW;#dqT~c}3LRE2d=7`=d=?5lmME6OYc8>8fD5YMA^h!K;Gls$u%^*wacWKE2kd8)MJ=xVu~KaG$o0-XRAjr^$4aO z!Nju@%XCdJT{BE;J*I1d>6&4(^Z09qX===LO_b9$!}Q^}M6U^^Yl4YqN0zBqF!dUy zdXK5sFx`&x?iJ71^ctpVF;lN#>NQN$lQg&W_X;MSoo$Id^a-Xu!{m=teWINDOgY&x zyw5QGS(2N3?)pT@^a%={4_bbCF=9Ya3>XSKQVkdi zJ5mh@iUC0}ASeb+O|%q)f@086_@lz0q4;`y?gtHp9jOKlg&nB|1;wDLt9GOs6ikDH zX-F^)38o>#`=R8w!6^7#0-6hQf{t z!-m3+3d4e8*p!SN6@~@Vuwdfr8q0KDFkLrH{-|(WFkLrHc2u}-nCz%bWqn}*4b3O5at9Tjd0rkjG|rl8;}NlS4{P~0*U{y1>UP}p(cmKXvpAk&Y7$$!lct(`WGp1zhIPi>Nvg5!rg6SDS@r^Sg(p|In?3xeVWQ&;Uc@Pc4^K`^0~rA#jhrWXy9KMuSo zO6EnwG$WoJy=a*1IPjuidQnikm{4F1aKuo^cZtzL-L)F*cSo_^RctSLHe3me7@MsF zBSPtjQRu|~^uTQJ==O#WDNTQJ== zOg~P_I5({N*s{xSKFx?hRT*j8^j$pcDnEbKkj$pcDnCw_{$CQ&DYwif9 zJA&zsV7eoi_#9iNyMpPiVe-eCyMpPiVfs*9PInEH9c%6irn`dTuAtyrWhq_~6fYSH zf2?`QP~a@%{JbQ_nwJcP9cx|^6fc>Qv183kg6XA%>6_8#>3kRN9i-u8cl^2CspMG|6z+`Q}4m_WVD~Y1&J@=R74d^;+@Pt z6UnCiO*cP@hm;EPQJ}q0L-9+e=SR^}7x9K@EpLGi*J%rX1GHn_AT22IN5zprJLYeI zw(SFHyef zwBz0&EhzDaXa96s`bOoOPFwv3X+eoU^o}|$eZBHcryc(WX-ywaq~kMb>ARM1I_(2* zkQS8q!xe~Lw)DlzH=TCE8>9s#{w7e+Y3W;-Z#wP7H%JRg{7s~w)6#b_-*nnZZ;%$0 z_?tvQr=>4uzUj1+-ykh0@rP?xotD0(`KHs>yg^z};;)8+PD@|eeA8($`+OraMo{7p zhwHTT{ms7??e~64!VG38PVF<8PbyBN88*%_k7)1^Vwv=SLs#BNAuk zrsgP24=m8el5ku$0x5GJx zUz+}fBn>}MV7>Ei!l!BYP}QF$d*a2ES+Rx+s^KId)B{~wQq1Opwv&1&P|K-_ z<|N0#!`vhW5ATWnp>3ufP)Ab_bU8>d>tT%Wz`p`NFV1s}dAVkO5_3K9&kI-$sPU-> zx`dV?Rnr|fw$iI^Ztus z5By8-cHwKR@PNEi4RopGc;JurTMzsz@QdR-`Ip}9dEj4qx96csco-)<(B+Nefj_}- zJ@Bu<7h@0O#ChOfdbb|pTekb)nml2K!{ye_*z`yivy^l8@?0Mi{bGPS#Kay`Xp#7&F&;nBp{IPrMfq&_J zX{>>N&E1{{{xx@7O8m)t>j8aY>Vc-~jtBm9z4gGq?Y=Dbz#pl%?SVg1Z#_&9rGy?f z{RKXnVpGg6)ni0V+cf{0dzywey*&2Ezu0a|i9bMZHK4yvJ|{EO{r8Z@ko{qe7|TMztkcdqa?>jC7nWYyM=r^}xT; zo~FUW>ewIuD!cW-A8xlEFwUjFp~jzMx4H1=*sTZt#ddoh_*dEOdEj4Vw;uST?A8O{ zjIs;O{Hb;8fj_lwJ@9X|r)kizCf2~e!)`tB2iL6!jKS$`AO3K<&4oXlZawgCv|A1Q zJM31&bhDssJ@Dt#;lceKxMS|`z|kbE?B9W-V=xkYZ}Lvv4gbCQllMP&Cfk^Rd~*Zt zM5ez0H{zsY@;>7Hf*XcZHyxAlUvehv_H=s|k7<=}!$gRF`v^(ohxfzO#orHA%(r2B;M*{u`!<{x-!@*c zVVD~e{gGh7z~mo`p~SbL^Y?A&u6-NI)wfMiZ0N+?{V+7(&!2=}BO9j`qS?{fxND(* zs3F^@@90hr#dgJeR?vBv6|IZ+gxGXXp6WKod!nYzifZFMai-EedCGbq-V;;SSy5fQ zCr>?X_sCOE>m5_i)H}{<+RgD4(t5`fGWE_=L7OK}1+8~X1!qO|v3H)**#U;9bk;kj zbg6fqn%O;hYG%D-YL7J;^=}&9(&~Eoc>reOOA$n7sClAqfPYlt#r#noYcZaDt@Kff`mC`YP?}n*M z7xDK8yYPWsyS+LYroORjjkEn3`Z)afsFO|!x{Cre``U^*6RYli<^0!n*?%j%A1eKv zvqprY<~hR#I*)zMnh&mHf5F)w!&ImEq0-UA4EMx1ZFZO$8yIG?x=CsuNjK@PPGGHK zQ`~rP3v_0*Iga6o^ooSL(7ACgC?Dz$XcxDN(xbTMRy~fS-(4ubiqbLPtD;n0-^?oN zRynPT9&%<%Z={N1tmD&GY8B0&38l|i{lBcr-yjX}$Fl+3FY|0*Uy_DOzcp?iJR7ik z@@&BF$qQK9yyh|DHjm;PXdZOT-@E2PWlw+KFg>{4PMgPH|3c$8oC^mukLk`&J);M| zT1+nl&^$(#q;abHqb>}1dWy-7_Xl(v| zm^At}Ob>kF+c2^6Z740@hRKp| z!wQ6N!=gK-RJt|n@u|Km6w5$&s)$QM7<=XN7@ zg@U^gyLO3MRTJ%u^W<&>540gq?ndl`ncR&$6z_?1UlTo?#BfRTh4?sL&weCMbI$?eWh|O{XdG??su&HQg?5AapkeQ#swZUrDJGjz1jTzq3OHrHu~BO5$_Rsbx*yu9Z^LE2Z$nG;ZD@hM4K2^Nq5b(bv_jv8w&>f?B7Ga$ zrEf#)^lfOPz6~wax1qiIHndvbhPLb5(1QJPMmzRx_~}RAHcPSLhYY4L<~E z`+s|W=P5S)ES|p~ex%N~;YZ?p8-AqCx8X<9Tw6NsG*P|cSVc59IuyrH*=nN0^iNgv zDjiE#mZ*Nt-$?Wr%!QGL+jfg?WT6j^8j4ZF;&^j7+EZ8&%`J?hwXtY!brbIJE;V~q zo8zOAYO>UGgeEhyE2E`5i%U6P7{T7N3(*rx_l%+UpJ;1oZS~yhG0`4+>!zZ>vyAzM z5v@dJq~R`R#8&x?)I?K8@*)_KWrz`XsF@M1R%N7tHfF?D`HVD(r;Ox9Fe1wkBW9M& zh+afxq#-_L#8&x?)a|8=8EMr!Wh5_x5m|;9 z@w@>uVw6@HY0V*K#8&x?wBDXFk{7{R?998dOGFjgJ|zRX!tK7Nv~jMKB`E z5F?&>U`EVhR7ScF5Hn({d`7y*kTQ}N!H6tFjCg8-88NF;8R-s0%!sY>8R_mu%1B-W zBeD!J;<*cE#4Jx`qw$TGx;CpVZ8vrd(f?z+T`*eaiqE*nxt z@*)_KWrz{aelR0u!73x&?}-_)RX!u#OG+8Zi(o{SAx1ns!i<=etBiD~DQ3i0`HXZI zD`g}vf)QDU81eiGGvX>iWu(VRVn%G0&p6FxBrk#yS%w(#1Pe3bszqg_2U222Y?aSQ z54)u0NL~aZvJ5fe85m~7Rg}s&BVoi=`Hb|GOUg)I1S7HxG0sRBaaE@>(!;QEIby4P zMp}GL8Oe)aM3y1OnF%AVGF8S|2_v@3XQby=QbzJ37?EX&aaO{Jt6r6HcEX6Q@)_w` zF=Zq#f)QDU7-uJpxC&Pp=Om2SDxZ;-dQwL6A{dcnh;dHBh*bfVac;tht@0V^c4^8; zUIZhu%wxorKh`ExvUv#^w#p}?Oj9!QBFKts@S$Ew(W{- zhhlqBvF%iB4=J{X726|br&Mlop_*ebte6y26VUPQ}4mU%4$WM~B{ z*^-0|Tji52ammPwAVZcRGPFgNY-vJ@|*{XyLTji6ja>>YxAVZcRGK^O$+3JK0Tji6{9c+S$ z>lt|wWXLi^hEY=`Ta%Dst9-IGE*W_dWXLi^hOt{EqkI1Gl{B`>C!;5*(=sD3f(%)P z$S{LY$>=$Rm<(IxldW^f$crFDmLW3CV^p%*gbZ8dlhwLpEPWrz%OI+d(GA;VVrWc4l?c@bpDQYHJ&{rmS3?$X`vmnh&7qPI|ZD}}dF zzyn6_pzux#@1pQ-3V5vPy%gR@;r$d|q3{6;AEfXh3a?VY14bXA@EV1WQur8!k5l*r zg-=rW6opSy_zZ>bqwo(Xe3ruZQ}_W2KS<#pQurK&e?;MjDEwmzKTP3ADEuge&r|p@ z3V3wupHTRx6n>n-Pf++t3jd74Kd10h6uwB|rz!jlg)dR~SqfjK@D&RGg2KO~@UJNR z9EG2!@Cy`vk-{%g_}3Kv4TaY!{4#}qOW{{2{3?ZiN8#5f{5pkyPvJKx{09oZN#Uy$ z{v(CoqJW30ew)I7rtmuy{tJb#QTRHA-=*+-6#grP->2{g6#g59Z&3I{3V%f5k12eU z!k z^H43EKl5zN`lM&VR{1^CdbejHFQR8cmTJ%Bkm34PCEJjYVXJ(y4K5jZ5oE|RM24$u zm26`|hOP3+Ho9cwMUWxO5E-uZRkBS98MewN+vJjw7eR(BLu6QSP{}qYWY{X7Y_m&7 zUIZDk43S~oLnYgikYTHQvMnwdc@bpDGDL>e7nN*lLWZsK$+o&=+8 z$TCERRXLUH!GsK3<&!<=l93ldhAcy5SQ}Kyb|z%lDxYkpOGaJ<8L|wKVTDp9dnh5p zR{3NPxn$%;kRi(u8P-WvvWF8gY?V*;uuDc>1R1gnkzut~C3_?x!&doZkGN#yMUWxO z5E<5tRkBADGHjJk_NYrnUIZDk43S~wS|!_+kYTHQvRy72c@bpDGLH=RYIYNufB&XI zvF%Z8dllP0#n!0U_A9mnitV6cYf@~76x(6Nc0{oqRcy_QtwpgNQ*6gQ8)oPzXSD|G zPHF(Q%C7;t-5Nk%L=8Zec{KoJINK^&LqdkF^2r)pGV&tGkY$JrbxtMQlaOJne6l?* z8F>+8$TCERny-@WO~|lSKG|NEjJyakWEmnu`%}sGC1lttpKPB?MqUINvJ8=-7f{I> z6EbX-PuA#?krzRREJI}Ii&V1x2^qG^C)@9mkrzRREJI}I5mmAS2^qG^Cp+MhkrzRR zEJI}ImsPTZ2^qG^Cp+kpkrzRREJI`%9aOTWgbZ8dlQp?yWgbZ8dlQp|!EPWrz&(IF;;JLWZsK$&R^XDA2X>1`hWVC`3k!6M1Rg( z=Jv|d+6q+HecKqtR;k#=Dz+-cHcqisE4J~9?E%F$L9tC#Y?Bn*WW`pa*rq79sfvx> z>=;#k^d`k98@;(O%0_PrjIz;_`J-&~B>X5FJ$XLLMo)T=ve7fvqipna^C%lVS3Jr_ zPxOwm(X+IpZ1fbXuw}hveuQcx(oiXDqNDT=u7)eZ17gOy)BMPo+UwK zjMLk4mU+D`$gr16R!GRORX!OtQi3s01{KJQBtw=VGPF>YY)nFit@6pnxMcKpxF|DZ z86rbJp_0*O=i;-8t@6n#T{3znT#zBl5E*(am27N6hOP3+Xdq3`CcOzR$dF}-41K0b zR+W%pt9-I5myF*37G%gWM24PQB^#HJVXJ(yaV{CX^)1MdWrz&phe}qRkYTHQvTB!% z-t`t_$TCERQA{NppO9gze6sN_8NJ~x$dF}-3_Y((_CP|0t@6npaLMSsZb61DLu44y zRk8^Q8MewNo8Xes+uVW-S%%0kuTaS*CS=$upKPK_M(=P7GGrMd!|X;So0O1Yt9-Ia zE*ZVKEy$2%hzxTqm27fChOP3+Cc9+xzP2DkmLW3C^i(qXbuvI?URF{n2$QESCGDL>C zw@NlGA;VVrWYb(SdJkKWAjT$8C}vl23Fl}|RyC8PJN1sSpo zk>ScvC7Yd)VXJ(y*)AEqRV~PnWrz&drz+W;gbZ8dlg)9-=v`_-hAcy5xJp*Z<|bs= zDxYkwOE%XdLzW>jT&t^O^Aa*_l}|>QQZdD&(>#w1S%%24VxW@EPsp%UKG}SiY`#Z^ zEJI{iw@}FzBxKkspKO6kw!kApmLW2%o~UFC6EbX-Pqxq{Tj-G?%McmXa8$BI2^qG^ zCtKu_E%L~aWrz$bNh;amgbZ8dlPz}17JFpKGLOuE>)NiJE+JZf?R2SPTc+5SE4CGi zZKYycrPx+0wl#`vtzuiJ*lHD9onot3Z0i-<2F12fvEfNfvi^KE!`&9z}IvPd?yWfYT^ zfvxgeM$v5j^av{1vV;s<<&!OQ$(DI!$TCERen}-;o{(Xye6r;(*>aBzS%%2aJE~+W5;AO+ zPqxA(Tj7x*%Mcm*Xq9YbLWZsK$yT~#D?Kt~86v|-p^~ji$govD*(#T8l}CmwLu44Q zRI=3x8MewNqdVK_Tz9ochAcy57&TS0H3=EE$|qanlCAN`kY$JrW4B7SHX*}S`DANd zvb7!=vJ8=72BDIzOUSTQKG`~#Y@J7jEJI|N$Eakr2^qG^C#!YIYCSS!86v}MN+qjH z$govDS)EH(=aC`H5ERqyWj|^Fc$S|{1$<`-i*eajQdF!%3?{>;n z1!Nf_!~9ky+mMi9t9&x&t;<5R!6QSKAu`OeRkDo<8MewNbKbfvL>oOaWEmpETwf*I zl#pSod@|>)%R;otBSV%UGF)+}WSbK*Y?V*uymeWipNW+93|WTAaNVPlZAr+mRX&;X z)@32u;*lZC5E-t%RI;rJ8MewNbKbfvL|Z*FWEmpEHK0niEg{2J`DD&pmxXAXM}{mz zWVjMl$+jnC*eajQdF!$eZTHBKWrz&d!z$U1gbZ8dlR0l)7NQ*<8L|wK;i_CEdoUrx zR{3PkTbG6CL5~bshRCosppxxO$govD*-m%d-06`a%Mck>C{(hC5;AO+Pv*RJS%@C; z$dF}-4C^E+*~1ALw#p}S-nuMA4|`e8kOvkgbZ8dlR0l)7NSQyGGrMd!t9_Q;TBhzz}yO4gW=VXJ&H=dI8})aa2R%Mcm*N|kJXLWZsK z$(*-B3(jM22xgB|DgqVXJ(ygKpbA=#e4I z5E(`Zt!&doZ&Rd~{sL3NkmLW2Xp(@#-gbZ8dlR0mN7NSEQ8L|wKVI)_{4ku*T zDxb`GE3^@iuGHjJk*6NM{ ztsWV&43S~xuacce$govD*$J2Ighz%fLu9!AP|4a7GHjJk*5;D6d1S~kM24#%mF#3f zhOP3+PP$|#Ju+k&BEz+qN_HwC!&doZr(CjA9vQL>k>QF^B|DvvVXJ(y(=OR*j|^Fc z$Z%b%lATG&uvI?U8JFygM}{mzWVkw3$<8KZ*eajwtV?#*BSV&XWbRw;pLgGKr~9q+ zUd27S9Y+6F-lN<6#6SKXz1}eDuMjHddnTZ4hWBv>Ax{!E>+KtE*Tf> zybx93%eIKnyHL^iYQn0T5`A&f>-3@#XY;zRbT*dbPr?=eYZ>cxaTj*8v z5p&dSzqkFx=rMFD)p)-v`Kk0TMCcylpGrq^@;DPB)On7N_B6GfXlre3I67f&VOQiD zOny}&zd6Y7@i+l50X&)fk~(cTsbkG!Q%-8~o9qmk*K0!|IyO~dAzvZ2W&6MueOzC!1vdir*J2@1z#DMUiH!ZEoD0U1(QnWeBYU!n7I zeiT)fps+GaAri6`R^}=MWJuxIEQMq96*@2ZV^R@rhhwu8A|YGh*j$Bx3@NP2QdpI* z(D_&Zx~#Cmsw{;_$W~aDs}PVOh2ydmj>}i*d~|?*v!MiqtsrjLfJzM4Ax>Jk)IXDLKNw!-RMg@6nx9G|6de7-{GBM3ClEosXVG(d-fw&dySZglvVga}@$I zq!8<(s=_(>3Z0LqMA4iQ6wb*~h=go~b8-~|GNcfzysE;v`3jwnutd?^5){tOQiz0X zg>!Qi0y3mf``U|H5uTT?kV?gHnK_O5cuQbKcwUx5BxEa`m#YwvA%)skV~oQ2`3jwn z!bFkz2uwiX{49k?$W}N%S0Nxn3bn7#7=;V+6*?c6i6ZkcnSjCtSqhPmt#CoELO_NT zYG1K23K!-pbUsoOMdqV40fh^*6e1y8;lf;nfD9?rzJ_BIF3MNveC#HQ%*Sm43KwN5 zL_)U0MY#$A8B(ZyRmUh?oUhRNXigNFkK_atF3wVjglvV2a}@$IPa*Di7NgPkK$j@C zrHT#T;_&aE;wu=w4d0*eZTRwoZ^Jhid>g)Y;M?$>0pEr<{CykVt@mwstKGNNDYkmW zwqCJqP;46&+a|@fS+Q+VY+DuEHpRAGvF%W74=T3*Z@$j+JEs1rvz20g3oE)~d9j4q zN-@f~_lbn;7FLY%?tKC>uZ7|6E?SeSa7n(xC9c9HB`92yr4R|(3YX+61Y}4d`UX|u z(tL$WU4=_aP`ETpAri6`F3nX4$dE$xbgIH-`3jwn3PsVf5)>}WQiz0Xh0Agk0y3l! z{kE!bdA>sD<3v%kyaa{IvlJpBTjBCtg@6nx#3-aHT#>KP`N$DHRaSz+6qvI`3jwnKt<7- z5)`h#`IgAzR_PT!nxPDa3Vxs<1X+Aw4*4xXc<;Z3zl%vlJpBTVZXkLO_NT z;;KhgSeLKR`AAk2)s>*IE=wU2vK7|lDg$4OhAzNX6 zu0lYD6yl0hRk%K1q4UwMh(6jCzW2F4OCb`n6|T=!2*{8^TwkjSH{>g%w;c?ZX@?t1 zP`DvWAri6`Zpc*#$dE#;7N`n0<|}kQA{Nm{#KPxrW0pcBWGmd5s}PVOg;@Jg6>iE` z=zNSUqK}b<6>iE>h=go~n{pKbGNceIIjX|V`3jwnnnm_b5(^q@)bHCkBjKzabbl!vJ@gATj7peg@6nx#Ok!F@WFhA z&PV7X`UqWE;e%NUk&vzM!CZxa3@OyUc4zJ??aWuW)1A|pkJkn6D(%cth=go~J98BR zGNe%ZYMxQ}P`*Ovqj(X06fb-ZAIegQglvTmh+bDj-%cTxY;*~;$x7Pi|R%gsj)17rE_DC7P$60%#^?kMm6H6Zg^7!;y4sR|qN z6*jmE&Bqc03LCN%A|YF0L#{$Vh7_W2P!;aUSGdPjXg<0aP`D>cAri6`?#WdM$dE$x zbgII=`3jwnIY#s`$M86?H%lQBvK8*lRS3wCLiF3J!hQJ)osU9B^ijyL!hKl^k&vx$ zU#>zxh7@8HQWZAlD|9|C8PUfj!wMU-6e1y8VPmdBK!y}zOjQ-`&sXStq%xw9RE8Dq z&r*nlY=!%C6#_D(5Hkc-;emXG&c`kz`q*Vy;ejlLNXS-rAXgzELkcn9Q57D{S9s9v zOU*|z1AXbiEQLtOR(LR1As|BvF?&-LHsvdHKE4^z$2Y_0uqjI+60#LG3Xzbl@OZ95K!y}z?L$@Any=9L2y7IYkG=-ZVQZE`BxEaW z%~c4plAvJ@gATj7aZg@6nx#JZHKuq|Jq^HJI;G9RH0 zC~V78h=go~ZMg~o8B&NC#WR^lCWGg(Gs}PVOg;+CG6`smh z=zJtMip)oG0}4-NDMUiH!c(~l0U1(=6;M^->3oIG$9AL0d|Wr6@N||!BxEZ*ovRR# zA%$4aRTZAeSLl4SH;T+hdIJj2WGO^Kw!$;H3IQ2Xh}CIT;n{qJ&c}bF$b9TKpzv&# zLL_7>Je#W!kRgRwYgZLMmap(JcTV$I2_ybvSqhPmt?;p2g@6nx#GM0G;p6!VA9oc# zUV_5MvlJpBTjArm3IQ2Xi2ER_!YA?-KH(~Sq6CFcWGO^Kw!$ZJ6#_D(5O;M{g-_-y ze9~3;WC;qN%u`;gsS*@Em8B2~*$SV^RS3wCLfmmv z6`spic+ORLt^|eWvJ@gATj9A}g@DXci2K*)Nuhr~w_UMaP;4EFty8geDYlD>?UG`< ztk}90+ZDxjRk8Ibwrh&5SF!aewtmI-v|<}jY=eqzNU;qow(E-RhGM&^*lsDdXB6AB zitRbY_PkHCk^-pbK=kr_GdAEg~FQJ8<&uU>v$ZlchqrCgqfXr)QP>9x~ zDs0bJ*zPK9FF|2@mO>ypXF9kRgTW z=~RUs`3gH+g&id*?8s7xglvT!xe5UpQiy(ARoI!Yu+vr8S%SjOEQLtOR@j-V5Rf5- z7==`YUHJ;TT!mdFDD28oh=go~UAYPY8B&NbRaJN~U*Sbp;l&aZUd&R6glvTua}@$I zq!2R%RpF(4g_m4~mr780DN7*|vK3y+RS3wCLd6x`3kSN3a^x)@Jg0KBxEbR zlB*DqA%&P(s|v5?E4=C|yjp_7t62(>kgf1)u0lYD6yiETRoIiSu*X%{Q-Z>tEQLtO zR@jrP5Rf5-xav_AUdvZ_%~g1<1cleK6e1y8;k8_afD9?bHJqxjH(z0|tFX5Og}qq{ zk&vyhH&-DbLke+4sw(WuSJ>w&>?=WGUzS27WGn2;RS3wCLR?>~3j6aF_PYxEOHkOK zr4R|(3j1>v0y3l!s|BjUr}Gs)?J9h_1cgs$DMUiH!l!c;0y3l!Yagn@fqaDnuEK#5 z6b@u5L_)U0fn0@v3@OA)j;e4lU*VvuaIgf0gINlZkgaeqS0Nxn3b8JwDjdpJIOHlE zDna2;mO>KPrmO>Ag@6nx#9bX#;q&^Eg)inSe9=|-VhIXg%u)VR$j$*s3*j`d>FDtgUD7LpMwzny^w=1@HD7JShws$GE zcPqB{D7N=1w)ZKv_bawn6x#03@JoUrz*Ugukfy` z@NNkT?`A1PLbk%Yxe5UpQiy(ARrpfA!k1iyFO{J1r7VR=$X57Lu0lYD6k-%o6~3IW z@MTxw%Oxm$IZGiDvK79Zs}PVOg&0#+g>T7M_!d{;TS`#)mMn!x$X584T!nxPDZ~sx zRruC?g>Q8gzO@8}Z_QGOglvUx%~c4TPNh=go~Z_iZ-$dE$JMOB6G$XECdSK&KKQ2354g-FO& z_>NqKfD9?b%vx3W&U}UMbQQj{1cmR+Qiz0Xh40K&2*{8^Tqmds-<7ZMU9Q4+m7wrl zSqhPmt?*sB3IQ2Xh^rn|;k)w{zS~v!?h+KfJ4+!FvK78NS0Nxn3ULjmDtu4A!uPle z-&2CZ_hczVLbk&93O|&u@I$V`50#+sLs<%u zkgf1Txe5UpQiwG}RpG1o3SV^_+Es-g%~$wQSK&uXQ25a-g-FO&_|aU2fD9?bodZ?j z$MO|^%vJcY5)^(cOCb`n6@DyNAs|BvaUVog`0;#&A9odgyaa_G&r*nlY=s}sRS3wC zLfq9+6@DUL;U`>$pD01$C$bbGAzR@mauotHq!9P0RE3|+SNKU+;U`N__{l7VNXSn`nU4lYGWUNZwk`9ze4nY zIS$8+rL;#2)1oh#Om>?+>6tP5`*c(pRZ)6F^Z>;wjF$raFg$rN>Fky^VJb+|rRv$y zC7{KBg{a~_{UL_T##a+o)s*OqlU^SOTNQN8kS3w|?#Dg=4$U zk)?uex~6%qC{*ImirbX(mCCi|h;`=wcg(&s=vQHv(9eqQUAeTa`&!pvvAOF;v9<47 zdv9%X-@vu@p01@UH*Q+lFq3`{kP0iX-?8>f-M#I_mB;QH7cZIruOyt!=I;-8t#Yb+fSobAs!9O6s~U@qu44H+gQa`rP#(P zwra&TUa>u(*d{18l##Dvl46^z*lHBp6vZ}Gu}xEK(-qqc#Wqv1%~EW$726!eHdnFD zQ*84U8}&4!%5R}!Tcp?)d$#YGrXEEzqb90y9IJ@tMu*}U>S0aPO#f6xxVMt__}o!M z(O~o#Dq+P)!|iBpVO%sjisn{78KG<4hoh@aa%B4H`s&$LQFG&ow#I$vwjbxTF>xP0 zyE0n3v$&LvRk@w>xI$yJCyJK#wBPC*9;(0C-PO}s-_w4ftEc{0*T7(3Z#{c?yknsI z|F(B8y=_!+6u@s1(&o{$c{gcZ&fAF{J3&PhRuL4WN}x(mi49$pC>Ew}Qc_3a3-AFD z3pPl601z9#13M%(UBC*&iY>b?K%6s)t2CTB`6pCDYMIKhdynn=o9DeVbCo>UyI=Wu z|4yS`t8d+D)^~SqvzA-+CJruT&K38os={1;Mh3O4o*dve_1P+7VSMHLzpfDE#7s88Vn5 zg&7K9*t3@y1P(K7FvAKn9Ki6DLShg&%!t8^D9lIz!*dylLEtc>1~aNKqX7(0q9g`^ z!{F2-ch|nGFqZ=up1ny70*4thm@$PJ3t)KKC@}~eX53)L6=pnu;rXh>AaEFbCU-Sm zQJ52pnd?U=|c+A%Njd zEHMZiX3=046=pGj;n7245ID?|!7M4vQUJrlmc$@%m}P@mR+!}ghQ~{ZLEtdB&6V3b zDk@AdfZ>5!Vh}jYiovWX%t`>m7D8eWILxZStSZcE0K=w9Vh}h?$zVzfQwm_%CQ1wf zhbbFOSz*cn3>#yKLEtcJ2D7FxYXJ;<0TP42VJZewQJ6{q!|sQ~AaIzf!BiEd8o;pM zBQXdZ2Ez(+k2C8EvmU^(!zD2Y9A?8{HWXkBM97(X5zfpPT=BQWrp|6~LP?w&pu z6K@m$g^?$GaJ&c?HeYkt37`L;p6w;jhPB**yIh>h{w@xS;jpP}dK1@Y(%bc|z1;`9 zwPxXsPqwxjg;!o)yTyC`jqPku(rfiv?b^ZH&-N4B-$A8k`#AI%<0HO;+x0J>e)Y$r zn;-Un{aIHkEr0hD4!a4zW+;O*CmeSh(Pl+_{)#Jy^gZZV`cB743|5x3=ST+#q!viSB|$lp595j_}5GY`~~tIJntp^y0BAB zqc~!;_7ED5Z$s*<`uIl9Ag1?F`(C=6KFAz*4+>B5a}Zy|ui`qPBl1zcf9%o$pe?TlJ3n)%0Vm2B$7Ux(bs z{NKZ$pT8U{eJ`C5`ECZ?OiZRYGoJ?DGtRyb9+>b+n7rK#Wg(htx1c9#3xpVei5esg>_Hj&rj_<#BMlq~xb9M>TH z`OTX*y?6u%i2m*8|0g-{XO6QD&#fL|3<96|ID`g-@d$SyOhA~3FbQEYLL&l-KsFU& z8p3ph83;`X%?L9QW+BW*n1gU9!d(b+5#}MxN2nkyKv;;d2w^e85`?7)%Mg|$tUy?a zunJ){!Wx7YgtZ9k5Y{7XK-h?|31KtB-3a#}Y(cme;XZ`>5gtHz5aA(&tq83MZ3x>C zwj=C7Xh+zIunS=~LI=VggohFKBJ4xhk8l9tAi^UEhY$`U96>mWa17x%!lMX}Av})o z1j3UDPa!;wa01~ZLMOs0gwqIJ2;B&05Y8f;L+C+x2H{zRUWD@qeF*&s7Z9F97(f_A z7(y6ExQK8G;WEM%gy#`nKzI@1C4`p|UO~8ua0r_Eab*Q}-iN;f<_aX-=BF7YCN1i> zb6MJ6+|K!B=lrexm;+^b#q>1)$2XuBj~$bJZPHt;@}};8JFCrpsQw%HKg)g_;YpM< zv<=%kdrw#XvOe1kLuU;czFvcRTQdiJO)Yw*dX%`aXrCI;Hr;`CX(HOB&mm=U_Jii^ zpD_PFXj&y)+?rLk;41c1e^S$m^Rn!N=KqD}|H=5jCi^jS&2JdVdbC$RkF##R@)6jj zXiQBT>O~LgYA@Owk%|-E$<*H}u)8p&!g=Fs_MztXAq?XAbfN|6PUwDuH=1LgS3fcP zGF$dt-F@8yoxStw$7X*Qcb~N~ zoLaT>|N6?mj6ALI_T0zk^D3JUH}diow~(*Cg?!~L9<*{<~$?VpJ zoMotDyB8sMdK&E6sK=)KjPd$&@)|E6W!LFP6J$SLkCW3aF(1!)D>-?lo`LO%(THO3dc9VanjMSOGQ%A;{ zztcwQ&EM%GH_d_lkDmHXN^mejk^651e@7U>!CP;=g+C+N z8*kjq-q?5sr@ocFh4atg-%ZG~Gl;)Mtw7>G9vXc{gV8}NxX4`h7OuZ}^Ns8c#BaWV zYoYh%TW@3=&)m#5!WKk`BfNnC=jY6sH?r4Xe;rQUnQY@55WuKy8P z4UX&g{S@VsGcP+k&_8@(@HM!%i+_PB6Z{neJ*Od_n*IDQQ#_ugF7)^IoW4Tgo?o>> zXph3(zh;HQLp{BN*4~ut<=>>RftR1?S-++4H8|Bj)5IpWftH-CDSOWm$|eOamoO)r z`!h_K77`4wN&P@pk8)R&{Xk7UF084aiJq$-=hm6t5C{0wvWtMU9+mpeYymn+`uRKy zpGowYvsV!skxYj=o0}xJUq0R4dt%#gPw!Ai--#1D@waD+t`>*xG@c~pT?C9+0`0c*YI_C2w6jGHt)Oeib&Ids~Tn^ z{BI0*{xti^=0{-WAk@Kn`~D*xM;^mvhj$-1bYy?qzILGPZQItqm**VnIB*EbpxfKt zwxeVJE(i~|Z$C;QEkzK+q@&yRc5Da2h2c{u zTb)Ba{e6Ro9!#P*bpt{l)L$6rf2RBN&>+pbL!@j1VgJy%?tz}ZGyNbuz+=d_AcK1P zx~R5)fcE!w53y7u>2BB_>^?m_(2dMHY!13AM>&K~XS z8Nwqy-`Ueg0|Vy`CC==KF`T)>-X^lNf8cCqU(fUQW)O#t7)L=ExRBm0I-5h?gWa72 zr$IefNt3{jbKQ;3$eriJC`9Ym;chN;_h0DkHu=s2iZ|FSXO7_k_YV(U7#?u{ z#W9>c;8W6EM?nl%oEb(g_MIJsES$U3$zWqo|L{OxXD@QT{bG0D5S~W+bHhCs&f^%V z?nLBQqTZ5q4WAw&apw?DMJ+hewhjLuI&d5+@c)U!M;_bTj!f9zzIU&Uz{a)%kG3Di z_2;@f35BBI3Rnf@rmK7K^gz!A7NZI(`T5IhHsMsXb$sqXxG>OjzH{IT8z;n)v+;lj z+*5G34aNSx@eI%O^mX=~?&<91rPO?7%_f}D*LlACbmu@9Ob-usp6zy)kWpS+_W<&n zr5@<#ySsWiQ2?GB?(FS3qpJ4Ym*j~v^6 zVDH|xgNNI90Po0S2iuKk|B<$i{q2Wfd|$`@1N>_;73hcB_qHABII#atQIwFFoe$>7mM0 zk`f5`P;F8<&TeDJ(}(utV#rrK{A2Bh4&(Wu;YFoEtso^T3ZBc(j`qDfSOh?f=hDWu z3{U=8+uoz?sBhbj?%%Pu9qqqq%1^W%KC#<2;JEZq`~Ds6hoBP=(wu+zM92QUC_>B| zR>u?Oq7XCZERt2mb|7x*dxWlS9CJ~KaSs1@Bn%Z1JXv~eg}p(jB1ORt6ViU&<%#ikCLeq;71 z4QG&xZ17Oty8X3yNIRXFC5tzK_Ng0UM|r9r<#CYD+#H~;qeusYmYyy^p(W}bXc_1q zKtVlp;83L_2qBPXumdpHTgVC<0F*>z;o$Ho_A|(hhr6#_>W5Jj%AwA))69KzGPBS> zpK0klJ<#8GRV+Wp!Q`pmYv3qc+ z=d81jYL9;40vgJWB*8wesMfUxErUayL&Jl-TPUPUb=U~*%H>LO`oNHV!1fAcF0L3r zvx~=it7@}p&Mnk+_jP$?s4Mgz+xxn_s*t;bg+AHw#@QSzFLL{dhz7^b3fjFs&cr;l;Yl=zGqR`9Ap25ZdAg7Zu5{1 zAkx-xsNFuK)U3-z7(IdtjmwkgY})++JOH-f-2-sCa*3!}wi=>}yH=jP#Myz)^Joa# zE}-&A8Q<*(}A|iJ{v*%?=_t6@5+I6o@Z+akT!FGHwTG6o7e)s z6s^VSD|ler-65)j@AXjdP-amk2WRlPUod`l%d>s`mj?HC_MII@@5}aK910yO@WYf> zd;&V)i=Dm0-4~FZs95LE_xGJZb9SQFT?myX(+4iJ2qy&(T=)feYSu35!G)gFLvW;F z>mZuGZlHHn=og_v@%cd&V=OXf;Pb$RGR+1GbCTMEX1i|?#izRq`F|ut%&D#nIz=rP zI|q6?`-Xs!_KR$aP{>_wbi!0`k1dU~j+6Iw_ViWSq8uUzfadC1Gpa;>`!WdJ&f%eR z{R8M{SQzn4o$7831dOlCzc|e(=|0n9HZ7DgKMniH9cKmJZwajHUon)-;_M_g7*%?Jmkpa;vU`#%;DaXG+T@ z_h6Cxtattsi)JaQ zbeNd!bWX#O9OyYU4DX=D)*Ck0rnW2}T!D7Brw{d)h)|!Nj8P4)G3AyAI2k<#&PfVb zSAP$@m>mZ?P%d3&;WXrHO3I$aj>cT0k5iC)7)Y3@3OrIw9Cbs8-01AOh*4xWdJK%E z&T)W@awctFzzy~d_4R}NU>m&gBgkX=vB;mi&y2F|>X~S(ZTUt8FrEXRo_Z3>IqnVq z0DZ#fxTFo|K)>;s58)4*zqG@z-13@Gx6sqvLanP|uF#-W4~+<%&|Z2u4miq<*4Q=0 z1n6Q{Y96<2%WPR_N$v+Hwwq@zPqgJAJrR#=`#?ASJv>KxLwz_z*|S636C79}(`;Lf zafoRPR#z_d5BdmhEsV@pSGs!epgFi6Y(?+e(|rjdRFK~O&aTy!v;F;Nd%M>Ro<7&# z+c~hh(tZ9^cNa#eYwU?3>aSQgT17bL7MFb9v-*DJ+#1Y^bzfdxk=@Pdew$}&OywSx z3dgMLmPsZL^wh5Y)59$3J{9?N(6}r*|O}INdLj&^};jy@t>HFe<6rfQ<<|Jp>QUK2-k-@!mGm<@B@@#rNL;YZj zZ5SfKsjRTwI@G?i<54JVJ9^~6u6E==+mZGim5%jW_E(?CrdQX|@)46D^#_ z!}t@=;1;J>;`x|D^5>&GI3*aq_IBAUYq<#z==-uQcxq^|vfsg#KZfJe4NV9TxDT@5 zd}=|S+4TWa#QK1Vn49myJU-u?Pc`%OQ!sk^)9?T8uk1T@aO(*pAK`e)eU|X;Rkoz& zDpI~tztUW>%KU%LoQtN*tQ)#+WUre4mxk-VvvpZ=ygVG=*t#M){!+FOGyh%C#CINb z+3K3rHM1s;z5b1p-`eW`)?jr`Ev|XV+MAI5prq8TyHHzQx29pij!@>Anu zoU0H>w;pgN3_vDD@DvFPVzXctGxP=WJv3i17*A*cin4Y#HPAO|ax+)XC>*)2NeA(#EKh&(OxG zlTXjasFTl)F;YaGtk+GZj@UHnf|%CG3w;gvawVr?SW!GI+?Fg=NO}t&z#qd zF*^CQZHzkkoNX-CIY#K@(}_CA8l7wnc->f|6W*zdr8>vrE@FO;H9FC^nKSu}o6H(Y zYT^7vlX+)qW6V!DmF`UH^v`{q(dnQ2IKj!15_L8hoxUtJ7|!`lX9J#D)Y%|78-z~U zjXK90ofW5LywSNJ#HiDkrSU@Nc%hT@Q77v_ET1gBv3#;@#j?aw5%ZJJGd_2g{it(- z(TQmXlYxy)V16>&{w?JadqHk>O$TAH7e zg-*5tO=hhwuWK|qeOaQf&}7#9+B9YQqHu5nuE%`}+i2EwQ)jc#*(`K63!Tk^lWUWsPPXEW zW{o&?&J;Rl3Y{~B&Y42zOreu)LZex8PMx!a&RIg|ETMCj&^asU{6nlMM_swG8+zeW z-(dS}oF#O8jal7|b;e%(jpar@{s!wu{!^RXVXlJ-=*4RH+G*L3nv+`1|Ci1GZz7rf z%UtSZw@O1?2!y5QSn$Gy1O5Ydfa{AHWjp-Wc|=e*fu%W)2u5baI7bB2$Hh2D1S1n; zoSApW)EK8nFl%Ov!zUOuLfB}m(OdZcVuav5f7;J`y==MjGM0(Fj4hd$d2gGgBrmIO zgdj&me~}{up9kp(!OQ-lM+ki8^a_1mdAsxt^D=sYdD&fx46}FPJpVlC7y4_xjDB4z zWBbLAEw47lmi%tWY>X}WJt4-Hd`pP2CBHYs*y`TrVs^AbQflES+j^}pV|Ib-`JF`WDBJtPR5ee^&*RdwXo}(7mHJQCVyv~j~{B?HJ;jgo!4)1SrWHHO^2jX>X z_@YN-M;5FDv}Z>atR?nL+N-#j9X)t^cJx3mkk{GKgTKy>5ST_Sltz1Ygh20;*Vz$* zzs`;Vyk|L^_gbtU-s;Y@ez?ER z`r*tuUT6Jq@{!Z}+HEdoeQkf8^|k$V^tIz?#ro5p)B4l?I_po^&og<~`FZr3ULg`#ZHB@^(ke=Nr8*>mhq$>mmE==mj^1`enV~4Ni;o zg8g;Y3-&o=J>6D!ruB6Fb1o8@)Zo26#vg!NzBLo6*1 zY>{J&LI2hIn$%+bSAVzkQRCgRRg2d}AC=cxAJyNj^+R_$>-0n8b=D8{wVQruqbcWn zuJl9gbEVfApDVr2sKI)jzP?(o(_6NlrLV8_EaP?7vm_0Pt!L@))OwG;B(gt=*UdIL zxb7})4jZ>*k8<=9=q#Iht#(^Rq7O1LJk`%ymrT{mm1c z^Tc)RC*#O&zPZlVllkU4pD**xbxdQwUcukAf2C|eBJ+Jc+jW1QmvP=9FJpV0mn~6b zOBLBNMYdd#tx#ku6&YK$Jj-fD#`Y_JUW+1ItH{b%)OlTP-y&ybm+T$~f*DVy+Efn?^3VVFcaWuY2T(?NrTO{nUEX3;; zi|ZB(dy9oVmX|oHULvkrBCcCvuDc)S^Zr<-;&n^KbxUzwqnX3|DRU-ULC)yd>(~;q zMli-w7_}@DT9z5>thsDUm*INbmM$|K4?7Jkvr)rxp<%hvz?P1-mYdP`UZ-z)(6`*^ z+vm<=d5@#_6++(%b6>36Bw7(#_Z83(?}@b|YFH^WtTaTvwOwf}`;x{Q6t7z)uH&1r z=-sX|*X_soyf46uLb&|zta+Ot_2!m&auu%4Qqvlwc<|J8p}TC*e=BD)`{!Znd^MNvCdrQbB=9C zyl%a?ZoRqA_Z#cYbw20VzQpS`i0d|(>wL~_5IMIY<9{mlT-O0c29hpe4+s^iIO!>9k``+~ZE@yW}=Ed{52YqC6jE_S* zH_{m6cs!$Kd+s*YIHK~iJ>zrleru4Hm(?mVj&k$o)hjZVkoIJj9z|T#>$qL(c{d^=y~U5^s4hRddztlz2Ur!o^D=7FE*92FX1OY+j9Uio5nuq zV2E+Hhh@{Iakhu0(#AN7cqGKeB6cXm#v#TsXwPgw?68YbTlB~6ybzx<&*b`zICkT_ zP<)41gL;?7Xo01Ty>t!AYm?DHx~SdG9(nC{_UMSS#cz~|@91h#%i}vbJF^t8OD)%; zzDLVkRbnl(W=6|){>f{w^H1I~=a1t!k>6_(-(uRg-toHBa-FbT7c8^>N6U5wiyD|S zb_R=iTW{`nkGp%eYE9-lYiwGY(|kV=bGlwwtq)fDbfZ-}|K+XP`7df7W2|;Kt7DAS zVBwcwb81bxuaF;vom*( zh8Rnf_mudKz7gXDe`adAL0E1GmZ_6%e6(k0{JcFo}?&hT+}Z}z>uXXJB_{xhFPlbNNk`h2dk z&4}}w_U*sdU}qM6J)K~lC&ygmuy6mL2(k1oCy2Y85blzeCxqw8elS|LbCce(otyNQ z?HU1|Ps?_Vz>^`CTAnB@PZX9X2FvViqh&k0=`GvYO>cRUxo3`RY1ytMcq+tF%aerV zNy74^V3~b-v~1@`y=A-Jz+1NK4VF1ulTAzUbcm&vCkxAyh2_b?GOa|*c2$D6Z0A+I zWq9B?lU@by*{(`B5n`!jj&5RU=9nhdTdeCtj2fsZTDCK@w9L|AXJ+kLw91jTm9ssz z^3)<%@kNVMghj5swAax4i5BgguD59Cbg9{{YG}i`Hb#plLoBsARal)WtWFJ9>0d>w zc1GCeu$>Y1Ic(QHRGcll_MtPxQp?kXU3dsy0AJuSe=1uXm8cdK~u9`KXJ<0vFj&JhZwE;-e!ie8e?f` z!WK4nuXYC8->aR$_PK0luzjn{RTi-q;3|vQ3)tChZ;P#NELEIIkL8%F2yLmNzZ=)f z*g0^2zjiGK@7J!w@TJPG!#L^g*RI3xR-1*@W?{8CShe%!E1d>AZ|?8c&YSyE#nl?o zkFu*Z*wT^8&Z&FLGlgZYe2MovGgzkI9`D!AynD-b=G|MiYdW?&TXs!HSBRz0c$Tm{ zOIV&2EVFlumhIfV&uKe%&wH9}+NoA&XSQh}yF)CsI$KzsEv#ZoE^JYso%#1UZD;My&fIJbXE8VZGqmq5{5{PT_cT{nog1v$w;SH7eY@eU+P53DI?t4x9nR`J z^9;|0So#d-39IvrRX#EHQS*XTwxTg7?Yj}5TlU?Ee}?nLGn_A;p?z=S?{~hiJYU=| zzBd5&{M(iM+{6OV8yw{QVC^*XR;JT3-%q3w_xAl_%gXbl*t96OxpK5zDzC<_7(_xEMfU~ zKi=L#aYqZy9i4P{WZwjN3k!vXg~9^MYqVhB5_t>uEs?*YMdFSYi951yki5M`!rmfb zk98sccFEgYEbeHrxua*?9octH-oj#GVX?5lniVbB_fXz~eGldDXoNaH(-7)z`g~G*QJ)12g|HY zY_p<0`-aS4$2Vk6<~xqRDWE(^z}sb*a4-!rn?@&%RId*V*@J{{B{) z``hI#tTgr>3$fJRO7Rp|3VUp8hzQ6OOd$q8zI#^&yTpdaWdxU7qzUA|_>{~vcdwk0mONV{S=Szou z)8{R(5ti2k%Y3fvZK6H<7SP+{TfkU4>{~!zI$A_M=6k_78fp>tT7?Py<*>{cJo_*KoOUF7sA1ttRtPiDweR;HH-(-4Q_D!bGJ-*3|rNh3-^rgeT z&GeQx2+JFSWtI;53DMrhFt2CR($cZf*z=`hqj*{yMd{cm>}?eG=z~Oin}oehqBL$Y z_I%s1N!Z&Y>}?YEHVJ$5Z=$`;!ro?M&zFwP#-49GHj6%Hv#_u^SV-R$uS?$*Po&i< zcLLy=F`&JTcg6KM4Q@WNghzj)-W7iy&umJ5hj62PL*{n~k4%ekzDN4m+|J{%vtIqD7dYvyduT>3ZEQ?dtYj4;`;+?ac7U5gX)vN}b^B9%Xn z<#KXP-&o~5`cV06`DP?9=aWb& z>|1i5qxLQN3r@Fv6aHd|r4+S-g1^`hDcD{_3j5yNQ^b86DTRGw?kVgW^Ou}m`&Rs9 zh@}*DxaUUm8z{W{I>A&YnAl!LCi_O6BSk)+xF;lKvhUM9lig?jileAU`yQVN_KJbR zk2~uH1;4L*RyGo@OY@2CWn{AN+u1gfDegB(ne5y4t4^EUg>o&#SR1Z~7;D3;A(rxv zF}&;_m}_GM?-=klX76%ow#@oB753e{CyYB=tjBLlwS6=1bItB|d3VspQvIF~OPTn7 zxG{TgNK4B&cUr{KMf)+=?3;Vf6nD*}O!mFKXR>=~-sddYck}NLv6N|?U>Ya#X`EnU z?-iNsdwtIocjTl@cGtaUvio#C;3)VV=1urz6Z?Gl+bFTDH5jH3g|sxE8Uz!2&&Xuo z{d=ak+b3nRyY@Yk-2?PtXKB1)`bdbSO#JPZ`0U1ud>Sv9Z0qC8lU*O+ne6%iTjF@0 zEl+lJfM>F+13u~~xMrd$`&fvjO!T;#vyX?gG@rPSCzdCA4>6zY>VZ>`u@=UCNog&# z>jr!+w7ZpjEwt+fd@Z!=27E1?AfDs|lWV>f(j$zm`UFu6>B~eyyUM^5+EoVmT(j#7 ze6HDjQNHc6YY0B!a%Q4nnkXpvYdo>-nkaIOzEotg>kmAWU4M{gvMUcflihRmZbxBP z7x)m5H@Eblig?Mne6vOe9~F6s~uhsv9y((4yIYz zr$SoFG+i)pyb_u0N{Lp;*h45dJE5F*IVS7>}m_oWLI1GmfNnV_>5y}7WvdHn3@Fz$BQv%?D`8&Vb@>e zDeTG%PhnSHeAd~ut1CViVrkCIG*8QWaWe(eOu;luFxizEo+<8$Oxqy4Cc`t?osyq- z6n5Rk7eXv$nkATK38q z&%8>JtyW}f6j_TRTdT;{DYEs7Y=a`(sK_=cvdxO@Zbin~!+aiWQDpZjvilSnXLIuU z9#CWtDzb+Z+18wltxN^7SSKpxty3#xtP^%`v#rUoPS}++zMk40&p&`GtTxuu9}Kay zPEzhgizAP~^-) zLBSdybH=XSIpZke4)2tLt9F{qFEcYQ?5dq>&aPdx<2_)zYR7xPi-c#l$mEmvfENkE zMZyDS`x6Q6UUE-p_mZw7Kv`jFukBLln6_RJNtB~?cTz?dqxc(^mFZ@R5rp)^<%LUVN!L(d3Ef-Ae#Xl~rIKah|JK{&8l}j@ef>@5SJ7EYRtSm}hJvlTO-oyy6@r58O{B2vms%ks zg^i7c$Vg$oxghU{b3Ihd8M_|p z$DCce=INh=SlS-17CEz8Fs&9$^kX8ET`$!N8JX;Qsl0#5l~R$(u9W(xj$)0;nI8|a zlxdBiSR*LtIYkP)imDYdQrJ~g`5v9?ry>Q{PsQG|#ZY|BQM8EX(;_HZ1OD&L25RaK<0tEzs&*e->gX#RfsKK~T`=ws*?< zZdY-2K*qe-nDm12iE#Z^q_FF^{Ji2uL-8|?VxxE>_&r{<*_`{fmeM&fdijyUuI=&^ zc5PQaFSx2JQrJ~p|J>=`WGH?%#L~Rjgu9%T{fm&6GHnt$!%;?Lvg^P0K*pT0>%a1) zWV2wh>%e}_S=wxvem=xfrp+Q}HVX=lYa+$nqTjn)eLi;!in~R>cei*Vcbk^f_j`8> zin|2`M^cgE9y2Q02^sU^9#GitNwa6z-uE6uan;@LJ%+;fG544?asM);rEjJ05rp>` zLht9^BM9#ie(pVjm!rJMyG8JBNqAYREbkVPYgvLAXUQZ4qAY7Qw_( zW@NfoFx{&%-7A>xHBA4?QQT{o-U_j_Jl!jp?iCaq*G7u_1jT(S#eIU}K11=Zo!$Ek z#V>|fN^zf{xKB{9%tea(1;za;#r=Zfenas~&hGt&;+I1#rMO>E+%G6Nc8?Sf2#N<( ziU$P61E83b{TpZZ0YmXCA(m1+V9K%g<{l7C4+tjC9Ym%F1=E8n(}RNPL6bAT>L?x* zW%WTp@t~l1P*8BTB2qjgC>~NN9ugD}nVk6{NAZx!nSUE%Y0f-knEqWzOWWgz1QTaV zBGXpEv{hx=DwwvKocT3pX{%xS^$<&$wi>2yhP0GvYhdEcU@Oka&j__CvTcfNyCP%% zpV!x}$k_Jg&)cQQb}KUWtNCl$ujOYhA6CxWtH|~#vi*wefFe7n$R1H-hZNaiMRr7y z9aUt<6xne__NXFzOp!gV$evJSPb#vf6xq{?>_kpRFRB%?SSMOVooH3-M60M1t)@== zduXxRI8y(O5KHSstEm&e8Pd`^(HiOmwXpn0rZ&OUrZTk&rZ&@d{FbxSX6osG2(gr@ zO|)Qbf`Ta!+Hbe2BLM)}&CMdQE3fA#RvE5LxPSS7M4hoxQ z|F?d~c0sY-JfD}G-R*|rTOpQGY&Xy6<&c&>pY4K)ZA@g^A((a;CVE9F(+=rq*TiD$#?6Mz=b~}XK4r4c8jyr_i4rBNCo!t(T7ymWH(!A&}&*wuS zEiK0#f{FcT+?~9~FpYzZd9g>$i#>+PkCXNorfbg99y3n59%AV@X^+UKJ%-SallF*Q z+atzF?A0UT!-DYPB-faC_GvvVa_wP5_=;nC*yP$Dgjkwu4-1Ni#mMMkk!$oSBGX>M zwAV1%+8>$r3Z}h=$9}AzZkYa0 zM{!&*9T)j@TreFMOveQiM|qLyQNi@6VOp7EdQ>nyYMA~n$MmRS`oBXg&8J5N)1!jv zQNi?>V0uh2J!Y6%a!ij2rpFA^pE`=i4AY;5SjzO6V0uh2Jtmkq%8mK-xL|tRFm1>& zJua9Y2h+^#&v6dFOa5_qH#6~XoEdvQ4#Jt)8;?vV0yyjn(s@W5QI+%LXP<(;gf>!Nke#Fj_^rA_@sG~ z-n)6yJjvG`)02YfNkQ?Xpm<79JS8ZeG87NxD4r4&PZ488M}JySJS|Gl)8c78ElSYSg6V0&^t52&yh>y`A(&1Wro5MN zLNJ{$O!T-|f=&pg6Nc#|(l|46LNJ{WCFq18JP`;v%gF2VGj^Sd?35xqt;o6*S+^oP zqsY!GvU7^8N0B|F$evYXy^8F-BI{FR{fg{@B707e4JfifMK+|!h85XGMRrM%T~=hQ zTlr`Hydrx+k-ezM*uv%YvGvN!II>G+EVm~ii#6n=s39j!4as}JCq)f8X==z9p@lW% zq^Kb$O$~VyY1UHOGo2K5;$)~3Jd@==GIa{3PQ#SZl?s(DZ^9?yJR{gm`)j{I>&TMFrC8Laj)emL3m0K zvNdQ5zq@)GgmD$sX+xNAe@_d-(;?UR3{DG*(}v=HSg>iSuY6iiu>FY?T_T^lREjP^ z(FF?Z({Xvxg`9~a<}Sh1CGw(6P_V^|6y1WN+fd}&{cb_gZ79Y#if%*U$NSxaqFYdO z3ktTek>ZS?IAbXCb?c0vIAbWrI*K!fVqA!&wdstYI3p<7sz-{mg5s>9$k(Q`hT_|} zj!*lnp=fY+&l-yHA(m2{HKpW^kd~H`vx14eN@O}Gn9dodd~G@>n9dod3C_|v!!$9( zQl@i)>72-?bApMzT4d@GOg)BajyZ$1$j$}yh^N(Km?k-j9>X*_#8RdnLD3^9*pEhv zX9UGFhGJfh;u%5ljGJ?1AhH0reBR;KO!PIM*rZ|dT z!!$L-(tPR_Oud4sS1{3!iA?7O(|N&I?T^P+Txi%lA|l z48>Y^PZtEm1wnB^P*`8pQ#>aqo--8rKH@n+@tmRXJ=JrD!uM3q35w?g#dCtfddHq( zKu`=AihLh2ASeb5h3}~b42AEh1_Z@`pcoJo)*ts2gMwnvP~>}sK|}Fvm+OOu!uM2z zhQjw$gMwnvlvUqT4GN|~!88Qj@tfj?1k;dV%J&LGB4>sSlkXLV43qB_h6K})pcoPq zb_C*cW>`=R8;X3dFf1sB4TbL&h7E=96@~@Hu*n(UD+~*!VZmfaK%VKMV7h3S^1Z@E z!F16u`Cj3oVe-AgMZt8@F!^5LqF}lxnCuA5GhGr)mkd+BSGXjYE*U1@D_k;6zE`*; zm@WyXOM>Z=V6r1X&vaQZT{cYlUg5G}x@?$yuW;Eg`Cj3&V7e?QE(;1f=JXU-1jQ9Y zk?#kt7z*DHToL`i6+_|sfh&UIipd$@4_pyUR|FHsyiHhdYkRTh1=I6}Dc=t~FLLI2 zn7d_VA_pmm;*~(b*}@S}q%$~_ zv4-Yl*A&@xMfPe=MsIQivUsN>;!a1*o#y+R5pky@=1zTIGh*)4_cbHpPDf1c`@UvG z-1kVhZ!+;7BhyvEbk#8B`8fG!ea%(Fa%x?s9)n0#Mz-7xvS z=DJ|IE-0=G3YMx!@v5MB)llU7npX`4pE95JtD>)Y)lm4p=2b!Qs>vDO*Ssp2UJXot zi2cdM(Veuq@8g{cTT`a6=HUByA;-5c-B=D;O*Z}p#G^j7*&R0;C`IBJ{Nee0 zxA?J%R$jx4&{5#s_6^n#)c%_Knx6)HL-y0C^)=Z|{Ey>0b6Pg#23t~y+=oXtHuVNY zPh~rihy1RcnyhAlJIVZ+2$}YoZhp0jDK)TBi?dil`OCE@N716$cw4ldw-%S{w6%W$ zv~_QjmX!P;J8nT+_ZL80|2An!$xl6kp11XX0kmV@CM_xXVO`K^@%@$y%qi}_ccR>m zeVeqT7OBf6qUSBXQ}Z3Co$xkkNy*Oy1f3S&w)u|JPJElRq~vEJ zf=-KX-h9VtC%sKtQt~qiL8rxca=zoVliwySDf!`;Rj0+bb-v@Yjc=2dl>9Uz=(PAA z&v%@b-sju#7)i+wFV|`D4WIw7Xw7d;m`lNx zf1`eDf-627GXAOrKO^~HnV8vR%{zw}ok_^aVxo*mPfpJ_UOMS5hSeZIV&V~6)o zzcc9LuS|@Y64TM%j`|e{J2qfT%((%6?ofUOBL7=)^px{5`lERny}rDRzExhv!jqTL zPsq#I8|P*0^YSv@PhQ6MJ1^ri$;;Rl%Qs|d}g#5Tq~WBoY8#`voU7eb8Rh`@J6HjQf}211PA1J5UD)5f8G4ux0)zT1#9 z^)_w%s9!MPlVTc1nb7icAx0K&y$0nrO{2X(4rkKdOm`18D6w<1SuRE<`xcKDFfvTE zux>;PwZ_8ia2+ko2{Bsukh90S7cH=iMhh6tB^K(01=cp=o!dPRW;&hHR7W{Ji_vd>Hs-7C){j^p_}dmu z*&=rjcZlb3hsY(~eYC(fF@V8KG~UB9XOF*HA1(0PegBG9H_B-9Zg(>1W*k7Yx z;q39(=%WRGvwO6_elA+D-`DOf*zari7VNLm`{!VPdEVaxe|bJy;J3C%3-(>oX4v5q zv){$;E!gj3_ZIB0&&M=Ahn4Og_zUyV0>6XQJ<9vc>o7KGq`%Clw9_+8l z`+MN8$wv$Pesyah{hc@LKr{2hfXX;QTlMd};TrY?xA8k~tXOpY`6FU=b${!78(*CM zOa2$$zPpYy@%9(g*#D=#c0EQj=`Xsm|4h@_H>AEeeeYkK#CmP@ap05wLK}b2BmIRo zw3DNJbC!2I-{5`oiHdJtm-|IEdQo{93jlr#iAk`7mI1y#J(c`+9&dZqZdD#?2#x^TGkL?OSd7t|{WHzl9 z-;lium6ofrIaZpDe-lg^YjSMES-#@$YSy3)Z_ZY`7KpbV&!nFle@&NuZgaNAoyq4G z&!oTFnC*g$Ec92Kvle%z^*eprNWU{$r{5W^^BKoBj{ak`PX94lw|=14Nk1@Jrytmy zt##H}9%9>1e=b_5KNqdDl*BXXmqqLJ%c6Cbop>hwt7x76RkS|ZPm0#*CpBm59Or0% zC+eiX)10k$XIj7IE-)~!>9<6k^jn&<4em_qf2?$8(*KBO(*KBOT0df~JClAyJd=Jz zJk$CE>)e_22jZFZ2jZD5)p4Hz`}KGx`}KGx%X<8dLH5t_O!m+A%(Ra>nf6h$-bNpV zYi_fT0vkTaQSp~J+gId)8)itvw zj=lbkli%9v|JLMxg|s2|8NBMN$@~u6hCiAa(@h_hoXUUESc@Nz`E%;}!H+?RC7nCbXVDMlW|WPDx83R>?*$ z36-&GFA3M&b_rw?N<=`{|7{5jUQ)gUjx-gQz&}lXw^l2G%x3#kZnp&TJeJ$ER8nTW z8jcb1fmdToBU?FsY>Z`$C)`d+omE9i{f^T~uEuObh|%7T5M!CX8|G=9wDC+k_vFvC zb5Hl+%(V26q@};|HcCIPxy{mFW86VjNgVxEF8#)f6V1!$o8@Kn!fJDE zJN>P^jGk3q#<`}vjI%>|8U3QXj2=*4Mqei{qgRuc(SOOy=&9so9Q)^G9IfYNTn&}V zVhgdw)k-$`P1(I6R*PSoxzEM;(Vk{HQS-Xp| zG&E;BU5w?RIosu8ECJ2o_gnewo3qy(8J~J{w%eV_=iQw7HF|u~&B-s&G1lSE(ekK0T%=h|dSi8qkHzQk& zUt!6XZeP0aNYDB1!OH&bOO-?Y=R5mWAL>3k+}k;@aOwIDOWT@o)$-Ew4tAdH>Fca4 zJ$T(1;!;dp0|$4b`TV|Vg#9ra;p=O@d2P)%Z6oZDWg~2zV1JGOJIV=8oLJ`V*S1w) z*-oT@p=M-)ZIrWG4ym&2kolh##y7$|i^A6Ar|j!pW9VhfuzJ%y$Me`N=VcsB=Vh#D zc^NBMUdD=*m$7=~Wvpa*8LL`e#tN60vD)QjtbBPHt6*NnikO$NI_71plzADeW?sfd zIG@j~rg<5ivb?NWk@3d}^XKu$0P`~b7@u$G{qvop$oSKA`SbWgad{bks4Xw!52fX0 z{GqZ`#)g)k1=$|gNUW}bNkPU9u zR>|7tyTjpZTkVo;cI`Nf{iLMmXT#sWrVlmo;8oEXGEVL z%Oi3^JZq{fW8}+l%g9z=WrWw|7^^BOWi;Tz#!AO;5jC`eU8QDv#jF_W#j6ABI z5%b@X5ji0ksj`fbQx2AqUW3Yr*>T6nqv{#a*+oX=gkYq~GDa>du#EI#R7T9pJ4PN= z&xkQvWJFE~Myf1h?&k-4s6M~T{%NV&h!ZOn9R2lIW#4+-ydPWQfA|rA_Fj8e1BbQfLMtZ?2Bi_F_ zMjlnqh@nelL{11ssw`vV#HVGXSFSQ*zSJ@DsCq`cRf>$r3BgE}WsF?nVHr6}P#N*g z$uaV%dPcm@ij2q!!AO;5j9esQ898cE8L_IwG4iN-M!dm~jK~SWNR?%bTxMb!If_yl zu`b0i@~C=7ta*uy$O*wnm1T@G0wYItD&vg6$fN2RvDhUtA}0hRRhBU}1xAiCRYt6d zb@|An>KQQ;92t=lf{`lA7@GqlN4+Xzb716A^^DjD9~qGof{`lA7-t4Xj>1*OnSqf< z)iYv%6d92df{`lA7-t1W&I+iEvjQWJs%OND?Z}9n5R6n=#K@69=O$FL*@28l)sx|U zY9zz`3o@!KBjXH-N;W5u@u+$-eBVJN!~F{~sw^YpJdH|rXCUKI^<XgtW>hOfs9Ahlg&-ZaQ}jgD$B??bEcBb3uHX1 zo(yaFVxHmt1sPQqk#YXG0;Xmgpdx!n zk!{V%*f+5JsWoGMs2Mz}zGlo%YX<6{s2NmQR5M7%TA-3u0vV60C#$4nxPL)Lm1ShC ziz?ZIK*po$$rhw!xPL)Lm1SgX5md5;fs9AhlPyfiaQ}jgD$B^&E~#Xgrgok%kE$nw zQoy*k54e9pMwMk`Y#mjy#es}R)sx}XZY0C~3o@!KBV!w_k}U~jJgS~-NlJ$M7i3gf zM#i2(C0iQEcvL;v(v%GMFUY8}jEw!2O13PJ@u+&TWhoi%UyxB{85w&`m27z+<5Bfw zc()E1R|9bWf{ZH5$k=zQWGez0kE$d4vzs?>Uc+mr>jTBAi{?bK8)}YgpVS84B_JlpFsE|!s`g1LijYo8wj64_$0gujRI_YwX9!aqd#0fZk!_#uQJM&JsVe}wRl5x$D> zqX<8S@J|r_DZ-BTzx z3E^7^-$wXtgx^8<&j`PZ@OudV1>rjgzmM==5&i(-4-x(w!XF|0F~SXm?;`wng#Ur? z=XjPr{BIYBsPMy=zbn#`iSjQ>CW};A$)pFl2nN%Sd1sB)D6ZGwQFSGgWGhoLlz%}+ zm1Sh~V^y+Mfs9AhldVe0aQ}jgD$B^|O{-+90~wF1CtID8;r;~~RhE&_r&r0=1Tr2~ zPqro{!~F{~sw^Yp$U-G+31mE~o~$J$!~F{~sw^Yp_(mmL8_0N6J=xln4EHa{sIrWV zqb!wdT_EF8^)swAH$#DOIj4I2>IO0^vHUu&rRZq4d zCByv-GO8>iWLr`)+`k~B$}%#}4XI@J1~ML1Pj+ughWi&}R9QyG87h_R zzCgyK>dEd)$#DOIj4I2>I8UaM-5tN<5Bfw52j?ee?dl-Wn`SWRLLF+WIU>#?4gtl_bHxvTcfNyCU16$l4XzPDQp$k?mGw9g1v^B70bo?Nwy^6xn`7c0iFGRAi6jWSk9V zKC2~QYbXIcs=fqlO-lgEnJ58NSyTc@#;2{4wFWXCRZrHMlHvXZ8C8~%vCOGtZGntO z)swZQWVnApMwMk`Ecq(gwm`dCgHWVnApMwMk`tbZ!m_CUs?>dCgJWVnApMwMk` zYz0)Z9f6ET)syW=$#DOIj4I2>*cPc|?SYI()swZSWVnApMwMk`Y!Owmoq>!;)syW^ z$#DOIj4I2>*eiV;`lG zbp$dVRZrHDlHvXZ8C8~%v8PnY_5?B>RZq4jCByv-GO8>iV}GrZJsik*R6W_lDH-lx zkWpnB8NCLTY;PdrQT1edQ!?DYAfw7MGWsqm*}g!=qw2}_rDV8&K}MBjWb~j^vi*UK zN7a+U(aS=q|~_gDSt_uh+*xo`zGRF&TS&TwxiMHvHhlH zl#Sdb;>S&DE&h+2h?m&Ml58UO151A22+ylUQO?Wi6j{9@8>7g^Dzb5ktU-~DS7di6 zvI&Z8q9U85$R;bYMnyJ7kxf-(SQI}h|F8&slnjf$N6E0rdXx-{nn%g7h&@lcvL+ZDk)&h@`_qmkz`a^M#dVd zlGOz=9#v0Pmy%)gugEj1EF)t(p_1Xtz1-8}QT1f?DH*o>3NorJBV%i&l8p&uJgS}y z{bYQa*ytdruDoy3MjuNhn-Iu&R6W^* zlnh(11sPSAkYe7bpWn}a>RkBHej7QazO-jkI&03IAWf>X0 zUX^TeAmdT>WRp`eY_1k$R9Qww-&-Zak5#%Fz@zHPFwg>w^UtuQT98p?85u_aDjB{K z&yn${da@}g88%W2GO8>i<2Xbmn;OV?R6W_$lnmRa1sPSAk#RJnl1&R_JgS~-T1tjZ z(}IjD%g8t;Q^}?WG9Fb=Ha#W7R%t;-m1Sfc8LDJ60vV60C!3LyVS}_FqslTej!#vx zra;D{>dBf?GHi<$WK>y3#!<3L)*Q%qR6SX9N`}qQf{ZH5$T(J4$z}#J9#u~^GbO_o zXhBAmWn`Q&P|0QmG9Fb=HY+8=#%DoBm1Sg{w@}Gu2QnU2Pc}Oxo1G)0$}%#}o~UGV z0vV60C!3R!&B>8bWf>Xga8$B80~wF1C%ZExyE8{dm1Sg{Nm9w?1~ML1Pc}Cto0}t} z$|5q(lU6{MpC?_Q$QCNHMT%^(B3q)!mMXGkifp+eTcOBSDza6IY_%d=qsUqm*;+-m zPLZuwWL#*S&u1=i&da#CI4|R}-nSQk~YN+9D=^<3M@E%pWNf2Vvc-XnN7a)pPRSPM z$f&Z6j6H=)wj_}8sCu#`DcO=78C8~%vAdBIgsI}OYD#@s_ zjEp{=O13(X@u+&TWVuGO8>iqkpTCwFELA zRZo^|_pHrYa%5ClMn*4NC0iTFcvL-EvfZ;bTbm=J$}%$g`YPG_K*po$$&yW#wb}X{ z8C8~%am1mLZ3tvMs-7&_R9TB(-H~;ZD$B???or7$1~ML1PnK+|tj#v&$f&Z6jH54= zY*QfPQT1fWrpnrEQ;v)(%g8teRLM36G9Fb=mTao5%{J%AsIrWVBT<#??m)()>dBH# zm9^R3IWnp&Bjb2jCA%k(@u+&TWK(5rc2ACsD$B??Dp$$21Tr2~PnK+|tj)IM$f&Z6 zjB^7j*}Z{`N7a)hn<{Iwdvjz|Sw_Yg3YF}>K*po$$&yW#wb^|+GO8>i<2;EXB?|sj`fWvo$K&1A&Z3)srQgDr>U`a%5ClM#ecKmF&Sl#-r-Vl1-Jh z*@HPUsw^Yp%#}*^P$1(`^<>GW%G&Iq92r#>k>xj4`n9jvW+vv@c-}Tewq23!P-N|j zY^NgIrO0+GvJOSIN0B|O$o49-eTry3#+s>;Z3|>Ps-A3HO13RWMwMk`Y#&sz?SYI()st;c z$+qXnsIrWVt&~c(Barc^da`8GXDxn1RQ9-3Sw_aTQYC8-WIU>#EZOu~o3-c2sIrWV zEw)OwGm!D9da`8GXKl7KM@E%pWb8LovR#3UN7a)hn?7sto9*&xQe_z#doPu2cOc_Y z^<=x#8n8P@MwMk`>_b(ujzGqv>dBH#pS4*>j*KeH$k>ysWP1V`kE$n2HhtD+dvat{ zSw=>GLM3}RknyN`vSia|ZT4`Ej4I2>=+&rXdjlDdswYb}eb#1sb7WLmMn>OCCEFLs zcvL-Evgxxn+m|Dw$}%!~cq-ZcK*po$$&yW~M~ZD$B??3R20A1Tr2~Pj)0FJCY-# z$}%#J#ZWXDpnV>vRaEF>X>WIU>#?9r6$(Ht377Llc!*ncS9#Ey4|Sc!iF-{gtE^*8Wh z82saJU_tz-Pi=O`4Q%|$@QU%T_$Kzh_P>Pvy^V3xdJP`fub-%x$91bs?B8QjYwGz!ckVE$Z8?YpI4{I>J`}-MK)HEjZm~0Qn;L!fMb^Il4tGuW&B^m36N>*D;hC1k1 z-mns;WVMlu2^txdmyxlCs$_M=WOXT7ogk}=WK7V=sJx7f?Sx8JUrd(lQO~k^K~^8h zn4pnSc^Mg7E0t_aFgjWb8jwvW8+ZI5)9wHVCqYNX7(>jLOT%*o&!T zs#cPxcOTq>{F07`Fh&^yo~`$f&%GjGmrKHl>&h{&Z|L zrU)|b9Cl<((8#E~jEw%KN;b8aEZIApWm5&&)JVnzjf~36$msQ|WYdbtlD)%OHcgOC zi)2jD$f&%GjJ~%@HocfE**lzN(*@b|NX7(>jLOT%I08_~W)zbpdxx`Zh9H{}$(W## zQF$2|#~~_NQ!!bxcR0(M1X)ugV}eFT{$(W##QF$2|M}{idtYWfc?{JpQ5@fR?851-zDla4B_*5mE zT}+nj9nP}Zf{Z(dT}#UZjf~36$T&(?$>tQ3C3}Z6{D^b{&Lq zm@L`V%yZK`d2U&kx_XW*)2A)XW9H> zvSe2&&rQj=r__-#K_jE`GO}B2V$ZTlF+Y*&0RGqR7@NvUQ4Vy&~J7$TljnO^R%@ zBD-6W-J{61D6)GM*>2iu7mleGq%~tfme$z?v1Twqs~J>YR5LhB%37fIrwfb8 z7N%qi1=+$##srOw%FD=D7ge%F#bmf9j`kJ_vPF@M2^txdmyxkWP{|e-lO?;Fvuv>- zTO7%lppj8|85!Fpm262dS+c7+!}jB}oGpoDOwh=vyo`*kqe`~4m@L^loMlS|+0sbH z1dWW!%gES9t7OZH$&$UpS+-1&EsJDK(8#E~jEp^nO18Y146le|4OlM7mPaxsXk=7g zM#lb1C0kicmh8~YutPU3XWXCbd=MsRWK>>8#$Hn;TUAW9D$TQ1f^1bJV}eFTC;>j$(W##QF$2|{TP+3 zrI;+)JDg$fa7xw^$(W##QF$2|y(yJ!Z82H0cR0h|;goD`Bx8a`M&)H>^yyTxb;V>@ zU=qvOIzhHBk}*Leqw+E`dX_5L`eL$VS96A4&1s&kk7P{H$f&%GjQ*`kwxO6T+0~q3 zS940XA(AmcBct*%GJ4r6*~VhBWLI;BUCk-k#z@8ljf~36$mr{%=t7P{TlO?;FGpxT!$+)N4kugCd zqw+E`j>=WC`-{nvUCkMGHK%0U)9lEYppj8|8QCp1v1iz+TsTHgb~W?dl#F|t9T^ie zGAb`4yTvB<3_Fzz$&y{oJU1odo@PhJ1dWW!%gAoAi5)+mR7{raYUa5q8TT|hGA3wb zR9;4Qi%skqcBmHSS+bjz=cZ)b%j(FOppj8|8QCp1v1eIpF>fD6%IN*;9(_X+?G-C*v$B%b(h7Z7Z%B+tQk`ElXPy?xl7$g9%#Apz@-cK{D0? zm27)4+4hudyCCCUYDdNdjf~36$XFLuvK_@_$!_WlyQ$MW<6de<#srOw%FD>uBB*5T z#bn8D>I}Q7Q!?(Qc4SP@$f&%GjO~(2wzHTl*-f2cH+4$Jz0{732^txdmyxk`RLOP~ zlO?;UGwh~L$+(x=kugCdqw+E`w$Uot?qagtX${yd$heoxd8>NL-|m)emrK_jE`GBWm8D%qZ5vSc@PhTYUD8TV2gjWb~#~vIE6r$!_Wl zyQxz$?xl8QOwh=vyo`)Kol17FnCxI$&JGGP?xl8QOwh=vyo`*VrAqclFx!52{P`bc4SP@$f&%Gj9#`%cDR@<*-f2ghXon; zQadsxXk=7gMn+#>B|B0~mh7g^vLk|wd#N266Erd^FC*iKLnS*}OqT4X&a$I|jC-ja z851-zDla4BxJM;BR!o-crp~fsf{c5q9T^ieGAb`4%=t7MNClRci2Jub)|k7P{H$f&%GjH7au?1^HsCsMK}1lbdjj0qYUm6wrmZa^h_ zvY712loVilTI*Z9VQ?gD$))~o|ppj8|5gF%iPl7DJAHP$Pol<0{6sDlE6xmrt zc21G?D6(f1*|UnQSCO4pWPOUPUy)rRvD>)fwNm>5XnsKVQW}HfE#;GhF?VXA>g9%#Apz@-cK{D0?mF#pe z+3A$*v>-bj$(W##QF$2|>!M25RZP~El648Pu1LlNjf~36$k-yNWZlJN-6>hOAnT4~ zOwh=vyo`+Pl1g@_nCwhSc1Dn$iDXRB$f&%GjIEBN@laloavYtrB1dWW!%gESYsbtR-lRcA? zJtN4TiDXRB$f&%GjJ>8x_G~fPvnkoLg6!Ey#srOw%FD>ucdKN*#bmuHS+5}Ljbu#F z$f&%Gj2?tacD|VGd`fm+ke!cYOwh=vyo`)~j7rv5OxBl@^$D`RNX7(>jLOT%=uN3) z{l#ScDOtZD>yKni(8#E~jEp{=N_L@`>_SR*L6BXDWK7V=sJx7fo~26mTrt^mDcN&^ z?72wB1dWW!%gE^8s$>JjWCJPLfFK))WK7V=sJx7fUbad$SWGsUk_`&7!AQmgjf~36 z$mr{>8#xbBucDb1Ba!PhtkX?>s zOwh=vyo`(^QI+gUG1--r?1~_}63LjLkx_XW8OOsa+4IF@&!=S13$o`U851-zDla4B zs9Ys`p_uH2l=i-w zN+e@~Mn>gjWSlcn$wrFFMpCj7K{gV}n4pnSc^MgJu2izC#bj4gva5pZY9wQVMn>gD zWSqYp0a^+L?y^8F8itPQ0>;sDIgNp1!itNLR z>?4Zoql)ZfitOWx>=TOYlZxzhMfNF0_Gv}-h9dinBKxc&`CydwL8BKu-a##vI9 zKec9DE3O&W(wcECOXqK|#hSqct!7YpQOzJ3Yk^93y_oEJN_Jh4U5{i;(8#E~jEr?r zC404)?A4U)RYCS@Bx8a`M&)H>Y!Otl*NVwrOUYgnWUoasCTL_-UPi`tNhNz%G1>8#x`0ddrvXhds4FZ2(tG? zGA3wbR9;5LoQ?mC8viC+ZCTL_-UPi|LN+o+=G1>c4viAwH_eC-$Xk=7g zM#f%KC3}A{+51zn_Y1Q3M=~a8WK>>8#=cu6`#>?-2U4;R2(k}EGA3wbR9;3#4?-pT zU@_STQ?d^VvJXZwCTL_-UPeYgMkV`DG1-SwvJVNe4@EL2Xk=7gMn-Q+CHrtO*@siI z4-2vnM=~a8WK>>8MxRb4`$#d_M^dtn2(phvGA3wbR9;3#&r&7(XffGGQ?ic=vX4eG zCTL_-UPea$RwesbG1>8 zMqghg`$RF>CsMLc2(nK^GA3wbR9;5L5r<0l$zrlkrevQKWS@*=Owh=vyo`+F9+m9% zVzSp$veyOK>yeBJ8X1+Bk#Y2;l6|U}>{BV(rv%xjA{i4jGAb`4;}}pS`*bncr&F>| z3$jl~GA3wbR9;5Lk*G@cMlsnNDcKu>?2Smq1dWW!%g8t$R>?k7O!k?S>@$MwGm(r5 z8X1+Bk#SV6l6|(A?6WD^X9d}3BN-DkGAb`4=ZnccpOSrEkbORqF+n4v@-i~clc;20C?@+tO7;ao_Jv5s1dWW!%g8ueqmq5G znCy!w*%t-b7b6)HG%_kLBjcQrO7>jLOT%ICG_veW{r2ODWlx z1lgA&851-zDla1A{Oy|{%g^6_DJQF`9c#{8lJSVCOS1Gw>As%+C>_2mtm+@7!!=_v zeBDRwwCqRmmtT0n58e~vgGaz0!NHd~L$8qlz<$m)%*@UCgP+nXu_%ZS%q3ireqD-pML*$e`VjPgIiA+IcDT}y7?@rt>@pG zt4R4q{YrDiD)av}bM6d$UFQOP|K#?i3y<`i?;fn|@4i$y)PKISZ}p+>v%|fe0}Gd~ z->|f;DO;5-FFo&I=h>dV&dSn**Nur+&Hqb*v(bEhf9ta3csY)*uleS+HQ&6kbwzUg zrEDR7XQqqP_*a{)u325@hC{}qV#-1wVwjE^mBXUAs4DE7B7 zTw81yRV*6jxvAmW+b~SLeAi>{xUSeRn%ZcX=cb11Zo@Duv1+)!*f84LXqe}whS3$2 zW;I(1)$o{N!{~ydVV;{B9&;Op*&L~c#}*q#zZ4Dg+|=;c+c3;FPc=NQ*f4sy;Z~Giw!3~##V<;QW_qA8;03MsD|$-HVl6x z-Z9Tj@A!_}FwA~PH9Vo%@PyPb&rJ{P=Oiw(oEhE7`YrCHNdzU5aBT$9^)`_IXq^7amgXV<2pRfVdQdn+yLXc zMufvU9Of``IUF{?xOfub2_2r`FmgFOVSsUkCc=|CJjr3?a(L1J<1$c$BRU-6FmgE@ zF~GRi6yYfyp5icaIXra)j2kK*!JRisqCzYt#Nt9MA;joz-T@;i#8N^mEyOZHEGxuv zLM$)D3PP+X#7aVJMu?R=Vz?^DauzGt(<|8H6^vY7!QK%S3>cLu!ciTLau~TBjv8RB zF(Mq(;TVUJ%i)*-#%d|TaUG^{$O^dP0NtfQE{Ed=80)?WCv-T$VdQc+VSurLiSV=z zPjeW#9G*77*os9ssl!PQBbUQT1B_jT2&Z&7#bM-fIAwsbKN8`z4$~cZvRW$_aygtf zz}V@Da7KqS97ZmOGX@xYRuRtXaF)Z!<#5&jWA`n>IUUY%7`YtI8DJbEL^!X*c@86& z!+8UY1Ca<9bhyA_bLEky!@+6fZC

lt-d<__Yofi4PNm0F3I`{F^?GOP+4tSW+k-D2 z4Y*wD^(WfNJNlDezu*{-f>V2ro2MR+dt9ZST07_)LGhS}^PhmAwg7jJdI(>C;&->5 z!*+6Zw(O6$8QJ~zg$B-3tliDGKhQfqZ@zoK_4fH^kO#WM%1@JYr?x+AKP`p_A3ve; z=XYOSqF8@N>=wo7<{K@8W=}WN_sV)$oKp6>>#k1!8qT9%9k@&H8;<^jy^AhLdyMuL zf--cjL(-&vAcz^H?k4FQZp|(G~}inN!(zJbbr7Fxps Date: Thu, 27 Jun 2024 11:35:09 +0200 Subject: [PATCH 15/17] CST-15211 allow to patch edititem if the number of validation errors decrease --- .../repository/EditItemRestRepository.java | 14 +++- .../app/rest/EditItemRestRepositoryIT.java | 78 ++++++++++++++++++- 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java index 87bc0b46b01..475b6515cbf 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java @@ -279,7 +279,8 @@ public void patch(Context context, HttpServletRequest request, String apiCategor "The current user does not have rights to edit mode <" + modeName + ">"); } context.turnOffAuthorisationSystem(); - + List initialErrors = validationService.validate(context, source); + int numInitialErrors = calculateErrors(initialErrors); EditItemRest eir = findOne(context, data); for (Operation op : operations) { // the value in the position 0 is a null value @@ -294,7 +295,8 @@ public void patch(Context context, HttpServletRequest request, String apiCategor } List errors = validationService.validate(context, source); - if (errors != null && !errors.isEmpty()) { + int editErrors = calculateErrors(errors); + if (numInitialErrors < editErrors) { throw new UnprocessableEditException(errors); } @@ -302,6 +304,14 @@ public void patch(Context context, HttpServletRequest request, String apiCategor context.restoreAuthSystemState(); } + private int calculateErrors(List errors) { + if (errors == null || errors.isEmpty()) { + return 0; + } else { + return errors.stream().mapToInt(e -> e.getPaths().size()).sum(); + } + } + private void evaluatePatch(Context context, HttpServletRequest request, EditItem source, EditItemRest eir, String section, Operation op) { boolean sectionExist = false; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java index 3e8a8e18b44..94ec9933920 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java @@ -1424,6 +1424,8 @@ public void testPatchWithValidationErrors() throws Exception { .build(); Item itemA = ItemBuilder.createItem(context, collection) + .withTitle("Intial title") + .withIssueDate("2023-02-04") .withFulltext("bitstream.txt", "source", InputStream.nullInputStream()) .build(); @@ -1434,8 +1436,10 @@ public void testPatchWithValidationErrors() throws Exception { String tokenAdmin = getAuthToken(admin.getEmail(), password); List operations = new ArrayList(); + operations.add(new RemoveOperation("/sections/titleAndIssuedDate/dc.date.issued")); operations.add(new AddOperation("/sections/titleAndIssuedDate/dc.title", of(Map.of("value", "My Title")))); + // we should be unable to change the title removing the date getClient(tokenAdmin).perform(patch("/api/core/edititems/" + editItem.getID() + ":FIRST") .content(getPatchContent(operations)) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) @@ -1445,13 +1449,84 @@ public void testPatchWithValidationErrors() throws Exception { hasJsonPath("paths", contains("/sections/titleAndIssuedDate/dc.date.issued")))))); operations.add(new AddOperation("/sections/titleAndIssuedDate/dc.date.issued", of(Map.of("value", "2022")))); - + // this should succeed now as we are also providing a new date getClient(tokenAdmin).perform(patch("/api/core/edititems/" + editItem.getID() + ":FIRST") .content(getPatchContent(operations)) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()); } + @Test + public void testPatchItemWithExistingValidationErrors() throws Exception { + context.turnOffAuthorisationSystem(); + + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + + Collection collection = CollectionBuilder.createCollection(context, parentCommunity) + .withEntityType("Publication") + .withSubmissionDefinition("traditional-cris") + .withName("Collection 1") + .build(); + + // the item below miss the mandatory dc.title and dc.date.issued + Item itemA = ItemBuilder.createItem(context, collection) + .withAuthor("Wayne, Bruce") + .grantLicense() + .build(); + // this one miss the mandatory dc.date.issued + Item itemB = ItemBuilder.createItem(context, collection) + .withTitle("At least the title...") + .withAuthor("Wayne, Bruce") + .grantLicense() + .build(); + + EditItem editItemA = new EditItem(context, itemA); + EditItem editItemB = new EditItem(context, itemB); + + context.restoreAuthSystemState(); + + String tokenAdmin = getAuthToken(admin.getEmail(), password); + + List> titleValues = new ArrayList<>(); + Map titleMap = new HashMap<>(); + List> publisherValues = new ArrayList<>(); + Map publisherMap = new HashMap<>(); + titleMap.put("value", "A title"); + titleValues.add(titleMap); + publisherMap.put("value", "A publisher"); + publisherValues.add(publisherMap); + List listOpA = new ArrayList<>(); + listOpA.add(new AddOperation("/sections/traditionalpageone-cris/dc.title", titleValues)); + listOpA.add(new AddOperation("/sections/traditionalpageone-cris/dc.publisher", publisherValues)); + + List listOpB = new ArrayList<>(); + listOpB.add(new RemoveOperation("/sections/traditionalpageone-cris/dc.title")); + listOpB.add(new AddOperation("/sections/traditionalpageone-cris/dc.publisher", publisherValues)); + + String patchBodyA = getPatchContent(listOpA); + getClient(tokenAdmin).perform(patch("/api/core/edititems/" + editItemA.getID() + ":MODE1") + .content(patchBodyA) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.title'][0].value", is("A title"))) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.publisher'][0].value", is("A publisher"))) + .andExpect(jsonPath("$.errors[0].message", is("error.validation.required"))) + .andExpect(jsonPath("$.errors[0].paths[0]", is("/sections/traditionalpageone-cris/dc.date.issued"))); + String patchBodyB = getPatchContent(listOpB); + getClient(tokenAdmin).perform(patch("/api/core/edititems/" + editItemB.getID() + ":MODE1") + .content(patchBodyB) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnprocessableEntity()) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.title'][0].value", + is("At least the title..."))) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.publisher']").doesNotExist()) + .andExpect(jsonPath("$.errors[0].message", is("error.validation.required"))) + .andExpect(jsonPath("$.errors[0].paths[0]", is("/sections/traditionalpageone-cris/dc.date.issued"))); + + } + @Test public void testUpload() throws Exception { context.turnOffAuthorisationSystem(); @@ -2024,6 +2099,7 @@ public void testPatchWithValidationErrors3213() throws Exception { } @Test + @Ignore("see DSC-1787") public void testPatchWithValidationErrors32() throws Exception { context.turnOffAuthorisationSystem(); From 2bf51e659e3b096f135336b271aea2e442a4a49f Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Fri, 28 Jun 2024 11:28:46 +0200 Subject: [PATCH 16/17] CST-15211 improve test expectation and logging --- .../app/rest/RestResourceController.java | 1 - .../DSpaceApiExceptionControllerAdvice.java | 12 +++++++ .../repository/EditItemRestRepository.java | 3 +- .../app/rest/EditItemRestRepositoryIT.java | 32 +++++++++++++++---- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java index ec6fced9513..44cac53249e 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -761,7 +761,6 @@ public ResponseEntity> patchInt modelObject = repository.patch(request, apiCategory, model, id, patch); } catch (RepositoryMethodNotImplementedException | UnprocessableEntityException | DSpaceBadRequestException | ResourceNotFoundException e) { - log.error(e.getMessage(), e); throw e; } if (modelObject != null) { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java index f42628c96f0..54c7815d83e 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java @@ -202,6 +202,18 @@ protected ResponseEntity handleCustomUnprocessableEditException(HttpServ HttpServletResponse response, UnprocessableEditException ex) throws IOException { + String location; + String exceptionMessage; + if (null == ex) { + exceptionMessage = "none"; + location = "unknown"; + } else { + exceptionMessage = ex.getMessage(); + StackTraceElement[] trace = ex.getStackTrace(); + location = trace.length <= 0 ? "unknown" : trace[0].toString(); + } + log.warn("{} (status:{} exception: {} at: {})", "unprocessable edit item", HttpStatus.UNPROCESSABLE_ENTITY, + exceptionMessage, location); return new ResponseEntity<>(ex.getErrors(), null, HttpStatus.UNPROCESSABLE_ENTITY); } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java index 475b6515cbf..2e4177651e2 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/EditItemRestRepository.java @@ -297,7 +297,8 @@ public void patch(Context context, HttpServletRequest request, String apiCategor List errors = validationService.validate(context, source); int editErrors = calculateErrors(errors); if (numInitialErrors < editErrors) { - throw new UnprocessableEditException(errors); + throw new UnprocessableEditException(errors, "The number of validation errors in the item increase from " + + numInitialErrors + " to " + editErrors); } eis.update(context, source); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java index 94ec9933920..4ebc8609d34 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java @@ -1510,20 +1510,38 @@ public void testPatchItemWithExistingValidationErrors() throws Exception { .content(patchBodyA) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.title'][0].value", is("A title"))) - .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.publisher'][0].value", is("A publisher"))) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.title'][0].value", + is("A title"))) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.publisher'][0].value", + is("A publisher"))) .andExpect(jsonPath("$.errors[0].message", is("error.validation.required"))) .andExpect(jsonPath("$.errors[0].paths[0]", is("/sections/traditionalpageone-cris/dc.date.issued"))); + + getClient(tokenAdmin).perform(get("/api/core/edititems/" + editItemA.getID() + ":MODE1")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.title'][0].value", is("A title"))) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.publisher'][0].value", is("A publisher"))) + .andExpect(jsonPath("$.errors[0].message", is("error.validation.required"))) + .andExpect(jsonPath("$.errors[0].paths[0]", is("/sections/traditionalpageone-cris/dc.date.issued"))); + + // the list of operation B makes the item worst, so we expect a 422 response and the json should + // describe the errors according to the new state of the item attempted to be generated by the requested String patchBodyB = getPatchContent(listOpB); getClient(tokenAdmin).perform(patch("/api/core/edititems/" + editItemB.getID() + ":MODE1") .content(patchBodyB) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isUnprocessableEntity()) - .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.title'][0].value", - is("At least the title..."))) - .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.publisher']").doesNotExist()) - .andExpect(jsonPath("$.errors[0].message", is("error.validation.required"))) - .andExpect(jsonPath("$.errors[0].paths[0]", is("/sections/traditionalpageone-cris/dc.date.issued"))); + .andExpect(jsonPath("$.[0].message", is("error.validation.required"))) + .andExpect(jsonPath("$.[0].paths[0]", is("/sections/traditionalpageone-cris/dc.title"))) + .andExpect(jsonPath("$.[0].paths[1]", is("/sections/traditionalpageone-cris/dc.date.issued"))); + // as the request has been rejected, the state should not be persisted + getClient(tokenAdmin).perform(get("/api/core/edititems/" + editItemB.getID() + ":MODE1")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.title'][0].value", + is("At least the title..."))) + .andExpect(jsonPath("$.sections.traditionalpageone-cris['dc.publisher']").doesNotExist()) + .andExpect(jsonPath("$.errors[0].message", is("error.validation.required"))) + .andExpect(jsonPath("$.errors[0].paths[0]", is("/sections/traditionalpageone-cris/dc.date.issued"))); } From 9ae813e90204962fcb20e59509801df623f80466 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 1 Jul 2024 11:43:44 +0200 Subject: [PATCH 17/17] [DSC-1294] Fix missing import --- .../test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java index 4ebc8609d34..16b2b36a036 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EditItemRestRepositoryIT.java @@ -58,6 +58,7 @@ import org.dspace.eperson.service.GroupService; import org.dspace.services.ConfigurationService; import org.hamcrest.Matchers; +import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockMultipartFile;