diff --git a/src/appinfo/appinfo.go b/src/appinfo/appinfo.go index 4e42795..6998d09 100644 --- a/src/appinfo/appinfo.go +++ b/src/appinfo/appinfo.go @@ -1,7 +1,7 @@ package appinfo var appName string = "MOFFAS-AUTH" -var version string = "1.0.0.1" +var version string = "1.0.0.2" func Version() string { return version diff --git a/src/handlers/auth.go b/src/handlers/auth.go index e0a7c67..c8bafe8 100644 --- a/src/handlers/auth.go +++ b/src/handlers/auth.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io" + "moffas_go/db" "moffas_go/helper" "moffas_go/logger" "moffas_go/moffas" @@ -27,6 +28,37 @@ func Auth(w http.ResponseWriter, r *http.Request) { "error_code": "000000000", "error_message": "", } + + // ---- GET DB CONNECTION ---- + conn, err := db.GetConnection() + if err != nil { + response["error_code"] = "503001001" + response["error_message"] = "Service Unavailable. Server Busy" + + res, _ = helper.JSONencode(response) + http.Error(w, res, http.StatusBadRequest) + return + } else { + defer db.ReleaseConnection() + // CHECK DB CONN PID + sql := " SELECT pg_backend_pid() pid" + type pidRes struct { + Pid int `db:"pid"` + } + pidres := pidRes{} + err = conn.Get(&pidres, sql) + if err != nil { + logger.Critical("!!! FAILED TO GET CONNECTION ID FROM DB") + response["error_code"] = "500001001" + response["error_message"] = "Internal System Error" + + res, _ = helper.JSONencode(response) + http.Error(w, res, http.StatusBadRequest) + return + } + logger.Info(reference_id, "DB Connection Pid : ", pidres.Pid) + } + // ---- CHECK REQUEST METHOD ---- if r.Method == http.MethodPost { // ---- VERIFY THE CONTENT IS JSON ---- @@ -87,7 +119,7 @@ func Auth(w http.ResponseWriter, r *http.Request) { } // ---- GENERATE CHALLENGE ---- - challenge, err := moffas.Generate_challenge(reference_id, req.Username, req.Half_nonce) + challenge, err := moffas.Generate_challenge(reference_id, conn, req.Username, req.Half_nonce) if err != nil { // ---- ERROR QUERYING USER DATA ---- logger.Error(reference_id, "!!! ERROR GENERATING CHALLENGE") @@ -134,6 +166,37 @@ func Verify(w http.ResponseWriter, r *http.Request) { "error_code": "000000000", "error_message": "", } + + // ---- GET DB CONNECTION ---- + conn, err := db.GetConnection() + if err != nil { + response["error_code"] = "503001001" + response["error_message"] = "Service Unavailable. Server Busy" + + res, _ = helper.JSONencode(response) + http.Error(w, res, http.StatusBadRequest) + return + } else { + defer db.ReleaseConnection() + // CHECK DB CONN PID + sql := " SELECT pg_backend_pid() pid" + type pidRes struct { + Pid int `db:"pid"` + } + pidres := pidRes{} + err = conn.Get(&pidres, sql) + if err != nil { + logger.Critical("!!! FAILED TO GET CONNECTION ID FROM DB") + response["error_code"] = "500001001" + response["error_message"] = "Internal System Error" + + res, _ = helper.JSONencode(response) + http.Error(w, res, http.StatusBadRequest) + return + } + logger.Info(reference_id, "DB Connection Pid : ", pidres.Pid) + } + // ---- CHECK REQUEST METHOD ---- if r.Method == http.MethodPost { // ---- VERIFY THE CONTENT IS JSON ---- @@ -199,7 +262,7 @@ func Verify(w http.ResponseWriter, r *http.Request) { } // ---- VERIFY CHALLENGE RESPONSE ---- - challenge_data, err := moffas.Verify_challenge(reference_id, req.Full_nonce, req.Client_hash, req.Next_nonce) + challenge_data, err := moffas.Verify_challenge(reference_id, conn, req.Full_nonce, req.Client_hash, req.Next_nonce) if err != nil { // ---- ERROR QUERYING USER DATA ---- logger.Error(reference_id, "!!! FAILED TO VERIFY CHALLENGE") diff --git a/src/moffas/moffas_auth.go b/src/moffas/moffas_auth.go index 4fe08bc..6bc3456 100644 --- a/src/moffas/moffas_auth.go +++ b/src/moffas/moffas_auth.go @@ -3,12 +3,13 @@ package moffas import ( "encoding/json" "errors" - "moffas_go/db" "moffas_go/helper" "moffas_go/logger" "strconv" "strings" "time" + + "github.com/jmoiron/sqlx" ) type GeneratedChallenge struct { @@ -28,7 +29,7 @@ type VerificationResult struct { Organization_data map[string]interface{} } -func Generate_challenge(reference_id, username string, half_nonce string) (GeneratedChallenge, error) { +func Generate_challenge(reference_id string, conn *sqlx.DB, username string, half_nonce string) (GeneratedChallenge, error) { logger.Debug(reference_id, " -- start generate_challenge") startTime := time.Now() defer func() { @@ -36,13 +37,7 @@ func Generate_challenge(reference_id, username string, half_nonce string) (Gener logger.Debug(reference_id, " -- generate_challenge done in ", dur) }() - conn, err := db.GetConnection() - if err != nil { - return GeneratedChallenge{}, err - } - defer db.ReleaseConnection() - - current_time := time.Now().Unix() + current_time := startTime.Unix() nonce, err := helper.GenerateRandomString(8) if err != nil { return GeneratedChallenge{}, err @@ -114,7 +109,7 @@ func Generate_challenge(reference_id, username string, half_nonce string) (Gener logger.Info(reference_id, "CALCULATED CLIENT HASH : ", calculated_client_hash) //----- CONTEKAN DOANG ----- - err = upsert_challenge(reference_id, full_nonce, dbresult.User_id) + err = upsert_challenge(reference_id, conn, full_nonce, dbresult.User_id) if err != nil { return GeneratedChallenge{}, err } @@ -126,20 +121,14 @@ func Generate_challenge(reference_id, username string, half_nonce string) (Gener }, nil } -func Verify_challenge(reference_id string, full_nonce string, client_hash string, next_nonce string) (VerificationResult, error) { - logger.Debug(reference_id, " start verify_challenge") +func Verify_challenge(reference_id string, conn *sqlx.DB, full_nonce string, client_hash string, next_nonce string) (VerificationResult, error) { + logger.Debug(reference_id, " -- start verify_challenge") startTime := time.Now() defer func() { dur := time.Since(startTime) logger.Debug(reference_id, " -- verify_challenge done in ", dur) }() - conn, err := db.GetConnection() - if err != nil { - return VerificationResult{}, err - } - defer db.ReleaseConnection() - current_time := time.Now().Unix() nonce, err := helper.GenerateRandomString(8) if err != nil { @@ -243,7 +232,7 @@ func Verify_challenge(reference_id string, full_nonce string, client_hash string session_id, _ := helper.GenerateRandomString(16) logger.Info(reference_id, "SESSION ID : ", session_id) - err = upsert_session(reference_id, session_id, dbresult.User_id, session_secret) + err = upsert_session(reference_id, conn, session_id, dbresult.User_id, session_secret) if err != nil { return VerificationResult{}, err } @@ -272,7 +261,7 @@ func Verify_challenge(reference_id string, full_nonce string, client_hash string }, nil } -func upsert_challenge(reference_id, full_nonce string, user_id int64) error { +func upsert_challenge(reference_id string, conn *sqlx.DB, full_nonce string, user_id int64) error { logger.Debug(reference_id, " start upsert_challenge") startTime := time.Now() defer func() { @@ -280,16 +269,10 @@ func upsert_challenge(reference_id, full_nonce string, user_id int64) error { logger.Debug(reference_id, " -- upsert_challenge done in ", dur) }() - conn, err := db.GetConnection() - if err != nil { - return err - } - defer db.ReleaseConnection() - query := "DELETE FROM servouser.challenge_response WHERE full_nonce = $1 OR user_id = $2" sql := strings.ReplaceAll(strings.ReplaceAll(query, "\t", " "), "\n", " ") logger.Debug(reference_id, "SQL : ", sql) - _, err = conn.Exec(query, full_nonce, user_id) + _, err := conn.Exec(query, full_nonce, user_id) if err != nil { return err } @@ -306,25 +289,18 @@ func upsert_challenge(reference_id, full_nonce string, user_id int64) error { return err } -func upsert_session(reference_id, session_id string, user_id int64, session_secret string) error { - logger.Debug(reference_id, " start upsert_challenge") - +func upsert_session(reference_id string, conn *sqlx.DB, session_id string, user_id int64, session_secret string) error { + logger.Debug(reference_id, " -- start upsert_session.") startTime := time.Now() defer func() { dur := time.Since(startTime) logger.Debug(reference_id, " -- upsert_session done in ", dur) }() - conn, err := db.GetConnection() - if err != nil { - return err - } - defer db.ReleaseConnection() - query := "DELETE FROM servouser.session WHERE session_id = $1 OR user_id = $2" sql := strings.ReplaceAll(strings.ReplaceAll(query, "\t", " "), "\n", " ") logger.Debug(reference_id, "SQL : ", sql) - _, err = conn.Exec(query, session_id, user_id) + _, err := conn.Exec(query, session_id, user_id) if err != nil { return err }