[MM-37984] Allow Desktop App to authenticate via external providers outside of the app on supported servers (#24140)
* [MM-37984] Allow Desktop App to authenticate via external providers outside of the app on supported servers * PR feedback * Add support for mattermost-dev protocol for development use * Update server/channels/db/migrations/postgres/000110_create_desktop_tokens.up.sql * Fix silly typo * Update server/channels/db/migrations/postgres/000110_create_desktop_tokens.up.sql * Remove storage of client token, only validate it on the client * Update migrations * Add concurrently create index * Remove CONCURRENTLY for now * Fix issue with changing history * Remove old migration * Use idempotent statement to drop old index * Remove reference to old table
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
105fa4a195
Коммит
a3b194581f
123
server/channels/store/sqlstore/desktop_tokens_store.go
Обычный файл
123
server/channels/store/sqlstore/desktop_tokens_store.go
Обычный файл
@@ -0,0 +1,123 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package sqlstore
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"github.com/mattermost/mattermost/server/v8/channels/store"
|
||||
"github.com/mattermost/mattermost/server/v8/einterfaces"
|
||||
sq "github.com/mattermost/squirrel"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type SqlDesktopTokensStore struct {
|
||||
*SqlStore
|
||||
metrics einterfaces.MetricsInterface
|
||||
}
|
||||
|
||||
func newSqlDesktopTokensStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.DesktopTokensStore {
|
||||
return &SqlDesktopTokensStore{
|
||||
SqlStore: sqlStore,
|
||||
metrics: metrics,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *SqlDesktopTokensStore) GetUserId(token string, minCreateAt int64) (*string, error) {
|
||||
query := s.getQueryBuilder().
|
||||
Select("UserId").
|
||||
From("DesktopTokens").
|
||||
Where(sq.And{
|
||||
sq.Eq{"Token": token},
|
||||
sq.GtOrEq{"CreateAt": minCreateAt},
|
||||
})
|
||||
|
||||
dt := struct{ UserId string }{}
|
||||
err := s.GetReplicaX().GetBuilder(&dt, query)
|
||||
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, store.NewErrNotFound("DesktopTokens", token)
|
||||
}
|
||||
return nil, errors.Wrapf(err, "No token for %s", token)
|
||||
}
|
||||
|
||||
return &dt.UserId, nil
|
||||
}
|
||||
|
||||
func (s *SqlDesktopTokensStore) Insert(token string, createAt int64, userId string) error {
|
||||
builder := s.getQueryBuilder().
|
||||
Insert("DesktopTokens").
|
||||
Columns("Token", "CreateAt", "UserId").
|
||||
Values(token, createAt, userId)
|
||||
|
||||
query, args, err := builder.ToSql()
|
||||
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "insert_desktoptokens_tosql")
|
||||
}
|
||||
|
||||
if _, err = s.GetMasterX().Exec(query, args...); err != nil {
|
||||
return errors.Wrap(err, "failed to insert token row")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlDesktopTokensStore) Delete(token string) error {
|
||||
builder := s.getQueryBuilder().
|
||||
Delete("DesktopTokens").
|
||||
Where(sq.Eq{
|
||||
"Token": token,
|
||||
})
|
||||
|
||||
query, args, err := builder.ToSql()
|
||||
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "delete_desktoptokens_tosql")
|
||||
}
|
||||
|
||||
if _, err = s.GetMasterX().Exec(query, args...); err != nil {
|
||||
return errors.Wrap(err, "failed to delete token row")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlDesktopTokensStore) DeleteByUserId(userId string) error {
|
||||
builder := s.getQueryBuilder().
|
||||
Delete("DesktopTokens").
|
||||
Where(sq.Eq{
|
||||
"UserId": userId,
|
||||
})
|
||||
|
||||
query, args, err := builder.ToSql()
|
||||
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "delete_by_userid_desktoptokens_tosql")
|
||||
}
|
||||
|
||||
if _, err = s.GetMasterX().Exec(query, args...); err != nil {
|
||||
return errors.Wrap(err, "failed to delete token row")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlDesktopTokensStore) DeleteOlderThan(minCreateAt int64) error {
|
||||
builder := s.getQueryBuilder().
|
||||
Delete("DesktopTokens").
|
||||
Where(sq.Lt{
|
||||
"CreateAt": minCreateAt,
|
||||
})
|
||||
|
||||
query, args, err := builder.ToSql()
|
||||
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "delete_old_desktoptokens_tosql")
|
||||
}
|
||||
|
||||
if _, err = s.GetMasterX().Exec(query, args...); err != nil {
|
||||
return errors.Wrap(err, "failed to delete token row")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
14
server/channels/store/sqlstore/desktop_tokens_store_test.go
Обычный файл
14
server/channels/store/sqlstore/desktop_tokens_store_test.go
Обычный файл
@@ -0,0 +1,14 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package sqlstore
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/mattermost/mattermost/server/v8/channels/store/storetest"
|
||||
)
|
||||
|
||||
func TestDesktopTokensStore(t *testing.T) {
|
||||
StoreTestWithSqlStore(t, storetest.TestDesktopTokensStore)
|
||||
}
|
||||
@@ -108,6 +108,7 @@ type SqlStoreStores struct {
|
||||
postAcknowledgement store.PostAcknowledgementStore
|
||||
postPersistentNotification store.PostPersistentNotificationStore
|
||||
trueUpReview store.TrueUpReviewStore
|
||||
desktopTokens store.DesktopTokensStore
|
||||
}
|
||||
|
||||
type SqlStore struct {
|
||||
@@ -229,6 +230,7 @@ func New(settings model.SqlSettings, metrics einterfaces.MetricsInterface) (*Sql
|
||||
store.stores.postAcknowledgement = newSqlPostAcknowledgementStore(store)
|
||||
store.stores.postPersistentNotification = newSqlPostPersistentNotificationStore(store)
|
||||
store.stores.trueUpReview = newSqlTrueUpReviewStore(store)
|
||||
store.stores.desktopTokens = newSqlDesktopTokensStore(store, metrics)
|
||||
|
||||
store.stores.preference.(*SqlPreferenceStore).deleteUnusedFeatures()
|
||||
|
||||
@@ -1080,6 +1082,10 @@ func (ss *SqlStore) TrueUpReview() store.TrueUpReviewStore {
|
||||
return ss.stores.trueUpReview
|
||||
}
|
||||
|
||||
func (ss *SqlStore) DesktopTokens() store.DesktopTokensStore {
|
||||
return ss.stores.desktopTokens
|
||||
}
|
||||
|
||||
func (ss *SqlStore) DropAllTables() {
|
||||
if ss.DriverName() == model.DatabaseDriverPostgres {
|
||||
ss.masterX.Exec(`DO
|
||||
|
||||
Ссылка в новой задаче
Block a user