@ -33,7 +33,6 @@ import org.springframework.jdbc.core.JdbcOperations;
@@ -33,7 +33,6 @@ import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.PreparedStatementSetter ;
import org.springframework.jdbc.core.RowMapper ;
import org.springframework.jdbc.core.SqlParameterValue ;
import org.springframework.jdbc.support.lob.DefaultLobHandler ;
import org.springframework.jdbc.support.lob.LobCreator ;
import org.springframework.jdbc.support.lob.LobHandler ;
import org.springframework.security.web.webauthn.api.AuthenticatorTransport ;
@ -62,11 +61,11 @@ import org.springframework.util.CollectionUtils;
@@ -62,11 +61,11 @@ import org.springframework.util.CollectionUtils;
* /
public final class JdbcUserCredentialRepository implements UserCredentialRepository {
private RowMapper < CredentialRecord > credentialRecordRowMapper = new CredentialRecordRowMapper ( ) ;
private RowMapper < CredentialRecord > credentialRecordRowMapper = new CredentialRecordRowMapper ( ResultSet : : getBytes ) ;
private Function < CredentialRecord , List < SqlParameterValue > > credentialRecordParametersMapper = new CredentialRecordParametersMapper ( ) ;
private LobHandler lobHandler = new DefaultLobHandler ( ) ;
private SetBytes setBytes = PreparedStatement : : setBytes ;
private final JdbcOperations jdbcOperations ;
@ -159,22 +158,16 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
@@ -159,22 +158,16 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
private void insertCredentialRecord ( CredentialRecord record ) {
List < SqlParameterValue > parameters = this . credentialRecordParametersMapper . apply ( record ) ;
try ( LobCreator lobCreator = this . lobHandler . getLobCreator ( ) ) {
PreparedStatementSetter pss = new LobCreatorArgumentPreparedStatementSetter ( lobCreator ,
parameters . toArray ( ) ) ;
this . jdbcOperations . update ( SAVE_CREDENTIAL_RECORD_SQL , pss ) ;
}
PreparedStatementSetter pss = new BlobArgumentPreparedStatementSetter ( this . setBytes , parameters . toArray ( ) ) ;
this . jdbcOperations . update ( SAVE_CREDENTIAL_RECORD_SQL , pss ) ;
}
private int updateCredentialRecord ( CredentialRecord record ) {
List < SqlParameterValue > parameters = this . credentialRecordParametersMapper . apply ( record ) ;
SqlParameterValue credentialId = parameters . remove ( 0 ) ;
parameters . add ( credentialId ) ;
try ( LobCreator lobCreator = this . lobHandler . getLobCreator ( ) ) {
PreparedStatementSetter pss = new LobCreatorArgumentPreparedStatementSetter ( lobCreator ,
parameters . toArray ( ) ) ;
return this . jdbcOperations . update ( UPDATE_CREDENTIAL_RECORD_SQL , pss ) ;
}
PreparedStatementSetter pss = new BlobArgumentPreparedStatementSetter ( this . setBytes , parameters . toArray ( ) ) ;
return this . jdbcOperations . update ( UPDATE_CREDENTIAL_RECORD_SQL , pss ) ;
}
@Override
@ -195,10 +188,18 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
@@ -195,10 +188,18 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
/ * *
* Sets a { @link LobHandler } for large binary fields and large text field parameters .
* @param lobHandler the lob handler
* @deprecated { @link LobHandler } is deprecated without replacement , as such this
* method will also be removed without replacement
* /
@Deprecated ( since = "6.5" , forRemoval = true )
public void setLobHandler ( LobHandler lobHandler ) {
Assert . notNull ( lobHandler , "lobHandler cannot be null" ) ;
this . lobHandler = lobHandler ;
this . setBytes = ( ps , index , bytes ) - > {
try ( LobCreator creator = lobHandler . getLobCreator ( ) ) {
creator . setBlobAsBytes ( ps , index , bytes ) ;
}
} ;
this . credentialRecordRowMapper = new CredentialRecordRowMapper ( lobHandler : : getBlobAsBytes ) ;
}
private static class CredentialRecordParametersMapper
@ -246,13 +247,25 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
@@ -246,13 +247,25 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
}
private static final class LobCreatorArgumentPreparedStatementSetter extends ArgumentPreparedStatementSetter {
private interface SetBytes {
void setBytes ( PreparedStatement ps , int index , byte [ ] bytes ) throws SQLException ;
}
private interface GetBytes {
private final LobCreator lobCreator ;
byte [ ] getBytes ( ResultSet rs , String columnName ) throws SQLException ;
private LobCreatorArgumentPreparedStatementSetter ( LobCreator lobCreator , Object [ ] args ) {
}
private static final class BlobArgumentPreparedStatementSetter extends ArgumentPreparedStatementSetter {
private final SetBytes setBytes ;
private BlobArgumentPreparedStatementSetter ( SetBytes setBytes , Object [ ] args ) {
super ( args ) ;
this . lobCreator = lobCreator ;
this . setBytes = setBytes ;
}
@Override
@ -264,7 +277,7 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
@@ -264,7 +277,7 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
"Value of blob parameter must be byte[]" ) ;
}
byte [ ] valueBytes = ( byte [ ] ) paramValue . getValue ( ) ;
this . lobCreator . setBlobAs Bytes ( ps , parameterPosition , valueBytes ) ;
this . setBytes . setBytes ( ps , parameterPosition , valueBytes ) ;
return ;
}
}
@ -275,14 +288,17 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
@@ -275,14 +288,17 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
private static class CredentialRecordRowMapper implements RowMapper < CredentialRecord > {
private LobHandler lobHandler = new DefaultLobHandler ( ) ;
private final GetBytes getBytes ;
CredentialRecordRowMapper ( GetBytes getBytes ) {
this . getBytes = getBytes ;
}
@Override
public CredentialRecord mapRow ( ResultSet rs , int rowNum ) throws SQLException {
Bytes credentialId = Bytes . fromBase64 ( new String ( rs . getString ( "credential_id" ) . getBytes ( ) ) ) ;
Bytes userEntityUserId = Bytes . fromBase64 ( new String ( rs . getString ( "user_entity_user_id" ) . getBytes ( ) ) ) ;
ImmutablePublicKeyCose publicKey = new ImmutablePublicKeyCose (
this . lobHandler . getBlobAsBytes ( rs , "public_key" ) ) ;
ImmutablePublicKeyCose publicKey = new ImmutablePublicKeyCose ( this . getBytes . getBytes ( rs , "public_key" ) ) ;
long signatureCount = rs . getLong ( "signature_count" ) ;
boolean uvInitialized = rs . getBoolean ( "uv_initialized" ) ;
boolean backupEligible = rs . getBoolean ( "backup_eligible" ) ;
@ -291,13 +307,13 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
@@ -291,13 +307,13 @@ public final class JdbcUserCredentialRepository implements UserCredentialReposit
boolean backupState = rs . getBoolean ( "backup_state" ) ;
Bytes attestationObject = null ;
byte [ ] rawAttestationObject = this . lobHandler . getBlobAs Bytes ( rs , "attestation_object" ) ;
byte [ ] rawAttestationObject = this . getBytes . getBytes ( rs , "attestation_object" ) ;
if ( rawAttestationObject ! = null ) {
attestationObject = new Bytes ( rawAttestationObject ) ;
}
Bytes attestationClientDataJson = null ;
byte [ ] rawAttestationClientDataJson = this . lobHandler . getBlobAs Bytes ( rs , "attestation_client_data_json" ) ;
byte [ ] rawAttestationClientDataJson = this . getBytes . getBytes ( rs , "attestation_client_data_json" ) ;
if ( rawAttestationClientDataJson ! = null ) {
attestationClientDataJson = new Bytes ( rawAttestationClientDataJson ) ;
}