blob: d03fd812ec970daa78f9dc6c52c4702068db18bf [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 Real4f085432018-09-11 16:00:22 -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 Real4f085432018-09-11 16:00:22 -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 Real4f085432018-09-11 16:00:22 -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 Real4f085432018-09-11 16:00:22 -0700110 _sslConfig = sslConfig;
111
112 // TODO(diogor, webrtc:9673): Remove these duplicate assignments.
113 _tlsCertPolicy = sslConfig.tlsCertPolicy;
114 if (sslConfig.tlsALPNProtocols) {
115 _tlsAlpnProtocols = [[NSArray alloc] initWithArray:sslConfig.tlsALPNProtocols copyItems:YES];
116 }
117 if (sslConfig.tlsEllipticCurves) {
118 _tlsEllipticCurves =
119 [[NSArray alloc] initWithArray:sslConfig.tlsEllipticCurves copyItems:YES];
120 }
hjonaa32c3e2015-12-13 19:58:11 -0800121 }
122 return self;
123}
124
125- (NSString *)description {
Diogo Real4f085432018-09-11 16:00:22 -0700126 return [NSString stringWithFormat:@"RTCIceServer:\n%@\n%@\n%@\n%@\n%@",
Emad Omaradab1d2d2017-06-16 15:43:11 -0700127 _urlStrings,
128 _username,
129 _credential,
Diogo Real1dca9d52017-08-29 12:18:32 -0700130 _hostname,
Diogo Real4f085432018-09-11 16:00:22 -0700131 _sslConfig];
hjonaa32c3e2015-12-13 19:58:11 -0800132}
133
134#pragma mark - Private
135
hnsl67415162017-02-02 13:04:27 -0800136- (NSString *)stringForTlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy {
137 switch (tlsCertPolicy) {
138 case RTCTlsCertPolicySecure:
139 return @"RTCTlsCertPolicySecure";
140 case RTCTlsCertPolicyInsecureNoCheck:
141 return @"RTCTlsCertPolicyInsecureNoCheck";
142 }
143}
144
hjona2f77982016-03-04 07:09:09 -0800145- (webrtc::PeerConnectionInterface::IceServer)nativeServer {
hjonaa32c3e2015-12-13 19:58:11 -0800146 __block webrtc::PeerConnectionInterface::IceServer iceServer;
147
148 iceServer.username = [NSString stdStringForString:_username];
149 iceServer.password = [NSString stdStringForString:_credential];
Emad Omaradab1d2d2017-06-16 15:43:11 -0700150 iceServer.hostname = [NSString stdStringForString:_hostname];
hjonaa32c3e2015-12-13 19:58:11 -0800151
Diogo Real1dca9d52017-08-29 12:18:32 -0700152 [_tlsAlpnProtocols enumerateObjectsUsingBlock:^(NSString *proto, NSUInteger idx, BOOL *stop) {
153 iceServer.tls_alpn_protocols.push_back(proto.stdString);
154 }];
155
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700156 [_tlsEllipticCurves enumerateObjectsUsingBlock:^(NSString *curve, NSUInteger idx, BOOL *stop) {
157 iceServer.tls_elliptic_curves.push_back(curve.stdString);
158 }];
159
hjonaa32c3e2015-12-13 19:58:11 -0800160 [_urlStrings enumerateObjectsUsingBlock:^(NSString *url,
161 NSUInteger idx,
162 BOOL *stop) {
163 iceServer.urls.push_back(url.stdString);
164 }];
hnsl67415162017-02-02 13:04:27 -0800165
166 switch (_tlsCertPolicy) {
167 case RTCTlsCertPolicySecure:
168 iceServer.tls_cert_policy =
169 webrtc::PeerConnectionInterface::kTlsCertPolicySecure;
170 break;
171 case RTCTlsCertPolicyInsecureNoCheck:
172 iceServer.tls_cert_policy =
173 webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck;
174 break;
175 }
Diogo Real4f085432018-09-11 16:00:22 -0700176
177 iceServer.ssl_config = [_sslConfig nativeConfig];
hjonaa32c3e2015-12-13 19:58:11 -0800178 return iceServer;
179}
180
hjon6d49a8e2016-01-26 13:06:42 -0800181- (instancetype)initWithNativeServer:
182 (webrtc::PeerConnectionInterface::IceServer)nativeServer {
183 NSMutableArray *urls =
184 [NSMutableArray arrayWithCapacity:nativeServer.urls.size()];
185 for (auto const &url : nativeServer.urls) {
186 [urls addObject:[NSString stringForStdString:url]];
187 }
188 NSString *username = [NSString stringForStdString:nativeServer.username];
189 NSString *credential = [NSString stringForStdString:nativeServer.password];
Emad Omaradab1d2d2017-06-16 15:43:11 -0700190 NSString *hostname = [NSString stringForStdString:nativeServer.hostname];
Diogo Real4f085432018-09-11 16:00:22 -0700191 RTCSSLConfig *sslConfig = [[RTCSSLConfig alloc] initWithNativeConfig:nativeServer.ssl_config];
Diogo Real7f1ffcc2018-09-04 14:42:03 -0700192
Diogo Real4f085432018-09-11 16:00:22 -0700193 if (!nativeServer.ssl_config.tls_alpn_protocols.has_value() &&
194 !nativeServer.tls_alpn_protocols.empty()) {
195 NSMutableArray *tlsALPNProtocols =
196 [NSMutableArray arrayWithCapacity:nativeServer.tls_alpn_protocols.size()];
197 for (auto const &proto : nativeServer.tls_alpn_protocols) {
198 [tlsALPNProtocols addObject:[NSString stringForStdString:proto]];
199 }
200 sslConfig.tlsALPNProtocols = tlsALPNProtocols;
201 }
202
203 if (!nativeServer.ssl_config.tls_elliptic_curves.has_value() &&
204 !nativeServer.tls_elliptic_curves.empty()) {
205 NSMutableArray *tlsEllipticCurves =
206 [NSMutableArray arrayWithCapacity:nativeServer.tls_elliptic_curves.size()];
207 for (auto const &curve : nativeServer.tls_elliptic_curves) {
208 [tlsEllipticCurves addObject:[NSString stringForStdString:curve]];
209 }
210 sslConfig.tlsEllipticCurves = tlsEllipticCurves;
211 }
212
213 if (nativeServer.tls_cert_policy ==
214 webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck) {
215 sslConfig.tlsCertPolicy = RTCTlsCertPolicyInsecureNoCheck;
hnsl67415162017-02-02 13:04:27 -0800216 }
217
hjon6d49a8e2016-01-26 13:06:42 -0800218 self = [self initWithURLStrings:urls
219 username:username
hnsl67415162017-02-02 13:04:27 -0800220 credential:credential
Diogo Real1dca9d52017-08-29 12:18:32 -0700221 hostname:hostname
Diogo Real4f085432018-09-11 16:00:22 -0700222 sslConfig:sslConfig];
hjon6d49a8e2016-01-26 13:06:42 -0800223 return self;
224}
225
hjonaa32c3e2015-12-13 19:58:11 -0800226@end