28 Commits

Author SHA1 Message Date
e72719f6b0 Merge options-pub into oauth 2022-09-19 17:34:59 +01:00
6bdbf3b83d Make it compatible with the previous version. 2022-09-18 19:16:57 +01:00
1c2e6e3da9 Fix everything odyssey pointed out. 2022-09-18 17:44:37 +01:00
65d35747fc Fix Some more stuff, disabling form actually works now. 2022-09-18 17:18:14 +01:00
af39a52971 Ok so, pages don't get disabled, but they don't show up! Half working. 2022-09-18 01:43:17 +01:00
16ea5c3138 Fix the go error. 2022-09-18 00:40:46 +01:00
0beb8a33de Did I forget the image? Maybe I did. 2022-09-18 00:37:34 +01:00
3abdbde812 Add dev to docker (there has to be a way to improve this!) 2022-09-18 00:34:45 +01:00
bfdc165346 I'm stupid. 2022-09-18 00:26:10 +01:00
64a39ac5e5 fuck this was the solution 2022-09-17 23:24:32 +01:00
950d65ca59 huh? 2022-09-17 23:23:39 +01:00
65634751b6 fix 2022-09-17 23:20:23 +01:00
7542cfba4a Meanwhile on gitea 2022-09-17 23:16:52 +01:00
9a504d1638 Partial working form and announcements settings. 2022-09-17 23:12:06 +01:00
e614ab79fa Use viper instead of the clusterfuck of json i was trying to use. 2022-09-17 22:33:44 +01:00
41209f3ee3 ignore options. 2022-09-17 22:18:21 +01:00
977136d9c2 h
Signed-off-by: Odyssey <odyssey346@disroot.org>
2022-09-17 23:08:33 +02:00
b05c48cfbb no options.sjon
Signed-off-by: Odyssey <odyssey346@disroot.org>
2022-09-17 23:04:03 +02:00
11a792d96c improve grammar here
Signed-off-by: Odyssey <odyssey346@disroot.org>
2022-09-17 23:03:47 +02:00
427bec5081 make it better 2022-09-17 21:55:50 +01:00
dc69cc447d Initial work 2022-09-17 21:50:55 +01:00
c5b3c2bd98 Initial work. 2022-09-17 21:50:46 +01:00
34bcc3d603 fix woodpecker 2022-09-16 23:16:29 +01:00
31556d3a6b Broken mess, got to fix. 2022-09-16 23:10:37 +01:00
e8d8b9b096 Update docker.yml 2022-09-15 17:37:33 +00:00
5244119ffe Initial OAuth Draft 2022-09-14 15:56:59 +01:00
03bbf440c7 Initial OAuth draft. 2022-09-14 15:55:17 +01:00
a18f76d206 Merge pull request from ProjectSegfault/form-update
WIP: Forms UI rework.
2022-09-14 13:35:17 +00:00
24 changed files with 321 additions and 65 deletions

@ -26,4 +26,4 @@ jobs:
uses: docker/build-push-action@v3 uses: docker/build-push-action@v3
with: with:
push: true push: true
tags: projectsegfault/segfautils:latest tags: realprojectsegfault/segfautils:latest

1
.gitignore vendored

@ -1 +1,2 @@
data/config.toml data/config.toml
data/announcements.json

@ -2,14 +2,18 @@ pipeline:
build: build:
when: when:
event: [push, pull_request, tag, deployment] event: [push, pull_request, tag, deployment]
image: golang:latest image: golang:latest
commands: commands:
- go build -o segfautils - go build -o segfautils
dockerize_n_publish: dockerize_n_publish:
when: when:
branch : [master]
event: [push] event: [push]
name: dockerize and publish name: dockerize and publish
image: plugins/docker image: plugins/docker
registry: git.projectsegfau.lt
repo: git.projectsegfau.lt/projectsegfault/segfautils
settings: settings:
username: username:
from_secret: username from_secret: username
@ -17,6 +21,20 @@ pipeline:
from_secret: password from_secret: password
repo: projectsegfault/segfautils repo: projectsegfault/segfautils
dockerfile: Dockerfile dockerfile: Dockerfile
dockerize_dev:
when:
event: [push]
image: plugins/docker
name: dockerize and publish dev
registry: git.projectsegfau.lt
repo: git.projectsegfau.lt/projectsegfault/segfautils
settings:
username:
from_secret: username
password:
from_secret: password
repo: projectsegfau.lt/segfautils
tags: dev
dockerfile: Dockerfile

@ -15,8 +15,30 @@ import (
var ( var (
authToken = config.AuthToken() authToken = config.AuthToken()
resAnn = config.OptAnn()
) )
func AnnCheck() {
if resAnn == "false" {
log.Println("[Segfautils] Announcements are disabled")
http.HandleFunc("/announcements", func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "Announcements are disabled.", http.StatusServiceUnavailable)
})
http.HandleFunc("/api/announcements", func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "{\"enabled\": \"false\"}", http.StatusServiceUnavailable)
})
} else {
AnnPage()
Announcements()
}
}
func AnnPage() {
http.HandleFunc("/announcements", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "static/announcements.html")
})
}
func Announcements() { func Announcements() {
http.HandleFunc("/api/announcements", getAnnouncements) http.HandleFunc("/api/announcements", getAnnouncements)
http.HandleFunc("/api/announcements/post", handleAnnouncements) http.HandleFunc("/api/announcements/post", handleAnnouncements)
@ -39,6 +61,7 @@ func handleAnnouncements(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
now := time.Now().Unix() now := time.Now().Unix()
data := map[string]interface{}{ data := map[string]interface{}{
"enabled": "true",
"title": r.FormValue("title"), "title": r.FormValue("title"),
"link": r.FormValue("link"), "link": r.FormValue("link"),
"severity": r.FormValue("severity"), "severity": r.FormValue("severity"),

@ -1,18 +1,16 @@
package api package api
import ( import (
"fmt"
"io"
"log" "log"
"net/http" "net/http"
"github.com/kataras/hcaptcha"
"fmt"
"io"
"net/url" "net/url"
"text/template"
"github.com/ProjectSegfault/segfautils/config" "github.com/ProjectSegfault/segfautils/config"
"github.com/ProjectSegfault/segfautils/utils" "github.com/ProjectSegfault/segfautils/utils"
"github.com/kataras/hcaptcha"
) )
var ( var (
@ -20,8 +18,37 @@ var (
secretKey = config.HCaptchaSecretKey() secretKey = config.HCaptchaSecretKey()
webhookURL = config.WebhookURL() webhookURL = config.WebhookURL()
client = hcaptcha.New(secretKey) /* See `Client.FailureHandler` too. */ client = hcaptcha.New(secretKey) /* See `Client.FailureHandler` too. */
resForm = config.OptForm()
) )
func FormCheck() {
if resForm == "false" {
log.Println("[Segfautils] Contact form is disabled")
http.HandleFunc("/form", func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "Form is disabled.", http.StatusServiceUnavailable)
})
} else {
FormPage()
Form()
}
}
func FormPage() {
type StaticThing struct {
HCaptchaSiteKey string
}
tmpl_form := template.Must(template.ParseFiles("static/form.html"))
http.HandleFunc("/form/", func(w http.ResponseWriter, r *http.Request) {
hcaptcha_site_key := config.HCaptchaSiteKey()
data := StaticThing{
HCaptchaSiteKey: hcaptcha_site_key,
}
tmpl_form.Execute(w, data)
})
}
func Form() { func Form() {
http.HandleFunc("/api/form", client.HandlerFunc(theActualFormCode)) http.HandleFunc("/api/form", client.HandlerFunc(theActualFormCode))
} }

15
api/oauth.go Normal file

@ -0,0 +1,15 @@
package api
import (
"github.com/ProjectSegfault/segfautils/config"
)
var (
clientID = config.OAuthClientID()
clientSecret = config.OAuthClientSecret()
redirectURL = config.OAuthRedirectURL()
authURL = config.OAuthURL()
)
func LoginOAuth() {
}

@ -15,7 +15,7 @@ func AuthToken() string {
viper.AddConfigPath("./data") viper.AddConfigPath("./data")
err := viper.ReadInConfig() err := viper.ReadInConfig()
if err != nil { if err != nil {
log.Println("Error reading config for getting segfautils.auth_token", err.Error()) log.Println("Error reading config. Error getting: segfautils.auth_token", err.Error())
} }
result := viper.GetString("segfautils.auth_token") result := viper.GetString("segfautils.auth_token")
return result return result

@ -11,7 +11,7 @@ func HCaptchaSecretKey() string {
viper.AddConfigPath("./data") viper.AddConfigPath("./data")
err := viper.ReadInConfig() err := viper.ReadInConfig()
if err != nil { if err != nil {
log.Println("Error reading config for getting hcaptcha.secret_key", err.Error()) log.Println("Error reading config. Error getting: hcaptcha.secret_key", err.Error())
} }
result := viper.GetString("hcaptcha.secret_key") result := viper.GetString("hcaptcha.secret_key")
return result return result

@ -11,7 +11,7 @@ func HCaptchaSiteKey() string {
viper.AddConfigPath("./data") viper.AddConfigPath("./data")
err := viper.ReadInConfig() err := viper.ReadInConfig()
if err != nil { if err != nil {
log.Println("Error reading config for getting hcaptcha.site_key", err.Error()) log.Println("Error reading config. Error getting: hcaptcha.site_key", err.Error())
} }
result := viper.GetString("hcaptcha.site_key") result := viper.GetString("hcaptcha.site_key")
return result return result

18
config/oauthclientid.go Normal file

@ -0,0 +1,18 @@
package config
import (
"log"
"github.com/spf13/viper"
)
func OAuthClientID() string {
viper.SetConfigName("config")
viper.AddConfigPath("./data")
err := viper.ReadInConfig()
if err != nil {
log.Println("Error reading config for getting oauth.client_id", err.Error())
}
result := viper.GetString("oauth.client_id")
return result
}

@ -0,0 +1,18 @@
package config
import (
"log"
"github.com/spf13/viper"
)
func OAuthClientSecret() string {
viper.SetConfigName("config")
viper.AddConfigPath("./data")
err := viper.ReadInConfig()
if err != nil {
log.Println("Error reading config for getting oauth.client_secret", err.Error())
}
result := viper.GetString("oauth.client_secret")
return result
}

18
config/oauthredirect.go Normal file

@ -0,0 +1,18 @@
package config
import (
"log"
"github.com/spf13/viper"
)
func OAuthRedirectURL() string {
viper.SetConfigName("config")
viper.AddConfigPath("./data")
err := viper.ReadInConfig()
if err != nil {
log.Println("Error reading config for getting oauth.redirect_url", err.Error())
}
result := viper.GetString("oauth.redirect_url")
return result
}

18
config/oauthurl.go Normal file

@ -0,0 +1,18 @@
package config
import (
"log"
"github.com/spf13/viper"
)
func OAuthURL() string {
viper.SetConfigName("config")
viper.AddConfigPath("./data")
err := viper.ReadInConfig()
if err != nil {
log.Println("Error reading config for getting oauth.auth_url", err.Error())
}
result := viper.GetString("oauth.auth_url")
return result
}

18
config/optionannounce.go Normal file

@ -0,0 +1,18 @@
package config
import (
"log"
"github.com/spf13/viper"
)
func OptAnn() string {
viper.SetConfigName("config")
viper.AddConfigPath("./data")
err := viper.ReadInConfig()
if err != nil {
log.Println("Error reading config. Error getting: options.announce", err.Error())
}
result := viper.GetString("options.announce")
return result
}

18
config/optionform.go Normal file

@ -0,0 +1,18 @@
package config
import (
"log"
"github.com/spf13/viper"
)
func OptForm() string {
viper.SetConfigName("config")
viper.AddConfigPath("./data")
err := viper.ReadInConfig()
if err != nil {
log.Println("Error reading config. Error getting: options.form", err.Error())
}
result := viper.GetString("options.form")
return result
}

@ -12,7 +12,7 @@ func Port() string {
viper.AddConfigPath("./data") viper.AddConfigPath("./data")
err := viper.ReadInConfig() err := viper.ReadInConfig()
if err != nil { if err != nil {
log.Println("Error reading config for getting segfautils.port", err.Error()) log.Println("Error reading config. Error getting: segfautils.port", err.Error())
} }
result := strconv.Itoa(viper.GetInt("segfautils.port")) result := strconv.Itoa(viper.GetInt("segfautils.port"))
return result return result

@ -11,7 +11,7 @@ func WebhookURL() string {
viper.AddConfigPath("./data") viper.AddConfigPath("./data")
err := viper.ReadInConfig() err := viper.ReadInConfig()
if err != nil { if err != nil {
log.Println("Error reading config for getting segfautils.webhook_url", err.Error()) log.Println("Error reading config. Error getting: segfautils.webhook_url", err.Error())
} }
result := viper.GetString("segfautils.webhook_url") result := viper.GetString("segfautils.webhook_url")
return result return result

@ -6,3 +6,13 @@ auth_token = "YOURAUTHTOKEN"
[hcaptcha] [hcaptcha]
site_key = "YOURSITEKEY" site_key = "YOURSITEKEY"
secret_key = "YOURSECRETKEY" secret_key = "YOURSECRETKEY"
[oauth]
client_id = "YOURCLIENTID"
client_secret = "YOURCLIENTSECRET"
redirect_url = "YOURREDIRECTURL"
auth_url = "YOURAUTHURL"
[options]
announce = true
form = false

8
data/lol.toml Normal file

@ -0,0 +1,8 @@
[segfautils]
port = 6893
webhook_url = "https://127.0.0.1:8080/segfautils"
auth_token = "121212"
[hcaptcha]
site_key = "lol"
secret_key = "lol2"

5
go.mod

@ -5,6 +5,7 @@ go 1.18
require ( require (
github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/goccy/go-json v0.9.10 // indirect github.com/goccy/go-json v0.9.10 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/gorilla/feeds v1.1.1 // indirect github.com/gorilla/feeds v1.1.1 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/kataras/hcaptcha v0.0.0-20200711031247-2927d4faf32f // indirect github.com/kataras/hcaptcha v0.0.0-20200711031247-2927d4faf32f // indirect
@ -18,8 +19,12 @@ require (
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.12.0 // indirect github.com/spf13/viper v1.12.0 // indirect
github.com/subosito/gotenv v1.3.0 // indirect github.com/subosito/gotenv v1.3.0 // indirect
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 //indirect
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
golang.org/x/text v0.3.7 // indirect golang.org/x/text v0.3.7 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/ini.v1 v1.66.4 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect

13
go.sum

@ -86,6 +86,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@ -97,6 +100,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@ -244,6 +248,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ=
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -253,6 +259,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA=
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -388,6 +396,7 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@ -451,6 +460,10 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=

25
main.go

@ -12,18 +12,13 @@ import (
) )
type StaticThingy struct { type StaticThingy struct {
Port string Port string
HCaptchaSiteKey string
} }
var port string
var shit bool
func main() { func main() {
log.Println("[Segfautils] Starting") log.Println("[Segfautils] Starting")
utils.CheckConfig() utils.CheckConfig()
log.Println("[HTTP] Starting server")
hcaptcha_site_key := config.HCaptchaSiteKey()
tmpl := template.Must(template.ParseFiles("static/index.html")) tmpl := template.Must(template.ParseFiles("static/index.html"))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
data := StaticThingy{ data := StaticThingy{
@ -32,22 +27,14 @@ func main() {
tmpl.Execute(w, data) tmpl.Execute(w, data)
}) })
tmpl_form := template.Must(template.ParseFiles("static/form.html")) log.Println("[HTTP] Starting server")
http.HandleFunc("/form/", func(w http.ResponseWriter, r *http.Request) { api.AnnCheck()
data := StaticThingy{ api.FormCheck()
HCaptchaSiteKey: hcaptcha_site_key,
}
tmpl_form.Execute(w, data)
})
http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "welcome to hell") io.WriteString(w, "welcome to hell")
}) })
http.HandleFunc("/announcements", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "static/announcements.html")
})
api.Form()
api.Announcements()
log.Println("[HTTP] HTTP server is now running at " + config.Port() + "!") log.Println("[HTTP] HTTP server is now running at " + config.Port() + "!")
log.Println(http.ListenAndServe(":"+config.Port(), nil)) log.Println(http.ListenAndServe(":"+config.Port(), nil))
} }

@ -2,7 +2,7 @@
Web utilities for Project Segfault Web utilities for Project Segfault
## What does it do? ## What does it do?
For now it powers our contact form. In the future we will expand our APIs so you can do more cool things. For now it powers our contact form and our announcements page. In the future we will expand our APIs so you can do more cool things. (We currently do not have any new idea so please open issues and give us suggestions!!)
## Setup ## Setup
@ -20,7 +20,7 @@ If you're using Portainer, you should know how to add Segfautils.
``` ```
git clone https://github.com/ProjectSegfault/segfautils git clone https://github.com/ProjectSegfault/segfautils
cd segfautils/ cd segfautils/
# You need to add the environment HCAPTCHA_SITE_KEY, HCAPTCHA_SECRET_KEY, SEGFAUTILS_WEBHOOK_URL and SEGFAUTILS_PORT. # You need to config file located in data/config.toml.
go run main.go # Run this when you've done above, and you're planning on developing, if not, do below go run main.go # Run this when you've done above, and you're planning on developing, if not, do below
go build . -o segfautils go build . -o segfautils
./segfautils ./segfautils

@ -2,37 +2,78 @@
package utils package utils
import ( import (
"log" "fmt"
"os"
)
"github.com/ProjectSegfault/segfautils/config" var (
is = 0
arrName = [9]string{"Port", "Authentication token", "Webhook URL", "HCaptcha secret", "Hcaptcha site key", "OAuth client ID", "OAuth client secret", "OAuth redirect URL", "OAuth athentication URL"}
arrCfg = [9]string{"0", "YOURAUTHTOKEN", "YOURWEBHOOKURL", "YOURSECRETKEY", "YOURSITEKEY", "YOURCLIENTID", "YOURCLIENTSECRET", "YOURREDIRECTURL", "YOURAUTHURL"}
testCfg = [9]string{"config.Authtoken()", "config.WebhookURL()", "config.HCaptchaSecretKey()", "config.HCaptchaSiteKey()", "config.OAuthClientID()", "config.OAuthClientSecret()", "config.OAuthRedirectURL()", "config.OAuthURL()"}
) )
func CheckConfig() { func CheckConfig() {
if config.Port() == "0" {
log.Fatal("[Segfautils] ❌ You need to set the port you'd like to use in the config file. Check documentation for more information.") for i := 0; i < 8; i++ {
} else { if testCfg[i] == arrCfg[i] || testCfg[i] == "" {
log.Println("[Segfautils] ✅ segfautils.port is set to", config.Port()) fmt.Println(arrCfg[i])
is = i
Fail()
} else {
fmt.Println(arrCfg[i])
fmt.Println(testCfg[i])
is = i
Check()
}
} }
if config.AuthToken() == "YOURAUTHTOKEN" || config.AuthToken() == "" { }
log.Fatal("[Segfautils] ❌ You need to set the authentication token you'd like to use in the config file. Check documentation for more information.")
} else { /*
log.Println("[Segfautils] ✅ segfautils.auth_token is set!") func CheckConfig() {
} if config.Port() == "0" {
if config.WebhookURL() == "YOURWEBHOOKURL" || config.WebhookURL() == "" { Fail()
log.Fatal("[Segfautils] ❌ You need to set the Webhook URL you'd like to use in the config file. Check documentation for more information.") } else {
} else { Check()
log.Println("[Segfautils] ✅ segfautils.webhook_url is set!") }
} if config.AuthToken() == "YOURAUTHTOKEN" || config.AuthToken() == "" {
// Hcaptcha stuff log.Fatal("[Segfautils] ❌ You need to set the authentication token you'd like to use in the config file. Check documentation for more information.")
if config.HCaptchaSecretKey() == "YOURSECRETKEY" || config.HCaptchaSecretKey() == "" { } else {
log.Fatal("[Segfautils] ❌ You need to set the HCaptcha secret you'd like to use in the config file. Check documentation for more information.") log.Println("[Segfautils] ✅ segfautils.auth_token is set!")
} else { }
log.Println("[Segfautils] ✅ segfautils.hcaptcha_secret is set!") if config.WebhookURL() == "YOURWEBHOOKURL" || config.WebhookURL() == "" {
} log.Fatal("[Segfautils] ❌ You need to set the Webhook URL you'd like to use in the config file. Check documentation for more information.")
if config.HCaptchaSiteKey() == "YOURSITEKEY" || config.HCaptchaSiteKey() == "" { } else {
log.Println("[Segfautils] ⚠️ The HCaptcha site key isn't set. You don't have to, but the demo form will not work without it. Check documentation for more information.") log.Println("[Segfautils] ✅ segfautils.webhook_url is set!")
} else { }
log.Println("[Segfautils] ✅ hcaptcha.site_key is set!") // Hcaptcha stuff
} if config.HCaptchaSecretKey() == "YOURSECRETKEY" || config.HCaptchaSecretKey() == "" {
log.Println("[Segfautils] ✅ All config checks passed!") log.Fatal("[Segfautils] ❌ You need to set the HCaptcha secret you'd like to use in the config file. Check documentation for more information.")
} else {
log.Println("[Segfautils] ✅ segfautils.hcaptcha_secret is set!")
}
if config.HCaptchaSiteKey() == "YOURSITEKEY" || config.HCaptchaSiteKey() == "" {
log.Println("[Segfautils] ⚠️ The HCaptcha site key isn't set. You don't have to, but the demo form will not work without it. Check documentation for more information.")
} else {
log.Println("[Segfautils] ✅ hcaptcha.site_key is set!")
}
log.Println("[segfautils] ✅ All config checks passed!")
log.Println("[segfautils] ✅ Listening at port ", config.Port())
}
*/
func Check() {
fmt.Printf("[Segfautils] ✅ %s is set!\n", arrName[is])
}
func Fail() {
fmt.Printf("[Segfautils] ❌ You need to set the %s you'd like to use in the config file. Check documentation for more information.\n", arrName[is])
os.Exit(Error())
}
func OptionalFail() {
fmt.Printf("[Segfautils] ⚠️ The %s isn't set. You don't have to, but the program will not be able to behave correctly. Check documentation for more information.\n", arrName[is])
}
func Error() int {
return 12
} }