/**
 * The cookie value is like seahub_shib="[email protected]@bd8cc1138", where
 * [email protected] is username and bd8cc1138 is api token"
 */
Account ShibLoginDialog::parseAccount(const QString& cookie_value)
{
    QString txt = cookie_value;
    if (txt.startsWith("\"")) {
        txt = txt.mid(1, txt.length() - 2);
    }
    int pos = txt.lastIndexOf("@");
    QString email = txt.left(pos);
    QString token = txt.right(txt.length() - pos - 1);
    if (email.isEmpty() or token.isEmpty()) {
        return Account();
    }
    return Account(url_, email, token);
}
Example #2
0
void MixClient::resetState(std::map<Secret, u256> _accounts, Secret _miner)
{
	WriteGuard l(x_state);
	Guard fl(x_filtersWatches);
	m_filters.clear();
	m_watches.clear();

	m_stateDB = OverlayDB();
	SecureTrieDB<Address, MemoryDB> accountState(&m_stateDB);
	accountState.init();

	m_userAccounts.clear();
	std::map<Address, Account> genesisState;
	for (auto account: _accounts)
	{
		KeyPair a = KeyPair(account.first);
		m_userAccounts.push_back(a);
		genesisState.insert(std::make_pair(a.address(), Account(account.second, Account::NormalCreation)));
	}

	dev::eth::commit(genesisState, static_cast<MemoryDB&>(m_stateDB), accountState);
	h256 stateRoot = accountState.root();
	m_bc.reset();
	m_bc.reset(new MixBlockChain(m_dbPath, stateRoot));
	m_state = eth::State(m_stateDB, BaseState::PreExisting, KeyPair(_miner).address());
	m_state.sync(bc());
	m_startState = m_state;
	WriteGuard lx(x_executions);
	m_executions.clear();
}
Example #3
0
void WalletFacade::emitStealthKey(const QString &address)
{
    QVariantMap account;
    account.insert("stealth", address);
    emit Account(account);

}
Example #4
0
void HuobiApp::submitLimitOrder(const char *symbol, OrderSide side, double price, double amount, const char *userId)
{
    int ts = timestamp();
    FIX44::NewOrderSingle message;
    message.set(Account(_publicKey));
    if (userId)
        message.set(ClOrdID(userId));
    else
        message.set(ClOrdID("HuobiOrder"));
    message.set(Price(price));
    message.set(MinQty(amount));
    message.set(OrdType(OrdType_LIMIT));
    message.set(Symbol(symbol));
    message.set(Side(side == OrderBuy ? Side_BUY : Side_SELL));
    message.set(TransactTime());
    message.setField(IntField(957, ts));
    message.setField(StringField(958, _publicKey));
    char str[1024];
    sprintf(str, "access_key=%s&amount=%s&coin_type=%d&created=%d&method=%s&price=%s&secret_key=%s",
            _publicKey.c_str(),
            float2str(amount).c_str(),
            getCoinType(symbol),
            ts,
            side == OrderBuy ? "buy" : "sell",
            float2str(price).c_str(),
            _privateKey.c_str());
    message.setField(StringField(959, md5::MD5String(str, false)));
    Session *session = Session::lookupSession(_sessionID);
    if (session)
        session->send(message);
}
Example #5
0
Account IM::getAccount(string name) const
{
	map<string, Account> alist = getAccountsList();
	for(map<string, Account>::iterator it = alist.begin(); it != alist.end(); ++it)
		if(it->second.getServername() == name || it->second.getID() == name)
			return it->second;
	return Account();
}
Example #6
0
void WalletFacade::emitStealthPayment(const QJsonObject &payment)
{
    QVariantMap account;
    EthereumCheckSum checksum;
    account.insert("stealth", payment["stealth"].toString());
    account.insert("address", QString(checksum.compute(payment["address"].toString().toStdString()).c_str()));
    emit Account(account);
}
Example #7
0
Account IM::getAccountFromChannel(string name) const
{
	map<string, Account> alist = getAccountsList();
	for(map<string, Account>::iterator it = alist.begin(); it != alist.end(); ++it)
		if(it->second.getStatusChannelName() == name)
			return it->second;
	return Account();
}
void CloudView::deleteAccount()
{
    QString question = tr("Are you sure to remove this account?");
    if (QMessageBox::question(this, tr("Seafile"), question) == QMessageBox::Ok) {
        seafApplet->accountManager()->removeAccount(current_account_);
        current_account_ = Account();
    }
}
Example #9
0
void
AmendmentTableImpl::doVoting (Ledger::ref lastClosedLedger,
    SHAMap::ref initialPosition)
{

    // LCL must be flag ledger
    assert((lastClosedLedger->getLedgerSeq () % 256) == 0);

    AmendmentSet amendmentSet (lastClosedLedger->getParentCloseTimeNC ());

    // get validations for ledger before flag ledger
    ValidationSet valSet = getApp().getValidations ().getValidations (lastClosedLedger->getParentHash ());
    for (auto const& entry : valSet)
    {
        auto const& val = *entry.second;

        if (val.isTrusted ())
        {
            amendmentSet.addVoter ();
            if (val.isFieldPresent (sfAmendments))
            {
                for (auto const& amendment : val.getFieldV256 (sfAmendments))
                {
                    amendmentSet.addVote (amendment);
                }
            }
        }
    }
    reportValidations (amendmentSet);

    amendmentList_t lAmendments = getToEnable (lastClosedLedger->getCloseTimeNC ());
    for (auto const& uAmendment : lAmendments)
    {
        if (m_journal.warning) m_journal.warning <<
            "Voting for amendment: " << uAmendment;

        // Create the transaction to enable the amendment
        STTx trans (ttAMENDMENT);
        trans.setFieldAccount (sfAccount, Account ());
        trans.setFieldH256 (sfAmendment, uAmendment);
        uint256 txID = trans.getTransactionID ();

        if (m_journal.warning) m_journal.warning <<
            "Vote ID: " << txID;

        // Inject the transaction into our initial proposal
        Serializer s;
        trans.add (s, true);
#if RIPPLE_PROPOSE_AMENDMENTS
        SHAMapItem::pointer tItem = std::make_shared<SHAMapItem> (txID, s.peekData ());
        if (!initialPosition->addGiveItem (tItem, true, false))
        {
            if (m_journal.warning) m_journal.warning <<
                "Ledger already had amendment transaction";
        }
#endif
    }
}
Account AccountManager::getAccountBySignature(const QString& account_sig) const
{
    for (size_t i = 0; i < accounts_.size(); i++) {
        if (accounts_[i].getSignature() == account_sig) {
            return accounts_[i];
        }
    }

    return Account();
}
Example #11
0
void OkcoinApp::requestOrderStatus(const char *symbol, const char *orderId, OrderSide side)
{
    int ts = timestamp();
    FIX44::OrderMassStatusRequest message;
    message.set(Account(_publicKey + "," + _privateKey));
    message.set(MassStatusReqID(orderId));
    message.set(MassStatusReqType(MassStatusReqType_STATUS_FOR_ORDERS_FOR_A_SECURITY));
    Session *session = Session::lookupSession(_sessionID);
    if (session)
        session->send(message);
}
Example #12
0
void WalletFacade::emitEthereumKey(const QString &address)
{
    if(!_database.getStealthPayments().get(address.toStdString()).empty())
    {
        return; //ignore duplicates
    }
    QVariantMap account;
    EthereumCheckSum checksum;
    account.insert("address", QString(checksum.compute(address.toStdString()).c_str()));
    emit Account(account);
}
Example #13
0
TAccounts::TStrAccHash TDBAccountsPrivate::LoadAccounts() const
   {
      TAccounts::TStrAccHash Result;
      QSqlQuery Query;

      Query = DbIo()->Execute(QString("SELECT UserName, Password FROM %1;").arg(AccountsTableName));
      for(; Query.next(); )
         {
            const QString &UserName = Query.value(0).toString();
            ASSERT_X(Query.value(0).isValid(), "Does UserName exist in databse?")
            const QString &Password = Query.value(1).toString();
            ASSERT_X(Query.value(0).isValid(), "Does Password exist in databse?")
            const QDate &SinceDate = DbIo()->ReadDate("SinceYear", "SinceMonth", "SinceDay", AccountsTableName, UserName);
            const QTime &Sincetime = DbIo()->ReadTime("SinceHour", "SinceMinute", "SinceSecond", AccountsTableName, UserName);
            TAccount Account(UserName, Password);
            Account.SetEmitSignals(false);
            Account.SetSince(QDateTime(SinceDate, Sincetime));
            Account.SetEmitSignals(true);
            ASSERT(!Result.contains(UserName))
            Result[UserName] = Account;
         }

      Query = DbIo()->Execute(QString("SELECT UserNames, Status FROM %1;").arg(FriendshipTableName));
      for(; Query.next(); )
         {
            // Extract first username
            const QString &UserNames = Query.value(0).toString();
            ASSERT_X(Query.value(0).isValid(), "Does UserNames exist in databse?")
            const QStringList &Tokens = UserNames.split(SEPARATOR);
            ASSERT_OP(Tokens.size(), ==, 2)
            const QString &UserName1 = Tokens[0];

            // Extract url of second username
            // Tokens[1]; // = //[email protected]:42750
            Core::TUserHostPort UserName2Url = Core::TUserHostPort::FromString(Tokens[1]);
            ASSERT_X(UserName2Url.IsValid(), UserName2Url << Tokens[1])

            // Add
            ASSERT(Result.contains(UserName1))
            TAccount &Account = Result[UserName1];
            const QString &StrStatus = Query.value(1).toString();
            ASSERT_X(Query.value(0).isValid(), "Does Status exist in databse?")
            const TFriendshipStatus &Status = StringToFriendshipStatus(StrStatus);
            ASSERT(Status != TFriendshipStatus::FS_None);
            if(Status == TFriendshipStatus::FS_1_To_2)
               Account.AddedByMe().insert(UserName2Url);
            else if(Status == TFriendshipStatus::FS_2_To_1)
               Account.IWasAddedBy().insert(UserName2Url);
            else
               Account.MutualFriends().insert(UserName2Url);
         }

      return Result;
   }
Example #14
0
bool AccountManager::loadAccountsCB(sqlite3_stmt *stmt, void *data)
{
    AccountManager *mgr = (AccountManager *)data;
    const char *url = (const char *)sqlite3_column_text (stmt, 0);
    const char *username = (const char *)sqlite3_column_text (stmt, 1);
    const char *token = (const char *)sqlite3_column_text (stmt, 2);
    qint64 atime = (qint64)sqlite3_column_int64 (stmt, 3);

    Account account = Account(QUrl(QString(url)), QString(username), QString(token), atime);
    mgr->accounts_.push_back(account);
    return true;
}
Account AccountManager::getAccountByHostAndUsername(const QString& host,
                                                    const QString& username) const
{
    for (size_t i = 0; i < accounts_.size(); i++) {
        if (accounts_[i].serverUrl.host() == host
            && accounts_[i].username == username) {
            return accounts_[i];
        }
    }

    return Account();
}
Example #16
0
void main()
{
    Account a = Account("Derek Molloy",35.00,34234324); 
    Account b(a);
    
    a.display();
    b.display();   

    a.makeLodgement(100.0);

    a.display();   
    b.display();    
}
void LoginDialog::loginSuccess(const QString& token)
{
    if (account_info_req_) {
        account_info_req_->deleteLater();
    }
    account_info_req_ =
        new FetchAccountInfoRequest(Account(url_, username_, token));
    connect(account_info_req_, SIGNAL(success(const AccountInfo&)), this,
            SLOT(onFetchAccountInfoSuccess(const AccountInfo&)));
    connect(account_info_req_, SIGNAL(failed(const ApiError&)), this,
            SLOT(onFetchAccountInfoFailed(const ApiError&)));
    account_info_req_->send();
}
Example #18
0
void SettingsManager::showDialog()
{
    SettingsDialog dlg((QWidget *)this->parent());
    dlg.setPigsAccount(Account(_settings.value("pUsername").toString(), _settings.value("pPassword").toString()));
    dlg.setHostopAccount(Account(_settings.value("hUsername").toString(), _settings.value("hPassword").toString()));
    dlg.setTimerInterval(_settings.value("pInterval").toInt());
    dlg.setTrayIcon(_settings.value("tIcon").toBool());
    dlg.setTrayMess(_settings.value("tMess").toBool());
    dlg.setDebug(_settings.value("mDebug").toBool());
    if (dlg.exec() == QDialog::Accepted) {
        Account acc = dlg.getPigsAccount();
        if (acc.isValid()) {

            _settings.insert("pUsername", acc.user);
            _settings.insert("pPassword", acc.pass);
        } else {
            _settings.remove("pUsername");
            _settings.remove("pPassword");
        }
        acc = dlg.getHostopAccount();
        if (acc.isValid()) {
            _settings.insert("hUsername", acc.user);
            _settings.insert("hPassword", acc.pass);

        } else {
            _settings.remove("hUsername");
            _settings.remove("hPassword");
        }

        _settings.insert("pInterval", dlg.getTimerInterval());
        _settings.insert("tIcon", dlg.getTrayIcon());
        _settings.insert("tMess", dlg.getTrayMess());
        _settings.insert("mDebug", dlg.getDebug());

        emit settingsChanged();
    }
}
Example #19
0
void Pages::comment(Document *doc){

    std::string sub, _sub;
    int tid = route("track", path, sub);
    int uid = route("user", path, _sub);

    if((tid && sub == "comment") || (uid && _sub == "comment")){

        Track t(tid);
        User u(uid);
        if(!t && !u) return;

        bool bot = true;
        cgicc::form_iterator url = cgi.getElement("url");
        if(url != cgi.getElements().end())
            bot = !url->getValue().empty();

        std::string msg = cgi("msg");
        if(cgi.getEnvironment().getRequestMethod() != "POST" || msg.empty() || bot || (Session::user() && Session::nonce() != cgi("nonce")))
            return doc->redirect(t ? t.url() : u.url());

        Session::newNonce();

        Event e;
        e.type = Event::Comment;
        e.source = Session::user() ? Session::user() : User(0, cgi("name"));
        e.target = u ? u : t.artist;
        e.track = t;
        e.message = msg;
        e.push();

        Account dst = Account(e.target.id);
        if(dst != e.source && dst.notify){
            std::string mail = (std::string)
                "From: EqBeats notification <*****@*****.**>\n"
                "Subject: EqBeats comment notification\n"
                "Precedence: bulk\n\n" +
                e.source.name + " posted a comment on " + (t ? t.title : "your user page") + ":\n\n" +
                e.message + "\n\n"
                "You can view it and answer here : " + eqbeatsUrl() + (t ? t.url() : u.url()) + "\n"
                "If you do not wish to recieve those notifications anymore, you can disable them here : " + eqbeatsUrl() + "/account";
            sendMail(dst.email.c_str(), mail.c_str());
        }

        doc->redirect(t ? t.url() : u.url());

    }

}
Example #20
0
void AccountsFunctions::loadAccounts() { //this is not working yet maybe
	ifstream File("Accounts.db");
	string load;

	while (getline(File, load)) {
		istringstream ss(load);
		int currentAccount_ID = 0;
		string field, username, password;
		getline(ss, field, ','); username = field;
		getline(ss, field, ','); password = field;
		currentAccount_ID = account_ID++;
		accountList.push_back(Account(username, password, currentAccount_ID));
	}
	File.close();
}
Example #21
0
void OkcoinApp::submitMarketOrder(const char *symbol, OrderSide side, double amount, const char *userId)
{
    int ts = timestamp();
    FIX44::NewOrderSingle message;
    message.set(Account(_publicKey + "," + _privateKey));
    if (userId)
        message.set(ClOrdID(userId));
    else
        message.set(ClOrdID("OkcoinOrder"));
    message.set(Price(amount));
    message.set(OrderQty(amount));
    message.set(OrdType(OrdType_MARKET));
    message.set(Symbol(symbol));
    message.set(Side(side == OrderBuy ? Side_BUY : Side_SELL));
    message.set(TransactTime());
    Session *session = Session::lookupSession(_sessionID);
    if (session)
        session->send(message);
}
bool AccountManager::loadAccountsCB(sqlite3_stmt *stmt, void *data)
{
    UserData *userdata = static_cast<UserData*>(data);
    const char *url = (const char *)sqlite3_column_text (stmt, 0);
    const char *username = (const char *)sqlite3_column_text (stmt, 1);
    const char *token = (const char *)sqlite3_column_text (stmt, 2);
    qint64 atime = (qint64)sqlite3_column_int64 (stmt, 3);
    int isShibboleth = sqlite3_column_int (stmt, 4);

    if (!token) {
        token = "";
    }

    Account account = Account(QUrl(QString(url)), QString(username), QString(token), atime, isShibboleth != 0);
    char* zql = sqlite3_mprintf("SELECT key, value FROM ServerInfo WHERE url = %Q AND username = %Q", url, username);
    sqlite_foreach_selected_row (userdata->db, zql, loadServerInfoCB, &account.serverInfo);
    sqlite3_free(zql);

    userdata->accounts->push_back(account);
    return true;
}
Example #23
0
void HuobiApp::requestOrderStatus(const char *symbol, const char *orderId, OrderSide side)
{
    int ts = timestamp();
    FIX44::OrderStatusRequest message;
    message.set(Account(_publicKey));
    message.set(ClOrdID(orderId));
    message.set(Symbol(symbol));
    message.set(Side(side == OrderBuy ? Side_BUY : Side_SELL));
    message.setField(IntField(957, ts));
    message.setField(StringField(958, _publicKey));
    char str[1024];
    sprintf(str, "access_key=%s&coin_type=%d&created=%d&id=%s&method=order_info&secret_key=%s",
            _publicKey.c_str(),
            getCoinType(symbol),
            ts,
            orderId,
            _privateKey.c_str());
    message.setField(StringField(959, md5::MD5String(str, false)));
    Session *session = Session::lookupSession(_sessionID);
    if (session)
        session->send(message);
}
Example #24
0
void CloudView::deleteAccount()
{
    QString question = tr("Are you sure to remove this account?<br>"
                          "<b>Warning: All libraries of this account would be unsynced!</b>");
    if (QMessageBox::question(this,
                              tr(SEAFILE_CLIENT_BRAND),
                              question,
                              QMessageBox::Ok | QMessageBox::Cancel,
                              QMessageBox::Cancel) == QMessageBox::Ok) {

        QString error, server_addr = current_account_.serverUrl.host();
        if (seafApplet->rpcClient()->unsyncReposByAccount(server_addr,
                                                          current_account_.username,
                                                          &error) < 0) {
            QMessageBox::warning(this, tr(SEAFILE_CLIENT_BRAND),
                                 tr("Failed to unsync libraries of this account: %1").arg(error),
                                 QMessageBox::Ok);
        }

        Account account = current_account_;
        setCurrentAccount(Account());
        seafApplet->accountManager()->removeAccount(account);
    }
}
Example #25
0
int main()
{
	Account a = Account(100.00);
	SavingAccount sa = SavingAccount(1000.00, 0.03);
	CheckingAccount ca = CheckingAccount(3000.00, 100.00);

	a.credit(100.00);
	cout << a.getBalance() << endl;
	a.debit(50.00);
	cout << a.getBalance() << endl;

	sa.credit(1000.00);
	cout << sa.getBalance() << endl;
	sa.calculateInterest();
	sa.debit(1000);
	cout << sa.getBalance() << endl;

	ca.credit(10.00);
	cout << ca.getBalance() << endl;
	ca.debit(1000.00);
	cout << ca.getBalance() << endl;

	return 0;
}
Example #26
0
Account SettingsDialog::getHostopAccount() const
{
    return Account(m_ui->lineEdit_HUser->text(), m_ui->lineEdit_HPass->text());
}
Example #27
0
Account SettingsDialog::getPigsAccount() const
{
    return Account(m_ui->lineEdit_PigserUsername->text(), m_ui->lineEdit_PigserPassword->text());
}
int insertUser(string ID, string pw){
	return insertUser(Account(ID, pw));
}
CheckingAccount::CheckingAccount(double percentage){
	Account();
	Percent=percentage;
}
void *run(void *arg){
	pthread_detach(pthread_self());
	vector<string>tok;
	Account currentUser;
	int n;
	char  mesg[MAXLINE], sendline[MAXLINE], recvline[MAXLINE];
	ClientSock clientSock=*(ClientSock*)arg;
	int connfd=clientSock.connfd;
	struct sockaddr_in cliaddr=clientSock.addr;
	free(arg);

	while((n=receive(connfd, recvline)) >0) {

		recvline[n]=0; /* null terminate */
		printf("from client IP %s port %d\n", getIP(cliaddr), getPort(cliaddr));
		printf("connfd = %d\n", connfd);
		tok.clear();
		tok=parse(recvline);
		

		if(userAccount.find(User(getIP(cliaddr), getPort(cliaddr), cliaddr))==userAccount.end()){
			if(tok[0][0]=='R'){
				writeRecv(connfd, recvline, strlen(recvline));// send to client
				//register
				currentUser=Account(tok[1], tok[2]);
				currentUser.state=Normal;
				userAccount[User(getIP(cliaddr), getPort(cliaddr), cliaddr, connfd)]=currentUser;
				accountUser[currentUser]=User(getIP(cliaddr), getPort(cliaddr), cliaddr, connfd);
				
				if(insertUser(currentUser)){
					puts("register sucess");
					write(connfd, SUCCESS, strlen(SUCCESS));

					// update filelist
					recvFilelist(connfd, currentUser.ID);


				}
				else{
					puts("register fail");

					write(connfd, FAIL, strlen(FAIL));
				}
			}
			else if(tok[0][0]=='L'){
				writeRecv(connfd, recvline, strlen(recvline));// send to client
				if(login(Account(tok[1], tok[2]))){
					currentUser=Account(tok[1], tok[2]);
					currentUser.state=Normal;
					userAccount[User(getIP(cliaddr), getPort(cliaddr), cliaddr, connfd)]=currentUser;
					accountUser[currentUser]=User(getIP(cliaddr), getPort(cliaddr), cliaddr, connfd);
					puts("login sucess");
					write(connfd, SUCCESS, strlen(SUCCESS));	
					// update filelist
					recvFilelist(connfd, currentUser.ID);

				}
				else{
					puts("login fail");
					write(connfd, FAIL, strlen(FAIL));
				}
			}
		}
		else{ // login already
			currentUser=userAccount[User(getIP(cliaddr), getPort(cliaddr), cliaddr)];
			accountUser[currentUser]=User(getIP(cliaddr), getPort(cliaddr), cliaddr);
			if(currentUser.state==Normal){
				if(tok[0]=="Del"){// delete account
					writeRecv(connfd, recvline, strlen(recvline));// send to client
					puts("Delete account");
					deleteUser(currentUser);// delete in db
					userAccount.erase(User(getIP(cliaddr), getPort(cliaddr), cliaddr));
					accountUser.erase(currentUser);
					
					write(connfd, SUCCESS, strlen(SUCCESS));
				}
				else if(tok[0]=="L"){// logout
					writeRecv(connfd, recvline, strlen(recvline));// send to client
					puts("Logout");
					userAccount.erase(User(getIP(cliaddr), getPort(cliaddr), cliaddr));
					accountUser.erase(currentUser);
					deleteFile(currentUser.ID);
					write(connfd, SUCCESS, strlen(SUCCESS));
				}
			
				//------------------------------------------------
				// show filelist/ show user
				else if(tok[0]=="SU"){// show user
					writeRecv(connfd, recvline, strlen(recvline));// send to client
					writeRecv(connfd, SUCCESS, strlen(SUCCESS));
					sendUser(connfd);
				}
				else if(tok[0]=="SF"){// show filelist
					writeRecv(connfd, recvline, strlen(recvline));// send to client
					writeRecv(connfd, SUCCESS, strlen(SUCCESS));
					showFilelist();
					sendResult(connfd, 2, result);
				}
				//------------------------------------------------
				// upload download
				else if(tok[0]=="D"){// download
					writeRecv(connfd, recvline, strlen(recvline));// send to client
					int numFile=existNumFile(tok[1]);
					printf("number of file = %d\n", numFile);
					
					// total authors
					if(numFile){
						vector<string>author=getFileAuthor();
						writeRecv(connfd, SUCCESS, strlen(SUCCESS));
						string str=toString((int)author.size());
						// how many author
						write(connfd, str.c_str(), str.length());
						// to user A
						recvWrite(connfd, recvline);// tell B connect to "port"
						// to user A
						User userA=accountUser[currentUser];
						for(int i=0;i<author.size();i++){
							cout<<author[i]<<endl;

							
							User userB=accountUser[Account(author[i])];
							
							// user B
							str=string(DOWNLOAD)+" "+userA.IP+" "+recvline+" "+tok[1]+" "+toString(i)+" "+toString((int)author.size());
							write(userB.connfd, str.c_str(), str.length());// tell B :(A's) IP port path idx total

						}

						// update filelist
						puts("update filelist");
						addFile(currentUser.ID, tok[1]);
					}
					else{
						write(connfd, FAIL, strlen(FAIL));
					}
					


				}
				else if(tok[0]=="U"){// upload
					writeRecv(connfd, recvline, strlen(recvline));// send to client
					if(accountUser.find(Account(tok[1]))!=accountUser.end()){
						// to user A
						write(connfd, SUCCESS, strlen(SUCCESS));
						User userA=accountUser[currentUser];
						User userB=accountUser[Account(tok[1])];
						string str;
						// to user A
						recvWrite(connfd, recvline);// tell B connect to "port"
						// user B
						str=string(UPLOAD)+" "+userA.IP+" "+recvline+" "+tok[2];
						write(userB.connfd, str.c_str(), str.length());// tell B :(A's) IP port

						// update B's filelist
						addFile(tok[1], tok[2]);
					}
					else{
						write(connfd, FAIL, strlen(FAIL));
					}
					
				}
				//------------------------------------------------
				else if(tok[0]=="T"){// A tell B
					writeRecv(connfd, recvline, strlen(recvline));// send to client
					if(accountUser.find(Account(tok[1]))!=accountUser.end()){
						currentUser.state=Tell;
						userAccount[User(getIP(cliaddr), getPort(cliaddr), cliaddr, connfd)]=currentUser;
						// to user A
						write(connfd, SUCCESS, strlen(SUCCESS));
						User userA=accountUser[currentUser];
						User userB=accountUser[Account(tok[1])];
						Account accountB=userAccount[userB];
						accountB.state=Tell;
						userAccount[userB]=accountB;
						
						string str;
						// to user A
						recvWrite(connfd, recvline);// tell B connect to "port"
						// user B
						printf("user B connfd = %d\n", userB.connfd);
						str=string(TALK)+" "+userA.IP+" "+recvline;
						// write(userB.connfd, TALK, strlen(TALK));
						
						
						write(userB.connfd, str.c_str(), str.length());// tell B :(A's) IP port

						// string str=userB.IP+" "+toString(userB.port);
						// writeWithSleep(connfd, str.c_str(), str.length());

					}
					else{
						write(connfd, FAIL, strlen(FAIL));
					}
					
				}
			
			}
			else if(currentUser.state==Tell){
				if(tok[0]=="EXIT"){
					printf("%s EXIT~\n", currentUser.ID.c_str());
					currentUser.state=Normal;
					userAccount[User(getIP(cliaddr), getPort(cliaddr), cliaddr, connfd)]=currentUser;
				}
				else{
					printf("%s tell~\n", currentUser.ID.c_str());
				}
			}		
		}
		puts(recvline);
		
		
		// write(connfd, recvline, strlen(recvline));
	}
	close(connfd);

	return NULL;
}