Compare commits

...

10 Commits

6 changed files with 118 additions and 305 deletions

View File

@ -161,18 +161,21 @@ func (caller apiCaller) uploadAPI(w http.ResponseWriter, r *http.Request) error
func (caller apiCaller) blockAPI(w http.ResponseWriter, r *http.Request) error {
mg := caller.mg
logger.Println("blockAPI :", r.Method)
if r.Method == "GET" {
switch r.Method {
case "GET":
target, ok := gocommon.ReadObjectIDFormValue(r.Form, "accid")
logger.Println("Get :", target, ok)
if !ok {
// 페이지네이션 해야할 듯
json.NewEncoder(w).Encode(mg.bl.all())
//json.NewEncoder(w).Encode(mg.bl.all())
} else if !target.IsZero() {
if blocked, ok := mg.bl.get(target); ok && blocked != nil {
var blocked []blockinfo
if err := caller.mg.mongoClient.FindAllAs(CollectionBlock, bson.M{
"accid": target,
}, &blocked); err == nil {
json.NewEncoder(w).Encode(blocked)
}
}
} else if r.Method == "PUT" {
case "PUT":
var targets struct {
Start primitive.DateTime
End primitive.DateTime
@ -189,22 +192,15 @@ func (caller apiCaller) blockAPI(w http.ResponseWriter, r *http.Request) error {
Meta: meta,
}
_, _, err := mg.mongoClient.Update(CollectionBlock, bson.M{
"_id": accid,
}, bson.M{
"$set": &bi,
}, options.Update().SetUpsert(true))
_, err := mg.mongoClient.Collection(CollectionBlock).InsertOne(r.Context(), bi)
if err != nil {
logger.Println("account is not blocked. err :", err)
} else {
logger.Println("account is blocked :", meta)
bi.Accid = accid
caller.mg.bl.add(&bi)
mg.sessionProvider.RevokeAll(accid)
}
}
} else if r.Method == "DELETE" {
case "DELETE":
id := r.URL.Query().Get("id")
if len(id) == 0 {
@ -215,29 +211,21 @@ func (caller apiCaller) blockAPI(w http.ResponseWriter, r *http.Request) error {
return err
}
_, _, err = mg.mongoClient.Update(CollectionBlock, bson.M{
"_id": idobj,
}, bson.M{
"$currentDate": bson.M{
"_ts": bson.M{"$type": "date"},
},
}, options.Update().SetUpsert(false))
if err != nil {
return err
}
caller.mg.bl.remove(idobj)
mg.mongoClient.Delete(CollectionBlock, bson.M{"_id": idobj})
}
return nil
}
func (caller apiCaller) whitelistAPI(w http.ResponseWriter, r *http.Request) error {
mg := caller.mg
if r.Method == "GET" {
enc := json.NewEncoder(w)
enc.Encode(mg.wl.all())
} else if r.Method == "PUT" {
switch r.Method {
case "GET":
var all []whitelistmember
if err := mg.mongoClient.AllAs(CollectionWhitelist, &all); err == nil {
enc := json.NewEncoder(w)
enc.Encode(all)
}
case "PUT":
body, _ := io.ReadAll(r.Body)
var member whitelistmember
if err := json.Unmarshal(body, &member); err != nil {
@ -254,7 +242,7 @@ func (caller apiCaller) whitelistAPI(w http.ResponseWriter, r *http.Request) err
if err != nil {
return err
}
} else if r.Method == "DELETE" {
case "DELETE":
id := r.URL.Query().Get("id")
if len(id) == 0 {

View File

@ -148,8 +148,6 @@ type Maingate struct {
//services servicelist
serviceptr unsafe.Pointer
admins unsafe.Pointer
wl memberContainerPtr[string, *whitelistmember]
bl memberContainerPtr[primitive.ObjectID, *blockinfo]
tokenEndpoints map[string]string
authorizationEndpoints map[string]string
@ -306,9 +304,12 @@ func (mg *Maingate) prepare(context context.Context) (err error) {
return logger.ErrorWithCallStack(err)
}
if err = mg.mongoClient.MakeUniqueIndices(CollectionLink, map[string]bson.D{
"emailplatform": {{Key: "email", Value: 1}, {Key: "platform", Value: 1}},
}); err != nil {
// if err = mg.mongoClient.MakeUniqueIndices(CollectionLink, map[string]bson.D{
// "emailplatform": {{Key: "email", Value: 1}, {Key: "platform", Value: 1}},
// }); err != nil {
// return logger.ErrorWithCallStack(err)
// }
if err = mg.mongoClient.DropIndex(CollectionLink, "emailplatform"); err != nil {
return logger.ErrorWithCallStack(err)
}
@ -342,7 +343,15 @@ func (mg *Maingate) prepare(context context.Context) (err error) {
mg.mongoClient.DropIndex(CollectionBlock, "codeaccid")
}
if err = mg.mongoClient.MakeExpireIndex(CollectionBlock, int32(3)); err != nil {
if _, err := mg.mongoClient.Collection(CollectionBlock).Indexes().DropOne(context, "_ts_1"); err == nil {
// 인덱스가 방금 지워졌다.
// 전체 document 제거
logger.Println(mg.mongoClient.Collection(CollectionBlock).Drop(context))
}
if err = mg.mongoClient.MakeUniqueIndices(CollectionBlock, map[string]bson.D{
"accidend": {{Key: "accid", Value: 1}, {Key: "end", Value: 1}},
}); err != nil {
return logger.ErrorWithCallStack(err)
}
@ -409,23 +418,6 @@ func (mg *Maingate) prepare(context context.Context) (err error) {
}
}
var whites []*whitelistmember
if err := mg.mongoClient.AllAs(CollectionWhitelist, &whites, options.Find().SetReturnKey(false)); err != nil {
return logger.ErrorWithCallStack(err)
}
mg.wl.init(whites)
var blocks []*blockinfo
if err := mg.mongoClient.AllAs(CollectionBlock, &blocks); err != nil {
return logger.ErrorWithCallStack(err)
}
logger.Println("allblocks :", blocks)
mg.bl.init(blocks)
go mg.wl.watchCollection(context, CollectionWhitelist, mg.mongoClient)
go mg.bl.watchCollection(context, CollectionBlock, mg.mongoClient)
return nil
}

View File

@ -1,159 +0,0 @@
package core
import (
"context"
"sync/atomic"
"time"
"unsafe"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"repositories.action2quare.com/ayo/gocommon"
"repositories.action2quare.com/ayo/gocommon/logger"
)
type memberContraints[K comparable] interface {
Key() K
Expired() bool
}
type memberContainerPtr[K comparable, T memberContraints[K]] struct {
ptr unsafe.Pointer
}
func (p *memberContainerPtr[K, T]) init(ms []T) {
next := map[K]T{}
for _, m := range ms {
next[m.Key()] = m
}
atomic.StorePointer(&p.ptr, unsafe.Pointer(&next))
}
func (p *memberContainerPtr[K, T]) add(m T) {
ptr := atomic.LoadPointer(&p.ptr)
src := (*map[K]T)(ptr)
next := map[K]T{}
for k, v := range *src {
next[k] = v
}
next[m.Key()] = m
atomic.StorePointer(&p.ptr, unsafe.Pointer(&next))
}
func (p *memberContainerPtr[K, T]) get(key K) (T, bool) {
ptr := atomic.LoadPointer(&p.ptr)
src := (*map[K]T)(ptr)
out, found := (*src)[key]
return out, found
}
func (p *memberContainerPtr[K, T]) remove(key K) {
ptr := atomic.LoadPointer(&p.ptr)
src := (*map[K]T)(ptr)
next := map[K]T{}
for k, v := range *src {
next[k] = v
}
delete(next, key)
atomic.StorePointer(&p.ptr, unsafe.Pointer(&next))
}
type memberPipelineDocument[K comparable, T memberContraints[K]] struct {
OperationType string `bson:"operationType"`
DocumentKey struct {
Id primitive.ObjectID `bson:"_id"`
} `bson:"documentKey"`
Member T `bson:"fullDocument"`
}
func (p *memberContainerPtr[K, T]) all() []T {
ptr := atomic.LoadPointer(&p.ptr)
src := (*map[K]T)(ptr)
out := make([]T, 0, len(*src))
for _, m := range *src {
if m.Expired() {
continue
}
out = append(out, m)
}
return out
}
func (p *memberContainerPtr[K, T]) watchCollection(parentctx context.Context, coll gocommon.CollectionName, mc gocommon.MongoClient) {
defer func() {
s := recover()
if s != nil {
logger.Error(s)
}
}()
matchStage := bson.D{
{
Key: "$match", Value: bson.D{
{Key: "operationType", Value: bson.D{
{Key: "$in", Value: bson.A{
"update",
"insert",
}},
}},
},
}}
projectStage := bson.D{
{
Key: "$project", Value: bson.D{
{Key: "documentKey", Value: 1},
{Key: "fullDocument", Value: 1},
},
},
}
var stream *mongo.ChangeStream
var err error
var ctx context.Context
for {
if stream == nil {
stream, err = mc.Watch(coll, mongo.Pipeline{matchStage, projectStage})
if err != nil {
logger.Error("watchCollection watch failed :", err)
time.Sleep(time.Minute)
continue
}
ctx = context.TODO()
}
changed := stream.TryNext(ctx)
if ctx.Err() != nil {
logger.Error("watchCollection stream.TryNext failed. process should be restarted! :", ctx.Err().Error())
break
}
if changed {
var data memberPipelineDocument[K, T]
if err := stream.Decode(&data); err == nil {
p.add(data.Member)
} else {
logger.Error("watchCollection stream.Decode failed :", err)
}
} else if stream.Err() != nil || stream.ID() == 0 {
select {
case <-ctx.Done():
logger.Println("watchCollection is done")
stream.Close(ctx)
return
case <-time.After(time.Second):
logger.Error("watchCollection stream error :", stream.Err())
stream.Close(ctx)
stream = nil
}
} else {
time.Sleep(time.Second)
}
}
}

View File

@ -22,26 +22,23 @@ import (
)
type blockinfo struct {
Id primitive.ObjectID `bson:"_id" json:"_id"`
Start primitive.DateTime `bson:"start" json:"start"`
End primitive.DateTime `bson:"_ts" json:"_ts"`
Accid primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
End primitive.DateTime `bson:"end" json:"end"`
Accid primitive.ObjectID `bson:"accid,omitempty" json:"accid,omitempty"`
Meta primitive.M `bson:"meta,omitempty" json:"meta,omitempty"`
}
type whitelistmember struct {
Id primitive.ObjectID `bson:"_id" json:"_id"`
Email string `bson:"email" json:"email"`
Alias string `bson:"alias" json:"alias"`
Platform string `bson:"platform" json:"platform"`
Desc string `bson:"desc" json:"desc"`
ExpiredAt primitive.DateTime `bson:"_ts,omitempty" json:"_ts,omitempty"`
}
func (wh *whitelistmember) Key() string {
if strings.HasPrefix(wh.Email, "*@") {
// 도메인 전체 허용
return wh.Email[2:]
}
return wh.Email
return wh.Alias
}
func (wh *whitelistmember) Expired() bool {
@ -103,8 +100,6 @@ type serviceDescription struct {
VersionSplits map[string]string `bson:"version_splits" json:"version_splits"`
sessionProvider session.Provider
wl *memberContainerPtr[string, *whitelistmember]
bl *memberContainerPtr[primitive.ObjectID, *blockinfo]
mongoClient gocommon.MongoClient
sessionTTL time.Duration
@ -268,9 +263,6 @@ func (sh *serviceDescription) prepare(mg *Maingate) error {
}
}
}
sh.wl = &mg.wl
sh.bl = &mg.bl
sh.serviceSerialized, _ = json.Marshal(sh)
return nil
@ -307,7 +299,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
bfinfo, err := sh.getUserBrowserInfo(r)
if err != nil {
logger.Error("getUserBrowserInfo failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -316,7 +308,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
if !guestlink {
_, err = sh.readProfile(oldType, oldId, bfinfo)
if err != nil {
logger.Error("readProfile(old) failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -326,7 +318,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
oldType, oldId, err = sh.getProviderInfo(oldType, oldId)
if err != nil {
logger.Error("getProviderInfo failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -349,9 +341,10 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
return
}
email, err := sh.readProfile(newType, newId, bfinfo)
//email, err := sh.readProfile(newType, newId, bfinfo)
_, err = sh.readProfile(newType, newId, bfinfo)
if err != nil {
logger.Error("readProfile(new) failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -364,14 +357,14 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
newType, newId, err = sh.getProviderInfo(newType, newId)
if err != nil {
logger.Error("getProviderInfo failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
found, err := sh.mongoClient.FindOne(CollectionLink, bson.M{"platform": newType, "uid": newId}, options.FindOne())
if err != nil {
logger.Error("link failed. FindOne err:", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -388,11 +381,11 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
}, bson.M{
"$setOnInsert": bson.M{
"create": createtime,
"email": email,
//"email": email,
},
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"_id": 1}))
if err != nil {
logger.Error("link failed. FindOneAndUpdate link err:", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -406,7 +399,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
},
}, options.Update().SetUpsert(true))
if err != nil {
logger.Error("link failed. Update ServiceName err :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -490,7 +483,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
"_id": 1,
}))
if err != nil {
logger.Error("unlink failed, fail to count accounts :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
}
@ -510,7 +503,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
"_id": bson.M{"$in": ids},
}, options.FindOneAndDelete().SetProjection(bson.M{"_id": 1}))
if err != nil {
logger.Error("link failed. FindOneAndUpdate link err:", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -519,7 +512,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
"_id": link["_id"].(primitive.ObjectID),
}, options.FindOneAndDelete().SetProjection(bson.M{"_id": 1}))
if err != nil {
logger.Error("unlink failed. Delete ServiceName err :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -569,7 +562,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
sType, sId, err = sh.getProviderInfo(sType, sId)
if err != nil {
logger.Error("getProviderInfo failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -586,7 +579,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
"_id": 1,
}))
if err != nil {
logger.Error("linkinfo failed. CountDocuments err :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -602,7 +595,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
platformName: 1,
}))
if err != nil {
logger.Error("linkinfo failed. FindAll returns err :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -614,7 +607,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
linkbytes, err := json.Marshal(linkstrs)
if err != nil {
logger.Error("linkinfo failed. json marshal fail :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -638,16 +631,22 @@ func (sh *serviceDescription) emailinfo(w http.ResponseWriter, r *http.Request)
}
queryvals := r.URL.Query()
sk := queryvals.Get("sk")
reqauthtype := queryvals.Get("type")
uid := queryvals.Get("id")
authInfo, err := sh.sessionProvider.Query(sk)
bfinfo, err := sh.getUserBrowserInfo(r)
if err != nil {
logger.Println("sessionProvider.Query return err :", err)
w.WriteHeader(http.StatusInternalServerError)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
email := authInfo.Email
email, err := sh.readProfile(reqauthtype, uid, bfinfo)
if err != nil {
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
if strings.HasPrefix(email, "__dummy_") && strings.HasSuffix(email, "temp__") {
email = ""
@ -663,22 +662,12 @@ func (sh *serviceDescription) emailinfo(w http.ResponseWriter, r *http.Request)
//logger.Println("Email :", email)
w.Write([]byte(fmt.Sprintf(`{"email":"%s"}`, email)))
}
func (sh *serviceDescription) authorize_dev(w http.ResponseWriter, r *http.Request) {
if r.Method == "DELETE" {
sk := r.Header.Get("AS-X-SESSION")
if authinfo, err := sh.sessionProvider.Query(sk); err == nil {
bt := r.Header.Get("AS-X-BLOCK")
if len(bt) > 0 {
dur, _ := strconv.ParseInt(bt, 10, 0)
sh.bl.add(&blockinfo{
Start: primitive.NewDateTimeFromTime(time.Now().UTC()),
End: primitive.NewDateTimeFromTime(time.Now().UTC().Add(time.Second * time.Duration(dur))),
Accid: authinfo.Account,
})
}
sh.sessionProvider.RevokeAll(authinfo.Account)
}
@ -704,7 +693,6 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
queryvals := r.URL.Query()
reqauthtype := queryvals.Get("type")
uid := queryvals.Get("id")
sk := queryvals.Get("sk")
checksum := r.Header.Get("AS-X-CHECKSUM")
if len(checksum) > 0 || sh.mustUseChecksum {
@ -712,7 +700,7 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
cookie := r.Header.Get("Cookie")
h := md5.New()
h.Write([]byte(cookie + nonce + sk))
h.Write([]byte(cookie + nonce))
if checksum != hex.EncodeToString(h.Sum(nil)) {
w.WriteHeader(http.StatusBadRequest)
@ -720,47 +708,27 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
}
}
if len(sk) > 0 {
success, err := sh.sessionProvider.Touch(sk)
if err != nil {
logger.Error("authorize failed. sessionProvider.Touch err:", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
// !success일 때 빈 body를 보내면 클라이언트는 로그아웃 된다.
if success {
json.NewEncoder(w).Encode(map[string]any{
"sk": sk,
"expirein": sh.sessionTTL.Seconds(),
})
} else {
w.WriteHeader(http.StatusUnauthorized)
}
return
}
var email string
if !*noauth && (*authtype == "on" || *authtype == "both") {
if len(reqauthtype) > 0 {
//email, err := sh.readProfile(authtype, uid, accesstoken)
bfinfo, err := sh.getUserBrowserInfo(r)
if err != nil {
logger.Error("getUserBrowserInfo failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
email, err = sh.readProfile(reqauthtype, uid, bfinfo)
if err != nil {
logger.Error("readProfile failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
newType, newId, err := sh.getProviderInfo(reqauthtype, uid)
if err != nil {
logger.Error("getProviderInfo failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -789,11 +757,11 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
}, bson.M{
"$setOnInsert": bson.M{
"create": createtime,
"email": email,
//"email": email,
},
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"_id": 1, "_ts": 1}))
if err != nil {
logger.Error("authorize failed :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -809,7 +777,7 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
},
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"accid": 1, "create": 1}))
if err != nil {
logger.Error("authorize failed. Update sh.ServiceName err:", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -818,7 +786,8 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
oldcreate := account["create"].(primitive.DateTime)
newaccount := oldcreate == createtime
if bi, ok := sh.bl.get(accid); ok {
var bi blockinfo
if err := sh.mongoClient.FindOneAs(CollectionBlock, bson.M{"accid": accid, "end": bson.M{"$gt": time.Now().UTC()}}, &bi); err == nil {
// 블럭된 계정. 블락 정보를 알려준다.
w.Header().Add("MG-ACCOUNTBLOCK-START", strconv.FormatInt(bi.Start.Time().Unix(), 10))
w.Header().Add("MG-ACCOUNTBLOCK-END", strconv.FormatInt(bi.End.Time().Unix(), 10))
@ -826,14 +795,19 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
return
}
sk, err = sh.sessionProvider.New(&session.Authorization{
alias := r.Header.Get("AS-X-ALIAS")
if len(alias) == 0 {
alias = email
}
sk, err := sh.sessionProvider.New(&session.Authorization{
Account: accid,
Platform: reqauthtype,
Uid: uid,
Email: email,
Alias: alias,
})
if err != nil {
logger.Error("authorize failed. sessionProvider.New err:", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -902,7 +876,7 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
if !*devflag || len(sType) != 0 {
sType, sId, err = sh.getProviderInfo(sType, sId)
if err != nil {
logger.Error("delacc failed. getProviderInfo err :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -916,7 +890,7 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
linkidMap, err := sh.mongoClient.FindAll(CollectionAccount, bson.M{"accid": authInfo.Account}, options.Find().SetProjection(bson.M{"_id": 1}))
if err != nil {
logger.Error("delacc failed. FindAll account err :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -947,7 +921,7 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
delfilter["platform"] = sType
targetLinkId, err := sh.mongoClient.FindAll(CollectionLink, delfilter, options.Find().SetProjection(bson.M{"_id": 1}))
if len(targetLinkId) != 1 {
logger.Error("delacc failed. FindAll link err :", err)
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -956,15 +930,25 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
delop = primitive.M{"$unset": primitive.M{"_ts": true}}
}
updated, _, err := sh.mongoClient.Update(CollectionAccount, delfilter, delop, options.Update().SetUpsert(false))
if !updated || err != nil {
logger.Error("delacc failed. Update CollectionAccount timestamp err :", err)
if err != nil {
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
if !updated {
logger.Error("delacc failed. Update CollectionAccount timestamp. undated is false")
w.WriteHeader(http.StatusInternalServerError)
return
}
updated, _, err = sh.mongoClient.Update(CollectionLink, delfilter, delop, options.Update().SetUpsert(false))
if !updated || err != nil {
logger.Error("delacc failed. Update CollectionLink timestamp err :", err)
if err != nil {
logger.ErrorWithCallStack(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
if !updated {
logger.Error("delacc failed. Update CollectionLink timestamp. updated is false")
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -1062,7 +1046,11 @@ func (sh *serviceDescription) serveHTTP(w http.ResponseWriter, r *http.Request)
divname := queryvals.Get("div")
divname = strings.Trim(divname, `"`)
div := sh.Divisions[divname]
div, ok := sh.Divisions[divname]
if !ok {
div = sh.Divisions["default"]
}
var addrresp []byte
if div != nil {
logger.Println("/addr :", divname, div.State)
@ -1080,12 +1068,14 @@ func (sh *serviceDescription) serveHTTP(w http.ResponseWriter, r *http.Request)
return
}
wm := &whitelistmember{Email: authInfo.Email, Platform: authInfo.Platform}
if _, ok := sh.wl.get(wm.Key()); ok {
wm := &whitelistmember{Alias: authInfo.Alias, Platform: authInfo.Platform}
doc, err := sh.mongoClient.FindOne(CollectionWhitelist, bson.M{"alias": wm.Key()})
if err == nil && doc != nil {
// qa 권한이면 입장 가능
addrresp = div.urlsSerialized
} else if div.Maintenance != nil {
// 권한이 없으므로 공지
addrresp = []byte(fmt.Sprintf(`{"notice":"%s"}`, div.Maintenance.link))
} else {
logger.Println("div.Maintenance is nil :", divname)
}

6
go.mod
View File

@ -1,13 +1,15 @@
module repositories.action2quare.com/ayo/maingate
go 1.19
go 1.22.1
require (
firebase.google.com/go v3.13.0+incompatible
github.com/golang-jwt/jwt v3.2.2+incompatible
go.mongodb.org/mongo-driver v1.11.7
google.golang.org/api v0.157.0
repositories.action2quare.com/ayo/gocommon v0.0.0-20240731015107-899bae335ee1
repositories.action2quare.com/ayo/gocommon v0.0.0-20240806115838-ca5632031c86
)
require (

4
go.sum
View File

@ -252,5 +252,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
repositories.action2quare.com/ayo/gocommon v0.0.0-20240731015107-899bae335ee1 h1:F69QHr4Qyr/z8tKw+gAHurGiiClwFoE+Xdmh3tZca9I=
repositories.action2quare.com/ayo/gocommon v0.0.0-20240731015107-899bae335ee1/go.mod h1:XA8+hQtUNh956T+kAbJKkUtMl5HUWj83knvdBvvPS5s=
repositories.action2quare.com/ayo/gocommon v0.0.0-20240806115838-ca5632031c86 h1:vP0mVST68cw14fI/af3Xp1ZQoYjkNGK4S0zji1BVfSI=
repositories.action2quare.com/ayo/gocommon v0.0.0-20240806115838-ca5632031c86/go.mod h1:XA8+hQtUNh956T+kAbJKkUtMl5HUWj83knvdBvvPS5s=