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. SetSecurityDescriptorDaclSetSecurityDescriptorSacl,把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函数结束


猜你喜欢

转载自blog.csdn.net/zzkjliu/article/details/17489547