Skip to content

Commit 31281e8

Browse files
authored
Merge pull request docker-java#1138 from KostyaSha/fixNpe
Fix NPE when file doesn't exist.
2 parents 0c553f1 + 289fb1e commit 31281e8

File tree

6 files changed

+47
-18
lines changed

6 files changed

+47
-18
lines changed

src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.apache.commons.lang.builder.ToStringBuilder;
1212
import org.apache.commons.lang.builder.ToStringStyle;
1313

14+
import javax.annotation.CheckForNull;
15+
import javax.annotation.Nonnull;
1416
import java.io.File;
1517
import java.io.FileInputStream;
1618
import java.io.IOException;
@@ -231,14 +233,16 @@ public String getRegistryUrl() {
231233
return registryUrl;
232234
}
233235

236+
@CheckForNull
234237
public String getDockerConfigPath() {
235238
return dockerConfigPath;
236239
}
237240

241+
@Nonnull
238242
public DockerConfigFile getDockerConfig() {
239243
if (dockerConfig == null) {
240244
try {
241-
dockerConfig = DockerConfigFile.loadConfig(new File(getDockerConfigPath()));
245+
dockerConfig = DockerConfigFile.loadConfig(getDockerConfigPath());
242246
} catch (IOException e) {
243247
throw new DockerClientException("Failed to parse docker configuration file", e);
244248
}

src/main/java/com/github/dockerjava/core/DockerConfigFile.java

+20-7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.apache.commons.io.FileUtils;
1111
import org.apache.commons.lang.StringUtils;
1212

13+
import javax.annotation.CheckForNull;
14+
import javax.annotation.Nonnull;
1315
import java.io.File;
1416
import java.io.IOException;
1517
import java.nio.charset.StandardCharsets;
@@ -27,7 +29,7 @@ public class DockerConfigFile {
2729
private static final TypeReference<Map<String, AuthConfig>> CONFIG_MAP_TYPE = new TypeReference<Map<String, AuthConfig>>() {
2830
};
2931

30-
@JsonProperty()
32+
@JsonProperty
3133
private final Map<String, AuthConfig> auths;
3234

3335
public DockerConfigFile() {
@@ -38,6 +40,7 @@ private DockerConfigFile(Map<String, AuthConfig> authConfigMap) {
3840
auths = authConfigMap;
3941
}
4042

43+
@Nonnull
4144
public Map<String, AuthConfig> getAuths() {
4245
return auths;
4346
}
@@ -46,7 +49,8 @@ void addAuthConfig(AuthConfig config) {
4649
auths.put(config.getRegistryAddress(), config);
4750
}
4851

49-
public AuthConfig resolveAuthConfig(String hostname) {
52+
@CheckForNull
53+
public AuthConfig resolveAuthConfig(@CheckForNull String hostname) {
5054
if (StringUtils.isEmpty(hostname) || AuthConfig.DEFAULT_SERVER_ADDRESS.equals(hostname)) {
5155
return auths.get(AuthConfig.DEFAULT_SERVER_ADDRESS);
5256
}
@@ -70,6 +74,7 @@ public AuthConfig resolveAuthConfig(String hostname) {
7074
return null;
7175
}
7276

77+
@Nonnull
7378
public AuthConfigurations getAuthConfigurations() {
7479
final AuthConfigurations authConfigurations = new AuthConfigurations();
7580
for (Map.Entry<String, AuthConfig> authConfigEntry : auths.entrySet()) {
@@ -112,7 +117,13 @@ public String toString() {
112117
return "DockerConfigFile [auths=" + auths + "]";
113118
}
114119

115-
public static DockerConfigFile loadConfig(File dockerConfigPath) throws IOException {
120+
@Nonnull
121+
public static DockerConfigFile loadConfig(@CheckForNull String dockerConfigPath) throws IOException {
122+
// no any configs, but for empty auths return non null object
123+
if (dockerConfigPath == null) {
124+
return new DockerConfigFile();
125+
}
126+
116127
//parse new docker config file format
117128
DockerConfigFile dockerConfig = loadCurrentConfig(dockerConfigPath);
118129

@@ -136,8 +147,9 @@ public static DockerConfigFile loadConfig(File dockerConfigPath) throws IOExcept
136147
return dockerConfig;
137148
}
138149

139-
private static DockerConfigFile loadCurrentConfig(File dockerConfigPath) throws IOException {
140-
File dockerCfgFile = new File(dockerConfigPath, File.separator + DOCKER_CFG);
150+
@CheckForNull
151+
private static DockerConfigFile loadCurrentConfig(@CheckForNull String dockerConfigPath) throws IOException {
152+
File dockerCfgFile = new File(dockerConfigPath, DOCKER_CFG);
141153

142154
if (!dockerCfgFile.exists() || !dockerCfgFile.isFile()) {
143155
return null;
@@ -150,8 +162,9 @@ private static DockerConfigFile loadCurrentConfig(File dockerConfigPath) throws
150162
}
151163
}
152164

153-
private static DockerConfigFile loadLegacyConfig(File dockerConfigPath) throws IOException {
154-
File dockerLegacyCfgFile = new File(dockerConfigPath, File.separator + DOCKER_LEGACY_CFG);
165+
@CheckForNull
166+
private static DockerConfigFile loadLegacyConfig(String dockerConfigPath) throws IOException {
167+
File dockerLegacyCfgFile = new File(dockerConfigPath, DOCKER_LEGACY_CFG);
155168

156169
if (!dockerLegacyCfgFile.exists() || !dockerLegacyCfgFile.isFile()) {
157170
return null;

src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java

+13-5
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import com.github.dockerjava.api.model.AuthConfig;
66
import com.github.dockerjava.api.model.AuthConfigurations;
77
import com.github.dockerjava.core.DockerClientConfig;
8-
import com.github.dockerjava.core.RemoteApiVersion;
98
import com.github.dockerjava.core.InvocationBuilder;
9+
import com.github.dockerjava.core.RemoteApiVersion;
1010
import com.github.dockerjava.core.WebTarget;
1111
import org.apache.commons.codec.binary.Base64;
1212

13+
import javax.annotation.CheckForNull;
14+
import javax.annotation.Nonnull;
1315
import java.io.IOException;
1416

1517
import static com.github.dockerjava.core.RemoteApiVersion.UNKNOWN_VERSION;
@@ -33,19 +35,21 @@ protected WebTarget getBaseResource() {
3335
return baseResource;
3436
}
3537

38+
@CheckForNull
3639
protected AuthConfigurations getBuildAuthConfigs() {
3740
return dockerClientConfig.getAuthConfigurations();
3841
}
3942

40-
protected String registryAuth(AuthConfig authConfig) {
43+
protected String registryAuth(@Nonnull AuthConfig authConfig) {
4144
try {
4245
return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes());
4346
} catch (IOException e) {
4447
throw new RuntimeException(e);
4548
}
4649
}
4750

48-
protected String registryConfigs(AuthConfigurations authConfigs) {
51+
@Nonnull
52+
protected String registryConfigs(@Nonnull AuthConfigurations authConfigs) {
4953
try {
5054
final String json;
5155
final ObjectMapper objectMapper = new ObjectMapper();
@@ -68,11 +72,15 @@ protected String registryConfigs(AuthConfigurations authConfigs) {
6872
}
6973
}
7074

71-
protected InvocationBuilder resourceWithAuthConfig(AuthConfig authConfig, InvocationBuilder request) {
75+
@Nonnull
76+
protected InvocationBuilder resourceWithAuthConfig(@Nonnull AuthConfig authConfig,
77+
@Nonnull InvocationBuilder request) {
7278
return request.header("X-Registry-Auth", registryAuth(authConfig));
7379
}
7480

75-
protected InvocationBuilder resourceWithOptionalAuthConfig(AuthConfig authConfig, InvocationBuilder request) {
81+
@Nonnull
82+
protected InvocationBuilder resourceWithOptionalAuthConfig(@CheckForNull AuthConfig authConfig,
83+
@Nonnull InvocationBuilder request) {
7684
if (authConfig != null) {
7785
request = resourceWithAuthConfig(authConfig, request);
7886
}

src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
1414

15+
import javax.annotation.CheckForNull;
16+
1517
import static com.github.dockerjava.core.util.CacheFromEncoder.jsonEncode;
1618
import static org.apache.commons.lang.StringUtils.isNotBlank;
1719

@@ -31,8 +33,9 @@ private InvocationBuilder resourceWithOptionalAuthConfig(BuildImageCmd command,
3133
return request;
3234
}
3335

34-
private static AuthConfigurations firstNonNull(final AuthConfigurations fromCommand,
35-
final AuthConfigurations fromConfig) {
36+
@CheckForNull
37+
private static AuthConfigurations firstNonNull(@CheckForNull final AuthConfigurations fromCommand,
38+
@CheckForNull final AuthConfigurations fromConfig) {
3639
if (fromCommand != null) {
3740
return fromCommand;
3841
}

src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ protected Void execute0(PullImageCmd command, ResultCallback<PullResponseItem> r
3030
}
3131

3232
LOGGER.trace("POST: {}", webResource);
33-
resourceWithOptionalAuthConfig(command.getAuthConfig(), webResource.request()).accept(MediaType.APPLICATION_OCTET_STREAM).post(
34-
null, new TypeReference<PullResponseItem>() {
33+
resourceWithOptionalAuthConfig(command.getAuthConfig(), webResource.request())
34+
.accept(MediaType.APPLICATION_OCTET_STREAM)
35+
.post(null, new TypeReference<PullResponseItem>() {
3536
}, resultCallback);
3637

3738
return null;

src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public void nonExistent() throws IOException {
156156
}
157157

158158
private DockerConfigFile runTest(String testFileName) throws IOException {
159-
return DockerConfigFile.loadConfig(new File(FILESROOT, testFileName));
159+
return DockerConfigFile.loadConfig(new File(FILESROOT, testFileName).getAbsolutePath());
160160
}
161161

162162
}

0 commit comments

Comments
 (0)