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") }