protected KrbIdentity doAddIdentity()

in kerby-backend/mysql-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/MySQLIdentityBackend.java [212:279]


    protected KrbIdentity doAddIdentity(KrbIdentity identity) throws KrbException {
        String principalName = identity.getPrincipalName();
        int keyVersion = identity.getKeyVersion();
        int kdcFlags = identity.getKdcFlags();
        boolean disabled = identity.isDisabled();
        boolean locked = identity.isLocked();
        long createdTime = identity.getCreatedTime().getTime();
        long expireTime = identity.getExpireTime().getTime();
        Map<EncryptionType, EncryptionKey> keys = identity.getKeys();

        Connection connection = null;

        KrbIdentity duplicateIdentity = doGetIdentity(principalName);
        if (duplicateIdentity != null) {
            LOG.warn("The identity maybe duplicate.");

            return duplicateIdentity;
        } else {
            try {
                connection = dataSource.getConnection();
                connection.setAutoCommit(false);

                // Insert identity to identity table
                String stmIdentity = "INSERT INTO " + identityTable
                    + " (principal, key_version, kdc_flags, disabled, locked,"
                    + " created_time, expire_time) VALUES(?, ?, ?, ?, ?, ?, ?)";
                try (PreparedStatement preIdentity = connection.prepareStatement(stmIdentity)) {
                    preIdentity.setString(1, principalName);
                    preIdentity.setInt(2, keyVersion);
                    preIdentity.setInt(3, kdcFlags);
                    preIdentity.setBoolean(4, disabled);
                    preIdentity.setBoolean(5, locked);
                    preIdentity.setLong(6, createdTime);
                    preIdentity.setLong(7, expireTime);
                    preIdentity.executeUpdate();
                }

                // Insert keys to key table
                for (Map.Entry<EncryptionType, EncryptionKey> entry : keys.entrySet()) {
                    String stmKey = "INSERT INTO " + keyInfoTable
                        + " (key_type, kvno, key_value, principal) VALUES(?, ?, ?, ?)";
                    try (PreparedStatement preKey = connection.prepareStatement(stmKey)) {
                        preKey.setString(1, entry.getKey().getName());
                        preKey.setInt(2, entry.getValue().getKvno());
                        preKey.setBlob(3, new SerialBlob(entry.getValue().getKeyData()));
                        preKey.setString(4, principalName);
                        preKey.executeUpdate();
                    }
                }

                connection.commit();
                return identity;
            } catch (SQLException e) {
                try {
                    LOG.info("Transaction is being rolled back.");
                    if (connection != null) {
                        connection.rollback();
                    }
                } catch (SQLException ex) {
                    throw new KrbException("Transaction roll back failed. ", ex);
                }
                LOG.error("Error occurred while adding identity.");
                throw new KrbException("Failed to add identity. ", e);
            } finally {
                DbUtils.closeQuietly(connection);
            }
        }
    }