mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Valery Kharseko
yesterday e9e614a4644288148abe6cb6fae3112e25a86d2d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions copyright [year] [name of copyright owner]".
 *
 * Copyright 2026 3A Systems, LLC.
 */
package com.forgerock.opendj.cli;
 
import static org.fest.assertions.Assertions.assertThat;
 
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
 
/** Quoting of the values in the equivalent command lines that the tools print. */
@SuppressWarnings("javadoc")
public final class CommandBuilderTestCase extends CliTestCase {
 
    /**
     * Values and their Windows form. A Windows program splits its command line by the rules of
     * the Microsoft C runtime: backslashes are literal unless they precede a double quote, where
     * each pair gives one backslash and an odd one escapes the quote.
     */
    @DataProvider
    public Object[][] windowsValues() {
        return new Object[][] {
            { "cn=a\\,b,dc=x", "\"cn=a\\,b,dc=x\"" },
            { "o=My Company", "\"o=My Company\"" },
            { "(targetattr=\"cn\")(version 3.0; acl \"x\"; allow (read) userdn=\"ldap:///self\";)",
                "\"(targetattr=\\\"cn\\\")(version 3.0; acl \\\"x\\\"; allow (read) userdn=\\\"ldap:///self\\\";)\"" },
            { "abc\\", "\"abc\\\\\"" },
            { "a\\\"b", "\"a\\\\\\\"b\"" },
            { "", "\"\"" },
        };
    }
 
    @Test(dataProvider = "windowsValues")
    public void testWindowsValueIsQuotedForTheCRuntime(String value, String expected) {
        assertThat(CommandBuilder.escapeValue(value, false)).isEqualTo(expected);
    }
 
    @Test
    public void testUnixValueIsBackslashEscaped() {
        assertThat(CommandBuilder.escapeValue("cn=a\\,b \"x\"", true)).isEqualTo("cn=a\\\\,b\\ \\\"x\\\"");
    }
 
    /** A dsconfig batch line takes an unescaped single quote as an opening quote. */
    @Test
    public void testUnixApostropheIsEscaped() {
        assertThat(CommandBuilder.escapeValue("description:O'Brien", true)).isEqualTo("description:O\\'Brien");
    }
}