2019-04-21 08:34:25 +08:00
|
|
|
package main
|
|
|
|
|
2019-04-21 11:25:35 +08:00
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2019-04-21 08:34:25 +08:00
|
|
|
type ssoPayload struct {
|
|
|
|
Domain string `json:"domain"`
|
|
|
|
Token string `json:"token"`
|
|
|
|
Email string `json:"email"`
|
|
|
|
Name string `json:"name"`
|
|
|
|
Link string `json:"link"`
|
|
|
|
Photo string `json:"photo"`
|
|
|
|
}
|
2019-04-21 11:25:35 +08:00
|
|
|
|
|
|
|
func ssoTokenNew(domain string, commenterToken string) (string, error) {
|
|
|
|
token, err := randomHex(32)
|
|
|
|
if err != nil {
|
|
|
|
logger.Errorf("error generating SSO token hex: %v", err)
|
|
|
|
return "", errorInternal
|
|
|
|
}
|
|
|
|
|
|
|
|
statement := `
|
|
|
|
INSERT INTO
|
|
|
|
ssoTokens (token, domain, commenterToken, creationDate)
|
|
|
|
VALUES ($1, $2, $3, $4 );
|
|
|
|
`
|
|
|
|
_, err = db.Exec(statement, token, domain, commenterToken, time.Now().UTC())
|
|
|
|
if err != nil {
|
|
|
|
logger.Errorf("error inserting SSO token: %v", err)
|
|
|
|
return "", errorInternal
|
|
|
|
}
|
|
|
|
|
|
|
|
return token, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func ssoTokenExtract(token string) (string, string, error) {
|
|
|
|
statement := `
|
|
|
|
SELECT domain, commenterToken
|
|
|
|
FROM ssoTokens
|
|
|
|
WHERE token = $1;
|
|
|
|
`
|
|
|
|
row := db.QueryRow(statement, token)
|
|
|
|
|
|
|
|
var domain string
|
|
|
|
var commenterToken string
|
|
|
|
if err := row.Scan(&domain, &commenterToken); err != nil {
|
|
|
|
return "", "", errorNoSuchToken
|
|
|
|
}
|
|
|
|
|
|
|
|
statement = `
|
|
|
|
DELETE FROM ssoTokens
|
|
|
|
WHERE token = $1;
|
|
|
|
`
|
|
|
|
if _, err := db.Exec(statement, token); err != nil {
|
|
|
|
logger.Errorf("cannot delete SSO token after usage: %v", err)
|
|
|
|
return "", "", errorInternal
|
|
|
|
}
|
|
|
|
|
|
|
|
return domain, commenterToken, nil
|
|
|
|
}
|