Handle non-valid names from legacy network. Wait for instance to stop before stopping another one
This commit is contained in:
parent
47e44a081a
commit
4ea0afca8c
6 changed files with 45 additions and 6 deletions
|
@ -167,9 +167,10 @@ class Buddy {
|
|||
static std::string JIDToLegacyName(const Swift::JID &jid);
|
||||
static BuddyFlag buddFlagsFromJID(const Swift::JID &jid);
|
||||
|
||||
private:
|
||||
protected:
|
||||
void generateJID();
|
||||
|
||||
private:
|
||||
long m_id;
|
||||
// Swift::Presence::ref m_lastPresence;
|
||||
Swift::JID m_jid;
|
||||
|
|
|
@ -37,7 +37,7 @@ class LocalBuddy : public Buddy {
|
|||
void setAlias(const std::string &alias);
|
||||
|
||||
std::string getName() { return m_name; }
|
||||
void setName(const std::string &name) { m_name = name; }
|
||||
bool setName(const std::string &name);
|
||||
|
||||
bool getStatus(Swift::StatusShow &status, std::string &statusMessage) {
|
||||
status = m_status;
|
||||
|
|
|
@ -222,8 +222,22 @@ static void stop_instances(ManagerConfig *config, const std::string &_jid = "")
|
|||
|
||||
int pid = isRunning(CONFIG_STRING(&vhostCfg, "service.pidfile"));
|
||||
if (pid) {
|
||||
std::cout << "Stopping " << itr->path() << ": OK\n";
|
||||
std::cout << "Stopping " << itr->path() << ": ";
|
||||
kill(pid, SIGTERM);
|
||||
|
||||
sleep(1);
|
||||
int count = 20;
|
||||
while (kill(pid, 0) == 0 && count != 0) {
|
||||
std::cout << ".";
|
||||
sleep(1);
|
||||
count--;
|
||||
}
|
||||
if (count == 0) {
|
||||
std::cout << " ERROR (timeout)\n";
|
||||
}
|
||||
else {
|
||||
std::cout << " OK\n";
|
||||
}
|
||||
}
|
||||
else {
|
||||
std::cout << "Stopping " << itr->path() << ": Not running\n";
|
||||
|
|
|
@ -31,6 +31,22 @@ LocalBuddy::LocalBuddy(RosterManager *rosterManager, long id) : Buddy(rosterMana
|
|||
LocalBuddy::~LocalBuddy() {
|
||||
}
|
||||
|
||||
bool LocalBuddy::setName(const std::string &name) {
|
||||
if (name == m_name) {
|
||||
return true;
|
||||
}
|
||||
std::string oldName = name;
|
||||
m_name = name;
|
||||
try {
|
||||
generateJID();
|
||||
return true;
|
||||
} catch (...) {
|
||||
m_name = oldName;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LocalBuddy::setAlias(const std::string &alias) {
|
||||
// if (m_firstSet) {
|
||||
// m_firstSet = false;
|
||||
|
|
|
@ -95,7 +95,10 @@ class NetworkFactory : public Factory {
|
|||
Buddy *createBuddy(RosterManager *rosterManager, const BuddyInfo &buddyInfo) {
|
||||
LocalBuddy *buddy = new LocalBuddy(rosterManager, buddyInfo.id);
|
||||
buddy->setAlias(buddyInfo.alias);
|
||||
buddy->setName(buddyInfo.legacyName);
|
||||
if (!buddy->setName(buddyInfo.legacyName)) {
|
||||
delete buddy;
|
||||
return NULL;
|
||||
}
|
||||
if (buddyInfo.subscription == "both") {
|
||||
buddy->setSubscription(Buddy::Both);
|
||||
}
|
||||
|
@ -203,7 +206,6 @@ static void SigCatcher(int n) {
|
|||
#endif
|
||||
|
||||
static void handleBuddyPayload(LocalBuddy *buddy, const pbnetwork::Buddy &payload) {
|
||||
buddy->setName(payload.buddyname());
|
||||
// Set alias only if it's not empty. Backends are allowed to send empty alias if it has
|
||||
// not changed.
|
||||
if (!payload.alias().empty()) {
|
||||
|
@ -503,6 +505,10 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) {
|
|||
}
|
||||
else {
|
||||
buddy = new LocalBuddy(user->getRosterManager(), -1);
|
||||
if (!buddy->setName(payload.buddyname())) {
|
||||
delete buddy;
|
||||
return;
|
||||
}
|
||||
buddy->setFlags(BUDDY_JID_ESCAPING);
|
||||
handleBuddyPayload(buddy, payload);
|
||||
user->getRosterManager()->setBuddy(buddy);
|
||||
|
|
|
@ -303,7 +303,9 @@ void RosterManager::handleRemoteRosterResponse(boost::shared_ptr<Swift::RosterPa
|
|||
buddyInfo.groups = item.getGroups();
|
||||
|
||||
Buddy *buddy = m_component->getFactory()->createBuddy(this, buddyInfo);
|
||||
setBuddy(buddy);
|
||||
if (buddy) {
|
||||
setBuddy(buddy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue