-
Notifications
You must be signed in to change notification settings - Fork 100
/
OTServerConnection.cpp
281 lines (253 loc) · 10.7 KB
/
OTServerConnection.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
/************************************************************
*
* OTServerConnection.cpp
*
*/
/************************************************************
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
* OPEN TRANSACTIONS
*
* Financial Cryptography and Digital Cash
* Library, Protocol, API, Server, CLI, GUI
*
* -- Anonymous Numbered Accounts.
* -- Untraceable Digital Cash.
* -- Triple-Signed Receipts.
* -- Cheques, Vouchers, Transfers, Inboxes.
* -- Basket Currencies, Markets, Payment Plans.
* -- Signed, XML, Ricardian-style Contracts.
* -- Scripted smart contracts.
*
* Copyright (C) 2010-2013 by "Fellow Traveler" (A pseudonym)
*
* EMAIL:
* FellowTraveler@rayservers.net
*
* BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ
*
* KEY FINGERPRINT (PGP Key in license file):
* 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E
*
* OFFICIAL PROJECT WIKI(s):
* https://github.com/FellowTraveler/Moneychanger
* https://github.com/FellowTraveler/Open-Transactions/wiki
*
* WEBSITE:
* http://www.OpenTransactions.org/
*
* Components and licensing:
* -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3
* -- otlib.........A class library.......LICENSE:...LAGPLv3
* -- otapi.........A client API..........LICENSE:...LAGPLv3
* -- opentxs/ot....Command-line client...LICENSE:...LAGPLv3
* -- otserver......Server Application....LICENSE:....AGPLv3
* Github.com/FellowTraveler/Open-Transactions/wiki/Components
*
* All of the above OT components were designed and written by
* Fellow Traveler, with the exception of Moneychanger, which
* was contracted out to Vicky C (bitcointrader4@gmail.com).
* The open-source community has since actively contributed.
*
* -----------------------------------------------------
*
* LICENSE:
* This program is free software: you can redistribute it
* and/or modify it under the terms of the GNU Affero
* General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* ADDITIONAL PERMISSION under the GNU Affero GPL version 3
* section 7: (This paragraph applies only to the LAGPLv3
* components listed above.) If you modify this Program, or
* any covered work, by linking or combining it with other
* code, such other code is not for that reason alone subject
* to any of the requirements of the GNU Affero GPL version 3.
* (==> This means if you are only using the OT API, then you
* don't have to open-source your code--only your changes to
* Open-Transactions itself must be open source. Similar to
* LGPLv3, except it applies to software-as-a-service, not
* just to distributing binaries.)
*
* Extra WAIVER for OpenSSL, Lucre, and all other libraries
* used by Open Transactions: This program is released under
* the AGPL with the additional exemption that compiling,
* linking, and/or using OpenSSL is allowed. The same is true
* for any other open source libraries included in this
* project: complete waiver from the AGPL is hereby granted to
* compile, link, and/or use them with Open-Transactions,
* according to their own terms, as long as the rest of the
* Open-Transactions terms remain respected, with regard to
* the Open-Transactions code itself.
*
* Lucre License:
* This code is also "dual-license", meaning that Ben Lau-
* rie's license must also be included and respected, since
* the code for Lucre is also included with Open Transactions.
* See Open-Transactions/src/otlib/lucre/LUCRE_LICENSE.txt
* The Laurie requirements are light, but if there is any
* problem with his license, simply remove the Lucre code.
* Although there are no other blind token algorithms in Open
* Transactions (yet. credlib is coming), the other functions
* will continue to operate.
* See Lucre on Github: https://github.com/benlaurie/lucre
* -----------------------------------------------------
* You should have received a copy of the GNU Affero General
* Public License along with this program. If not, see:
* http://www.gnu.org/licenses/
*
* If you would like to use this software outside of the free
* software license, please contact FellowTraveler.
* (Unfortunately many will run anonymously and untraceably,
* so who could really stop them?)
*
* DISCLAIMER:
* This program is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Affero General Public License for
* more details.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Darwin)
iQIcBAEBAgAGBQJRSsfJAAoJEAMIAO35UbuOQT8P/RJbka8etf7wbxdHQNAY+2cC
vDf8J3X8VI+pwMqv6wgTVy17venMZJa4I4ikXD/MRyWV1XbTG0mBXk/7AZk7Rexk
KTvL/U1kWiez6+8XXLye+k2JNM6v7eej8xMrqEcO0ZArh/DsLoIn1y8p8qjBI7+m
aE7lhstDiD0z8mwRRLKFLN2IH5rAFaZZUvj5ERJaoYUKdn4c+RcQVei2YOl4T0FU
LWND3YLoH8naqJXkaOKEN4UfJINCwxhe5Ke9wyfLWLUO7NamRkWD2T7CJ0xocnD1
sjAzlVGNgaFDRflfIF4QhBx1Ddl6wwhJfw+d08bjqblSq8aXDkmFA7HeunSFKkdn
oIEOEgyj+veuOMRJC5pnBJ9vV+7qRdDKQWaCKotynt4sWJDGQ9kWGWm74SsNaduN
TPMyr9kNmGsfR69Q2Zq/FLcLX/j8ESxU+HYUB4vaARw2xEOu2xwDDv6jt0j3Vqsg
x7rWv4S/Eh18FDNDkVRChiNoOIilLYLL6c38uMf1pnItBuxP3uhgY6COm59kVaRh
nyGTYCDYD2TK+fI9o89F1297uDCwEJ62U0Q7iTDp5QuXCoxkPfv8/kX6lS6T3y9G
M9mqIoLbIQ1EDntFv7/t6fUTS2+46uCrdZWbQ5RjYXdrzjij02nDmJAm2BngnZvd
kamH0Y/n11lCvo1oQxM+
=uSzz
-----END PGP SIGNATURE-----
**************************************************************/
#include <opentxs/core/stdafx.hpp>
#include <opentxs/client/OTServerConnection.hpp>
#include <opentxs/client/TransportCallback.hpp>
#include <opentxs/core/crypto/OTEnvelope.hpp>
#include <opentxs/core/OTLog.hpp>
#include <opentxs/core/OTMessage.hpp>
#include <opentxs/core/OTPseudonym.hpp>
#include <opentxs/core/OTServerContract.hpp>
extern "C" {
#ifdef _WIN32
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <netinet/in.h>
#endif
}
namespace opentxs
{
// Everytime you send a message, it is a new connection -- and could be to
// a different server! So it's important to switch focus each time so we
// have the right server contract, etc.
//
bool OTServerConnection::SetFocus(OTPseudonym& theNym,
OTServerContract& theServerContract,
TransportCallback* pCallback)
{
if (nullptr == pCallback) {
otErr << __FUNCTION__ << ": pCallback is nullptr";
OT_FAIL;
};
// In RPC mode, you must call SetFocus before each time you prepare or
// process any server-related messages. Why? Since the Client normally
// expects the connection to already be made, and therefore expects
// to have access to the Nym and Server Contract (and server ID, etc)
// available since those pointers are normally set during Connect().
// Since we no longer connect in RPC mode, we must still make sure those
// pointers are ready by calling SetFocus before they might end up being
// used.
// Each time you send a new message, it might be to a different server or
// from a different nym. That's fine -- just call SetFocus() before you do
// it.
m_pNym = &theNym;
m_pServerContract = &theServerContract;
m_pCallback = pCallback; // This is what we get instead of a socket, when
// we're in RPC mode.
m_bFocused = true;
return true;
}
// When the server sends a reply back with our new request number, we
// need to update our records accordingly.
//
// This function is meant to be called when that happens, so that we
// can do just that.
//
void OTServerConnection::OnServerResponseToGetRequestNumber(
int64_t lNewRequestNumber) const
{
if (m_pNym && m_pServerContract) {
otOut << "Received new request number from the server: "
<< lNewRequestNumber << ". Updating Nym records...\n";
String strServerID;
m_pServerContract->GetIdentifier(strServerID);
m_pNym->OnUpdateRequestNum(*m_pNym, strServerID, lNewRequestNumber);
}
else {
otErr << "Expected m_pNym or m_pServerContract to be not null in "
"OTServerConnection::OnServerResponseToGetRequestNumber.\n";
}
}
bool OTServerConnection::GetServerID(OTIdentifier& theID) const
{
if (m_pServerContract) {
m_pServerContract->GetIdentifier(theID);
return true;
}
return false;
}
// When a certain Nym opens a certain account on a certain server,
// that account is put onto a list of accounts inside the wallet.
// Therefore, a certain Nym's connection to a certain server will
// occasionally require access to those accounts. Therefore the
// server connection object needs to have a pointer to the wallet.
// There might be MORE THAN ONE connection per wallet, or only one,
// but either way the connections need a pointer to the wallet
// they are associated with, so they can access those accounts.
OTServerConnection::OTServerConnection(OTWallet& theWallet, OTClient& theClient)
{
m_pCallback = nullptr;
m_bFocused = false;
m_pNym = nullptr;
m_pServerContract = nullptr;
m_pWallet = &theWallet;
m_pClient = &theClient;
}
void OTServerConnection::ProcessMessageOut(const OTMessage& theMessage) const
{
// todo SetMessagePayload?
// Here is where we set up the Payload (so we have the size ready before the
// header goes out)
// This is also where we have turned on the encrypted envelopes }:-)
OTEnvelope theEnvelope; // All comms should be encrypted in one of these
// envelopes.
// Testing encrypted envelopes...
const OTPseudonym* pServerNym = m_pServerContract->GetContractPublicNym();
// Make sure we can send encrypted envelopes.
OT_ASSERT(m_pServerContract && (nullptr != pServerNym));
String strEnvelopeContents;
// Save the ready-to-go message into a string.
theMessage.SaveContractRaw(strEnvelopeContents);
// Seal the string up into an encrypted Envelope
theEnvelope.Seal(*pServerNym, strEnvelopeContents);
OT_ASSERT(IsFocused())
OT_ASSERT(nullptr != m_pCallback);
OT_ASSERT(nullptr != m_pServerContract);
// Call the callback here.
otOut << "\n=====>BEGIN Sending " << theMessage.m_strCommand
<< " message via ZMQ... Request number: "
<< theMessage.m_strRequestNum << "\n";
(*m_pCallback)(*m_pServerContract, theEnvelope);
otWarn << "<=====END Finished sending " << theMessage.m_strCommand
<< " message (and hopefully receiving "
"a reply.)\nRequest number: " << theMessage.m_strRequestNum
<< "\n\n";
// At this point, we have sent the envelope to the server.
}
} // namespace opentxs