hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2015 The WebRTC project authors. All Rights Reserved. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license |
| 5 | * that can be found in the LICENSE file in the root of the source |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
| 10 | |
tkchin | 9eeb624 | 2016-04-27 01:54:20 -0700 | [diff] [blame] | 11 | #import "RTCIceServer+Private.h" |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 12 | #import "RTCSSLConfig+Native.h" |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 13 | |
Anders Carlsson | 7bca8ca | 2018-08-30 09:30:29 +0200 | [diff] [blame] | 14 | #import "helpers/NSString+StdString.h" |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 15 | |
| 16 | @implementation RTCIceServer |
| 17 | |
| 18 | @synthesize urlStrings = _urlStrings; |
| 19 | @synthesize username = _username; |
| 20 | @synthesize credential = _credential; |
hnsl | 6741516 | 2017-02-02 13:04:27 -0800 | [diff] [blame] | 21 | @synthesize tlsCertPolicy = _tlsCertPolicy; |
Emad Omara | dab1d2d | 2017-06-16 15:43:11 -0700 | [diff] [blame] | 22 | @synthesize hostname = _hostname; |
Diogo Real | 1dca9d5 | 2017-08-29 12:18:32 -0700 | [diff] [blame] | 23 | @synthesize tlsAlpnProtocols = _tlsAlpnProtocols; |
Diogo Real | 7bd1f1b | 2017-09-08 12:50:41 -0700 | [diff] [blame] | 24 | @synthesize tlsEllipticCurves = _tlsEllipticCurves; |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 25 | @synthesize sslConfig = _sslConfig; |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 26 | |
Jon Hjelle | 32e0c01 | 2016-03-08 16:04:46 -0800 | [diff] [blame] | 27 | - (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings { |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 28 | return [self initWithURLStrings:urlStrings |
| 29 | username:nil |
| 30 | credential:nil]; |
| 31 | } |
| 32 | |
Jon Hjelle | 32e0c01 | 2016-03-08 16:04:46 -0800 | [diff] [blame] | 33 | - (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 34 | username:(NSString *)username |
| 35 | credential:(NSString *)credential { |
hnsl | 6741516 | 2017-02-02 13:04:27 -0800 | [diff] [blame] | 36 | return [self initWithURLStrings:urlStrings |
| 37 | username:username |
| 38 | credential:credential |
| 39 | tlsCertPolicy:RTCTlsCertPolicySecure]; |
| 40 | } |
| 41 | |
| 42 | - (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings |
| 43 | username:(NSString *)username |
| 44 | credential:(NSString *)credential |
| 45 | tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy { |
Emad Omara | dab1d2d | 2017-06-16 15:43:11 -0700 | [diff] [blame] | 46 | return [self initWithURLStrings:urlStrings |
| 47 | username:username |
| 48 | credential:credential |
Emad Omara | cadd306 | 2017-06-19 15:19:26 -0700 | [diff] [blame] | 49 | tlsCertPolicy:tlsCertPolicy |
Emad Omara | dab1d2d | 2017-06-16 15:43:11 -0700 | [diff] [blame] | 50 | hostname:nil]; |
| 51 | } |
| 52 | |
| 53 | - (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings |
| 54 | username:(NSString *)username |
| 55 | credential:(NSString *)credential |
| 56 | tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy |
| 57 | hostname:(NSString *)hostname { |
Diogo Real | 1dca9d5 | 2017-08-29 12:18:32 -0700 | [diff] [blame] | 58 | return [self initWithURLStrings:urlStrings |
| 59 | username:username |
| 60 | credential:credential |
| 61 | tlsCertPolicy:tlsCertPolicy |
| 62 | hostname:hostname |
Diogo Real | 7bd1f1b | 2017-09-08 12:50:41 -0700 | [diff] [blame] | 63 | tlsAlpnProtocols:[NSArray array]]; |
Diogo Real | 1dca9d5 | 2017-08-29 12:18:32 -0700 | [diff] [blame] | 64 | } |
| 65 | |
| 66 | - (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings |
| 67 | username:(NSString *)username |
| 68 | credential:(NSString *)credential |
| 69 | tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy |
| 70 | hostname:(NSString *)hostname |
| 71 | tlsAlpnProtocols:(NSArray<NSString *> *)tlsAlpnProtocols { |
Diogo Real | 7bd1f1b | 2017-09-08 12:50:41 -0700 | [diff] [blame] | 72 | return [self initWithURLStrings:urlStrings |
| 73 | username:username |
| 74 | credential:credential |
| 75 | tlsCertPolicy:tlsCertPolicy |
| 76 | hostname:hostname |
| 77 | tlsAlpnProtocols:tlsAlpnProtocols |
| 78 | tlsEllipticCurves:[NSArray array]]; |
| 79 | } |
| 80 | |
| 81 | - (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings |
| 82 | username:(NSString *)username |
| 83 | credential:(NSString *)credential |
| 84 | tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy |
| 85 | hostname:(NSString *)hostname |
| 86 | tlsAlpnProtocols:(NSArray<NSString *> *)tlsAlpnProtocols |
| 87 | tlsEllipticCurves:(NSArray<NSString *> *)tlsEllipticCurves { |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 88 | RTCSSLConfig *sslConfig = [[RTCSSLConfig alloc] init]; |
| 89 | sslConfig.tlsCertPolicy = tlsCertPolicy; |
| 90 | sslConfig.tlsALPNProtocols = [[NSArray alloc] initWithArray:tlsAlpnProtocols copyItems:YES]; |
| 91 | sslConfig.tlsEllipticCurves = [[NSArray alloc] initWithArray:tlsEllipticCurves copyItems:YES]; |
| 92 | return [self initWithURLStrings:urlStrings |
| 93 | username:username |
| 94 | credential:credential |
| 95 | hostname:hostname |
| 96 | sslConfig:sslConfig]; |
| 97 | } |
| 98 | |
| 99 | - (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings |
| 100 | username:(NSString *)username |
| 101 | credential:(NSString *)credential |
| 102 | hostname:(NSString *)hostname |
| 103 | sslConfig:(RTCSSLConfig *)sslConfig { |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 104 | NSParameterAssert(urlStrings.count); |
| 105 | if (self = [super init]) { |
| 106 | _urlStrings = [[NSArray alloc] initWithArray:urlStrings copyItems:YES]; |
| 107 | _username = [username copy]; |
| 108 | _credential = [credential copy]; |
Emad Omara | dab1d2d | 2017-06-16 15:43:11 -0700 | [diff] [blame] | 109 | _hostname = [hostname copy]; |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 110 | _sslConfig = sslConfig; |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 111 | } |
| 112 | return self; |
| 113 | } |
| 114 | |
| 115 | - (NSString *)description { |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 116 | return [NSString stringWithFormat:@"RTCIceServer:\n%@\n%@\n%@\n%@\n%@", |
Emad Omara | dab1d2d | 2017-06-16 15:43:11 -0700 | [diff] [blame] | 117 | _urlStrings, |
| 118 | _username, |
| 119 | _credential, |
Diogo Real | 1dca9d5 | 2017-08-29 12:18:32 -0700 | [diff] [blame] | 120 | _hostname, |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 121 | _sslConfig]; |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 122 | } |
| 123 | |
| 124 | #pragma mark - Private |
| 125 | |
hnsl | 6741516 | 2017-02-02 13:04:27 -0800 | [diff] [blame] | 126 | - (NSString *)stringForTlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy { |
| 127 | switch (tlsCertPolicy) { |
| 128 | case RTCTlsCertPolicySecure: |
| 129 | return @"RTCTlsCertPolicySecure"; |
| 130 | case RTCTlsCertPolicyInsecureNoCheck: |
| 131 | return @"RTCTlsCertPolicyInsecureNoCheck"; |
| 132 | } |
| 133 | } |
| 134 | |
hjon | a2f7798 | 2016-03-04 07:09:09 -0800 | [diff] [blame] | 135 | - (webrtc::PeerConnectionInterface::IceServer)nativeServer { |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 136 | __block webrtc::PeerConnectionInterface::IceServer iceServer; |
| 137 | |
| 138 | iceServer.username = [NSString stdStringForString:_username]; |
| 139 | iceServer.password = [NSString stdStringForString:_credential]; |
Emad Omara | dab1d2d | 2017-06-16 15:43:11 -0700 | [diff] [blame] | 140 | iceServer.hostname = [NSString stdStringForString:_hostname]; |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 141 | |
Diogo Real | 1dca9d5 | 2017-08-29 12:18:32 -0700 | [diff] [blame] | 142 | [_tlsAlpnProtocols enumerateObjectsUsingBlock:^(NSString *proto, NSUInteger idx, BOOL *stop) { |
| 143 | iceServer.tls_alpn_protocols.push_back(proto.stdString); |
| 144 | }]; |
| 145 | |
Diogo Real | 7bd1f1b | 2017-09-08 12:50:41 -0700 | [diff] [blame] | 146 | [_tlsEllipticCurves enumerateObjectsUsingBlock:^(NSString *curve, NSUInteger idx, BOOL *stop) { |
| 147 | iceServer.tls_elliptic_curves.push_back(curve.stdString); |
| 148 | }]; |
| 149 | |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 150 | [_urlStrings enumerateObjectsUsingBlock:^(NSString *url, |
| 151 | NSUInteger idx, |
| 152 | BOOL *stop) { |
| 153 | iceServer.urls.push_back(url.stdString); |
| 154 | }]; |
hnsl | 6741516 | 2017-02-02 13:04:27 -0800 | [diff] [blame] | 155 | |
| 156 | switch (_tlsCertPolicy) { |
| 157 | case RTCTlsCertPolicySecure: |
| 158 | iceServer.tls_cert_policy = |
| 159 | webrtc::PeerConnectionInterface::kTlsCertPolicySecure; |
| 160 | break; |
| 161 | case RTCTlsCertPolicyInsecureNoCheck: |
| 162 | iceServer.tls_cert_policy = |
| 163 | webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck; |
| 164 | break; |
| 165 | } |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 166 | |
| 167 | iceServer.ssl_config = [_sslConfig nativeConfig]; |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 168 | return iceServer; |
| 169 | } |
| 170 | |
hjon | 6d49a8e | 2016-01-26 13:06:42 -0800 | [diff] [blame] | 171 | - (instancetype)initWithNativeServer: |
| 172 | (webrtc::PeerConnectionInterface::IceServer)nativeServer { |
| 173 | NSMutableArray *urls = |
| 174 | [NSMutableArray arrayWithCapacity:nativeServer.urls.size()]; |
| 175 | for (auto const &url : nativeServer.urls) { |
| 176 | [urls addObject:[NSString stringForStdString:url]]; |
| 177 | } |
| 178 | NSString *username = [NSString stringForStdString:nativeServer.username]; |
| 179 | NSString *credential = [NSString stringForStdString:nativeServer.password]; |
Emad Omara | dab1d2d | 2017-06-16 15:43:11 -0700 | [diff] [blame] | 180 | NSString *hostname = [NSString stringForStdString:nativeServer.hostname]; |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 181 | RTCSSLConfig *sslConfig = [[RTCSSLConfig alloc] initWithNativeConfig:nativeServer.ssl_config]; |
hnsl | 6741516 | 2017-02-02 13:04:27 -0800 | [diff] [blame] | 182 | |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 183 | if (!nativeServer.ssl_config.tls_alpn_protocols.has_value() && |
| 184 | !nativeServer.tls_alpn_protocols.empty()) { |
| 185 | NSMutableArray *tlsALPNProtocols = |
| 186 | [NSMutableArray arrayWithCapacity:nativeServer.tls_alpn_protocols.size()]; |
| 187 | for (auto const &proto : nativeServer.tls_alpn_protocols) { |
| 188 | [tlsALPNProtocols addObject:[NSString stringForStdString:proto]]; |
| 189 | } |
| 190 | sslConfig.tlsALPNProtocols = tlsALPNProtocols; |
| 191 | } |
| 192 | |
| 193 | if (!nativeServer.ssl_config.tls_elliptic_curves.has_value() && |
| 194 | !nativeServer.tls_elliptic_curves.empty()) { |
| 195 | NSMutableArray *tlsEllipticCurves = |
| 196 | [NSMutableArray arrayWithCapacity:nativeServer.tls_elliptic_curves.size()]; |
| 197 | for (auto const &curve : nativeServer.tls_elliptic_curves) { |
| 198 | [tlsEllipticCurves addObject:[NSString stringForStdString:curve]]; |
| 199 | } |
| 200 | sslConfig.tlsEllipticCurves = tlsEllipticCurves; |
| 201 | } |
| 202 | |
| 203 | if (nativeServer.tls_cert_policy == |
| 204 | webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck) { |
| 205 | sslConfig.tlsCertPolicy = RTCTlsCertPolicyInsecureNoCheck; |
hnsl | 6741516 | 2017-02-02 13:04:27 -0800 | [diff] [blame] | 206 | } |
| 207 | |
hjon | 6d49a8e | 2016-01-26 13:06:42 -0800 | [diff] [blame] | 208 | self = [self initWithURLStrings:urls |
| 209 | username:username |
hnsl | 6741516 | 2017-02-02 13:04:27 -0800 | [diff] [blame] | 210 | credential:credential |
Diogo Real | 1dca9d5 | 2017-08-29 12:18:32 -0700 | [diff] [blame] | 211 | hostname:hostname |
Diogo Real | 7f1ffcc | 2018-09-04 14:42:03 -0700 | [diff] [blame^] | 212 | sslConfig:sslConfig]; |
hjon | 6d49a8e | 2016-01-26 13:06:42 -0800 | [diff] [blame] | 213 | return self; |
| 214 | } |
| 215 | |
hjon | aa32c3e | 2015-12-13 19:58:11 -0800 | [diff] [blame] | 216 | @end |