github.com/qichengzx/mattermost-server@v4.5.1-0.20180604164826-2c75247c97d0+incompatible/store/sqlstore/tokens_store.go (about)

     1  // Copyright (c) 2017 Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package sqlstore
     5  
     6  import (
     7  	"database/sql"
     8  	"net/http"
     9  
    10  	"github.com/mattermost/mattermost-server/mlog"
    11  	"github.com/mattermost/mattermost-server/model"
    12  	"github.com/mattermost/mattermost-server/store"
    13  )
    14  
    15  type SqlTokenStore struct {
    16  	SqlStore
    17  }
    18  
    19  func NewSqlTokenStore(sqlStore SqlStore) store.TokenStore {
    20  	s := &SqlTokenStore{sqlStore}
    21  
    22  	for _, db := range sqlStore.GetAllConns() {
    23  		table := db.AddTableWithName(model.Token{}, "Tokens").SetKeys(false, "Token")
    24  		table.ColMap("Token").SetMaxSize(64)
    25  		table.ColMap("Type").SetMaxSize(64)
    26  		table.ColMap("Extra").SetMaxSize(128)
    27  	}
    28  
    29  	return s
    30  }
    31  
    32  func (s SqlTokenStore) CreateIndexesIfNotExists() {
    33  }
    34  
    35  func (s SqlTokenStore) Save(token *model.Token) store.StoreChannel {
    36  	return store.Do(func(result *store.StoreResult) {
    37  		if result.Err = token.IsValid(); result.Err != nil {
    38  			return
    39  		}
    40  
    41  		if err := s.GetMaster().Insert(token); err != nil {
    42  			result.Err = model.NewAppError("SqlTokenStore.Save", "store.sql_recover.save.app_error", nil, "", http.StatusInternalServerError)
    43  		}
    44  	})
    45  }
    46  
    47  func (s SqlTokenStore) Delete(token string) store.StoreChannel {
    48  	return store.Do(func(result *store.StoreResult) {
    49  		if _, err := s.GetMaster().Exec("DELETE FROM Tokens WHERE Token = :Token", map[string]interface{}{"Token": token}); err != nil {
    50  			result.Err = model.NewAppError("SqlTokenStore.Delete", "store.sql_recover.delete.app_error", nil, "", http.StatusInternalServerError)
    51  		}
    52  	})
    53  }
    54  
    55  func (s SqlTokenStore) GetByToken(tokenString string) store.StoreChannel {
    56  	return store.Do(func(result *store.StoreResult) {
    57  		token := model.Token{}
    58  
    59  		if err := s.GetReplica().SelectOne(&token, "SELECT * FROM Tokens WHERE Token = :Token", map[string]interface{}{"Token": tokenString}); err != nil {
    60  			if err == sql.ErrNoRows {
    61  				result.Err = model.NewAppError("SqlTokenStore.GetByToken", "store.sql_recover.get_by_code.app_error", nil, err.Error(), http.StatusBadRequest)
    62  			} else {
    63  				result.Err = model.NewAppError("SqlTokenStore.GetByToken", "store.sql_recover.get_by_code.app_error", nil, err.Error(), http.StatusInternalServerError)
    64  			}
    65  		}
    66  
    67  		result.Data = &token
    68  	})
    69  }
    70  
    71  func (s SqlTokenStore) Cleanup() {
    72  	mlog.Debug("Cleaning up token store.")
    73  	deltime := model.GetMillis() - model.MAX_TOKEN_EXIPRY_TIME
    74  	if _, err := s.GetMaster().Exec("DELETE FROM Tokens WHERE CreateAt < :DelTime", map[string]interface{}{"DelTime": deltime}); err != nil {
    75  		mlog.Error("Unable to cleanup token store.")
    76  	}
    77  }