Skip to content

Commit 1ba6a49

Browse files
Fix JsonSyntaxException when creating API command response #4355 (#4387)
* Add missing \" on obfuscatePassword * Add tests for AsyncJobManagerImpl.obfuscatePassword * fix for "password},"
1 parent db3fdf4 commit 1ba6a49

File tree

2 files changed

+55
-99
lines changed

2 files changed

+55
-99
lines changed

framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,14 +475,19 @@ public AsyncJob queryJob(final long jobId, final boolean updatePollTime) {
475475
return job;
476476
}
477477

478-
private String obfuscatePassword(String result, boolean hidePassword) {
478+
public String obfuscatePassword(String result, boolean hidePassword) {
479479
if (hidePassword) {
480480
String pattern = "\"password\":";
481481
if (result != null) {
482482
if (result.contains(pattern)) {
483483
String[] resp = result.split(pattern);
484484
String psswd = resp[1].toString().split(",")[0];
485-
result = resp[0] + pattern + psswd.replace(psswd.substring(2, psswd.length() - 1), "*****") + "," + resp[1].split(",", 2)[1];
485+
if (psswd.endsWith("}")) {
486+
psswd = psswd.substring(0, psswd.length() - 1);
487+
result = resp[0] + pattern + psswd.replace(psswd.substring(2, psswd.length() - 1), "*****") + "}," + resp[1].split(",", 2)[1];
488+
} else {
489+
result = resp[0] + pattern + psswd.replace(psswd.substring(2, psswd.length() - 1), "*****") + "," + resp[1].split(",", 2)[1];
490+
}
486491
}
487492
}
488493
}

framework/jobs/src/test/java/org/apache/cloudstack/framework/jobs/AsyncJobManagerTest.java

Lines changed: 48 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -16,116 +16,67 @@
1616
// under the License.
1717
package org.apache.cloudstack.framework.jobs;
1818

19-
/*
20-
* This integration test requires real DB setup, it is not meant to run at per-build
21-
* basis, it can only be opened in developer's run
22-
*
23-
*
19+
import org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl;
20+
import org.junit.Assert;
21+
import org.junit.Test;
22+
import org.junit.runner.RunWith;
23+
import org.mockito.Spy;
24+
import org.mockito.junit.MockitoJUnitRunner;
2425

25-
@RunWith(SpringJUnit4ClassRunner.class)
26-
@ContextConfiguration(locations = "classpath:/AsyncJobManagerTestContext.xml")
27-
public class AsyncJobManagerTest extends TestCase {
28-
private static final Logger s_logger =
29-
Logger.getLogger(AsyncJobManagerTest.class);
26+
@RunWith (MockitoJUnitRunner.class)
27+
public class AsyncJobManagerTest {
3028

31-
@Inject
32-
AsyncJobManager _jobMgr;
29+
@Spy
30+
AsyncJobManagerImpl asyncJobManager;
3331

34-
@Inject
35-
AsyncJobTestDashboard _testDashboard;
32+
String input = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\",\"password\":\"password\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
33+
String expected = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\",\"password\":\"p*****\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
34+
String obfuscatedInput = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\",\"password\":\"p***\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
35+
String noPassword = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
3636

37-
@Override
38-
@Before
39-
public void setUp() throws Exception {
40-
try {
41-
ComponentContext.initComponentsLifeCycle();
42-
} catch (Exception ex) {
43-
ex.printStackTrace();
44-
s_logger.error(ex.getMessage());
45-
}
46-
}
37+
String inputNoBraces = "\"password\":\"password\"\",\"action\":\"OFF\"";
38+
String expectedNoBraces = "\"password\":\"p*****\",\"action\":\"OFF\"";
4739

48-
@Override
49-
@After
50-
public void tearDown() throws Exception {
40+
@Test
41+
public void obfuscatePasswordTest() {
42+
String result = asyncJobManager.obfuscatePassword(input, true);
43+
Assert.assertEquals(expected, result);
5144
}
5245

53-
public void testWaitBehave() {
54-
55-
final Object me = this;
56-
new Thread(new Runnable() {
57-
58-
@Override
59-
public void run() {
60-
s_logger.info("Sleeping...");
61-
try {
62-
Thread.sleep(3000);
63-
} catch (InterruptedException e) {
64-
s_logger.debug("[ignored] .");
65-
}
66-
67-
s_logger.info("wakeup");
68-
synchronized (me) {
69-
me.notifyAll();
70-
}
71-
}
72-
73-
}).start();
74-
75-
s_logger.info("First wait");
76-
synchronized (me) {
77-
try {
78-
wait(5000);
79-
} catch (InterruptedException e) {
80-
// TODO Auto-generated catch block
81-
e.printStackTrace();
82-
}
83-
}
84-
s_logger.info("First wait done");
85-
86-
s_logger.info("Second wait");
87-
synchronized (me) {
88-
try {
89-
wait(5000);
90-
} catch (InterruptedException e) {
91-
// TODO Auto-generated catch block
92-
e.printStackTrace();
93-
}
94-
}
95-
s_logger.info("Second wait done");
46+
@Test
47+
public void obfuscatePasswordTestNoBraces() {
48+
String result = asyncJobManager.obfuscatePassword(inputNoBraces, true);
49+
Assert.assertEquals(expectedNoBraces, result);
9650
}
9751

9852
@Test
99-
public void test() {
100-
final int TOTAL_JOBS_PER_QUEUE = 5;
101-
final int TOTAL_QUEUES = 100;
102-
103-
for (int i = 0; i < TOTAL_QUEUES; i++) {
104-
for (int j = 0; j < TOTAL_JOBS_PER_QUEUE; j++) {
105-
AsyncJobVO job = new AsyncJobVO();
106-
job.setCmd("TestCmd");
107-
job.setDispatcher("TestJobDispatcher");
108-
job.setCmdInfo("TestCmd info");
109-
110-
_jobMgr.submitAsyncJob(job, "fakequeue", i);
53+
public void obfuscatePasswordTestHidePasswordFalse() {
54+
String result = asyncJobManager.obfuscatePassword(input, false);
55+
Assert.assertEquals(input, result);
56+
}
11157

112-
s_logger.info("Job submitted. job " + job.getId() + ", queue: " + i);
113-
}
114-
}
58+
@Test
59+
public void obfuscatePasswordTestObfuscatedInput() {
60+
String result = asyncJobManager.obfuscatePassword(obfuscatedInput, true);
61+
Assert.assertEquals(expected, result);
62+
}
11563

116-
while (true) {
117-
if (_testDashboard.getCompletedJobCount() == TOTAL_JOBS_PER_QUEUE * TOTAL_QUEUES)
118-
break;
64+
@Test
65+
public void obfuscatePasswordTestHidePasswordFalseObfuscatedInput() {
66+
String result = asyncJobManager.obfuscatePassword(obfuscatedInput, false);
67+
Assert.assertEquals(obfuscatedInput, result);
68+
}
11969

120-
try {
121-
Thread.sleep(1000);
122-
} catch (InterruptedException e) {
123-
s_logger.debug("[ignored] .");
124-
}
125-
}
70+
@Test
71+
public void obfuscatePasswordTestNoPassword() {
72+
String result = asyncJobManager.obfuscatePassword(noPassword, true);
73+
Assert.assertEquals(noPassword, result);
74+
}
12675

127-
s_logger.info("Test done with " + _testDashboard.getCompletedJobCount() + " job executed");
76+
@Test
77+
public void obfuscatePasswordTestHidePasswordNoPassword() {
78+
String result = asyncJobManager.obfuscatePassword(noPassword, false);
79+
Assert.assertEquals(noPassword, result);
12880
}
129-
}
13081

131-
*/
82+
}

0 commit comments

Comments
 (0)