Produced by Araxis Merge on 11/20/2017 2:15:51 PM GMT Standard Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.
# | Location | File | Last Modified |
---|---|---|---|
1 | C:\Merge Test Files\8.0.47\java\org\apache\catalina\authenticator | DigestAuthenticator.java | Fri Sep 29 16:53:28 2017 UTC |
2 | C:\Merge Test Files\8.5.23\java\org\apache\catalina\authenticator | DigestAuthenticator.java | Thu Sep 28 11:32:16 2017 UTC |
3 | C:\Merge Test Files\9.0.1\java\org\apache\catalina\authenticator | DigestAuthenticator.java | Wed Sep 27 18:33:40 2017 UTC |
Note: Merge considers the second file to be the common ancestor of the others. |
Description | Between Files 1 and 2 |
Between Files 2 and 3 |
Relative to Common Ancestor |
|||
---|---|---|---|---|---|---|
Text Blocks | Lines | Text Blocks | Lines | Text Blocks | Lines | |
Unchanged | 8 | 1280 | 1 | 1304 | ||
Changed | 3 | 6 | 0 | 0 | 3 | 6 |
Inserted | 4 | 9 | 0 | 0 | 0 | 0 |
Removed | 0 | 0 | 0 | 0 | 4 | 9 |
Note: An automatic merge would leave 0 conflict(s). |
Whitespace | Consecutive whitespace is treated as a single space |
---|---|
Character case | Differences in character case are significant |
Line endings | Differences in line endings (CR and LF characters) are ignored |
CR/LF characters | Not shown in the comparison detail |
No regular expressions were active.
1 | /* | 1 | /* | 1 | /* | |||||
2 | * License d to the A pache Soft ware Found ation (ASF ) under on e or more | 2 | * License d to the A pache Soft ware Found ation (ASF ) under on e or more | 2 | * License d to the A pache Soft ware Found ation (ASF ) under on e or more | |||||
3 | * contrib utor licen se agreeme nts. See the NOTICE file dist ributed wi th | 3 | * contrib utor licen se agreeme nts. See the NOTICE file dist ributed wi th | 3 | * contrib utor licen se agreeme nts. See the NOTICE file dist ributed wi th | |||||
4 | * this wo rk for add itional in formation regarding copyright ownership. | 4 | * this wo rk for add itional in formation regarding copyright ownership. | 4 | * this wo rk for add itional in formation regarding copyright ownership. | |||||
5 | * The ASF licenses this file to You und er the Apa che Licens e, Version 2.0 | 5 | * The ASF licenses this file to You und er the Apa che Licens e, Version 2.0 | 5 | * The ASF licenses this file to You und er the Apa che Licens e, Version 2.0 | |||||
6 | * (the "L icense"); you may no t use this file exce pt in comp liance wit h | 6 | * (the "L icense"); you may no t use this file exce pt in comp liance wit h | 6 | * (the "L icense"); you may no t use this file exce pt in comp liance wit h | |||||
7 | * the Lic ense. You may obtai n a copy o f the Lice nse at | 7 | * the Lic ense. You may obtai n a copy o f the Lice nse at | 7 | * the Lic ense. You may obtai n a copy o f the Lice nse at | |||||
8 | * | 8 | * | 8 | * | |||||
9 | * ht tp://www.a pache.org/ licenses/L ICENSE-2.0 | 9 | * ht tp://www.a pache.org/ licenses/L ICENSE-2.0 | 9 | * ht tp://www.a pache.org/ licenses/L ICENSE-2.0 | |||||
10 | * | 10 | * | 10 | * | |||||
11 | * Unless required b y applicab le law or agreed to in writing , software | 11 | * Unless required b y applicab le law or agreed to in writing , software | 11 | * Unless required b y applicab le law or agreed to in writing , software | |||||
12 | * distrib uted under the Licen se is dist ributed on an "AS IS " BASIS, | 12 | * distrib uted under the Licen se is dist ributed on an "AS IS " BASIS, | 12 | * distrib uted under the Licen se is dist ributed on an "AS IS " BASIS, | |||||
13 | * WITHOUT WARRANTIE S OR CONDI TIONS OF A NY KIND, e ither expr ess or imp lied. | 13 | * WITHOUT WARRANTIE S OR CONDI TIONS OF A NY KIND, e ither expr ess or imp lied. | 13 | * WITHOUT WARRANTIE S OR CONDI TIONS OF A NY KIND, e ither expr ess or imp lied. | |||||
14 | * See the License f or the spe cific lang uage gover ning permi ssions and | 14 | * See the License f or the spe cific lang uage gover ning permi ssions and | 14 | * See the License f or the spe cific lang uage gover ning permi ssions and | |||||
15 | * limitat ions under the Licen se. | 15 | * limitat ions under the Licen se. | 15 | * limitat ions under the Licen se. | |||||
16 | */ | 16 | */ | 16 | */ | |||||
17 | package or g.apache.c atalina.au thenticato r; | 17 | package or g.apache.c atalina.au thenticato r; | 17 | package or g.apache.c atalina.au thenticato r; | |||||
18 | 18 | 18 | ||||||||
19 | import jav a.io.IOExc eption; | 19 | import jav a.io.IOExc eption; | 19 | import jav a.io.IOExc eption; | |||||
20 | import jav a.io.Strin gReader; | 20 | import jav a.io.Strin gReader; | 20 | import jav a.io.Strin gReader; | |||||
21 | import jav a.nio.char set.Standa rdCharsets ; | 21 | import jav a.nio.char set.Standa rdCharsets ; | 21 | import jav a.nio.char set.Standa rdCharsets ; | |||||
22 | import jav a.security .Principal ; | 22 | import jav a.security .Principal ; | 22 | import jav a.security .Principal ; | |||||
23 | import jav a.util.Lin kedHashMap ; | 23 | import jav a.util.Lin kedHashMap ; | 23 | import jav a.util.Lin kedHashMap ; | |||||
24 | import jav a.util.Map ; | 24 | import jav a.util.Map ; | 24 | import jav a.util.Map ; | |||||
25 | 25 | 25 | ||||||||
26 | import jav ax.servlet .http.Http ServletReq uest; | 26 | import jav ax.servlet .http.Http ServletReq uest; | 26 | import jav ax.servlet .http.Http ServletReq uest; | |||||
27 | import jav ax.servlet .http.Http ServletRes ponse; | 27 | import jav ax.servlet .http.Http ServletRes ponse; | 27 | import jav ax.servlet .http.Http ServletRes ponse; | |||||
28 | 28 | 28 | ||||||||
29 | import org .apache.ca talina.Lif ecycleExce ption; | 29 | import org .apache.ca talina.Lif ecycleExce ption; | 29 | import org .apache.ca talina.Lif ecycleExce ption; | |||||
30 | import org .apache.ca talina.Rea lm; | 30 | import org .apache.ca talina.Rea lm; | 30 | import org .apache.ca talina.Rea lm; | |||||
31 | import org .apache.ca talina.con nector.Req uest; | 31 | import org .apache.ca talina.con nector.Req uest; | 31 | import org .apache.ca talina.con nector.Req uest; | |||||
32 | import org .apache.ju li.logging .Log; | 32 | import org .apache.ju li.logging .Log; | 32 | import org .apache.ju li.logging .Log; | |||||
33 | import org .apache.ju li.logging .LogFactor y; | 33 | import org .apache.ju li.logging .LogFactor y; | 33 | import org .apache.ju li.logging .LogFactor y; | |||||
34 | import org .apache.to mcat.util. http.parse r.Authoriz ation; | 34 | import org .apache.to mcat.util. http.parse r.Authoriz ation; | 34 | import org .apache.to mcat.util. http.parse r.Authoriz ation; | |||||
35 | import org .apache.to mcat.util. security.C oncurrentM essageDige st; | 35 | import org .apache.to mcat.util. security.C oncurrentM essageDige st; | 35 | import org .apache.to mcat.util. security.C oncurrentM essageDige st; | |||||
36 | import org .apache.to mcat.util. security.M D5Encoder; | 36 | import org .apache.to mcat.util. security.M D5Encoder; | 36 | import org .apache.to mcat.util. security.M D5Encoder; | |||||
37 | 37 | 37 | ||||||||
38 | 38 | 38 | ||||||||
39 | /** | 39 | /** | 39 | /** | |||||
40 | * An <b>A uthenticat or</b> and <b>Valve< /b> implem entation o f HTTP DIG EST | 40 | * An <b>A uthenticat or</b> and <b>Valve< /b> implem entation o f HTTP DIG EST | 40 | * An <b>A uthenticat or</b> and <b>Valve< /b> implem entation o f HTTP DIG EST | |||||
41 | * Authent ication (s ee RFC 206 9). | 41 | * Authent ication (s ee RFC 206 9). | 41 | * Authent ication (s ee RFC 206 9). | |||||
42 | * | 42 | * | 42 | * | |||||
43 | * @author Craig R. McClanahan | 43 | * @author Craig R. McClanahan | 43 | * @author Craig R. McClanahan | |||||
44 | * @author Remy Mauc herat | 44 | * @author Remy Mauc herat | 44 | * @author Remy Mauc herat | |||||
45 | */ | 45 | */ | 45 | */ | |||||
46 | public cla ss DigestA uthenticat or extends Authentic atorBase { | 46 | public cla ss DigestA uthenticat or extends Authentic atorBase { | 46 | public cla ss DigestA uthenticat or extends Authentic atorBase { | |||||
47 | 47 | 47 | ||||||||
48 | privat e static f inal Log l og = LogFa ctory.getL og(DigestA uthenticat or.class); | 48 | privat e static f inal Log l og = LogFa ctory.getL og(DigestA uthenticat or.class); | 48 | privat e static f inal Log l og = LogFa ctory.getL og(DigestA uthenticat or.class); | |||||
49 | 49 | 49 | ||||||||
50 | 50 | 50 | ||||||||
51 | // --- ---------- ---------- ---------- ---------- ---------- --------- Constants | 51 | // --- ---------- ---------- ---------- ---------- ---------- --------- Constants | 51 | // --- ---------- ---------- ---------- ---------- ---------- --------- Constants | |||||
52 | 52 | 52 | ||||||||
53 | /** | 53 | /** | 53 | /** | |||||
54 | * Tom cat's DIGE ST impleme ntation on ly support s auth qua lity of pr otection. | 54 | * Tom cat's DIGE ST impleme ntation on ly support s auth qua lity of pr otection. | 54 | * Tom cat's DIGE ST impleme ntation on ly support s auth qua lity of pr otection. | |||||
55 | */ | 55 | */ | 55 | */ | |||||
56 | protec ted static final Str ing QOP = "auth"; | 56 | protec ted static final Str ing QOP = "auth"; | 56 | protec ted static final Str ing QOP = "auth"; | |||||
57 | 57 | 57 | ||||||||
58 | 58 | 58 | ||||||||
59 | // --- ---------- ---------- ---------- ---------- ---------- ------ Con structors | 59 | // --- ---------- ---------- ---------- ---------- ---------- ------ Con structors | 59 | // --- ---------- ---------- ---------- ---------- ---------- ------ Con structors | |||||
60 | 60 | 60 | ||||||||
61 | public DigestAut henticator () { | 61 | public DigestAut henticator () { | 61 | public DigestAut henticator () { | |||||
62 | su per(); | 62 | su per(); | 62 | su per(); | |||||
63 | se tCache(fal se); | 63 | se tCache(fal se); | 63 | se tCache(fal se); | |||||
64 | } | 64 | } | 64 | } | |||||
65 | 65 | 65 | ||||||||
66 | 66 | 66 | ||||||||
67 | // --- ---------- ---------- ---------- ---------- ---------- Instance Variables | 67 | // --- ---------- ---------- ---------- ---------- ---------- Instance Variables | 67 | // --- ---------- ---------- ---------- ---------- ---------- Instance Variables | |||||
68 | 68 | 68 | ||||||||
69 | /** | 69 | /** | 69 | /** | |||||
70 | * Lis t of serve r nonce va lues curre ntly being tracked | 70 | * Lis t of serve r nonce va lues curre ntly being tracked | 70 | * Lis t of serve r nonce va lues curre ntly being tracked | |||||
71 | */ | 71 | */ | 71 | */ | |||||
72 | protec ted Map<St ring,Nonce Info> nonc es; | 72 | protec ted Map<St ring,Nonce Info> nonc es; | 72 | protec ted Map<St ring,Nonce Info> nonc es; | |||||
73 | 73 | 73 | ||||||||
74 | 74 | 74 | ||||||||
75 | /** | 75 | /** | 75 | /** | |||||
76 | * The last time stamp used to genera te a nonce . Each non ce should get a | 76 | * The last time stamp used to genera te a nonce . Each non ce should get a | 76 | * The last time stamp used to genera te a nonce . Each non ce should get a | |||||
77 | * uni que timest amp. | 77 | * uni que timest amp. | 77 | * uni que timest amp. | |||||
78 | */ | 78 | */ | 78 | */ | |||||
79 | protec ted long l astTimesta mp = 0; | 79 | protec ted long l astTimesta mp = 0; | 79 | protec ted long l astTimesta mp = 0; | |||||
80 | protec ted final Object las tTimestamp Lock = new Object(); | 80 | protec ted final Object las tTimestamp Lock = new Object(); | 80 | protec ted final Object las tTimestamp Lock = new Object(); | |||||
81 | 81 | 81 | ||||||||
82 | 82 | 82 | ||||||||
83 | /** | 83 | /** | 83 | /** | |||||
84 | * Max imum numbe r of serve r nonces t o keep in the cache. If not sp ecified, | 84 | * Max imum numbe r of serve r nonces t o keep in the cache. If not sp ecified, | 84 | * Max imum numbe r of serve r nonces t o keep in the cache. If not sp ecified, | |||||
85 | * the default v alue of 10 00 is used . | 85 | * the default v alue of 10 00 is used . | 85 | * the default v alue of 10 00 is used . | |||||
86 | */ | 86 | */ | 86 | */ | |||||
87 | protec ted int no nceCacheSi ze = 1000; | 87 | protec ted int no nceCacheSi ze = 1000; | 87 | protec ted int no nceCacheSi ze = 1000; | |||||
88 | 88 | 88 | ||||||||
89 | 89 | 89 | ||||||||
90 | /** | 90 | /** | 90 | /** | |||||
91 | * The window si ze to use to track s een nonce count valu es for a g iven | 91 | * The window si ze to use to track s een nonce count valu es for a g iven | 91 | * The window si ze to use to track s een nonce count valu es for a g iven | |||||
92 | * non ce. If not specified , the defa ult of 100 is used. | 92 | * non ce. If not specified , the defa ult of 100 is used. | 92 | * non ce. If not specified , the defa ult of 100 is used. | |||||
93 | */ | 93 | */ | 93 | */ | |||||
94 | protec ted int no nceCountWi ndowSize = 100; | 94 | protec ted int no nceCountWi ndowSize = 100; | 94 | protec ted int no nceCountWi ndowSize = 100; | |||||
95 | 95 | 95 | ||||||||
96 | /** | 96 | /** | 96 | /** | |||||
97 | * Pri vate key. | 97 | * Pri vate key. | 97 | * Pri vate key. | |||||
98 | */ | 98 | */ | 98 | */ | |||||
99 | protec ted String key = nul l; | 99 | protec ted String key = nul l; | 99 | protec ted String key = nul l; | |||||
100 | 100 | 100 | ||||||||
101 | 101 | 101 | ||||||||
102 | /** | 102 | /** | 102 | /** | |||||
103 | * How long serv er nonces are valid for in mil liseconds. Defaults to 5 | 103 | * How long serv er nonces are valid for in mil liseconds. Defaults to 5 | 103 | * How long serv er nonces are valid for in mil liseconds. Defaults to 5 | |||||
104 | * min utes. | 104 | * min utes. | 104 | * min utes. | |||||
105 | */ | 105 | */ | 105 | */ | |||||
106 | protec ted long n onceValidi ty = 5 * 6 0 * 1000; | 106 | protec ted long n onceValidi ty = 5 * 6 0 * 1000; | 106 | protec ted long n onceValidi ty = 5 * 6 0 * 1000; | |||||
107 | 107 | 107 | ||||||||
108 | 108 | 108 | ||||||||
109 | /** | 109 | /** | 109 | /** | |||||
110 | * Opa que string . | 110 | * Opa que string . | 110 | * Opa que string . | |||||
111 | */ | 111 | */ | 111 | */ | |||||
112 | protec ted String opaque; | 112 | protec ted String opaque; | 112 | protec ted String opaque; | |||||
113 | 113 | 113 | ||||||||
114 | 114 | 114 | ||||||||
115 | /** | 115 | /** | 115 | /** | |||||
116 | * Sho uld the UR I be valid ated as re quired by RFC2617? C an be disa bled in | 116 | * Sho uld the UR I be valid ated as re quired by RFC2617? C an be disa bled in | 116 | * Sho uld the UR I be valid ated as re quired by RFC2617? C an be disa bled in | |||||
117 | * rev erse proxi es where t he proxy h as modifie d the URI. | 117 | * rev erse proxi es where t he proxy h as modifie d the URI. | 117 | * rev erse proxi es where t he proxy h as modifie d the URI. | |||||
118 | */ | 118 | */ | 118 | */ | |||||
119 | protec ted boolea n validate Uri = true ; | 119 | protec ted boolea n validate Uri = true ; | 119 | protec ted boolea n validate Uri = true ; | |||||
120 | 120 | 120 | ||||||||
121 | // --- ---------- ---------- ---------- ---------- ---------- -------- P roperties | 121 | // --- ---------- ---------- ---------- ---------- ---------- -------- P roperties | 121 | // --- ---------- ---------- ---------- ---------- ---------- -------- P roperties | |||||
122 | 122 | 122 | ||||||||
123 | public int getNo nceCountWi ndowSize() { | 123 | public int getNo nceCountWi ndowSize() { | 123 | public int getNo nceCountWi ndowSize() { | |||||
124 | re turn nonce CountWindo wSize; | 124 | re turn nonce CountWindo wSize; | 124 | re turn nonce CountWindo wSize; | |||||
125 | } | 125 | } | 125 | } | |||||
126 | 126 | 126 | ||||||||
127 | 127 | 127 | ||||||||
128 | public void setN onceCountW indowSize( int nonceC ountWindow Size) { | 128 | public void setN onceCountW indowSize( int nonceC ountWindow Size) { | 128 | public void setN onceCountW indowSize( int nonceC ountWindow Size) { | |||||
129 | th is.nonceCo untWindowS ize = nonc eCountWind owSize; | 129 | th is.nonceCo untWindowS ize = nonc eCountWind owSize; | 129 | th is.nonceCo untWindowS ize = nonc eCountWind owSize; | |||||
130 | } | 130 | } | 130 | } | |||||
131 | 131 | 131 | ||||||||
132 | 132 | 132 | ||||||||
133 | public int getNo nceCacheSi ze() { | 133 | public int getNo nceCacheSi ze() { | 133 | public int getNo nceCacheSi ze() { | |||||
134 | re turn nonce CacheSize; | 134 | re turn nonce CacheSize; | 134 | re turn nonce CacheSize; | |||||
135 | } | 135 | } | 135 | } | |||||
136 | 136 | 136 | ||||||||
137 | 137 | 137 | ||||||||
138 | public void setN onceCacheS ize(int no nceCacheSi ze) { | 138 | public void setN onceCacheS ize(int no nceCacheSi ze) { | 138 | public void setN onceCacheS ize(int no nceCacheSi ze) { | |||||
139 | th is.nonceCa cheSize = nonceCache Size; | 139 | th is.nonceCa cheSize = nonceCache Size; | 139 | th is.nonceCa cheSize = nonceCache Size; | |||||
140 | } | 140 | } | 140 | } | |||||
141 | 141 | 141 | ||||||||
142 | 142 | 142 | ||||||||
143 | public String ge tKey() { | 143 | public String ge tKey() { | 143 | public String ge tKey() { | |||||
144 | re turn key; | 144 | re turn key; | 144 | re turn key; | |||||
145 | } | 145 | } | 145 | } | |||||
146 | 146 | 146 | ||||||||
147 | 147 | 147 | ||||||||
148 | public void setK ey(String key) { | 148 | public void setK ey(String key) { | 148 | public void setK ey(String key) { | |||||
149 | th is.key = k ey; | 149 | th is.key = k ey; | 149 | th is.key = k ey; | |||||
150 | } | 150 | } | 150 | } | |||||
151 | 151 | 151 | ||||||||
152 | 152 | 152 | ||||||||
153 | public long getN onceValidi ty() { | 153 | public long getN onceValidi ty() { | 153 | public long getN onceValidi ty() { | |||||
154 | re turn nonce Validity; | 154 | re turn nonce Validity; | 154 | re turn nonce Validity; | |||||
155 | } | 155 | } | 155 | } | |||||
156 | 156 | 156 | ||||||||
157 | 157 | 157 | ||||||||
158 | public void setN onceValidi ty(long no nceValidit y) { | 158 | public void setN onceValidi ty(long no nceValidit y) { | 158 | public void setN onceValidi ty(long no nceValidit y) { | |||||
159 | th is.nonceVa lidity = n onceValidi ty; | 159 | th is.nonceVa lidity = n onceValidi ty; | 159 | th is.nonceVa lidity = n onceValidi ty; | |||||
160 | } | 160 | } | 160 | } | |||||
161 | 161 | 161 | ||||||||
162 | 162 | 162 | ||||||||
163 | public String ge tOpaque() { | 163 | public String ge tOpaque() { | 163 | public String ge tOpaque() { | |||||
164 | re turn opaqu e; | 164 | re turn opaqu e; | 164 | re turn opaqu e; | |||||
165 | } | 165 | } | 165 | } | |||||
166 | 166 | 166 | ||||||||
167 | 167 | 167 | ||||||||
168 | public void setO paque(Stri ng opaque) { | 168 | public void setO paque(Stri ng opaque) { | 168 | public void setO paque(Stri ng opaque) { | |||||
169 | th is.opaque = opaque; | 169 | th is.opaque = opaque; | 169 | th is.opaque = opaque; | |||||
170 | } | 170 | } | 170 | } | |||||
171 | 171 | 171 | ||||||||
172 | 172 | 172 | ||||||||
173 | public boolean i sValidateU ri() { | 173 | public boolean i sValidateU ri() { | 173 | public boolean i sValidateU ri() { | |||||
174 | re turn valid ateUri; | 174 | re turn valid ateUri; | 174 | re turn valid ateUri; | |||||
175 | } | 175 | } | 175 | } | |||||
176 | 176 | 176 | ||||||||
177 | 177 | 177 | ||||||||
178 | public void setV alidateUri (boolean v alidateUri ) { | 178 | public void setV alidateUri (boolean v alidateUri ) { | 178 | public void setV alidateUri (boolean v alidateUri ) { | |||||
179 | th is.validat eUri = val idateUri; | 179 | th is.validat eUri = val idateUri; | 179 | th is.validat eUri = val idateUri; | |||||
180 | } | 180 | } | 180 | } | |||||
181 | 181 | 181 | ||||||||
182 | 182 | 182 | ||||||||
183 | // --- ---------- ---------- ---------- ---------- ---------- ---- Publi c Methods | 183 | // --- ---------- ---------- ---------- ---------- ---------- ---- Publi c Methods | 183 | // --- ---------- ---------- ---------- ---------- ---------- ---- Publi c Methods | |||||
184 | 184 | 184 | ||||||||
185 | /** | 185 | /** | 185 | /** | |||||
186 | * Aut henticate the user m aking this request, based on t he specifi ed | 186 | * Aut henticate the user m aking this request, based on t he specifi ed | 186 | * Aut henticate the user m aking this request, based on t he specifi ed | |||||
187 | * log in configu ration. R eturn <cod e>true</co de> if any specified | 187 | * log in configu ration. R eturn <cod e>true</co de> if any specified | 187 | * log in configu ration. R eturn <cod e>true</co de> if any specified | |||||
188 | * con straint ha s been sat isfied, or <code>fal se</code> if we have | 188 | * con straint ha s been sat isfied, or <code>fal se</code> if we have | 188 | * con straint ha s been sat isfied, or <code>fal se</code> if we have | |||||
189 | * cre ated a res ponse chal lenge alre ady. | 189 | * cre ated a res ponse chal lenge alre ady. | 189 | * cre ated a res ponse chal lenge alre ady. | |||||
190 | * | 190 | * | 190 | * | |||||
191 | * @pa ram reques t Request we are pro cessing | 191 | * @pa ram reques t Request we are pro cessing | 191 | * @pa ram reques t Request we are pro cessing | |||||
192 | * @pa ram respon se Respons e we are c reating | 192 | * @pa ram respon se Respons e we are c reating | 192 | * @pa ram respon se Respons e we are c reating | |||||
193 | * | 193 | * | 193 | * | |||||
194 | * @ex ception IO Exception if an inpu t/output e rror occur s | 194 | * @ex ception IO Exception if an inpu t/output e rror occur s | 194 | * @ex ception IO Exception if an inpu t/output e rror occur s | |||||
195 | */ | 195 | */ | 195 | */ | |||||
196 | @Overr ide | 196 | @Overr ide | 196 | @Overr ide | |||||
197 |
p
ubli
c
|
197 | p rote c ted boolean doA uthenticat e(Request request, H ttpServlet Response r esponse) | 197 | protec ted boolea n doAuthen ticate(Req uest reque st, HttpSe rvletRespo nse respon se) | |||||
198 | throws I OException { | 198 | throws I OException { | 198 | throws I OException { | |||||
199 | 199 | 199 | ||||||||
200 | // NOTE: We don't try to reauthe nticate us ing any ex isting SSO session, | 200 | // NOTE: We don't try to reauthe nticate us ing any ex isting SSO session, | 200 | // NOTE: We don't try to reauthe nticate us ing any ex isting SSO session, | |||||
201 | // because t hat will o nly work i f the orig inal authe ntication was | 201 | // because t hat will o nly work i f the orig inal authe ntication was | 201 | // because t hat will o nly work i f the orig inal authe ntication was | |||||
202 | // BASIC or FORM, whic h are less secure th an the DIG EST auth-t ype | 202 | // BASIC or FORM, whic h are less secure th an the DIG EST auth-t ype | 202 | // BASIC or FORM, whic h are less secure th an the DIG EST auth-t ype | |||||
203 | // specified for this webapp | 203 | // specified for this webapp | 203 | // specified for this webapp | |||||
204 | // | 204 | // | 204 | // | |||||
205 | // Change to true belo w to allow previous FORM or BA SIC authen tications | 205 | // Change to true belo w to allow previous FORM or BA SIC authen tications | 205 | // Change to true belo w to allow previous FORM or BA SIC authen tications | |||||
206 | // to authen ticate use rs for thi s webapp | 206 | // to authen ticate use rs for thi s webapp | 206 | // to authen ticate use rs for thi s webapp | |||||
207 | // TODO make this a co nfigurable attribute (in Singl eSignOn??) | 207 | // TODO make this a co nfigurable attribute (in Singl eSignOn??) | 207 | // TODO make this a co nfigurable attribute (in Singl eSignOn??) | |||||
208 | if (checkFor CachedAuth entication (request, response, false)) { | 208 | if (checkFor CachedAuth entication (request, response, false)) { | 208 | if (checkFor CachedAuth entication (request, response, false)) { | |||||
209 | return t rue; | 209 | return t rue; | 209 | return t rue; | |||||
210 | } | 210 | } | 210 | } | |||||
211 | 211 | 211 | ||||||||
212 | // Validate any creden tials alre ady includ ed with th is request | 212 | // Validate any creden tials alre ady includ ed with th is request | 212 | // Validate any creden tials alre ady includ ed with th is request | |||||
213 | Pr incipal pr incipal = null; | 213 | Pr incipal pr incipal = null; | 213 | Pr incipal pr incipal = null; | |||||
214 | St ring autho rization = request.g etHeader(" authorizat ion"); | 214 | St ring autho rization = request.g etHeader(" authorizat ion"); | 214 | St ring autho rization = request.g etHeader(" authorizat ion"); | |||||
215 | Di gestInfo d igestInfo = new Dige stInfo(get Opaque(), getNonceVa lidity(), | 215 | Di gestInfo d igestInfo = new Dige stInfo(get Opaque(), getNonceVa lidity(), | 215 | Di gestInfo d igestInfo = new Dige stInfo(get Opaque(), getNonceVa lidity(), | |||||
216 | getK ey(), nonc es, isVali dateUri()) ; | 216 | getK ey(), nonc es, isVali dateUri()) ; | 216 | getK ey(), nonc es, isVali dateUri()) ; | |||||
217 | if (authoriz ation != n ull) { | 217 | if (authoriz ation != n ull) { | 217 | if (authoriz ation != n ull) { | |||||
218 | if (dige stInfo.par se(request , authoriz ation)) { | 218 | if (dige stInfo.par se(request , authoriz ation)) { | 218 | if (dige stInfo.par se(request , authoriz ation)) { | |||||
219 | if ( digestInfo .validate( request)) { | 219 | if ( digestInfo .validate( request)) { | 219 | if ( digestInfo .validate( request)) { | |||||
220 | principal = digestIn fo.authent icate(cont ext.getRea lm()); | 220 | principal = digestIn fo.authent icate(cont ext.getRea lm()); | 220 | principal = digestIn fo.authent icate(cont ext.getRea lm()); | |||||
221 | } | 221 | } | 221 | } | |||||
222 | 222 | 222 | ||||||||
223 | if ( principal != null && !digestIn fo.isNonce Stale()) { | 223 | if ( principal != null && !digestIn fo.isNonce Stale()) { | 223 | if ( principal != null && !digestIn fo.isNonce Stale()) { | |||||
224 | register(r equest, re sponse, pr incipal, | 224 | register(r equest, re sponse, pr incipal, | 224 | register(r equest, re sponse, pr incipal, | |||||
225 | Ht tpServletR equest.DIG EST_AUTH, | 225 | Ht tpServletR equest.DIG EST_AUTH, | 225 | Ht tpServletR equest.DIG EST_AUTH, | |||||
226 | di gestInfo.g etUsername (), null); | 226 | di gestInfo.g etUsername (), null); | 226 | di gestInfo.g etUsername (), null); | |||||
227 | return tru e; | 227 | return tru e; | 227 | return tru e; | |||||
228 | } | 228 | } | 228 | } | |||||
229 | } | 229 | } | 229 | } | |||||
230 | } | 230 | } | 230 | } | |||||
231 | 231 | 231 | ||||||||
232 | // Send an " unauthoriz ed" respon se and an appropriat e challeng e | 232 | // Send an " unauthoriz ed" respon se and an appropriat e challeng e | 232 | // Send an " unauthoriz ed" respon se and an appropriat e challeng e | |||||
233 | 233 | 233 | ||||||||
234 | // Next, gen erate a no nce token (that is a token whi ch is supp osed | 234 | // Next, gen erate a no nce token (that is a token whi ch is supp osed | 234 | // Next, gen erate a no nce token (that is a token whi ch is supp osed | |||||
235 | // to be uni que). | 235 | // to be uni que). | 235 | // to be uni que). | |||||
236 | St ring nonce = generat eNonce(req uest); | 236 | St ring nonce = generat eNonce(req uest); | 236 | St ring nonce = generat eNonce(req uest); | |||||
237 | 237 | 237 | ||||||||
238 | se tAuthentic ateHeader( request, r esponse, n once, | 238 | se tAuthentic ateHeader( request, r esponse, n once, | 238 | se tAuthentic ateHeader( request, r esponse, n once, | |||||
239 | prin cipal != n ull && dig estInfo.is NonceStale ()); | 239 | prin cipal != n ull && dig estInfo.is NonceStale ()); | 239 | prin cipal != n ull && dig estInfo.is NonceStale ()); | |||||
240 | re sponse.sen dError(Htt pServletRe sponse.SC_ UNAUTHORIZ ED); | 240 | re sponse.sen dError(Htt pServletRe sponse.SC_ UNAUTHORIZ ED); | 240 | re sponse.sen dError(Htt pServletRe sponse.SC_ UNAUTHORIZ ED); | |||||
241 | re turn false ; | 241 | re turn false ; | 241 | re turn false ; | |||||
242 | } | 242 | } | 242 | } | |||||
243 | 243 | 243 | ||||||||
244 | 244 | 244 | ||||||||
245 | @Overr ide | 245 | @Overr ide | 245 | @Overr ide | |||||
246 | protec ted String getAuthMe thod() { | 246 | protec ted String getAuthMe thod() { | 246 | protec ted String getAuthMe thod() { | |||||
247 | re turn HttpS ervletRequ est.DIGEST _AUTH; | 247 | re turn HttpS ervletRequ est.DIGEST _AUTH; | 247 | re turn HttpS ervletRequ est.DIGEST _AUTH; | |||||
248 | } | 248 | } | 248 | } | |||||
249 | 249 | 249 | ||||||||
250 | 250 | 250 | ||||||||
251 | // --- ---------- ---------- ---------- ---------- ---------- - Protecte d Methods | 251 | // --- ---------- ---------- ---------- ---------- ---------- - Protecte d Methods | 251 | // --- ---------- ---------- ---------- ---------- ---------- - Protecte d Methods | |||||
252 | 252 | 252 | ||||||||
253 | 253 | 253 | ||||||||
254 | /** | 254 | /** | 254 | /** | |||||
255 | * Rem oves the q uotes on a string. R FC2617 sta tes quotes are optio nal for | 255 | * Rem oves the q uotes on a string. R FC2617 sta tes quotes are optio nal for | 255 | * Rem oves the q uotes on a string. R FC2617 sta tes quotes are optio nal for | |||||
256 | * all parameter s except r ealm. | 256 | * all parameter s except r ealm. | 256 | * all parameter s except r ealm. | |||||
257 | * | 257 | * | |||||||
258 | * @pa ram quoted String The quoted st ring | 258 | * @pa ram quoted String The quoted st ring | |||||||
259 | * @pa ram quotes Required < code>true< /code> if quotes wer e required | 259 | * @pa ram quotes Required < code>true< /code> if quotes wer e required | |||||||
260 | * @re turn The u nquoted st ring | 260 | * @re turn The u nquoted st ring | |||||||
257 | */ | 261 | */ | 261 | */ | |||||
258 | protec ted static String re moveQuotes (String qu otedString , | 262 | protec ted static String re moveQuotes (String qu otedString , | 262 | protec ted static String re moveQuotes (String qu otedString , | |||||
259 | boolean q uotesRequi red) { | 263 | boolean q uotesRequi red) { | 263 | boolean q uotesRequi red) { | |||||
260 | // support bo th quoted and non-qu oted | 264 | // support bo th quoted and non-qu oted | 264 | // support bo th quoted and non-qu oted | |||||
261 | if (quotedSt ring.lengt h() > 0 && quotedStr ing.charAt (0) != '"' && | 265 | if (quotedSt ring.lengt h() > 0 && quotedStr ing.charAt (0) != '"' && | 265 | if (quotedSt ring.lengt h() > 0 && quotedStr ing.charAt (0) != '"' && | |||||
262 | !quo tesRequire d) { | 266 | !quo tesRequire d) { | 266 | !quo tesRequire d) { | |||||
263 | return q uotedStrin g; | 267 | return q uotedStrin g; | 267 | return q uotedStrin g; | |||||
264 | } else if (q uotedStrin g.length() > 2) { | 268 | } else if (q uotedStrin g.length() > 2) { | 268 | } else if (q uotedStrin g.length() > 2) { | |||||
265 | return q uotedStrin g.substrin g(1, quote dString.le ngth() - 1 ); | 269 | return q uotedStrin g.substrin g(1, quote dString.le ngth() - 1 ); | 269 | return q uotedStrin g.substrin g(1, quote dString.le ngth() - 1 ); | |||||
266 | } else { | 270 | } else { | 270 | } else { | |||||
267 | return " "; | 271 | return " "; | 271 | return " "; | |||||
268 | } | 272 | } | 272 | } | |||||
269 | } | 273 | } | 273 | } | |||||
270 | 274 | 274 | ||||||||
271 | /** | 275 | /** | 275 | /** | |||||
272 | * Rem oves the q uotes on a string. | 276 | * Rem oves the q uotes on a string. | 276 | * Rem oves the q uotes on a string. | |||||
277 | * | 277 | * | |||||||
278 | * @pa ram quoted String The quoted st ring | 278 | * @pa ram quoted String The quoted st ring | |||||||
279 | * @re turn The u nquoted st ring | 279 | * @re turn The u nquoted st ring | |||||||
273 | */ | 280 | */ | 280 | */ | |||||
274 | protec ted static String re moveQuotes (String qu otedString ) { | 281 | protec ted static String re moveQuotes (String qu otedString ) { | 281 | protec ted static String re moveQuotes (String qu otedString ) { | |||||
275 | re turn remov eQuotes(qu otedString , false); | 282 | re turn remov eQuotes(qu otedString , false); | 282 | re turn remov eQuotes(qu otedString , false); | |||||
276 | } | 283 | } | 283 | } | |||||
277 | 284 | 284 | ||||||||
278 | /** | 285 | /** | 285 | /** | |||||
279 | * Gen erate a un ique token . The toke n is gener ated accor ding to th e | 286 | * Gen erate a un ique token . The toke n is gener ated accor ding to th e | 286 | * Gen erate a un ique token . The toke n is gener ated accor ding to th e | |||||
280 | * fol lowing pat tern. NOnc eToken = B ase64 ( MD 5 ( client -IP ":" | 287 | * fol lowing pat tern. NOnc eToken = B ase64 ( MD 5 ( client -IP ":" | 287 | * fol lowing pat tern. NOnc eToken = B ase64 ( MD 5 ( client -IP ":" | |||||
281 | * tim e-stamp ": " private- key ) ). | 288 | * tim e-stamp ": " private- key ) ). | 288 | * tim e-stamp ": " private- key ) ). | |||||
282 | * | 289 | * | 289 | * | |||||
283 | * @pa ram reques t HTTP Ser vlet reque st | 290 | * @pa ram reques t HTTP Ser vlet reque st | 290 | * @pa ram reques t HTTP Ser vlet reque st | |||||
291 | * @re turn The g enerated n once | 291 | * @re turn The g enerated n once | |||||||
284 | */ | 292 | */ | 292 | */ | |||||
285 | protec ted String generateN once(Reque st request ) { | 293 | protec ted String generateN once(Reque st request ) { | 293 | protec ted String generateN once(Reque st request ) { | |||||
286 | 294 | 294 | ||||||||
287 | lo ng current Time = Sys tem.curren tTimeMilli s(); | 295 | lo ng current Time = Sys tem.curren tTimeMilli s(); | 295 | lo ng current Time = Sys tem.curren tTimeMilli s(); | |||||
288 | 296 | 296 | ||||||||
289 | sy nchronized (lastTime stampLock) { | 297 | sy nchronized (lastTime stampLock) { | 297 | sy nchronized (lastTime stampLock) { | |||||
290 | if (curr entTime > lastTimest amp) { | 298 | if (curr entTime > lastTimest amp) { | 298 | if (curr entTime > lastTimest amp) { | |||||
291 | last Timestamp = currentT ime; | 299 | last Timestamp = currentT ime; | 299 | last Timestamp = currentT ime; | |||||
292 | } else { | 300 | } else { | 300 | } else { | |||||
293 | curr entTime = ++lastTime stamp; | 301 | curr entTime = ++lastTime stamp; | 301 | curr entTime = ++lastTime stamp; | |||||
294 | } | 302 | } | 302 | } | |||||
295 | } | 303 | } | 303 | } | |||||
296 | 304 | 304 | ||||||||
297 | St ring ipTim eKey = | 305 | St ring ipTim eKey = | 305 | St ring ipTim eKey = | |||||
298 | request. getRemoteA ddr() + ": " + curren tTime + ": " + getKey (); | 306 | request. getRemoteA ddr() + ": " + curren tTime + ": " + getKey (); | 306 | request. getRemoteA ddr() + ": " + curren tTime + ": " + getKey (); | |||||
299 | 307 | 307 | ||||||||
300 | by te[] buffe r = Concur rentMessag eDigest.di gestMD5( | 308 | by te[] buffe r = Concur rentMessag eDigest.di gestMD5( | 308 | by te[] buffe r = Concur rentMessag eDigest.di gestMD5( | |||||
301 | ipTi meKey.getB ytes(Stand ardCharset s.ISO_8859 _1)); | 309 | ipTi meKey.getB ytes(Stand ardCharset s.ISO_8859 _1)); | 309 | ipTi meKey.getB ytes(Stand ardCharset s.ISO_8859 _1)); | |||||
302 | St ring nonce = current Time + ":" + MD5Enco der.encode (buffer); | 310 | St ring nonce = current Time + ":" + MD5Enco der.encode (buffer); | 310 | St ring nonce = current Time + ":" + MD5Enco der.encode (buffer); | |||||
303 | 311 | 311 | ||||||||
304 | No nceInfo in fo = new N onceInfo(c urrentTime , getNonce CountWindo wSize()); | 312 | No nceInfo in fo = new N onceInfo(c urrentTime , getNonce CountWindo wSize()); | 312 | No nceInfo in fo = new N onceInfo(c urrentTime , getNonce CountWindo wSize()); | |||||
305 | sy nchronized (nonces) { | 313 | sy nchronized (nonces) { | 313 | sy nchronized (nonces) { | |||||
306 | nonces.p ut(nonce, info); | 314 | nonces.p ut(nonce, info); | 314 | nonces.p ut(nonce, info); | |||||
307 | } | 315 | } | 315 | } | |||||
308 | 316 | 316 | ||||||||
309 | re turn nonce ; | 317 | re turn nonce ; | 317 | re turn nonce ; | |||||
310 | } | 318 | } | 318 | } | |||||
311 | 319 | 319 | ||||||||
312 | 320 | 320 | ||||||||
313 | /** | 321 | /** | 321 | /** | |||||
314 | * Gen erates the WWW-Authe nticate he ader. | 322 | * Gen erates the WWW-Authe nticate he ader. | 322 | * Gen erates the WWW-Authe nticate he ader. | |||||
315 | * <p> | 323 | * <p> | 323 | * <p> | |||||
316 | * The header MU ST follow this templ ate : | 324 | * The header MU ST follow this templ ate : | 324 | * The header MU ST follow this templ ate : | |||||
317 | * <pr e> | 325 | * <pr e> | 325 | * <pr e> | |||||
318 | * WWW-Auth enticate = "WWW-A uthenticat e" ":" "Di gest" | 326 | * WWW-Auth enticate = "WWW-A uthenticat e" ":" "Di gest" | 326 | * WWW-Auth enticate = "WWW-A uthenticat e" ":" "Di gest" | |||||
319 | * digest -challenge | 327 | * digest -challenge | 327 | * digest -challenge | |||||
320 | * | 328 | * | 328 | * | |||||
321 | * digest-c hallenge = 1#( re alm | [ do main ] | n once | | 329 | * digest-c hallenge = 1#( re alm | [ do main ] | n once | | 329 | * digest-c hallenge = 1#( re alm | [ do main ] | n once | | |||||
322 | * [ dige st-opaque ] |[ stale ] | [ alg orithm ] ) | 330 | * [ dige st-opaque ] |[ stale ] | [ alg orithm ] ) | 330 | * [ dige st-opaque ] |[ stale ] | [ alg orithm ] ) | |||||
323 | * | 331 | * | 331 | * | |||||
324 | * realm = "realm " "=" real m-value | 332 | * realm = "realm " "=" real m-value | 332 | * realm = "realm " "=" real m-value | |||||
325 | * realm-va lue = quoted -string | 333 | * realm-va lue = quoted -string | 333 | * realm-va lue = quoted -string | |||||
326 | * domain = "domai n" "=" < ;"> 1#U RI <"&g t; | 334 | * domain = "domai n" "=" < ;"> 1#U RI <"&g t; | 334 | * domain = "domai n" "=" < ;"> 1#U RI <"&g t; | |||||
327 | * nonce = "nonce " "=" nonc e-value | 335 | * nonce = "nonce " "=" nonc e-value | 335 | * nonce = "nonce " "=" nonc e-value | |||||
328 | * nonce-va lue = quoted -string | 336 | * nonce-va lue = quoted -string | 336 | * nonce-va lue = quoted -string | |||||
329 | * opaque = "opaqu e" "=" quo ted-string | 337 | * opaque = "opaqu e" "=" quo ted-string | 337 | * opaque = "opaqu e" "=" quo ted-string | |||||
330 | * stale = "stale " "=" ( "t rue" | "fa lse" ) | 338 | * stale = "stale " "=" ( "t rue" | "fa lse" ) | 338 | * stale = "stale " "=" ( "t rue" | "fa lse" ) | |||||
331 | * algorith m = "algor ithm" "=" ( "MD5" | token ) | 339 | * algorith m = "algor ithm" "=" ( "MD5" | token ) | 339 | * algorith m = "algor ithm" "=" ( "MD5" | token ) | |||||
332 | * </p re> | 340 | * </p re> | 340 | * </p re> | |||||
333 | * | 341 | * | 341 | * | |||||
334 | * @pa ram reques t HTTP Ser vlet reque st | 342 | * @pa ram reques t HTTP Ser vlet reque st | 342 | * @pa ram reques t HTTP Ser vlet reque st | |||||
335 | * @pa ram respon se HTTP Se rvlet resp onse | 343 | * @pa ram respon se HTTP Se rvlet resp onse | 343 | * @pa ram respon se HTTP Se rvlet resp onse | |||||
336 | * @pa ram nonce nonce toke n | 344 | * @pa ram nonce nonce toke n | 344 | * @pa ram nonce nonce toke n | |||||
345 | * @pa ram isNonc eStale <co de>true</c ode> to ad d a stale parameter | 345 | * @pa ram isNonc eStale <co de>true</c ode> to ad d a stale parameter | |||||||
337 | */ | 346 | */ | 346 | */ | |||||
338 | protec ted void s etAuthenti cateHeader (HttpServl etRequest request, | 347 | protec ted void s etAuthenti cateHeader (HttpServl etRequest request, | 347 | protec ted void s etAuthenti cateHeader (HttpServl etRequest request, | |||||
339 | HttpServl etResponse response, | 348 | HttpServl etResponse response, | 348 | HttpServl etResponse response, | |||||
340 | String no nce, | 349 | String no nce, | 349 | String no nce, | |||||
341 | boolean i sNonceStal e) { | 350 | boolean i sNonceStal e) { | 350 | boolean i sNonceStal e) { | |||||
342 | 351 | 351 | ||||||||
343 | St ring realm Name = get RealmName( context); | 352 | St ring realm Name = get RealmName( context); | 352 | St ring realm Name = get RealmName( context); | |||||
344 | 353 | 353 | ||||||||
345 | St ring authe nticateHea der; | 354 | St ring authe nticateHea der; | 354 | St ring authe nticateHea der; | |||||
346 | if (isNonceS tale) { | 355 | if (isNonceS tale) { | 355 | if (isNonceS tale) { | |||||
347 | authenti cateHeader = "Digest realm=\"" + realmNa me + "\", " + | 356 | authenti cateHeader = "Digest realm=\"" + realmNa me + "\", " + | 356 | authenti cateHeader = "Digest realm=\"" + realmNa me + "\", " + | |||||
348 | "qop=\"" + QOP + " \", nonce= \"" + nonc e + "\", " + "opaque =\"" + | 357 | "qop=\"" + QOP + " \", nonce= \"" + nonc e + "\", " + "opaque =\"" + | 357 | "qop=\"" + QOP + " \", nonce= \"" + nonc e + "\", " + "opaque =\"" + | |||||
349 | getOpaqu e() + "\", stale=tru e"; | 358 | getOpaqu e() + "\", stale=tru e"; | 358 | getOpaqu e() + "\", stale=tru e"; | |||||
350 | } else { | 359 | } else { | 359 | } else { | |||||
351 | authenti cateHeader = "Digest realm=\"" + realmNa me + "\", " + | 360 | authenti cateHeader = "Digest realm=\"" + realmNa me + "\", " + | 360 | authenti cateHeader = "Digest realm=\"" + realmNa me + "\", " + | |||||
352 | "qop=\"" + QOP + " \", nonce= \"" + nonc e + "\", " + "opaque =\"" + | 361 | "qop=\"" + QOP + " \", nonce= \"" + nonc e + "\", " + "opaque =\"" + | 361 | "qop=\"" + QOP + " \", nonce= \"" + nonc e + "\", " + "opaque =\"" + | |||||
353 | getOpaqu e() + "\"" ; | 362 | getOpaqu e() + "\"" ; | 362 | getOpaqu e() + "\"" ; | |||||
354 | } | 363 | } | 363 | } | |||||
355 | 364 | 364 | ||||||||
356 | re sponse.set Header(AUT H_HEADER_N AME, authe nticateHea der); | 365 | re sponse.set Header(AUT H_HEADER_N AME, authe nticateHea der); | 365 | re sponse.set Header(AUT H_HEADER_N AME, authe nticateHea der); | |||||
357 | 366 | 366 | ||||||||
358 | } | 367 | } | 367 | } | |||||
359 | 368 | 368 | ||||||||
360 | 369 | 369 | ||||||||
361 | // --- ---------- ---------- ---------- ---------- ---------- -- Lifecyc le Methods | 370 | // --- ---------- ---------- ---------- ---------- ---------- -- Lifecyc le Methods | 370 | // --- ---------- ---------- ---------- ---------- ---------- -- Lifecyc le Methods | |||||
362 | 371 | 371 | ||||||||
363 | @Overr ide | 372 | @Overr ide | 372 | @Overr ide | |||||
364 | protec ted synchr onized voi d startInt ernal() th rows Lifec ycleExcept ion { | 373 | protec ted synchr onized voi d startInt ernal() th rows Lifec ycleExcept ion { | 373 | protec ted synchr onized voi d startInt ernal() th rows Lifec ycleExcept ion { | |||||
365 | su per.startI nternal(); | 374 | su per.startI nternal(); | 374 | su per.startI nternal(); | |||||
366 | 375 | 375 | ||||||||
367 | // Generate a random s ecret key | 376 | // Generate a random s ecret key | 376 | // Generate a random s ecret key | |||||
368 | if (getKey() == null) { | 377 | if (getKey() == null) { | 377 | if (getKey() == null) { | |||||
369 | setKey(s essionIdGe nerator.ge nerateSess ionId()); | 378 | setKey(s essionIdGe nerator.ge nerateSess ionId()); | 378 | setKey(s essionIdGe nerator.ge nerateSess ionId()); | |||||
370 | } | 379 | } | 379 | } | |||||
371 | 380 | 380 | ||||||||
372 | // Generate the opaque string th e same way | 381 | // Generate the opaque string th e same way | 381 | // Generate the opaque string th e same way | |||||
373 | if (getOpaqu e() == nul l) { | 382 | if (getOpaqu e() == nul l) { | 382 | if (getOpaqu e() == nul l) { | |||||
374 | setOpaqu e(sessionI dGenerator .generateS essionId() ); | 383 | setOpaqu e(sessionI dGenerator .generateS essionId() ); | 383 | setOpaqu e(sessionI dGenerator .generateS essionId() ); | |||||
375 | } | 384 | } | 384 | } | |||||
376 | 385 | 385 | ||||||||
377 | no nces = new LinkedHas hMap<Strin g, DigestA uthenticat or.NonceIn fo>() { | 386 | no nces = new LinkedHas hMap<Strin g, DigestA uthenticat or.NonceIn fo>() { | 386 | no nces = new LinkedHas hMap<Strin g, DigestA uthenticat or.NonceIn fo>() { | |||||
378 | 387 | 387 | ||||||||
379 | private static fin al long se rialVersio nUID = 1L; | 388 | private static fin al long se rialVersio nUID = 1L; | 388 | private static fin al long se rialVersio nUID = 1L; | |||||
380 | private static fin al long LO G_SUPPRESS _TIME = 5 * 60 * 100 0; | 389 | private static fin al long LO G_SUPPRESS _TIME = 5 * 60 * 100 0; | 389 | private static fin al long LO G_SUPPRESS _TIME = 5 * 60 * 100 0; | |||||
381 | 390 | 390 | ||||||||
382 | private long lastL og = 0; | 391 | private long lastL og = 0; | 391 | private long lastL og = 0; | |||||
383 | 392 | 392 | ||||||||
384 | @Overrid e | 393 | @Overrid e | 393 | @Overrid e | |||||
385 | protecte d boolean removeElde stEntry( | 394 | protecte d boolean removeElde stEntry( | 394 | protecte d boolean removeElde stEntry( | |||||
386 | Map.Entry< String,Non ceInfo> el dest) { | 395 | Map.Entry< String,Non ceInfo> el dest) { | 395 | Map.Entry< String,Non ceInfo> el dest) { | |||||
387 | // T his is cal led from a sync so k eep it sim ple | 396 | // T his is cal led from a sync so k eep it sim ple | 396 | // T his is cal led from a sync so k eep it sim ple | |||||
388 | long currentTi me = Syste m.currentT imeMillis( ); | 397 | long currentTi me = Syste m.currentT imeMillis( ); | 397 | long currentTi me = Syste m.currentT imeMillis( ); | |||||
389 | if ( size() > g etNonceCac heSize()) { | 398 | if ( size() > g etNonceCac heSize()) { | 398 | if ( size() > g etNonceCac heSize()) { | |||||
390 | if (lastLo g < curren tTime && | 399 | if (lastLo g < curren tTime && | 399 | if (lastLo g < curren tTime && | |||||
391 | cu rrentTime - eldest.g etValue(). getTimesta mp() < | 400 | cu rrentTime - eldest.g etValue(). getTimesta mp() < | 400 | cu rrentTime - eldest.g etValue(). getTimesta mp() < | |||||
392 | ge tNonceVali dity()) { | 401 | ge tNonceVali dity()) { | 401 | ge tNonceVali dity()) { | |||||
393 | // Rep lay attack is possib le | 402 | // Rep lay attack is possib le | 402 | // Rep lay attack is possib le | |||||
394 | log.wa rn(sm.getS tring( | 403 | log.wa rn(sm.getS tring( | 403 | log.wa rn(sm.getS tring( | |||||
395 | "digestA uthenticat or.cacheRe move")); | 404 | "digestA uthenticat or.cacheRe move")); | 404 | "digestA uthenticat or.cacheRe move")); | |||||
396 | lastLo g = curren tTime + LO G_SUPPRESS _TIME; | 405 | lastLo g = curren tTime + LO G_SUPPRESS _TIME; | 405 | lastLo g = curren tTime + LO G_SUPPRESS _TIME; | |||||
397 | } | 406 | } | 406 | } | |||||
398 | return tru e; | 407 | return tru e; | 407 | return tru e; | |||||
399 | } | 408 | } | 408 | } | |||||
400 | retu rn false; | 409 | retu rn false; | 409 | retu rn false; | |||||
401 | } | 410 | } | 410 | } | |||||
402 | }; | 411 | }; | 411 | }; | |||||
403 | } | 412 | } | 412 | } | |||||
404 | 413 | 413 | ||||||||
405 | p r i vate static cl ass Digest Info { | 414 | p ubl i c static cl ass Digest Info { | 414 | public static cl ass Digest Info { | |||||
406 | 415 | 415 | ||||||||
407 | pr ivate fina l String o paque; | 416 | pr ivate fina l String o paque; | 416 | pr ivate fina l String o paque; | |||||
408 | pr ivate fina l long non ceValidity ; | 417 | pr ivate fina l long non ceValidity ; | 417 | pr ivate fina l long non ceValidity ; | |||||
409 | pr ivate fina l String k ey; | 418 | pr ivate fina l String k ey; | 418 | pr ivate fina l String k ey; | |||||
410 | pr ivate fina l Map<Stri ng,NonceIn fo> nonces ; | 419 | pr ivate fina l Map<Stri ng,NonceIn fo> nonces ; | 419 | pr ivate fina l Map<Stri ng,NonceIn fo> nonces ; | |||||
411 | pr ivate bool ean valida teUri = tr ue; | 420 | pr ivate bool ean valida teUri = tr ue; | 420 | pr ivate bool ean valida teUri = tr ue; | |||||
412 | 421 | 421 | ||||||||
413 | pr ivate Stri ng userNam e = null; | 422 | pr ivate Stri ng userNam e = null; | 422 | pr ivate Stri ng userNam e = null; | |||||
414 | pr ivate Stri ng method = null; | 423 | pr ivate Stri ng method = null; | 423 | pr ivate Stri ng method = null; | |||||
415 | pr ivate Stri ng uri = n ull; | 424 | pr ivate Stri ng uri = n ull; | 424 | pr ivate Stri ng uri = n ull; | |||||
416 | pr ivate Stri ng respons e = null; | 425 | pr ivate Stri ng respons e = null; | 425 | pr ivate Stri ng respons e = null; | |||||
417 | pr ivate Stri ng nonce = null; | 426 | pr ivate Stri ng nonce = null; | 426 | pr ivate Stri ng nonce = null; | |||||
418 | pr ivate Stri ng nc = nu ll; | 427 | pr ivate Stri ng nc = nu ll; | 427 | pr ivate Stri ng nc = nu ll; | |||||
419 | pr ivate Stri ng cnonce = null; | 428 | pr ivate Stri ng cnonce = null; | 428 | pr ivate Stri ng cnonce = null; | |||||
420 | pr ivate Stri ng realmNa me = null; | 429 | pr ivate Stri ng realmNa me = null; | 429 | pr ivate Stri ng realmNa me = null; | |||||
421 | pr ivate Stri ng qop = n ull; | 430 | pr ivate Stri ng qop = n ull; | 430 | pr ivate Stri ng qop = n ull; | |||||
422 | pr ivate Stri ng opaqueR eceived = null; | 431 | pr ivate Stri ng opaqueR eceived = null; | 431 | pr ivate Stri ng opaqueR eceived = null; | |||||
423 | 432 | 432 | ||||||||
424 | pr ivate bool ean nonceS tale = fal se; | 433 | pr ivate bool ean nonceS tale = fal se; | 433 | pr ivate bool ean nonceS tale = fal se; | |||||
425 | 434 | 434 | ||||||||
426 | 435 | 435 | ||||||||
427 | pu blic Diges tInfo(Stri ng opaque, long nonc eValidity, String ke y, | 436 | pu blic Diges tInfo(Stri ng opaque, long nonc eValidity, String ke y, | 436 | pu blic Diges tInfo(Stri ng opaque, long nonc eValidity, String ke y, | |||||
428 | Map< String,Non ceInfo> no nces, bool ean valida teUri) { | 437 | Map< String,Non ceInfo> no nces, bool ean valida teUri) { | 437 | Map< String,Non ceInfo> no nces, bool ean valida teUri) { | |||||
429 | this.opa que = opaq ue; | 438 | this.opa que = opaq ue; | 438 | this.opa que = opaq ue; | |||||
430 | this.non ceValidity = nonceVa lidity; | 439 | this.non ceValidity = nonceVa lidity; | 439 | this.non ceValidity = nonceVa lidity; | |||||
431 | this.key = key; | 440 | this.key = key; | 440 | this.key = key; | |||||
432 | this.non ces = nonc es; | 441 | this.non ces = nonc es; | 441 | this.non ces = nonc es; | |||||
433 | this.val idateUri = validateU ri; | 442 | this.val idateUri = validateU ri; | 442 | this.val idateUri = validateU ri; | |||||
434 | } | 443 | } | 443 | } | |||||
435 | 444 | 444 | ||||||||
436 | 445 | 445 | ||||||||
437 | pu blic Strin g getUsern ame() { | 446 | pu blic Strin g getUsern ame() { | 446 | pu blic Strin g getUsern ame() { | |||||
438 | return u serName; | 447 | return u serName; | 447 | return u serName; | |||||
439 | } | 448 | } | 448 | } | |||||
440 | 449 | 449 | ||||||||
441 | 450 | 450 | ||||||||
442 | pu blic boole an parse(R equest req uest, Stri ng authori zation) { | 451 | pu blic boole an parse(R equest req uest, Stri ng authori zation) { | 451 | pu blic boole an parse(R equest req uest, Stri ng authori zation) { | |||||
443 | // Valid ate the au thorizatio n credenti als format | 452 | // Valid ate the au thorizatio n credenti als format | 452 | // Valid ate the au thorizatio n credenti als format | |||||
444 | if (auth orization == null) { | 453 | if (auth orization == null) { | 453 | if (auth orization == null) { | |||||
445 | retu rn false; | 454 | retu rn false; | 454 | retu rn false; | |||||
446 | } | 455 | } | 455 | } | |||||
447 | 456 | 456 | ||||||||
448 | Map<Stri ng,String> directive s; | 457 | Map<Stri ng,String> directive s; | 457 | Map<Stri ng,String> directive s; | |||||
449 | try { | 458 | try { | 458 | try { | |||||
450 | dire ctives = A uthorizati on.parseAu thorizatio nDigest( | 459 | dire ctives = A uthorizati on.parseAu thorizatio nDigest( | 459 | dire ctives = A uthorizati on.parseAu thorizatio nDigest( | |||||
451 | new St ringReader (authoriza tion)); | 460 | new St ringReader (authoriza tion)); | 460 | new St ringReader (authoriza tion)); | |||||
452 | } catch (IOExcepti on e) { | 461 | } catch (IOExcepti on e) { | 461 | } catch (IOExcepti on e) { | |||||
453 | retu rn false; | 462 | retu rn false; | 462 | retu rn false; | |||||
454 | } | 463 | } | 463 | } | |||||
455 | 464 | 464 | ||||||||
456 | if (dire ctives == null) { | 465 | if (dire ctives == null) { | 465 | if (dire ctives == null) { | |||||
457 | retu rn false; | 466 | retu rn false; | 466 | retu rn false; | |||||
458 | } | 467 | } | 467 | } | |||||
459 | 468 | 468 | ||||||||
460 | method = request.g etMethod() ; | 469 | method = request.g etMethod() ; | 469 | method = request.g etMethod() ; | |||||
461 | userName = directi ves.get("u sername"); | 470 | userName = directi ves.get("u sername"); | 470 | userName = directi ves.get("u sername"); | |||||
462 | realmNam e = direct ives.get(" realm"); | 471 | realmNam e = direct ives.get(" realm"); | 471 | realmNam e = direct ives.get(" realm"); | |||||
463 | nonce = directives .get("nonc e"); | 472 | nonce = directives .get("nonc e"); | 472 | nonce = directives .get("nonc e"); | |||||
464 | nc = dir ectives.ge t("nc"); | 473 | nc = dir ectives.ge t("nc"); | 473 | nc = dir ectives.ge t("nc"); | |||||
465 | cnonce = directive s.get("cno nce"); | 474 | cnonce = directive s.get("cno nce"); | 474 | cnonce = directive s.get("cno nce"); | |||||
466 | qop = di rectives.g et("qop"); | 475 | qop = di rectives.g et("qop"); | 475 | qop = di rectives.g et("qop"); | |||||
467 | uri = di rectives.g et("uri"); | 476 | uri = di rectives.g et("uri"); | 476 | uri = di rectives.g et("uri"); | |||||
468 | response = directi ves.get("r esponse"); | 477 | response = directi ves.get("r esponse"); | 477 | response = directi ves.get("r esponse"); | |||||
469 | opaqueRe ceived = d irectives. get("opaqu e"); | 478 | opaqueRe ceived = d irectives. get("opaqu e"); | 478 | opaqueRe ceived = d irectives. get("opaqu e"); | |||||
470 | 479 | 479 | ||||||||
471 | return t rue; | 480 | return t rue; | 480 | return t rue; | |||||
472 | } | 481 | } | 481 | } | |||||
473 | 482 | 482 | ||||||||
474 | pu blic boole an validat e(Request request) { | 483 | pu blic boole an validat e(Request request) { | 483 | pu blic boole an validat e(Request request) { | |||||
475 | if ( (us erName == null) || ( realmName == null) | | (nonce = = null) | 484 | if ( (us erName == null) || ( realmName == null) | | (nonce = = null) | 484 | if ( (us erName == null) || ( realmName == null) | | (nonce = = null) | |||||
476 | || (uri == nu ll) || (re sponse == null) ) { | 485 | || (uri == nu ll) || (re sponse == null) ) { | 485 | || (uri == nu ll) || (re sponse == null) ) { | |||||
477 | retu rn false; | 486 | retu rn false; | 486 | retu rn false; | |||||
478 | } | 487 | } | 487 | } | |||||
479 | 488 | 488 | ||||||||
480 | // Valid ate the UR I - should match the request l ine sent b y client | 489 | // Valid ate the UR I - should match the request l ine sent b y client | 489 | // Valid ate the UR I - should match the request l ine sent b y client | |||||
481 | if (vali dateUri) { | 490 | if (vali dateUri) { | 490 | if (vali dateUri) { | |||||
482 | Stri ng uriQuer y; | 491 | Stri ng uriQuer y; | 491 | Stri ng uriQuer y; | |||||
483 | Stri ng query = request.g etQueryStr ing(); | 492 | Stri ng query = request.g etQueryStr ing(); | 492 | Stri ng query = request.g etQueryStr ing(); | |||||
484 | if ( query == n ull) { | 493 | if ( query == n ull) { | 493 | if ( query == n ull) { | |||||
485 | uriQuery = request.g etRequestU RI(); | 494 | uriQuery = request.g etRequestU RI(); | 494 | uriQuery = request.g etRequestU RI(); | |||||
486 | } el se { | 495 | } el se { | 495 | } el se { | |||||
487 | uriQuery = request.g etRequestU RI() + "?" + query; | 496 | uriQuery = request.g etRequestU RI() + "?" + query; | 496 | uriQuery = request.g etRequestU RI() + "?" + query; | |||||
488 | } | 497 | } | 497 | } | |||||
489 | if ( !uri.equal s(uriQuery )) { | 498 | if ( !uri.equal s(uriQuery )) { | 498 | if ( !uri.equal s(uriQuery )) { | |||||
490 | // Some cl ients (old er Android ) use an a bsolute UR I for | 499 | // Some cl ients (old er Android ) use an a bsolute UR I for | 499 | // Some cl ients (old er Android ) use an a bsolute UR I for | |||||
491 | // DIGEST but a rela tive URI i n the requ est line. | 500 | // DIGEST but a rela tive URI i n the requ est line. | 500 | // DIGEST but a rela tive URI i n the requ est line. | |||||
492 | // request . 2.3.5 < fixed Andr oid versio n <= 4.0.3 | 501 | // request . 2.3.5 < fixed Andr oid versio n <= 4.0.3 | 501 | // request . 2.3.5 < fixed Andr oid versio n <= 4.0.3 | |||||
493 | String hos t = reques t.getHeade r("host"); | 502 | String hos t = reques t.getHeade r("host"); | 502 | String hos t = reques t.getHeade r("host"); | |||||
494 | String sch eme = requ est.getSch eme(); | 503 | String sch eme = requ est.getSch eme(); | 503 | String sch eme = requ est.getSch eme(); | |||||
495 | if (host ! = null && !uriQuery. startsWith (scheme)) { | 504 | if (host ! = null && !uriQuery. startsWith (scheme)) { | 504 | if (host ! = null && !uriQuery. startsWith (scheme)) { | |||||
496 | String Builder ab solute = n ew StringB uilder(); | 505 | String Builder ab solute = n ew StringB uilder(); | 505 | String Builder ab solute = n ew StringB uilder(); | |||||
497 | absolu te.append( scheme); | 506 | absolu te.append( scheme); | 506 | absolu te.append( scheme); | |||||
498 | absolu te.append( "://"); | 507 | absolu te.append( "://"); | 507 | absolu te.append( "://"); | |||||
499 | absolu te.append( host); | 508 | absolu te.append( host); | 508 | absolu te.append( host); | |||||
500 | absolu te.append( uriQuery); | 509 | absolu te.append( uriQuery); | 509 | absolu te.append( uriQuery); | |||||
501 | if (!u ri.equals( absolute.t oString()) ) { | 510 | if (!u ri.equals( absolute.t oString()) ) { | 510 | if (!u ri.equals( absolute.t oString()) ) { | |||||
502 | re turn false ; | 511 | re turn false ; | 511 | re turn false ; | |||||
503 | } | 512 | } | 512 | } | |||||
504 | } else { | 513 | } else { | 513 | } else { | |||||
505 | return false; | 514 | return false; | 514 | return false; | |||||
506 | } | 515 | } | 515 | } | |||||
507 | } | 516 | } | 516 | } | |||||
508 | } | 517 | } | 517 | } | |||||
509 | 518 | 518 | ||||||||
510 | // Valid ate the Re alm name | 519 | // Valid ate the Re alm name | 519 | // Valid ate the Re alm name | |||||
511 | String l cRealm = g etRealmNam e(request. getContext ()); | 520 | String l cRealm = g etRealmNam e(request. getContext ()); | 520 | String l cRealm = g etRealmNam e(request. getContext ()); | |||||
512 | if (!lcR ealm.equal s(realmNam e)) { | 521 | if (!lcR ealm.equal s(realmNam e)) { | 521 | if (!lcR ealm.equal s(realmNam e)) { | |||||
513 | retu rn false; | 522 | retu rn false; | 522 | retu rn false; | |||||
514 | } | 523 | } | 523 | } | |||||
515 | 524 | 524 | ||||||||
516 | // Valid ate the op aque strin g | 525 | // Valid ate the op aque strin g | 525 | // Valid ate the op aque strin g | |||||
517 | if (!opa que.equals (opaqueRec eived)) { | 526 | if (!opa que.equals (opaqueRec eived)) { | 526 | if (!opa que.equals (opaqueRec eived)) { | |||||
518 | retu rn false; | 527 | retu rn false; | 527 | retu rn false; | |||||
519 | } | 528 | } | 528 | } | |||||
520 | 529 | 529 | ||||||||
521 | // Valid ate nonce | 530 | // Valid ate nonce | 530 | // Valid ate nonce | |||||
522 | int i = nonce.inde xOf(':'); | 531 | int i = nonce.inde xOf(':'); | 531 | int i = nonce.inde xOf(':'); | |||||
523 | if (i < 0 || (i + 1) == nonc e.length() ) { | 532 | if (i < 0 || (i + 1) == nonc e.length() ) { | 532 | if (i < 0 || (i + 1) == nonc e.length() ) { | |||||
524 | retu rn false; | 533 | retu rn false; | 533 | retu rn false; | |||||
525 | } | 534 | } | 534 | } | |||||
526 | long non ceTime; | 535 | long non ceTime; | 535 | long non ceTime; | |||||
527 | try { | 536 | try { | 536 | try { | |||||
528 | nonc eTime = Lo ng.parseLo ng(nonce.s ubstring(0 , i)); | 537 | nonc eTime = Lo ng.parseLo ng(nonce.s ubstring(0 , i)); | 537 | nonc eTime = Lo ng.parseLo ng(nonce.s ubstring(0 , i)); | |||||
529 | } catch (NumberFor matExcepti on nfe) { | 538 | } catch (NumberFor matExcepti on nfe) { | 538 | } catch (NumberFor matExcepti on nfe) { | |||||
530 | retu rn false; | 539 | retu rn false; | 539 | retu rn false; | |||||
531 | } | 540 | } | 540 | } | |||||
532 | String m d5clientIp TimeKey = nonce.subs tring(i + 1); | 541 | String m d5clientIp TimeKey = nonce.subs tring(i + 1); | 541 | String m d5clientIp TimeKey = nonce.subs tring(i + 1); | |||||
533 | long cur rentTime = System.cu rrentTimeM illis(); | 542 | long cur rentTime = System.cu rrentTimeM illis(); | 542 | long cur rentTime = System.cu rrentTimeM illis(); | |||||
534 | if ((cur rentTime - nonceTime ) > nonceV alidity) { | 543 | if ((cur rentTime - nonceTime ) > nonceV alidity) { | 543 | if ((cur rentTime - nonceTime ) > nonceV alidity) { | |||||
535 | nonc eStale = t rue; | 544 | nonc eStale = t rue; | 544 | nonc eStale = t rue; | |||||
536 | sync hronized ( nonces) { | 545 | sync hronized ( nonces) { | 545 | sync hronized ( nonces) { | |||||
537 | nonces.rem ove(nonce) ; | 546 | nonces.rem ove(nonce) ; | 546 | nonces.rem ove(nonce) ; | |||||
538 | } | 547 | } | 547 | } | |||||
539 | } | 548 | } | 548 | } | |||||
540 | String s erverIpTim eKey = | 549 | String s erverIpTim eKey = | 549 | String s erverIpTim eKey = | |||||
541 | requ est.getRem oteAddr() + ":" + no nceTime + ":" + key; | 550 | requ est.getRem oteAddr() + ":" + no nceTime + ":" + key; | 550 | requ est.getRem oteAddr() + ":" + no nceTime + ":" + key; | |||||
542 | byte[] b uffer = Co ncurrentMe ssageDiges t.digestMD 5( | 551 | byte[] b uffer = Co ncurrentMe ssageDiges t.digestMD 5( | 551 | byte[] b uffer = Co ncurrentMe ssageDiges t.digestMD 5( | |||||
543 | serverIpTi meKey.getB ytes(Stand ardCharset s.ISO_8859 _1)); | 552 | serverIpTi meKey.getB ytes(Stand ardCharset s.ISO_8859 _1)); | 552 | serverIpTi meKey.getB ytes(Stand ardCharset s.ISO_8859 _1)); | |||||
544 | String m d5ServerIp TimeKey = MD5Encoder .encode(bu ffer); | 553 | String m d5ServerIp TimeKey = MD5Encoder .encode(bu ffer); | 553 | String m d5ServerIp TimeKey = MD5Encoder .encode(bu ffer); | |||||
545 | if (!md5 ServerIpTi meKey.equa ls(md5clie ntIpTimeKe y)) { | 554 | if (!md5 ServerIpTi meKey.equa ls(md5clie ntIpTimeKe y)) { | 554 | if (!md5 ServerIpTi meKey.equa ls(md5clie ntIpTimeKe y)) { | |||||
546 | retu rn false; | 555 | retu rn false; | 555 | retu rn false; | |||||
547 | } | 556 | } | 556 | } | |||||
548 | 557 | 557 | ||||||||
549 | // Valid ate qop | 558 | // Valid ate qop | 558 | // Valid ate qop | |||||
550 | if (qop != null && !QOP.equa ls(qop)) { | 559 | if (qop != null && !QOP.equa ls(qop)) { | 559 | if (qop != null && !QOP.equa ls(qop)) { | |||||
551 | retu rn false; | 560 | retu rn false; | 560 | retu rn false; | |||||
552 | } | 561 | } | 561 | } | |||||
553 | 562 | 562 | ||||||||
554 | // Valid ate cnonce and nc | 563 | // Valid ate cnonce and nc | 563 | // Valid ate cnonce and nc | |||||
555 | // Check if presen ce of nc a nd Cnonce is consist ent with p resence of qop | 564 | // Check if presen ce of nc a nd Cnonce is consist ent with p resence of qop | 564 | // Check if presen ce of nc a nd Cnonce is consist ent with p resence of qop | |||||
556 | if (qop == null) { | 565 | if (qop == null) { | 565 | if (qop == null) { | |||||
557 | if ( cnonce != null || nc != null) { | 566 | if ( cnonce != null || nc != null) { | 566 | if ( cnonce != null || nc != null) { | |||||
558 | return fal se; | 567 | return fal se; | 567 | return fal se; | |||||
559 | } | 568 | } | 568 | } | |||||
560 | } else { | 569 | } else { | 569 | } else { | |||||
561 | if ( cnonce == null || nc == null) { | 570 | if ( cnonce == null || nc == null) { | 570 | if ( cnonce == null || nc == null) { | |||||
562 | return fal se; | 571 | return fal se; | 571 | return fal se; | |||||
563 | } | 572 | } | 572 | } | |||||
564 | // R FC 2617 sa ys nc must be 8 digi ts long. O lder Andro id clients | 573 | // R FC 2617 sa ys nc must be 8 digi ts long. O lder Andro id clients | 573 | // R FC 2617 sa ys nc must be 8 digi ts long. O lder Andro id clients | |||||
565 | // u se 6. 2.3. 5 < fixed Android ve rsion <= 4 .0.3 | 574 | // u se 6. 2.3. 5 < fixed Android ve rsion <= 4 .0.3 | 574 | // u se 6. 2.3. 5 < fixed Android ve rsion <= 4 .0.3 | |||||
566 | if ( nc.length( ) < 6 || n c.length() > 8) { | 575 | if ( nc.length( ) < 6 || n c.length() > 8) { | 575 | if ( nc.length( ) < 6 || n c.length() > 8) { | |||||
567 | return fal se; | 576 | return fal se; | 576 | return fal se; | |||||
568 | } | 577 | } | 577 | } | |||||
569 | long count; | 578 | long count; | 578 | long count; | |||||
570 | try { | 579 | try { | 579 | try { | |||||
571 | count = Lo ng.parseLo ng(nc, 16) ; | 580 | count = Lo ng.parseLo ng(nc, 16) ; | 580 | count = Lo ng.parseLo ng(nc, 16) ; | |||||
572 | } ca tch (Numbe rFormatExc eption nfe ) { | 581 | } ca tch (Numbe rFormatExc eption nfe ) { | 581 | } ca tch (Numbe rFormatExc eption nfe ) { | |||||
573 | return fal se; | 582 | return fal se; | 582 | return fal se; | |||||
574 | } | 583 | } | 583 | } | |||||
575 | Nonc eInfo info ; | 584 | Nonc eInfo info ; | 584 | Nonc eInfo info ; | |||||
576 | sync hronized ( nonces) { | 585 | sync hronized ( nonces) { | 585 | sync hronized ( nonces) { | |||||
577 | info = non ces.get(no nce); | 586 | info = non ces.get(no nce); | 586 | info = non ces.get(no nce); | |||||
578 | } | 587 | } | 587 | } | |||||
579 | if ( info == nu ll) { | 588 | if ( info == nu ll) { | 588 | if ( info == nu ll) { | |||||
580 | // Nonce i s valid bu t not in c ache. It m ust have d ropped out | 589 | // Nonce i s valid bu t not in c ache. It m ust have d ropped out | 589 | // Nonce i s valid bu t not in c ache. It m ust have d ropped out | |||||
581 | // of the cache - fo rce a re-a uthenticat ion | 590 | // of the cache - fo rce a re-a uthenticat ion | 590 | // of the cache - fo rce a re-a uthenticat ion | |||||
582 | nonceStale = true; | 591 | nonceStale = true; | 591 | nonceStale = true; | |||||
583 | } el se { | 592 | } el se { | 592 | } el se { | |||||
584 | if (!info. nonceCount Valid(coun t)) { | 593 | if (!info. nonceCount Valid(coun t)) { | 593 | if (!info. nonceCount Valid(coun t)) { | |||||
585 | return false; | 594 | return false; | 594 | return false; | |||||
586 | } | 595 | } | 595 | } | |||||
587 | } | 596 | } | 596 | } | |||||
588 | } | 597 | } | 597 | } | |||||
589 | return t rue; | 598 | return t rue; | 598 | return t rue; | |||||
590 | } | 599 | } | 599 | } | |||||
591 | 600 | 600 | ||||||||
592 | pu blic boole an isNonce Stale() { | 601 | pu blic boole an isNonce Stale() { | 601 | pu blic boole an isNonce Stale() { | |||||
593 | return n onceStale; | 602 | return n onceStale; | 602 | return n onceStale; | |||||
594 | } | 603 | } | 603 | } | |||||
595 | 604 | 604 | ||||||||
596 | pu blic Princ ipal authe nticate(Re alm realm) { | 605 | pu blic Princ ipal authe nticate(Re alm realm) { | 605 | pu blic Princ ipal authe nticate(Re alm realm) { | |||||
597 | // Secon d MD5 dige st used to calculate the diges t : | 606 | // Secon d MD5 dige st used to calculate the diges t : | 606 | // Secon d MD5 dige st used to calculate the diges t : | |||||
598 | // MD5(M ethod + ": " + uri) | 607 | // MD5(M ethod + ": " + uri) | 607 | // MD5(M ethod + ": " + uri) | |||||
599 | String a 2 = method + ":" + u ri; | 608 | String a 2 = method + ":" + u ri; | 608 | String a 2 = method + ":" + u ri; | |||||
600 | 609 | 609 | ||||||||
601 | byte[] b uffer = Co ncurrentMe ssageDiges t.digestMD 5( | 610 | byte[] b uffer = Co ncurrentMe ssageDiges t.digestMD 5( | 610 | byte[] b uffer = Co ncurrentMe ssageDiges t.digestMD 5( | |||||
602 | a2.getByte s(Standard Charsets.I SO_8859_1) ); | 611 | a2.getByte s(Standard Charsets.I SO_8859_1) ); | 611 | a2.getByte s(Standard Charsets.I SO_8859_1) ); | |||||
603 | String m d5a2 = MD5 Encoder.en code(buffe r); | 612 | String m d5a2 = MD5 Encoder.en code(buffe r); | 612 | String m d5a2 = MD5 Encoder.en code(buffe r); | |||||
604 | 613 | 613 | ||||||||
605 | return r ealm.authe nticate(us erName, re sponse, no nce, nc, c nonce, | 614 | return r ealm.authe nticate(us erName, re sponse, no nce, nc, c nonce, | 614 | return r ealm.authe nticate(us erName, re sponse, no nce, nc, c nonce, | |||||
606 | qop, realm Name, md5a 2); | 615 | qop, realm Name, md5a 2); | 615 | qop, realm Name, md5a 2); | |||||
607 | } | 616 | } | 616 | } | |||||
608 | 617 | 617 | ||||||||
609 | } | 618 | } | 618 | } | |||||
610 | 619 | 619 | ||||||||
611 | p r i vate static cl ass NonceI nfo { | 620 | p ubl i c static cl ass NonceI nfo { | 620 | public static cl ass NonceI nfo { | |||||
612 | pr ivate fina l long tim estamp; | 621 | pr ivate fina l long tim estamp; | 621 | pr ivate fina l long tim estamp; | |||||
613 | pr ivate fina l boolean seen[]; | 622 | pr ivate fina l boolean seen[]; | 622 | pr ivate fina l boolean seen[]; | |||||
614 | pr ivate fina l int offs et; | 623 | pr ivate fina l int offs et; | 623 | pr ivate fina l int offs et; | |||||
615 | pr ivate int count = 0; | 624 | pr ivate int count = 0; | 624 | pr ivate int count = 0; | |||||
616 | 625 | 625 | ||||||||
617 | pu blic Nonce Info(long currentTim e, int see nWindowSiz e) { | 626 | pu blic Nonce Info(long currentTim e, int see nWindowSiz e) { | 626 | pu blic Nonce Info(long currentTim e, int see nWindowSiz e) { | |||||
618 | this.tim estamp = c urrentTime ; | 627 | this.tim estamp = c urrentTime ; | 627 | this.tim estamp = c urrentTime ; | |||||
619 | seen = n ew boolean [seenWindo wSize]; | 628 | seen = n ew boolean [seenWindo wSize]; | 628 | seen = n ew boolean [seenWindo wSize]; | |||||
620 | offset = seenWindo wSize / 2; | 629 | offset = seenWindo wSize / 2; | 629 | offset = seenWindo wSize / 2; | |||||
621 | } | 630 | } | 630 | } | |||||
622 | 631 | 631 | ||||||||
623 | pu blic synch ronized bo olean nonc eCountVali d(long non ceCount) { | 632 | pu blic synch ronized bo olean nonc eCountVali d(long non ceCount) { | 632 | pu blic synch ronized bo olean nonc eCountVali d(long non ceCount) { | |||||
624 | if ((cou nt - offse t) >= nonc eCount || | 633 | if ((cou nt - offse t) >= nonc eCount || | 633 | if ((cou nt - offse t) >= nonc eCount || | |||||
625 | (nonceCoun t > count - offset + seen.leng th)) { | 634 | (nonceCoun t > count - offset + seen.leng th)) { | 634 | (nonceCoun t > count - offset + seen.leng th)) { | |||||
626 | retu rn false; | 635 | retu rn false; | 635 | retu rn false; | |||||
627 | } | 636 | } | 636 | } | |||||
628 | int chec kIndex = ( int) ((non ceCount + offset) % seen.lengt h); | 637 | int chec kIndex = ( int) ((non ceCount + offset) % seen.lengt h); | 637 | int chec kIndex = ( int) ((non ceCount + offset) % seen.lengt h); | |||||
629 | if (seen [checkInde x]) { | 638 | if (seen [checkInde x]) { | 638 | if (seen [checkInde x]) { | |||||
630 | retu rn false; | 639 | retu rn false; | 639 | retu rn false; | |||||
631 | } else { | 640 | } else { | 640 | } else { | |||||
632 | seen [checkInde x] = true; | 641 | seen [checkInde x] = true; | 641 | seen [checkInde x] = true; | |||||
633 | seen [count % s een.length ] = false; | 642 | seen [count % s een.length ] = false; | 642 | seen [count % s een.length ] = false; | |||||
634 | coun t++; | 643 | coun t++; | 643 | coun t++; | |||||
635 | retu rn true; | 644 | retu rn true; | 644 | retu rn true; | |||||
636 | } | 645 | } | 645 | } | |||||
637 | } | 646 | } | 646 | } | |||||
638 | 647 | 647 | ||||||||
639 | pu blic long getTimesta mp() { | 648 | pu blic long getTimesta mp() { | 648 | pu blic long getTimesta mp() { | |||||
640 | return t imestamp; | 649 | return t imestamp; | 649 | return t imestamp; | |||||
641 | } | 650 | } | 650 | } | |||||
642 | } | 651 | } | 651 | } | |||||
643 | } | 652 | } | 652 | } |
Araxis Merge (but not the data content of this report) is Copyright © 1993–2017 Araxis Ltd (www.araxis.com). All rights reserved.