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 和 SetSecurityDescriptorSacl,把ACL设置到SD中。
- 使用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函数结束