formatting and linting

This commit is contained in:
farhan 2020-12-17 04:23:25 +00:00
parent 8d56747f1c
commit 726ac7e0bd
11 changed files with 232 additions and 231 deletions

View File

@ -1,56 +1,61 @@
package main package main
import ( import (
"io/ioutil"
"encoding/json" "encoding/json"
"muzzammil.xyz/jsonc" "io/ioutil"
"log" "log"
"muzzammil.xyz/jsonc"
) )
// Database - Database configuration used by config.go
type Database struct { type Database struct {
Host string `"json:host"` Host string `"json:host"`
Port int `"json:port"` Port int `"json:port"`
Username string `"json:username"` Username string `"json:username"`
Password string `"json:password"` Password string `"json:password"`
Workers int `"json:workers"` Workers int `"json:workers"`
} }
// MassFollower - Mass follower configuration used by config.go
type MassFollower struct { type MassFollower struct {
Acct string `"json:acct"` Acct string `"json:acct"`
Name string `"json:name"` Name string `"json:name"`
Summary string `"json:summary"` Summary string `"json:summary"`
FollowingCount int `"json:followingcount"` FollowingCount int `"json:followingcount"`
FollowLimit int `"json:followlimit"` FollowLimit int `"json:followlimit"`
} }
// ExtAccount - External account configuration used by config.go
type ExtAccount struct { type ExtAccount struct {
Username string `"json:username"` Username string `"json:username"`
Password string `"json:password"` Password string `"json:password"`
Endpoint string `"json:endpoint"` Endpoint string `"json:endpoint"`
Followlimit int `"json:followlimit"` Followlimit int `"json:followlimit"`
} }
// Proxy - Configuration file proxy settings
type Proxy struct { type Proxy struct {
Host string `"json:host"` Host string `"json:host"`
Port int `"json:port"` Port int `"json:port"`
Username string `"json:username'` Username string `"json:username'`
Password string `"json:password"` Password string `"json:password"`
} }
// Settings - Configuration file structure
type Settings struct { type Settings struct {
Autostart []string `"json:autostart"` Autostart []string `"json:autostart"`
Crawl bool `"json:crawl"` Crawl bool `"json:crawl"`
Banned []string `"json:banned"` Banned []string `"json:banned"`
Alwaysbot []string `"json:alwaysbot"` Alwaysbot []string `"json:alwaysbot"`
Proxies []Proxy `"json:proxies"` Proxies []Proxy `"json:proxies"`
Externalaccounts []ExtAccount `"json:externalaccounts"` Externalaccounts []ExtAccount `"json:externalaccounts"`
MassFollowers []MassFollower `"json:massfollowers"` MassFollowers []MassFollower `"json:massfollowers"`
Database Database `"json:database"` Database Database `"json:database"`
} }
var settings Settings var settings Settings
func StringExists(needle string, haystack []string) (bool) { func stringexists(needle string, haystack []string) bool {
for _, check := range haystack { for _, check := range haystack {
if check == needle { if check == needle {
return true return true
@ -61,7 +66,7 @@ func StringExists(needle string, haystack []string) (bool) {
func getSettings() { func getSettings() {
c, err := ioutil.ReadFile("config.jsonc") c, err := ioutil.ReadFile("config.jsonc")
if (err != nil) { if err != nil {
log.Fatal("Unable to open config.jsonc, exiting: ", err) log.Fatal("Unable to open config.jsonc, exiting: ", err)
} }
jsoncbin := jsonc.ToJSON(c) // Calling jsonc.ToJSON() to convert JSONC to JSON jsoncbin := jsonc.ToJSON(c) // Calling jsonc.ToJSON() to convert JSONC to JSON

7
ctl.go
View File

@ -4,9 +4,9 @@ import (
"encoding/binary" "encoding/binary"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net"
"log"
"io" "io"
"log"
"net"
"os" "os"
) )
@ -31,7 +31,7 @@ func startctl(reportPostChan chan ReportPost) {
}(l) }(l)
for { for {
c := <-commandClient // New client connection c := <-commandClient // New client connection
go handleClient(c, reportPostChan) go handleClient(c, reportPostChan)
} }
@ -90,7 +90,6 @@ func handleClient(commandClient net.Conn, reportPostChan chan ReportPost) {
fmt.Println("Something else") fmt.Println("Something else")
} }
responseback.Type = "status" responseback.Type = "status"
responseback.RunningInstances = runninginstances responseback.RunningInstances = runninginstances

10
db.go
View File

@ -1,10 +1,10 @@
package main package main
import ( import (
"github.com/jackc/pgx/pgxpool"
"context" "context"
"log"
"fmt" "fmt"
"github.com/jackc/pgx/pgxpool"
"log"
) )
func postHandler(reportPostChan chan ReportPost, pool *pgxpool.Pool) { func postHandler(reportPostChan chan ReportPost, pool *pgxpool.Pool) {
@ -57,10 +57,10 @@ func writePost(pool *pgxpool.Pool, reportpost ReportPost) {
} }
} }
func get_db_pool() (*pgxpool.Pool) { func getDbPool() *pgxpool.Pool {
// Setup Database // Setup Database
db_uri := fmt.Sprintf("postgres://%s:%s@%s:%d/fedilogue", settings.Database.Username, settings.Database.Password, settings.Database.Host, settings.Database.Port) dbURI := fmt.Sprintf("postgres://%s:%s@%s:%d/fedilogue", settings.Database.Username, settings.Database.Password, settings.Database.Host, settings.Database.Port)
pool, err := pgxpool.Connect(context.Background(), db_uri) pool, err := pgxpool.Connect(context.Background(), dbURI)
if err != nil { if err != nil {
log.Fatal("Unable to connect to database:", err) log.Fatal("Unable to connect to database:", err)
} }

View File

@ -5,9 +5,9 @@ import (
"encoding/json" "encoding/json"
"flag" "flag"
"fmt" "fmt"
"io"
"net" "net"
"os" "os"
"io"
) )
func main() { func main() {

View File

@ -1,13 +1,13 @@
package main package main
import ( import (
_ "net/http/pprof"
"net/http"
"sync"
"regexp"
"log"
"github.com/microcosm-cc/bluemonday" "github.com/microcosm-cc/bluemonday"
"log"
"net/http"
_ "net/http/pprof"
"regexp"
"runtime" "runtime"
"sync"
) )
// Current instances // Current instances
@ -27,7 +27,7 @@ func main() {
getSettings() getSettings()
go startpprof() go startpprof()
pool := get_db_pool() pool := getDbPool()
for i := 0; i < settings.Database.Workers; i++ { for i := 0; i < settings.Database.Workers; i++ {
go postHandler(reportPostChan, pool) go postHandler(reportPostChan, pool)

View File

@ -5,89 +5,88 @@ import (
) )
const ( const (
NEW_INSTANCE = 0 NEW_INSTANCE = 0
RUNNING = 200 RUNNING = 200
UNAUTHORIZED = 401 UNAUTHORIZED = 401
FORBIDDEN = 403 FORBIDDEN = 403
NOT_FOUND = 404 NOT_FOUND = 404
UNPROCESSABLE_ENTITY = 422 UNPROCESSABLE_ENTITY = 422
TOOMANYREQUESTS = 429 TOOMANYREQUESTS = 429
INTERNAL_ERROR = 500 INTERNAL_ERROR = 500
CLIENT_ISSUE = 600 CLIENT_ISSUE = 600
ONION_PROTOCOL = 601 ONION_PROTOCOL = 601
BAD_RESPONSE = 602 BAD_RESPONSE = 602
BAD_NODEINFO = 604 BAD_NODEINFO = 604
UNSUPPORTED_INSTANCE = 605 UNSUPPORTED_INSTANCE = 605
STREAM_ENDED = 606 STREAM_ENDED = 606
KEEPALIVE = 607 KEEPALIVE = 607
) )
// Parsing Unmarshal JSON type // Parsing Unmarshal JSON type
type ReportPost struct { type ReportPost struct {
// Retrieved values // Retrieved values
Id string `json:"id"` Id string `json:"id"`
Uri string `json:"uri"` Uri string `json:"uri"`
Account AccountType Account AccountType
Content string `json:"content"` Content string `json:"content"`
Created_at string `json:"created_at"` Created_at string `json:"created_at"`
// Derived values // Derived values
normalized string normalized string
posthash []byte posthash []byte
} }
type AccountType struct { type AccountType struct {
Acct string `json:"acct"` Acct string `json:"acct"`
Avatar string `json:"avatar"` Avatar string `json:"avatar"`
Bot bool `json:"bot"` Bot bool `json:"bot"`
Created_at string `json:"created_at"` Created_at string `json:"created_at"`
Display_name string `json:"display_name"` Display_name string `json:"display_name"`
Url string `json:"url"` Url string `json:"url"`
} }
// Instance's new min_id value // Instance's new min_id value
type RunningInstance struct { type RunningInstance struct {
Software string `json:"software"` Software string `json:"software"`
Status int `json:"status"` Status int `json:"status"`
LastRun string `json:"lastrun"` LastRun string `json:"lastrun"`
CaptureType string `json:"capturetype"` CaptureType string `json:"capturetype"`
client http.Client client http.Client
} }
type NodeInfoSoftware struct { type NodeInfoSoftware struct {
Name string `json:"name"` Name string `json:"name"`
Version string `json:"version"` Version string `json:"version"`
} }
type NodeInfo struct { type NodeInfo struct {
Software NodeInfoSoftware `json:"software"` Software NodeInfoSoftware `json:"software"`
} }
type CommandMap struct { type CommandMap struct {
Type string `json:"Type"` Type string `json:"Type"`
Endpoint string `json:"Endpoint"` Endpoint string `json:"Endpoint"`
} }
type ResponseBack struct { type ResponseBack struct {
Type string `json:"Type"` Type string `json:"Type"`
Message string `json:"Message"` Message string `json:"Message"`
RunningInstances map[string]RunningInstance `json:"RunningInstances"` RunningInstances map[string]RunningInstance `json:"RunningInstances"`
} }
type Userinfo struct { type Userinfo struct {
Id string `"json:id"` Id string `"json:id"`
Type string `"json:type"` Type string `"json:type"`
Following string `"json:following"` Following string `"json:following"`
Followers string `"json:followers"` Followers string `"json:followers"`
Inbox string `"json:inbox"` Inbox string `"json:inbox"`
Outbox string `"json:outbox"` Outbox string `"json:outbox"`
Featured string `"json:featured"` Featured string `"json:featured"`
PreferredUsername string `"json:preferredUsername"` PreferredUsername string `"json:preferredUsername"`
Name string `"json:name"` Name string `"json:name"`
Summary string `"json:summary"` Summary string `"json:summary"`
Url string `"json:Url"` Url string `"json:Url"`
ManuallyApprovesFollowers string `"json:manuallyApprovesFollowers"` ManuallyApprovesFollowers string `"json:manuallyApprovesFollowers"`
Discoverable string `"json:discoverable"` Discoverable string `"json:discoverable"`
} }

View File

@ -1,14 +1,14 @@
package main package main
import ( import (
"github.com/microcosm-cc/bluemonday"
"encoding/json" "encoding/json"
"github.com/microcosm-cc/bluemonday"
"io/ioutil" "io/ioutil"
"net/http"
"strings"
"regexp"
"time"
"log" "log"
"net/http"
"regexp"
"strings"
"time"
) )
var p *bluemonday.Policy var p *bluemonday.Policy
@ -19,7 +19,7 @@ func GetNodeInfo(endpoint string) (http.Client, NodeInfo) {
/* Checking order /* Checking order
* Mastodon/Pleroma * Mastodon/Pleroma
* Um..nothing else yet * Um..nothing else yet
*/ */
pleromastodon_nodeinfo_uri := "https://" + endpoint + "/nodeinfo/2.0.json" pleromastodon_nodeinfo_uri := "https://" + endpoint + "/nodeinfo/2.0.json"
http_client := http.Client{} http_client := http.Client{}
pleromastodon_api_resp, err := http_client.Get(pleromastodon_nodeinfo_uri) pleromastodon_api_resp, err := http_client.Get(pleromastodon_nodeinfo_uri)

View File

@ -1,25 +1,25 @@
package main package main
import ( import (
"net/http"
"encoding/json"
"bytes"
"bufio" "bufio"
"log" "bytes"
"io/ioutil" "encoding/json"
"io" "io"
"io/ioutil"
"log"
"net/http"
"os" "os"
) )
type OAuth struct { type OAuth struct {
Access_token string `"json:access_token"` Access_token string `"json:access_token"`
Created_at int `"json:created_at"` Created_at int `"json:created_at"`
Expires_in int64 `"json:Expires_in"` Expires_in int64 `"json:Expires_in"`
Refresh_token string `"json:refresh_token"` Refresh_token string `"json:refresh_token"`
} }
type authError struct { type authError struct {
msg string msg string
} }
func (e *authError) Error() string { func (e *authError) Error() string {
@ -38,7 +38,7 @@ func register_client(endpoint string, http_client *http.Client) (string, string,
resp, err := http_client.Post(api_base_apps, "application/json", requestBodybytes) resp, err := http_client.Post(api_base_apps, "application/json", requestBodybytes)
if err != nil { if err != nil {
log.Fatal("Unable to connect to " + api_base_apps + " ", err) log.Fatal("Unable to connect to "+api_base_apps+" ", err)
} }
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
@ -59,17 +59,17 @@ func register_client(endpoint string, http_client *http.Client) (string, string,
f, err := os.Create("clients/" + endpoint) f, err := os.Create("clients/" + endpoint)
if err != nil { if err != nil {
log.Print("Unable to create " + client_file + ": ", err) log.Print("Unable to create "+client_file+": ", err)
return bodymap["client_id"], bodymap["client_secret"], nil return bodymap["client_id"], bodymap["client_secret"], nil
} }
defer f.Close() defer f.Close()
_, err = io.WriteString(f, bodymap["client_id"] + "\n") _, err = io.WriteString(f, bodymap["client_id"]+"\n")
if err != nil { if err != nil {
log.Print("Unable to write client_id line: ", err) log.Print("Unable to write client_id line: ", err)
return bodymap["client_id"], bodymap["client_secret"], nil return bodymap["client_id"], bodymap["client_secret"], nil
} }
_, err = io.WriteString(f, bodymap["client_secret"] + "\n") _, err = io.WriteString(f, bodymap["client_secret"]+"\n")
if err != nil { if err != nil {
log.Print("Unable to write client_secret line: ", err) log.Print("Unable to write client_secret line: ", err)
return bodymap["client_id"], bodymap["client_secret"], nil return bodymap["client_id"], bodymap["client_secret"], nil
@ -110,13 +110,13 @@ func get_client(endpoint string, http_client *http.Client) (string, string, erro
func oauth_login(endpoint string, username string, password string, client_id string, client_secret string) (OAuth, error) { func oauth_login(endpoint string, username string, password string, client_id string, client_secret string) (OAuth, error) {
authMap, err := json.Marshal(map[string]string{ authMap, err := json.Marshal(map[string]string{
"username": username, "username": username,
"password": password, "password": password,
"redirect_uri": "urn:ietf:wg:oauth:2.0:oob", "redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
"grant_type": "password", "grant_type": "password",
"client_name": "Tusky", "client_name": "Tusky",
"scope": "read write follow push", "scope": "read write follow push",
"client_id": client_id, "client_id": client_id,
"client_secret": client_secret, "client_secret": client_secret,
}) })
@ -127,9 +127,9 @@ func oauth_login(endpoint string, username string, password string, client_id st
authMapbytes := bytes.NewBuffer(authMap) authMapbytes := bytes.NewBuffer(authMap)
resp, err := http.Post("https://" + endpoint + "/oauth/token", "application/json", authMapbytes) resp, err := http.Post("https://"+endpoint+"/oauth/token", "application/json", authMapbytes)
if err != nil { if err != nil {
log.Print("Cannot connect to " + endpoint + ": ", err) log.Print("Cannot connect to "+endpoint+": ", err)
return OAuth{}, err return OAuth{}, err
} }
@ -157,19 +157,19 @@ func oauth_login(endpoint string, username string, password string, client_id st
func oauth_refresh(endpoint string, client_id string, client_secret string, refresh_token string) (OAuth, error) { func oauth_refresh(endpoint string, client_id string, client_secret string, refresh_token string) (OAuth, error) {
authMap, err := json.Marshal(map[string]string{ authMap, err := json.Marshal(map[string]string{
"redirect_uri": "urn:ietf:wg:oauth:2.0:oob", "redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
"grant_type": "refresh_token", "grant_type": "refresh_token",
"scope": "read write follow push", "scope": "read write follow push",
"refresh_token": refresh_token, "refresh_token": refresh_token,
"client_id": client_id, "client_id": client_id,
"client_secret": client_secret, "client_secret": client_secret,
}) })
authMapbytes := bytes.NewBuffer(authMap) authMapbytes := bytes.NewBuffer(authMap)
resp, err := http.Post("https://" + endpoint + "/oauth/token", "application/json", authMapbytes) resp, err := http.Post("https://"+endpoint+"/oauth/token", "application/json", authMapbytes)
if err != nil { if err != nil {
log.Print("Cannot connect to " + endpoint + ": ", err) log.Print("Cannot connect to "+endpoint+": ", err)
return OAuth{}, err return OAuth{}, err
} }

74
poll.go
View File

@ -1,59 +1,58 @@
package main package main
import ( import (
"encoding/json"
"crypto/sha1" "crypto/sha1"
"encoding/json"
"fmt"
"html"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"strings" "strings"
"html"
"time" "time"
"fmt"
"log"
) )
type ImageData struct { type ImageData struct {
Type string `"json:type"` Type string `"json:type"`
Url string `"json:url"` Url string `"json:url"`
} }
type PublicKeyData struct { type PublicKeyData struct {
Id string `"json:id"` Id string `"json:id"`
Owner string `"json:owner"` Owner string `"json:owner"`
PublicKeyPem string `"json:publicKeyPem"` PublicKeyPem string `"json:publicKeyPem"`
} }
type UserInfo struct { type UserInfo struct {
Id string `"json:id"` Id string `"json:id"`
Type string `"json:type"` Type string `"json:type"`
Following string `"json:following"` Following string `"json:following"`
Followers string `"json:followers"` Followers string `"json:followers"`
Inbox string `"json:inbox"` Inbox string `"json:inbox"`
Outbox string `"json:outbox"` Outbox string `"json:outbox"`
Featured string `"json:featured"` Featured string `"json:featured"`
PreferredUsername string `"json:preferredUsername"` PreferredUsername string `"json:preferredUsername"`
PublicKey PublicKeyData `"json:publicKeyPem"` PublicKey PublicKeyData `"json:publicKeyPem"`
Name string `"json:name"` Name string `"json:name"`
Summary string `"json:summary"` Summary string `"json:summary"`
Url string `"json:Url"` Url string `"json:Url"`
// ManuallyApprovesFollowers string `"json:manuallyApprovesFollowers"`
// ManuallyApprovesFollowers string `"json:manuallyApprovesFollowers"` // Discoverable bool `"json:discoverable"`
// Discoverable bool `"json:discoverable"`
} }
type PostInfo struct { type PostInfo struct {
Id string `"json:id"` Id string `"json:id"`
Type string `"json:type"` Type string `"json:type"`
Published string `"json:published"` Published string `"json:published"`
Url string `"json:Url"` Url string `"json:Url"`
Content string `"json:content"` Content string `"json:content"`
} }
func fetch_user_info(http_client http.Client, uri string) (UserInfo, error) { func fetch_user_info(http_client http.Client, uri string) (UserInfo, error) {
var userinfo UserInfo var userinfo UserInfo
// http_client := http.Client{} // http_client := http.Client{}
req, err := http.NewRequest(http.MethodGet, uri, nil) req, err := http.NewRequest(http.MethodGet, uri, nil)
if err != nil { if err != nil {
return UserInfo{}, err return UserInfo{}, err
@ -75,7 +74,6 @@ func fetch_user_info(http_client http.Client, uri string) (UserInfo, error) {
return userinfo, nil return userinfo, nil
} }
func fetch_post(http_client http.Client, uri string) (PostInfo, error) { func fetch_post(http_client http.Client, uri string) (PostInfo, error) {
var postinfo PostInfo var postinfo PostInfo
@ -118,7 +116,7 @@ func PollMastodonPleroma(endpoint string, reportPostChan chan ReportPost, http_c
for _, extaccount := range settings.Externalaccounts { for _, extaccount := range settings.Externalaccounts {
if extaccount.Endpoint == endpoint { if extaccount.Endpoint == endpoint {
use_auth = true use_auth = true
client_id, client_secret, err = get_client(endpoint, &http_client); client_id, client_secret, err = get_client(endpoint, &http_client)
if err != nil { if err != nil {
log.Fatal("Unable to register client: ", err) log.Fatal("Unable to register client: ", err)
} }
@ -146,7 +144,7 @@ func PollMastodonPleroma(endpoint string, reportPostChan chan ReportPost, http_c
} }
if use_auth == true { if use_auth == true {
if time.Now().Unix() > last_refresh + oauthData.Expires_in { if time.Now().Unix() > last_refresh+oauthData.Expires_in {
oauthData, err = oauth_refresh(endpoint, client_id, client_secret, oauthData.Refresh_token) oauthData, err = oauth_refresh(endpoint, client_id, client_secret, oauthData.Refresh_token)
if err != nil { if err != nil {
log.Print("Unable to refresh: ", err) log.Print("Unable to refresh: ", err)
@ -169,7 +167,7 @@ func PollMastodonPleroma(endpoint string, reportPostChan chan ReportPost, http_c
} }
if resp.StatusCode == TOOMANYREQUESTS { // Short Delay, 30 seconds if resp.StatusCode == TOOMANYREQUESTS { // Short Delay, 30 seconds
log.Print("Delaying " + endpoint + ", gave status ", resp.StatusCode, ", 1 hour delay") log.Print("Delaying "+endpoint+", gave status ", resp.StatusCode, ", 1 hour delay")
_, _ = ioutil.ReadAll(resp.Body) _, _ = ioutil.ReadAll(resp.Body)
resp.Body.Close() // Release as soon as done resp.Body.Close() // Release as soon as done
m.Status = resp.StatusCode m.Status = resp.StatusCode
@ -183,7 +181,7 @@ func PollMastodonPleroma(endpoint string, reportPostChan chan ReportPost, http_c
time.Sleep(time.Second * 30) time.Sleep(time.Second * 30)
continue continue
} else if resp.StatusCode == INTERNAL_ERROR { // Longer delay, 1 hour } else if resp.StatusCode == INTERNAL_ERROR { // Longer delay, 1 hour
log.Print("Suspending " + endpoint + ", gave status ", resp.StatusCode, ", 1 hour delay") log.Print("Suspending "+endpoint+", gave status ", resp.StatusCode, ", 1 hour delay")
_, _ = ioutil.ReadAll(resp.Body) _, _ = ioutil.ReadAll(resp.Body)
resp.Body.Close() // Release as soon as done resp.Body.Close() // Release as soon as done
m.Status = 765 m.Status = 765
@ -193,7 +191,7 @@ func PollMastodonPleroma(endpoint string, reportPostChan chan ReportPost, http_c
time.Sleep(time.Second * 3600) time.Sleep(time.Second * 3600)
continue continue
} else if resp.StatusCode != 200 { // Crash } else if resp.StatusCode != 200 { // Crash
log.Print("Terminating " + endpoint + ", gave status ", resp.StatusCode) log.Print("Terminating "+endpoint+", gave status ", resp.StatusCode)
_, _ = ioutil.ReadAll(resp.Body) _, _ = ioutil.ReadAll(resp.Body)
resp.Body.Close() // Release as soon as done resp.Body.Close() // Release as soon as done
m.Status = resp.StatusCode m.Status = resp.StatusCode
@ -303,14 +301,14 @@ func PollMastodonPleroma(endpoint string, reportPostChan chan ReportPost, http_c
} }
// Only done if we are crawling // Only done if we are crawling
if settings.Crawl == true && StringExists(endpoint, settings.Banned) == false { if settings.Crawl == true && stringexists(endpoint, settings.Banned) == false {
// Skip over this if its the same as the endpoint // Skip over this if its the same as the endpoint
if newinstance == endpoint { if newinstance == endpoint {
continue continue
} }
ri_mutex.Lock() ri_mutex.Lock()
o, exists := runninginstances[newinstance] o, exists := runninginstances[newinstance]
if exists == false || o.Status == KEEPALIVE { if exists == false || o.Status == KEEPALIVE {
m := RunningInstance{} m := RunningInstance{}
runninginstances[newinstance] = m runninginstances[newinstance] = m
go StartInstance(newinstance, reportPostChan) go StartInstance(newinstance, reportPostChan)

View File

@ -1,15 +1,15 @@
package main package main
import ( import (
"net/http"
"encoding/json"
"crypto/sha1"
"strings"
"bufio" "bufio"
"time" "crypto/sha1"
"encoding/json"
"fmt"
"html" "html"
"log" "log"
"fmt" "net/http"
"strings"
"time"
) )
func StreamMastodon(endpoint string, reportPostChan chan ReportPost) { func StreamMastodon(endpoint string, reportPostChan chan ReportPost) {
@ -29,10 +29,10 @@ func StreamMastodon(endpoint string, reportPostChan chan ReportPost) {
for _, extaccount := range settings.Externalaccounts { for _, extaccount := range settings.Externalaccounts {
if extaccount.Endpoint == endpoint { if extaccount.Endpoint == endpoint {
// use_auth = true // use_auth = true
get_client(endpoint, &http_client) get_client(endpoint, &http_client)
client_id, client_secret, err = get_client(endpoint, &http_client); client_id, client_secret, err = get_client(endpoint, &http_client)
if err != nil { if err != nil {
log.Fatal("Unable to register client: ", err) log.Fatal("Unable to register client: ", err)
} }
@ -43,10 +43,9 @@ func StreamMastodon(endpoint string, reportPostChan chan ReportPost) {
return return
} }
// This needs to updated with the time // This needs to updated with the time
// last_refresh := time.Now().Unix() // last_refresh := time.Now().Unix()
_ = time.Now().Unix() _ = time.Now().Unix()
req.Header.Add("Authorization", oauthData.Access_token) req.Header.Add("Authorization", oauthData.Access_token)
} }
@ -168,16 +167,16 @@ func StreamMastodon(endpoint string, reportPostChan chan ReportPost) {
// Reporting post // Reporting post
reportPostChan <- newpost reportPostChan <- newpost
if settings.Crawl == true && StringExists(endpoint, settings.Banned) == false { if settings.Crawl == true && stringexists(endpoint, settings.Banned) == false {
ri_mutex.Lock() ri_mutex.Lock()
o, exists := runninginstances[newinstance] o, exists := runninginstances[newinstance]
if exists == false || o.Status == KEEPALIVE { if exists == false || o.Status == KEEPALIVE {
m := RunningInstance{} m := RunningInstance{}
runninginstances[newinstance] = m runninginstances[newinstance] = m
go StartInstance(newinstance, reportPostChan) go StartInstance(newinstance, reportPostChan)
} }
ri_mutex.Unlock() ri_mutex.Unlock()
} }
} }

77
web.go
View File

@ -1,35 +1,37 @@
package main package main
import ( import (
"crypto/sha1"
"encoding/json"
"fmt" "fmt"
"html"
"io/ioutil"
"log" "log"
"net/http" "net/http"
"encoding/json"
"io/ioutil"
"html"
"time"
"strings"
"crypto/sha1"
"os" "os"
"strings"
"time"
) )
// CreateObject - Used by post web receiver
type CreateObject struct { type CreateObject struct {
Actor string `json:"actor"` Actor string `json:"actor"`
Cc []string `json:"cc"` Cc []string `json:"cc"`
Content string `json:"content"` Content string `json:"content"`
To []string `json:"to"` To []string `json:"to"`
Type string `json:"type"` Type string `json:"type"`
} }
// CreateObject - Used by post web receiver
type FindType struct { type FindType struct {
Actor string `json:"actor"` Actor string `json:"actor"`
Cc []string `json:"cc"` Cc []string `json:"cc"`
//Object interface{} `json:"Object"` //Object interface{} `json:"Object"`
Object json.RawMessage `json:"Object"` Object json.RawMessage `json:"Object"`
Id string `json:"id"` ID string `json:"id"`
Published string `json:"published"` Published string `json:"published"`
To []string `json:"to"` To []string `json:"to"`
Type string `json:"type"` Type string `json:"type"`
} }
func hostmeta(w http.ResponseWriter, r *http.Request) { func hostmeta(w http.ResponseWriter, r *http.Request) {
@ -79,7 +81,7 @@ func webfinger(w http.ResponseWriter, r *http.Request) {
if exists { if exists {
resource := resourceRaw[0] resource := resourceRaw[0]
if resource != "acct:fedilogue@" + host { if resource != "acct:fedilogue@"+host {
fmt.Println("Writes properly but wrong acct") fmt.Println("Writes properly but wrong acct")
w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Content-Type", "application/json; charset=utf-8")
fmt.Fprintf(w, webfingerstr) fmt.Fprintf(w, webfingerstr)
@ -98,7 +100,6 @@ func webfinger(w http.ResponseWriter, r *http.Request) {
func inboxHandler(reportPostChan chan ReportPost) http.HandlerFunc { func inboxHandler(reportPostChan chan ReportPost) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
fmt.Println("PATH --> ", r.URL.Path) fmt.Println("PATH --> ", r.URL.Path)
body, err := ioutil.ReadAll(r.Body) body, err := ioutil.ReadAll(r.Body)
@ -122,19 +123,19 @@ func inboxHandler(reportPostChan chan ReportPost) http.HandlerFunc {
return return
} }
newpost.Uri = findtype.Id newpost.Uri = findtype.ID
start_slashes := strings.Index(createobject.Actor, "//") + 2 startSlashes := strings.Index(createobject.Actor, "//") + 2
end_slashes := strings.Index(createobject.Actor[start_slashes:], "/") endSlashes := strings.Index(createobject.Actor[startSlashes:], "/")
newinstance := createobject.Actor[start_slashes:start_slashes+end_slashes] newinstance := createobject.Actor[startSlashes : startSlashes+endSlashes]
// For now we are just verifying the user // For now we are just verifying the user
ri_mutex.Lock() ri_mutex.Lock()
o, exist := runninginstances[newinstance] o, exist := runninginstances[newinstance]
if exist == false { if exist == false {
o := RunningInstance{} o := RunningInstance{}
new_client := http.Client{} newClient := http.Client{}
o.client = new_client o.client = newClient
o.Status = KEEPALIVE o.Status = KEEPALIVE
runninginstances[newinstance] = o runninginstances[newinstance] = o
} }
@ -176,12 +177,12 @@ func inboxHandler(reportPostChan chan ReportPost) http.HandlerFunc {
} }
} }
func users_fedilogue_followers(w http.ResponseWriter, r *http.Request) { func usersFedilogueFollowers(w http.ResponseWriter, r *http.Request) {
fmt.Println("PATH --> ", r.URL.Path) fmt.Println("PATH --> ", r.URL.Path)
host := r.Host host := r.Host
contextlist := map[string]string {"@language":"und"} contextlist := map[string]string{"@language": "und"}
context := []interface{} {"https://www.w3.org/ns/activitystreams", "https://" + host + "/schemas/litepub-0.1.jsonld", contextlist} context := []interface{}{"https://www.w3.org/ns/activitystreams", "https://" + host + "/schemas/litepub-0.1.jsonld", contextlist}
followersmap := make(map[string]interface{}) followersmap := make(map[string]interface{})
followersmap["@context"] = context followersmap["@context"] = context
@ -192,7 +193,7 @@ func users_fedilogue_followers(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, staticjson) fmt.Fprintf(w, staticjson)
} }
func users_fedilogue_following(w http.ResponseWriter, r *http.Request) { func usersFedilogueFollowing(w http.ResponseWriter, r *http.Request) {
host := r.Host host := r.Host
fmt.Println("PATH --> ", r.URL.Path) fmt.Println("PATH --> ", r.URL.Path)
staticjson := "{\"@context\": [\"https://www.w3.org/ns/activitystreams\", \"https://" + host + "/schemas/litepub-0.1.jsonld\", {\"@language\": \"und\"}], \"first\": {\"id\": \"https://" + host + "/users/fedilogue/following?page=1\", \"orderedItems\": [], \"partOf\": \"https://" + host + "/users/fedilogue/following\", \"totalItems\": 0, \"type\": \"OrderedCollectionPage\"}, \"id\": \"https://" + host + "/users/fedilogue/following\", \"totalItems\": 0, \"type\": \"OrderedCollection\"}" staticjson := "{\"@context\": [\"https://www.w3.org/ns/activitystreams\", \"https://" + host + "/schemas/litepub-0.1.jsonld\", {\"@language\": \"und\"}], \"first\": {\"id\": \"https://" + host + "/users/fedilogue/following?page=1\", \"orderedItems\": [], \"partOf\": \"https://" + host + "/users/fedilogue/following\", \"totalItems\": 0, \"type\": \"OrderedCollectionPage\"}, \"id\": \"https://" + host + "/users/fedilogue/following\", \"totalItems\": 0, \"type\": \"OrderedCollection\"}"
@ -200,7 +201,7 @@ func users_fedilogue_following(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, staticjson) fmt.Fprintf(w, staticjson)
} }
func users_fedilogue(w http.ResponseWriter, r *http.Request) { func usersFedilogue(w http.ResponseWriter, r *http.Request) {
fmt.Println("PATH --> ", r.URL.Path) fmt.Println("PATH --> ", r.URL.Path)
host := r.Host host := r.Host
@ -215,15 +216,15 @@ func users_fedilogue(w http.ResponseWriter, r *http.Request) {
publickeypemstr := string(publickeybin) publickeypemstr := string(publickeybin)
publicKey := map[string]string {"id":"https://" + host + "/users/fedilogue#main-key", "owner": "https://" + host + "/users/fedilogue", "publicKeyPem": publickeypemstr} publicKey := map[string]string{"id": "https://" + host + "/users/fedilogue#main-key", "owner": "https://" + host + "/users/fedilogue", "publicKeyPem": publickeypemstr}
capabilities := map[string]bool{} capabilities := map[string]bool{}
tag := []string{} tag := []string{}
contextlist := map[string]string {"@language":"und"} contextlist := map[string]string{"@language": "und"}
attachment := []string{} attachment := []string{}
endpoints := map[string]string {"oauthAuthorizationEndpoint":"https://" + host+ "/oauth/authorize", "oauthRegistrationEndpoint": "https://" + host + "/api/v1/apps", "oauthTokenEndpoint": "https://" + host + "/oauth/token", "sharedInbox": "https://" + host + "/inbox", "uploadMedia": "https://" + host + "/api/ap/upload_media"} endpoints := map[string]string{"oauthAuthorizationEndpoint": "https://" + host + "/oauth/authorize", "oauthRegistrationEndpoint": "https://" + host + "/api/v1/apps", "oauthTokenEndpoint": "https://" + host + "/oauth/token", "sharedInbox": "https://" + host + "/inbox", "uploadMedia": "https://" + host + "/api/ap/upload_media"}
context := []interface{} {"https://www.w3.org/ns/activitystreams", "https://" + host + "/schemas/litepub-0.1.jsonld", contextlist} context := []interface{}{"https://www.w3.org/ns/activitystreams", "https://" + host + "/schemas/litepub-0.1.jsonld", contextlist}
userjsonmap := make(map[string]interface{}) userjsonmap := make(map[string]interface{})
userjsonmap["@context"] = context userjsonmap["@context"] = context
userjsonmap["attachment"] = attachment userjsonmap["attachment"] = attachment
@ -263,9 +264,9 @@ func webmain(reportPostChan chan ReportPost) {
http.HandleFunc("/.well-known/webfinger", webfinger) http.HandleFunc("/.well-known/webfinger", webfinger)
http.HandleFunc("/.well-known/host-meta", hostmeta) http.HandleFunc("/.well-known/host-meta", hostmeta)
http.HandleFunc("/inbox", inboxHandler(reportPostChan)) http.HandleFunc("/inbox", inboxHandler(reportPostChan))
http.HandleFunc("/users/fedilogue", users_fedilogue) http.HandleFunc("/users/fedilogue", usersFedilogue)
http.HandleFunc("/users/fedilogue/followers", users_fedilogue_followers) http.HandleFunc("/users/fedilogue/followers", usersFedilogueFollowers)
http.HandleFunc("/users/fedilogue/following", users_fedilogue_following) http.HandleFunc("/users/fedilogue/following", usersFedilogueFollowing)
http.HandleFunc("/", errorHandler) http.HandleFunc("/", errorHandler)
log.Print("Starting HTTP inbox on port 8080") log.Print("Starting HTTP inbox on port 8080")
log.Fatal(http.ListenAndServe(":8080", nil)) log.Fatal(http.ListenAndServe(":8080", nil))