Skip to content

Commit 09feec5

Browse files
committed
HADOOP-6620. NPE if renewer is passed as null in getDelegationToken. Contributed by Jitendra Pandey.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@953896 13f79535-47bb-0310-9956-ffa450edef68
1 parent 9e4ea2f commit 09feec5

File tree

4 files changed

+51
-5
lines changed

4 files changed

+51
-5
lines changed

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ Trunk (unreleased changes)
8181
HADOOP-6603. Provide workaround for issue with Kerberos not resolving
8282
cross-realm principal (Kan Zhang and Jitendra Pandey via jghoman)
8383

84+
HADOOP-6620. NPE if renewer is passed as null in getDelegationToken.
85+
(Jitendra Pandey via jghoman)
86+
8487
Release 0.21.0 - Unreleased
8588

8689
INCOMPATIBLE CHANGES

src/java/org/apache/hadoop/security/token/delegation/AbstractDelegationTokenIdentifier.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,16 @@ public AbstractDelegationTokenIdentifier() {
4949
}
5050

5151
public AbstractDelegationTokenIdentifier(Text owner, Text renewer, Text realUser) {
52-
this.owner = owner;
53-
this.renewer = renewer;
52+
if (owner == null) {
53+
this.owner = new Text();
54+
} else {
55+
this.owner = owner;
56+
}
57+
if (renewer == null) {
58+
this.renewer = new Text();
59+
} else {
60+
this.renewer = renewer;
61+
}
5462
if (realUser == null) {
5563
this.realUser = new Text();
5664
} else {
@@ -170,4 +178,14 @@ public void write(DataOutput out) throws IOException {
170178
WritableUtils.writeVInt(out, sequenceNumber);
171179
WritableUtils.writeVInt(out, masterKeyId);
172180
}
181+
182+
public String toString() {
183+
StringBuilder buffer = new StringBuilder();
184+
buffer
185+
.append("owner=" + owner + ", renewer=" + renewer + ", realUser="
186+
+ realUser + ", issueDate=" + issueDate + ", maxDate=" + maxDate
187+
+ ", sequenceNumber=" + sequenceNumber + ", masterKeyId="
188+
+ masterKeyId);
189+
return buffer.toString();
190+
}
173191
}

src/java/org/apache/hadoop/security/token/delegation/AbstractDelegationTokenSecretManager.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ private synchronized void removeExpiredKeys() {
178178

179179
@Override
180180
protected synchronized byte[] createPassword(TokenIdent identifier) {
181+
LOG.info("Creating password for identifier: "+identifier);
181182
int sequenceNum;
182183
long now = System.currentTimeMillis();
183184
sequenceNum = ++delegationTokenSequenceNumber;
@@ -220,12 +221,13 @@ public synchronized long renewToken(Token<TokenIdent> token,
220221
DataInputStream in = new DataInputStream(buf);
221222
TokenIdent id = createIdentifier();
222223
id.readFields(in);
223-
224+
LOG.info("Token renewal requested for identifier: "+id);
225+
224226
if (id.getMaxDate() < now) {
225227
throw new InvalidToken("User " + renewer +
226228
" tried to renew an expired token");
227229
}
228-
if (id.getRenewer() == null) {
230+
if ((id.getRenewer() == null) || ("".equals(id.getRenewer().toString()))) {
229231
throw new AccessControlException("User " + renewer +
230232
" tried to renew a token without " +
231233
"a renewer");
@@ -271,13 +273,16 @@ public synchronized TokenIdent cancelToken(Token<TokenIdent> token,
271273
DataInputStream in = new DataInputStream(buf);
272274
TokenIdent id = createIdentifier();
273275
id.readFields(in);
276+
LOG.info("Token cancelation requested for identifier: "+id);
277+
274278
if (id.getUser() == null) {
275279
throw new InvalidToken("Token with no owner");
276280
}
277281
String owner = id.getUser().getUserName();
278282
Text renewer = id.getRenewer();
279283
if (!canceller.equals(owner)
280-
&& (renewer == null || !canceller.equals(renewer.toString()))) {
284+
&& (renewer == null || "".equals(renewer.toString()) || !canceller
285+
.equals(renewer.toString()))) {
281286
throw new AccessControlException(canceller
282287
+ " is not authorized to cancel the token");
283288
}

src/test/core/org/apache/hadoop/security/token/delegation/TestDelegationToken.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,4 +365,24 @@ public void run() {
365365
dtSecretManager.stopThreads();
366366
}
367367
}
368+
369+
@Test
370+
public void testDelegationTokenNullRenewer() throws Exception {
371+
TestDelegationTokenSecretManager dtSecretManager =
372+
new TestDelegationTokenSecretManager(24*60*60*1000,
373+
10*1000,1*1000,3600000);
374+
dtSecretManager.startThreads();
375+
TestDelegationTokenIdentifier dtId = new TestDelegationTokenIdentifier(new Text(
376+
"theuser"), null, null);
377+
Token<TestDelegationTokenIdentifier> token = new Token<TestDelegationTokenIdentifier>(
378+
dtId, dtSecretManager);
379+
Assert.assertTrue(token != null);
380+
try {
381+
dtSecretManager.renewToken(token, "");
382+
Assert.fail("Renewal must not succeed");
383+
} catch (IOException e) {
384+
//PASS
385+
}
386+
}
387+
368388
}

0 commit comments

Comments
 (0)