mirror of https://github.com/grpc/grpc-node.git
				
				
				
			Correct checkServerIdentity behavior to return a verification failure if an error is returned. Clean up documentation and add a test assertion on returned Error.
This commit is contained in:
		
							parent
							
								
									e54b50c77b
								
							
						
					
					
						commit
						ac0718883a
					
				|  | @ -78,9 +78,15 @@ static int verify_peer_callback_wrapper(const char* servername, const char* cert | ||||||
|     argv[1] = Nan::New<v8::String>(cert).ToLocalChecked(); |     argv[1] = Nan::New<v8::String>(cert).ToLocalChecked(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   callback->Call(argc, argv); |   Local<Value> result = callback->Call(argc, argv); | ||||||
| 
 | 
 | ||||||
|  |   // Catch any exception and return with a distinct status code which indicates this
 | ||||||
|   if (try_catch.HasCaught()) { |   if (try_catch.HasCaught()) { | ||||||
|  |     return 2; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // If the result is an error, return a failure
 | ||||||
|  |   if (result->IsNativeError()) { | ||||||
|     return 1; |     return 1; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -796,10 +796,11 @@ declare module "grpc" { | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * A callback that will receive the expected hostname and presented peer |    * A callback that will receive the expected hostname and presented peer | ||||||
|    * certificate as parameters. The callback should throw an error to |    * certificate as parameters. The callback should return an error to | ||||||
|    * indicate that the presented certificate is considered invalid. |    * indicate that the presented certificate is considered invalid and | ||||||
|  |    * otherwise returned undefined. | ||||||
|    */ |    */ | ||||||
|   export type CheckServerIdentityCallback = (hostname: string, cert: string) => void; |   export type CheckServerIdentityCallback = (hostname: string, cert: string) => Error | undefined; | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * Additional peer verification options that can be set when creating |    * Additional peer verification options that can be set when creating | ||||||
|  |  | ||||||
|  | @ -87,18 +87,10 @@ var _ = require('lodash'); | ||||||
|  * @param {Buffer=} private_key The client certificate private key, if |  * @param {Buffer=} private_key The client certificate private key, if | ||||||
|  *     applicable |  *     applicable | ||||||
|  * @param {Buffer=} cert_chain The client certificate cert chain, if applicable |  * @param {Buffer=} cert_chain The client certificate cert chain, if applicable | ||||||
|  * @param {Object} verify_options Additional peer verification options. Can |  * @param {Function} verify_options.checkServerIdentity Optional callback | ||||||
|  *     be undefined, in which case default behavior is preserved. |  *     receiving the expected hostname and peer certificate for additional | ||||||
|  *     Supported options are: "checkServerIdentity": (servername, cert) => {} |  *     verification. The callback should return an Error if verification | ||||||
|  *     The callback passed to checkServerIdentity will be invoked when the |  *     fails and otherwise return undefined. | ||||||
|  *     channel is opened in order to provide an opportunity to perform |  | ||||||
|  *     additional verification of the peer certificate as passed to the |  | ||||||
|  *     callback in the second parameter. The expected hostname is passed as |  | ||||||
|  *     the first parameter. If the callback considers the peer certificate |  | ||||||
|  *     invalid it should throw an error which will cause the handshake to |  | ||||||
|  *     be terminated. Note that supplying this callback does not disable |  | ||||||
|  *     the usual hostname verification which will also be performed on the |  | ||||||
|  *     certificate before this callback is invoked. |  | ||||||
|  * @return {grpc.credentials~ChannelCredentials} The SSL Credentials object |  * @return {grpc.credentials~ChannelCredentials} The SSL Credentials object | ||||||
|  */ |  */ | ||||||
| exports.createSsl = ChannelCredentials.createSsl; | exports.createSsl = ChannelCredentials.createSsl; | ||||||
|  |  | ||||||
|  | @ -309,6 +309,19 @@ describe('client credentials', function() { | ||||||
|       done(); |       done(); | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
|  |   it('Verify callback returning an Error causes connection failure', function(done) { | ||||||
|  |     var client_ssl_creds = grpc.credentials.createSsl(ca_data, null, null, { | ||||||
|  |       "checkServerIdentity": function(host, cert) { | ||||||
|  |         return new Error("Verification error"); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |     var client = new Client('localhost:' + port, client_ssl_creds, | ||||||
|  |                             client_options); | ||||||
|  |     client.unary({}, function(err, data) { | ||||||
|  |       assert.ok(err, "Should have raised an error"); | ||||||
|  |       done(); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|   it('Should update metadata with SSL creds', function(done) { |   it('Should update metadata with SSL creds', function(done) { | ||||||
|     var metadataUpdater = function(service_url, callback) { |     var metadataUpdater = function(service_url, callback) { | ||||||
|       var metadata = new grpc.Metadata(); |       var metadata = new grpc.Metadata(); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue