mirror of
https://github.com/deneraraujo/OpenVPNAdapter.git
synced 2026-02-11 00:00:08 +08:00
Distinguish events and errors, and add additional info to the error dictionary
This commit is contained in:
@@ -57,9 +57,10 @@
|
||||
|
||||
- (void)readTUNPackets;
|
||||
- (void)readVPNPacket:(NSData *)packet;
|
||||
- (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName;
|
||||
- (NSString *)getDescriptionForErrorEvent:(OpenVPNEvent)event;
|
||||
- (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength;
|
||||
- (OpenVPNEvent)eventByName:(NSString *)eventName;
|
||||
- (OpenVPNError)errorByName:(NSString *)errorName;
|
||||
- (NSString *)reasonForError:(OpenVPNError)error;
|
||||
- (NSString *)subnetFromPrefixLength:(NSNumber *)prefixLength;
|
||||
- (void)performAsyncBlock:(void (^)())block;
|
||||
|
||||
@end
|
||||
@@ -199,7 +200,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
|
||||
[self.tunnelSettingsIPv6.includedRoutes addObject:includedRoute];
|
||||
} else {
|
||||
NSString *subnet = [self getSubnetFromPrefixLength:prefixLength];
|
||||
NSString *subnet = [self subnetFromPrefixLength:prefixLength];
|
||||
|
||||
NEIPv4Route *includedRoute = [[NEIPv4Route alloc] initWithDestinationAddress:route subnetMask:subnet];
|
||||
includedRoute.gatewayAddress = self.defaultGatewayIPv4;
|
||||
@@ -219,7 +220,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
NEIPv6Route *excludedRoute = [[NEIPv6Route alloc] initWithDestinationAddress:route networkPrefixLength:prefixLength];
|
||||
[self.tunnelSettingsIPv6.excludedRoutes addObject:excludedRoute];
|
||||
} else {
|
||||
NSString *subnet = [self getSubnetFromPrefixLength:prefixLength];
|
||||
NSString *subnet = [self subnetFromPrefixLength:prefixLength];
|
||||
NEIPv4Route *excludedRoute = [[NEIPv4Route alloc] initWithDestinationAddress:route subnetMask:subnet];
|
||||
[self.tunnelSettingsIPv4.excludedRoutes addObject:excludedRoute];
|
||||
}
|
||||
@@ -274,7 +275,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
if (self.tunnelSettingsIPv4.initialized) {
|
||||
NSMutableArray *subnets = [NSMutableArray new];
|
||||
[self.tunnelSettingsIPv4.prefixLengths enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
||||
NSString *subnet = [self getSubnetFromPrefixLength:obj];
|
||||
NSString *subnet = [self subnetFromPrefixLength:obj];
|
||||
[subnets addObject:subnet];
|
||||
}];
|
||||
|
||||
@@ -337,35 +338,36 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
- (void)handleEvent:(const ClientAPI::Event *)event {
|
||||
NSAssert(self.delegate != nil, @"delegate property should not be nil");
|
||||
|
||||
NSString *eventName = [NSString stringWithUTF8String:event->name.c_str()];
|
||||
OpenVPNEvent eventIdentifier = [self getEventIdentifierByName:eventName];
|
||||
|
||||
NSString *eventMessage = [NSString stringWithUTF8String:event->info.c_str()];
|
||||
NSString *name = [NSString stringWithUTF8String:event->name.c_str()];
|
||||
NSString *message = [NSString stringWithUTF8String:event->info.c_str()];
|
||||
|
||||
if (event->error) {
|
||||
OpenVPNError errorCode = [self errorByName:name];
|
||||
|
||||
NSMutableDictionary *userInfo = [NSMutableDictionary new];
|
||||
|
||||
[userInfo setObject:@"OpenVPN error occured." forKey:NSLocalizedDescriptionKey];
|
||||
[userInfo setObject:@(event->fatal) forKey:OpenVPNAdapterErrorFatalKey];
|
||||
[userInfo setObject:@(eventIdentifier) forKey:OpenVPNAdapterErrorEventIdentifierKey];
|
||||
|
||||
NSString *eventDescription = [self getDescriptionForErrorEvent:eventIdentifier];
|
||||
if (eventDescription) {
|
||||
[userInfo setObject:eventDescription forKey:NSLocalizedFailureReasonErrorKey];
|
||||
}
|
||||
NSString *errorReason = [self reasonForError:errorCode];
|
||||
[userInfo setObject:errorReason != nil ? errorReason : @"See error message." forKey:NSLocalizedFailureReasonErrorKey];
|
||||
[userInfo setObject:errorReason != nil ? @(YES) : @(NO) forKey:OpenVPNAdapterErrorContainsReasonKey];
|
||||
|
||||
if (eventMessage != nil && ![eventMessage isEqualToString:@""]) {
|
||||
[userInfo setObject:eventMessage forKey:NSLocalizedDescriptionKey];
|
||||
if (message != nil && ![message isEqualToString:@""]) {
|
||||
[userInfo setObject:message forKey:OpenVPNAdapterErrorMessageKey];
|
||||
}
|
||||
|
||||
NSError *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain
|
||||
code:OpenVPNErrorClientFailure
|
||||
code:errorCode
|
||||
userInfo:[userInfo copy]];
|
||||
|
||||
[self performAsyncBlock:^{
|
||||
[self.delegate handleError:error];
|
||||
}];
|
||||
} else {
|
||||
OpenVPNEvent eventIdentifier = [self eventByName:name];
|
||||
[self performAsyncBlock:^{
|
||||
[self.delegate handleEvent:eventIdentifier message:eventMessage == nil || [eventMessage isEqualToString:@""] ? nil : eventMessage];
|
||||
[self.delegate handleEvent:eventIdentifier message:message == nil || [message isEqualToString:@""] ? nil : message];
|
||||
}];
|
||||
}
|
||||
}
|
||||
@@ -445,7 +447,11 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
ClientAPI::EvalConfig eval = self.vpnClient->eval_config(configuration.config);
|
||||
if (eval.error) {
|
||||
if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{
|
||||
NSLocalizedDescriptionKey: [NSString stringWithUTF8String:eval.message.c_str()]
|
||||
NSLocalizedDescriptionKey: @"Failed to apply OpenVPN configuration.",
|
||||
NSLocalizedFailureReasonErrorKey: @"See error message.",
|
||||
OpenVPNAdapterErrorContainsReasonKey: @(NO),
|
||||
OpenVPNAdapterErrorMessageKey: [NSString stringWithUTF8String:eval.message.c_str()],
|
||||
OpenVPNAdapterErrorFatalKey: @(YES)
|
||||
}];
|
||||
return nil;
|
||||
}
|
||||
@@ -454,11 +460,20 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
}
|
||||
|
||||
- (BOOL)provideCredentials:(nonnull OpenVPNCredentials *)credentials error:(out NSError * __nullable * __nullable)error {
|
||||
ClientAPI::Status creds_status = self.vpnClient->provide_creds(credentials.credentials);
|
||||
if (creds_status.error) {
|
||||
if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{
|
||||
NSLocalizedDescriptionKey: [NSString stringWithUTF8String:creds_status.message.c_str()]
|
||||
}];
|
||||
ClientAPI::Status status = self.vpnClient->provide_creds(credentials.credentials);
|
||||
if (status.error) {
|
||||
if (error) {
|
||||
OpenVPNError errorCode = !status.status.empty() ? [self errorByName:[NSString stringWithUTF8String:status.status.c_str()]] : OpenVPNErrorCredentialsFailure;
|
||||
NSString *errorReason = [self reasonForError:errorCode];
|
||||
|
||||
*error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:errorCode userInfo:@{
|
||||
NSLocalizedDescriptionKey: @"Failed to provide OpenVPN credentials.",
|
||||
NSLocalizedFailureReasonErrorKey: errorReason != nil ? errorReason : @"See error message.",
|
||||
OpenVPNAdapterErrorContainsReasonKey: errorReason != nil ? @(YES) : @(NO),
|
||||
OpenVPNAdapterErrorMessageKey: [NSString stringWithUTF8String:status.message.c_str()],
|
||||
OpenVPNAdapterErrorFatalKey: @(YES)
|
||||
}];
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
@@ -477,24 +492,18 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
|
||||
self.searchDomains = [NSMutableArray new];
|
||||
|
||||
try {
|
||||
ClientAPI::Status status = self.vpnClient->connect();
|
||||
if (status.error) {
|
||||
NSError *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain
|
||||
code:OpenVPNErrorClientFailure
|
||||
userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithUTF8String:status.message.c_str()],
|
||||
OpenVPNAdapterErrorFatalKey: @(YES),
|
||||
OpenVPNAdapterErrorEventIdentifierKey: @(OpenVPNEventConnectionFailed) }];
|
||||
[self performAsyncBlock:^{
|
||||
[self.delegate handleError:error];
|
||||
}];
|
||||
}
|
||||
} catch(const std::exception& e) {
|
||||
ClientAPI::Status status = self.vpnClient->connect();
|
||||
if (status.error) {
|
||||
OpenVPNError errorCode = !status.status.empty() ? [self errorByName:[NSString stringWithUTF8String:status.status.c_str()]] : OpenVPNErrorUnknown;
|
||||
NSString *errorReason = [self reasonForError:errorCode];
|
||||
|
||||
NSError *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain
|
||||
code:OpenVPNErrorClientFailure
|
||||
userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithUTF8String:e.what()],
|
||||
OpenVPNAdapterErrorFatalKey: @(YES),
|
||||
OpenVPNAdapterErrorEventIdentifierKey: @(OpenVPNEventConnectionFailed) }];
|
||||
code:errorCode
|
||||
userInfo:@{ NSLocalizedDescriptionKey: @"Failed to establish connection with OpenVPN server.",
|
||||
NSLocalizedFailureReasonErrorKey: errorReason != nil ? errorReason : @"See error message.",
|
||||
OpenVPNAdapterErrorContainsReasonKey: errorReason != nil ? @(YES) : @(NO),
|
||||
OpenVPNAdapterErrorMessageKey: [NSString stringWithUTF8String:status.message.c_str()],
|
||||
OpenVPNAdapterErrorFatalKey: @(YES) }];
|
||||
[self performAsyncBlock:^{
|
||||
[self.delegate handleError:error];
|
||||
}];
|
||||
@@ -613,7 +622,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
[packet getBytes:&header length:1];
|
||||
|
||||
uint32_t version = openvpn::IPHeader::version(header);
|
||||
uint8_t protocol = [self getProtocolFamily:version];
|
||||
uint8_t protocol = [self protocolFamilyForVersion:version];
|
||||
|
||||
NSData *data = packet;
|
||||
#endif
|
||||
@@ -626,7 +635,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
|
||||
#pragma mark Utils
|
||||
|
||||
- (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName {
|
||||
- (OpenVPNEvent)eventByName:(NSString *)eventName {
|
||||
NSDictionary *events = @{
|
||||
@"DISCONNECTED": @(OpenVPNEventDisconnected),
|
||||
@"CONNECTED": @(OpenVPNEventConnected),
|
||||
@@ -642,59 +651,147 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
||||
@"INFO": @(OpenVPNEventInfo),
|
||||
@"PAUSE": @(OpenVPNEventPause),
|
||||
@"RESUME": @(OpenVPNEventResume),
|
||||
@"RELAY": @(OpenVPNEventRelay),
|
||||
@"TRANSPORT_ERROR": @(OpenVPNEventTransportError),
|
||||
@"TUN_ERROR": @(OpenVPNEventTunError),
|
||||
@"CLIENT_RESTART": @(OpenVPNEventClientRestart),
|
||||
@"AUTH_FAILED": @(OpenVPNEventAuthFailed),
|
||||
@"CERT_VERIFY_FAIL": @(OpenVPNEventCertVerifyFail),
|
||||
@"TLS_VERSION_MIN": @(OpenVPNEventTLSVersionMin),
|
||||
@"CLIENT_HALT": @(OpenVPNEventClientHalt),
|
||||
@"CONNECTION_TIMEOUT": @(OpenVPNEventConnectionTimeout),
|
||||
@"INACTIVE_TIMEOUT": @(OpenVPNEventInactiveTimeout),
|
||||
@"DYNAMIC_CHALLENGE": @(OpenVPNEventDynamicChallenge),
|
||||
@"PROXY_NEED_CREDS": @(OpenVPNEventProxyNeedCreds),
|
||||
@"PROXY_ERROR": @(OpenVPNEventProxyError),
|
||||
@"TUN_SETUP_FAILED": @(OpenVPNEventTunSetupFailed),
|
||||
@"TUN_IFACE_CREATE": @(OpenVPNEventTunIfaceCreate),
|
||||
@"TUN_IFACE_DISABLED": @(OpenVPNEventTunIfaceDisabled),
|
||||
@"EPKI_ERROR": @(OpenVPNEventEPKIError),
|
||||
@"EPKI_INVALID_ALIAS": @(OpenVPNEventEPKIInvalidAlias),
|
||||
@"RELAY_ERROR": @(OpenVPNEventRelayError)
|
||||
@"RELAY": @(OpenVPNEventRelay)
|
||||
};
|
||||
|
||||
OpenVPNEvent event = events[eventName] != nil ? (OpenVPNEvent)[(NSNumber *)events[eventName] unsignedIntegerValue] : OpenVPNEventUnknown;
|
||||
OpenVPNEvent event = events[eventName] != nil ? (OpenVPNEvent)[events[eventName] integerValue] : OpenVPNEventUnknown;
|
||||
return event;
|
||||
}
|
||||
|
||||
- (NSString *)getDescriptionForErrorEvent:(OpenVPNEvent)event {
|
||||
switch (event) {
|
||||
case OpenVPNEventTransportError: return @"General transport error.";
|
||||
case OpenVPNEventTunError: return @"General tun error.";
|
||||
case OpenVPNEventClientRestart: return @"RESTART message from server received.";
|
||||
case OpenVPNEventAuthFailed: return @"General authentication failure.";
|
||||
case OpenVPNEventCertVerifyFail: return @"Peer certificate verification failure.";
|
||||
case OpenVPNEventTLSVersionMin: return @"Peer cannot handshake at our minimum required TLS version.";
|
||||
case OpenVPNEventClientHalt: return @"HALT message from server received.";
|
||||
case OpenVPNEventConnectionTimeout: return @"Connection failed to establish within given time.";
|
||||
case OpenVPNEventInactiveTimeout: return @"Disconnected due to inactive timer.";
|
||||
case OpenVPNEventProxyNeedCreds: return @"HTTP proxy needs credentials.";
|
||||
case OpenVPNEventProxyError: return @"HTTP proxy error.";
|
||||
case OpenVPNEventTunSetupFailed: return @"Error setting up TUN interface.";
|
||||
case OpenVPNEventTunIfaceCreate: return @"Error creating TUN interface.";
|
||||
case OpenVPNEventTunIfaceDisabled: return @"TUN interface is disabled.";
|
||||
case OpenVPNEventRelayError: return @"RELAY error.";
|
||||
|
||||
- (OpenVPNError)errorByName:(NSString *)errorName {
|
||||
NSDictionary *errors = @{
|
||||
@"NETWORK_RECV_ERROR": @(OpenVPNErrorNetworkRecvError),
|
||||
@"NETWORK_EOF_ERROR": @(OpenVPNErrorNetworkEOFError),
|
||||
@"NETWORK_SEND_ERROR": @(OpenVPNErrorNetworkSendError),
|
||||
@"NETWORK_UNAVAILABLE": @(OpenVPNErrorNetworkUnavailable),
|
||||
@"DECRYPT_ERROR": @(OpenVPNErrorDecryptError),
|
||||
@"HMAC_ERROR": @(OpenVPNErrorDecryptError),
|
||||
@"REPLAY_ERROR": @(OpenVPNErrorReplayError),
|
||||
@"BUFFER_ERROR": @(OpenVPNErrorBufferError),
|
||||
@"CC_ERROR": @(OpenVPNErrorCCError),
|
||||
@"BAD_SRC_ADDR": @(OpenVPNErrorBadSrcAddr),
|
||||
@"COMPRESS_ERROR": @(OpenVPNErrorCompressError),
|
||||
@"RESOLVE_ERROR": @(OpenVPNErrorResolveError),
|
||||
@"SOCKET_PROTECT_ERROR": @(OpenVPNErrorSocketProtectError),
|
||||
@"TUN_READ_ERROR": @(OpenVPNErrorTUNReadError),
|
||||
@"TUN_WRITE_ERROR": @(OpenVPNErrorTUNWriteError),
|
||||
@"TUN_FRAMING_ERROR": @(OpenVPNErrorTUNFramingError),
|
||||
@"TUN_SETUP_FAILED": @(OpenVPNErrorTUNSetupFailed),
|
||||
@"TUN_IFACE_CREATE": @(OpenVPNErrorTUNIfaceCreate),
|
||||
@"TUN_IFACE_DISABLED": @(OpenVPNErrorTUNIfaceDisabled),
|
||||
@"TUN_ERROR": @(OpenVPNErrorTUNError),
|
||||
@"TAP_NOT_SUPPORTED": @(OpenVPNErrorTAPNotSupported),
|
||||
@"REROUTE_GW_NO_DNS": @(OpenVPNErrorRerouteGatewayNoDns),
|
||||
@"TRANSPORT_ERROR": @(OpenVPNErrorTransportError),
|
||||
@"TCP_OVERFLOW": @(OpenVPNErrorTCPOverflow),
|
||||
@"TCP_SIZE_ERROR": @(OpenVPNErrorTCPSizeError),
|
||||
@"TCP_CONNECT_ERROR": @(OpenVPNErrorTCPConnectError),
|
||||
@"UDP_CONNECT_ERROR": @(OpenVPNErrorUDPConnectError),
|
||||
@"SSL_ERROR": @(OpenVPNErrorSSLError),
|
||||
@"SSL_PARTIAL_WRITE": @(OpenVPNErrorSSLPartialWrite),
|
||||
@"ENCAPSULATION_ERROR": @(OpenVPNErrorEncapsulationError),
|
||||
@"EPKI_CERT_ERROR": @(OpenVPNErrorEPKICertError),
|
||||
@"EPKI_SIGN_ERROR": @(OpenVPNErrorEPKISignError),
|
||||
@"HANDSHAKE_TIMEOUT": @(OpenVPNErrorHandshakeTimeout),
|
||||
@"KEEPALIVE_TIMEOUT": @(OpenVPNErrorKeepaliveTimeout),
|
||||
@"INACTIVE_TIMEOUT": @(OpenVPNErrorInactiveTimeout),
|
||||
@"CONNECTION_TIMEOUT": @(OpenVPNErrorConnectionTimeout),
|
||||
@"PRIMARY_EXPIRE": @(OpenVPNErrorPrimaryExpire),
|
||||
@"TLS_VERSION_MIN": @(OpenVPNErrorTLSVersionMin),
|
||||
@"TLS_AUTH_FAIL": @(OpenVPNErrorTLSAuthFail),
|
||||
@"CERT_VERIFY_FAIL": @(OpenVPNErrorCertVerifyFail),
|
||||
@"PEM_PASSWORD_FAIL": @(OpenVPNErrorPEMPasswordFail),
|
||||
@"AUTH_FAILED": @(OpenVPNErrorAuthFailed),
|
||||
@"CLIENT_HALT": @(OpenVPNErrorClientHalt),
|
||||
@"CLIENT_RESTART": @(OpenVPNErrorClientRestart),
|
||||
@"RELAY": @(OpenVPNErrorRelay),
|
||||
@"RELAY_ERROR": @(OpenVPNErrorRelayError),
|
||||
@"N_PAUSE": @(OpenVPNErrorPauseNumber),
|
||||
@"N_RECONNECT": @(OpenVPNErrorReconnectNumber),
|
||||
@"N_KEY_LIMIT_RENEG": @(OpenVPNErrorKeyLimitRenegNumber),
|
||||
@"KEY_STATE_ERROR": @(OpenVPNErrorKeyStateError),
|
||||
@"PROXY_ERROR": @(OpenVPNErrorProxyError),
|
||||
@"PROXY_NEED_CREDS": @(OpenVPNErrorProxyNeedCreds),
|
||||
@"KEV_NEGOTIATE_ERROR": @(OpenVPNErrorKevNegotiateError),
|
||||
@"KEV_PENDING_ERROR": @(OpenVPNErrorKevPendingError),
|
||||
@"N_KEV_EXPIRE": @(OpenVPNErrorKevExpireNumber),
|
||||
@"PKTID_INVALID": @(OpenVPNErrorPKTIDInvalid),
|
||||
@"PKTID_BACKTRACK": @(OpenVPNErrorPKTIDBacktrack),
|
||||
@"PKTID_EXPIRE": @(OpenVPNErrorPKTIDExpire),
|
||||
@"PKTID_REPLAY": @(OpenVPNErrorPKTIDReplay),
|
||||
@"PKTID_TIME_BACKTRACK": @(OpenVPNErrorPKTIDTimeBacktrack),
|
||||
@"DYNAMIC_CHALLENGE": @(OpenVPNErrorDynamicChallenge),
|
||||
@"EPKI_ERROR": @(OpenVPNErrorEPKIError),
|
||||
@"EPKI_INVALID_ALIAS": @(OpenVPNErrorEPKIInvalidAlias),
|
||||
};
|
||||
|
||||
OpenVPNError error = errors[errorName] != nil ? (OpenVPNError)[errors[errorName] integerValue] : OpenVPNErrorUnknown;
|
||||
return error;
|
||||
|
||||
}
|
||||
|
||||
- (NSString *)reasonForError:(OpenVPNError)error {
|
||||
switch (error) {
|
||||
case OpenVPNErrorNetworkRecvError: return @"Errors receiving on network socket.";
|
||||
case OpenVPNErrorNetworkEOFError: return @"EOF received on TCP network socket.";
|
||||
case OpenVPNErrorNetworkSendError: return @"Errors sending on network socket";
|
||||
case OpenVPNErrorNetworkUnavailable: return @"Network unavailable.";
|
||||
case OpenVPNErrorDecryptError: return @"Data channel encrypt/decrypt error.";
|
||||
case OpenVPNErrorHMACError: return @"HMAC verification failure.";
|
||||
case OpenVPNErrorReplayError: return @"Error from PacketIDReceive.";
|
||||
case OpenVPNErrorBufferError: return @"Exception thrown in Buffer methods.";
|
||||
case OpenVPNErrorCCError: return @"General control channel errors.";
|
||||
case OpenVPNErrorBadSrcAddr: return @"Packet from unknown source address.";
|
||||
case OpenVPNErrorCompressError: return @"Compress/Decompress errors on data channel.";
|
||||
case OpenVPNErrorResolveError: return @"DNS resolution error.";
|
||||
case OpenVPNErrorSocketProtectError: return @"Error calling protect() method on socket.";
|
||||
case OpenVPNErrorTUNReadError: return @"Read errors on TUN/TAP interface.";
|
||||
case OpenVPNErrorTUNWriteError: return @"Write errors on TUN/TAP interface.";
|
||||
case OpenVPNErrorTUNFramingError: return @"Error with tun PF_INET/PF_INET6 prefix.";
|
||||
case OpenVPNErrorTUNSetupFailed: return @"Error setting up TUN/TAP interface.";
|
||||
case OpenVPNErrorTUNIfaceCreate: return @"Error creating TUN/TAP interface.";
|
||||
case OpenVPNErrorTUNIfaceDisabled: return @"TUN/TAP interface is disabled.";
|
||||
case OpenVPNErrorTUNError: return @"General tun error.";
|
||||
case OpenVPNErrorTAPNotSupported: return @"Dev TAP is present in profile but not supported.";
|
||||
case OpenVPNErrorRerouteGatewayNoDns: return @"redirect-gateway specified without alt DNS servers.";
|
||||
case OpenVPNErrorTransportError: return @"General transport error";
|
||||
case OpenVPNErrorTCPOverflow: return @"TCP output queue overflow.";
|
||||
case OpenVPNErrorTCPSizeError: return @"Bad embedded uint16_t TCP packet size.";
|
||||
case OpenVPNErrorTCPConnectError: return @"Client error on TCP connect.";
|
||||
case OpenVPNErrorUDPConnectError: return @"Client error on UDP connect.";
|
||||
case OpenVPNErrorSSLError: return @"Errors resulting from read/write on SSL object.";
|
||||
case OpenVPNErrorSSLPartialWrite: return @"SSL object did not process all written cleartext.";
|
||||
case OpenVPNErrorEncapsulationError: return @"Exceptions thrown during packet encapsulation.";
|
||||
case OpenVPNErrorEPKICertError: return @"Error obtaining certificate from External PKI provider.";
|
||||
case OpenVPNErrorEPKISignError: return @"Error obtaining RSA signature from External PKI provider.";
|
||||
case OpenVPNErrorHandshakeTimeout: return @"Handshake failed to complete within given time frame.";
|
||||
case OpenVPNErrorKeepaliveTimeout: return @"Lost contact with peer.";
|
||||
case OpenVPNErrorInactiveTimeout: return @"Disconnected due to inactive timer.";
|
||||
case OpenVPNErrorConnectionTimeout: return @"Connection failed to establish within given time.";
|
||||
case OpenVPNErrorPrimaryExpire: return @"Primary key context expired.";
|
||||
case OpenVPNErrorTLSVersionMin: return @"Peer cannot handshake at our minimum required TLS version.";
|
||||
case OpenVPNErrorTLSAuthFail: return @"tls-auth HMAC verification failed.";
|
||||
case OpenVPNErrorCertVerifyFail: return @"Peer certificate verification failure.";
|
||||
case OpenVPNErrorPEMPasswordFail: return @"Incorrect or missing PEM private key decryption password.";
|
||||
case OpenVPNErrorAuthFailed: return @"General authentication failure";
|
||||
case OpenVPNErrorClientHalt: return @"HALT message from server received.";
|
||||
case OpenVPNErrorClientRestart: return @"RESTART message from server received.";
|
||||
case OpenVPNErrorRelay: return @"RELAY message from server received.";
|
||||
case OpenVPNErrorRelayError: return @"RELAY error.";
|
||||
case OpenVPNErrorKeyStateError: return @"Received packet didn't match expected key state.";
|
||||
case OpenVPNErrorProxyError: return @"HTTP proxy error.";
|
||||
case OpenVPNErrorProxyNeedCreds: return @"HTTP proxy needs credentials.";
|
||||
case OpenVPNErrorUnknown: return @"Occured unknown error.";
|
||||
default: return nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength {
|
||||
- (NSString *)subnetFromPrefixLength:(NSNumber *)prefixLength {
|
||||
std::string subnet = openvpn::IPv4::Addr::netmask_from_prefix_len([prefixLength intValue]).to_string();
|
||||
return [NSString stringWithUTF8String:subnet.c_str()];
|
||||
}
|
||||
|
||||
- (uint8_t)getProtocolFamily:(uint32_t)version {
|
||||
- (uint8_t)protocolFamilyForVersion:(uint32_t)version {
|
||||
switch (version) {
|
||||
case 4: return PF_INET;
|
||||
case 6: return PF_INET6;
|
||||
|
||||
@@ -11,12 +11,77 @@
|
||||
FOUNDATION_EXPORT NSString * __nonnull const OpenVPNAdapterErrorDomain;
|
||||
|
||||
FOUNDATION_EXPORT NSString * __nonnull const OpenVPNAdapterErrorFatalKey;
|
||||
FOUNDATION_EXPORT NSString * __nonnull const OpenVPNAdapterErrorEventIdentifierKey;
|
||||
FOUNDATION_EXPORT NSString * __nonnull const OpenVPNAdapterErrorMessageKey;
|
||||
FOUNDATION_EXPORT NSString * __nonnull const OpenVPNAdapterErrorContainsReasonKey;
|
||||
|
||||
/**
|
||||
<#Description#>
|
||||
OpenVPN error codes
|
||||
*/
|
||||
typedef NS_ENUM(NSUInteger, OpenVPNError) {
|
||||
OpenVPNErrorConfigurationFailure,
|
||||
OpenVPNErrorClientFailure
|
||||
typedef NS_ENUM(NSInteger, OpenVPNError) {
|
||||
OpenVPNErrorConfigurationFailure = 1,
|
||||
OpenVPNErrorCredentialsFailure,
|
||||
OpenVPNErrorNetworkRecvError,
|
||||
OpenVPNErrorNetworkEOFError,
|
||||
OpenVPNErrorNetworkSendError,
|
||||
OpenVPNErrorNetworkUnavailable,
|
||||
OpenVPNErrorDecryptError,
|
||||
OpenVPNErrorHMACError,
|
||||
OpenVPNErrorReplayError,
|
||||
OpenVPNErrorBufferError,
|
||||
OpenVPNErrorCCError,
|
||||
OpenVPNErrorBadSrcAddr,
|
||||
OpenVPNErrorCompressError,
|
||||
OpenVPNErrorResolveError,
|
||||
OpenVPNErrorSocketProtectError,
|
||||
OpenVPNErrorTUNReadError,
|
||||
OpenVPNErrorTUNWriteError,
|
||||
OpenVPNErrorTUNFramingError,
|
||||
OpenVPNErrorTUNSetupFailed,
|
||||
OpenVPNErrorTUNIfaceCreate,
|
||||
OpenVPNErrorTUNIfaceDisabled,
|
||||
OpenVPNErrorTUNError,
|
||||
OpenVPNErrorTAPNotSupported,
|
||||
OpenVPNErrorRerouteGatewayNoDns,
|
||||
OpenVPNErrorTransportError,
|
||||
OpenVPNErrorTCPOverflow,
|
||||
OpenVPNErrorTCPSizeError,
|
||||
OpenVPNErrorTCPConnectError,
|
||||
OpenVPNErrorUDPConnectError,
|
||||
OpenVPNErrorSSLError,
|
||||
OpenVPNErrorSSLPartialWrite,
|
||||
OpenVPNErrorEncapsulationError,
|
||||
OpenVPNErrorEPKICertError,
|
||||
OpenVPNErrorEPKISignError,
|
||||
OpenVPNErrorHandshakeTimeout,
|
||||
OpenVPNErrorKeepaliveTimeout,
|
||||
OpenVPNErrorInactiveTimeout,
|
||||
OpenVPNErrorConnectionTimeout,
|
||||
OpenVPNErrorPrimaryExpire,
|
||||
OpenVPNErrorTLSVersionMin,
|
||||
OpenVPNErrorTLSAuthFail,
|
||||
OpenVPNErrorCertVerifyFail,
|
||||
OpenVPNErrorPEMPasswordFail,
|
||||
OpenVPNErrorAuthFailed,
|
||||
OpenVPNErrorClientHalt,
|
||||
OpenVPNErrorClientRestart,
|
||||
OpenVPNErrorRelay,
|
||||
OpenVPNErrorRelayError,
|
||||
OpenVPNErrorPauseNumber,
|
||||
OpenVPNErrorReconnectNumber,
|
||||
OpenVPNErrorKeyLimitRenegNumber,
|
||||
OpenVPNErrorKeyStateError,
|
||||
OpenVPNErrorProxyError,
|
||||
OpenVPNErrorProxyNeedCreds,
|
||||
OpenVPNErrorKevNegotiateError,
|
||||
OpenVPNErrorKevPendingError,
|
||||
OpenVPNErrorKevExpireNumber,
|
||||
OpenVPNErrorPKTIDInvalid,
|
||||
OpenVPNErrorPKTIDBacktrack,
|
||||
OpenVPNErrorPKTIDExpire,
|
||||
OpenVPNErrorPKTIDReplay,
|
||||
OpenVPNErrorPKTIDTimeBacktrack,
|
||||
OpenVPNErrorDynamicChallenge,
|
||||
OpenVPNErrorEPKIError,
|
||||
OpenVPNErrorEPKIInvalidAlias,
|
||||
OpenVPNErrorUnknown
|
||||
};
|
||||
|
||||
@@ -11,4 +11,5 @@
|
||||
NSString * const OpenVPNAdapterErrorDomain = @"me.ss-abramchuk.openvpn-adapter.error-domain";
|
||||
|
||||
NSString * const OpenVPNAdapterErrorFatalKey = @"me.ss-abramchuk.openvpn-adapter.error-key.fatal";
|
||||
NSString * const OpenVPNAdapterErrorEventIdentifierKey = @"me.ss-abramchuk.openvpn-adapter.error-key.event";
|
||||
NSString * const OpenVPNAdapterErrorMessageKey = @"me.ss-abramchuk.openvpn-adapter.error-key.message";
|
||||
NSString * const OpenVPNAdapterErrorContainsReasonKey = @"me.ss-abramchuk.openvpn-adapter.error-key.contains-reason";
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
/**
|
||||
<#Description#>
|
||||
OpenVPN event codes
|
||||
*/
|
||||
typedef NS_ENUM(NSUInteger, OpenVPNEvent) {
|
||||
typedef NS_ENUM(NSInteger, OpenVPNEvent) {
|
||||
OpenVPNEventDisconnected,
|
||||
OpenVPNEventConnected,
|
||||
OpenVPNEventReconnecting,
|
||||
@@ -27,25 +27,5 @@ typedef NS_ENUM(NSUInteger, OpenVPNEvent) {
|
||||
OpenVPNEventPause,
|
||||
OpenVPNEventResume,
|
||||
OpenVPNEventRelay,
|
||||
OpenVPNEventTransportError,
|
||||
OpenVPNEventTunError,
|
||||
OpenVPNEventClientRestart,
|
||||
OpenVPNEventAuthFailed,
|
||||
OpenVPNEventCertVerifyFail,
|
||||
OpenVPNEventTLSVersionMin,
|
||||
OpenVPNEventClientHalt,
|
||||
OpenVPNEventConnectionTimeout,
|
||||
OpenVPNEventInactiveTimeout,
|
||||
OpenVPNEventDynamicChallenge,
|
||||
OpenVPNEventProxyNeedCreds,
|
||||
OpenVPNEventProxyError,
|
||||
OpenVPNEventTunSetupFailed,
|
||||
OpenVPNEventTunIfaceCreate,
|
||||
OpenVPNEventTunIfaceDisabled,
|
||||
OpenVPNEventEPKIError,
|
||||
OpenVPNEventEPKIInvalidAlias,
|
||||
OpenVPNEventRelayError,
|
||||
OpenVPNEventInitializationFailed,
|
||||
OpenVPNEventConnectionFailed,
|
||||
OpenVPNEventUnknown
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user