From b11a5dd26581b52de69eede10bf464c1ca38262d Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Tue, 11 Oct 2016 13:47:30 +0000
Subject: [PATCH] added rest web service functionality for adding/modifying
 users

---
 .../cli/updateUsersFromApsDbCli.py            | 87 +++++++++++++++++++
 src/python/dm/common/utility/encoder.py       |  4 +
 .../dm/ds_web_service/api/userRestApi.py      |  2 +-
 .../service/userInfoSessionController.py      |  2 +
 4 files changed, 94 insertions(+), 1 deletion(-)
 create mode 100755 src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py

diff --git a/src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py b/src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py
new file mode 100755
index 00000000..7b99e8c3
--- /dev/null
+++ b/src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+
+from dm.common.exceptions.invalidRequest import InvalidRequest
+from dm.common.cli.dmCli import DmCli
+from dm.common.utility.configurationManager import ConfigurationManager
+from dm.common.utility.ldapUserManager import LdapUserManager
+from dm.aps_user_db.api.apsUserDbApi import ApsUserDbApi
+from dm.ds_web_service.api.dsRestApiFactory import DsRestApiFactory
+
+class UpdateUsersFromApsDbCli(DmCli):
+    def __init__(self):
+        DmCli.__init__(self)
+
+    def runCommand(self):
+        self.parseArgs(usage="""
+    dm-update-users-from-aps-db 
+
+Description:
+    Updates all users in DM LDAP and database using information from APS DB. 
+        """)
+        ConfigurationManager.getInstance().setConfigFile('/home/oxygen/SVESELI/Work/DM/etc/dm.conf')
+        print ConfigurationManager.getInstance().getConfigOption('DsRestApiFactory', 'username')
+        apsUserDbApi = ApsUserDbApi()
+        userRestApi = DsRestApiFactory.getUserRestApi()
+
+
+        apsUsers = apsUserDbApi.getApsUsers()
+        self.logger.debug('Number of APS Users: %s' % len(apsUsers))
+        dmUsers = userRestApi.getUsers()
+        self.logger.debug('Number of DM Users: %s' % len(dmUsers))
+        dmUserBadgeMap = {}
+        for dmUser in dmUsers:
+            badge = dmUser.get('badge')
+            if badge: 
+                dmUserBadgeMap[badge] = dmUser
+        self.logger.debug('Number of DM Users with badge: %s' % len(dmUserBadgeMap))
+
+        nCreatedUsers = 0
+        nUpdatedUsers = 0
+        for apsUser in apsUsers:
+            apsLastChangeDate = apsUser.get('lastChangeDate')
+
+            badge = apsUser['badgeNumber']
+            username = 'd%s' % badge
+            firstName = apsUser.get('firstName')
+            middleName = apsUser.get('middleName')
+            lastName = apsUser.get('lastName')
+            email = apsUser.get('email')
+            isLocalUser = 0
+            lastUpdate = str(apsLastChangeDate)
+            globusUsername = None
+            description = None
+            password = None
+
+            dmUser = dmUserBadgeMap.get(badge)
+            if not dmUser:
+                self.logger.debug('Creating user with badge %s: %s' % (badge, apsUser['name']))
+
+                userRestApi.addUser(username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate)
+                nCreatedUsers += 1
+            else:
+                dmLastUpdate = dmUser.get('lastUpdate')
+                if not dmLastUpdate or dmLastUpdate < apsLastChangeDate:
+                    id = dmUser.get('id')
+                    self.logger.debug('Modifying user with badge %s: %s (DM id: %s)' % (badge, apsUser['name'], id))
+                    userRestApi.updateUser(id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate)
+                    nUpdatedUsers += 1
+                else:
+                    # User is up to date
+                    pass
+           
+
+        #ldapUserManager = LdapUserManager('ldaps://dmid-vm.xray.aps.anl.gov:636', 'uid=dmadmin,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', '/tmp/ldapPassword', userDnFormat='uid=%s,ou=DM,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', groupDnFormat='cn=%s,ou=DM,ou=Group,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', minGidNumber=66000)
+        #ldapUser = ldapUserManager.getUserInfo(username)
+        #print 'Old LDAP User Info: ', ldapUser
+        #attrDict = {}
+        #attrDict['gecos'] = apsUser['name']
+        #attrDict['userPassword'] = apsUser['passwordHashValue']
+        #ldapUserManager.modifyUserInfo(username, attrDict)
+        #ldapUser = ldapUserManager.getUserInfo(username)
+        #print 'New LDAP User Info: ', ldapUser
+
+#######################################################################
+# Run command.
+if __name__ == '__main__':
+    cli = UpdateUsersFromApsDbCli()
+    cli.run()
diff --git a/src/python/dm/common/utility/encoder.py b/src/python/dm/common/utility/encoder.py
index b4d0e9ec..f88f5623 100755
--- a/src/python/dm/common/utility/encoder.py
+++ b/src/python/dm/common/utility/encoder.py
@@ -8,11 +8,15 @@ class Encoder:
     def encode(cls, data):
         # Encode twice, in order to avoid issues like '+' being
         # interpreted as space after decoding
+        if not data:
+            return data
         encodedData = base64.b64encode(base64.encodestring('%s' % data))
         return encodedData
 
     @classmethod
     def decode(cls, encodedData):
+        if not encodedData:
+            return encodedData
         data = base64.decodestring(base64.b64decode('%s' % encodedData))
         return data
 
diff --git a/src/python/dm/ds_web_service/api/userRestApi.py b/src/python/dm/ds_web_service/api/userRestApi.py
index 3ed80831..4a7946d9 100755
--- a/src/python/dm/ds_web_service/api/userRestApi.py
+++ b/src/python/dm/ds_web_service/api/userRestApi.py
@@ -64,7 +64,7 @@ class UserRestApi(DsRestApi):
         if isLocalUser:
             url += '&isLocaUser=%s' % isLocalUser
         if lastUpdate:
-            url += '&lastUpdate=%s' % lastUpdate
+            url += '&lastUpdate=%s' % Encoder.encode(str(lastUpdate))
         responseData = self.sendSessionRequest(url=url, method='POST')
         return UserInfo(responseData)
 
diff --git a/src/python/dm/ds_web_service/service/userInfoSessionController.py b/src/python/dm/ds_web_service/service/userInfoSessionController.py
index 52756f87..d72fd637 100755
--- a/src/python/dm/ds_web_service/service/userInfoSessionController.py
+++ b/src/python/dm/ds_web_service/service/userInfoSessionController.py
@@ -1,6 +1,8 @@
 #!/usr/bin/env python
 
 import cherrypy
+
+from dm.common.utility.encoder import Encoder
 from dm.common.service.dmSessionController import DmSessionController
 from dm.ds_web_service.service.impl.userInfoSessionControllerImpl import UserInfoSessionControllerImpl
 
-- 
GitLab