<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>좋은생각 - WebDAV category</title>
  <link>http://goodidea.blogsite.org/categories/webserver/webdav/</link>
  <description>크게 성공한 사람은 작은 성공을 계속하는 사람일 뿐이다. -- 크리스토퍼 몰리</description>
  <language>ko</language>
  <copyright>고진혁</copyright>
  <lastBuildDate>Wed, 10 Feb 2010 00:41:50 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>Sharepoint Client API 를 이용하여 WebDAV 문서를 온라인으로 열기</title>
    <link>http://goodidea.blogsite.org/2007/12/21/1198213898859.html</link>
    
      
        <description>
          Sharepoint Client API 를 이용하여 WebDAV 문서를 온라인으로 열기&lt;br /&gt;
&lt;br /&gt;
Java Website나 별도의 웹사이트에서 MOSS나 WSS 사이트가 아니어도  MOSS나 WSS의 문서를  간단하게 열수 있다.  &lt;br /&gt;
&lt;br /&gt;
이것은 MS-Office 를 설치할때 이미 관련 Sharepoint DLL 이 설치되어있어서 인데.. (구 버전의 오피스인 경우에는 MS 로 부터 Service Pack 업데이트를 하는것으로서 추가될수있다.)&lt;br /&gt;
&lt;br /&gt;
이렇게 Sharepoint Client 용 DLL 이 설치되어있다면 별도의 프로그램없이 간단히 오피스 파일을 바로 열어 편집 화면을 띄 울수 있다.&lt;br /&gt;
&lt;br /&gt;
아래는 예제 이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
============   예제소스 - 1)  javascript 를 통해 WSS 파일 열기&lt;tt&gt;            &lt;/tt&gt; ================&lt;br /&gt;
&lt;div&gt;
&lt;table width=&#034;100%&#034; cellspacing=&#034;0&#034; cellpadding=&#034;3&#034; border=&#034;0&#034; bgcolor=&#034;#000099&#034; id=&#034;vp9h&#034;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td width=&#034;100%&#034;&gt;&lt;font color=&#034;#cccccc&#034;&gt; function openSPDocument(docPath){&lt;br /&gt;
            &lt;br /&gt;
            docPath = &amp;quot;http://moss/PWA/somsite/DocLib1/RDS/abc기능설계서.doc&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            EditDocumentButton = new ActiveXObject(&amp;quot;SharePoint.OpenDocuments.1&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            if (EditDocumentButton)    {&lt;br /&gt;
            EditDocumentButton.EditDocument(docPath);   &lt;br /&gt;
            }   &lt;br /&gt;
            } &lt;/font&gt;&lt;br /&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
===========================================================&lt;br /&gt;
&lt;br /&gt;
위 경우는 WSS 서버에 붙는 경우지만 jakarta slide 같은 다른 WebDAV 서버에도 쉽게 적용은 가능하다 다만 WSS(MOSS) 서버가 아닌 경우  경고 문구(다분히 독점적인)가 뜬다.&lt;br /&gt;
        </description>
      
      
    
    
    
    <category>WebDAV</category>
    
    <comments>http://goodidea.blogsite.org/2007/12/21/1198213898859.html#comments</comments>
    <guid isPermaLink="true">http://goodidea.blogsite.org/2007/12/21/1198213898859.html</guid>
    <pubDate>Fri, 21 Dec 2007 05:11:38 GMT</pubDate>
  </item>
  
  <item>
    <title>Jakarta Slide 프로젝트를 이용해 Microsoft Sharepoint Server  연동 문제해결 하기 (</title>
    <link>http://goodidea.blogsite.org/2007/10/30/1193730749817.html</link>
    
      
        <description>
          &lt;font size=&#034;4&#034;&gt;&lt;strong&gt;  Jakarta Slide 프로젝트를 이용해 Microsoft Sharepoint Server (MOSS or WSS) 연동 문제해결 하기 (NTLM 문제등 ) &lt;/strong&gt;&lt;/font&gt;- v0.4   by Ko,jinhyuk&lt;br /&gt;
&lt;br /&gt;
WebDAV 가 나름 표준이기는 해도 늘 그렇듯 밴더마다 조금식 동작하는게 다르다 보니 이러저런 문제가 생기게 마련이다.&lt;br /&gt;
&lt;br /&gt;
이중에 Java 쪽에 많지 않은 솔루션쪽에  널리알려진게  Jakarta의 Slide WebDAV 프로젝트인데 (2004년 마지막 릴리즈 이후 변화없음)&lt;br /&gt;
Slide는 Subversion 에 WebDAV를 얹어서는 잘되던게  MOSS (Microsoft Office Sharepoint  Server )에서는 문제가 되는사항들이 좀 있었다. 관련해서 문제가 되었던것과 해결했던것들을&lt;br /&gt;
정리해보려고 한다.&lt;br /&gt;
&lt;br /&gt;
이하에서 &lt;strong&gt;&lt;em&gt;webdavResource &lt;/em&gt;&lt;/strong&gt;변수는 org.apache.webdav.lib.WebdavResource 의 인스턴스 이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size=&#034;3&#034;&gt;&lt;strong&gt;1)  isCollection() 의 문제&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;
특정 경로(url)이  directory 인지 여부를 판단할때 사용하게 되는데  문제는 MOSS에서는 파일인 경우에도 isCollection()를 true 로 리턴해버리는 바람에 디렉토리 구별을 할때 문제가 되었다. 이에 대한 대안으로  &lt;strong&gt;&lt;em&gt;webdavResource&lt;/em&gt;&lt;/strong&gt;.getSupportedLock()  을 이용해서 결과가 &amp;quot;Exclusive write lock&amp;quot;를 리턴하는 경우에는 파일이므로 (디렉토리에 lock를 걸수는 없으므로) 이를 이용하는 방법이 있었다.&lt;br /&gt;
그래서&lt;br /&gt;
&lt;em&gt;boolean isFile =!(webdavResource.isCollection() &amp;amp;&amp;amp; webdavResource.getSupportedLock().length()&amp;lt;1); &lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
와 같이 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;font size=&#034;3&#034;&gt;&lt;strong&gt; 2) NTLM (NT 도메인 인증 방식)연결을 하려면&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;
일단 최신의 HttpClient 라이브러리 버전을 사용하면 되는데 (Jakarta common library에 있다.  ) 여기에 NTLM 관련 scheme 및 NTCredentials 이 포함되어있다. &lt;br /&gt;
library 의  jar 경로에 commons-httpclient-3.1.jar 와 같은 최신버전 잡아주고 (아마 commons-codec-1.3.jar,commons-httpclient-contrib.jar 도 필요 할것이다.. 기억이 가물해서).&lt;br /&gt;
&lt;br /&gt;
다음처럼 소스에서 작업을 해주면 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;                    NTCredentials creds = new NTCredentials(userId, password,httpURL.getHost(),NTdomain );&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;                     HostConfiguration hostConfig = new HostConfiguration();&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;                     hostConfig.setHost(httpURL.getHost());&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;                     HttpURL host = new HttpURL(repositoryUrl);&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;                     host.setUserinfo(userId,password);&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;                     webdavResource = new WebdavResource(host, (Credentials)creds, WebdavResource.DEFAULT, DepthSupport.DEPTH_1);&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size=&#034;3&#034;&gt;&lt;strong&gt;3) putMethod 의 문제해결 &lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;
Slide 의 문제인데.   NTLM 을 이용한 사용자 인증을 하게 되는 경우 putMethod시 default Auth Scheme 로 Basic 을 사용하다보니 인증실패나고 다시 시도 할때 &lt;br /&gt;
&lt;br /&gt;
================================= 에러 스택 =====================================================&lt;br /&gt;
org.apache.commons.httpclient.ProtocolException: Unbuffered entity enclosing request can not be repeated.&lt;br /&gt;
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:487)&lt;br /&gt;
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)&lt;br /&gt;
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)&lt;br /&gt;
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)&lt;br /&gt;
... 이하 생략&lt;br /&gt;
===============================================================================================&lt;br /&gt;
위 에러가 발생한다.  이는 put 재시도 를 하면서 발생하는 문제인데 근본적으로 인증실패난 상태에서 put을 날리기 때문이다. slide 의 버그라고 봐야. 기본적으로 connect 하는 과정에서 이미 인증이 되었는데 이때 사용한 auth scheme 를 이용하지 않고 putMethod에서 다시 인증 방식을 새로이 (Basic)하면서 생긴문제다. 여러가지 해결 방안이있겠지만 &lt;br /&gt;
&lt;br /&gt;
org.apache.commons.httpclient.auth.AuthState 가 default auth scheme 로  내부변수 PREEMPTIVE_AUTH_SCHEME 에 basic를 박아놓아서... 항상 basic 이 기본이 되는걸...&lt;br /&gt;
특정 scheme 가 default로 되도록 고쳐서 적용하려고 한다.  방법은 여러가지가 있겠으나 환경변수로서 NTLM 이나 basic등을 지정하게 하는방법도 있을듯한데&lt;br /&gt;
&lt;br /&gt;
우선 테스트삼아.. &lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;    /**&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;     * Preemptively assigns Basic authentication scheme.&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;     */&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;    public void setPreemptive() {&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;        if (!this.preemptive) {&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;            if (this.authScheme != null) {&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;                throw new IllegalStateException(&amp;quot;Authentication state already initialized&amp;quot;);&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;            }&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;        //    this.authScheme = AuthPolicy.getAuthScheme(PREEMPTIVE_AUTH_SCHEME);&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;         this.authScheme = AuthPolicy.getAuthScheme(&amp;quot;NTLM&amp;quot;);&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;            this.preemptive = true;&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;        }&lt;/em&gt;&lt;br style=&#034;font-style: italic;&#034; /&gt;
&lt;em&gt;    }&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
위에// 처리한게 원래 이고 아래줄에  this.authScheme = AuthPolicy.getAuthScheme(&amp;quot;NTLM&amp;quot;); 는 일단 동작여부확인을 위해 박아넣은것인데... 예상대로 전송이 안되던게 바로 해결이되었다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size=&#034;3&#034;&gt;&lt;strong&gt;3) getIsHidden()  의 문제해결    - &lt;/strong&gt;&lt;font size=&#034;2&#034;&gt;2007.12.13일 추가&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;   MS WSS 의 경우 DAV Resource(디렉토리나 파일)의 Property 전달과정에서 표준을 지키지 않는 문제가 있다... 뭐 나름 속사정이 있겠지만 . 적어도 표준을 포함하면서 확장하면 모르겠는데 Hidden 디렉토리나 파일에 대한 속석을 slide의 getIsCollection()으로 구하는 경우 false 로 떨어지는 문제가있다.  이것은 &lt;br /&gt;
보통 Response  XML에서 &lt;strong&gt;&lt;d:ishidden&gt;0&lt;/d:ishidden&gt;  &lt;/strong&gt;를 이용하여 속성값을 구하는데 반해 MS의 그것은 Hidden 속성이있는 경우 &lt;z:win32fileattributes&gt;00000002&lt;/z:win32fileattributes&gt; 처럼 임의 확장 Property 를 추가하고 비트 mask 정보를 이용하여 얻을수있도록하는 (전통적인 MS 방식)것으로 값을 전달하고 있었다. 그래서 이것을 얻어내서 내부적으로 16진수 변환하여 숫자 &#039;2&#039;값과 AND 비트연산을 해봐야 하는것이다. &lt;br /&gt;
&lt;br /&gt;
다음과같이 처리를 했다. &lt;br /&gt;
&lt;br /&gt;
============   소스 - 1)   &lt;tt&gt;  &lt;strong&gt;&lt;em&gt;WebDavResource.java &lt;/em&gt;&lt;/strong&gt;     &lt;/tt&gt; ================&lt;br /&gt;
&lt;div&gt;
&lt;table width=&#034;100%&#034; cellspacing=&#034;0&#034; cellpadding=&#034;3&#034; border=&#034;0&#034; bgcolor=&#034;#000099&#034; id=&#034;vp9h&#034;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td width=&#034;100%&#034;&gt;&lt;font color=&#034;#cccccc&#034;&gt;    public static final String WIN32_ATTRIBUTES=&amp;quot;Win32FileAttributes&amp;quot;;&lt;br /&gt;
            ......&lt;br /&gt;
            ......&lt;br /&gt;
            protected void processProperty(Property property) {&lt;br /&gt;
            ... 중략 ...&lt;br /&gt;
            &lt;br /&gt;
            // MS WSS (Win32 WebDAV) 서버인경우 처리를 위하여  &lt;br /&gt;
            else if (property.getLocalName().equals(WIN32_ATTRIBUTES)){&lt;br /&gt;
            &lt;br /&gt;
            if(_logger.isDebugEnabled()){&lt;br /&gt;
            _logger.debug(&amp;quot;set property about Win32 Attributes&amp;quot;);&lt;br /&gt;
            &lt;br /&gt;
            }&lt;br /&gt;
            /**&lt;br /&gt;
            * 1: ReadyOnly, 2:Hidden &lt;br /&gt;
            * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/createfile.asp&lt;br /&gt;
            * http://www.nlog-project.org/help/NLog.Internal.Win32.Win32FileAttributes.html&lt;br /&gt;
            * &lt;br /&gt;
            *  MS의 WSS인경우에는 isHidden 대신 WIN32_ATTRIBUTES 로 속성을 전달하는경우가 있으므로&lt;br /&gt;
            *  &lt;br /&gt;
            *    HEX 값으로 변형하여 2 값이 set되어있는 경우 &lt;br /&gt;
            */&lt;br /&gt;
            &lt;br /&gt;
            if((Integer.parseInt(property.getPropertyAsString(),16) &amp;amp; 2)==2){&lt;br /&gt;
            this.setIsHidden(true);&lt;br /&gt;
            }&lt;br /&gt;
            }&lt;/font&gt;&lt;br /&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
===========================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        </description>
      
      
    
    
    
    <category>WebDAV</category>
    
    <comments>http://goodidea.blogsite.org/2007/10/30/1193730749817.html#comments</comments>
    <guid isPermaLink="true">http://goodidea.blogsite.org/2007/10/30/1193730749817.html</guid>
    <pubDate>Tue, 30 Oct 2007 07:52:29 GMT</pubDate>
  </item>
  
  <item>
    <title>간단하게 Apache2 에 WebDAV 설치하기</title>
    <link>http://goodidea.blogsite.org/2007/08/14/1187078854064.html</link>
    
      
        <description>
          &lt;p&gt;간단하게 Apache2 에 WebDAV 설치하기&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;기본적으로 Apache2 에서 제공하는 mod_dav, mod_dav_fs를 이용하여 특정디렉토리를&lt;/p&gt;
&lt;p&gt;WebDAV로 접속할  수 있도록 간단하게 설정하는 방법&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;================= httpd.conf ================&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;# 먼저 관련 모듈을 포함하고 있어야 하고 &lt;/p&gt;
&lt;p&gt;LoadModule dav_module modules/mod_dav.so&lt;br /&gt;
LoadModule dav_fs_module modules/mod_dav_fs.so&lt;br /&gt;
...&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Alias /jhko /export/home/kildong&lt;/p&gt;
&lt;p&gt;DAVLockDB   /var/lock/DAV/DAVLock&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;location jhko=&#034;&#034;&gt;&lt;br /&gt;
DAV On&lt;/location&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;==========================================&lt;/p&gt;
&lt;p&gt;일단 위처럼만 한뒤에  서버ip 가 168.126.63.100 이라고 하는 경우 IE 에서 바로 웹폴더열기(Ctrl+O)로&lt;/p&gt;
&lt;p&gt;열어 작업할수있게 된다.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;여기서 중요한거  /var/lock/DAV/DAVLock 파일접근하는게 권한이 없는경우 파일저장을 할 수 없게되는&lt;/p&gt;
&lt;p&gt;문제가 생긴다. (DAVLockDB  줄이 빠지면.. 목록 못 보네..^^;)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
        </description>
      
      
    
    
    
    <category>아파치</category>
    
    <category>WebDAV</category>
    
    <comments>http://goodidea.blogsite.org/2007/08/14/1187078854064.html#comments</comments>
    <guid isPermaLink="true">http://goodidea.blogsite.org/2007/08/14/1187078854064.html</guid>
    <pubDate>Tue, 14 Aug 2007 08:07:34 GMT</pubDate>
  </item>
  
  </channel>
</rss>
