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 }