mirror of
				https://github.com/matrix-org/gomatrix
				synced 2025-11-03 22:08:04 +00:00 
			
		
		
		
	Merge pull request #4 from matrix-org/kegan/registration
Add Register functions
This commit is contained in:
		
						commit
						8db775656f
					
				
					 3 changed files with 128 additions and 5 deletions
				
			
		
							
								
								
									
										91
									
								
								client.go
									
										
									
									
									
								
							
							
						
						
									
										91
									
								
								client.go
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -75,7 +75,9 @@ func (cli *Client) BuildBaseURL(urlPath ...string) string {
 | 
			
		|||
	parts = append(parts, urlPath...)
 | 
			
		||||
	hsURL.Path = path.Join(parts...)
 | 
			
		||||
	query := hsURL.Query()
 | 
			
		||||
	query.Set("access_token", cli.AccessToken)
 | 
			
		||||
	if cli.AccessToken != "" {
 | 
			
		||||
		query.Set("access_token", cli.AccessToken)
 | 
			
		||||
	}
 | 
			
		||||
	hsURL.RawQuery = query.Encode()
 | 
			
		||||
	return hsURL.String()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -162,9 +164,9 @@ func (cli *Client) StopSync() {
 | 
			
		|||
// MakeRequest makes a JSON HTTP request to the given URL.
 | 
			
		||||
// If "resBody" is not nil, the response body will be json.Unmarshalled into it.
 | 
			
		||||
//
 | 
			
		||||
// Returns the HTTP body as bytes on 2xx. Returns an error if the response is not 2xx. This error
 | 
			
		||||
// is an HTTPError which includes the returned HTTP status code and possibly a RespError as the
 | 
			
		||||
// WrappedError, if the HTTP body could be decoded as a RespError.
 | 
			
		||||
// Returns the HTTP body as bytes on 2xx with a nil error. Returns an error if the response is not 2xx along
 | 
			
		||||
// with the HTTP body bytes if it got that far. This error is an HTTPError which includes the returned
 | 
			
		||||
// HTTP status code and possibly a RespError as the WrappedError, if the HTTP body could be decoded as a RespError.
 | 
			
		||||
func (cli *Client) MakeRequest(method string, httpURL string, reqBody interface{}, resBody interface{}) ([]byte, error) {
 | 
			
		||||
	var req *http.Request
 | 
			
		||||
	var err error
 | 
			
		||||
| 
						 | 
				
			
			@ -205,7 +207,7 @@ func (cli *Client) MakeRequest(method string, httpURL string, reqBody interface{
 | 
			
		|||
			msg = msg + ": " + string(contents)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil, HTTPError{
 | 
			
		||||
		return contents, HTTPError{
 | 
			
		||||
			Code:         res.StatusCode,
 | 
			
		||||
			Message:      msg,
 | 
			
		||||
			WrappedError: wrap,
 | 
			
		||||
| 
						 | 
				
			
			@ -253,6 +255,85 @@ func (cli *Client) SyncRequest(timeout int, since, filterID string, fullState bo
 | 
			
		|||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (cli *Client) register(u string, req *ReqRegister) (resp *RespRegister, uiaResp *RespUserInteractive, err error) {
 | 
			
		||||
	var bodyBytes []byte
 | 
			
		||||
	bodyBytes, err = cli.MakeRequest("POST", u, req, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		httpErr, ok := err.(HTTPError)
 | 
			
		||||
		if !ok { // network error
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if httpErr.Code == 401 {
 | 
			
		||||
			// body should be RespUserInteractive, if it isn't, fail with the error
 | 
			
		||||
			err = json.Unmarshal(bodyBytes, &uiaResp)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// body should be RespRegister
 | 
			
		||||
	err = json.Unmarshal(bodyBytes, &resp)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Register makes an HTTP request according to http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-register
 | 
			
		||||
//
 | 
			
		||||
// Registers with kind=user. For kind=guest, see RegisterGuest.
 | 
			
		||||
func (cli *Client) Register(req *ReqRegister) (*RespRegister, *RespUserInteractive, error) {
 | 
			
		||||
	u := cli.BuildURL("register")
 | 
			
		||||
	return cli.register(u, req)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterGuest makes an HTTP request according to http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-register
 | 
			
		||||
// with kind=guest.
 | 
			
		||||
//
 | 
			
		||||
// For kind=user, see Register.
 | 
			
		||||
func (cli *Client) RegisterGuest(req *ReqRegister) (*RespRegister, *RespUserInteractive, error) {
 | 
			
		||||
	query := map[string]string{
 | 
			
		||||
		"kind": "guest",
 | 
			
		||||
	}
 | 
			
		||||
	u := cli.BuildURLWithQuery([]string{"register"}, query)
 | 
			
		||||
	return cli.register(u, req)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterDummy performs m.login.dummy registration according to https://matrix.org/docs/spec/client_server/r0.2.0.html#dummy-auth
 | 
			
		||||
//
 | 
			
		||||
// Only a username and password need to be provided on the ReqRegister struct. Most local/developer homeservers will allow registration
 | 
			
		||||
// this way. If the homeserver does not, an error is returned. If "setOnClient" is true, the access_token and user_id will be set on
 | 
			
		||||
// this client instance.
 | 
			
		||||
//
 | 
			
		||||
// 	res, err := cli.RegisterDummy(&gomatrix.ReqRegister{
 | 
			
		||||
//		Username: "alice",
 | 
			
		||||
//		Password: "wonderland",
 | 
			
		||||
//	}, false)
 | 
			
		||||
//  if err != nil {
 | 
			
		||||
// 		panic(err)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	token := res.AccessToken
 | 
			
		||||
func (cli *Client) RegisterDummy(req *ReqRegister, setOnClient bool) (*RespRegister, error) {
 | 
			
		||||
	res, uia, err := cli.Register(req)
 | 
			
		||||
	if err != nil && uia == nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if uia != nil && uia.HasSingleStageFlow("m.login.dummy") {
 | 
			
		||||
		req.Auth = struct {
 | 
			
		||||
			Type    string `json:"type"`
 | 
			
		||||
			Session string `json:"session,omitempty"`
 | 
			
		||||
		}{"m.login.dummy", uia.Session}
 | 
			
		||||
		res, _, err = cli.Register(req)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if res == nil {
 | 
			
		||||
		return nil, fmt.Errorf("registration failed: does this server support m.login.dummy?")
 | 
			
		||||
	}
 | 
			
		||||
	if setOnClient {
 | 
			
		||||
		cli.UserID = res.UserID
 | 
			
		||||
		cli.AccessToken = res.AccessToken
 | 
			
		||||
	}
 | 
			
		||||
	return res, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JoinRoom joins the client to a room ID or alias. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-join-roomidoralias
 | 
			
		||||
//
 | 
			
		||||
// If serverName is specified, this will be added as a query param to instruct the homeserver to join via that server. If content is specified, it will
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										11
									
								
								requests.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								requests.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
package gomatrix
 | 
			
		||||
 | 
			
		||||
// ReqRegister is the JSON request for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-register
 | 
			
		||||
type ReqRegister struct {
 | 
			
		||||
	Username                 string      `json:"username,omitempty"`
 | 
			
		||||
	BindEmail                bool        `json:"bind_email,omitempty"`
 | 
			
		||||
	Password                 string      `json:"password,omitempty"`
 | 
			
		||||
	DeviceID                 string      `json:"device_id,omitempty"`
 | 
			
		||||
	InitialDeviceDisplayName string      `json:"initial_device_display_name"`
 | 
			
		||||
	Auth                     interface{} `json:"auth,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								responses.go
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								responses.go
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -35,6 +35,37 @@ type RespMediaUpload struct {
 | 
			
		|||
	ContentURI string `json:"content_uri"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RespUserInteractive is the JSON response for https://matrix.org/docs/spec/client_server/r0.2.0.html#user-interactive-authentication-api
 | 
			
		||||
type RespUserInteractive struct {
 | 
			
		||||
	Flows []struct {
 | 
			
		||||
		Stages []string `json:"stages"`
 | 
			
		||||
	} `json:"flows"`
 | 
			
		||||
	Params    map[string]interface{} `json:"params"`
 | 
			
		||||
	Session   string                 `json:"string"`
 | 
			
		||||
	Completed []string               `json:"completed"`
 | 
			
		||||
	ErrCode   string                 `json:"errcode"`
 | 
			
		||||
	Error     string                 `json:"error"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasSingleStageFlow returns true if there exists at least 1 Flow with a single stage of stageName.
 | 
			
		||||
func (r RespUserInteractive) HasSingleStageFlow(stageName string) bool {
 | 
			
		||||
	for _, f := range r.Flows {
 | 
			
		||||
		if len(f.Stages) == 1 && f.Stages[0] == stageName {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RespRegister is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-register
 | 
			
		||||
type RespRegister struct {
 | 
			
		||||
	AccessToken  string `json:"access_token"`
 | 
			
		||||
	DeviceID     string `json:"device_id"`
 | 
			
		||||
	HomeServer   string `json:"home_server"`
 | 
			
		||||
	RefreshToken string `json:"refresh_token"`
 | 
			
		||||
	UserID       string `json:"user_id"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RespSync is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-sync
 | 
			
		||||
type RespSync struct {
 | 
			
		||||
	NextBatch   string `json:"next_batch"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue