keel/vendor/github.com/tbruyelle/hipchat-go/hipchat/oauth.go

108 lines
2.9 KiB
Go

package hipchat
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
// ClientCredentials represents the OAuth2 client ID and secret for an integration
type ClientCredentials struct {
ClientID string
ClientSecret string
}
// OAuthAccessToken represents a newly created Hipchat OAuth access token
type OAuthAccessToken struct {
AccessToken string `json:"access_token"`
ExpiresIn uint32 `json:"expires_in"`
GroupID uint32 `json:"group_id"`
GroupName string `json:"group_name"`
Scope string `json:"scope"`
TokenType string `json:"token_type"`
}
// CreateClient creates a new client from this OAuth token
func (t *OAuthAccessToken) CreateClient() *Client {
return NewClient(t.AccessToken)
}
// GenerateToken returns back an access token for a given integration's client ID and client secret
//
// HipChat API documentation: https://www.hipchat.com/docs/apiv2/method/generate_token
func (c *Client) GenerateToken(credentials ClientCredentials, scopes []string) (*OAuthAccessToken, *http.Response, error) {
rel, err := url.Parse("oauth/token")
if err != nil {
return nil, nil, err
}
u := c.BaseURL.ResolveReference(rel)
params := url.Values{"grant_type": {"client_credentials"},
"scope": {strings.Join(scopes, " ")}}
req, err := http.NewRequest("POST", u.String(), strings.NewReader(params.Encode()))
if err != nil {
return nil, nil, err
}
req.SetBasicAuth(credentials.ClientID, credentials.ClientSecret)
req.Header.Set("Content-type", "application/x-www-form-urlencoded")
resp, err := c.client.Do(req)
if err != nil {
return nil, resp, err
}
if resp.StatusCode != 200 {
content, readerr := ioutil.ReadAll(resp.Body)
if readerr != nil {
content = []byte("Unknown error")
}
return nil, resp, fmt.Errorf("Couldn't retrieve access token: %s", content)
}
content, err := ioutil.ReadAll(resp.Body)
var token OAuthAccessToken
json.Unmarshal(content, &token)
return &token, resp, nil
}
const (
// ScopeAdminGroup - Perform group administrative tasks
ScopeAdminGroup = "admin_group"
// ScopeAdminRoom - Perform room administrative tasks
ScopeAdminRoom = "admin_room"
// ScopeImportData - Import users, rooms, and chat history. Only available for select add-ons.
ScopeImportData = "import_data"
// ScopeManageRooms - Create, update, and remove rooms
ScopeManageRooms = "manage_rooms"
// ScopeSendMessage - Send private one-on-one messages
ScopeSendMessage = "send_message"
// ScopeSendNotification - Send room notifications
ScopeSendNotification = "send_notification"
// ScopeViewGroup - View users, rooms, and other group information
ScopeViewGroup = "view_group"
// ScopeViewMessages - View messages from chat rooms and private chats you have access to
ScopeViewMessages = "view_messages"
// ScopeViewRoom - View room information and participants, but not history
ScopeViewRoom = "view_room"
)