morpheus

A Matrix client written in Go-QT
git clone git://archive.git.mtrnord.blog/Nordgedanken/morpheus.git
Log | Files | Refs | README | LICENSE

login.go (3588B)


      1 package matrix
      2 
      3 import (
      4 	"strings"
      5 	"sync"
      6 
      7 	"github.com/Nordgedanken/Morpheus/matrix/db"
      8 	"github.com/matrix-org/gomatrix"
      9 	log "github.com/sirupsen/logrus"
     10 )
     11 
     12 //GetClient returns a Client
     13 func GetClient(homeserverURL, userID, accessToken string) (client *gomatrix.Client, err error) {
     14 	userDB, DBOpenErr := db.OpenUserDB()
     15 	if DBOpenErr != nil {
     16 		log.Errorln(DBOpenErr)
     17 	}
     18 
     19 	client, ClientErr := gomatrix.NewClient(homeserverURL, userID, accessToken)
     20 	if ClientErr != nil {
     21 		err = ClientErr
     22 		return
     23 	}
     24 
     25 	txn := userDB.NewTransaction(true) // Read-write txn
     26 	DBSetAccessTokenErr := txn.Set([]byte("user|accessToken"), []byte(client.AccessToken))
     27 	if DBSetAccessTokenErr != nil {
     28 		err = DBSetAccessTokenErr
     29 		return
     30 	}
     31 
     32 	DBSetHomeserverURLErr := txn.Set([]byte("user|homeserverURL"), []byte(client.HomeserverURL.String()))
     33 	if DBSetHomeserverURLErr != nil {
     34 		err = DBSetHomeserverURLErr
     35 		return
     36 	}
     37 
     38 	DBSetUserIDErr := txn.Set([]byte("user|userID"), []byte(client.UserID))
     39 	if DBSetUserIDErr != nil {
     40 		err = DBSetUserIDErr
     41 		return
     42 	}
     43 
     44 	CommitErr := txn.Commit(nil)
     45 	if CommitErr != nil {
     46 		err = CommitErr
     47 	}
     48 	return
     49 }
     50 
     51 //LoginUser Creates a Session for the User
     52 func LoginUser(username, password string) (*gomatrix.Client, error) {
     53 	usernameSplit := strings.Split(username, ":")
     54 	homeserverURL := usernameSplit[1]
     55 	var cli *gomatrix.Client
     56 	var cliErr error
     57 	if strings.HasPrefix(homeserverURL, "https://") {
     58 		cli, cliErr = GetClient(homeserverURL, "", "")
     59 	} else if strings.HasPrefix(homeserverURL, "http://") {
     60 		cli, cliErr = GetClient(homeserverURL, "", "")
     61 	} else {
     62 		cli, cliErr = GetClient("https://"+homeserverURL, "", "")
     63 	}
     64 	if cliErr != nil {
     65 		return nil, cliErr
     66 	}
     67 
     68 	resp, err := cli.Login(&gomatrix.ReqLogin{
     69 		Type:     "m.login.password",
     70 		User:     username,
     71 		Password: password,
     72 	})
     73 	if err != nil {
     74 		return nil, err
     75 	}
     76 
     77 	userDB, DBOpenErr := db.OpenUserDB()
     78 	if DBOpenErr != nil {
     79 		log.Errorln(DBOpenErr)
     80 	}
     81 	cli.SetCredentials(resp.UserID, resp.AccessToken)
     82 
     83 	txn := userDB.NewTransaction(true) // Read-write txn
     84 	DBSetAccessTokenErr := txn.Set([]byte("user|accessToken"), []byte(resp.AccessToken))
     85 	if DBSetAccessTokenErr != nil {
     86 		return nil, DBSetAccessTokenErr
     87 	}
     88 
     89 	DBSetDeviceIDErr := txn.Set([]byte("user|deviceID"), []byte(resp.DeviceID))
     90 	if DBSetDeviceIDErr != nil {
     91 		return nil, DBSetDeviceIDErr
     92 	}
     93 
     94 	DBSetHomeserverURLErr := txn.Set([]byte("user|homeserverURL"), []byte(resp.HomeServer))
     95 	if DBSetHomeserverURLErr != nil {
     96 		return nil, DBSetHomeserverURLErr
     97 	}
     98 
     99 	DBSetUserIDErr := txn.Set([]byte("user|userID"), []byte(resp.UserID))
    100 	if DBSetUserIDErr != nil {
    101 		return nil, DBSetUserIDErr
    102 
    103 	}
    104 
    105 	CommitErr := txn.Commit(nil)
    106 	if CommitErr != nil {
    107 		return nil, CommitErr
    108 	}
    109 	return cli, nil
    110 }
    111 
    112 // DoLogin generates the needed Client
    113 func DoLogin(username, password, homeserverURL, userID, accessToken string, results chan<- *gomatrix.Client, wg *sync.WaitGroup) {
    114 	defer wg.Done()
    115 	var cli *gomatrix.Client
    116 	if accessToken != "" && homeserverURL != "" && userID != "" {
    117 		var cliErr error
    118 		if strings.HasPrefix(homeserverURL, "https://") {
    119 			cli, cliErr = GetClient(homeserverURL, userID, accessToken)
    120 		} else if strings.HasPrefix(homeserverURL, "http://") {
    121 			cli, cliErr = GetClient(homeserverURL, userID, accessToken)
    122 		} else {
    123 			cli, cliErr = GetClient("https://"+homeserverURL, userID, accessToken)
    124 		}
    125 		if cliErr != nil {
    126 			log.Errorln(cliErr)
    127 		}
    128 		cli.SetCredentials(userID, accessToken)
    129 	} else {
    130 		var err error
    131 		cli, err = LoginUser(username, password)
    132 		if err != nil {
    133 			log.Errorln(err)
    134 		}
    135 	}
    136 
    137 	results <- cli
    138 }