Skip to content

Commit 47561f2

Browse files
committed
Check 'auth' field when displaying .dockercfg config
1 parent 0beaf62 commit 47561f2

File tree

2 files changed

+110
-77
lines changed

2 files changed

+110
-77
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
});

dist/scripts/scripts.js

+35-39
Original file line numberDiff line numberDiff line change
@@ -3168,32 +3168,37 @@ message: null
31683168
};
31693169
}
31703170
};
3171-
}), angular.module("openshiftConsole").factory("SecretsService", function() {
3172-
var e = function(e) {
3173-
var t = {
3174-
auths: {}
3175-
}, n = JSON.parse(window.atob(e));
3176-
return _.each(n, function(e, n) {
3177-
t.auths[n] = {
3178-
username: e.username,
3179-
password: e.password,
3180-
email: e.email
3181-
};
3182-
}), t;
3183-
}, t = function(e) {
3184-
var t = {
3171+
}), angular.module("openshiftConsole").factory("SecretsService", [ "$filter", "Logger", "NotificationsService", function(e, t, n) {
3172+
var a = function(a, r) {
3173+
n.addNotification({
3174+
type: "error",
3175+
message: "Base64-encoded " + r + " string could not be decoded.",
3176+
details: e("getErrorDetails")(a)
3177+
}), t.error("Base64-encoded " + r + " string could not be decoded.", a);
3178+
}, r = function(e) {
3179+
var t = _.pick(e, [ "email", "username", "password" ]);
3180+
if (e.auth) try {
3181+
_.spread(function(e, n) {
3182+
t.username = e, t.password = n;
3183+
})(_.split(window.atob(e.auth), ":", 2));
3184+
} catch (e) {
3185+
return void a(e, "username:password");
3186+
}
3187+
return t;
3188+
}, o = function(e, t) {
3189+
var n, o = {
31853190
auths: {}
3186-
}, n = JSON.parse(window.atob(e));
3187-
return _.each(n.auths, function(e, n) {
3188-
if (e.auth) {
3189-
var a = window.atob(e.auth).split(":");
3190-
t.auths[n] = {
3191-
username: a[0],
3192-
password: a[1],
3193-
email: e.email
31943191
};
3195-
} else t.auths[n] = e;
3196-
}), n.credsStore && (t.credsStore = n.credsStore), t;
3192+
try {
3193+
n = JSON.parse(window.atob(e));
3194+
} catch (e) {
3195+
a(e, t);
3196+
}
3197+
return ".dockercfg" === t ? _.each(n, function(e, t) {
3198+
o.auths[t] = r(e);
3199+
}) : (_.each(n.auths, function(e, t) {
3200+
e.auth ? o.auths[t] = r(e) : o.auths[t] = e;
3201+
}), n.credsStore && (o.credsStore = n.credsStore)), o;
31973202
};
31983203
return {
31993204
groupSecretsByType: function(e) {
@@ -3220,24 +3225,15 @@ t.other.push(e);
32203225
}
32213226
}), t;
32223227
},
3223-
decodeSecretData: function(n) {
3224-
var a = {}, r = _.mapValues(n, function(n, r) {
3225-
var o;
3226-
switch (r) {
3227-
case ".dockercfg":
3228-
return e(n);
3229-
3230-
case ".dockerconfigjson":
3231-
return t(n);
3232-
3233-
default:
3234-
return o = window.atob(n), /[\x00-\x09\x0E-\x1F]/.test(o) ? (a[r] = !0, n) : o;
3235-
}
3228+
decodeSecretData: function(e) {
3229+
var t = {}, n = _.mapValues(e, function(e, n) {
3230+
var a;
3231+
return ".dockercfg" === n || ".dockerconfigjson" === n ? o(e, n) : (a = window.atob(e), /[\x00-\x09\x0E-\x1F]/.test(a) ? (t[n] = !0, e) : a);
32363232
});
3237-
return r.$$nonprintable = a, r;
3233+
return n.$$nonprintable = t, n;
32383234
}
32393235
};
3240-
}), angular.module("openshiftConsole").factory("ServicesService", [ "$filter", "$q", "DataService", function(e, t, n) {
3236+
} ]), angular.module("openshiftConsole").factory("ServicesService", [ "$filter", "$q", "DataService", function(e, t, n) {
32413237
var a = "service.alpha.openshift.io/dependencies", r = e("annotation"), o = function(e) {
32423238
var t = r(e, a);
32433239
if (!t) return null;

0 commit comments

Comments
 (0)