File: iban.h

package info (click to toggle)
chromium 139.0.7258.127-2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,122,156 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (272 lines) | stat: -rw-r--r-- 9,842 bytes parent folder | download | duplicates (5)
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
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_PAYMENTS_IBAN_H_
#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_PAYMENTS_IBAN_H_

#include <string>
#include <string_view>
#include <variant>

#include "base/time/time.h"
#include "base/types/strong_alias.h"
#include "components/autofill/core/browser/autofill_type.h"
#include "components/autofill/core/browser/data_model/usage_history_information.h"

namespace autofill {

struct PaymentsMetadata;

// A class storing IBAN information.
class Iban {
 public:
  using Guid = base::StrongAlias<class GuidTag, std::string>;
  using InstrumentId = base::StrongAlias<class InstrumentIdTag, int64_t>;

  // A java IntDef@ is generated from this.
  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.autofill
  // GENERATED_JAVA_CLASS_NAME_OVERRIDE: IbanRecordType
  enum RecordType {
    // An IBAN extracted from a submitted form, whose record type is currently
    // unknown or irrelevant.
    kUnknown,

    // An IBAN with a complete value managed by Chrome (not representing
    // something stored in Google Payments). The local IBAN will only be stored
    // on this device.
    kLocalIban,

    // An IBAN from Google Payments with masked information. Such IBANs will
    // only have the first and last four characters of the IBAN, along with
    // formatted dots and spaces, and will require an extra retrieval step from
    // the GPay server to view. The server IBAN will be synced across all
    // devices.
    kServerIban,
  };

  // These values are persisted to logs. Entries should not be renumbered and
  // numeric values should never be reused.
  enum class IbanSupportedCountry {
    kUnsupported = 0,
    kAD = 1,   // Andorra
    kAE = 2,   // United Arab Emirates
    kAL = 3,   // Albania
    kAT = 4,   // Austria
    kAZ = 5,   // Azerbaijan
    kBA = 6,   // Bosnia and Herzegovina
    kBE = 7,   // Belgium
    kBG = 8,   // Bulgaria
    kBH = 9,   // Bahrain
    kBR = 10,  // Brazil
    kBY = 11,  // Belarus
    kCH = 12,  // Switzerland
    kCR = 13,  // Costa Rica
    kCY = 14,  // Cyprus
    kCZ = 15,  // Czech Republic
    kDE = 16,  // Germany
    kDK = 17,  // Denmark
    kDO = 18,  // Dominican Republic
    kEE = 19,  // Estonia
    kEG = 20,  // Egypt
    kES = 21,  // Spain
    kFI = 22,  // Finland
    kFO = 23,  // Faroe Islands
    kFR = 24,  // France
    kGB = 25,  // United Kingdom
    kGE = 26,  // Georgia
    kGI = 27,  // Gibraltar
    kGL = 28,  // Greenland
    kGR = 29,  // Greece
    kGT = 30,  // Guatemala
    kHR = 31,  // Croatia
    kHU = 32,  // Hungary
    kIL = 33,  // Israel
    kIQ = 34,  // Iraq
    kIS = 35,  // Iceland
    kIT = 36,  // Italy
    kJO = 37,  // Jordan
    kKW = 38,  // Kuwait
    kKZ = 39,  // Kazakhstan
    kLB = 40,  // Lebanon
    kLC = 41,  // Saint Lucia
    kLI = 42,  // Liechtenstein
    kLT = 43,  // Lithuania
    kLU = 44,  // Luxembourg
    kLV = 45,  // Latvia
    kLY = 46,  // Libya
    kMC = 47,  // Monaco
    kMD = 48,  // Moldova
    kME = 49,  // Montenegro
    kMK = 50,  // North Macedonia
    kMR = 51,  // Mauritania
    kMT = 52,  // Malta
    kMU = 53,  // Mauritius
    kNL = 54,  // Netherlands
    kPK = 55,  // Pakistan
    kPL = 56,  // Poland
    kPS = 57,  // Palestinian territories
    kPT = 58,  // Portugal
    kQA = 59,  // Qatar
    kRO = 60,  // Romania
    kRS = 61,  // Serbia
    kRU = 62,  // Russia
    kSA = 63,  // Saudi Arabia
    kSC = 64,  // Seychelles
    kSD = 65,  // Sudan
    kSE = 66,  // Sweden
    kSI = 67,  // Slovenia
    kSK = 68,  // Slovakia
    kSM = 69,  // San Marino
    kST = 70,  // São Tomé and Príncipe
    kSV = 71,  // El Salvador
    kTL = 72,  // East Timor
    kTN = 73,  // Tunisia
    kTR = 74,  // Turkey
    kUA = 75,  // Ukraine
    kVA = 76,  // Vatican City
    kVG = 77,  // Virgin Islands, British
    kXK = 78,  // Kosovo
    kMaxValue = kXK,
  };

  // Creates an IBAN with `kUnknown` record type.
  Iban();

  // Creates a local IBAN with the given `guid`.
  explicit Iban(const Guid& guid);

  // Creates a server IBAN with the given `instrument_id`.
  explicit Iban(const InstrumentId& instrument_id);

  Iban(const Iban&);
  ~Iban();

  Iban& operator=(const Iban& iban);

  // Returns true if IBAN value is valid. This method is case-insensitive.
  // The validation follows the below steps:
  // 1. The IBAN consists of 16 to 33 alphanumeric characters, the first two
  //    letters are country code.
  // 2. Check that the total IBAN length is correct as per the country.
  // 3. Move the four initial characters to the end of the string and replace
  //    each letter in the rearranged string with two digits, thereby expanding
  //    the string, where 'A' = 10, 'B' = 11, ..., 'Z' = 35.
  // 4. Interpret the string as a decimal integer and compute the remainder of
  //    the number on division by 97, returning true if the remainder is 1.
  //
  // The validation algorithm is from:
  // https://en.wikipedia.org/wiki/International_Bank_Account_Number#Algorithms
  static bool IsValid(const std::u16string& value);

  // Returns the capitalized country code of the given `iban_value`.
  static std::string GetCountryCode(const std::u16string& iban_value);

  // Returns true if `country_code` is in the IBAN-supported country list.
  static bool IsIbanApplicableInCountry(const std::string& country_code);

  static IbanSupportedCountry GetIbanSupportedCountry(
      std::string_view country_code);

  static size_t GetLengthOfIbanCountry(IbanSupportedCountry supported_country);

  PaymentsMetadata GetMetadata() const;
  bool SetMetadata(const PaymentsMetadata& metadata);

  // Returns true if there are no values (field types) set.
  bool IsEmpty(const std::string& app_locale) const;

  // Returns 0 if `iban` is the same as this, or < 0, or > 0 if it is different.
  // It compares `identifier_`, `value_`, `prefix_`, `suffix_`, `nickname_`,
  // `length_` and `record_type_`. The implied ordering can be used for culling
  // duplicates. The ordering is based on the collation order of the textual
  // contents of the fields.
  int Compare(const Iban& iban) const;

  // Equality operators call `Compare()` above.
  bool operator==(const Iban& iban) const;

  void set_identifier(const std::variant<Guid, InstrumentId>& identifier);

  const std::string& guid() const;
  int64_t instrument_id() const;

  // Returns the value (the actual bank account number) of IBAN.
  const std::u16string& value() const { return value_; }
  void set_value(const std::u16string& value);

  const std::u16string& nickname() const { return nickname_; }
  // Set the |nickname_| with the processed input (replace all tabs and newlines
  // with whitespaces, condense multiple whitespaces into a single one, and
  // trim leading/trailing whitespaces).
  void set_nickname(const std::u16string& nickname);

  // Setters and getters for the type of this IBAN. The different types of IBAN
  // differ in how they are stored, retrieved, and displayed to the user.
  RecordType record_type() const { return record_type_; }
  void set_record_type(RecordType record_type) { record_type_ = record_type; }

  const std::u16string& prefix() const { return prefix_; }
  void set_prefix(std::u16string prefix);
  const std::u16string& suffix() const { return suffix_; }
  void set_suffix(std::u16string suffix);

  // For local IBANs, checks on `IsValid(value_)`. Always returns true for
  // server-based IBANs because server-based IBANs don't store the full `value`.
  bool IsValid();

  // Returns the capitalized country code of this IBAN.
  std::string GetCountryCode() const;

  // Logs the number of days since this IBAN was last used, increments its use
  // count, and updates its last used date to today.
  void RecordAndLogUse();

  // Construct an IBAN identifier from `prefix_` and `suffix_`.
  // If `is_value_masked` is true, the identifier is constructed by
  // first 2 country code (prefix) + space + 2 masking dots + suffix.
  // Here are some examples:
  // BE71 0961 2345 6769 will be shown as: BE **6769.
  // CH56 0483 5012 3456 7800 9 will be shown as: CH **8009.
  // DE91 1000 0000 0123 4567 89 will be shown as: DE **6789.
  // Otherwise, the full unmasked value is shown in groups of four characters.
  std::u16string GetIdentifierStringForAutofillDisplay(
      bool is_value_masked = true) const;

  // Returns true if the `prefix_` and `suffix_` of the given `iban` matches
  // this IBAN.
  bool MatchesPrefixAndSuffix(const Iban& iban) const;

  UsageHistoryInformation& usage_history();
  const UsageHistoryInformation& usage_history() const;

 private:
  // To distinguish between local IBANs, utilize the Guid as the identifier. For
  // server-based IBANs, they are uniquely identified by the InstrumentId, a
  // unique identifier assigned by the server.
  std::variant<Guid, InstrumentId> identifier_;

  // The IBAN's value. For local IBANs, this value is the actual full IBAN
  // value. For server-based IBANs, this value is empty.
  std::u16string value_;

  // The nickname of the IBAN. May be empty.
  std::u16string nickname_;

  RecordType record_type_;

  // `prefix_` and `suffix_` are the beginning and ending characters of the
  // IBAN's value, respectively. These two fields are used when showing the IBAN
  // to the user in a masked format, where the prefix and suffix are shown
  // but all characters between them stay masked.
  std::u16string prefix_;
  std::u16string suffix_;

  UsageHistoryInformation usage_history_information_;
};

std::ostream& operator<<(std::ostream& os, const Iban& iban);

}  // namespace autofill

#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_PAYMENTS_IBAN_H_