void CWizObjectDataDownloadWorker::startDownload()
{
    // FIXME
    CWizKMAccountsServer asServer(WizKMGetAccountsServerURL(true));

    QString strUserId = m_dbMgr.db().GetUserId();
    QString strPassword = m_dbMgr.db().GetPassword();

    // FIXME: hard-coded "normal"
    if (!asServer.Login(strUserId, strPassword, "normal")) {
        Q_EMIT downloaded(false);
        return;
    }

    WIZUSERINFOBASE info = asServer.GetUserInfo();
    info.strKbGUID = m_data.strKbGUID;
    bool bOk = false;

    // reset info kb_guid and server url for downloading
    if (m_data.strKbGUID != m_dbMgr.db().kbGUID()) {
        CWizGroupDataArray arrayGroup;
        if (!asServer.GetGroupList(arrayGroup) || arrayGroup.empty()) {
            Q_EMIT downloaded(false);
        }

        CWizGroupDataArray::const_iterator it = arrayGroup.begin();
        for (; it != arrayGroup.end(); it++) {
            const WIZGROUPDATA& group = *it;
            if (group.strGroupGUID == m_data.strKbGUID) {
                info.strDatabaseServer = group.strDatabaseServer;
                bOk = true;
                break;
            }
        }
    } else {
        bOk = true;
    }

    if (!bOk) {
        Q_EMIT downloaded(false);
        return;
    }

    CWizKMDatabaseServer ksServer(info);

    // FIXME: should we query object before download data?
    if (!ksServer.data_download(m_data.strObjectGUID,
                                WIZOBJECTDATA::ObjectTypeToTypeString(m_data.eObjectType),
                                m_data.arrayData, m_data.strDisplayName)) {
        Q_EMIT downloaded(false);
        return;
    }

    m_dbMgr.db(m_data.strKbGUID).UpdateObjectData(m_data.strObjectGUID,
                                                  WIZOBJECTDATA::ObjectTypeToTypeString(m_data.eObjectType),
                                                  m_data.arrayData);

    Q_EMIT downloaded(true);
}
void WizInitBizCertDialog::verifyCert()
{
    QString adminPassword = ui->editAdminPassword->text();
    QString userPassword = ui->editUserPassword->text();
    QString userPassword2 = ui->editUserPassword2->text();
    QString hint = ui->editPasswordHint->text();
    //
    if (adminPassword.isEmpty())
    {
        WizMessageBox::information(this, tr("Please enter the password of cert created by administrator."));
        ui->editAdminPassword->setFocus();
        return;
    }
    if (userPassword.isEmpty())
    {
        WizMessageBox::information(this, tr("Please enter the user password."));
        ui->editUserPassword->setFocus();
        return;
    }
    if (userPassword != userPassword2)
    {
        WizMessageBox::information(this, tr("The passwords does not match."));
        ui->editUserPassword->setFocus();
        return;
    }
    //
    WizDatabase* personalDb = m_pDb->personalDatabase();
    QString userId = personalDb->getUserId();
    QString password = personalDb->getPassword();
    //
    QString bizGuid = m_pDb->bizGuid();
    //
    WizExecutingActionDialog::executeAction(tr("Verifying cert..."), WIZ_THREAD_DEFAULT, [&]{

        bool ret = false;
        QString error;
        //
        WizKMAccountsServer asServer(WizCommonApiEntry::syncUrl());
        if (asServer.login(userId, password))
        {
            QString n;
            QString e;
            QString encrypted_d;
            QString adminHint;
            if (asServer.getAdminBizCert(asServer.getToken(), bizGuid, n, e, encrypted_d, adminHint))
            {
                QString d;
                if (WizAESDecryptBase64StringToString(adminPassword, encrypted_d, d) && !d.isEmpty())
                {
                    QString newEncrypted_d;
                    if (WizAESEncryptStringToBase64String(userPassword, d, newEncrypted_d) && !newEncrypted_d.isEmpty())
                    {
                        //
                        if (asServer.setUserBizCert(bizGuid, n, e, newEncrypted_d, hint))
                        {
                            if (m_pDb->setUserCert(n, e, newEncrypted_d, hint))
                            {
                                m_userPassword = userPassword;
                                ret = true;
                            }
                            else
                            {
                                error = tr("Can't save cert.");
                            }
                        }
                        else
                        {
                            error = asServer.getLastErrorMessage();
                        }

                    }
                    else
                    {
                        error = tr("Can't encrypt cert.");
                    }
                }
                else
                {
                    error = tr("Invalid admin password.");
                }
            }
            else
            {
                error = asServer.getLastErrorMessage();
            }
        }
        else
        {
            error = asServer.getLastErrorMessage();
        }
        //
        ::WizExecuteOnThread(WIZ_THREAD_MAIN, [=]{
            if (ret)
            {
                QDialog::accept();
            }
            else
            {
                WizMessageBox::critical(this, error);
            }
        });
        //
    });
}