diff --git a/smp-angular/src/app/user/user-details-dialog/user-details-dialog.component.ts b/smp-angular/src/app/user/user-details-dialog/user-details-dialog.component.ts index ed852adbda5ada84b5ca0d832e2b852271f561d7..d06637b6a183eff7b7d61dd48505168b0d05b99d 100644 --- a/smp-angular/src/app/user/user-details-dialog/user-details-dialog.component.ts +++ b/smp-angular/src/app/user/user-details-dialog/user-details-dialog.component.ts @@ -210,10 +210,7 @@ export class UserDetailsDialogComponent { uploadCertificate(event) { const file = event.target.files[0]; - - const reader = new FileReader(); - reader.onload = (e) => { - this.certificateService.uploadCertificate$(reader.result).subscribe((res: CertificateRo) => { + this.certificateService.uploadCertificate$(file).subscribe((res: CertificateRo) => { if (res && res.certificateId){ this.userForm.patchValue({ 'subject': res.subject, @@ -231,12 +228,7 @@ export class UserDetailsDialogComponent { this.alertService.exception('Error uploading certificate file ' + file.name, err); } ); - }; - reader.onerror = (err) => { - this.alertService.exception('Error reading certificate file ' + file.name, err); - }; - reader.readAsBinaryString(file); } onCertificateToggleChanged({checked}: MatSlideToggleChange) { diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java index 3814f8b2bd3a93e35dfcb5cdbd030aa71cec9434..2124f5108477e4bcd62d5d32a96224350fe19c26 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java @@ -1,6 +1,5 @@ package eu.europa.ec.edelivery.smp.services.ui; -import eu.europa.ec.edelivery.smp.utils.BCryptPasswordHash; import eu.europa.ec.edelivery.smp.data.dao.BaseDao; import eu.europa.ec.edelivery.smp.data.dao.UserDao; import eu.europa.ec.edelivery.smp.data.model.DBCertificate; @@ -15,6 +14,7 @@ import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import eu.europa.ec.edelivery.smp.utils.BCryptPasswordHash; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; @@ -36,9 +36,9 @@ public class UIUserService extends UIServiceBase<DBUser, UserRO> { private static final SMPLogger LOG = SMPLoggerFactory.getLogger(UIUserService.class); - private static final byte[] S_PEM_START_TAG = "-----BEGIN CERTIFICATE-----\n".getBytes(); + private static final byte[] S_PEM_START_TAG = "-----BEGIN CERTIFICATE-----".getBytes(); - private static final byte[] S_PEM_END_TAG = "\n-----END CERTIFICATE-----".getBytes(); + private static final byte[] S_PEM_END_TAG = "-----END CERTIFICATE-----".getBytes(); private static final String S_BLUECOAT_DATEFORMAT ="MMM dd HH:mm:ss yyyy"; @@ -160,7 +160,9 @@ public class UIUserService extends UIServiceBase<DBUser, UserRO> { // try to encode ByteArrayOutputStream bos = new ByteArrayOutputStream(); bos.write(S_PEM_START_TAG); + bos.write('\n'); bos.write(Base64.getMimeEncoder().encode(certData)); + bos.write('\n'); bos.write(S_PEM_END_TAG); is = new ByteArrayInputStream(bos.toByteArray()); } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/X509CertificateToCertificateROConverterTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/X509CertificateToCertificateROConverterTest.java index 53156baae5bb41ff185739e843703317966f76cf..4e9e84e62d755bc94382a5d945b75036162fb2bb 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/X509CertificateToCertificateROConverterTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/X509CertificateToCertificateROConverterTest.java @@ -38,7 +38,9 @@ public class X509CertificateToCertificateROConverterTest { {"cert-escaped-chars.pem", "C=BE,O=DIGIT,OU=CEF,CN=Escape characters \\,\\\\#\\+\\<\\>\\\"\\=", "C=BE,O=DIGIT,OU=CEF,CN=Escape characters \\,\\\\#\\+\\<\\>\\\"\\=","5c1bb275","sno=5c1bb275&subject=C%3DBE%2CO%3DDIGIT%2COU%3DCEF%2CCN%3DEscape+characters+%5C%2C%5C%5C%23%5C%2B%5C%3C%5C%3E%5C%22%5C%3D&validfrom=Dec+20+16%3A17%3A09+2018+GMT&validto=Dec+17+16%3A17%3A09+2028+GMT&issuer=C%3DBE%2CO%3DDIGIT%2COU%3DCEF%2CCN%3DEscape+characters+%5C%2C%5C%5C%23%5C%2B%5C%3C%5C%3E%5C%22%5C%3D","CN=Escape characters \\,\\\\\\#\\+\\<\\>\\\"\\=,O=DIGIT,C=BE:000000005c1bb275"}, {"cert-nonAscii.pem", "C=BE,O=DIGIT,OU=CEF,CN=NonAscii chars: àøýßĉæãäħ", "C=BE,O=DIGIT,OU=CEF,CN=NonAscii chars: àøýßĉæãäħ","5c1bb38d","sno=5c1bb38d&subject=C%3DBE%2CO%3DDIGIT%2COU%3DCEF%2CCN%3DNonAscii+chars%3A++%C3%A0%C3%B8%C3%BD%C3%9F%C4%89%C3%A6%C3%A3%C3%A4%C4%A7&validfrom=Dec+20+16%3A21%3A49+2018+GMT&validto=Dec+17+16%3A21%3A49+2028+GMT&issuer=C%3DBE%2CO%3DDIGIT%2COU%3DCEF%2CCN%3DNonAscii+chars%3A++%C3%A0%C3%B8%C3%BD%C3%9F%C4%89%C3%A6%C3%A3%C3%A4%C4%A7","CN=NonAscii chars: àøýßĉæãäħ,O=DIGIT,C=BE:000000005c1bb38d"}, {"cert-with-email.pem", "C=BE,O=DIGIT,OU=CEF,CN=Cert with email", "C=BE,O=DIGIT,OU=CEF,CN=Cert with email","5c1bb358","sno=5c1bb358&subject=C%3DBE%2CO%3DDIGIT%2COU%3DCEF%2CCN%3DCert+with+email&validfrom=Dec+20+16%3A20%3A56+2018+GMT&validto=Dec+17+16%3A20%3A56+2028+GMT&issuer=C%3DBE%2CO%3DDIGIT%2COU%3DCEF%2CCN%3DCert+with+email","CN=Cert with email,O=DIGIT,C=BE:000000005c1bb358"}, - }; + {"cert-smime.pem", "CN=edelivery_sml,OU=PEPPOL TEST SMP,O=European Commission,C=BE", "C=BE,O=OpenPEPPOL AISBL,OU=FOR TEST ONLY,CN=PEPPOL SERVICE METADATA PUBLISHER TEST CA - G2","3cfe6b37e4702512c01e71f9b9175464","sno=3cfe6b37e4702512c01e71f9b9175464&subject=CN%3Dedelivery_sml%2COU%3DPEPPOL+TEST+SMP%2CO%3DEuropean+Commission%2CC%3DBE&validfrom=Sep+21+02%3A00%3A00+2018+GMT&validto=Sep+11+01%3A59%3A59+2020+GMT&issuer=C%3DBE%2CO%3DOpenPEPPOL+AISBL%2COU%3DFOR+TEST+ONLY%2CCN%3DPEPPOL+SERVICE+METADATA+PUBLISHER+TEST+CA+-+G2","CN=edelivery_sml,O=European Commission,C=BE:3cfe6b37e4702512c01e71f9b9175464"}, + + }; } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java index dc1f5575bff1fed5d4fd3fd37fdd0077089df783..a6b39a2c496f5a34cd6e7dd05b97ea977b5d635a 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java @@ -337,6 +337,24 @@ public class UIUserServiceIntegrationTest extends AbstractServiceIntegrationTest assertTrue(cer.getValidFrom().before(cer.getValidTo())); } + @Test + public void testGetCertificateDataSMime() throws IOException, CertificateException { + // given + byte[] buff = IOUtils.toByteArray(UIUserServiceIntegrationTest.class.getResourceAsStream("/certificates/cert-smime.pem")); + + // when + CertificateRO cer = testInstance.getCertificateData(buff); + + //then + assertEquals("CN=edelivery_sml,O=European Commission,C=BE:3cfe6b37e4702512c01e71f9b9175464", cer.getCertificateId()); + assertEquals("C=BE,O=OpenPEPPOL AISBL,OU=FOR TEST ONLY,CN=PEPPOL SERVICE METADATA PUBLISHER TEST CA - G2", cer.getIssuer()); + assertEquals("CN=edelivery_sml,OU=PEPPOL TEST SMP,O=European Commission,C=BE", cer.getSubject()); + assertEquals("3cfe6b37e4702512c01e71f9b9175464", cer.getSerialNumber()); + assertNotNull(cer.getValidFrom()); + assertNotNull(cer.getValidTo()); + assertTrue(cer.getValidFrom().before(cer.getValidTo())); + } + @Test public void testGetCertificateDataDER() throws IOException, CertificateException { // given