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目录下,绑定按键,就可以快捷的加密自己的文档了。