done editing
This commit is contained in:
parent
062dd46c27
commit
3138702abf
@ -1,7 +1,6 @@
|
|||||||
import io
|
import io
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import subprocess
|
|
||||||
import logging
|
import logging
|
||||||
_logger = logging.getLogger()
|
_logger = logging.getLogger()
|
||||||
##
|
##
|
||||||
|
@ -14,6 +14,7 @@ from . import auth
|
|||||||
from . import clipboard
|
from . import clipboard
|
||||||
from . import config
|
from . import config
|
||||||
from . import constants
|
from . import constants
|
||||||
|
from . import editor
|
||||||
from . import gpg_handler
|
from . import gpg_handler
|
||||||
from . import mounts
|
from . import mounts
|
||||||
from . import pass_import
|
from . import pass_import
|
||||||
@ -150,7 +151,6 @@ class VaultPass(object):
|
|||||||
if not data:
|
if not data:
|
||||||
_logger.error('No secret found')
|
_logger.error('No secret found')
|
||||||
_logger.debug('The secret at path {0} on mount {1} does not exist.'.format(oldpath, mount))
|
_logger.debug('The secret at path {0} on mount {1} does not exist.'.format(oldpath, mount))
|
||||||
# TODO: left off here
|
|
||||||
newexists = self._pathExists(newpath, mount = newmount)
|
newexists = self._pathExists(newpath, mount = newmount)
|
||||||
if newexists and not force:
|
if newexists and not force:
|
||||||
_logger.debug('The newpath {0}:{1} exists; prompting for confirmation.'.format(newmount, newpath))
|
_logger.debug('The newpath {0}:{1} exists; prompting for confirmation.'.format(newmount, newpath))
|
||||||
@ -230,8 +230,13 @@ class VaultPass(object):
|
|||||||
self.removeSecretName(kname, path, mount, force = force, destroy = destroy)
|
self.removeSecretName(kname, path, mount, force = force, destroy = destroy)
|
||||||
return(handler(**args))
|
return(handler(**args))
|
||||||
|
|
||||||
def editSecret(self, path, mount, editor = constants.EDITOR, *args, **kwargs):
|
def editSecret(self, path, mount, editor_prog = constants.EDITOR, *args, **kwargs):
|
||||||
pass # TODO
|
data = self.getSecret(path, mount)
|
||||||
|
newdata, fpath = editor.Editor(data, editor = editor_prog)
|
||||||
|
print('Done. Deleting generated file.')
|
||||||
|
os.remove(fpath)
|
||||||
|
self.createSecret(newdata, path, mount, force = True)
|
||||||
|
return(newdata)
|
||||||
|
|
||||||
def generateSecret(self,
|
def generateSecret(self,
|
||||||
path,
|
path,
|
||||||
|
37
vaultpass/editor.py
Normal file
37
vaultpass/editor.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
_logger = logging.getLogger()
|
||||||
|
##
|
||||||
|
from . import constants
|
||||||
|
|
||||||
|
|
||||||
|
def Editor(data, editor = constants.EDITOR, *args, **kwargs):
|
||||||
|
if isinstance(data, dict):
|
||||||
|
data = json.dumps(dict, indent = 4)
|
||||||
|
if not isinstance(data, str):
|
||||||
|
data = str(data)
|
||||||
|
_logger.debug('Spawning edit instance.')
|
||||||
|
fpath = tempfile.mkstemp(prefix = '.vaultpass.edit.', suffix = '.json', dir = '/dev/shm')[1]
|
||||||
|
_logger.debug('Writing secret to {0} for editing.'.format(fpath))
|
||||||
|
with open(fpath, 'w') as fh:
|
||||||
|
fh.write(data)
|
||||||
|
# We want this to block.
|
||||||
|
cmd = subprocess.run([editor, fpath], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
|
||||||
|
if cmd.returncode != 0:
|
||||||
|
_logger.error('{0} returned non-zero status code'.format(editor))
|
||||||
|
for x in ('stdin', 'stdout'):
|
||||||
|
o = getattr(cmd, x)
|
||||||
|
if not o:
|
||||||
|
continue
|
||||||
|
o = o.decode('utf-8').strip()
|
||||||
|
if o != '':
|
||||||
|
_logger.debug('{0}: {1}'.format(x.upper(), o))
|
||||||
|
with open(fpath, 'r') as fh:
|
||||||
|
rawdata = fh.read()
|
||||||
|
try:
|
||||||
|
data = json.loads(rawdata)
|
||||||
|
except (json.decoder.JSONDecodeError, TypeError):
|
||||||
|
data = rawdata
|
||||||
|
return(data, fpath)
|
Reference in New Issue
Block a user