Skip to content

Commit 87e5c1a

Browse files
authored
Merge pull request #34 from SafeExamBrowser/SEBSP-181
Sebsp 181
2 parents b253462 + 9b3acc9 commit 87e5c1a

File tree

2 files changed

+64
-14
lines changed

2 files changed

+64
-14
lines changed

src/main/java/ch/ethz/seb/sps/server/datalayer/dao/impl/S3DAO.java

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.minio.messages.LifecycleRule;
2323
import io.minio.messages.RuleFilter;
2424
import io.minio.messages.Status;
25+
import okhttp3.OkHttpClient;
2526
import org.slf4j.Logger;
2627
import org.slf4j.LoggerFactory;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
@@ -30,8 +31,14 @@
3031
import org.springframework.core.env.Environment;
3132
import org.springframework.stereotype.Service;
3233

34+
import javax.net.ssl.SSLContext;
35+
import javax.net.ssl.TrustManagerFactory;
36+
import javax.net.ssl.X509TrustManager;
3337
import java.io.ByteArrayInputStream;
3438
import java.io.InputStream;
39+
import java.security.KeyStore;
40+
import java.security.cert.CertificateFactory;
41+
import java.security.cert.X509Certificate;
3542
import java.time.ZonedDateTime;
3643
import java.util.LinkedList;
3744
import java.util.List;
@@ -60,24 +67,17 @@ public S3DAO(final Environment environment) {
6067
public void init() throws Exception {
6168

6269
BUCKET_NAME = this.environment.getProperty("sps.s3.bucketName", "sps.s3.defaultBucketName");
70+
this.minioClient = createMinioClient();
6371

64-
this.minioClient =
65-
MinioClient.builder()
66-
.endpoint(this.environment.getRequiredProperty("sps.s3.endpointUrl"))
67-
.credentials(
68-
this.environment.getRequiredProperty("sps.s3.accessKey"),
69-
this.environment.getRequiredProperty("sps.s3.secretKey")
70-
)
71-
.build();
72+
printAllBucketsInService();
7273

7374
if(!isBucketExisting()){
7475
createBucket();
75-
setBucketLifecycle();
76+
// setBucketLifecycle();
7677
// getBucketLifecycle();
7778
}
7879
}
7980

80-
8181
public Result<InputStream> getItem(final String sessionUUID, final Long pk) {
8282
return Result.tryCatch(() ->
8383
this.minioClient.getObject(
@@ -209,4 +209,51 @@ private void getBucketLifecycle(){
209209
log.error("");
210210
}
211211
}
212+
213+
private MinioClient createMinioClient() throws Exception {
214+
if(this.environment.getProperty("sps.s3.tls.cert") == null){
215+
return MinioClient.builder()
216+
.endpoint(this.environment.getRequiredProperty("sps.s3.endpointUrl"))
217+
.credentials(
218+
this.environment.getRequiredProperty("sps.s3.accessKey"),
219+
this.environment.getRequiredProperty("sps.s3.secretKey")
220+
)
221+
.build();
222+
}
223+
224+
return MinioClient.builder()
225+
.endpoint(this.environment.getRequiredProperty("sps.s3.endpointUrl"))
226+
.credentials(
227+
this.environment.getRequiredProperty("sps.s3.accessKey"),
228+
this.environment.getRequiredProperty("sps.s3.secretKey")
229+
)
230+
.httpClient(createOkHttpClientWithCert())
231+
.build();
232+
}
233+
234+
private OkHttpClient createOkHttpClientWithCert() throws Exception {
235+
String pemCert = this.environment.getRequiredProperty("sps.s3.tls.cert");
236+
237+
// Convert PEM string to X509Certificate
238+
CertificateFactory cf = CertificateFactory.getInstance("X.509");
239+
X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(pemCert.getBytes()));
240+
241+
// Create a KeyStore and load the certificate
242+
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
243+
keyStore.load(null, null);
244+
keyStore.setCertificateEntry("custom-cert", cert);
245+
246+
// Initialize TrustManager with the KeyStore
247+
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
248+
tmf.init(keyStore);
249+
250+
// Set up SSLContext using the TrustManager
251+
SSLContext sslContext = SSLContext.getInstance("TLS");
252+
sslContext.init(null, tmf.getTrustManagers(), new java.security.SecureRandom());
253+
254+
// Return the OkHttpClient with SSLContext configured
255+
return new OkHttpClient.Builder()
256+
.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) tmf.getTrustManagers()[0])
257+
.build();
258+
}
212259
}

src/main/resources/config/application.properties

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,15 @@ sps.webservice.internalSecret=${sebserver.password}
5959

6060
### s3 service
6161

62-
sps.s3.endpointUrl=http://shelbyville:9000
62+
sps.s3.endpointUrl=${s3.endpointUrl}
6363
sps.s3.accessKey=${s3.accessKey}
6464
sps.s3.secretKey=${s3.secretKey}
6565
sps.s3.bucketName=sebserver-dev
6666
sps.s3.defaultBucketName=proctoring-bucket
67-
sps.s3.store.batch=true
67+
sps.s3.store.batch=false
68+
sps.s3.tls.cert=
69+
70+
6871

6972

7073
sps.init.adminaccount.generate=true
@@ -87,8 +90,8 @@ sps.gui.redirect.url=${sps.webservice.http.external.scheme}://${sps.webservice.h
8790
# FULL_RDBMS: all data, meta plus screenshots, go to database
8891
# FILESYS_RDBMS: screenshots go to file-system and meta data go to database as usual
8992

90-
sps.data.store.adapter=FULL_RDBMS
91-
#sps.data.store.adapter=S3_RDBMS
93+
#sps.data.store.adapter=FULL_RDBMS
94+
sps.data.store.adapter=S3_RDBMS
9295
sps.data.store.file.dir=/screenshots/
9396
sps.data.store.batch.interval=1000
9497

0 commit comments

Comments
 (0)