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函式有:
- AddAccessDeniedAce,加入一個Access-Denied 的ACE。
- DeleteAce,刪除一個ACE。
- IsValidAcl,檢查你所設定的ACL是否合法。
- IsValidSecurityDescriptor,檢查SD的合法性。
- MakeAbsoluteSD和MakeSelfRelativeSD,兩個函式可以在兩種SD的格式中進行轉換。
- SetSecurityDescriptorDacl
- 使用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函式結束