import com.deepnet.das.exception.DasParameterErrorException
import com.deepnet.das.user.User
import com.deepnet.das.user.LdapUser
import com.deepnet.das.domain.*
import java.util.Date
import com.deepnet.das.util.*
import com.unboundid.ldap.sdk.*
import com.deepnet.das.identitysource.*
import com.deepnet.das.token.TokenAssignment
def result, failed = false
def errMsg = ""
def list = getDomains(domainName)
int count = 0;
int total = 0;
def content = ""
def f = createDIRAndFile()
f.append('"Name", "Login name", "Domain name"\r\n')
for (def domain : list) {
try {
Iterator itr = createIteratorForDisabledUser(domain, unitName, groupName)
onProgress(0, "Preparing...")
def usersToQuery = new ArrayList(100)
def idsToUpdate = new ArrayList(100)
while (itr.hasNext()) {
def user = itr.next()
total++
usersToQuery << user
// query usres in 100 per batch
if(usersToQuery.size()>=100){
def users = batchQueryUsers(usersToQuery)
idsToUpdate.addAll(users*.userID)
count += users.size()
outputToCSV(users, f)
usersToQuery.clear()
}
if(idsToUpdate.size()>=100){
LdapUser.executeUpdate("update LdapUser user set user.status='DISABLED' where user.userID in :list and user.domain.id=:domainId", [list:idsToUpdate, domainId:domain.id])
idsToUpdate.clear()
LdapUser.withSession { it.clear() }
}
//println("Users updated: " + count + "/" + total)
onProgress(count, "Users updated: " + count + "/" + total)
}
// query left over users
if(usersToQuery.size()>0){
def users = batchQueryUsers(usersToQuery)
idsToUpdate.addAll(users*.userID)
count += users.size()
outputToCSV(users, f)
usersToQuery.clear()
}
// update left over users
if(idsToUpdate.size()>0){
LdapUser.executeUpdate("update LdapUser user set user.status='DISABLED' where user.userID in :list and user.domain.id=:domainId", [list:idsToUpdate, domainId:domain.id])
idsToUpdate.clear()
LdapUser.withSession { it.clear() }
}
} catch(Exception e) {
errMsg += e.message + ", "
}
}
def msg = "Disabled: " + count + '/' + total + " users. "
if (errMsg)
msg += "Errors: ${errMsg}"
setEndMessage(msg)
def outputToCSV(def users, def f){
users.each{
//println 'updated: ' + it.status + ' ' + it.dn + ' ' + it.fullName
f.append("\"${it.fullName}\", \"${it.loginName}\", \"${it.domain.name}\"\r\n")
}
}
def batchQueryUsers(def usersToQuery){
def idsNotDisabled = LdapUser.executeQuery("select userID from LdapUser user where user.userID in :list and user.status != 'DISABLED'", [list:usersToQuery*.userID])
return idsNotDisabled ? usersToQuery.findAll{ it.userID in idsNotDisabled } : []
}
def batchQueryUsersWithSideEffect(def usersToQuery, def idsToUpdate, def count, def f){
def idsNotDisabled = LdapUser.executeQuery("select userID from LdapUser user where user.userID in :list and user.status != 'DISABLED'", [list:usersToQuery*.userID])
if(idsNotDisabled.size() > 0){
idsToUpdate.addAll(idsNotDisabled)
count += idsNotDisabled.size()
usersToQuery.findAll{ it.userID in idsNotDisabled }.each{
//println 'updated: ' + it.status + ' ' + it.dn
f.append("\"${it.fullName}\", \"${it.loginName}\", \"${it.domain.name}\"\r\n")
}
}
}
def getDomains(def domainName) {
def list = Domain.list().findAll{it.identitySource.type == IdentitySourceType.LDAP }
if (domainName && list) {
list = list.findAll {
it.name == domainName
}
}
return list
}
def createDIRAndFile() {
def exportFolder = ConfigLoader.getProperty('dual/export/directory')
def sep = System.getProperty('file.separator')
if(!exportFolder){
def catalinaBase = System.properties.getProperty('catalina.base')
exportFolder = catalinaBase.substring(0, catalinaBase.lastIndexOf(sep)) + sep + 'export'
}
def dir = new File(exportFolder)
if(!dir.exists()){
dir.mkdir()
}
return new File(exportFolder + sep + "Disabled-Users-" + new Date().format( 'ddMMyy-HHmmss' ).toString() + ".csv")
}
Iterator createIteratorForDisabledUser(def domain, def unitName = null, def groupName = null) {
def ids = domain.identitySource
return ids.queryLdapUsersLiterally(getBaseDN(ids, unitName), searchLdap(ids, groupName), domain, null, false, 100)
}
Filter searchLdap(def ids, def groupName = null) {
def list = []
Filter f1 = Filter.createExtensibleMatchFilter("userAccountControl", "1.2.840.113556.1.4.803", false, "2")
list << f1
if (groupName) {
Filter f2 = Filter.createExtensibleMatchFilter(ids.memberOfAttribute, "1.2.840.113556.1.4.1941", false, getGroupBaseDN(ids, groupName))
list << f2
}
return Filter.createANDFilter(list)
}
def getGroupBaseDN(def ids, def groupName) {
if (!groupName) return null
def match = [["name", "=", groupName]]
def ele = ids.queryGroups(match, null)
if (!ele || !ele.rows) return null
if (ele.rows.size() > 1)
throw new DasParameterErrorException("Multiple groups found")
return ele.rows[0].dn
}
def getBaseDN(def ids, def unitName) {
if (!unitName) return null
def match = [["name", "=", unitName]]
def ele = ids.queryOUs("", match, false, [:])
if (!ele || !ele.rows) return null
if (ele.rows.size() > 1)
throw new DasParameterErrorException("Multiple units found")
return ele.rows[0].dn
}