From d07eb9adc696b586db8ddc0659b062907caaef81 Mon Sep 17 00:00:00 2001 From: Pablo Ovelleiro Corral Date: Fri, 19 Apr 2019 13:02:12 +0200 Subject: [PATCH] implement token fuctions set and secret --- giteabot.go | 134 +++++++++++++++++++++++----------------------------- listener.go | 5 +- 2 files changed, 62 insertions(+), 77 deletions(-) diff --git a/giteabot.go b/giteabot.go index c968092..47f674e 100644 --- a/giteabot.go +++ b/giteabot.go @@ -3,38 +3,39 @@ package main import ( "crypto/rand" "fmt" - "github.com/binaryplease/matrix-bot" + "strings" + + matrixbot "github.com/binaryplease/matrix-bot" ) //GiteaBot is the main struct to hold the bot type GiteaBot struct { *matrixbot.MatrixBot - Subscriptions map[string][]string + //map rooms to tokens + Tokens map[string]string } -//SendMessageToRooms sends a message to all roomes that have subscribed to the repo -func (gb *GiteaBot) SendMessageToRooms(repo, message string) { - for _, v := range gb.Subscriptions[repo] { - _, err = gb.Client.SendText(v, message) - if err != nil { - panic(err) +func (gb *GiteaBot) Send(token, message string) { + for k, v := range gb.Tokens { + if v == token { + gb.SendToRoom(k, message) } } } -func contains(s []string, e string) bool { - for _, a := range s { - if a == e { - return true - } - } - return false -} +// func contains(s []string, e string) bool { +// for _, a := range s { +// if a == e { +// return true +// } +// } +// return false +// } //NewGiteaBot creates a new bot form user credentials func NewGiteaBot(user, pass string) *GiteaBot { - subs := make(map[string][]string) + tokens := make(map[string]string) bot, err := matrixbot.NewMatrixBot(user, pass) @@ -44,86 +45,69 @@ func NewGiteaBot(user, pass string) *GiteaBot { gbot := &GiteaBot{ bot, - subs, + tokens, } - bot.RegisterCommand("!sub", 0, gbot.handleCommandAddSub) - bot.RegisterCommand("!unsub", 0, gbot.handleCommandRemoveSub) - bot.RegisterCommand("!listsubs", 0, gbot.handleCommandListSubs) - bot.RegisterCommand("!help", 0, gbot.handleCommandHelp) - bot.RegisterCommand("!secret", 0, gbot.handleCommandSecret) + bot.RegisterCommand("!gitea help", 0, gbot.handleCommandHelp) + bot.RegisterCommand("!gitea secret", 0, gbot.handleCommandSecret) + bot.RegisterCommand("!gitea set", 0, gbot.handleCommandSet) return gbot } func tokenGenerator() string { - b := make([]byte, 4) + //TODO make token length configurable + b := make([]byte, 20) rand.Read(b) return fmt.Sprintf("%x", b) } +func (gb *GiteaBot) handleCommandSet(message, room, sender string) { + + // Get the parameter(s) given to the command + args := strings.Split(message, " ") + + // Display help/error if more than one argument is given + if len(args) != 3 { + gb.SendToRoom(room, "set expects exactly one argument") + gb.SendToRoom(room, "!gitea set ") + } else { + // Display help/error if the token has the wrong length + if len(args[2]) != 20 { + gb.SendToRoom(room, "Tokens have a length of 20 characters") + } else { + // If the token seems ok, set it for the room + gb.SendToRoom(room, "Setting token for this room to:") + gb.SendToRoom(room, args[2]) + gb.Tokens[room] = args[2] + } + } +} + func (gb *GiteaBot) handleCommandSecret(message, room, sender string) { - //TODO - gb.SendToRoom(room, "NOT implemented yet") -} -func (gb *GiteaBot) handleCommandListSubs(message, room, sender string) { - - repos := "" - - for k, repo := range gb.Subscriptions { - for _, subscriber := range repo { - if subscriber == room { - repos = repos + "\n -" + k - } - } + //Check if room already has a token + if gb.Tokens[room] != "" { + gb.SendToRoom(room, "This room already has a token. Your secert token is:") + gb.SendToRoom(room, gb.Tokens[room]) + return } - if repos == "" { - gb.SendToRoom(room, "This room has not subscribed to any repositorys.") - } else { - msg := "This room has is subscribed to the following repositorys:" + repos - gb.SendToRoom(room, msg) - } -} + token := tokenGenerator() + gb.Tokens[room] = token -func (gb *GiteaBot) handleCommandAddSub(message string, room, sender string) { + gb.SendToRoom(room, "Your secert token is:") + gb.SendToRoom(room, token) - repo := message[5:] - if !contains(gb.Subscriptions[repo], room) { - gb.Subscriptions[repo] = append(gb.Subscriptions[repo], room) - gb.SendToRoom(room, "Subscribed to: "+repo) - } else { - gb.SendToRoom(room, "This room has already subscribed to: "+repo) - } -} - -func (gb *GiteaBot) handleCommandRemoveSub(message, room, sender string) { - - repo := message[7:] - fmt.Println(gb.Subscriptions[repo]) - - if contains(gb.Subscriptions[repo], room) { - - var tmp []string - - for _, v := range gb.Subscriptions[repo] { - if v != room { - fmt.Println("readding '" + v + "'" + "because it is not equal to '" + room + "'") - tmp = append(tmp, v) - } else { - gb.SendToRoom(room, "Un-subscribed from: "+repo) - } - } - gb.Subscriptions[repo] = tmp - } else { - gb.SendToRoom(room, "This room has not subscribed to: "+repo) - } + gb.SendToRoom(room, "Set up a weebhook in gitea with that token as secret") + //TODO change this to a real URL or make it configurable + gb.SendToRoom(room, "http://192.168.2.33:9000/post/") } func (gb *GiteaBot) handleCommandHelp(message, room, sender string) { + //TODO maybe make this help auto-generated for bots in general? helpMsg := ` I'm your friendly Gitea Bot! diff --git a/listener.go b/listener.go index 0c70998..7ba745a 100644 --- a/listener.go +++ b/listener.go @@ -38,7 +38,6 @@ func PostHandler(w http.ResponseWriter, r *http.Request) { var postData GiteaPostData - //TODO check secret! //TODO check repo json.Unmarshal(body, &postData) @@ -50,7 +49,9 @@ func PostHandler(w http.ResponseWriter, r *http.Request) { fmt.Println(string(body)) fmt.Println("=================================================") message := generateMessage(postData, r.Header.Get("X-Gitea-Event")) - mygiteabot.SendMessageToRooms(postData.Repository.Name, message) + + // mygiteabot.SendMessageToRooms(postData.Repository.Name, message) + mygiteabot.Send(postData.Secret, message) fmt.Println("=================================================") fmt.Fprint(w, "POST done")