143 lines
3.6 KiB
Go
143 lines
3.6 KiB
Go
package aaaa
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/go-resty/resty/v2"
|
|
|
|
"nms_cxy/lib/dborm"
|
|
"nms_cxy/lib/log"
|
|
"nms_cxy/lib/oauth"
|
|
"nms_cxy/lib/services"
|
|
"nms_cxy/omc/config"
|
|
)
|
|
|
|
var (
|
|
UriAAAASSO = config.DefaultUriPrefix + "/aaaa/{apiVersion}/security/sso" // for 4A external
|
|
|
|
CustomUriAAAASSO = config.UriPrefix + "/aaaa/{apiVersion}/security/sso" // for 4A external
|
|
)
|
|
|
|
var client = resty.New()
|
|
|
|
func init() {
|
|
/*
|
|
client.
|
|
SetTimeout(10 * time.Second).
|
|
SetRetryCount(1).
|
|
SetRetryWaitTime(1 * time.Second).
|
|
SetRetryMaxWaitTime(2 * time.Second).
|
|
SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
|
|
return 0, errors.New("quota exceeded")
|
|
})
|
|
*/
|
|
client.SetTimeout(3 * time.Second)
|
|
}
|
|
|
|
type AAAATicket struct {
|
|
Ticket string `json:"ticket"`
|
|
}
|
|
|
|
type SSOResult struct {
|
|
SSO struct {
|
|
Result string `json:"result"`
|
|
ResultMsg string `json:"result_msg"`
|
|
Ticket string `json:"ticket"`
|
|
ResultMsgcode string `json:"result_msgcode"`
|
|
Account []struct {
|
|
Accid string `json:"accid"`
|
|
} `json:"account"`
|
|
} `json:"sso"`
|
|
}
|
|
|
|
// Get system state from NF/NFs
|
|
func GetSSOFromAAAA(w http.ResponseWriter, r *http.Request) {
|
|
log.Info("GetSSOFromAAAA processing... ")
|
|
|
|
vars := r.URL.Query()
|
|
ticket := vars["ticket"]
|
|
if len(ticket) == 0 {
|
|
services.ResponseNotFound404UriNotExist(w, r)
|
|
return
|
|
}
|
|
log.Debug("ticket:", ticket)
|
|
|
|
log.Debugf("r.RemoteAddr:%s r.Host: %s", r.RemoteAddr, r.Host)
|
|
|
|
aaaaIp := r.RemoteAddr[:strings.Index(r.RemoteAddr, ":")]
|
|
omcIp := r.Host[:strings.Index(r.Host, ":")]
|
|
|
|
log.Debugf("aaaaIp=%s omcIp=%s", aaaaIp, omcIp)
|
|
requestURI2NF := fmt.Sprintf("http://%s:8080/qryUserByTicket", aaaaIp)
|
|
|
|
log.Debug("requestURI2NF:", requestURI2NF)
|
|
|
|
aaaaTicket := &AAAATicket{
|
|
Ticket: ticket[0],
|
|
}
|
|
|
|
body, err := json.Marshal(aaaaTicket)
|
|
if err != nil {
|
|
log.Error("Failed to json.Marshal:", err)
|
|
services.ResponseInternalServerError500ProcessError(w, err)
|
|
return
|
|
}
|
|
|
|
response, err := client.R().
|
|
EnableTrace().
|
|
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
|
|
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
|
SetBody(body).
|
|
Post(requestURI2NF)
|
|
if err != nil {
|
|
log.Error("Failed to Post:", err)
|
|
services.ResponseInternalServerError500ProcessError(w, err)
|
|
return
|
|
}
|
|
log.Debug("response:", response)
|
|
|
|
switch response.StatusCode() {
|
|
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
|
ssoResult := new(SSOResult)
|
|
json.Unmarshal(response.Body(), ssoResult)
|
|
var accid string
|
|
if len(ssoResult.SSO.Account) != 0 {
|
|
accid = ssoResult.SSO.Account[0].Accid
|
|
}
|
|
|
|
log.Debug("accid:", accid)
|
|
exist, err := dborm.XormIsExistUser(accid)
|
|
if err != nil {
|
|
services.ResponseInternalServerError500ProcessError(w, err)
|
|
return
|
|
}
|
|
token := oauth.GenRandToken("aaaa") // Generate new token to session ID
|
|
affected, err := dborm.XormInsertSession(accid, r.RemoteAddr, token,
|
|
config.GetExpiresFromConfig(), config.GetYamlConfig().Auth.Session)
|
|
if err != nil {
|
|
log.Error("Failed to XormInsertSession:", err)
|
|
if affected == -1 {
|
|
services.ResponseForbidden403MultiLoginNotAllowed(w)
|
|
} else {
|
|
services.ResponseBadRequest400IncorrectLogin(w)
|
|
}
|
|
return
|
|
}
|
|
if exist == true {
|
|
redirectUrl := fmt.Sprintf("http://%s:8888/home.html?user=%s&token=%s", omcIp, accid, token)
|
|
services.ResponseRedirect(w, redirectUrl, accid, token)
|
|
return
|
|
} else {
|
|
services.ResponseBadRequest400IncorrectLogin(w)
|
|
return
|
|
}
|
|
default:
|
|
services.ResponseForbidden403NotPermission(w)
|
|
return
|
|
}
|
|
}
|