From 69d973615230c1713f010038bea10fa41e63056c Mon Sep 17 00:00:00 2001 From: Roland Osborne Date: Thu, 20 Jan 2022 17:01:02 -0800 Subject: [PATCH] adding open message --- doc/api.oa3 | 2 + net/server/internal/api_addCard.go | 3 + net/server/internal/api_contact.go | 5 -- net/server/internal/api_getOpenMessage.go | 60 ++++++++++++++++++++ net/server/internal/api_setCardStatus.go | 17 +++++- net/server/internal/store/schema.go | 3 +- net/server/internal/ucConnectContact_test.go | 21 +++++-- 7 files changed, 98 insertions(+), 13 deletions(-) create mode 100644 net/server/internal/api_getOpenMessage.go diff --git a/doc/api.oa3 b/doc/api.oa3 index f28d6a49..be72727a 100644 --- a/doc/api.oa3 +++ b/doc/api.oa3 @@ -1111,6 +1111,8 @@ paths: description: permission denied '404': description: card not found + '405': + description: invalid card state '410': description: account disabled '500': diff --git a/net/server/internal/api_addCard.go b/net/server/internal/api_addCard.go index 92ff536f..c5749d4a 100644 --- a/net/server/internal/api_addCard.go +++ b/net/server/internal/api_addCard.go @@ -74,6 +74,9 @@ func AddCard(w http.ResponseWriter, r *http.Request) { return } + // TODO UPDATE CONTACT REVISION + // TODO SET STATUS + WriteResponse(w, getCardModel(&card)) } diff --git a/net/server/internal/api_contact.go b/net/server/internal/api_contact.go index de86fcb9..9c9d1e5d 100644 --- a/net/server/internal/api_contact.go +++ b/net/server/internal/api_contact.go @@ -53,11 +53,6 @@ func GetCloseMessage(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } -func GetOpenMessage(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) -} - func RemoveCard(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) diff --git a/net/server/internal/api_getOpenMessage.go b/net/server/internal/api_getOpenMessage.go new file mode 100644 index 00000000..f39204a9 --- /dev/null +++ b/net/server/internal/api_getOpenMessage.go @@ -0,0 +1,60 @@ +package databag + +import ( + "errors" + "net/http" + "gorm.io/gorm" + "github.com/gorilla/mux" + "databag/internal/store" +) + +func GetOpenMessage(w http.ResponseWriter, r *http.Request) { + + account, code, res := BearerAppToken(r, true); + if res != nil { + ErrResponse(w, code, res) + return + } + detail := account.AccountDetail + cardId := mux.Vars(r)["cardId"] + + var card store.Card + if err := store.DB.Where("account_id = ? AND card_id = ?", account.ID, cardId).First(&card).Error; err != nil { + if !errors.Is(err, gorm.ErrRecordNotFound) { + ErrResponse(w, http.StatusInternalServerError, err) + } else { + ErrResponse(w, http.StatusNotFound, err) + } + return + } + + if card.Status != APP_CARDCONNECTING && card.Status != APP_CARDCONNECTED { + ErrResponse(w, http.StatusMethodNotAllowed, errors.New("invalid card state")) + return + } + + connect := &Connect{ + Contact: card.Guid, + Token: card.InToken, + ContentRevision: account.ViewRevision, + ProfileRevision: account.ProfileRevision, + Handle: account.Username, + Name: detail.Name, + Description: detail.Description, + Location: detail.Location, + Image: detail.Image, + Version: APP_VERSION, + Node: "https://" + getStrConfigValue(CONFIG_DOMAIN, "") + "/", + } + + msg, err := WriteDataMessage(detail.PrivateKey, detail.PublicKey, detail.KeyType, + APP_SIGNPKCS1V15, account.Guid, APP_MSGCONNECT, &connect) + if err != nil { + ErrResponse(w, http.StatusInternalServerError, err) + return + } + + WriteResponse(w, msg) +} + + diff --git a/net/server/internal/api_setCardStatus.go b/net/server/internal/api_setCardStatus.go index 2f7f4d0a..b4087d07 100644 --- a/net/server/internal/api_setCardStatus.go +++ b/net/server/internal/api_setCardStatus.go @@ -3,9 +3,11 @@ package databag import ( "errors" "net/http" + "encoding/hex" "gorm.io/gorm" "github.com/gorilla/mux" "databag/internal/store" + "github.com/theckman/go-securerandom" ) func SetCardStatus(w http.ResponseWriter, r *http.Request) { @@ -38,18 +40,31 @@ func SetCardStatus(w http.ResponseWriter, r *http.Request) { } else { ErrResponse(w, http.StatusNotFound, err) } + return } // update card card.Status = status if token != "" { - card.Token = token + card.OutToken = token } + if status == APP_CARDCONNECTING { + data, err := securerandom.Bytes(32) + if err != nil { + ErrResponse(w, http.StatusInternalServerError, err) + return + } + card.InToken = hex.EncodeToString(data) + } + if err := store.DB.Save(&card).Error; err != nil { ErrResponse(w, http.StatusInternalServerError, err) return } + // TODO UPDATE CARD REVISION, CONTACT REVISION + // TODO SET STATUS + WriteResponse(w, getCardModel(&card)); } diff --git a/net/server/internal/store/schema.go b/net/server/internal/store/schema.go index 6e556375..85431b61 100644 --- a/net/server/internal/store/schema.go +++ b/net/server/internal/store/schema.go @@ -126,7 +126,8 @@ type Card struct { Node string `gorm:"not null"` ProfileRevision int64 `gorm:"not null"` Status string `gorm:"not null"` - Token string + InToken string + OutToken string Notes string DataRevision int64 `gorm:"not null"` Created int64 `gorm:"autoCreateTime"` diff --git a/net/server/internal/ucConnectContact_test.go b/net/server/internal/ucConnectContact_test.go index 970fbe88..c9f6cb69 100644 --- a/net/server/internal/ucConnectContact_test.go +++ b/net/server/internal/ucConnectContact_test.go @@ -8,32 +8,41 @@ import ( func TestConnectContact(t *testing.T) { var card Card + var msg DataMessage + var vars map[string]string // create some contacts for this test access := AddTestContacts(t, "connect", 2) - // get B identity message + // get A identity message r, w, _ := NewRequest("GET", "/profile/message", nil) SetBearerAuth(r, access[0]) GetProfileMessage(w, r) - var msg DataMessage assert.NoError(t, ReadResponse(w, &msg)) - // add B card in A + // add A card in B r, w, _ = NewRequest("POST", "/contact/cards", &msg) SetBearerAuth(r, access[1]) AddCard(w, r) assert.NoError(t, ReadResponse(w, &card)) - // update status to connecting + // update A status to connecting r, w, _ = NewRequest("PUT", "/contact/cards/{cardId}/status", APP_CARDCONNECTING) - vars := map[string]string{ "cardId": card.CardId } + vars = map[string]string{ "cardId": card.CardId } r = mux.SetURLVars(r, vars) SetBearerAuth(r, access[1]) SetCardStatus(w, r) assert.NoError(t, ReadResponse(w, &card)) -PrintMsg(card) + // get open message to A + r, w, _ = NewRequest("GET", "/contact/cards/{cardId}/openMessage", nil) + vars = map[string]string{ "cardId": card.CardId } + r = mux.SetURLVars(r, vars) + SetBearerAuth(r, access[1]) + GetOpenMessage(w, r) + assert.NoError(t, ReadResponse(w, &msg)) + +PrintMsg(msg) // A request B