You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.4 KiB
100 lines
2.4 KiB
package controllers
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"strings"
|
|
|
|
"git.aiterp.net/AiteRP/aitestory/server"
|
|
"git.aiterp.net/gisle/wrouter/auth"
|
|
"github.com/sadbox/mediawiki"
|
|
)
|
|
|
|
// WikiAthenticator talks with the wiki, allowing users
|
|
// to log in
|
|
type WikiAthenticator struct{}
|
|
|
|
// ID is for a potential multi-login future
|
|
func (wikiAuth *WikiAthenticator) ID() string {
|
|
return "wiki"
|
|
}
|
|
|
|
// Name is for a potential multi-login future
|
|
func (wikiAuth *WikiAthenticator) Name() string {
|
|
return "Wiki"
|
|
}
|
|
|
|
// Find finds a user that has logged in at least once
|
|
func (wikiAuth *WikiAthenticator) Find(username string) *auth.User {
|
|
db := server.Main.DB
|
|
|
|
rows, err := db.Query("SELECT id,role FROM `user` WHERE id=?", username)
|
|
if err != nil {
|
|
log.Println("WikiAthenticator.Find:", err)
|
|
return nil
|
|
}
|
|
|
|
defer rows.Close()
|
|
|
|
if !rows.Next() {
|
|
return nil
|
|
}
|
|
|
|
user := auth.NewUser(wikiAuth, "", "member", make(map[string]string, 4))
|
|
role := "member"
|
|
rows.Scan(&user.ID, &role)
|
|
user.Data["role"] = role
|
|
|
|
return user
|
|
}
|
|
|
|
// Login login
|
|
func (wikiAuth *WikiAthenticator) Login(username, password string) (*auth.User, error) {
|
|
db := server.Main.DB
|
|
fullID := wikiAuth.ID() + ":" + username
|
|
|
|
// Connect to the wiki
|
|
client, err := mediawiki.New(server.Main.Config.Wiki.URL, server.UserAgent)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
// Log into the wiki with the credementials
|
|
err = client.Login(username, password)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Login failed %v", err)
|
|
}
|
|
|
|
// Look up the user
|
|
rows, err := db.Query("SELECT id,role FROM `user` WHERE id=?", fullID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Login failed %v", err)
|
|
}
|
|
|
|
// If none was found, just create a new record with the role of member
|
|
if !rows.Next() {
|
|
_, err = db.Exec("INSERT INTO `user` (id, role) VALUES (?, 'member')", fullID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Login failed %v", err)
|
|
}
|
|
|
|
return auth.NewUser(wikiAuth, fullID, "member", nil), nil
|
|
}
|
|
|
|
// If the user was found, read it in
|
|
userid, role := "", ""
|
|
err = rows.Scan(&userid, &role)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Login failed %v", err)
|
|
}
|
|
userid = strings.Split(userid, "@")[0]
|
|
|
|
// Make the user
|
|
return auth.NewUser(wikiAuth, strings.Split(userid, ":")[1], "member", nil), nil
|
|
}
|
|
|
|
// Register just tells the user that they can't.
|
|
func (wikiAuth *WikiAthenticator) Register(username, password string, data map[string]string) (*auth.User, error) {
|
|
return nil, errors.New("Registration not allowed")
|
|
}
|