blob: 1e0d170c7903429d360c8cde58e17f0596a21cf8 [file] [log] [blame]
hjonaa32c3e2015-12-13 19:58:11 -08001/*
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
tkchin9eeb6242016-04-27 01:54:20 -070011#import "RTCIceServer+Private.h"
Diogo Real7f1ffcc2018-09-04 14:42:03 -070012#import "RTCSSLConfig+Native.h"
hjonaa32c3e2015-12-13 19:58:11 -080013
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020014#import "helpers/NSString+StdString.h"
hjonaa32c3e2015-12-13 19:58:11 -080015
16@implementation RTCIceServer
17
18@synthesize urlStrings = _urlStrings;
19@synthesize username = _username;
20@synthesize credential = _credential;
hnsl67415162017-02-02 13:04:27 -080021@synthesize tlsCertPolicy = _tlsCertPolicy;
Emad Omaradab1d2d2017-06-16 15:43:11 -070022@synthesize hostname = _hostname;
Diogo Real1dca9d52017-08-29 12:18:32 -070023@synthesize tlsAlpnProtocols = _tlsAlpnProtocols;
Diogo Real7bd1f1b2017-09-08 12:50:41 -070024@synthesize tlsEllipticCurves = _tlsEllipticCurves;
Diogo Real7f1ffcc2018-09-04 14:42:03 -070025@synthesize sslConfig = _sslConfig;
hjonaa32c3e2015-12-13 19:58:11 -080026
Jon Hjelle32e0c012016-03-08 16:04:46 -080027- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings {
hjonaa32c3e2015-12-13 19:58:11 -080028 return [self initWithURLStrings:urlStrings
29 username:nil
30 credential:nil];
31}
32
Jon Hjelle32e0c012016-03-08 16:04:46 -080033- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
hjonaa32c3e2015-12-13 19:58:11 -080034 username:(NSString *)username
35 credential:(NSString *)credential {
hnsl67415162017-02-02 13:04:27 -080036 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 Omaradab1d2d2017-06-16 15:43:11 -070046 return [self initWithURLStrings:urlStrings
47 username:username
48 credential:credential
Emad Omaracadd3062017-06-19 15:19:26 -070049 tlsCertPolicy:tlsCertPolicy
Emad Omaradab1d2d2017-06-16 15:43:11 -070050 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 Real1dca9d52017-08-29 12:18:32 -070058 return [self initWithURLStrings:urlStrings
59 username:username
60 credential:credential
61 tlsCertPolicy:tlsCertPolicy
62 hostname:hostname
Diogo Real7bd1f1b2017-09-08 12:50:41 -070063 tlsAlpnProtocols:[NSArray array]];
Diogo Real1dca9d52017-08-29 12:18:32 -070064}
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 Real7bd1f1b2017-09-08 12:50:41 -070072 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 Real7f1ffcc2018-09-04 14:42:03 -070088 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 {
hjonaa32c3e2015-12-13 19:58:11 -0800104 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 Omaradab1d2d2017-06-16 15:43:11 -0700109 _hostname = [hostname copy];
Diogo Real7f1ffcc2018-09-04 14:42:03 -0700110 _sslConfig = sslConfig;
hjonaa32c3e2015-12-13 19:58:11 -0800111 }
112 return self;
113}
114
115- (NSString *)description {
Diogo Real7f1ffcc2018-09-04 14:42:03 -0700116 return [NSString stringWithFormat:@"RTCIceServer:\n%@\n%@\n%@\n%@\n%@",
Emad Omaradab1d2d2017-06-16 15:43:11 -0700117 _urlStrings,
118 _username,
119 _credential,
Diogo Real1dca9d52017-08-29 12:18:32 -0700120 _hostname,
Diogo Real7f1ffcc2018-09-04 14:42:03 -0700121 _sslConfig];
hjonaa32c3e2015-12-13 19:58:11 -0800122}
123
124#pragma mark - Private
125
hnsl67415162017-02-02 13:04:27 -0800126- (NSString *)stringForTlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy {
127 switch (tlsCertPolicy) {
128 case RTCTlsCertPolicySecure:
129 return @"RTCTlsCertPolicySecure";
130 case RTCTlsCertPolicyInsecureNoCheck:
131 return @"RTCTlsCertPolicyInsecureNoCheck";
132 }
133}
134
hjona2f77982016-03-04 07:09:09 -0800135- (webrtc::PeerConnectionInterface::IceServer)nativeServer {
hjonaa32c3e2015-12-13 19:58:11 -0800136 __block webrtc::PeerConnectionInterface::IceServer iceServer;
137
138 iceServer.username = [NSString stdStringForString:_username];
139 iceServer.password = [NSString stdStringForString:_credential];
Emad Omaradab1d2d2017-06-16 15:43:11 -0700140 iceServer.hostname = [NSString stdStringForString:_hostname];
hjonaa32c3e2015-12-13 19:58:11 -0800141
Diogo Real1dca9d52017-08-29 12:18:32 -0700142 [_tlsAlpnProtocols enumerateObjectsUsingBlock:^(NSString *proto, NSUInteger idx, BOOL *stop) {
143 iceServer.tls_alpn_protocols.push_back(proto.stdString);
144 }];
145
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700146 [_tlsEllipticCurves enumerateObjectsUsingBlock:^(NSString *curve, NSUInteger idx, BOOL *stop) {
147 iceServer.tls_elliptic_curves.push_back(curve.stdString);
148 }];
149
hjonaa32c3e2015-12-13 19:58:11 -0800150 [_urlStrings enumerateObjectsUsingBlock:^(NSString *url,
151 NSUInteger idx,
152 BOOL *stop) {
153 iceServer.urls.push_back(url.stdString);
154 }];
hnsl67415162017-02-02 13:04:27 -0800155
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 Real7f1ffcc2018-09-04 14:42:03 -0700166
167 iceServer.ssl_config = [_sslConfig nativeConfig];
hjonaa32c3e2015-12-13 19:58:11 -0800168 return iceServer;
169}
170
hjon6d49a8e2016-01-26 13:06:42 -0800171- (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 Omaradab1d2d2017-06-16 15:43:11 -0700180 NSString *hostname = [NSString stringForStdString:nativeServer.hostname];
Diogo Real7f1ffcc2018-09-04 14:42:03 -0700181 RTCSSLConfig *sslConfig = [[RTCSSLConfig alloc] initWithNativeConfig:nativeServer.ssl_config];
hnsl67415162017-02-02 13:04:27 -0800182
Diogo Real7f1ffcc2018-09-04 14:42:03 -0700183 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;
hnsl67415162017-02-02 13:04:27 -0800206 }
207
hjon6d49a8e2016-01-26 13:06:42 -0800208 self = [self initWithURLStrings:urls
209 username:username
hnsl67415162017-02-02 13:04:27 -0800210 credential:credential
Diogo Real1dca9d52017-08-29 12:18:32 -0700211 hostname:hostname
Diogo Real7f1ffcc2018-09-04 14:42:03 -0700212 sslConfig:sslConfig];
hjon6d49a8e2016-01-26 13:06:42 -0800213 return self;
214}
215
hjonaa32c3e2015-12-13 19:58:11 -0800216@end