Merge remote-tracking branch 'upstream/dev' into 0002343-endpoint-tessere
This commit is contained in:
		
						commit
						728eca6dd6
					
				@ -35,9 +35,8 @@ dependencies {
 | 
			
		||||
    implementation("org.jetbrains.exposed:exposed-dao:$exposed_version")
 | 
			
		||||
    implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1")
 | 
			
		||||
    implementation ("org.jetbrains.exposed:exposed-java-time:$exposed_version")
 | 
			
		||||
    implementation("io.jsonwebtoken:jjwt-api:0.11.5")
 | 
			
		||||
    implementation("io.jsonwebtoken:jjwt-impl:0.11.5")
 | 
			
		||||
    implementation("io.jsonwebtoken:jjwt-jackson:0.11.5")
 | 
			
		||||
    implementation("io.ktor:ktor-server-auth:$ktor_version")
 | 
			
		||||
    implementation("io.ktor:ktor-server-auth-jwt:$ktor_version")
 | 
			
		||||
    testImplementation("io.ktor:ktor-server-test-host-jvm")
 | 
			
		||||
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
package eu.maiora
 | 
			
		||||
 | 
			
		||||
import eu.maiora.plugins.configureDatabases
 | 
			
		||||
//import eu.maiora.model.LogScriptRepositoryImpl
 | 
			
		||||
import eu.maiora.plugins.*
 | 
			
		||||
import io.ktor.http.*
 | 
			
		||||
import io.ktor.server.application.*
 | 
			
		||||
@ -21,11 +20,10 @@ fun Application.module() {
 | 
			
		||||
    val dbUrl = config.property("ktor.database.url").getString();
 | 
			
		||||
    val username = config.property("ktor.database.username").getString();
 | 
			
		||||
    val password = config.property("ktor.database.password").getString();
 | 
			
		||||
    //val repository = LogScriptRepositoryImpl()
 | 
			
		||||
    configureDatabases(dbUrl, username, password)
 | 
			
		||||
    //configureRouting(dbUrl, username, password, repository)
 | 
			
		||||
    configureRouting(dbUrl, username, password)
 | 
			
		||||
    configureSerialization()
 | 
			
		||||
 | 
			
		||||
    install(CallLogging)
 | 
			
		||||
    install(CORS){
 | 
			
		||||
        anyHost()
 | 
			
		||||
 | 
			
		||||
@ -18,9 +18,6 @@ fun Application.configureRouting(dbUrl : String, username : String, password : S
 | 
			
		||||
            call.respondText("Hello World!")
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        auth(AccountsRepositoryImpl(), ParametriRepositoryImpl())
 | 
			
		||||
        //analizzaURLRoute()
 | 
			
		||||
        //eseguiScriptSQLRoute(dbUrl, username, password)
 | 
			
		||||
        //logScriptRouting(repository)
 | 
			
		||||
        auth(AccountsRepositoryImpl())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,13 +1,11 @@
 | 
			
		||||
package eu.maiora.routes
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.ser.Serializers.Base
 | 
			
		||||
import com.auth0.jwt.JWT
 | 
			
		||||
import com.auth0.jwt.algorithms.Algorithm
 | 
			
		||||
import eu.maiora.model.AccountsRepositoryImpl
 | 
			
		||||
import eu.maiora.model.ParametriRepositoryImpl
 | 
			
		||||
import io.jsonwebtoken.Jwts
 | 
			
		||||
import io.jsonwebtoken.SignatureAlgorithm
 | 
			
		||||
import io.jsonwebtoken.security.Keys
 | 
			
		||||
import io.ktor.http.*
 | 
			
		||||
import io.ktor.server.application.*
 | 
			
		||||
import io.ktor.server.config.*
 | 
			
		||||
import io.ktor.server.request.*
 | 
			
		||||
import io.ktor.server.response.*
 | 
			
		||||
import io.ktor.server.routing.*
 | 
			
		||||
@ -17,70 +15,77 @@ import org.slf4j.LoggerFactory
 | 
			
		||||
import java.util.*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
fun Route.auth(accountsRepository: AccountsRepositoryImpl, parametriRepository: ParametriRepositoryImpl){
 | 
			
		||||
 | 
			
		||||
    post("/auth"){
 | 
			
		||||
        // Riceve il body della richiesta e lo deserializza in ReceivedResponse
 | 
			
		||||
        val receivedResponse = try {
 | 
			
		||||
            call.receive<ReceivedResponse>()
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            return@post call.respondText("Body mancante " + e.stackTraceToString(), status = HttpStatusCode.BadRequest)
 | 
			
		||||
        }
 | 
			
		||||
        val logger = LoggerFactory.getLogger("AuthRoute")
 | 
			
		||||
        logger.info("param: " +
 | 
			
		||||
                receivedResponse.param);
 | 
			
		||||
 | 
			
		||||
        // Decodifica la stringa da Base64 a oggetto Credentials
 | 
			
		||||
        val decodedBytes = Base64.getDecoder().decode(receivedResponse.param)
 | 
			
		||||
        val decodedString = String(decodedBytes)
 | 
			
		||||
        val credentials = Json.decodeFromString<Credentials>(decodedString)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //verifica credenziali (recupero account dal database)
 | 
			
		||||
        val account = accountsRepository.accountByUsername(credentials.username)
 | 
			
		||||
        //se le credenziali sono valide, creare il JWT
 | 
			
		||||
        if (account != null) {
 | 
			
		||||
            val passwordPlain = String(
 | 
			
		||||
                Base64.getDecoder().decode(
 | 
			
		||||
                    StringBuffer(
 | 
			
		||||
                        String(
 | 
			
		||||
                            Base64.getDecoder().decode(account.password.toByteArray())
 | 
			
		||||
                        )
 | 
			
		||||
                    ).reverse().toString().toByteArray()
 | 
			
		||||
fun Route.auth(accountsRepository: AccountsRepositoryImpl) {
 | 
			
		||||
    route("/auth") {
 | 
			
		||||
        post() {
 | 
			
		||||
            // Riceve il body della richiesta e lo deserializza in ReceivedResponse
 | 
			
		||||
            val receivedResponse = try {
 | 
			
		||||
                call.receive<ReceivedResponse>()
 | 
			
		||||
            } catch (e: Exception) {
 | 
			
		||||
                return@post call.respondText(
 | 
			
		||||
                    "Body mancante " + e.stackTraceToString(),
 | 
			
		||||
                    status = HttpStatusCode.BadRequest
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            if(passwordPlain.equals(credentials.password)){
 | 
			
		||||
                val parametro = parametriRepository.parametroByChiave("jwt_secret")
 | 
			
		||||
                if (parametro != null) {
 | 
			
		||||
            }
 | 
			
		||||
            val logger = LoggerFactory.getLogger("AuthRoute")
 | 
			
		||||
            logger.info(
 | 
			
		||||
                "param: " +
 | 
			
		||||
                        receivedResponse.param
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            // Decodifica la stringa da Base64 a oggetto Credentials
 | 
			
		||||
            val decodedBytes = Base64.getDecoder().decode(receivedResponse.param)
 | 
			
		||||
            val decodedString = String(decodedBytes)
 | 
			
		||||
            val credentials = try {
 | 
			
		||||
                Json.decodeFromString<Credentials>(decodedString)
 | 
			
		||||
            } catch (e: Exception) {
 | 
			
		||||
                return@post call.respondText(
 | 
			
		||||
                    "Errore nel param. Verificare la codifica. \n" + e.stackTraceToString(),
 | 
			
		||||
                    status = HttpStatusCode.BadRequest
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //verifica credenziali (recupero account dal database)
 | 
			
		||||
            val account = accountsRepository.accountByUsername(credentials.username)
 | 
			
		||||
            //se le credenziali sono valide, creare il JWT
 | 
			
		||||
            if (account != null) {
 | 
			
		||||
                val passwordPlain = String(
 | 
			
		||||
                    Base64.getDecoder().decode(
 | 
			
		||||
                        StringBuffer(
 | 
			
		||||
                            String(
 | 
			
		||||
                                Base64.getDecoder().decode(account.password.toByteArray())
 | 
			
		||||
                            )
 | 
			
		||||
                        ).reverse().toString().toByteArray()
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
                if (passwordPlain.equals(credentials.password)) {
 | 
			
		||||
                    val config = ApplicationConfig("application.conf")
 | 
			
		||||
                    val secret = config.property("ktor.jwt.secret").getString()
 | 
			
		||||
 | 
			
		||||
                    val key = Keys.hmacShaKeyFor(parametro.valore.toByteArray())
 | 
			
		||||
                    val now = System.currentTimeMillis()
 | 
			
		||||
                    val expiration = now + 86400000 // Scadenza tra 1 giorno (24 ore)
 | 
			
		||||
 | 
			
		||||
                    val token = Jwts.builder()
 | 
			
		||||
                        .setSubject(account.username) // Soggetto del JWT
 | 
			
		||||
                        .setIssuedAt(Date(now)) // Data di emissione
 | 
			
		||||
                        .setExpiration(Date(expiration)) // Data di scadenza
 | 
			
		||||
                        .signWith(key, SignatureAlgorithm.HS256) // Firma con una chiave segreta
 | 
			
		||||
                        .compact()
 | 
			
		||||
                    val token = JWT.create()
 | 
			
		||||
                        .withSubject(account.username)
 | 
			
		||||
                        .withIssuedAt(Date(now))
 | 
			
		||||
                        .withExpiresAt(Date(expiration))
 | 
			
		||||
                        .sign(Algorithm.HMAC256(secret))
 | 
			
		||||
 | 
			
		||||
                    // Risponde con la stringa decodificata
 | 
			
		||||
                    call.respond(HttpStatusCode.OK, token)
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                } else {
 | 
			
		||||
                    call.respond(HttpStatusCode.Unauthorized)
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                call.respond(HttpStatusCode.Unauthorized)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            call.respond(HttpStatusCode.Unauthorized)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Serializable
 | 
			
		||||
 | 
			
		||||
@ -13,4 +13,9 @@ ktor {
 | 
			
		||||
          ;username = "EP_DONORIONE"
 | 
			
		||||
          ;password = "ep_donorione"
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
     jwt {
 | 
			
		||||
         # secret per JWT generato partendo dalla stringa '?Backend_API*06022025!' codificato in Base64
 | 
			
		||||
         secret = "P0JhY2tlbmRfQVBJKjA2MDIyMDI1IQ=="
 | 
			
		||||
     }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user