Skip to content

Commit 960e0a3

Browse files
committed
Check 'auth' field when displaying .dockercfg config
1 parent 14188ec commit 960e0a3

File tree

1 file changed

+75
-38
lines changed

1 file changed

+75
-38
lines changed

app/scripts/services/secrets.js

+75-38
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
angular.module("openshiftConsole")
4-
.factory("SecretsService", function(){
4+
.factory("SecretsService", function($filter, Logger, NotificationsService){
55

66
var groupSecretsByType = function(secrets) {
77
var secretsByType = {
@@ -28,67 +28,104 @@ angular.module("openshiftConsole")
2828
return secretsByType;
2929
};
3030

31-
var decodeDockercfg = function(encodedData) {
32-
var decodedSecretData = {
33-
auths: {}
34-
};
35-
var decodedData = JSON.parse(window.atob(encodedData));
36-
_.each(decodedData, function(data, serverName) {
37-
decodedSecretData.auths[serverName] = {
38-
username: data.username,
39-
password: data.password,
40-
email: data.email
41-
};
31+
var handleDecodeException = function(error, encodedStringType) {
32+
NotificationsService.addNotification({
33+
type: "error",
34+
message: 'Base64-encoded ' + encodedStringType + ' string could not be decoded.',
35+
details: $filter('getErrorDetails')(error)
4236
});
43-
return decodedSecretData;
37+
Logger.error('Base64-encoded ' + encodedStringType + ' string could not be decoded.', error);
38+
};
39+
40+
var getServerParams = function(serverData) {
41+
var params = _.pick(serverData, ['email', 'username', 'password']);
42+
if (serverData.auth) {
43+
try {
44+
// Decode Base64-encoded username:password string.
45+
var setParams = _.spread(function(username, password) {
46+
params.username = username;
47+
params.password = password;
48+
});
49+
setParams(_.split(window.atob(serverData.auth), ':', 2));
50+
} catch(e) {
51+
handleDecodeException(e, 'username:password');
52+
return;
53+
}
54+
}
55+
return params;
4456
};
4557

46-
var decodeDockerconfigjson = function(encodedData) {
58+
// decodeDockerConfig handles both Docker configuration file formats, which are:
59+
// - .dockercfg
60+
// {
61+
// "auths": {
62+
// "https://index.docker.io/v1/": {
63+
// "auth": "dGVzdHVzZXI6dGVzdHB3",
64+
// "email": "[email protected]"
65+
// }
66+
// }
67+
// }
68+
//
69+
// - .dockerconfigjson
70+
// {
71+
// "auths": {
72+
// "https://index.docker.io/v1/": {
73+
// "auth": "dGVzdHVzZXI6dGVzdHB3",
74+
// "email": "[email protected]"
75+
// }
76+
// }
77+
// }
78+
//
79+
var decodeDockerConfig = function(encodedData, configType) {
80+
var decodedData;
4781
var decodedSecretData = {
4882
auths: {}
4983
};
50-
var decodedData = JSON.parse(window.atob(encodedData));
51-
_.each(decodedData.auths, function(data, serverName) {
52-
if (!data.auth) {
53-
decodedSecretData.auths[serverName] = data;
54-
return;
55-
}
5684

57-
var usernamePassword = window.atob(data.auth).split(":");
58-
decodedSecretData.auths[serverName] = {
59-
username: usernamePassword[0],
60-
password: usernamePassword[1],
61-
email: data.email
62-
};
63-
});
85+
try {
86+
decodedData = JSON.parse(window.atob(encodedData));
87+
} catch(e) {
88+
handleDecodeException(e, configType);
89+
}
6490

65-
if (decodedData.credsStore) {
66-
decodedSecretData.credsStore = decodedData.credsStore;
91+
if (configType === ".dockercfg") {
92+
_.each(decodedData, function(serverData, serverName) {
93+
decodedSecretData.auths[serverName] = getServerParams(serverData);
94+
});
95+
} else {
96+
_.each(decodedData.auths, function(serverData, serverName) {
97+
if (!serverData.auth) {
98+
decodedSecretData.auths[serverName] = serverData;
99+
return;
100+
}
101+
decodedSecretData.auths[serverName] = getServerParams(serverData);
102+
});
103+
104+
if (decodedData.credsStore) {
105+
decodedSecretData.credsStore = decodedData.credsStore;
106+
}
67107
}
68108

69109
return decodedSecretData;
70110
};
71111

112+
72113
var decodeSecretData = function(secretData) {
73114
var nonPrintable = {};
74-
var decodedSecret = _.mapValues(secretData, function(data, paramName) {
115+
var decodedSecret = _.mapValues(secretData, function(data, configType) {
75116
var decoded, isNonPrintable;
76-
switch (paramName) {
77-
case ".dockercfg":
78-
return decodeDockercfg(data);
79-
case ".dockerconfigjson":
80-
return decodeDockerconfigjson(data);
81-
default:
117+
if (configType === ".dockercfg" || configType === ".dockerconfigjson") {
118+
return decodeDockerConfig(data, configType);
119+
} else {
82120
decoded = window.atob(data);
83121
// Allow whitespace like newlines and tabs, but detect other
84122
// non-printable characters in the unencoded data.
85123
// http://stackoverflow.com/questions/1677644/detect-non-printable-characters-in-javascript
86124
isNonPrintable = /[\x00-\x09\x0E-\x1F]/.test(decoded);
87125
if (isNonPrintable) {
88-
nonPrintable[paramName] = true;
126+
nonPrintable[configType] = true;
89127
return data;
90128
}
91-
92129
return decoded;
93130
}
94131
});

0 commit comments

Comments
 (0)