Compare commits
10 Commits
d6daa9bdba
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| c63c3ddd92 | |||
| 3c57cb833e | |||
| c82b52fae6 | |||
| 6660e465f2 | |||
| 7c41346f51 | |||
| cc6115f30c | |||
| 86c892f154 | |||
| 37f37899df | |||
| c9cd3720e9 | |||
| d1e677056d |
50
core/api.go
50
core/api.go
@ -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 {
|
func (caller apiCaller) blockAPI(w http.ResponseWriter, r *http.Request) error {
|
||||||
mg := caller.mg
|
mg := caller.mg
|
||||||
logger.Println("blockAPI :", r.Method)
|
logger.Println("blockAPI :", r.Method)
|
||||||
if r.Method == "GET" {
|
switch r.Method {
|
||||||
|
case "GET":
|
||||||
target, ok := gocommon.ReadObjectIDFormValue(r.Form, "accid")
|
target, ok := gocommon.ReadObjectIDFormValue(r.Form, "accid")
|
||||||
logger.Println("Get :", target, ok)
|
|
||||||
if !ok {
|
if !ok {
|
||||||
// 페이지네이션 해야할 듯
|
// 페이지네이션 해야할 듯
|
||||||
json.NewEncoder(w).Encode(mg.bl.all())
|
//json.NewEncoder(w).Encode(mg.bl.all())
|
||||||
} else if !target.IsZero() {
|
} 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)
|
json.NewEncoder(w).Encode(blocked)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if r.Method == "PUT" {
|
case "PUT":
|
||||||
var targets struct {
|
var targets struct {
|
||||||
Start primitive.DateTime
|
Start primitive.DateTime
|
||||||
End primitive.DateTime
|
End primitive.DateTime
|
||||||
@ -189,22 +192,15 @@ func (caller apiCaller) blockAPI(w http.ResponseWriter, r *http.Request) error {
|
|||||||
Meta: meta,
|
Meta: meta,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, err := mg.mongoClient.Update(CollectionBlock, bson.M{
|
_, err := mg.mongoClient.Collection(CollectionBlock).InsertOne(r.Context(), bi)
|
||||||
"_id": accid,
|
|
||||||
}, bson.M{
|
|
||||||
"$set": &bi,
|
|
||||||
}, options.Update().SetUpsert(true))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Println("account is not blocked. err :", err)
|
logger.Println("account is not blocked. err :", err)
|
||||||
} else {
|
} else {
|
||||||
logger.Println("account is blocked :", meta)
|
logger.Println("account is blocked :", meta)
|
||||||
|
|
||||||
bi.Accid = accid
|
|
||||||
caller.mg.bl.add(&bi)
|
|
||||||
mg.sessionProvider.RevokeAll(accid)
|
mg.sessionProvider.RevokeAll(accid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if r.Method == "DELETE" {
|
case "DELETE":
|
||||||
id := r.URL.Query().Get("id")
|
id := r.URL.Query().Get("id")
|
||||||
|
|
||||||
if len(id) == 0 {
|
if len(id) == 0 {
|
||||||
@ -215,29 +211,21 @@ func (caller apiCaller) blockAPI(w http.ResponseWriter, r *http.Request) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, err = mg.mongoClient.Update(CollectionBlock, bson.M{
|
mg.mongoClient.Delete(CollectionBlock, bson.M{"_id": idobj})
|
||||||
"_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)
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (caller apiCaller) whitelistAPI(w http.ResponseWriter, r *http.Request) error {
|
func (caller apiCaller) whitelistAPI(w http.ResponseWriter, r *http.Request) error {
|
||||||
mg := caller.mg
|
mg := caller.mg
|
||||||
if r.Method == "GET" {
|
switch r.Method {
|
||||||
|
case "GET":
|
||||||
|
var all []whitelistmember
|
||||||
|
if err := mg.mongoClient.AllAs(CollectionWhitelist, &all); err == nil {
|
||||||
enc := json.NewEncoder(w)
|
enc := json.NewEncoder(w)
|
||||||
enc.Encode(mg.wl.all())
|
enc.Encode(all)
|
||||||
} else if r.Method == "PUT" {
|
}
|
||||||
|
case "PUT":
|
||||||
body, _ := io.ReadAll(r.Body)
|
body, _ := io.ReadAll(r.Body)
|
||||||
var member whitelistmember
|
var member whitelistmember
|
||||||
if err := json.Unmarshal(body, &member); err != nil {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if r.Method == "DELETE" {
|
case "DELETE":
|
||||||
id := r.URL.Query().Get("id")
|
id := r.URL.Query().Get("id")
|
||||||
|
|
||||||
if len(id) == 0 {
|
if len(id) == 0 {
|
||||||
|
|||||||
@ -148,8 +148,6 @@ type Maingate struct {
|
|||||||
//services servicelist
|
//services servicelist
|
||||||
serviceptr unsafe.Pointer
|
serviceptr unsafe.Pointer
|
||||||
admins unsafe.Pointer
|
admins unsafe.Pointer
|
||||||
wl memberContainerPtr[string, *whitelistmember]
|
|
||||||
bl memberContainerPtr[primitive.ObjectID, *blockinfo]
|
|
||||||
|
|
||||||
tokenEndpoints map[string]string
|
tokenEndpoints map[string]string
|
||||||
authorizationEndpoints map[string]string
|
authorizationEndpoints map[string]string
|
||||||
@ -306,9 +304,12 @@ func (mg *Maingate) prepare(context context.Context) (err error) {
|
|||||||
return logger.ErrorWithCallStack(err)
|
return logger.ErrorWithCallStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = mg.mongoClient.MakeUniqueIndices(CollectionLink, map[string]bson.D{
|
// if err = mg.mongoClient.MakeUniqueIndices(CollectionLink, map[string]bson.D{
|
||||||
"emailplatform": {{Key: "email", Value: 1}, {Key: "platform", Value: 1}},
|
// "emailplatform": {{Key: "email", Value: 1}, {Key: "platform", Value: 1}},
|
||||||
}); err != nil {
|
// }); err != nil {
|
||||||
|
// return logger.ErrorWithCallStack(err)
|
||||||
|
// }
|
||||||
|
if err = mg.mongoClient.DropIndex(CollectionLink, "emailplatform"); err != nil {
|
||||||
return logger.ErrorWithCallStack(err)
|
return logger.ErrorWithCallStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,7 +343,15 @@ func (mg *Maingate) prepare(context context.Context) (err error) {
|
|||||||
mg.mongoClient.DropIndex(CollectionBlock, "codeaccid")
|
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)
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
164
core/service.go
164
core/service.go
@ -22,26 +22,23 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type blockinfo struct {
|
type blockinfo struct {
|
||||||
|
Id primitive.ObjectID `bson:"_id" json:"_id"`
|
||||||
Start primitive.DateTime `bson:"start" json:"start"`
|
Start primitive.DateTime `bson:"start" json:"start"`
|
||||||
End primitive.DateTime `bson:"_ts" json:"_ts"`
|
End primitive.DateTime `bson:"end" json:"end"`
|
||||||
Accid primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
|
Accid primitive.ObjectID `bson:"accid,omitempty" json:"accid,omitempty"`
|
||||||
Meta primitive.M `bson:"meta,omitempty" json:"meta,omitempty"`
|
Meta primitive.M `bson:"meta,omitempty" json:"meta,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type whitelistmember struct {
|
type whitelistmember struct {
|
||||||
Id primitive.ObjectID `bson:"_id" json:"_id"`
|
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"`
|
Platform string `bson:"platform" json:"platform"`
|
||||||
Desc string `bson:"desc" json:"desc"`
|
Desc string `bson:"desc" json:"desc"`
|
||||||
ExpiredAt primitive.DateTime `bson:"_ts,omitempty" json:"_ts,omitempty"`
|
ExpiredAt primitive.DateTime `bson:"_ts,omitempty" json:"_ts,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wh *whitelistmember) Key() string {
|
func (wh *whitelistmember) Key() string {
|
||||||
if strings.HasPrefix(wh.Email, "*@") {
|
return wh.Alias
|
||||||
// 도메인 전체 허용
|
|
||||||
return wh.Email[2:]
|
|
||||||
}
|
|
||||||
return wh.Email
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wh *whitelistmember) Expired() bool {
|
func (wh *whitelistmember) Expired() bool {
|
||||||
@ -103,8 +100,6 @@ type serviceDescription struct {
|
|||||||
VersionSplits map[string]string `bson:"version_splits" json:"version_splits"`
|
VersionSplits map[string]string `bson:"version_splits" json:"version_splits"`
|
||||||
|
|
||||||
sessionProvider session.Provider
|
sessionProvider session.Provider
|
||||||
wl *memberContainerPtr[string, *whitelistmember]
|
|
||||||
bl *memberContainerPtr[primitive.ObjectID, *blockinfo]
|
|
||||||
mongoClient gocommon.MongoClient
|
mongoClient gocommon.MongoClient
|
||||||
sessionTTL time.Duration
|
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)
|
sh.serviceSerialized, _ = json.Marshal(sh)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -307,7 +299,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
bfinfo, err := sh.getUserBrowserInfo(r)
|
bfinfo, err := sh.getUserBrowserInfo(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("getUserBrowserInfo failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -316,7 +308,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
|
|||||||
if !guestlink {
|
if !guestlink {
|
||||||
_, err = sh.readProfile(oldType, oldId, bfinfo)
|
_, err = sh.readProfile(oldType, oldId, bfinfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("readProfile(old) failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -326,7 +318,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
oldType, oldId, err = sh.getProviderInfo(oldType, oldId)
|
oldType, oldId, err = sh.getProviderInfo(oldType, oldId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("getProviderInfo failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -349,9 +341,10 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
email, err := sh.readProfile(newType, newId, bfinfo)
|
//email, err := sh.readProfile(newType, newId, bfinfo)
|
||||||
|
_, err = sh.readProfile(newType, newId, bfinfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("readProfile(new) failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -364,14 +357,14 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
newType, newId, err = sh.getProviderInfo(newType, newId)
|
newType, newId, err = sh.getProviderInfo(newType, newId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("getProviderInfo failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
found, err := sh.mongoClient.FindOne(CollectionLink, bson.M{"platform": newType, "uid": newId}, options.FindOne())
|
found, err := sh.mongoClient.FindOne(CollectionLink, bson.M{"platform": newType, "uid": newId}, options.FindOne())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("link failed. FindOne err:", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -388,11 +381,11 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
|
|||||||
}, bson.M{
|
}, bson.M{
|
||||||
"$setOnInsert": bson.M{
|
"$setOnInsert": bson.M{
|
||||||
"create": createtime,
|
"create": createtime,
|
||||||
"email": email,
|
//"email": email,
|
||||||
},
|
},
|
||||||
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"_id": 1}))
|
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"_id": 1}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("link failed. FindOneAndUpdate link err:", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -406,7 +399,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
|
|||||||
},
|
},
|
||||||
}, options.Update().SetUpsert(true))
|
}, options.Update().SetUpsert(true))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("link failed. Update ServiceName err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -490,7 +483,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
|
|||||||
"_id": 1,
|
"_id": 1,
|
||||||
}))
|
}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("unlink failed, fail to count accounts :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -510,7 +503,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
|
|||||||
"_id": bson.M{"$in": ids},
|
"_id": bson.M{"$in": ids},
|
||||||
}, options.FindOneAndDelete().SetProjection(bson.M{"_id": 1}))
|
}, options.FindOneAndDelete().SetProjection(bson.M{"_id": 1}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("link failed. FindOneAndUpdate link err:", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -519,7 +512,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
|
|||||||
"_id": link["_id"].(primitive.ObjectID),
|
"_id": link["_id"].(primitive.ObjectID),
|
||||||
}, options.FindOneAndDelete().SetProjection(bson.M{"_id": 1}))
|
}, options.FindOneAndDelete().SetProjection(bson.M{"_id": 1}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("unlink failed. Delete ServiceName err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -569,7 +562,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
sType, sId, err = sh.getProviderInfo(sType, sId)
|
sType, sId, err = sh.getProviderInfo(sType, sId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("getProviderInfo failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -586,7 +579,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
"_id": 1,
|
"_id": 1,
|
||||||
}))
|
}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("linkinfo failed. CountDocuments err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -602,7 +595,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
platformName: 1,
|
platformName: 1,
|
||||||
}))
|
}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("linkinfo failed. FindAll returns err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -614,7 +607,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
linkbytes, err := json.Marshal(linkstrs)
|
linkbytes, err := json.Marshal(linkstrs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("linkinfo failed. json marshal fail :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -638,16 +631,22 @@ func (sh *serviceDescription) emailinfo(w http.ResponseWriter, r *http.Request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
queryvals := r.URL.Query()
|
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 {
|
if err != nil {
|
||||||
logger.Println("sessionProvider.Query return err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
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__") {
|
if strings.HasPrefix(email, "__dummy_") && strings.HasSuffix(email, "temp__") {
|
||||||
email = ""
|
email = ""
|
||||||
@ -663,22 +662,12 @@ func (sh *serviceDescription) emailinfo(w http.ResponseWriter, r *http.Request)
|
|||||||
//logger.Println("Email :", email)
|
//logger.Println("Email :", email)
|
||||||
|
|
||||||
w.Write([]byte(fmt.Sprintf(`{"email":"%s"}`, email)))
|
w.Write([]byte(fmt.Sprintf(`{"email":"%s"}`, email)))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sh *serviceDescription) authorize_dev(w http.ResponseWriter, r *http.Request) {
|
func (sh *serviceDescription) authorize_dev(w http.ResponseWriter, r *http.Request) {
|
||||||
if r.Method == "DELETE" {
|
if r.Method == "DELETE" {
|
||||||
sk := r.Header.Get("AS-X-SESSION")
|
sk := r.Header.Get("AS-X-SESSION")
|
||||||
if authinfo, err := sh.sessionProvider.Query(sk); err == nil {
|
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)
|
sh.sessionProvider.RevokeAll(authinfo.Account)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -704,7 +693,6 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
|
|||||||
queryvals := r.URL.Query()
|
queryvals := r.URL.Query()
|
||||||
reqauthtype := queryvals.Get("type")
|
reqauthtype := queryvals.Get("type")
|
||||||
uid := queryvals.Get("id")
|
uid := queryvals.Get("id")
|
||||||
sk := queryvals.Get("sk")
|
|
||||||
|
|
||||||
checksum := r.Header.Get("AS-X-CHECKSUM")
|
checksum := r.Header.Get("AS-X-CHECKSUM")
|
||||||
if len(checksum) > 0 || sh.mustUseChecksum {
|
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")
|
cookie := r.Header.Get("Cookie")
|
||||||
|
|
||||||
h := md5.New()
|
h := md5.New()
|
||||||
h.Write([]byte(cookie + nonce + sk))
|
h.Write([]byte(cookie + nonce))
|
||||||
|
|
||||||
if checksum != hex.EncodeToString(h.Sum(nil)) {
|
if checksum != hex.EncodeToString(h.Sum(nil)) {
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
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
|
var email string
|
||||||
if !*noauth && (*authtype == "on" || *authtype == "both") {
|
if !*noauth && (*authtype == "on" || *authtype == "both") {
|
||||||
if len(reqauthtype) > 0 {
|
if len(reqauthtype) > 0 {
|
||||||
//email, err := sh.readProfile(authtype, uid, accesstoken)
|
//email, err := sh.readProfile(authtype, uid, accesstoken)
|
||||||
bfinfo, err := sh.getUserBrowserInfo(r)
|
bfinfo, err := sh.getUserBrowserInfo(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("getUserBrowserInfo failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
email, err = sh.readProfile(reqauthtype, uid, bfinfo)
|
email, err = sh.readProfile(reqauthtype, uid, bfinfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("readProfile failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
newType, newId, err := sh.getProviderInfo(reqauthtype, uid)
|
newType, newId, err := sh.getProviderInfo(reqauthtype, uid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("getProviderInfo failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -789,11 +757,11 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
|
|||||||
}, bson.M{
|
}, bson.M{
|
||||||
"$setOnInsert": bson.M{
|
"$setOnInsert": bson.M{
|
||||||
"create": createtime,
|
"create": createtime,
|
||||||
"email": email,
|
//"email": email,
|
||||||
},
|
},
|
||||||
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"_id": 1, "_ts": 1}))
|
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"_id": 1, "_ts": 1}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("authorize failed :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
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}))
|
}, options.FindOneAndUpdate().SetReturnDocument(options.After).SetUpsert(true).SetProjection(bson.M{"accid": 1, "create": 1}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("authorize failed. Update sh.ServiceName err:", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -818,7 +786,8 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
|
|||||||
oldcreate := account["create"].(primitive.DateTime)
|
oldcreate := account["create"].(primitive.DateTime)
|
||||||
newaccount := oldcreate == createtime
|
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-START", strconv.FormatInt(bi.Start.Time().Unix(), 10))
|
||||||
w.Header().Add("MG-ACCOUNTBLOCK-END", strconv.FormatInt(bi.End.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
|
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,
|
Account: accid,
|
||||||
Platform: reqauthtype,
|
Platform: reqauthtype,
|
||||||
Uid: uid,
|
Uid: uid,
|
||||||
Email: email,
|
Alias: alias,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("authorize failed. sessionProvider.New err:", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -902,7 +876,7 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
|
|||||||
if !*devflag || len(sType) != 0 {
|
if !*devflag || len(sType) != 0 {
|
||||||
sType, sId, err = sh.getProviderInfo(sType, sId)
|
sType, sId, err = sh.getProviderInfo(sType, sId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("delacc failed. getProviderInfo err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
return
|
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}))
|
linkidMap, err := sh.mongoClient.FindAll(CollectionAccount, bson.M{"accid": authInfo.Account}, options.Find().SetProjection(bson.M{"_id": 1}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("delacc failed. FindAll account err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -947,7 +921,7 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
|
|||||||
delfilter["platform"] = sType
|
delfilter["platform"] = sType
|
||||||
targetLinkId, err := sh.mongoClient.FindAll(CollectionLink, delfilter, options.Find().SetProjection(bson.M{"_id": 1}))
|
targetLinkId, err := sh.mongoClient.FindAll(CollectionLink, delfilter, options.Find().SetProjection(bson.M{"_id": 1}))
|
||||||
if len(targetLinkId) != 1 {
|
if len(targetLinkId) != 1 {
|
||||||
logger.Error("delacc failed. FindAll link err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -956,15 +930,25 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
|
|||||||
delop = primitive.M{"$unset": primitive.M{"_ts": true}}
|
delop = primitive.M{"$unset": primitive.M{"_ts": true}}
|
||||||
}
|
}
|
||||||
updated, _, err := sh.mongoClient.Update(CollectionAccount, delfilter, delop, options.Update().SetUpsert(false))
|
updated, _, err := sh.mongoClient.Update(CollectionAccount, delfilter, delop, options.Update().SetUpsert(false))
|
||||||
if !updated || err != nil {
|
if err != nil {
|
||||||
logger.Error("delacc failed. Update CollectionAccount timestamp err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !updated {
|
||||||
|
logger.Error("delacc failed. Update CollectionAccount timestamp. undated is false")
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
updated, _, err = sh.mongoClient.Update(CollectionLink, delfilter, delop, options.Update().SetUpsert(false))
|
updated, _, err = sh.mongoClient.Update(CollectionLink, delfilter, delop, options.Update().SetUpsert(false))
|
||||||
if !updated || err != nil {
|
if err != nil {
|
||||||
logger.Error("delacc failed. Update CollectionLink timestamp err :", err)
|
logger.ErrorWithCallStack(err)
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !updated {
|
||||||
|
logger.Error("delacc failed. Update CollectionLink timestamp. updated is false")
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1062,7 +1046,11 @@ func (sh *serviceDescription) serveHTTP(w http.ResponseWriter, r *http.Request)
|
|||||||
|
|
||||||
divname := queryvals.Get("div")
|
divname := queryvals.Get("div")
|
||||||
divname = strings.Trim(divname, `"`)
|
divname = strings.Trim(divname, `"`)
|
||||||
div := sh.Divisions[divname]
|
div, ok := sh.Divisions[divname]
|
||||||
|
if !ok {
|
||||||
|
div = sh.Divisions["default"]
|
||||||
|
}
|
||||||
|
|
||||||
var addrresp []byte
|
var addrresp []byte
|
||||||
if div != nil {
|
if div != nil {
|
||||||
logger.Println("/addr :", divname, div.State)
|
logger.Println("/addr :", divname, div.State)
|
||||||
@ -1080,12 +1068,14 @@ func (sh *serviceDescription) serveHTTP(w http.ResponseWriter, r *http.Request)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
wm := &whitelistmember{Email: authInfo.Email, Platform: authInfo.Platform}
|
wm := &whitelistmember{Alias: authInfo.Alias, Platform: authInfo.Platform}
|
||||||
if _, ok := sh.wl.get(wm.Key()); ok {
|
doc, err := sh.mongoClient.FindOne(CollectionWhitelist, bson.M{"alias": wm.Key()})
|
||||||
|
if err == nil && doc != nil {
|
||||||
// qa 권한이면 입장 가능
|
// qa 권한이면 입장 가능
|
||||||
addrresp = div.urlsSerialized
|
addrresp = div.urlsSerialized
|
||||||
} else if div.Maintenance != nil {
|
} else if div.Maintenance != nil {
|
||||||
// 권한이 없으므로 공지
|
// 권한이 없으므로 공지
|
||||||
|
addrresp = []byte(fmt.Sprintf(`{"notice":"%s"}`, div.Maintenance.link))
|
||||||
} else {
|
} else {
|
||||||
logger.Println("div.Maintenance is nil :", divname)
|
logger.Println("div.Maintenance is nil :", divname)
|
||||||
}
|
}
|
||||||
|
|||||||
6
go.mod
6
go.mod
@ -1,13 +1,15 @@
|
|||||||
module repositories.action2quare.com/ayo/maingate
|
module repositories.action2quare.com/ayo/maingate
|
||||||
|
|
||||||
go 1.19
|
go 1.22.1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
firebase.google.com/go v3.13.0+incompatible
|
firebase.google.com/go v3.13.0+incompatible
|
||||||
github.com/golang-jwt/jwt v3.2.2+incompatible
|
github.com/golang-jwt/jwt v3.2.2+incompatible
|
||||||
go.mongodb.org/mongo-driver v1.11.7
|
go.mongodb.org/mongo-driver v1.11.7
|
||||||
google.golang.org/api v0.157.0
|
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 (
|
require (
|
||||||
|
|||||||
4
go.sum
4
go.sum
@ -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=
|
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-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/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-20240806115838-ca5632031c86 h1:vP0mVST68cw14fI/af3Xp1ZQoYjkNGK4S0zji1BVfSI=
|
||||||
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/go.mod h1:XA8+hQtUNh956T+kAbJKkUtMl5HUWj83knvdBvvPS5s=
|
||||||
|
|||||||
Reference in New Issue
Block a user