Browse Source

Add JiraRealm type. Add Register() function to AuthRealms

Verify that PrivateKeyPEM is indeed a PEM formatted block in Register()
kegan/jira-realm
Kegan Dougal 8 years ago
parent
commit
0948f59a1a
  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. 87
      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}
}
if err := realm.Register(); err != nil {
return nil, &errors.HTTPError{err, "Error registering auth realm", 400}
}
oldRealm, err := h.db.StoreAuthRealm(realm)
if err != nil {
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/database"
_ "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/services/echo"
_ "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"
}
func (r *githubRealm) Register() error {
return nil
}
func (r *githubRealm) RequestAuthSession(userID string, req json.RawMessage) interface{} {
state, err := randomString(10)
if err != nil {

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

@ -0,0 +1,87 @@
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
ConsumerName string
ConsumerKey string
ConsumerSecret string
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.")
}
// Make sure the private key PEM is actually a private key.
_, err := loadPrivateKey(r.PrivateKeyPEM)
if err != nil {
return err
}
return nil
}
func (r *jiraRealm) RequestAuthSession(userID string, req json.RawMessage) interface{} {
reqAuth := struct {
JIRAURL string
}{}
if err := json.Unmarshal(req, reqAuth); err != nil {
log.WithError(err).Print("Error parsing request JSON")
return nil
}
if reqAuth.JIRAURL == "" {
log.Print("Missing JIRAURL")
return nil
}
// TODO: Check to see if JIRA endpoint is valid and known
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 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")
}
// TODO: Handle passwords on private keys.
// decBytes, err = x509.DecryptPEMBlock(block, []byte{}) // no pass
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
return priv, 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 {
ID() string
Type() string
Register() error
OnReceiveRedirect(w http.ResponseWriter, req *http.Request)
AuthSession(id, userID, realmID string) AuthSession
RequestAuthSession(userID string, config json.RawMessage) interface{}

Loading…
Cancel
Save