step 2 : auth dengan encrpty not fixed
This commit is contained in:
126
backend/internal/staff/staff.go
Normal file
126
backend/internal/staff/staff.go
Normal file
@@ -0,0 +1,126 @@
|
||||
package staff
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/x509"
|
||||
"database/sql"
|
||||
"encoding/pem"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
|
||||
"com.sismedika.com.absensi/graph/model"
|
||||
"com.sismedika.com.absensi/pkg/config"
|
||||
db "com.sismedika.com.absensi/pkg/database"
|
||||
)
|
||||
|
||||
// diambil dari graph/model/struct nya Staff
|
||||
type Staff model.Staff
|
||||
|
||||
// staff *Staff = receiver yang memiliki tipe data Staff. liat di graphql
|
||||
// email string, id_google_sign_in string = parameter inputan dari flutter nanti
|
||||
// *model.Staff, error = output yang dihasilkan, jika tidak error return *model.Staff namun jika error maka sebelah kanan nya yaitu
|
||||
// error
|
||||
func (staff *Staff) LoginAttendance(email string, id_google_sign_in string, publickey string) (*model.Staff, error) {
|
||||
|
||||
// inisialisasi
|
||||
var err error
|
||||
var ret model.Staff
|
||||
|
||||
// decode private.pem
|
||||
pemData, err := ioutil.ReadFile(config.Data.Get("privatekey"))
|
||||
if err != nil {
|
||||
log.Printf("read key file: %s", err)
|
||||
return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR"))
|
||||
}
|
||||
|
||||
block, _ := pem.Decode(pemData)
|
||||
if block == nil {
|
||||
log.Printf("bad key data: %s", "not PEM-encoded")
|
||||
return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR"))
|
||||
}
|
||||
|
||||
if got, want := block.Type, "RSA PRIVATE KEY"; got != want {
|
||||
log.Printf("unknown key type %q, want %q", got, want)
|
||||
return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR"))
|
||||
}
|
||||
|
||||
// Decode the RSA private key
|
||||
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
||||
if err != nil {
|
||||
log.Printf("bad private key: %s", err)
|
||||
return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR"))
|
||||
}
|
||||
|
||||
passEncrypted, err := rsa.EncryptPKCS1v15(rand.Reader, &priv.PublicKey, []byte(publickey))
|
||||
if err != nil {
|
||||
log.Printf("decrypt: %s\n", err)
|
||||
return nil, fmt.Errorf(("DECRYPTION_FAILED"))
|
||||
}
|
||||
|
||||
if passEncrypted != nil {
|
||||
// log.Printf("hasil variable passEncrypted: %s\n", passEncrypted)
|
||||
}
|
||||
|
||||
if priv != nil {
|
||||
// log.Printf("hasil variable priv: %s\n", priv)
|
||||
}
|
||||
|
||||
// data yang akan di tampilkan
|
||||
q := `SELECT
|
||||
M_StaffID,
|
||||
M_StaffNIP,
|
||||
M_StaffName,
|
||||
M_StaffEmail,
|
||||
M_StaffNoHp,
|
||||
M_StaffIsActive,
|
||||
M_StaffIsLogin,
|
||||
M_StaffToken,
|
||||
M_StaffIDGoogleSignIn,
|
||||
M_StaffCreated,
|
||||
M_StaffLastUpdated
|
||||
FROM m_staff
|
||||
WHERE M_StaffIsActive = 'Y'
|
||||
AND M_StaffIDGoogleSignIn = ?
|
||||
AND M_StaffEmail = ?`
|
||||
|
||||
// row merupakan penerima yang akan dimasukkan langsung, menggunakan anotasi :=
|
||||
// id_google_sign_in, email merupakan binding parameter dari tanda tanya "?" di sql
|
||||
row := db.Handle.QueryRow(q, id_google_sign_in, email)
|
||||
db.LogSQL(q)
|
||||
|
||||
// row.Scan untuk mendapatkan field dari sql diatas
|
||||
// NOTE POSISI ROW SCAN HARUS SAMA PERSIS SEPERTI FIELD YANG AKAN DI RETURN
|
||||
err = row.Scan(
|
||||
&ret.StaffID,
|
||||
&ret.Nip,
|
||||
&ret.Name,
|
||||
&ret.Email,
|
||||
&ret.PhoneNumber,
|
||||
&ret.IsActive,
|
||||
&ret.IsLogin,
|
||||
&ret.Token,
|
||||
&ret.IDGoogleSignIn,
|
||||
&ret.CreatedAt,
|
||||
&ret.LastUpdatedAt,
|
||||
)
|
||||
|
||||
// check data
|
||||
|
||||
if err != nil {
|
||||
log.Printf("Error employee_id select: %v", err)
|
||||
log.Printf("Executing query: %s\n", q)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, fmt.Errorf("RECORD_STAFF_LOGIN_ATTENDANCE_NOT_FOUND")
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// hasil return nya
|
||||
return &ret, err
|
||||
}
|
||||
Reference in New Issue
Block a user