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);
}
}
}