Open-Transactions  0.93.0-ge03d287
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Helpers.cpp
Go to the documentation of this file.
1 /************************************************************
2  *
3  * Helpers.cpp
4  *
5  */
6 
7 /************************************************************
8  -----BEGIN PGP SIGNED MESSAGE-----
9  Hash: SHA1
10 
11  * OPEN TRANSACTIONS
12  *
13  * Financial Cryptography and Digital Cash
14  * Library, Protocol, API, Server, CLI, GUI
15  *
16  * -- Anonymous Numbered Accounts.
17  * -- Untraceable Digital Cash.
18  * -- Triple-Signed Receipts.
19  * -- Cheques, Vouchers, Transfers, Inboxes.
20  * -- Basket Currencies, Markets, Payment Plans.
21  * -- Signed, XML, Ricardian-style Contracts.
22  * -- Scripted smart contracts.
23  *
24  * Copyright (C) 2010-2013 by "Fellow Traveler" (A pseudonym)
25  *
26  * EMAIL:
28  *
29  * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ
30  *
31  * KEY FINGERPRINT (PGP Key in license file):
32  * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E
33  *
34  * OFFICIAL PROJECT WIKI(s):
35  * https://github.com/FellowTraveler/Moneychanger
36  * https://github.com/FellowTraveler/Open-Transactions/wiki
37  *
38  * WEBSITE:
39  * http://www.OpenTransactions.org/
40  *
41  * Components and licensing:
42  * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3
43  * -- otlib.........A class library.......LICENSE:...LAGPLv3
44  * -- otapi.........A client API..........LICENSE:...LAGPLv3
45  * -- opentxs/ot....Command-line client...LICENSE:...LAGPLv3
46  * -- otserver......Server Application....LICENSE:....AGPLv3
47  * Github.com/FellowTraveler/Open-Transactions/wiki/Components
48  *
49  * All of the above OT components were designed and written by
50  * Fellow Traveler, with the exception of Moneychanger, which
51  * was contracted out to Vicky C ([email protected]).
52  * The open-source community has since actively contributed.
53  *
54  * -----------------------------------------------------
55  *
56  * LICENSE:
57  * This program is free software: you can redistribute it
58  * and/or modify it under the terms of the GNU Affero
59  * General Public License as published by the Free Software
60  * Foundation, either version 3 of the License, or (at your
61  * option) any later version.
62  *
63  * ADDITIONAL PERMISSION under the GNU Affero GPL version 3
64  * section 7: (This paragraph applies only to the LAGPLv3
65  * components listed above.) If you modify this Program, or
66  * any covered work, by linking or combining it with other
67  * code, such other code is not for that reason alone subject
68  * to any of the requirements of the GNU Affero GPL version 3.
69  * (==> This means if you are only using the OT API, then you
70  * don't have to open-source your code--only your changes to
71  * Open-Transactions itself must be open source. Similar to
72  * LGPLv3, except it applies to software-as-a-service, not
73  * just to distributing binaries.)
74  *
75  * Extra WAIVER for OpenSSL, Lucre, and all other libraries
76  * used by Open Transactions: This program is released under
77  * the AGPL with the additional exemption that compiling,
78  * linking, and/or using OpenSSL is allowed. The same is true
79  * for any other open source libraries included in this
80  * project: complete waiver from the AGPL is hereby granted to
81  * compile, link, and/or use them with Open-Transactions,
82  * according to their own terms, as long as the rest of the
83  * Open-Transactions terms remain respected, with regard to
84  * the Open-Transactions code itself.
85  *
86  * Lucre License:
87  * This code is also "dual-license", meaning that Ben Lau-
88  * rie's license must also be included and respected, since
89  * the code for Lucre is also included with Open Transactions.
90  * See Open-Transactions/src/otlib/lucre/LUCRE_LICENSE.txt
91  * The Laurie requirements are light, but if there is any
92  * problem with his license, simply remove the Lucre code.
93  * Although there are no other blind token algorithms in Open
94  * Transactions (yet. credlib is coming), the other functions
95  * will continue to operate.
96  * See Lucre on Github: https://github.com/benlaurie/lucre
97  * -----------------------------------------------------
98  * You should have received a copy of the GNU Affero General
99  * Public License along with this program. If not, see:
100  * http://www.gnu.org/licenses/
101  *
102  * If you would like to use this software outside of the free
103  * software license, please contact FellowTraveler.
104  * (Unfortunately many will run anonymously and untraceably,
105  * so who could really stop them?)
106  *
107  * DISCLAIMER:
108  * This program is distributed in the hope that it will be
109  * useful, but WITHOUT ANY WARRANTY; without even the implied
110  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
111  * PURPOSE. See the GNU Affero General Public License for
112  * more details.
113 
114  -----BEGIN PGP SIGNATURE-----
115  Version: GnuPG v1.4.9 (Darwin)
116 
117  iQIcBAEBAgAGBQJRSsfJAAoJEAMIAO35UbuOQT8P/RJbka8etf7wbxdHQNAY+2cC
118  vDf8J3X8VI+pwMqv6wgTVy17venMZJa4I4ikXD/MRyWV1XbTG0mBXk/7AZk7Rexk
119  KTvL/U1kWiez6+8XXLye+k2JNM6v7eej8xMrqEcO0ZArh/DsLoIn1y8p8qjBI7+m
120  aE7lhstDiD0z8mwRRLKFLN2IH5rAFaZZUvj5ERJaoYUKdn4c+RcQVei2YOl4T0FU
121  LWND3YLoH8naqJXkaOKEN4UfJINCwxhe5Ke9wyfLWLUO7NamRkWD2T7CJ0xocnD1
122  sjAzlVGNgaFDRflfIF4QhBx1Ddl6wwhJfw+d08bjqblSq8aXDkmFA7HeunSFKkdn
123  oIEOEgyj+veuOMRJC5pnBJ9vV+7qRdDKQWaCKotynt4sWJDGQ9kWGWm74SsNaduN
124  TPMyr9kNmGsfR69Q2Zq/FLcLX/j8ESxU+HYUB4vaARw2xEOu2xwDDv6jt0j3Vqsg
125  x7rWv4S/Eh18FDNDkVRChiNoOIilLYLL6c38uMf1pnItBuxP3uhgY6COm59kVaRh
126  nyGTYCDYD2TK+fI9o89F1297uDCwEJ62U0Q7iTDp5QuXCoxkPfv8/kX6lS6T3y9G
127  M9mqIoLbIQ1EDntFv7/t6fUTS2+46uCrdZWbQ5RjYXdrzjij02nDmJAm2BngnZvd
128  kamH0Y/n11lCvo1oQxM+
129  =uSzz
130  -----END PGP SIGNATURE-----
131  **************************************************************/
132 
133 #include "../ext/OTPayment.hpp"
134 #include "../core/crypto/OTEnvelope.hpp"
135 #include "../core/OTLedger.hpp"
136 #include "../core/OTPseudonym.hpp"
137 #include "../core/OTMessage.hpp"
138 #include "../core/OTString.hpp"
139 #include "../core/OTLog.hpp"
140 
141 namespace opentxs
142 {
143 
144 // For payments inbox and possibly recordbox / expired box. (Starting to write
145 // it now...)
146 //
147 // Caller responsible to delete.
148 
149 OTPayment* GetInstrument(const OTPseudonym& theNym, const int32_t& nIndex,
150  OTLedger& ledger) // Returns financial instrument
151  // by index.
152 {
153  if ((0 > nIndex) || (nIndex >= ledger.GetTransactionCount())) {
154  otErr << __FUNCTION__
155  << ": nIndex is out of bounds (it's in the negative.)\n";
156  OT_FAIL;
157  }
158 
159  // if (nIndex >= GetTransactionCount())
160  // {
161  // otErr << "%s: out of bounds: %d\n", __FUNCTION__, nIndex);
162  // return nullptr; // out of bounds. I'm saving from an
163  // OT_ASSERT_MSG()
164  // happening here. (Maybe I shouldn't.)
165  // // ^^^ That's right you shouldn't! That's the client
166  // developer's problem, not yours.
167  // }
168 
169  OTTransaction* pTransaction = ledger.GetTransactionByIndex(nIndex);
170 
171  if (nullptr == pTransaction) {
172  otErr << __FUNCTION__
173  << ": good index but uncovered nullptr pointer: " << nIndex
174  << "\n";
175  return nullptr; // Weird.
176  }
177 
178  const int64_t lTransactionNum = pTransaction->GetTransactionNum();
179 
180  // Update: for transactions in ABBREVIATED form, the string is empty, since
181  // it has never actually
182  // been signed (in fact the whole point32_t with abbreviated transactions in
183  // a ledger is that they
184  // take up very little room, and have no signature of their own, but exist
185  // merely as XML tags on
186  // their parent ledger.)
187  //
188  // THEREFORE I must check to see if this transaction is abbreviated and if
189  // so, sign it in order to
190  // force the UpdateContents() call, so the programmatic user of this API
191  // will be able to load it up.
192  //
193  if (pTransaction->IsAbbreviated()) {
194  ledger.LoadBoxReceipt(static_cast<int64_t>(
195  lTransactionNum)); // I don't check return val here because I still
196  // want it to send the abbreviated form, if this
197  // fails.
198  pTransaction =
199  ledger.GetTransaction(static_cast<int64_t>(lTransactionNum));
200 
201  if (nullptr == pTransaction) {
202  otErr << __FUNCTION__
203  << ": good index but uncovered nullptr "
204  "pointer after trying to load full version of receipt "
205  "(from abbreviated) at index: " << nIndex << "\n";
206  return nullptr; // Weird. Clearly I need the full box receipt, if
207  // I'm
208  // to get the instrument out of it.
209  }
210  }
211 
212  /*
213  TO EXTRACT INSTRUMENT FROM PAYMENTS INBOX:
214  -- Iterate through the transactions in the payments inbox.
215  -- (They should all be "instrumentNotice" transactions.)
216  -- Each transaction contains (1) OTMessage in "in ref to" field, which in
217  turn contains an encrypted
218  OTPayment in the payload field, which contains the actual financial
219  instrument.
220  -- *** Therefore, this function, based purely on ledger index (as we
221  iterate):
222  1. extracts the OTMessage from the Transaction "in ref to" field (for the
223  transaction at that index),
224  2. then decrypts the payload on that message, producing an OTPayment object,
225  3. ...which contains the actual instrument.
226  */
227 
228  if ((OTTransaction::instrumentNotice != pTransaction->GetType()) &&
229  (OTTransaction::payDividend != pTransaction->GetType()) &&
230  (OTTransaction::notice != pTransaction->GetType())) {
231  otOut << __FUNCTION__
232  << ": Failure: Expected OTTransaction::instrumentNotice, "
233  "::payDividend or ::notice, "
234  "but found: OTTransaction::" << pTransaction->GetTypeString()
235  << "\n";
236  return nullptr;
237  }
238 
240  pTransaction->GetType()) || // It's encrypted.
241  (OTTransaction::payDividend == pTransaction->GetType())) {
242  OTString strMsg;
243  pTransaction->GetReferenceString(strMsg);
244 
245  if (!strMsg.Exists()) {
246  otOut << __FUNCTION__
247  << ": Failure: Expected OTTransaction::instrumentNotice to "
248  "contain an 'in reference to' string, but it was empty. "
249  "(Returning \"\".)\n";
250  return nullptr;
251  }
252 
253  std::unique_ptr<OTMessage> pMsg(new OTMessage);
254  if (nullptr == pMsg) {
255  otErr << __FUNCTION__ << ": Null: Assert while allocating memory "
256  "for an OTMessage!\n";
257  OT_FAIL;
258  }
259 
260  if (!pMsg->LoadContractFromString(strMsg)) {
261  otOut << __FUNCTION__
262  << ": Failed trying to load OTMessage from string:\n\n"
263  << strMsg << "\n\n";
264  return nullptr;
265  }
266 
267  // By this point, the original OTMessage has been loaded from string
268  // successfully.
269  // Now we need to decrypt the payment on that message (which contains
270  // the instrument
271  // itself that we need to return.) We decrypt it the same way as we do
272  // in
273  // OTAPI_Wrap::GetNym_MailContentsByIndex():
274  //
275 
276  // SENDER: pMsg->m_strNymID
277  // RECIPIENT: pMsg->m_strNymID2
278  // INSTRUMENT: pMsg->m_ascPayload (in an OTEnvelope)
279  //
280  OTEnvelope theEnvelope;
281  OTString strEnvelopeContents;
282 
283  // Decrypt the Envelope.
284  if (!theEnvelope.SetAsciiArmoredData(pMsg->m_ascPayload))
285  otOut << __FUNCTION__
286  << ": Failed trying to set ASCII-armored data for envelope:\n"
287  << strMsg << "\n\n";
288  else if (!theEnvelope.Open(theNym, strEnvelopeContents))
289  otOut << __FUNCTION__
290  << ": Failed trying to decrypt the financial instrument "
291  "that was supposedly attached as a payload to this "
292  "payment message:\n" << strMsg << "\n\n";
293  else if (!strEnvelopeContents.Exists())
294  otOut << __FUNCTION__
295  << ": Failed: after decryption, cleartext is empty. From:\n"
296  << strMsg << "\n\n";
297  else {
298  std::unique_ptr<OTPayment> pPayment(
299  new OTPayment(strEnvelopeContents)); // strEnvelopeContents
300  // contains a PURSE or
301  // CHEQUE (etc) and not
302  // specifically a PAYMENT.
303  OT_ASSERT(nullptr != pPayment);
304 
305  if (!pPayment->IsValid())
306  otOut << __FUNCTION__
307  << ": Failed: after decryption, payment is invalid. "
308  "Contents:\n\n" << strEnvelopeContents << "\n\n";
309  else // success.
310  {
311  return pPayment.release(); // Caller responsible to delete.
312  }
313  }
314  }
315  else
316  otErr << __FUNCTION__ << ": This must be a notice (vs an "
317  "instrumentNotice or payDividend). "
318  "!!! Not yet supported !!!\n";
319 
320  return nullptr;
321 }
322 
323 int32_t GetOutpaymentsIndexByTransNum(const OTPseudonym& nym, int64_t lTransNum)
324 {
325  int32_t lOutpaymentsCount = nym.GetOutpaymentsCount();
326 
327  for (int32_t lOutpaymentsIndex = 0; lOutpaymentsIndex < lOutpaymentsCount;
328  ++lOutpaymentsIndex) {
329  OTMessage* pOutpaymentMsg =
330  nym.GetOutpaymentsByIndex(lOutpaymentsIndex);
331  if (nullptr != pOutpaymentMsg) {
332  OTString strPayment;
333 
334  // There isn't any encrypted envelope this time, since it's my
335  // outPayments box.
336  //
337  if (pOutpaymentMsg->m_ascPayload.Exists() &&
338  pOutpaymentMsg->m_ascPayload.GetString(strPayment) &&
339  strPayment.Exists()) {
340  OTPayment thePayment(strPayment);
341 
342  // Let's see if it's the cheque we're looking for...
343  //
344  if (thePayment.IsValid()) {
345  if (thePayment.SetTempValues()) {
346  if (thePayment.HasTransactionNum(lTransNum)) {
347  return static_cast<int32_t>(lOutpaymentsIndex);
348  }
349  }
350  }
351  }
352  }
353  }
354 
355  return -1;
356 }
357 
358 } // namespace opentxs
EXPORT void GetReferenceString(OTString &theStr) const
int32_t GetTransactionCount() const
Definition: OTLedger.hpp:332
EXPORT bool LoadBoxReceipt(const int64_t &lTransactionNum)
Definition: OTLedger.cpp:393
EXPORT bool HasTransactionNum(const int64_t &lInput) const
Definition: OTPayment.cpp:608
OTLOG_IMPORT OTLogStream otOut
EXPORT bool SetAsciiArmoredData(const OTASCIIArmor &theArmoredText, bool bLineBreaks=true)
Definition: OTEnvelope.cpp:178
EXPORT bool Open(const OTPseudonym &theRecipient, OTString &theOutput, const OTPasswordData *pPWData=nullptr)
Definition: OTEnvelope.cpp:581
EXPORT bool Exists() const
Definition: OTString.cpp:1035
const char * GetTypeString() const
EXPORT int32_t GetOutpaymentsCount() const
return the number of payments items available for this Nym.
#define OT_ASSERT(x)
Definition: Assert.hpp:150
OTPayment * GetInstrument(const OTPseudonym &theNym, const int32_t &nIndex, OTLedger &ledger)
Definition: Helpers.cpp:149
EXPORT OTTransaction * GetTransactionByIndex(int32_t nIndex) const
Definition: OTLedger.cpp:1288
#define OT_FAIL
Definition: Assert.hpp:139
EXPORT bool SetTempValues()
Definition: OTPayment.cpp:196
transactionType GetType() const
OTLOG_IMPORT OTLogStream otErr
EXPORT int64_t GetTransactionNum() const
EXPORT bool IsValid() const
Definition: OTPayment.hpp:301
OTASCIIArmor m_ascPayload
Definition: OTMessage.hpp:214
bool IsAbbreviated() const
int32_t GetOutpaymentsIndexByTransNum(const OTPseudonym &nym, int64_t lTransNum)
Definition: Helpers.cpp:323
EXPORT bool GetString(OTString &theData, bool bLineBreaks=true) const
EXPORT bool LoadContractFromString(const OTString &theStr)
EXPORT OTMessage * GetOutpaymentsByIndex(int32_t nIndex) const
EXPORT OTTransaction * GetTransaction(OTTransaction::transactionType theType)
Definition: OTLedger.cpp:1215