172{
174
175 switch (i)
176 {
178 {
180 if (result) do
181 {
182 Field* fields = result->Fetch();
183 if (fields[1].IsNull())
184 continue;
185
187 std::vector<uint8> totpSecret = fields[1].
Get<
Binary>();
188
189 if (hadOldSecret)
190 {
191 if (!oldSecret)
193
195 if (!success)
197 }
198
199 if (newSecret)
201
203 updateStmt->SetData(0, totpSecret);
204 updateStmt->SetData(1, id);
205 trans->Append(updateStmt);
206 } while (result->NextRow());
207
208 break;
209 }
210 default:
211 return std::string("Unknown secret index - huh?");
212 }
213
214 if (hadOldSecret)
215 {
217 deleteStmt->SetData(0, i);
218 trans->Append(deleteStmt);
219 }
220
221 if (newSecret)
222 {
226 if (!hash)
227 return std::string("Failed to hash new secret");
228
230 insertStmt->SetData(0, i);
231 insertStmt->SetData(1, *hash);
232 trans->Append(insertStmt);
233 }
234
236 return {};
237}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
std::uint32_t uint32
Definition Define.h:107
std::vector< uint8 > Binary
Definition Field.h:40
@ LOGIN_UPD_ACCOUNT_TOTP_SECRET
Definition LoginDatabase.h:123
@ LOGIN_INS_SECRET_DIGEST
Definition LoginDatabase.h:119
@ LOGIN_DEL_SECRET_DIGEST
Definition LoginDatabase.h:120
@ SECRET_TOTP_MASTER_KEY
Definition SecretMgr.h:30
static constexpr std::size_t KEY_SIZE_BYTES
Definition AES.h:31
Definition BigNumber.h:29
void SetRand(int32 numbits)
Definition BigNumber.cpp:71
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:34
static Optional< std::string > Hash(std::string const &password, BigNumber const &salt, uint32 nIterations=DEFAULT_ITERATIONS, uint32 kibMemoryCost=DEFAULT_MEMORY_COST)
Definition Argon2.cpp:21