Newer
Older
package routebuildermdl
import (
"io/ioutil"
"mime/multipart"
"net/http"
"strings"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/authmdl/roleenforcemdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/loggermdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/authmdl/jwtmdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/servicebuildermdl"
func Init(o, r, c *gin.RouterGroup, JWTKey string) {
o.POST("/mql/login", loginHandler)
r.POST("/mql", RestrictedHandler)
c.POST("/mql", RoleBasedHandler)
jwtmdl.GlobalJWTKey = JWTKey
}
func setResponseHeader(serviceName string) responseData {
rd := responseData{}
val, ok := GetResponseHeader(serviceName)
if ok {
rd.ResponseHeader = val
}
return rd
}
func isMultipartRequest(header string) bool {
return strings.HasPrefix(header, "multipart/form-data")
}
func executeService(name string, data []byte, isForm bool, formData *multipart.Form, isRestricted, isRoleBased bool, principalObj servicebuildermdl.Principal) (interface{}, error) {
var service interface{}
var found bool
if isRestricted {
if isRoleBased {
service, found = roleBasedServices.Get(name)
} else {
service, found = restrictedServices.Get(name)
}
} else {
service, found = openServices.Get(name)
}
if !found {
loggermdl.LogError("Service Not Found: " + name)
return nil, errormdl.Wrap("Service Not Found: " + name)
}
if isForm {
serviceCache := service.(ServiceCache)
return serviceCache.FormService(formData, principalObj)
}
serviceCache := service.(ServiceCache)
if serviceCache.IsFormService {
loggermdl.LogError("FORM_HEADER_MISSING")
return nil, errormdl.Wrap("Form_Header_Missing")
return serviceCache.MasterService.Run(data, &principalObj)
return serviceCache.Service(&rs, principalObj)
func commonHandler(c *gin.Context, isRestricted, isRoleBased bool, principalObj servicebuildermdl.Principal) {
service := c.Request.Header.Get("Service-Header")
header := c.Request.Header.Get("Content-Type")
if isMultipartRequest(header) {
form, multiPartError := c.MultipartForm()
if errormdl.CheckErr(multiPartError) != nil {
responseDataObj.Error = errormdl.CheckErr(multiPartError).Error()
loggermdl.LogError(multiPartError)
c.JSON(http.StatusExpectationFailed, responseDataObj)
return
}
result, err := executeService(service, nil, true, form, isRestricted, isRoleBased, principalObj)
if errormdl.CheckErr1(err) != nil {
responseDataObj.Error = errormdl.CheckErr1(err).Error()
c.JSON(http.StatusExpectationFailed, responseDataObj)
return
}
responseDataObj.Result = result
c.JSON(http.StatusOK, responseDataObj)
return
}
var reqBody []byte
if c.Request.Body != nil {
var readError error
reqBody, readError = ioutil.ReadAll(c.Request.Body)
if errormdl.CheckErr2(readError) != nil {
responseDataObj.Error = errormdl.CheckErr2(readError).Error()
loggermdl.LogError(readError)
c.JSON(http.StatusExpectationFailed, responseDataObj)
return
}
result, err := executeService(service, reqBody, false, nil, isRestricted, isRoleBased, principalObj)
if errormdl.CheckErr3(err) != nil {
responseDataObj.Error = errormdl.CheckErr3(err).Error()
c.JSON(http.StatusExpectationFailed, responseDataObj)
return
}
responseDataObj.Result = result
c.JSON(http.StatusOK, responseDataObj)
return
}
commonHandler(c, false, false, servicebuildermdl.Principal{})
pricipalObj, extractError := extractPricipalObject(c)
if extractError != nil {
loggermdl.LogError(extractError)
c.JSON(http.StatusExpectationFailed, extractError.Error())
return
}
commonHandler(c, true, false, pricipalObj)
pricipalObj, extractError := extractPricipalObject(c)
if extractError != nil {
loggermdl.LogError(extractError)
c.JSON(http.StatusExpectationFailed, extractError.Error())
return
}
commonHandler(c, true, true, pricipalObj)
}
func extractPricipalObject(c *gin.Context) (servicebuildermdl.Principal, error) {
principal := servicebuildermdl.Principal{}
if jwtmdl.GlobalJWTKey == "" {
return principal, nil
}
claim, decodeError := jwtmdl.DecodeToken(c.Request)
if errormdl.CheckErr(decodeError) != nil {
loggermdl.LogError(decodeError)
return principal, errormdl.CheckErr(decodeError)
}
// ba, marshalError := ffjson.Marshal(claim)
// if errormdl.CheckErr(marshalError) != nil {
// return principal, errormdl.CheckErr(marshalError)
// }
// unmarshalError := ffjson.Unmarshal(ba, &principal)
// if errormdl.CheckErr(unmarshalError) != nil {
// return principal, errormdl.CheckErr(unmarshalError)
// }
// value, ok := gjson.ParseBytes(ba).Value().(servicebuildermdl.Principal)
// if !ok {
// return principal, errormdl.Wrap("Object is not of type principal")
// }
groups, grperr := roleenforcemdl.GetGroupNames(claim, "groups")
if errormdl.CheckErr(grperr) != nil {
loggermdl.LogError(grperr)
return principal, errormdl.CheckErr(grperr)
}
userID, ok := claim["userId"].(string)
if !ok || len(userID) < 2 {
loggermdl.LogError("Unable to parse UserID from JWT Token")
return principal, errormdl.Wrap("Unable to parse UserID from JWT Token")
}
principal.Groups = groups
principal.UserID = userID
return principal, nil
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
// loginHandler - for specially login
func loginHandler(c *gin.Context) {
if loginService == nil {
loggermdl.LogError("NO Login Service found")
c.JSON(http.StatusExpectationFailed, "NO Login Service found")
return
}
var reqBody []byte
if c.Request.Body != nil {
var readError error
reqBody, readError = ioutil.ReadAll(c.Request.Body)
if errormdl.CheckErr2(readError) != nil {
loggermdl.LogError(readError)
c.JSON(http.StatusExpectationFailed, readError.Error())
return
}
}
rs := gjson.ParseBytes(reqBody)
data, token, loginError := loginService(&rs, servicebuildermdl.Principal{})
if errormdl.CheckErr(loginError) != nil {
loggermdl.LogError(loginError)
c.JSON(http.StatusExpectationFailed, errormdl.CheckErr(loginError).Error())
return
}
c.Header("Authorization", token)
c.JSON(http.StatusOK, data)
}