summaryrefslogtreecommitdiff
path: root/srv/api
diff options
context:
space:
mode:
Diffstat (limited to 'srv/api')
-rw-r--r--srv/api/api.go9
-rw-r--r--srv/api/chat.go47
2 files changed, 52 insertions, 4 deletions
diff --git a/srv/api/api.go b/srv/api/api.go
index 15627f8..39d73d9 100644
--- a/srv/api/api.go
+++ b/srv/api/api.go
@@ -22,10 +22,11 @@ import (
// Params are used to instantiate a new API instance. All fields are required
// unless otherwise noted.
type Params struct {
- Logger *mlog.Logger
- PowManager pow.Manager
- MailingList mailinglist.MailingList
- GlobalRoom chat.Room
+ Logger *mlog.Logger
+ PowManager pow.Manager
+ MailingList mailinglist.MailingList
+ GlobalRoom chat.Room
+ UserIDCalculator chat.UserIDCalculator
// ListenProto and ListenAddr are passed into net.Listen to create the
// API's listener. Both "tcp" and "unix" protocols are explicitly
diff --git a/srv/api/chat.go b/srv/api/chat.go
index 84fffde..55d9d02 100644
--- a/srv/api/chat.go
+++ b/srv/api/chat.go
@@ -4,6 +4,8 @@ import (
"errors"
"fmt"
"net/http"
+ "strings"
+ "unicode"
"github.com/mediocregopher/blog.mediocregopher.com/srv/chat"
)
@@ -39,3 +41,48 @@ func (a *api) chatHistoryHandler() http.Handler {
})
})
}
+
+func (a *api) getUserID(r *http.Request) (chat.UserID, error) {
+ name := r.PostFormValue("name")
+ if l := len(name); l == 0 {
+ return chat.UserID{}, errors.New("name is required")
+ } else if l > 16 {
+ return chat.UserID{}, errors.New("name too long")
+ }
+
+ nameClean := strings.Map(func(r rune) rune {
+ if !unicode.IsPrint(r) {
+ return -1
+ }
+ return r
+ }, name)
+
+ if nameClean != name {
+ return chat.UserID{}, errors.New("name contains invalid characters")
+ }
+
+ password := r.PostFormValue("password")
+ if l := len(password); l == 0 {
+ return chat.UserID{}, errors.New("password is required")
+ } else if l > 128 {
+ return chat.UserID{}, errors.New("password too long")
+ }
+
+ return a.params.UserIDCalculator.Calculate(name, password), nil
+}
+
+func (a *api) getUserIDHandler() http.Handler {
+ return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
+ userID, err := a.getUserID(r)
+ if err != nil {
+ badRequest(rw, r, err)
+ return
+ }
+
+ jsonResult(rw, r, struct {
+ UserID chat.UserID `json:"userID"`
+ }{
+ UserID: userID,
+ })
+ })
+}