1. 程式人生 > >SVN二次開發——讓SVN、TSVN(TortoiseSVN)支援windows的訪問控制模型、NTFS ADS (可選資料流、NTFS的安全屬性)

SVN二次開發——讓SVN、TSVN(TortoiseSVN)支援windows的訪問控制模型、NTFS ADS (可選資料流、NTFS的安全屬性)

SVN二次開發

——讓SVN、TSVN(TortoiseSVN)支援windows的訪問控制模型、NTFS ADS

(可選資料流、NTFS的安全屬性)

不知為什麼。原來很好的格式,也有圖,也完整,現在全亂了,前面還缺東少西的,等有時間了再整理。

可以先參閱這個連結,這個格式不亂也有圖:

http://www.cnblogs.com/LiuKaiFa/p/svn-ntfs.html

  


windows的檔案、目錄的安全描述符SD儲存在NTFS檔案系統的擴充套件屬性中,對於FAT檔案系統因為不支援擴充套件屬性,所以不能進行安全控制。如果你的作業系統是NTFS,那麼,你可以看到你創建出來的檔案的安全屬性的樣子。

SVN> 

二、windows安全屬性API

  檔案和目錄的的安全屬性不能直接操作,但可以通過微軟提供的API函式進行讀寫,這些API函式有:

  1. AddAccessDeniedAce,加入一個Access-Denied 的ACE。
  2. DeleteAce,刪除一個ACE。
  3. IsValidAcl,檢查你所設定的ACL是否合法。
  4. IsValidSecurityDescriptor,檢查SD的合法性。
  5. MakeAbsoluteSDMakeSelfRelativeSD,兩個函式可以在兩種SD的格式中進行轉換。
  6. SetSecurityDescriptorDacl
    SetSecurityDescriptorSacl,把ACL設定到SD中。
  7. 使用GetSecurityDescriptorDacl>  SVN,即Subversion,是一個自由開源的版本控制系統,可以將資料恢復到早期版本,或者檢查資料修改的歷史,這些資料可以是包括原始碼在內的任何其他型別的檔案。

      Subversion 是一個自由/開源的版本控制系統。也就是說,在 Subversion 管理下,檔案和目錄可以超越時空。也就是 Subversion 允許你資料恢復到早期版本,或者是檢查資料修改的歷史。正因為如此,許多人將版本控制系統當作一種神奇的“時間機器”。

      SVN確實可以像一個時間機器一樣,回到任意時刻的版本,檢視任意兩個時刻的版本變動,不止在協同開發中,即使在個人開發過程中,這種特性都是非常非常有用的,我曾經有過這種經歷,對程式碼進行很多的修改,發現修改的想法根本是錯誤的,而這時我已經修改了多個檔案,要想回退是非常糾結的事情,而現在可以使用SVN輕鬆做到這一點。

      某些版本控制系統本身也是軟體配置管理(SCM)系統,這種系統經過精巧的設計,專門用來管理原始碼樹,並且具備許多與軟體開發有關的特性—比如,對程式語言的支援,或者提供程式構建工具。不過  Subversion 並不是這樣的系統。它是一個通用系統,可以管理任何型別的檔案集。對你來說,這些檔案這可能是源程式,而對別人,則可能是一個貨物清單或者是數字電影。

      SVN總體架構如下圖所示,圖中的一端是儲存所有版本資料的  Subversion 版本庫,另一端是Subvesion 的客戶程式,管理著所有版本資料的本地影射(稱為“工作副本”),在這兩極之間是各種各樣的版本庫訪問(RA)層,某些使用電腦網路通過網路伺服器訪問版本庫,某些則繞過網路伺服器直接訪問版本庫。

      DAV是Apache HTTP伺服器的一個外掛,使版本庫可以通過網路訪問。DAV的意思是“Distributed Authoring>  

    三、subversion二次開發總體方案圖

      在訪問層客戶端一側增加NTFS安全屬性的讀出、設定、傳送、接收模組,在客戶端執行import、export、checkout、update、commit等命令時,訪問層通過新增的模組讀出或設定相應檔案或資料夾的NTFS的安全屬性。

      在版本庫層增加NTFS安全屬性(NTFS附加屬性)的傳送、接收、儲存模組,完成客戶端傳輸過來的相應檔案、資料夾的NTFS安全屬性的儲存工作,或把相應的功能直接嵌入原來的相應的功能模組。

      支援NTFS安全屬性的SVN二次開發總體方案圖:

     

    四、原始碼分析:

      開發過程中形成了數百頁的原始碼分析資料,這裡只做簡單的介紹,展現一個思路,有需要詳細資料的網友可和我們聯絡,QQ:1561724180

    1、總體概念

      編輯器(Editor):                                              >“commit”commit()>add_file,處理add_file編輯命令使用該函式svn_ra_svn_drive_editor >add_file,見上面對svn_repos_get_commit_editor的呼叫  ↓add_file libsvn_repos\commit.c(constchar *path,void *parent_baton,const char *copy_path, >""為當前目錄。svn_client_import3(...,path,...) >>> window_handler  ↓ ↓ ↓      svn_stream_open_readonly libsvn_subr\stream.c  ↓ ↓  ↓ 開啟要傳送的檔案          svn_txdelta_send_stream libsvn_delta\text_delta.c  ↓ ↓ ↓              svn_txdelta_send_txstream    libsvn_delta\text_delta.c  ↓ ↓ ↓ (*handler)(window,> ra_svn_close_file  ↓ ↓ ra_svn_close_file libsvn_ra_svn\editorp.c  ↓ ↓ svn_ra_svn_write_cmd(b->conn, pool,"close-file","c(?c)", b->token, text_checksum);  ↓ 祥見“命令的傳送”  ↓editor->close_edit(edit_baton, pool)  ↓ra_svn_close_edit libsvn_ra_svn\editorp.c  ↓svn_ra_svn_write_cmd libsvn_ra_svn\marshal.c  ↓ 見“傳送一個命令”svn_ra_svn_read_cmd_response    libsvn_ra_svn\marshal.c  ↓ ↓讀命令的迴應         svn_ra_svn_read_tuple  libsvn_ra_svn\marshal.c  ↓ ↓         svn_ra_svn_read_item libsvn_ra_svn\marshal.c  ↓eb->callback(eb->callback_baton)(svn_error_t*ra_svn_end_commit)   libsvn_ra_svn\client.c  ↓import函式結束