python中mailbox类的clear方法实现不大恰当,不过貌似派生类可以调用父类的私有成员
[| 2010/09/27 17:16]
今天准备上线SuperMail,发现后台程序有两个问题,一个问题是相对路径问题,这个好解决,在程序中设置一下工作路径就可以了。还有一个就是权限问题。
背景:/var/spool/mail/a 这个是邮箱,权限为660,属于a用户,mail组
程序的运行者:b,mail组。
b用户把a邮箱中的邮件复制到临时文件中后,调用mailbox类的clear方法将a邮箱清空。结果a邮箱的权限变成775,拥有者b,所属组b。猜测clear是把a邮箱删除,重新建立了一下。粗看了下mailbox源码,貌似不是这样的,时间原因,没有细究。(疑点:将/var/spool/mail/的umask设置成0177后a邮箱还是变成775,不知为何)
当sendmail给a邮箱投递信件的时候,发现a邮箱所有者非a,于是chmod所有者为a,并将权限改成600(邮箱权限默认是660的),结果导致b用户无法读取a邮箱。
导致这个问题的根本原因是clear方法的实现不当,所以决定重载clear函数,改为使用truncate函数将文件截短为0。遇到另一问题:如何取得a邮箱文件描述符。因为程序逻辑是mbox(mailbox的派生类)将a邮箱加锁,复制内容,清空,解锁。复制内容后,清空前是不能解锁邮箱的。复制内容后是mbox的私有成员_file拥有a邮箱的锁,假如这个时候通过open获得a邮箱的一个描述符,是无法操作a邮箱的(无法获得锁),_file又不能释放锁。所以只能设法获得_file,用来截短文件。查了下,mailbox类中没有方法可以获得私有的_file。尝试在mailbox的派生类中调用self._file.truncate(0),居然成功了。。看来Python中派生类中是可以使用父类的私有成员的。不过这么实现感觉比较山寨。期待更好的方法。
背景:/var/spool/mail/a 这个是邮箱,权限为660,属于a用户,mail组
程序的运行者:b,mail组。
b用户把a邮箱中的邮件复制到临时文件中后,调用mailbox类的clear方法将a邮箱清空。结果a邮箱的权限变成775,拥有者b,所属组b。猜测clear是把a邮箱删除,重新建立了一下。粗看了下mailbox源码,貌似不是这样的,时间原因,没有细究。(疑点:将/var/spool/mail/的umask设置成0177后a邮箱还是变成775,不知为何)
当sendmail给a邮箱投递信件的时候,发现a邮箱所有者非a,于是chmod所有者为a,并将权限改成600(邮箱权限默认是660的),结果导致b用户无法读取a邮箱。
导致这个问题的根本原因是clear方法的实现不当,所以决定重载clear函数,改为使用truncate函数将文件截短为0。遇到另一问题:如何取得a邮箱文件描述符。因为程序逻辑是mbox(mailbox的派生类)将a邮箱加锁,复制内容,清空,解锁。复制内容后,清空前是不能解锁邮箱的。复制内容后是mbox的私有成员_file拥有a邮箱的锁,假如这个时候通过open获得a邮箱的一个描述符,是无法操作a邮箱的(无法获得锁),_file又不能释放锁。所以只能设法获得_file,用来截短文件。查了下,mailbox类中没有方法可以获得私有的_file。尝试在mailbox的派生类中调用self._file.truncate(0),居然成功了。。看来Python中派生类中是可以使用父类的私有成员的。不过这么实现感觉比较山寨。期待更好的方法。