sublime text下加密文本文档

sublime text下加密文本文档

在编写笔记等,有些文档需要加密保存,实现一个简单的加密解密功能插件。

功能大致流程为sublime插件调用openssl。

python调用外部命令的函数如下:

class BaseCommand(object):
    def run_command(self, cmd):
        cwd = os.path.dirname(self.view.file_name())
        print("cmd %r" % cmd)
        proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd, env=os.environ)

        try:
            outs, errs = proc.communicate(timeout=15)
            print("outs %r %r" % (outs, proc))
        except Exception:
            proc.kill()
            outs, errs = proc.communicate()
        print("outs %r, errs %r" % (b'\n'.join(outs.split(b'\r\n')), errs))
        if errs is None or len(errs) == 0:
            return outs.decode()
        return errs

openssl命令的组装函数如下:

class BaseCommand(object):
    def get_enccmd(self, filename):
        cmd_tmpl = 'openssl enc -e -aes-256-cbc -base64 -k "%s" -in "%s" -out "%s.enc"'

        if filename is None or len(filename) == 0:
            return 
        _, key = os.path.split(filename)

        cmd = cmd_tmpl % (key, filename, filename)
        return cmd

    def get_deccmd(self, filename):
        cmd_tmpl = 'openssl enc -d -aes-256-cbc -base64 -k "%s" -in "%s.enc" -out "%s.out"'

        if filename is None or len(filename) == 0:
            return 

        if len(filename) > 4 and filename.endswith('.enc'):
            filename = filename[:-4]

        _, key = os.path.split(filename)

        cmd = cmd_tmpl % (key, filename, filename)
        return cmd

主要功能点

  • 加密文档后,先自动解密,把解密后的文档和原文档对比,如果对比一致,自动删除源文档。
  • 解密文档后,自动打开文档内容。
    实现代码如下:

class EncCommand(BaseCommand, sublime_plugin.WindowCommand):
    def run(self):
        '''
        加密当前view的文件,并且解密文件,和源文件对比;如果对比一致,删除当前文件,保留加密后的文件
        '''
        v = self.window.active_view()
        self.view = v
        fn = v.file_name()
        if fn.endswith(".enc"):
            return
        cmd = self.get_enccmd(fn)
        cmd_dec = self.get_deccmd(fn)
        print("enc cmd: %s" % cmd)
        ret = self.run_command(cmd)
        if ret is None or len(ret) == 0:
            ret2 = self.run_command(cmd_dec)
            if ret2 is None or len(ret2) == 0:
                if filecmp.cmp(fn, "%s.out" % fn):
                    print("enc success")
                    os.remove(fn)
                    os.remove("%s.out" % fn)
                    return 
        sublime.error_message("%s %s" % (ret, ret2))


class DecCommand(BaseCommand, sublime_plugin.WindowCommand):
    def run(self):
        '''
            解密文件,解密后重命名filename.out为filename
        '''
        v = self.window.active_view()
        self.view = v
        fn = v.file_name()
        cmd = self.get_deccmd(fn)
        print("dec cmd: %s" % cmd)
        ret = self.run_command(cmd)
        print("ret %r" % ret)
        if ret is None or len(ret) == 0:
            if len(fn) > 4 and fn.endswith(".enc"):
                fn2 = fn[:-4]
                os.rename("%s.out"%fn2, fn2)
                self.window.open_file(fn2)
            return

        sublime.error_message("%s" % ret)

实现后放到User目录下,绑定按键,就可以快捷的加密自己的文档了。

猜你喜欢

转载自blog.csdn.net/robin912/article/details/81673684