Artifact 1abbf360e909c3ab93c03e9daeec79b80ae392c6fb0a16838c7f00c3e92d4de3:
- File
src/SSLConnectionFailedException.m
— part of check-in
[74db1e8212]
at
2016-07-09 21:24:03
on branch trunk
— Add SSLConnectionFailedException
This way, when an SSLSocket is passed where an OFTCPSocket is expected,
the description will still contain the error and no special code for
SSLSocket is necessary. (user: js, size: 3485) [annotate] [blame] [check-ins using]
/* * Copyright (c) 2016, Jonathan Schleifer <js@heap.zone> * * https://heap.zone/git/?p=objopenssl.git * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice is present in all copies. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <inttypes.h> #import <ObjFW/OFString.h> #import "SSLConnectionFailedException.h" #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wdocumentation" #endif #include <openssl/err.h> #include <openssl/ssl.h> #include <openssl/x509v3.h> #if defined(__clang__) # pragma clang diagnostic pop #endif @implementation SSLConnectionFailedException @synthesize SSLError = _SSLError, verifyResult = _verifyResult; + (instancetype)exceptionWithHost: (OFString*)host port: (uint16_t)port socket: (SSLSocket*)socket SSLError: (unsigned long)SSLError { return [[[self alloc] initWithHost: host port: port socket: socket SSLError: SSLError] autorelease]; } + (instancetype)exceptionWithHost: (OFString*)host port: (uint16_t)port socket: (SSLSocket*)socket SSLError: (unsigned long)SSLError verifyResult: (long)verifyResult { return [[[self alloc] initWithHost: host port: port socket: socket SSLError: SSLError verifyResult: verifyResult] autorelease]; } - initWithHost: (OFString*)host port: (uint16_t)port socket: (SSLSocket*)socket SSLError: (unsigned long)SSLError { self = [super initWithHost: host port: port socket: socket]; _SSLError = SSLError; return self; } - initWithHost: (OFString*)host port: (uint16_t)port socket: (SSLSocket*)socket SSLError: (unsigned long)SSLError verifyResult: (long)verifyResult { self = [super initWithHost: host port: port socket: socket]; _SSLError = SSLError; _verifyResult = verifyResult; return self; } - (OFString*)description { if (_SSLError != SSL_ERROR_NONE) { char error[512]; ERR_error_string_n(_SSLError, error, 512); if (_verifyResult != X509_V_OK) return [OFString stringWithFormat: @"A connection to %@ on port %" @PRIu16 @" could " @"not be established in socket of type %@: " @"Verification failed: %s [%s]", _host, _port, [_socket class], X509_verify_cert_error_string(_verifyResult), error]; else return [OFString stringWithFormat: @"A connection to %@ on port %" @PRIu16 @" could " @"not be established in socket of type %@: %s", _host, _port, [_socket class], error]; } return [super description]; } @end