Skip to content

Commit 6b5dbdf

Browse files
committed
Fix: node v6+ emits UnhandledPromiseRejectionWarning (fixes #79)
1 parent 4005f31 commit 6b5dbdf

File tree

2 files changed

+116
-114
lines changed

2 files changed

+116
-114
lines changed

lib/jwe/decrypt.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ function JWEDecrypter(ks, globalOpts) {
9494
//combine fields
9595
var fields,
9696
protect;
97-
promise.then(function(rcptList) {
97+
promise = promise.then(function(rcptList) {
9898
if (input.protected) {
9999
protect = base64url.decode(input.protected, "utf8");
100100
protect = JSON.parse(protect);

lib/jws/verify.js

+115-113
Original file line numberDiff line numberDiff line change
@@ -102,137 +102,139 @@ var JWSVerifier = function(ks, globalOpts) {
102102
}
103103
protect = Object.keys(protect);
104104

105-
return {
105+
return Promise.resolve({
106106
protected: protect,
107107
aad: s.protected || "",
108108
header: header,
109109
signature: signature
110-
};
110+
});
111111
});
112112

113-
var promise = new Promise(function(resolve, reject) {
114-
var processSig = function() {
115-
var sig = sigList.shift();
116-
if (!sig) {
117-
reject(new Error("no key found"));
118-
return;
119-
}
120-
121-
sig = merge({}, sig, {
122-
payload: input.payload
123-
});
124-
var p = Promise.resolve(sig);
125-
// find the key
126-
p = p.then(function(sig) {
127-
var algKey;
128-
// TODO: resolve jku, x5c, x5u
129-
if (sig.header.jwk) {
130-
algKey = JWK.asKey(sig.header.jwk);
131-
} else if (sig.header.x5c) {
132-
algKey = sig.header.x5c[0];
133-
algKey = new Buffer(algKey, "base64");
134-
// TODO: callback to validate chain
135-
algKey = JWK.asKey(algKey, "pkix");
136-
} else {
137-
algKey = Promise.resolve(assumedKey || keystore.get({
138-
use: "sig",
139-
alg: sig.header.alg,
140-
kid: sig.header.kid
141-
}));
113+
var promise = Promise.all(sigList);
114+
promise = promise.then(function(sigList) {
115+
return new Promise(function(resolve, reject) {
116+
var processSig = function() {
117+
var sig = sigList.shift();
118+
if (!sig) {
119+
reject(new Error("no key found"));
120+
return;
142121
}
143-
return algKey.then(function(k) {
144-
if (!k) {
145-
return Promise.reject(new Error("key does not match"));
146-
}
147-
sig.key = k;
148-
return sig;
149-
});
150-
});
151122

152-
// process any prepare-verify handlers
153-
p = p.then(function(sig) {
154-
var processing = [];
155-
handlerKeys.forEach(function(h) {
156-
h = extraHandlers[h];
157-
var p;
158-
if ("function" === typeof h) {
159-
p = h(sig);
160-
} else if ("object" === typeof h && "function" === typeof h.prepare) {
161-
p = h.prepare(sig);
162-
}
163-
if (p) {
164-
processing.push(Promise.resolve(p));
123+
sig = merge({}, sig, {
124+
payload: input.payload
125+
});
126+
var p = Promise.resolve(sig);
127+
// find the key
128+
p = p.then(function(sig) {
129+
var algKey;
130+
// TODO: resolve jku, x5c, x5u
131+
if (sig.header.jwk) {
132+
algKey = JWK.asKey(sig.header.jwk);
133+
} else if (sig.header.x5c) {
134+
algKey = sig.header.x5c[0];
135+
algKey = new Buffer(algKey, "base64");
136+
// TODO: callback to validate chain
137+
algKey = JWK.asKey(algKey, "pkix");
138+
} else {
139+
algKey = Promise.resolve(assumedKey || keystore.get({
140+
use: "sig",
141+
alg: sig.header.alg,
142+
kid: sig.header.kid
143+
}));
165144
}
145+
return algKey.then(function(k) {
146+
if (!k) {
147+
return Promise.reject(new Error("key does not match"));
148+
}
149+
sig.key = k;
150+
return sig;
151+
});
166152
});
167-
return Promise.all(processing).then(function() {
168-
// don't actually care about individual handler results
169-
// assume {sig} is updated
170-
return sig;
153+
154+
// process any prepare-verify handlers
155+
p = p.then(function(sig) {
156+
var processing = [];
157+
handlerKeys.forEach(function(h) {
158+
h = extraHandlers[h];
159+
var p;
160+
if ("function" === typeof h) {
161+
p = h(sig);
162+
} else if ("object" === typeof h && "function" === typeof h.prepare) {
163+
p = h.prepare(sig);
164+
}
165+
if (p) {
166+
processing.push(Promise.resolve(p));
167+
}
168+
});
169+
return Promise.all(processing).then(function() {
170+
// don't actually care about individual handler results
171+
// assume {sig} is updated
172+
return sig;
173+
});
171174
});
172-
});
173175

174-
// prepare verify inputs
175-
p = p.then(function(sig) {
176-
var aad = sig.aad || "",
177-
payload = sig.payload || "";
178-
var content = new Buffer(1 + aad.length + payload.length),
179-
pos = 0;
180-
content.write(aad, pos, "ascii");
181-
pos += aad.length;
182-
content.write(".", pos, "ascii");
183-
pos++;
176+
// prepare verify inputs
177+
p = p.then(function(sig) {
178+
var aad = sig.aad || "",
179+
payload = sig.payload || "";
180+
var content = new Buffer(1 + aad.length + payload.length),
181+
pos = 0;
182+
content.write(aad, pos, "ascii");
183+
pos += aad.length;
184+
content.write(".", pos, "ascii");
185+
pos++;
184186

185-
if (Buffer.isBuffer(payload)) {
186-
payload.copy(content, pos);
187-
} else {
188-
content.write(payload, pos, "binary");
189-
}
190-
sig.content = content;
191-
return sig;
192-
});
193-
194-
p = p.then(function(sig) {
195-
return sig.key.verify(sig.header.alg,
196-
sig.content,
197-
sig.signature);
198-
});
187+
if (Buffer.isBuffer(payload)) {
188+
payload.copy(content, pos);
189+
} else {
190+
content.write(payload, pos, "binary");
191+
}
192+
sig.content = content;
193+
return sig;
194+
});
199195

200-
p = p.then(function(result) {
201-
var payload = sig.payload;
202-
payload = base64url.decode(payload);
203-
return {
204-
protected: sig.protected,
205-
header: sig.header,
206-
payload: payload,
207-
signature: result.mac,
208-
key: sig.key
209-
};
210-
});
196+
p = p.then(function(sig) {
197+
return sig.key.verify(sig.header.alg,
198+
sig.content,
199+
sig.signature);
200+
});
211201

212-
// process any post-verify handlers
213-
p = p.then(function(jws) {
214-
var processing = [];
215-
handlerKeys.forEach(function(h) {
216-
h = extraHandlers[h];
217-
var p;
218-
if ("object" === typeof h && "function" === typeof h.complete) {
219-
p = h.complete(jws);
220-
}
221-
if (p) {
222-
processing.push(Promise.resolve(p));
223-
}
202+
p = p.then(function(result) {
203+
var payload = sig.payload;
204+
payload = base64url.decode(payload);
205+
return {
206+
protected: sig.protected,
207+
header: sig.header,
208+
payload: payload,
209+
signature: result.mac,
210+
key: sig.key
211+
};
224212
});
225-
return Promise.all(processing).then(function() {
226-
// don't actually care about individual handler results
227-
// assume {jws} is updated
228-
return jws;
213+
214+
// process any post-verify handlers
215+
p = p.then(function(jws) {
216+
var processing = [];
217+
handlerKeys.forEach(function(h) {
218+
h = extraHandlers[h];
219+
var p;
220+
if ("object" === typeof h && "function" === typeof h.complete) {
221+
p = h.complete(jws);
222+
}
223+
if (p) {
224+
processing.push(Promise.resolve(p));
225+
}
226+
});
227+
return Promise.all(processing).then(function() {
228+
// don't actually care about individual handler results
229+
// assume {jws} is updated
230+
return jws;
231+
});
229232
});
230-
});
231-
p.then(resolve, processSig);
232-
};
233-
processSig();
233+
p.then(resolve, processSig);
234+
};
235+
processSig();
236+
});
234237
});
235-
236238
return promise;
237239
}
238240
});

0 commit comments

Comments
 (0)