Skip to content

Commit e6031d8

Browse files
authored
Port DLM permissions test to internal REST test style (#96434)
Porting the DLM permissions REST test to the new style of cluster tests. This has the usual nice perks, and also allows us to remove the separate `qa/with-security` package. No functional or test logic changes. I didn't suggest this as part of the PR review for #95512 so as not to block that PR further, and also because I wasn't sure about the overhead of making this change (it did end up taking some battling with gradle).
1 parent 856a244 commit e6031d8

File tree

11 files changed

+221
-33
lines changed

11 files changed

+221
-33
lines changed

modules/dlm/build.gradle

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import org.elasticsearch.gradle.internal.info.BuildParams
33

44
apply plugin: 'elasticsearch.internal-es-plugin'
55
apply plugin: 'elasticsearch.internal-cluster-test'
6+
apply plugin: 'elasticsearch.internal-java-rest-test'
67
apply plugin: 'elasticsearch.legacy-yaml-rest-test'
78
apply plugin: 'elasticsearch.legacy-yaml-rest-compat-test'
89

@@ -23,8 +24,6 @@ dependencies {
2324
testImplementation project(':modules:data-streams')
2425
}
2526

26-
addQaCheckDependencies(project)
27-
2827
testClusters.configureEach {
2928
module ':modules:reindex'
3029
testDistribution = 'DEFAULT'
@@ -37,6 +36,10 @@ testClusters.configureEach {
3736
requiresFeature 'es.dlm_feature_flag_enabled', Version.fromString("8.8.0")
3837
}
3938

39+
tasks.named('javaRestTest') {
40+
usesDefaultDistribution()
41+
}
42+
4043
if (BuildParams.isSnapshotBuild() == false) {
4144
tasks.named("test").configure {
4245
systemProperty 'es.dlm_feature_flag_enabled', 'true'
@@ -47,4 +50,7 @@ if (BuildParams.isSnapshotBuild() == false) {
4750
tasks.named("yamlRestTest").configure {
4851
systemProperty 'es.dlm_feature_flag_enabled', 'true'
4952
}
53+
tasks.named("javaRestTest").configure {
54+
systemProperty 'es.dlm_feature_flag_enabled', 'true'
55+
}
5056
}

modules/dlm/qa/build.gradle

Whitespace-only changes.

modules/dlm/qa/with-security/build.gradle

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 74 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,98 @@
1717
import org.elasticsearch.common.settings.SecureString;
1818
import org.elasticsearch.common.settings.Settings;
1919
import org.elasticsearch.common.util.concurrent.ThreadContext;
20+
import org.elasticsearch.core.PathUtils;
2021
import org.elasticsearch.rest.RestStatus;
22+
import org.elasticsearch.test.cluster.ElasticsearchCluster;
23+
import org.elasticsearch.test.cluster.FeatureFlag;
24+
import org.elasticsearch.test.cluster.local.distribution.DistributionType;
25+
import org.elasticsearch.test.cluster.util.resource.Resource;
2126
import org.elasticsearch.test.rest.ESRestTestCase;
2227
import org.elasticsearch.test.rest.ObjectPath;
28+
import org.junit.BeforeClass;
29+
import org.junit.ClassRule;
2330

31+
import java.io.FileNotFoundException;
2432
import java.io.IOException;
33+
import java.net.URISyntaxException;
34+
import java.net.URL;
35+
import java.nio.file.Path;
2536
import java.util.List;
2637
import java.util.Map;
2738

2839
import static org.hamcrest.Matchers.equalTo;
2940

30-
public class PermissionsIT extends ESRestTestCase {
41+
public class DlmPermissionsRestIT extends ESRestTestCase {
42+
43+
private static final String PASSWORD = "secret-test-password";
44+
private static Path caPath;
45+
46+
@BeforeClass
47+
public static void init() throws URISyntaxException, FileNotFoundException {
48+
URL resource = DlmPermissionsRestIT.class.getResource("/ssl/ca.crt");
49+
if (resource == null) {
50+
throw new FileNotFoundException("Cannot find classpath resource /ssl/ca.crt");
51+
}
52+
caPath = PathUtils.get(resource.toURI());
53+
}
54+
55+
@ClassRule
56+
public static ElasticsearchCluster cluster = ElasticsearchCluster.local()
57+
.feature(FeatureFlag.DLM_ENABLED)
58+
.distribution(DistributionType.DEFAULT)
59+
.setting("xpack.watcher.enabled", "false")
60+
.setting("xpack.ml.enabled", "false")
61+
.setting("xpack.security.enabled", "true")
62+
.setting("xpack.license.self_generated.type", "trial")
63+
.setting("xpack.security.http.ssl.enabled", "true")
64+
.setting("xpack.security.http.ssl.certificate", "node.crt")
65+
.setting("xpack.security.http.ssl.key", "node.key")
66+
.setting("xpack.security.http.ssl.certificate_authorities", "ca.crt")
67+
.setting("xpack.security.transport.ssl.enabled", "true")
68+
.setting("xpack.security.transport.ssl.certificate", "node.crt")
69+
.setting("xpack.security.transport.ssl.key", "node.key")
70+
.setting("xpack.security.transport.ssl.certificate_authorities", "ca.crt")
71+
.setting("xpack.security.transport.ssl.verification_mode", "certificate")
72+
.keystore("xpack.security.transport.ssl.secure_key_passphrase", "node-password")
73+
.keystore("xpack.security.http.ssl.secure_key_passphrase", "node-password")
74+
.keystore("bootstrap.password", PASSWORD)
75+
.configFile("node.key", Resource.fromClasspath("ssl/node.key"))
76+
.configFile("node.crt", Resource.fromClasspath("ssl/node.crt"))
77+
.configFile("ca.crt", Resource.fromClasspath("ssl/ca.crt"))
78+
.user("test_admin", PASSWORD, "superuser")
79+
.user("test_dlm", PASSWORD, "manage_dlm")
80+
.user("test_non_privileged", PASSWORD, "not_privileged")
81+
.rolesFile(Resource.fromClasspath("roles.yml"))
82+
.build();
83+
84+
@Override
85+
protected String getTestRestCluster() {
86+
return cluster.getHttpAddresses();
87+
}
3188

3289
@Override
3390
protected Settings restClientSettings() {
34-
// Note: This user is defined in build.gradle, and assigned the role "manage_dlm". That role is defined in roles.yml.
35-
String token = basicAuthHeaderValue("test_dlm", new SecureString("x-pack-test-password".toCharArray()));
36-
return Settings.builder().put(ThreadContext.PREFIX + ".Authorization", token).build();
91+
// Note: This user is assigned the role "manage_dlm". That role is defined in roles.yml.
92+
String token = basicAuthHeaderValue("test_dlm", new SecureString(PASSWORD.toCharArray()));
93+
return Settings.builder().put(ThreadContext.PREFIX + ".Authorization", token).put(CERTIFICATE_AUTHORITIES, caPath).build();
3794
}
3895

3996
@Override
4097
protected Settings restAdminSettings() {
41-
String token = basicAuthHeaderValue("test_admin", new SecureString("x-pack-test-password".toCharArray()));
42-
return Settings.builder().put(ThreadContext.PREFIX + ".Authorization", token).build();
98+
String token = basicAuthHeaderValue("test_admin", new SecureString(PASSWORD.toCharArray()));
99+
return Settings.builder().put(ThreadContext.PREFIX + ".Authorization", token).put(CERTIFICATE_AUTHORITIES, caPath).build();
43100
}
44101

45102
private Settings restUnprivilegedClientSettings() {
46-
// Note: This user is defined in build.gradle, and assigned the role "not_privileged". That role is defined in roles.yml.
47-
String token = basicAuthHeaderValue("test_non_privileged", new SecureString("x-pack-test-password".toCharArray()));
48-
return Settings.builder().put(ThreadContext.PREFIX + ".Authorization", token).build();
103+
// Note: This user is assigned the role "not_privileged". That role is defined in roles.yml.
104+
String token = basicAuthHeaderValue("test_non_privileged", new SecureString(PASSWORD.toCharArray()));
105+
return Settings.builder().put(ThreadContext.PREFIX + ".Authorization", token).put(CERTIFICATE_AUTHORITIES, caPath).build();
106+
}
107+
108+
@Override
109+
protected String getProtocol() {
110+
// Because http.ssl.enabled = true
111+
return "https";
49112
}
50113

51114
@SuppressWarnings("unchecked")
@@ -58,8 +121,8 @@ public void testManageDLM() throws Exception {
58121
*/
59122
String dataStreamName = "dlm-test"; // Needs to match the pattern of the names in roles.yml
60123
createDataStreamAsAdmin(dataStreamName);
61-
Response getDatastreamRepsonse = adminClient().performRequest(new Request("GET", "/_data_stream/" + dataStreamName));
62-
final List<Map<String, Object>> nodes = ObjectPath.createFromResponse(getDatastreamRepsonse).evaluate("data_streams");
124+
Response getDataStreamResponse = adminClient().performRequest(new Request("GET", "/_data_stream/" + dataStreamName));
125+
final List<Map<String, Object>> nodes = ObjectPath.createFromResponse(getDataStreamResponse).evaluate("data_streams");
63126
String index = (String) ((List<Map<String, Object>>) nodes.get(0).get("indices")).get(0).get("index_name");
64127

65128
Request explainLifecycleRequest = new Request("GET", "/" + randomFrom("_all", "*", index) + "/_lifecycle/explain");
@@ -161,5 +224,4 @@ private void createDataStreamAsAdmin(String name) throws IOException {
161224
Request request = new Request("PUT", "/_data_stream/" + name);
162225
assertOK(adminClient().performRequest(request));
163226
}
164-
165227
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
= Keystore Details
2+
This document details the steps used to create the certificate and keystore files in this directory.
3+
4+
== Instructions on generating certificates
5+
6+
The certificates in this directory have been generated using elasticsearch-certutil (8.0.0 SNAPSHOT)
7+
8+
=== Certificates for security the HTTP server
9+
[source,shell]
10+
-----------------------------------------------------------------------------------------------------------
11+
elasticsearch-certutil ca --pem --out=${PWD}/ca.zip --pass="ca-password" --days=3500
12+
unzip ca.zip
13+
mv ca/ca.crt ./ca.crt
14+
mv ca/ca.key ./ca.key
15+
16+
rm ca.zip
17+
rmdir ca
18+
-----------------------------------------------------------------------------------------------------------
19+
20+
[source,shell]
21+
-----------------------------------------------------------------------------------------------------------
22+
elasticsearch-certutil cert --pem --name=node --out=${PWD}/node.zip --pass="node-password" --days=3500 \
23+
--ca-cert=${PWD}/ca.crt --ca-key=${PWD}/ca.key --ca-pass="ca-password" \
24+
--dns=localhost --dns=localhost.localdomain --dns=localhost4 --dns=localhost4.localdomain4 --dns=localhost6 --dns=localhost6.localdomain6 \
25+
--ip=127.0.0.1 --ip=0:0:0:0:0:0:0:1
26+
27+
unzip node.zip
28+
mv node/node.* ./
29+
30+
rm node.zip
31+
rmdir node
32+
-----------------------------------------------------------------------------------------------------------
33+
34+
[source,shell]
35+
-----------------------------------------------------------------------------------------------------------
36+
keytool -importcert -file ca.crt -keystore ca.p12 -storetype PKCS12 -storepass "password" -alias ca
37+
-----------------------------------------------------------------------------------------------------------
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDSTCCAjGgAwIBAgIUG4Vi/zqBSBJT7DgRTFDQwh4ShlQwDQYJKoZIhvcNAQEL
3+
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
4+
cmF0ZWQgQ0EwHhcNMjEwMzE4MDIyNjAyWhcNMzAxMDE3MDIyNjAyWjA0MTIwMAYD
5+
VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC
6+
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIfrBgvsv/i4v6bAtfZTCIBY
7+
+OdhW6d2aF5LSPClruryqmp2vNWhGTEkcqe6EcFe+JRc+E+CnW0nXWslWf6kLxOJ
8+
VR5kjuT7LZ1tGbm70joh5V1t79NXu+BC0B/ET6T/BDzjnrDlt+AsFmR+F348UftY
9+
Y04NZRy+gRh9SxS0Y4riDGj0pWWJkPBK314JXf8rJe1RiYGfNl5OgAljGrs7sHAn
10+
1AO2nEH8Ihad3V55dtMIMXHGQTWkIx+QK25cGpySB78CXR432BmRMieMHZ5z1ELL
11+
A658Kco22HDmbNk4o51r/2AXs1fxcPTVZwK3n5tvC2hABXuILE7ck9A3LyGRZGMC
12+
AwEAAaNTMFEwHQYDVR0OBBYEFNlY6G4x4gG5/lRF8fO6knZaOzzlMB8GA1UdIwQY
13+
MBaAFNlY6G4x4gG5/lRF8fO6knZaOzzlMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
14+
hvcNAQELBQADggEBAD4e1fOX00AT3bxXHyJd4tT6g40bxAmZhrtFDkoxX86Vp2bp
15+
h+XfUfr54ziVzIbVynYMJ759mdB4BN8oZNTbOpmz/hNbz5skd2wIdAw/oZqAsOiW
16+
l+OZLaaQYVfLesuBUJfxU7JvZeF0rB2F0ODc8BJz0Q6Mjbvj8fyCbSIQS01PjATN
17+
0zeFQYuwJaQgTLVTU9jQYIbNBgCUuVmOW6IDF6QULtbCuH1Wtyr3u2I2nWfpyDhF
18+
u7PY5Qh/O13rRy5o6NJofxaa3nU1PJalQzIA6ExA8ajol4ywiFtAyCVLYuJMKDt9
19+
HN0WWGAbhCPc/6i5KzNv6vW8EaWAOlAt2t1/7LU=
20+
-----END CERTIFICATE-----
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: AES-128-CBC,AD07A96A73827285800BF6F4C8C37988
4+
5+
9F4L3SRxQaSkcmW72PaiPDDPNUW9zdoWy2VvSaKUp7cWCupUpF3gqvIwdpr/sHj5
6+
Jh4gfWCzASy2yb+Q/OAbeq2Nl5P7p6klDjBtDFVlLXmIearRiXBUgi7i55lic2nB
7+
3zpUzBeXiqWxAiFTl1vhBB0DVexy0Ob7Hf3A7Zp669UQiMquplaGg+KtNVh2IxvJ
8+
vZmV+danHJpTqd4CnC93J4l/4tH3/ZYHPydqe1a7Bhe0BwMurOqtoosuzF0BQMam
9+
BcDVpyeRzg7C+ST1sZq+D/F1OpNvOOCE0hBjHg4NWdqyhiRLLwcbyEUutsyWo5zJ
10+
QCnBiznVzeEobwFdglCLoe+fVFWVNe2fddX541kfcHRXozDvNbRMrkPwqWHzLLBc
11+
bFn9PV3QSYoWE6Pee4/ibX4TYwe8yfxBBg5BpQQV+zjyBaXDQM6NNHMPxSE7YoD1
12+
TGAjQXwajse4uG0WRwOMgNHU9mzkMBLkv8s03PYmPXbnJkxd2jZSQoZ8FZrHQDXQ
13+
oiMh6zMRDCiQRVrz7NwYN9uS5dwnj7fQDex5uyegIw7He57LuFJ92s7fqYAoaOtO
14+
9QDRD5ky+q9+XN4T/3mOIaHTKNF5/kuN0eXH0vGVGWlNo2h+MBXGn+aA1p/97Cym
15+
tZzmyAqDiXg9DhNMdHJor7DOQa9CCp5YxYYO5rzMa5ElvKIcOEmYkf1MTLq0Al/t
16+
hYC5bL07aQ0sVhA+QW8kfxLkFT+u14rMlp6PJ9/KMLVBRoQWswwBMTBnocSwejkx
17+
lZaGWjzpptQ3VqgSBOtEDjamItSFiZeN2ntwOckauVSRJZDig/q5yLgIlwrqxtDH
18+
Sqh3u6JysIcBCcGg9U1q9AzxzFD8I4P8DwzUd56mbp3eR5iMvGsKcXbwlLvx/dSX
19+
HVs0S7bEUr5WavmSIGwwrHtRO/l3STJNC1W7YxVKhBCxgz46DqADXbHuMvt8ZB13
20+
Zs94eEDA0vmPQnOilIG200V4OP3Uz8UP9HcNrhkLGuyCe+RIvv6NOwtq/O9YmazR
21+
tmlcyrXEkvb5wubVg0zDlPpMBlYHGBEVl2vnVlNFHbsLkc55WahEbdpynnx3gYid
22+
o4a5I/ywqaMou6ZTtOXZXc+0WuqjsLFAKmytZJtnktScGwJ+3JPWR51pi9j9q9W7
23+
oTnsyO4/a0nSZTNSGI2hxrmss5Y75bN/ydFuMhwd/GEiupKG40ZF+9hcGrqZRddM
24+
uf0WoRvD5n611Bg8s9nwBMUjN7BFzu+a91s1W8LwwXUTZwkkyhkg/VUCKYbOH329
25+
Q6lZLb5nvvzEN/1HH/w0Bkl1jKBJSskw/R6zUGyviP1Sr3ZGkvUSvwXhrRHqI8MN
26+
83t5AzZ6hivzy7rzCI/UsKoUx2/ef63TcvgLb/Vf85anuRR08Xcv/XIl775UvibQ
27+
fAA0PE07sbYbO7vwRbv1bLhcPmA3wMsu0v/6Ohcv15uFFgUr/e9zhv5seP0tHdeR
28+
ZKSbqlwfGRgp0smXPWJzIGG3g+lkadrfwTBuzgdjI8V/C+nEMk1eYy8SJd/CmfdG
29+
IgZYMUWhc6GCcaq+eJ9VGVdgFkQU6aGTm4wNpmWPuDk/YDFo7ik48OrMvx67j1kz
30+
-----END RSA PRIVATE KEY-----
Binary file not shown.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDszCCApugAwIBAgIVAO2bFGZI6jJKeo1hea8Yc+RvY1J7MA0GCSqGSIb3DQEB
3+
CwUAMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlmaWNhdGUgVG9vbCBBdXRvZ2Vu
4+
ZXJhdGVkIENBMB4XDTIxMDMxODAyMjYzMloXDTMwMTAxNzAyMjYzMlowDzENMAsG
5+
A1UEAxMEbm9kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQ7uDRl
6+
d/wKlUkesl1jegzQcFw9po54Mt2O3UTOYBkFWg6amAIyA8Izkavkoh/kQZAR2gqa
7+
O65jqO/rNRrNBlyX2x+IOm0XmDC1ZmHoOBIxaCZUGVqwkeHNxcb5TmVFbYAcRGOJ
8+
b54v42SEarVoqJS9iQaGb7ScKTeQ7XWyPGImReVNwE7SJNWwuABTXMe9c6VtvZpY
9+
xu1SX+gYVk7aWQ0p3ukHKJXrPfXYXSgozF3tKtFQvUrL1VjHEVWqWoBqjIbhl3X8
10+
eqkzxwC1y+8Zbp3Os9Y8PzHQ4etXG7UAPFRopy5MivlDxZ2u5DpVW/6Yy1B7i6Mp
11+
9Leu2NPNZ7ul/iECAwEAAaOB4DCB3TAdBgNVHQ4EFgQUYVaPvntroOl+zfW5vDFg
12+
Kvmmj1MwHwYDVR0jBBgwFoAU2VjobjHiAbn+VEXx87qSdlo7POUwgY8GA1UdEQSB
13+
hzCBhIIJbG9jYWxob3N0ghdsb2NhbGhvc3Q2LmxvY2FsZG9tYWluNocEfwAAAYcQ
14+
AAAAAAAAAAAAAAAAAAAAAYIKbG9jYWxob3N0NIIKbG9jYWxob3N0NoIVbG9jYWxo
15+
b3N0LmxvY2FsZG9tYWlughdsb2NhbGhvc3Q0LmxvY2FsZG9tYWluNDAJBgNVHRME
16+
AjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAdP/Z/tDOWkM5Eob+6FwIJuM9Pe9+NOwUL
17+
+0qrHNHDt5ITyUf/C/l6yfXgbkvoLRa9QefN0cxy0ru8ew3nUUn7US0EfWF0yrza
18+
M8BwznKKh6cs4AiFUdDliBgyqAzYubcZ6G6Trm3Tdh334bAQKM7M1TOvZa8jwXXb
19+
6T1PUs/2RCWE7nLxBooDTik86phUm65oVtTqoO0c4XbQzzTfRrF7Oy3kmqpKsrzv
20+
UDB4G4TAfGyybdystyEqPPVX3KESV9PDcxpO01R2/BWi49E4YmdL4PitIA/v7iAk
21+
SH0UISQNjDpncRz9mGrt8LrA+O2Canqiq3xXeHJEhU5/KPCPcsrm
22+
-----END CERTIFICATE-----
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: AES-128-CBC,4A5CF28950363F663AA997154AC331F9
4+
5+
oHO/8oRnLXHTCljeqW90XBa/pDmLHUwRo82hy6732bSUTrXuBwUopuzcj6r8QzbQ
6+
1ZyCbja0wwWaQ5TuNX3ehseiaBUKWgCLYYjd2IfFsfyFmvVAcPqnltyKMRvpLkFj
7+
NeGyKFXmfxT3rmvzrmId4KkRYCHvH+j3RKfJ0wuhduzv9sH3xfmEe521l2F8Vukq
8+
zVNMRPT9FHlSYhM1h26WpBlzx6Wq7EfP7KdyUtmIZ5/RFJjELG5rUyLgZHDqfKCy
9+
LdNPpOuBdpYuBC+Oy97p2YuaFSLPkkKhiI4MG4MYsOnCmEFBNup9OhF3U/t/ffXh
10+
knTjXh2fX7h8RJ9pH/8czG+O6cZoe5O/1/Ympo+ghS7QYDUtDrNS5M4MI+eP+WiA
11+
X3cev3VkugDw4dDSPq3i3E0oCRZesMpst2W6AtVcpa5EWRM75PVuUws0XY/V/ca0
12+
CdUO6CPVIAAT3urmJWC1reiNhkEMDrskOL1PnsrseGvOmCLava9xYjiAS6JGawm/
13+
kWN3unJ6BwlU0NkIEbj8OGHdiKAjNWr0HLR34Xa2gqup5pGVD8EoC20ZPjeDXZ2j
14+
oEfuLo2ZaF5CWDt0CEcdN7v/JtXC9QJjf0BAMHKiULhPzv9rNfqj6xZKkNxgVrW/
15+
D2/Jpyn5qt6BDiyzG0jaO7AzIk3BTBksdf+5myc5/0NA+kdC9aKZKmeLAazCAK1G
16+
CwtfTs1xF4tMj1P+GRD4DOwypml1OK528BSl+Ydubt2uc37hRsA2EctEEjy+vy2r
17+
pR0akSVs2a4d00p26lWt5RP/h85KJdWwNj/YwRmRxWWMpNd/C4NrGgB5Ehs8CHFk
18+
uQZOaAKXWuy/bPGKG+JdXqEM5CiasNqoJn0UBle2dOpG08Ezb19vHFgNSOuvrxEv
19+
oxkklXzyw+JMyskmD67MxQBsHcxW4g+501OMhIb2J36LNsOMQxzjIpS2jia/P1lh
20+
9R4WohPxKf7Hi0Ui6oQRC7i2USmisuHIlVAmv14AjiISJdhXVOFtu+hVWrCHqHEg
21+
GWRj560G1WwT5EHZr4KN+6IRX6mCKJAO1XjSz5rPfDpet5OQGIr7N+lJwWE03kJs
22+
6Pd8K0OYW+2rbwqFd4YugF18HQlA1T5aok4fj2P+BTOuCNfvf0ZZXFeBn45zgtZI
23+
G/puduRwRRyUzB+XTzhN8o6dfuBjasq6U0/ZFDRKKJnAOAq/fmVxr51+zKvZ0T5B
24+
NSPbD9wUdnABqGCR+y9AL63QP0iVrkLlKzjgUYdlb1lw4TnmLGadmfYaZoOtWH2c
25+
FOucH3VVfinY7Q9EE5/EF5EHeG3pe3I3UHXTbAvcxvuhCByFZd6qe3Vz4AGcQLoT
26+
ProWJzmjeElfziX4e4Ol6tNSAxwL+vhjn4KmvF4mFx6n+QMAyp8lEmPsYgnsT/n9
27+
pkdnk0VdLGQmp8eKExvvDfiDTagDnh6wr7Nys1VLBADIthsRW4Gdft02q3tFOyae
28+
WpeZent5x28yRPbNgDtoStjqc0yQPdXVFuAsLzA6NT8ujlOhJCnmiPYOurGis0Ch
29+
hQLV+kr5EybbUHGjMB01elqTXy2VTMEqQ/7TQdsy6vIDYeBq5t491t9P/TeeS5Om
30+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)