Compare commits

..

11 Commits

Author SHA1 Message Date
e37a974d9c [이민권] 계정 삭제
- 계정 삭제 시, Firebase 정보 삭제
2024-01-12 12:31:21 +09:00
470591cb44 [이민권] 계정 삭제
- 계정 삭제 취소 기능 추가
2024-01-11 19:11:43 +09:00
38114769b3 [이민권] 계정 삭제
- 계정 삭제 취소 기능 추가
2024-01-11 12:54:48 +09:00
b05473a1c6 [이민권] 계정 삭제
- 계정 삭제 취소 기능 추가
2024-01-10 18:40:38 +09:00
0fff694e8a [이민권] 계정 삭제
- 계정 삭제 취소 기능 추가
2024-01-10 18:10:18 +09:00
d8713298c4 [이민권] 계정 삭제
- 계정 삭제 취소 기능 추가
2024-01-10 17:35:00 +09:00
763b0fc4bd [이민권] 계정 삭제
- 계정 삭제 취소 기능 추가
2024-01-10 17:28:24 +09:00
d8e18d7ffc [이민권] 서비스 준비
- 계정 삭제 시, TTL 적용
2024-01-09 19:56:57 +09:00
381f1edb80 [이민우] 정보가 아니라 주소갑이 나와서 수정 (대리 커밋) 2023-12-08 17:08:14 +09:00
a8e448b8ca 로그 정리 2023-10-30 17:25:39 +09:00
9b0e3a5d5b 모듈 정리 2023-10-30 17:25:31 +09:00
5 changed files with 93 additions and 41 deletions

View File

@ -1,6 +1,7 @@
{ {
"maingate_mongodb_url": "mongodb://...", "maingate_mongodb_url": "mongodb://...",
"autologin_ttl": 604800, "autologin_ttl": 604800,
"acc_del_ttl": 7776000,
"maximum_num_link_account": 10, "maximum_num_link_account": 10,
"redirect_base_url": "", "redirect_base_url": "",
"google_client_id" : "", "google_client_id" : "",

View File

@ -124,6 +124,7 @@ type maingateConfig struct {
Mongo string `json:"maingate_mongodb_url"` Mongo string `json:"maingate_mongodb_url"`
SessionTTL int64 `json:"maingate_session_ttl"` SessionTTL int64 `json:"maingate_session_ttl"`
Autologin_ttl int64 `json:"autologin_ttl"` Autologin_ttl int64 `json:"autologin_ttl"`
AccDelTTL int64 `json:"acc_del_ttl"`
MaximumNumLinkAccount int64 `json:"maximum_num_link_account"` MaximumNumLinkAccount int64 `json:"maximum_num_link_account"`
RedirectBaseUrl string `json:"redirect_base_url"` RedirectBaseUrl string `json:"redirect_base_url"`
GoogleClientId string `json:"google_client_id"` GoogleClientId string `json:"google_client_id"`
@ -354,6 +355,14 @@ func (mg *Maingate) prepare(context context.Context) (err error) {
return makeErrorWithStack(err) return makeErrorWithStack(err)
} }
if err = mg.mongoClient.MakeExpireIndex(CollectionAccount, int32(mg.AccDelTTL)); err != nil {
return makeErrorWithStack(err)
}
if err = mg.mongoClient.MakeExpireIndex(CollectionLink, int32(mg.AccDelTTL)); err != nil {
return makeErrorWithStack(err)
}
// Delete대신 _ts로 expire시킴. pipeline에 삭제 알려주기 위함 // Delete대신 _ts로 expire시킴. pipeline에 삭제 알려주기 위함
if err = mg.mongoClient.MakeExpireIndex(CollectionWhitelist, 10); err != nil { if err = mg.mongoClient.MakeExpireIndex(CollectionWhitelist, 10); err != nil {
return makeErrorWithStack(err) return makeErrorWithStack(err)

View File

@ -95,7 +95,7 @@ func (p *memberContainerPtr[K, T]) contains(key K, out *T) bool {
return false return false
} }
if out != nil { if out != nil {
out = &found *out = found
} }
return true return true
} }

View File

@ -322,7 +322,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.Println("readProfile(old) failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -332,7 +332,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.Println("getProviderInfo failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -346,7 +346,7 @@ func (sh *serviceDescription) link(w http.ResponseWriter, r *http.Request) {
email, err := sh.readProfile(newType, newId, bfinfo) email, err := sh.readProfile(newType, newId, bfinfo)
if err != nil { if err != nil {
logger.Error("readProfile(new) failed :", err) logger.Println("readProfile(new) failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -359,7 +359,7 @@ 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.Println("getProviderInfo failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -390,7 +390,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.Error("link failed. Update ServiceName err :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -457,7 +457,7 @@ func (sh *serviceDescription) unlink(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.Println("getProviderInfo failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -476,7 +476,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
if err != nil { if err != nil {
logger.Error("unlink failed, fail to count accounts :", err) logger.Error("unlink failed, fail to count accounts :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusInternalServerError)
} }
if len(accDocs) <= 1 { if len(accDocs) <= 1 {
@ -505,7 +505,7 @@ func (sh *serviceDescription) unlink(w http.ResponseWriter, r *http.Request) {
}, 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.Error("unlink failed. Delete ServiceName err :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusInternalServerError)
return return
} }
if preid == nil { if preid == nil {
@ -554,7 +554,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.Println("getProviderInfo failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
@ -574,7 +574,7 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
})) }))
if err != nil { if err != nil {
logger.Error("linkinfo failed. CountDocuments err :", err) logger.Error("linkinfo failed. CountDocuments err :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -588,6 +588,11 @@ func (sh *serviceDescription) linkinfo(w http.ResponseWriter, r *http.Request) {
}, options.Find().SetLimit(sh.MaximumNumLinkAccount).SetProjection(bson.M{ }, options.Find().SetLimit(sh.MaximumNumLinkAccount).SetProjection(bson.M{
platformName: 1, platformName: 1,
})) }))
if err != nil {
logger.Error("linkinfo failed. FindAll returns err :", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
var linkstrs []string var linkstrs []string
for _, link := range links { for _, link := range links {
@ -597,7 +602,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.Error("linkinfo failed. json marshal fail :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusInternalServerError)
return return
} }
@ -630,29 +635,29 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
//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.Println("getUserBrowserInfo failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
email, err = sh.readProfile(authtype, uid, bfinfo) email, err = sh.readProfile(authtype, uid, bfinfo)
if err != nil { if err != nil {
logger.Error("readProfile failed :", err) logger.Println("readProfile failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
newType, newId, err := sh.getProviderInfo(authtype, uid) newType, newId, err := sh.getProviderInfo(authtype, uid)
if err != nil { if err != nil {
logger.Error("getProviderInfo failed :", err) logger.Println("getProviderInfo failed :", err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
if authtype != newType || uid != newId { if authtype != newType || uid != newId {
logger.Printf("auth success ( redirect ) : %s->%s, %s->%s, %s, %s", authtype, newType, uid, newId, email, session)
authtype = newType authtype = newType
uid = newId uid = newId
logger.Println("auth success ( redirect ) :", authtype, uid, email, session)
} }
} else { } else {
email = fmt.Sprintf("%s@guest.flag", uid) email = fmt.Sprintf("%s@guest.flag", uid)
@ -673,13 +678,15 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
"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,
"_ts": 1,
}))
if err != nil { if err != nil {
logger.Error("authorize failed :", err) logger.Error("authorize failed :", err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
linkid := link["_id"].(primitive.ObjectID) linkid := link["_id"].(primitive.ObjectID)
newaccid := primitive.NewObjectID() newaccid := primitive.NewObjectID()
for i := 0; i < len(sh.serviceCodeBytes); i++ { for i := 0; i < len(sh.serviceCodeBytes); i++ {
@ -733,6 +740,8 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
return return
} }
logger.Println("session created :", accid, authtype, uid, email, newsession)
output := map[string]any{ output := map[string]any{
"sk": newsession.Hex(), "sk": newsession.Hex(),
"expirein": sh.sessionTTL.Seconds(), "expirein": sh.sessionTTL.Seconds(),
@ -742,6 +751,14 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
if *noauth { if *noauth {
output["noauth"] = true output["noauth"] = true
} }
if link["_ts"] != nil {
delts := link["_ts"].(primitive.DateTime)
if !delts.Time().IsZero() {
// 삭제된 계정. 삭제 되었다고 알려주자
w.Header().Add("MG-ACCOUNT-DELETED", "TRUE")
}
}
bt, _ := json.Marshal(output) bt, _ := json.Marshal(output)
w.Write(bt) w.Write(bt)
} else if len(session) > 0 { } else if len(session) > 0 {
@ -757,8 +774,7 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
}, },
}, options.Update().SetUpsert(false)) }, options.Update().SetUpsert(false))
if err != nil { if err != nil {
logger.Error("update auth collection failed") logger.Error("update auth collection failed :", err)
logger.Error(err)
return return
} }
@ -773,6 +789,9 @@ func (sh *serviceDescription) authorize(w http.ResponseWriter, r *http.Request)
"sk": session, "sk": session,
"expirein": sh.sessionTTL.Seconds(), "expirein": sh.sessionTTL.Seconds(),
} }
logger.Println("session updated :", authtype, uid, session)
bt, _ := json.Marshal(output) bt, _ := json.Marshal(output)
w.Write(bt) w.Write(bt)
} else { } else {
@ -815,6 +834,7 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
sType := queryvals.Get("stype") sType := queryvals.Get("stype")
sId := queryvals.Get("sid") sId := queryvals.Get("sid")
sk := queryvals.Get("sk") sk := queryvals.Get("sk")
cancel := queryvals.Has("cancel")
authInfo := sh.auths.Find(sk) authInfo := sh.auths.Find(sk)
if authInfo == nil { if authInfo == nil {
@ -830,7 +850,7 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
return return
} }
accids, err := sh.mongoClient.FindAll(CollectionAccount, bson.M{ linkidMap, err := sh.mongoClient.FindAll(CollectionAccount, bson.M{
"accid": authInfo.Accid, "accid": authInfo.Accid,
}, options.Find().SetProjection(bson.M{ }, options.Find().SetProjection(bson.M{
"_id": 1, "_id": 1,
@ -841,27 +861,55 @@ func (sh *serviceDescription) delacc(w http.ResponseWriter, r *http.Request) {
return return
} }
var addIdFilter bson.A var linkidAry primitive.A
for _, accid := range accids { for _, linkid := range linkidMap {
addIdFilter = append(addIdFilter, accid["_id"].(primitive.ObjectID)) linkidAry = append(linkidAry, linkid["_id"].(primitive.ObjectID))
} }
delfilter := bson.D{{Key: "_id", Value: bson.D{{Key: "$in", Value: addIdFilter}}}} delfilter := primitive.M{"_id": bson.M{"$in": linkidAry}}
delaccnum, err := sh.mongoClient.DeleteMany(CollectionAccount, delfilter) var delop primitive.M
if err != nil { if !cancel {
logger.Error("delacc failed. Delete many CollectionAccount err :", err) curtime := primitive.NewDateTimeFromTime(time.Now().UTC())
w.WriteHeader(http.StatusBadRequest) delop = primitive.M{
"$set": primitive.M{"_ts": curtime},
}
if sType == AuthPlatformFirebaseAuth {
sh.mongoClient.Delete(CollectionFirebaseUserInfo, bson.M{
"firebaseuserid": sId,
})
}
} else {
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)
w.WriteHeader(http.StatusInternalServerError)
return return
} }
_, err = sh.mongoClient.DeleteMany(CollectionLink, delfilter) delfilter = primitive.M{"_id": targetLinkId[0]["_id"].(primitive.ObjectID)}
if err != nil { delop = primitive.M{
logger.Error("delacc failed. Delete many CollectionLink err :", err) "$unset": primitive.M{"_ts": true},
w.WriteHeader(http.StatusBadRequest) }
}
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)
w.WriteHeader(http.StatusInternalServerError)
return return
} }
logger.Println("delacc success :", delaccnum) 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)
w.WriteHeader(http.StatusInternalServerError)
return
}
logger.Println("delacc success :", linkidMap)
} }
func (sh *serviceDescription) serveHTTP(w http.ResponseWriter, r *http.Request) { func (sh *serviceDescription) serveHTTP(w http.ResponseWriter, r *http.Request) {
@ -964,7 +1012,7 @@ func (sh *serviceDescription) serveHTTP(w http.ResponseWriter, r *http.Request)
} }
} }
} else { } else {
logger.Println("div is not found :", divname) logger.Println("div is not found :", divname, sh.Divisions)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
} }
} else { } else {

6
go.sum
View File

@ -268,11 +268,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-20230710085810-8173216e9574 h1:Ha0d/sv/MzC3ASCTXfe2tAFJieLNJmTCBL8aETEOY14=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230710085810-8173216e9574/go.mod h1:rn6NA28Mej+qgLNx/Bu2wsdGyIycmacqlNP6gUXX2a0=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230911034515-1af5d7281946 h1:YSvgTNuHeKis37+FfOvzVLYCaXQ0oF+CWBTy4bRqq3g=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230911034515-1af5d7281946/go.mod h1:XvklTTSvQX5uviivGBcZo8eIL+mV94W2e4uBBXcT5JY=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230912074842-ea8ae4d02c7d h1:W6Ir1+kA6wMDya7bYz2S2X96qhb25FKpa/+wnHnSNVo=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230912074842-ea8ae4d02c7d/go.mod h1:rn6NA28Mej+qgLNx/Bu2wsdGyIycmacqlNP6gUXX2a0=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230912075917-f9a146321cdb h1:Rdf6uhBIWunRLZ2LIT1hSovYXxZoOzx9mdSK5bjWpos= repositories.action2quare.com/ayo/gocommon v0.0.0-20230912075917-f9a146321cdb h1:Rdf6uhBIWunRLZ2LIT1hSovYXxZoOzx9mdSK5bjWpos=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230912075917-f9a146321cdb/go.mod h1:rn6NA28Mej+qgLNx/Bu2wsdGyIycmacqlNP6gUXX2a0= repositories.action2quare.com/ayo/gocommon v0.0.0-20230912075917-f9a146321cdb/go.mod h1:rn6NA28Mej+qgLNx/Bu2wsdGyIycmacqlNP6gUXX2a0=