diff --git a/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaMethodsEnrolmentEndPoint.kt b/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaMethodsEnrolmentEndPoint.kt index db089fe0..0eed1f57 100644 --- a/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaMethodsEnrolmentEndPoint.kt +++ b/src/main/kotlin/com/vauthenticator/server/mfa/api/MfaMethodsEnrolmentEndPoint.kt @@ -11,7 +11,10 @@ import com.vauthenticator.server.oauth2.clientapp.ClientAppId import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity.ok import org.springframework.security.core.Authentication -import org.springframework.web.bind.annotation.* +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RestController @RestController class MfaEnrolmentAssociationEndPoint( @@ -47,8 +50,6 @@ class MfaEnrolmentAssociationEndPoint( authentication: Authentication, @RequestBody enrolling: MfaEnrollmentRequest ): ResponseEntity { - // todo introduce validation on the expected fields 400 in case of error - val ticketId = accountRepository.accountFor(authentication.name) .map { account -> mfaMethodsEnrollment.enroll( @@ -71,13 +72,6 @@ class MfaEnrolmentAssociationEndPoint( mfaMethodsEnrolmentAssociation.associate(associationRequest.ticket, associationRequest.code) } - @DeleteMapping("/api/mfa/enrollment/{enrollmentId}") - fun deleteMfaAssociation( - @PathVariable("enrollmentId") enrollmentId: String, - authentication: Authentication - ) { - - } } data class MfaEnrollmentRequest( diff --git a/src/main/kotlin/com/vauthenticator/server/mfa/repository/DynamoMfaAccountMethodsRepository.kt b/src/main/kotlin/com/vauthenticator/server/mfa/repository/DynamoMfaAccountMethodsRepository.kt index 9bee03e1..94544acd 100644 --- a/src/main/kotlin/com/vauthenticator/server/mfa/repository/DynamoMfaAccountMethodsRepository.kt +++ b/src/main/kotlin/com/vauthenticator/server/mfa/repository/DynamoMfaAccountMethodsRepository.kt @@ -8,6 +8,7 @@ import com.vauthenticator.server.mfa.domain.MfaAccountMethod import com.vauthenticator.server.mfa.domain.MfaMethod import com.vauthenticator.server.mfa.domain.MfaMethod.valueOf import software.amazon.awssdk.services.dynamodb.DynamoDbClient +import software.amazon.awssdk.services.dynamodb.model.AttributeValue import software.amazon.awssdk.services.dynamodb.model.PutItemRequest import software.amazon.awssdk.services.dynamodb.model.QueryRequest import java.util.* @@ -23,27 +24,27 @@ class DynamoMfaAccountMethodsRepository( userName: String, mfaMfaMethod: MfaMethod, mfaChannel: String - ): Optional = - Optional.ofNullable(findAll(userName).find { it.method == mfaMfaMethod && it.mfaChannel == mfaChannel}) + ): Optional { + return Optional.ofNullable( + getFromDynamo(userName, mfaChannel) + .map { MfaAccountMethodMapper.fromDynamoToDomain(userName, it) } + .find { it.method == mfaMfaMethod } + ) + } override fun findAll(userName: String): List = - getFromDynamo(userName).map { - MfaAccountMethod( - userName, - Kid(it.valueAsStringFor("key_id")), - valueOf(it.valueAsStringFor("mfa_method")), - it.valueAsStringFor("mfa_channel"), - it.valueAsBoolFor("associated") - ) - } + getFromDynamo(userName) + .map { MfaAccountMethodMapper.fromDynamoToDomain(userName, it) } private fun getFromDynamo(email: String) = dynamoDbClient.query( QueryRequest.builder().tableName(tableName).keyConditionExpression("user_name=:email") .expressionAttributeValues(mapOf(":email" to email.asDynamoAttribute())).build() ).items() - private fun getFromDynamo(email: String, mfaChannel : String) = dynamoDbClient.query( - QueryRequest.builder().tableName(tableName).keyConditionExpression("user_name=:email AND mfa_channel=:mfaChannel") + + private fun getFromDynamo(email: String, mfaChannel: String) = dynamoDbClient.query( + QueryRequest.builder().tableName(tableName) + .keyConditionExpression("user_name=:email AND mfa_channel=:mfaChannel") .expressionAttributeValues( mapOf( ":email" to email.asDynamoAttribute(), @@ -65,7 +66,7 @@ class DynamoMfaAccountMethodsRepository( } private fun storeOnDynamo( - userName: String, mfaMfaMethod: MfaMethod, mfaChannel: String, kid: Kid, associated : Boolean + userName: String, mfaMfaMethod: MfaMethod, mfaChannel: String, kid: Kid, associated: Boolean ) { dynamoDbClient.putItem( PutItemRequest.builder().tableName(tableName).item( @@ -81,4 +82,19 @@ class DynamoMfaAccountMethodsRepository( ) } +} + + +object MfaAccountMethodMapper { + fun fromDynamoToDomain( + userName: String, + item: MutableMap + ): MfaAccountMethod = + MfaAccountMethod( + userName, + Kid(item.valueAsStringFor("key_id")), + valueOf(item.valueAsStringFor("mfa_method")), + item.valueAsStringFor("mfa_channel"), + item.valueAsBoolFor("associated") + ) } \ No newline at end of file