Status pluginDataClear(const Account &account, const std::string &plugin) { std::string directory = pluginDirectory(account, plugin); if (fileExists(directory)) ABC_CHECK_OLD(ABC_FileIODeleteRecursive(directory.c_str(), &error)); return Status(); }
/** * Creates the wallet with the given info. * * @param pszUUID Pointer to hold allocated pointer to UUID string */ tABC_CC ABC_WalletCreate(tABC_SyncKeys *pKeys, tABC_U08Buf L1, tABC_U08Buf LP1, const char *szUserName, const char *szWalletName, int currencyNum, unsigned int attributes, char **pszUUID, tABC_Error *pError) { tABC_CC cc = ABC_CC_Ok; char *szFilename = NULL; char *szJSON = NULL; char *szUUID = NULL; char *szWalletDir = NULL; json_t *pJSON_Data = NULL; json_t *pJSON_Wallets = NULL; tABC_U08Buf WalletAcctKey = ABC_BUF_NULL; tWalletData *pData = NULL; ABC_CHECK_NULL(pszUUID); // create a new wallet data struct ABC_NEW(pData, tWalletData); pData->archived = 0; // create wallet guid ABC_CHECK_RET(ABC_CryptoGenUUIDString(&szUUID, pError)); ABC_STRDUP(pData->szUUID, szUUID); ABC_STRDUP(*pszUUID, szUUID); // generate the master key for this wallet - MK_<Wallet_GUID1> ABC_CHECK_RET(ABC_CryptoCreateRandomData(WALLET_KEY_LENGTH, &pData->MK, pError)); // create and set the bitcoin private seed for this wallet ABC_CHECK_RET(ABC_CryptoCreateRandomData(WALLET_BITCOIN_PRIVATE_SEED_LENGTH, &pData->BitcoinPrivateSeed, pError)); // Create Wallet Repo key ABC_CHECK_RET(ABC_CryptoCreateRandomData(SYNC_KEY_LENGTH, &WalletAcctKey, pError)); ABC_CHECK_RET(ABC_CryptoHexEncode(WalletAcctKey, &(pData->szWalletAcctKey), pError)); // create the wallet root directory if necessary ABC_CHECK_RET(ABC_WalletCreateRootDir(pError)); // create the wallet directory - <Wallet_UUID1> <- All data in this directory encrypted with MK_<Wallet_UUID1> ABC_CHECK_RET(ABC_WalletGetDirName(&(pData->szWalletDir), pData->szUUID, pError)); ABC_CHECK_RET(ABC_FileIOCreateDir(pData->szWalletDir, pError)); ABC_STRDUP(szWalletDir, pData->szWalletDir); // create the wallet sync dir under the main dir ABC_CHECK_RET(ABC_WalletGetSyncDirName(&(pData->szWalletSyncDir), pData->szUUID, pError)); ABC_CHECK_RET(ABC_FileIOCreateDir(pData->szWalletSyncDir, pError)); // we now have a new wallet so go ahead and cache its data ABC_CHECK_RET(ABC_WalletAddToCache(pData, pError)); // all the functions below assume the wallet is in the cache or can be loaded into the cache // set the wallet name ABC_CHECK_RET(ABC_WalletSetName(ABC_WalletID(pKeys, szUUID), szWalletName, pError)); // set the currency ABC_CHECK_RET(ABC_WalletSetCurrencyNum(ABC_WalletID(pKeys, szUUID), currencyNum, pError)); // Request remote wallet repo ABC_CHECK_RET(ABC_WalletServerRepoPost(L1, LP1, pData->szWalletAcctKey, ABC_SERVER_WALLET_CREATE_PATH, pError)); // set this account for the wallet's first account ABC_CHECK_RET(ABC_WalletAddAccount(ABC_WalletID(pKeys, szUUID), szUserName, pError)); // TODO: should probably add the creation date to optimize wallet export (assuming it is even used) // Init the git repo and sync it int dirty; ABC_CHECK_RET(ABC_SyncMakeRepo(pData->szWalletSyncDir, pError)); ABC_CHECK_RET(ABC_SyncRepo(pData->szWalletSyncDir, pData->szWalletAcctKey, &dirty, pError)); // Actiate the remote wallet ABC_CHECK_RET(ABC_WalletServerRepoPost(L1, LP1, pData->szWalletAcctKey, ABC_SERVER_WALLET_ACTIVATE_PATH, pError)); // If everything worked, add the wallet to the account: tABC_AccountWalletInfo info; // No need to free this info.szUUID = szUUID; info.MK = pData->MK; info.BitcoinSeed = pData->BitcoinPrivateSeed; info.SyncKey = WalletAcctKey; info.archived = 0; ABC_CHECK_RET(ABC_AccountWalletList(pKeys, NULL, &info.sortIndex, pError)); ABC_CHECK_RET(ABC_AccountWalletSave(pKeys, &info, pError)); // Now the wallet is written to disk, generate some addresses ABC_CHECK_RET(ABC_TxCreateInitialAddresses(ABC_WalletID(pKeys, pData->szUUID), pError)); // After wallet is created, sync the account, ignoring any errors tABC_Error Error; ABC_CHECK_RET(ABC_SyncRepo(pKeys->szSyncDir, pKeys->szSyncKey, &dirty, &Error)); pData = NULL; // so we don't free what we just added to the cache exit: if (cc != ABC_CC_Ok) { if (szUUID) { ABC_WalletRemoveFromCache(szUUID, NULL); } if (szWalletDir) { ABC_FileIODeleteRecursive(szWalletDir, NULL); } } ABC_FREE_STR(szWalletDir); ABC_FREE_STR(szFilename); ABC_FREE_STR(szJSON); ABC_FREE_STR(szUUID); if (pJSON_Data) json_decref(pJSON_Data); if (pJSON_Wallets) json_decref(pJSON_Wallets); if (pData) ABC_WalletFreeData(pData); return cc; }