본문 바로가기
IT 기술/컴퓨터관리 팁

Thunderbird 와 LDAP 연동

by 땅뚱 2010. 1. 5.

내가 다니는 회사에서 주소록을 위한 LDAP 서비스를 최근에 보안을 강화하면서 바꾸었는데, 기존에 thunderbird 에서 잘 동작하던 주소록이 바뀐 서버에 맞게 설정을 바꾸었음에도 불구하고 제대로 되지 않았다.

구체적으로 말하면 mail 주소로 검색하면 잘 되는데, 한글이름으로 검색을 하면 검색이 안되는 것이었다. 이상해서 유심히 잘 살펴보니 실제 이름에 해당하는 속성에는 한글이름을 기록해놓은 것이 아니고, email 주소의 앞쪽 부분을 기록해놔서 한글 사람이름으로는 검색이 되지 않았던 것이다. 실제 한글이름은 메모속성(notes) 부분에 기록해 놓았다.

그런데 아웃룩 에서는 동일한 설정만으로 한글이름이 검색이 되는 것이 아닌가. LDAP 검색 때문에 아웃룩으로 갈아타고 싶지 않았기 때문에 구글링을 해보았더니 동일한 문제는 아니지만 몇가지 힌트를 주는 사이트를 찾을 수 있었다.

1. LDAP 속성이 실제 주소록의 속성과 어떻게 매핑이 되는지에 대한 사이트
2. 자신이 사용하는 LDAP 에 맞게 튜닝한 방법을 설명한 사이트
3. LDAP 검색속도를 높여주는 썬더버드의 숨겨진 속성을 설명한 사이트
4. LDAP 주소록 기본 schema overriding 방법을 설명한 사이트


이러한 사이트를 참조해서 이리저리 테스트를 해보았다.

우선 설정을 편집하기 위해서는 썬더버드 설정 메뉴를 통해서 수정하는 방법과 직접 설정파일을 수정하는 방법이 있다.

설정메뉴를 사용하려면 썬더버드 도구->설정->고급->일반->설정편집을 클릭하면 썬더버드의 모든 설정을 검색/수정할 수 있는 창이 뜬다.

아니면 직접 파일을 편집할 수도 있다.
해당 profile 관련 파일은 2개가 존재하는데 global profile 을 설정하는 파일과 user defined profile 을 설정하는 파일이 그것이다. 각각의 위치는 다음과 같다. 단 파일을 직접 고칠 경우에는 반드시 썬더버드를 종료하고 수정해야 한다. 그렇지 않으면 썬더버드가 종료될 때 이전 값으로 다시 저장해버린다.

Global Profile : C:\Program Files\Mozilla Thunderbird\defaults\pref\mainews.js
User Defined Profile : C:\Documents and Settings\<id>\Application Data\Thunderbird\Profiles\{...}.default\prof.js


위 링크 1. 4 번을 참조하면 LDAP 속성들과 썬더버드 주소록 필드들이 어떻게 매핑되는지, 그리고 기존 매핑을 내가 원하는 방식으로 overriding 하는 방법을 설명하고 있다.

아래는 내 thunderbird 에서 수정한 설정값이다.

검색관련 설정값
mail.addr_book.quicksearchquery.format","?(or(PrimaryEmail,c,@V)(DisplayName,c,@V)(FirstName,c,@V)(LastName,c,@V))

'c' 는 contain 을 의미한다. 다른것을 의미하는 문자를 확인하기 위해서 nsAbQueryStringToExpression ::CreateBooleanConditionString 함수를 확인할 수 있다.

nsresult nsAbQueryStringToExpression::CreateBooleanConditionString (
     const char* attribute,

     const char* condition,
     const char* value,
     nsIAbBooleanConditionString** conditionString)
{
if (attribute == 0 || condition == 0 || value == 0)
return NS_ERROR_FAILURE;

nsAbBooleanConditionType c;

if (nsCRT::strcasecmp (condition, "=") == 0)

c = nsIAbBooleanConditionTypes::Is;
else if (nsCRT::strcasecmp (condition, "!=") == 0)
c = nsIAbBooleanConditionTypes::IsNot;
else if (nsCRT::strcasecmp (condition, "lt") == 0)
c = nsIAbBooleanConditionTypes::LessThan;
else if (nsCRT::strcasecmp (condition, "gt") == 0)
c = nsIAbBooleanConditionTypes::GreaterThan;
else if (nsCRT::strcasecmp (condition, "bw") == 0)
c = nsIAbBooleanConditionTypes::BeginsWith;
else if (nsCRT::strcasecmp (condition, "ew") == 0)
c = nsIAbBooleanConditionTypes::EndsWith;
else if (nsCRT::strcasecmp (condition, "c")== 0)
c = nsIAbBooleanConditionTypes::Contains;
else if (nsCRT::strcasecmp (condition, "!c") == 0)
c = nsIAbBooleanConditionTypes::DoesNotContain;
else if (nsCRT::strcasecmp (condition, "~=") == 0)
c = nsIAbBooleanConditionTypes::SoundsLike;
else if (nsCRT::strcasecmp (condition, "regex") == 0)
c = nsIAbBooleanConditionTypes::RegExp;
else
return NS_ERROR_FAILURE;
(생략)
}

즉 검색하려는 값이 반드시 일치하는 것만 찾으려고 하면 'c' 대신 '=' 를 사용하면 된다.

추가) ============================

아래 트랙백의 자동완성기능에 대한 설명과 동일함.


AutoComplate 이용하기: 

ldap의 Directory Server Properties 메뉴에서 General의 name, hostname, base dn, bind dn과 Advanced의 sub tree 를 설정합니다. search filter는 기본값으로 두어도 상관없습니다.


1. ldap_2.servers.LGAD.autoComplete.filterTemplate는 (|(|(|(|(mail=%v*)(cn=%v*))(sn=%v*))(givenName=%v*))(displayName=%v*)) 으로 outlook용 filter와 같게 설정합니다.

2. ldap_2.servers.LGAD.autoComplete.nameFormat를 [displayName] 로 설정합니다. displayName은 직급과 부서명이 포함된 이름입니다.