]> git.saurik.com Git - apple/security.git/blob - Security/libsecurity_utilities/lib/socks++.cpp
Security-57031.20.26.tar.gz
[apple/security.git] / Security / libsecurity_utilities / lib / socks++.cpp
1 /*
2 * Copyright (c) 2000-2001,2004,2011,2014 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25 //
26 // socks - socks version of IP sockets
27 //
28 // [Also see comments in header file.]
29 //
30 // This file contains the "generic" Socks functionality.
31 // Socks4 and Socks5 implementations are in their separate files.
32 //
33 #include "socks++.h"
34 #include "socks++4.h"
35 #include "socks++5.h"
36 #include "hosts.h"
37
38
39 namespace Security {
40 namespace IPPlusPlus {
41
42
43 //
44 // Static objects
45 //
46 ModuleNexus<SocksServer::Global> SocksServer::global;
47
48
49 //
50 // SocksServer destruction
51 //
52 SocksServer::~SocksServer()
53 { /* virtual */ }
54
55
56 //
57 // Create a SocksServer object
58 //
59 SocksServer *SocksServer::make(Version version, const IPSockAddress &addr)
60 {
61 switch (version) {
62 case 0:
63 return NULL; // no socks
64 case 4:
65 return new Socks4::Server(addr);
66 case 5:
67 return new Socks5::Server(addr);
68 default:
69 UnixError::throwMe(EINVAL);
70 }
71 }
72
73
74 //
75 // TCPClientSockets (CONNECT access)
76 //
77 void SocksClientSocket::open(const IPSockAddress &peer)
78 {
79 if (mServer) {
80 Support::connect(*this, peer);
81 lastConnected(mPeerAddress.address());
82 } else {
83 TCPClientSocket::open(peer);
84 }
85 }
86
87 void SocksClientSocket::open(const IPAddress &addr, IPPort port)
88 {
89 open(IPSockAddress(addr, port));
90 }
91
92 void SocksClientSocket::open(const Host &host, IPPort port)
93 {
94 if (mServer) {
95 Support::connect(*this, host, port);
96 lastConnected(mPeerAddress.address());
97 } else {
98 TCPClientSocket::open(host, port);
99 }
100 }
101
102 void SocksClientSocket::setFd(int fd, const IPSockAddress &local, const IPSockAddress &peer)
103 {
104 Socket::setFd(fd);
105 mLocalAddress = local;
106 mPeerAddress = peer;
107 }
108
109
110 //
111 // TCPServerSockets (BIND access)
112 //
113 void SocksServerSocket::open(const IPSockAddress &local, int)
114 {
115 if (mServer) {
116 #if BUG_GCC
117 if (mConnectionPeer)
118 Support::bind(*this, mConnectionPeer, local.port());
119 else
120 Support::bind(*this, lastConnected(), local.port());
121 #else
122 Support::bind(*this,
123 mConnectionPeer ? mConnectionPeer : lastConnected(),
124 local.port());
125 #endif
126 } else {
127 TCPServerSocket::open(local, 1);
128 }
129 }
130
131 void SocksServerSocket::receive(SocksClientSocket &client)
132 {
133 if (mServer) {
134 Support::receive(*this, client);
135 } else {
136 TCPServerSocket::receive(client);
137 }
138 }
139
140
141 //
142 // Address functions
143 //
144 IPSockAddress SocksServer::Support::localAddress(const Socket &me) const
145 {
146 if (mServer)
147 return mLocalAddress;
148 else
149 return me.localAddress();
150 }
151
152 IPSockAddress SocksServer::Support::peerAddress(const Socket &me) const
153 {
154 if (mServer)
155 return mPeerAddress;
156 else
157 return me.peerAddress();
158 }
159
160
161 } // end namespace IPPlusPlus
162 } // end namespace Security