Fixed typo, memory coruption
authorzev <zev@radensolutions.com>
Thu, 26 May 2016 11:26:18 +0000 (14:26 +0300)
committerzev <zev@radensolutions.com>
Thu, 26 May 2016 11:28:10 +0000 (14:28 +0300)
include/nxevent.h
src/server/core/ldap.cpp
src/server/core/userdb.cpp
src/server/core/userdb_objects.cpp
src/server/include/nms_users.h
src/server/tools/nxdbmgr/upgrade.cpp

index 72d8f0e..2b31350 100644 (file)
 #define EVENT_IF_IPADDR_DELETED           77
 #define EVENT_MAINTENANCE_MODE_ENTERED    78
 #define EVENT_MAINTENANCE_MODE_LEFT       79
-#define EVENT_LDAP_SYCN_ERROR             80
+#define EVENT_LDAP_SYNC_ERROR             80
 
 #define EVENT_SNMP_UNMATCHED_TRAP         500
 #define EVENT_SNMP_COLD_START             501
index cfb256b..da62522 100644 (file)
@@ -575,7 +575,7 @@ void LDAPConnection::fillLists(LDAPMessage *searchResult)
          }
          if (m_ldapUsreIdAttr[0] != 0 && !strcmp(attribute, m_ldapUsreIdAttr) && newObj->m_type == LDAP_USER)
          {
-            //newObj->m_id = getIdAttrValue(entry, attribute);
+            newObj->m_id = getIdAttrValue(entry, attribute);
          }
          if (m_ldapGroupIdAttr[0] != 0 && !strcmp(attribute, m_ldapGroupIdAttr) && newObj->m_type == LDAP_GROUP)
          {
@@ -674,7 +674,7 @@ TCHAR *LDAPConnection::getIdAttrValue(LDAPMessage *entry, const char *attr)
       return _tcsdup(_T(""));
 
    CalculateSHA256Hash(tmp, pos, hash);
-   TCHAR *result = (TCHAR *)malloc(SHA256_DIGEST_SIZE * 2 + 1);
+   TCHAR *result = (TCHAR *)malloc(sizeof(TCHAR) * (SHA256_DIGEST_SIZE * 2 + 1));
    BinToStr(hash, SHA256_DIGEST_SIZE, result);
    return result;
 }
index 2cb62aa..2ef4518 100644 (file)
@@ -311,7 +311,7 @@ UINT32 AuthenticateUser(const TCHAR *login, const TCHAR *password, UINT32 dwSigL
 
       if (user->isLDAPUser())
       {
-         if (user->isDisabled() || user->hasSyncException())
+         if (user->isDisabled())
          {
             dwResult = RCC_ACCOUNT_DISABLED;
             goto result;
@@ -620,7 +620,7 @@ void UpdateLDAPUser(const TCHAR *dn, Entry *obj)
    {
       _sntprintf(description, MAX_USER_DESCR, _T("Got user with DN=%s but found existing group %s with same DN"), dn, object->getName());
       object->getGuidAsText(guid);
-      PostEvent(EVENT_LDAP_SYCN_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), description);
+      PostEvent(EVENT_LDAP_SYNC_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), description);
       DbgPrintf(4,  _T("UpdateLDAPUser(): %s"), description);
       conflict = true;
    }
@@ -636,13 +636,19 @@ void UpdateLDAPUser(const TCHAR *dn, Entry *obj)
             TCHAR *userName = GenerateUniqueName(obj->m_loginName, user->getId());
             if(_tcscmp(user->getName(), userName))
             {
-               user->setSyncException();
-               TCHAR conflictDescription[MAX_USER_DESCR];
-               _sntprintf(conflictDescription, MAX_USER_DESCR, _T("User with name \"%s\" already exists."), obj->m_loginName);
-               user->setDescription(conflictDescription);
+               user->setName(userName);
+               _sntprintf(description, 1024, _T("LDAP user update error: User with name \"%s\" already exists. Unique user name have been generated: \"%s\""), obj->m_loginName, userName);
                object->getGuidAsText(guid);
-               PostEvent(EVENT_LDAP_SYCN_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), conflictDescription);
-               DbgPrintf(4,  _T("UpdateLDAPUser(): %s"), conflictDescription);
+               PostEvent(EVENT_LDAP_SYNC_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), description);
+               DbgPrintf(4,  _T("UpdateLDAPUser(): %s"), description);
+            }
+            user->setFullName(obj->m_fullName);
+            user->setDescription(obj->m_description);
+            if(_tcscmp(user->getDn(), dn))
+            {
+               s_ldapNames.remove(user->getDn());
+               user->setDn(dn);
+               s_ldapNames.set(dn, user);
             }
             free(userName);
          }
@@ -686,7 +692,7 @@ void UpdateLDAPUser(const TCHAR *dn, Entry *obj)
       {
          UINT32 userId = CreateUniqueId(IDG_USER);
          TCHAR *userName = GenerateUniqueName(obj->m_loginName, userId);
-         _sntprintf(description, MAX_USER_DESCR, _T("User with name \"%s\" already exists. Unique user name have been generated: %s"), obj->m_loginName, userName);
+         _sntprintf(description, MAX_USER_DESCR, _T("LDAP user update error: User with name \"%s\" already exists. Unique user name have been generated: \"%s\""), obj->m_loginName, userName);
          DbgPrintf(4,  _T("UpdateLDAPUser(): %s"), description);
          User *user = new User(userId, userName);
          user->setFullName(obj->m_fullName);
@@ -698,7 +704,7 @@ void UpdateLDAPUser(const TCHAR *dn, Entry *obj)
          AddDatabaseObject(user);
          SendUserDBUpdate(USER_DB_CREATE, user->getId(), user);
          user->getGuidAsText(guid);
-         PostEvent(EVENT_LDAP_SYCN_ERROR ,g_dwMgmtNode, "issss", user->getId(), guid, user->getDn(), user->getName(), description);
+         PostEvent(EVENT_LDAP_SYNC_ERROR ,g_dwMgmtNode, "issss", user->getId(), guid, user->getDn(), user->getName(), description);
          DbgPrintf(4, _T("UpdateLDAPUser(): User added: ID: %s DN: %s, login name: %s, full name: %s, description: %s"), CHECK_NULL(obj->m_id), dn, userName, CHECK_NULL(obj->m_fullName), CHECK_NULL(obj->m_description));
          free(userName);
       }
@@ -815,7 +821,7 @@ void UpdateLDAPGroup(const TCHAR *dn, Entry *obj) //no full name, add users insi
    {
       _sntprintf(description, MAX_USER_DESCR, _T("Got group with DN=%s but found existing group %s with same DN"), dn, object->getName());
       object->getGuidAsText(guid);
-      PostEvent(EVENT_LDAP_SYCN_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), description);
+      PostEvent(EVENT_LDAP_SYNC_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), description);
       DbgPrintf(4,  _T("UpdateLDAPGroup(): %s"), description);
       conflict = true;
    }
@@ -831,13 +837,18 @@ void UpdateLDAPGroup(const TCHAR *dn, Entry *obj) //no full name, add users insi
             TCHAR *groupName = GenerateUniqueName(obj->m_loginName, group->getId());
             if(_tcscmp(group->getName(), groupName))
             {
-               group->setSyncException();
-               TCHAR conflictDescription[MAX_USER_DESCR];
-               _sntprintf(conflictDescription, MAX_USER_DESCR, _T("Group with name \"%s\" already exists."), obj->m_loginName);
-               group->setDescription(conflictDescription);
+               group->setName(groupName);
+               _sntprintf(description, MAX_USER_DESCR, _T("Group with name \"%s\" already exists. Unique group name have been generated: \"%s\""), obj->m_loginName, groupName);
                object->getGuidAsText(guid);
-               PostEvent(EVENT_LDAP_SYCN_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), conflictDescription);
-               DbgPrintf(4,  _T("UpdateLDAPGroup(): %s"),conflictDescription);
+               PostEvent(EVENT_LDAP_SYNC_ERROR ,g_dwMgmtNode, "issss", object->getId(), guid, object->getDn(), object->getName(), description);
+               DbgPrintf(4,  _T("UpdateLDAPGroup(): %s"),description);
+            }
+            group->setDescription(obj->m_description);
+            if(_tcscmp(group->getDn(), dn))
+            {
+               s_ldapNames.remove(group->getDn());
+               group->setDn(dn);
+               s_ldapNames.set(dn, group);
             }
             free(groupName);
          }
@@ -881,7 +892,7 @@ void UpdateLDAPGroup(const TCHAR *dn, Entry *obj) //no full name, add users insi
       {
          UINT32 id = CreateUniqueId(IDG_USER_GROUP);
          TCHAR *groupName = GenerateUniqueName(obj->m_loginName, id);
-         _sntprintf(description, MAX_USER_DESCR, _T("Group with name \"%s\" already exists. Unique group name have been generated: %s"), obj->m_loginName, groupName);
+         _sntprintf(description, MAX_USER_DESCR, _T("Group with name \"%s\" already exists. Unique group name have been generated: \"%s\""), obj->m_loginName, groupName);
          DbgPrintf(4,  _T("UpdateLDAPGroup(): %s"),description);
          Group *group = new Group(id, groupName);
          group->setDescription(obj->m_description);
@@ -893,7 +904,7 @@ void UpdateLDAPGroup(const TCHAR *dn, Entry *obj) //no full name, add users insi
          AddDatabaseObject(group);
          SyncGroupMembers(group , obj);
          group->getGuidAsText(guid);
-         PostEvent(EVENT_LDAP_SYCN_ERROR ,g_dwMgmtNode, "issss", group->getId(), guid, group->getDn(), group->getName(), description);
+         PostEvent(EVENT_LDAP_SYNC_ERROR ,g_dwMgmtNode, "issss", group->getId(), guid, group->getDn(), group->getName(), description);
          DbgPrintf(4, _T("UpdateLDAPGroup(): Group added: ID: %s DN: %s, login name: %s, description: %s"), CHECK_NULL(obj->m_id), dn, obj->m_loginName, CHECK_NULL(obj->m_description));
          free(groupName);
       }
@@ -1293,7 +1304,7 @@ UINT32 NXCORE_EXPORTABLE ValidateUserPassword(UINT32 userId, const TCHAR *login,
       rcc = RCC_SUCCESS;
       if (user->isLDAPUser())
       {
-         if (user->isDisabled() || user->hasSyncException())
+         if (user->isDisabled())
          {
             rcc = RCC_ACCOUNT_DISABLED;
          }
index c93e072..2e60f8f 100644 (file)
@@ -327,15 +327,6 @@ void UserDatabaseObject::setLdapId(const TCHAR *id)
    m_flags |= UF_MODIFIED;
 }
 
-/**
- * Disable user account because of sync exception
- */
-void UserDatabaseObject::setSyncException()
-{
-   m_flags |= UF_SYNC_EXCEPTION | UF_MODIFIED;
-   SendUserDBUpdate(USER_DB_MODIFY, m_id, this);
-}
-
 void UserDatabaseObject::removeSyncException()
 {
    if((m_flags & UF_SYNC_EXCEPTION)> 0)
@@ -542,8 +533,8 @@ bool User::saveToDatabase(DB_HANDLE hdb)
    DBBind(hStmt, 16, DB_SQLTYPE_INTEGER, (UINT32)m_lastLogin);
    DBBind(hStmt, 17, DB_SQLTYPE_VARCHAR, m_xmppId, DB_BIND_STATIC);
    DBBind(hStmt, 18, DB_SQLTYPE_TEXT, m_userDn, DB_BIND_STATIC);
-   DBBind(hStmt, 18, DB_SQLTYPE_TEXT, m_ldapId, DB_BIND_STATIC);
-   DBBind(hStmt, 19, DB_SQLTYPE_INTEGER, m_id);
+   DBBind(hStmt, 19, DB_SQLTYPE_TEXT, m_ldapId, DB_BIND_STATIC);
+   DBBind(hStmt, 20, DB_SQLTYPE_INTEGER, m_id);
 
    bool success = DBBegin(hdb);
        if (success)
@@ -821,8 +812,8 @@ bool Group::saveToDatabase(DB_HANDLE hdb)
    DBBind(hStmt, 4, DB_SQLTYPE_VARCHAR, m_description, DB_BIND_STATIC);
    DBBind(hStmt, 5, DB_SQLTYPE_VARCHAR, m_guid);
    DBBind(hStmt, 6, DB_SQLTYPE_TEXT, m_userDn, DB_BIND_STATIC);
-   DBBind(hStmt, 6, DB_SQLTYPE_TEXT, m_ldapId, DB_BIND_STATIC);
-   DBBind(hStmt, 7, DB_SQLTYPE_INTEGER, m_id);
+   DBBind(hStmt, 7, DB_SQLTYPE_TEXT, m_ldapId, DB_BIND_STATIC);
+   DBBind(hStmt, 8, DB_SQLTYPE_INTEGER, m_id);
 
    bool success = DBBegin(hdb);
        if (success)
@@ -918,7 +909,7 @@ bool Group::isMember(UINT32 userId)
                return true;
 
    // This is to avoid applying disabled group rights on enabled user
-   if ((m_flags & UF_SYNC_EXCEPTION) || (m_flags & UF_DISABLED))
+   if ((m_flags & UF_DISABLED))
       return false;
 
    return bsearch(&userId, m_members, m_memberCount, sizeof(UINT32), CompareUserId) != NULL;
index 723ec09..bf801f4 100644 (file)
@@ -222,14 +222,12 @@ public:
        bool isDisabled() const { return (m_flags & UF_DISABLED) ? true : false; }
        bool isModified() const { return (m_flags & UF_MODIFIED) ? true : false; }
        bool isLDAPUser() const { return (m_flags & UF_LDAP_USER) ? true : false; }
-       bool hasSyncException() const { return (m_flags & UF_SYNC_EXCEPTION) ? true : false; }
 
        void setDeleted() { m_flags |= UF_DELETED; }
        void enable();
        void disable();
        void setFlags(UINT32 flags) { m_flags = flags; }
        void removeSyncException();
-       void setSyncException();
 
        const TCHAR *getAttribute(const TCHAR *name) { return m_attributes.get(name); }
        UINT32 getAttributeAsULong(const TCHAR *name);
index de0ad3a..bd05df3 100644 (file)
@@ -669,7 +669,7 @@ static int NextFreeEPPruleID()
  */
 static BOOL H_UpgradeFromV400(int currVersion, int newVersion)
 {
-   CHK_EXEC(CreateEventTemplate(EVENT_LDAP_SYCN_ERROR, _T("SYS_LDAP_SYCN_ERROR"), SEVERITY_MAJOR, EF_LOG,
+   CHK_EXEC(CreateEventTemplate(EVENT_LDAP_SYNC_ERROR, _T("SYS_LDAP_SYNC_ERROR"), SEVERITY_MAJOR, EF_LOG,
       _T("%5"),
       _T("Generated when LDAP synchronization error occurs.\r\n")
       _T("Parameters:\r\n")
@@ -690,7 +690,7 @@ static BOOL H_UpgradeFromV400(int currVersion, int newVersion)
    TCHAR query[1024];
        _sntprintf(query, 1024, _T("INSERT INTO event_policy (rule_id,rule_guid,flags,comments,alarm_message,alarm_severity,alarm_key,script,alarm_timeout,alarm_timeout_event,situation_id,situation_instance) VALUES (%d,'417648af-5361-49a5-9471-6ef31e857b2d',7944,'Generate an alarm when error occurred while LDAP sync','%%m',5,'SYS_LDAP_SYCN_ERROR_%%1','',0,%d,0,'')"), ruleId, EVENT_ALARM_TIMEOUT);
    CHK_EXEC(SQLQuery(query));
-   _sntprintf(query, 1024, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_LDAP_SYCN_ERROR);
+   _sntprintf(query, 1024, _T("INSERT INTO policy_event_list (rule_id,event_code) VALUES (%d,%d)"), ruleId, EVENT_LDAP_SYNC_ERROR);
    CHK_EXEC(SQLQuery(query));
 
    CHK_EXEC(SQLQuery(_T("ALTER TABLE users ADD ldap_unique_id varchar(64)")));