Skip to content

Commit 4c874c4

Browse files
authored
Merge branch 'master' into fix/bump-google-cloud-storage
2 parents 7ff6f62 + e7c0fa8 commit 4c874c4

File tree

8 files changed

+110
-51
lines changed

8 files changed

+110
-51
lines changed

gxcloudstorage-awss3-v2/src/main/java/com/genexus/db/driver/ExternalProviderS3V2.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private void initialize() throws Exception {
119119
this.folder = folder;
120120

121121
this.client = buildS3Client(accessKey, secretKey, endpointValue, clientRegion);
122-
this.presigner = buildS3Presinger(accessKey, secretKey, clientRegion);
122+
this.presigner = buildS3Presigner(accessKey, secretKey, clientRegion);
123123
bucketExists();
124124
}
125125
}
@@ -129,21 +129,20 @@ private S3Client buildS3Client(String accessKey, String secretKey, String endpoi
129129

130130
boolean bUseIAM = !getPropertyValue(USE_IAM, "", "").isEmpty() || (accessKey.equals("") && secretKey.equals(""));
131131

132-
S3ClientBuilder builder = bUseIAM ?
133-
S3Client.builder() :
134-
S3Client.builder().credentialsProvider(
135-
StaticCredentialsProvider.create(
136-
AwsBasicCredentials.create(accessKey, secretKey)
137-
)
138-
);
132+
S3ClientBuilder builder = bUseIAM
133+
? S3Client.builder().credentialsProvider(DefaultCredentialsProvider.create())
134+
: S3Client.builder().credentialsProvider(
135+
StaticCredentialsProvider.create(
136+
AwsBasicCredentials.create(accessKey, secretKey)
137+
)
138+
);
139139

140140
if (bUseIAM) {
141141
logger.debug("Using IAM Credentials");
142142
}
143143

144144
if (!endpoint.isEmpty() && !endpoint.contains(".amazonaws.com")) {
145145
pathStyleUrls = true;
146-
147146
s3Client = builder
148147
.endpointOverride(URI.create(endpoint))
149148
.region(Region.of(region))
@@ -179,11 +178,22 @@ private S3Client buildS3Client(String accessKey, String secretKey, String endpoi
179178
return s3Client;
180179
}
181180

182-
private S3Presigner buildS3Presinger(String accessKey, String secretKey, String region) {
183-
return S3Presigner.builder()
181+
private S3Presigner buildS3Presigner(String accessKey, String secretKey, String region) {
182+
boolean bUseIAM = !getPropertyValue(USE_IAM, "", "").isEmpty() || (accessKey.equals("") && secretKey.equals(""));
183+
184+
S3Presigner.Builder builder = S3Presigner.builder()
184185
.region(Region.of(region))
185-
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey)))
186-
.build();
186+
.credentialsProvider(
187+
bUseIAM
188+
? DefaultCredentialsProvider.create()
189+
: StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey))
190+
);
191+
192+
if (bUseIAM) {
193+
logger.debug("Using IAM Credentials for presigner");
194+
}
195+
196+
return builder.build();
187197
}
188198

189199
private void bucketExists() {

gxspringboot/src/main/java/com/genexus/springboot/GXConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) {
4646
registry.addResourceHandler(webImageDir + "**")
4747
.addResourceLocations("classpath:" + webImageDir);
4848

49+
registry.addResourceHandler("/_ng/**")
50+
.addResourceLocations("classpath:/ng/");
51+
4952
registry.addResourceHandler("/" + blobPath + "/**")
5053
.addResourceLocations("file:./" + blobPath + "/");
5154
}
@@ -71,6 +74,7 @@ public FilterRegistrationBean<UrlRewriteFilter> urlRewriteFilter() {
7174
if (new ClassPathResource(REWRITE_FILE).exists()) {
7275
registrationBean.addInitParameter("modRewriteConf", "true");
7376
registrationBean.addInitParameter("confPath", REWRITE_FILE);
77+
registrationBean.setOrder(org.springframework.core.Ordered.HIGHEST_PRECEDENCE);
7478
}
7579
else {
7680
registrationBean.setEnabled(false);

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<software.azure.cosmos.version>4.42.0</software.azure.cosmos.version>
2929
<log4j.version>2.21.1</log4j.version>
3030
<io.opentelemetry.version>1.28.0</io.opentelemetry.version>
31-
<org.bouncycastle.version>1.78.1</org.bouncycastle.version>
31+
<org.bouncycastle.version>1.82</org.bouncycastle.version>
3232
<commons-io.version>2.15.1</commons-io.version>
3333
<commons-codec.version>1.15</commons-codec.version>
3434
<xmlsec.version>3.0.3</xmlsec.version>

wrappercommon/pom.xml

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,28 @@
2929
<artifactId>log4j-core</artifactId>
3030
<version>${log4j.version}</version>
3131
</dependency>
32-
<dependency>
33-
<groupId>org.apache.ws.security</groupId>
34-
<artifactId>wss4j</artifactId>
35-
<version>1.6.19</version>
36-
</dependency>
32+
<dependency>
33+
<groupId>org.apache.wss4j</groupId>
34+
<artifactId>wss4j-ws-security-common</artifactId>
35+
<version>2.4.3</version>
36+
<exclusions>
37+
<exclusion>
38+
<groupId>org.apache.geronimo.javamail</groupId>
39+
<artifactId>geronimo-javamail_1.4_mail</artifactId>
40+
</exclusion>
41+
</exclusions>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.apache.wss4j</groupId>
45+
<artifactId>wss4j-ws-security-dom</artifactId>
46+
<version>2.4.3</version>
47+
<exclusions>
48+
<exclusion>
49+
<groupId>org.apache.geronimo.javamail</groupId>
50+
<artifactId>geronimo-javamail_1.4_mail</artifactId>
51+
</exclusion>
52+
</exclusions>
53+
</dependency>
3754
<dependency>
3855
<groupId>org.apache.logging.log4j</groupId>
3956
<artifactId>log4j-layout-template-json</artifactId>

wrapperjakarta/src/main/java/com/genexus/ws/GXHandlerConsumerChain.java

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.util.Set;
44
import java.util.HashSet;
55
import java.util.Properties;
6+
import javax.crypto.KeyGenerator;
7+
import javax.crypto.SecretKey;
68
import javax.xml.namespace.QName;
79
import javax.xml.transform.*;
810
import javax.xml.transform.dom.DOMResult;
@@ -12,12 +14,14 @@
1214
import jakarta.xml.ws.handler.soap.SOAPMessageContext;
1315
import jakarta.xml.soap.*;
1416
import javax.xml.parsers.DocumentBuilderFactory;
15-
import org.apache.ws.security.components.crypto.Crypto;
16-
import org.apache.ws.security.components.crypto.CryptoFactory;
17-
import org.apache.ws.security.message.WSSecEncrypt;
18-
import org.apache.ws.security.message.WSSecHeader;
19-
import org.apache.ws.security.message.WSSecSignature;
20-
import org.apache.ws.security.message.WSSecTimestamp;
17+
18+
import org.apache.wss4j.common.crypto.Crypto;
19+
import org.apache.wss4j.common.crypto.CryptoFactory;
20+
import org.apache.wss4j.dom.message.WSSecEncrypt;
21+
import org.apache.wss4j.dom.message.WSSecHeader;
22+
import org.apache.wss4j.dom.message.WSSecSignature;
23+
import org.apache.wss4j.dom.message.WSSecTimestamp;
24+
2125
import org.w3c.dom.*;
2226
import java.io.InputStream;
2327
import java.io.ByteArrayInputStream;
@@ -26,6 +30,8 @@
2630
import com.genexus.diagnostics.core.LogManager;
2731
import com.genexus.common.interfaces.*;
2832

33+
import static org.apache.wss4j.common.util.KeyUtils.getKeyGenerator;
34+
2935
public class GXHandlerConsumerChain implements SOAPHandler<SOAPMessageContext>
3036
{
3137
public static final ILogger logger = LogManager.getLogger(GXHandlerConsumerChain.class);
@@ -156,8 +162,8 @@ public boolean handleMessage(SOAPMessageContext messageContext)
156162
Document doc = messageToDocument(messageContext.getMessage());
157163

158164
//Security header
159-
WSSecHeader secHeader = new WSSecHeader();
160-
secHeader.insertSecurityHeader(doc);
165+
WSSecHeader secHeader = new WSSecHeader(doc);
166+
secHeader.insertSecurityHeader();
161167
Document signedDoc = null;
162168

163169
//Signature
@@ -168,7 +174,7 @@ public boolean handleMessage(SOAPMessageContext messageContext)
168174
signatureProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", wsSignature.getKeystore().getPassword());
169175
signatureProperties.put("org.apache.ws.security.crypto.merlin.file", wsSignature.getKeystore().getSource());
170176
Crypto signatureCrypto = CryptoFactory.getInstance(signatureProperties);
171-
WSSecSignature sign = new WSSecSignature();
177+
WSSecSignature sign = new WSSecSignature(doc);
172178
sign.setKeyIdentifierType(wsSignature.getKeyIdentifierType());
173179
sign.setUserInfo(wsSignature.getAlias(), wsSignature.getKeystore().getPassword());
174180
if (wsSignature.getCanonicalizationalgorithm() != null)
@@ -177,13 +183,13 @@ public boolean handleMessage(SOAPMessageContext messageContext)
177183
sign.setDigestAlgo(wsSignature.getDigest());
178184
if (wsSignature.getSignaturealgorithm() != null)
179185
sign.setSignatureAlgorithm(wsSignature.getSignaturealgorithm());
180-
signedDoc = sign.build(doc, signatureCrypto, secHeader);
186+
signedDoc = sign.build( signatureCrypto);
181187

182188
if (expirationTimeout > 0)
183189
{
184-
WSSecTimestamp timestamp = new WSSecTimestamp();
190+
WSSecTimestamp timestamp = new WSSecTimestamp(secHeader);
185191
timestamp.setTimeToLive(expirationTimeout);
186-
signedDoc = timestamp.build(signedDoc, secHeader);
192+
signedDoc = timestamp.build();
187193
}
188194
}
189195

@@ -195,14 +201,19 @@ public boolean handleMessage(SOAPMessageContext messageContext)
195201
encryptionProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", wsEncryption.getKeystore().getPassword());
196202
encryptionProperties.put("org.apache.ws.security.crypto.merlin.file", wsEncryption.getKeystore().getSource());
197203
Crypto encryptionCrypto = CryptoFactory.getInstance(encryptionProperties);
198-
WSSecEncrypt builder = new WSSecEncrypt();
199-
builder.setUserInfo(wsEncryption.getAlias(), wsEncryption.getKeystore().getPassword());
200-
builder.setKeyIdentifierType(wsEncryption.getKeyIdentifierType());
201204
if (signedDoc == null)
202205
{
203206
signedDoc = doc;
204207
}
205-
builder.build(signedDoc, encryptionCrypto, secHeader);
208+
WSSecEncrypt builder = new WSSecEncrypt(signedDoc);
209+
builder.setUserInfo(wsEncryption.getAlias(), wsEncryption.getKeystore().getPassword());
210+
builder.setKeyIdentifierType(wsEncryption.getKeyIdentifierType());
211+
//using wss4j default encryption algorithm AES128-CBC
212+
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
213+
keyGenerator.init(128);
214+
SecretKey key = keyGenerator.generateKey();
215+
216+
builder.build(encryptionCrypto, key);
206217
}
207218

208219
Document securityDoc = doc;

wrapperjakarta/src/main/java/com/genexus/ws/rs/core/Response.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public static Response.ResponseBuilder unauthorized() {
3636
return new Response.ResponseBuilder(jakarta.ws.rs.core.Response.status(Status.UNAUTHORIZED));
3737
}
3838

39+
public static Response.ResponseBuilder badrequest() {
40+
return new Response.ResponseBuilder(jakarta.ws.rs.core.Response.status(Status.BAD_REQUEST));
41+
}
42+
3943
public static Response.ResponseBuilder noContentWrapped() {
4044
return new Response.ResponseBuilder(jakarta.ws.rs.core.Response.noContent());
4145
}

wrapperjavax/src/main/java/com/genexus/ws/GXHandlerConsumerChain.java

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.util.Set;
44
import java.util.HashSet;
55
import java.util.Properties;
6+
import javax.crypto.KeyGenerator;
7+
import javax.crypto.SecretKey;
68
import javax.xml.namespace.QName;
79
import javax.xml.transform.*;
810
import javax.xml.transform.dom.DOMResult;
@@ -12,12 +14,14 @@
1214
import javax.xml.ws.handler.soap.SOAPMessageContext;
1315
import javax.xml.soap.*;
1416
import javax.xml.parsers.DocumentBuilderFactory;
15-
import org.apache.ws.security.components.crypto.Crypto;
16-
import org.apache.ws.security.components.crypto.CryptoFactory;
17-
import org.apache.ws.security.message.WSSecEncrypt;
18-
import org.apache.ws.security.message.WSSecHeader;
19-
import org.apache.ws.security.message.WSSecSignature;
20-
import org.apache.ws.security.message.WSSecTimestamp;
17+
18+
import org.apache.wss4j.common.crypto.Crypto;
19+
import org.apache.wss4j.common.crypto.CryptoFactory;
20+
import org.apache.wss4j.dom.message.WSSecEncrypt;
21+
import org.apache.wss4j.dom.message.WSSecHeader;
22+
import org.apache.wss4j.dom.message.WSSecSignature;
23+
import org.apache.wss4j.dom.message.WSSecTimestamp;
24+
2125
import org.w3c.dom.*;
2226
import java.io.InputStream;
2327
import java.io.ByteArrayInputStream;
@@ -156,8 +160,8 @@ public boolean handleMessage(SOAPMessageContext messageContext)
156160
Document doc = messageToDocument(messageContext.getMessage());
157161

158162
//Security header
159-
WSSecHeader secHeader = new WSSecHeader();
160-
secHeader.insertSecurityHeader(doc);
163+
WSSecHeader secHeader = new WSSecHeader(doc);
164+
secHeader.insertSecurityHeader();
161165
Document signedDoc = null;
162166

163167
//Signature
@@ -168,7 +172,7 @@ public boolean handleMessage(SOAPMessageContext messageContext)
168172
signatureProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", wsSignature.getKeystore().getPassword());
169173
signatureProperties.put("org.apache.ws.security.crypto.merlin.file", wsSignature.getKeystore().getSource());
170174
Crypto signatureCrypto = CryptoFactory.getInstance(signatureProperties);
171-
WSSecSignature sign = new WSSecSignature();
175+
WSSecSignature sign = new WSSecSignature(doc);
172176
sign.setKeyIdentifierType(wsSignature.getKeyIdentifierType());
173177
sign.setUserInfo(wsSignature.getAlias(), wsSignature.getKeystore().getPassword());
174178
if (wsSignature.getCanonicalizationalgorithm() != null)
@@ -177,13 +181,13 @@ public boolean handleMessage(SOAPMessageContext messageContext)
177181
sign.setDigestAlgo(wsSignature.getDigest());
178182
if (wsSignature.getSignaturealgorithm() != null)
179183
sign.setSignatureAlgorithm(wsSignature.getSignaturealgorithm());
180-
signedDoc = sign.build(doc, signatureCrypto, secHeader);
184+
signedDoc = sign.build( signatureCrypto);
181185

182186
if (expirationTimeout > 0)
183187
{
184-
WSSecTimestamp timestamp = new WSSecTimestamp();
188+
WSSecTimestamp timestamp = new WSSecTimestamp(secHeader);
185189
timestamp.setTimeToLive(expirationTimeout);
186-
signedDoc = timestamp.build(signedDoc, secHeader);
190+
signedDoc = timestamp.build();
187191
}
188192
}
189193

@@ -195,14 +199,19 @@ public boolean handleMessage(SOAPMessageContext messageContext)
195199
encryptionProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", wsEncryption.getKeystore().getPassword());
196200
encryptionProperties.put("org.apache.ws.security.crypto.merlin.file", wsEncryption.getKeystore().getSource());
197201
Crypto encryptionCrypto = CryptoFactory.getInstance(encryptionProperties);
198-
WSSecEncrypt builder = new WSSecEncrypt();
199-
builder.setUserInfo(wsEncryption.getAlias(), wsEncryption.getKeystore().getPassword());
200-
builder.setKeyIdentifierType(wsEncryption.getKeyIdentifierType());
201202
if (signedDoc == null)
202203
{
203204
signedDoc = doc;
204205
}
205-
builder.build(signedDoc, encryptionCrypto, secHeader);
206+
WSSecEncrypt builder = new WSSecEncrypt(signedDoc);
207+
builder.setUserInfo(wsEncryption.getAlias(), wsEncryption.getKeystore().getPassword());
208+
builder.setKeyIdentifierType(wsEncryption.getKeyIdentifierType());
209+
//using wss4j default encryption algorithm AES128-CBC
210+
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
211+
keyGenerator.init(128);
212+
SecretKey key = keyGenerator.generateKey();
213+
214+
builder.build(encryptionCrypto, key);
206215
}
207216

208217
Document securityDoc = doc;

wrapperjavax/src/main/java/com/genexus/ws/rs/core/Response.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public static Response.ResponseBuilder unauthorized() {
3636
return new Response.ResponseBuilder(javax.ws.rs.core.Response.status(Status.UNAUTHORIZED));
3737
}
3838

39+
public static Response.ResponseBuilder badrequest() {
40+
return new Response.ResponseBuilder(javax.ws.rs.core.Response.status(Status.BAD_REQUEST));
41+
}
42+
3943
public static Response.ResponseBuilder noContentWrapped() {
4044
return new Response.ResponseBuilder(javax.ws.rs.core.Response.noContent());
4145
}

0 commit comments

Comments
 (0)