1
1
'use strict' ;
2
2
3
3
angular . module ( "openshiftConsole" )
4
- . factory ( "SecretsService" , function ( ) {
4
+ . factory ( "SecretsService" , function ( $filter , Logger , NotificationsService ) {
5
5
6
6
var groupSecretsByType = function ( secrets ) {
7
7
var secretsByType = {
@@ -28,67 +28,104 @@ angular.module("openshiftConsole")
28
28
return secretsByType ;
29
29
} ;
30
30
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 )
42
36
} ) ;
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 ;
44
56
} ;
45
57
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
+
65
+ // }
66
+ // }
67
+ // }
68
+ //
69
+ // - .dockerconfigjson
70
+ // {
71
+ // "auths": {
72
+ // "https://index.docker.io/v1/": {
73
+ // "auth": "dGVzdHVzZXI6dGVzdHB3",
74
+
75
+ // }
76
+ // }
77
+ // }
78
+ //
79
+ var decodeDockerConfig = function ( encodedData , configType ) {
80
+ var decodedData ;
47
81
var decodedSecretData = {
48
82
auths : { }
49
83
} ;
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
- }
56
84
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
+ }
64
90
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
+ }
67
107
}
68
108
69
109
return decodedSecretData ;
70
110
} ;
71
111
112
+
72
113
var decodeSecretData = function ( secretData ) {
73
114
var nonPrintable = { } ;
74
- var decodedSecret = _ . mapValues ( secretData , function ( data , paramName ) {
115
+ var decodedSecret = _ . mapValues ( secretData , function ( data , configType ) {
75
116
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 {
82
120
decoded = window . atob ( data ) ;
83
121
// Allow whitespace like newlines and tabs, but detect other
84
122
// non-printable characters in the unencoded data.
85
123
// http://stackoverflow.com/questions/1677644/detect-non-printable-characters-in-javascript
86
124
isNonPrintable = / [ \x00 - \x09 \x0E - \x1F ] / . test ( decoded ) ;
87
125
if ( isNonPrintable ) {
88
- nonPrintable [ paramName ] = true ;
126
+ nonPrintable [ configType ] = true ;
89
127
return data ;
90
128
}
91
-
92
129
return decoded ;
93
130
}
94
131
} ) ;
0 commit comments