Browse Source

Merge pull request #15 from matrix-org/kegan/jira-realm

Add a JIRA Realm
pull/17/head
Kegsay 8 years ago
committed by GitHub
parent
commit
477c054588
  1. 4
      src/github.com/matrix-org/go-neb/api.go
  2. 1
      src/github.com/matrix-org/go-neb/goneb.go
  3. 4
      src/github.com/matrix-org/go-neb/realms/github/github.go
  4. 107
      src/github.com/matrix-org/go-neb/realms/jira/jira.go
  5. 1
      src/github.com/matrix-org/go-neb/types/types.go

4
src/github.com/matrix-org/go-neb/api.go

@ -98,6 +98,10 @@ func (h *configureAuthRealmHandler) OnIncomingRequest(req *http.Request) (interf
return nil, &errors.HTTPError{err, "Error parsing config JSON", 400} return nil, &errors.HTTPError{err, "Error parsing config JSON", 400}
} }
if err := realm.Register(); err != nil {
return nil, &errors.HTTPError{err, "Error registering auth realm", 400}
}
oldRealm, err := h.db.StoreAuthRealm(realm) oldRealm, err := h.db.StoreAuthRealm(realm)
if err != nil { if err != nil {
return nil, &errors.HTTPError{err, "Error storing realm", 500} return nil, &errors.HTTPError{err, "Error storing realm", 500}

1
src/github.com/matrix-org/go-neb/goneb.go

@ -5,6 +5,7 @@ import (
"github.com/matrix-org/go-neb/clients" "github.com/matrix-org/go-neb/clients"
"github.com/matrix-org/go-neb/database" "github.com/matrix-org/go-neb/database"
_ "github.com/matrix-org/go-neb/realms/github" _ "github.com/matrix-org/go-neb/realms/github"
_ "github.com/matrix-org/go-neb/realms/jira"
"github.com/matrix-org/go-neb/server" "github.com/matrix-org/go-neb/server"
_ "github.com/matrix-org/go-neb/services/echo" _ "github.com/matrix-org/go-neb/services/echo"
_ "github.com/matrix-org/go-neb/services/github" _ "github.com/matrix-org/go-neb/services/github"

4
src/github.com/matrix-org/go-neb/realms/github/github.go

@ -53,6 +53,10 @@ func (r *githubRealm) Type() string {
return "github" return "github"
} }
func (r *githubRealm) Register() error {
return nil
}
func (r *githubRealm) RequestAuthSession(userID string, req json.RawMessage) interface{} { func (r *githubRealm) RequestAuthSession(userID string, req json.RawMessage) interface{} {
state, err := randomString(10) state, err := randomString(10)
if err != nil { if err != nil {

107
src/github.com/matrix-org/go-neb/realms/jira/jira.go

@ -0,0 +1,107 @@
package realms
import (
"crypto/rsa"
"crypto/x509"
"encoding/json"
"encoding/pem"
"errors"
log "github.com/Sirupsen/logrus"
"github.com/matrix-org/go-neb/types"
"net/http"
)
type jiraRealm struct {
id string
privateKey *rsa.PrivateKey
JIRAEndpoint string
ConsumerName string
ConsumerKey string
ConsumerSecret string
PublicKeyPEM string // clobbered based on PrivateKeyPEM
PrivateKeyPEM string
}
func (r *jiraRealm) ID() string {
return r.id
}
func (r *jiraRealm) Type() string {
return "jira"
}
func (r *jiraRealm) Register() error {
if r.ConsumerName == "" || r.ConsumerKey == "" || r.ConsumerSecret == "" || r.PrivateKeyPEM == "" {
return errors.New("ConsumerName, ConsumerKey, ConsumerSecret, PrivateKeyPEM must be specified.")
}
log.Print("Registering..")
// Make sure the private key PEM is actually a private key.
err := r.parsePrivateKey()
if err != nil {
return err
}
// TODO: Check to see if JIRA endpoint is valid and known
return nil
}
func (r *jiraRealm) RequestAuthSession(userID string, req json.RawMessage) interface{} {
return nil
}
func (r *jiraRealm) OnReceiveRedirect(w http.ResponseWriter, req *http.Request) {
}
func (r *jiraRealm) AuthSession(id, userID, realmID string) types.AuthSession {
return nil
}
func (r *jiraRealm) parsePrivateKey() error {
pk, err := loadPrivateKey(r.PrivateKeyPEM)
if err != nil {
return err
}
pub, err := publicKeyAsPEM(pk)
if err != nil {
return err
}
r.PublicKeyPEM = pub
r.privateKey = pk
return nil
}
func loadPrivateKey(privKeyPEM string) (*rsa.PrivateKey, error) {
// Decode PEM to grab the private key type
block, _ := pem.Decode([]byte(privKeyPEM))
if block == nil {
return nil, errors.New("No PEM formatted block found")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
return priv, nil
}
func publicKeyAsPEM(pkey *rsa.PrivateKey) (string, error) {
// https://github.com/golang-samples/cipher/blob/master/crypto/rsa_keypair.go
der, err := x509.MarshalPKIXPublicKey(&pkey.PublicKey)
if err != nil {
return "", err
}
block := pem.Block{
Type: "PUBLIC KEY",
Headers: nil,
Bytes: der,
}
return string(pem.EncodeToMemory(&block)), nil
}
func init() {
types.RegisterAuthRealm(func(realmID string) types.AuthRealm {
return &jiraRealm{id: realmID}
})
}

1
src/github.com/matrix-org/go-neb/types/types.go

@ -81,6 +81,7 @@ func CreateService(serviceID, serviceType string) Service {
type AuthRealm interface { type AuthRealm interface {
ID() string ID() string
Type() string Type() string
Register() error
OnReceiveRedirect(w http.ResponseWriter, req *http.Request) OnReceiveRedirect(w http.ResponseWriter, req *http.Request)
AuthSession(id, userID, realmID string) AuthSession AuthSession(id, userID, realmID string) AuthSession
RequestAuthSession(userID string, config json.RawMessage) interface{} RequestAuthSession(userID string, config json.RawMessage) interface{}

Loading…
Cancel
Save