#15 new-key fails with v1.1
Opened by jflorian. Modified

In a new trial setup with sigul-1.1-1.el8.infra.x86_64 (from https://koji.fedoraproject.org/koji/buildinfo?buildID=1668924) I attempted to sigul new-key test but it failed. The following was logged on the server:

2021-11-16 10:17:14,454 DEBUG: Started processing a request
2021-11-16 10:17:14,455 INFO: Request: 'key' = b'test', 'keytype' = b'gnupg', 'op' = b'new-key', 'user' = b'd13677'
2021-11-16 10:17:15,367 INFO: Connection from CN=d13677
2021-11-16 10:17:15,397 ERROR: Unexpected exception
Traceback (most recent call last):
  File "/usr/share/sigul/server.py", line 2041, in request_handling_child
    handler.handler(db, conn)
  File "/usr/share/sigul/server.py", line 1225, in cmd_new_key
    (fingerprint, key_passphrase) = gnupg_new_key(db, conn)
  File "/usr/share/sigul/server.py", line 1088, in gnupg_new_key
    name = key_name
NameError: name 'key_name' is not defined
2021-11-16 10:17:15,400 ERROR: Child died with status 512

Briefly looking at the code, I guess the following patch might be appropriate:

--- /usr/share/sigul/server.py.orig     2021-01-13 12:01:59.000000000 -0500
+++ /usr/share/sigul/server.py  2021-11-16 10:19:29.779381632 -0500
@@ -1083,6 +1083,7 @@
             + 'Subkey-Length: {0:d}\n'.format(conn.config.gnupg_subkey_length))
     key_passphrase = utils.random_passphrase(conn.config.passphrase_length)
     key_attrs += 'Passphrase: {0!s}\n'.format(key_passphrase)
+    key_name = conn.safe_outer_field('key', required=True)
     name = conn.safe_outer_field('name-real')
     if name is None:
         name = key_name

However, that just led to another error when I attempted again with that patch:

2021-11-16 10:07:06,240 DEBUG: Waiting for a request
2021-11-16 10:07:07,195 DEBUG: Started processing a request
2021-11-16 10:07:07,196 INFO: Request: 'key' = b'test', 'keytype' = b'gnupg', 'op' = b'new-key', 'user' = b'd13677'
2021-11-16 10:07:08,166 INFO: Connection from CN=d13677
2021-11-16 10:07:09,971 ERROR: Unexpected exception
Traceback (most recent call last):
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
    cursor, statement, parameters, context
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
    cursor.execute(statement, parameters)
sqlite3.IntegrityError: UNIQUE constraint failed: key_accesses.key_id, key_accesses.user_id
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "/usr/share/sigul/server.py", line 2042, in request_handling_child
    handler.handler(db, conn)
  File "/usr/share/sigul/server.py", line 1240, in cmd_new_key
    db.commit()
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 1026, in commit
    self.transaction.commit()
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 493, in commit
    self._prepare_impl()
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 472, in _prepare_impl
    self.session.flush()
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2451, in flush
    self._flush(objects)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2589, in _flush
    transaction.rollback(_capture_exception=True)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 129, in reraise
    raise value
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/session.py", line 2549, in _flush
    flush_context.execute()
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
    rec.execute(self)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
    uow,
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 245, in save_obj
    insert,
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1120, in _emit_insert_statements
    statement, params
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
    return meth(self, multiparams, params)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context
    e, statement, parameters, cursor, context
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 128, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
    cursor, statement, parameters, context
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: key_accesses.key_id, key_accesses.user_id
[SQL: INSERT INTO key_accesses (key_id, user_id, encrypted_passphrase, key_admin) VALUES (?, ?, ?, ?)]
[parameters: (1, 1, <memory at 0x7f2bef322948>, 1)]
(Background on this error at: http://sqlalche.me/e/gkpj)
2021-11-16 10:07:09,978 ERROR: Child died with status 512

Metadata