diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index 318fe6f..9f5d07e 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -53,7 +53,7 @@ def _get_md5(data): return hashlib.md5(data.encode()).hexdigest() -def _save_temp(data, modo='wb'): +def save_temp(data, modo='wb'): path = tempfile.mkstemp()[1] with open(path, modo) as f: f.write(data) @@ -277,21 +277,22 @@ def to_slug(string): class Certificado(object): - def __init__(self, key, cer): - self._key = key - self._cer = cer + def __init__(self, paths): + self._path_key = paths['path_key'] + self._path_cer = paths['path_cer'] self._modulus = '' - self._save_files() + #~ self._save_files() self.error = '' - def _save_files(self): - try: - self._path_key = _save_temp(self._key) - self._path_cer = _save_temp(self._cer) - except: - self._path_key = '' - self._path_cer = '' - return + #~ def _save_files(self): + #~ try: + #~ self._path_key = _save_temp(bytes(self._key)) + #~ self._path_cer = _save_temp(bytes(self._cer)) + #~ except Exception as e: + #~ log.error(e) + #~ self._path_key = '' + #~ self._path_cer = '' + #~ return def _kill(self, path): try: @@ -342,7 +343,7 @@ class Certificado(object): hasta = parser.parse(dates[1].split('=')[1]) self._modulus = _call(args.format(self._path_cer, 'modulus')) - data['cer'] = self._cer + data['cer'] = read_file(self._path_cer) data['cer_tmp'] = None data['cer_pem'] = cer_pem data['cer_txt'] = cer_txt.replace('\n', '') @@ -366,7 +367,8 @@ class Certificado(object): 'pass:"{}" -out "{}"' _call(args.format(tmp_cer, tmp_key, rfc, hashlib.md5(rfc.encode()).hexdigest(), tmp_p12)) - data = open(tmp_p12, 'rb').read() + #~ data = open(tmp_p12, 'rb').read() + data = read_file(tmp_p12) self._kill(tmp_cer) self._kill(tmp_key) @@ -397,7 +399,7 @@ class Certificado(object): self._path_key, password, _get_md5(rfc)) key_enc = _call(args) - data['key'] = self._key + data['key'] = read_file(self._path_key) data['key_tmp'] = None data['key_enc'] = key_enc data['p12'] = self._get_p12(password, rfc) @@ -405,7 +407,7 @@ class Certificado(object): def validate(self, password, rfc): if not self._path_key or not self._path_cer: - self.error = 'Error al cargar el certificado' + self.error = 'Error en las rutas temporales del certificado' return {} data = self._get_info_cer(rfc) @@ -433,9 +435,9 @@ def make_xml(data, certificado): data = { 'xsltproc': PATH_XSLTPROC, 'xslt': _join(PATH_XSLT, 'cadena.xslt'), - 'xml': _save_temp(xml, 'w'), + 'xml': save_temp(xml, 'w'), 'openssl': PATH_OPENSSL, - 'key': _save_temp(certificado.key_enc, 'w'), + 'key': save_temp(certificado.key_enc, 'w'), 'pass': _get_md5(certificado.rfc) } args = '"{xsltproc}" "{xslt}" "{xml}" | ' \ @@ -1062,9 +1064,9 @@ def cancel_cfdi(uuid, pk12, rfc, auth): data = { 'xmlsec': PATH_XMLSEC, - 'pk12': _save_temp(pk12), + 'pk12': save_temp(pk12), 'pass': _get_md5(rfc), - 'template': _save_temp(template, 'w'), + 'template': save_temp(template, 'w'), } args = '"{xmlsec}" --sign --pkcs12 "{pk12}" --pwd {pass} ' \ '"{template}"'.format(**data) diff --git a/source/app/main.ini b/source/app/main.ini index 6041275..9c5472f 100644 --- a/source/app/main.ini +++ b/source/app/main.ini @@ -2,6 +2,7 @@ socket = 127.0.0.1:3033 uid = nginx gid = nginx +#~ Establece una ruta accesible para nginx chdir = /srv/app/empresa-libre/app wsgi-file = main.py callable = app @@ -10,4 +11,5 @@ processes = 4 threads = 4 thunder-lock = true #~ stats = 127.0.0.1:9191 +#~ Establece una ruta accesible para nginx logger = file:/srv/log/empresalibre-uwsgi.log diff --git a/source/app/main_debug.ini b/source/app/main_debug.ini index 89cb94f..065dcfc 100644 --- a/source/app/main_debug.ini +++ b/source/app/main_debug.ini @@ -1,6 +1,5 @@ [uwsgi] http = 127.0.0.1:8000 -#~ http = 37.228.132.181:9000 wsgi-file = main.py callable = app master = true diff --git a/source/app/models/db.py b/source/app/models/db.py index ba042c8..1b09e1f 100644 --- a/source/app/models/db.py +++ b/source/app/models/db.py @@ -20,8 +20,8 @@ class StorageEngine(object): def add_config(self, values): return main.Configuracion.add(values) - def add_cert(self, file_object): - return main.Certificado.add(file_object) + def add_cert(self, file_obj): + return main.Certificado.add(file_obj) def validate_cert(self, values, session): return main.Certificado.validate(values, session) diff --git a/source/app/models/main.py b/source/app/models/main.py index 29de88b..93274c7 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -64,6 +64,9 @@ class Configuracion(BaseModel): clave = TextField(unique=True) valor = TextField(default='') + def __str__(self): + return '{} = {}'.format(self.clave, self.valor) + @classmethod def get_(cls, keys): if keys['fields'] == 'correo': @@ -74,7 +77,14 @@ class Configuracion(BaseModel): .select() .where(Configuracion.clave.in_(fields)) ) - values = {r.clave: r.valor for r in data} + elif keys['fields'] == 'path_cer': + fields = ('path_key', 'path_cer') + data = (Configuracion + .select() + .where(Configuracion.clave.in_(fields)) + ) + + values = {r.clave: r.valor for r in data} return values @classmethod @@ -316,28 +326,26 @@ class Certificado(BaseModel): return row def get_(cls): - if Certificado.select().count(): - obj = Certificado.select()[0] - else: - obj = Certificado() - return obj + return Certificado.select()[0] @classmethod - def add(cls, file_object): - obj = cls.get_(cls) - if file_object.filename.endswith('key'): - obj.key_tmp = file_object.file.read() - elif file_object.filename.endswith('cer'): - obj.cer_tmp = file_object.file.read() - obj.save() + def add(cls, file_obj): + if file_obj.filename.endswith('key'): + path_key = util.save_temp(file_obj.file.read()) + Configuracion.add({'path_key': path_key}) + elif file_obj.filename.endswith('cer'): + path_cer = util.save_temp(file_obj.file.read()) + Configuracion.add({'path_cer': path_cer}) return {'status': 'server'} @classmethod def validate(cls, values, session): row = {} result = False + obj = cls.get_(cls) - cert = util.Certificado(obj.key_tmp, obj.cer_tmp) + paths = Configuracion.get_({'fields': 'path_cer'}) + cert = util.Certificado(paths) data = cert.validate(values['contra'], session['rfc']) if data: msg = 'Certificado guardado correctamente' @@ -352,9 +360,12 @@ class Certificado(BaseModel): } else: msg = cert.error - obj.key_tmp = None - obj.cer_tmp = None - obj.save() + #~ obj.key_tmp = None + #~ obj.cer_tmp = None + #~ obj.save() + + Configuracion.add({'path_key': ''}) + Configuracion.add({'path_cer': ''}) return {'ok': result, 'msg': msg, 'data': row}