checker: add test for Matrix

This commit is contained in:
nemunaire 2021-03-07 16:06:53 +01:00
parent 07e91271f4
commit 78c42e312c
1 changed files with 82 additions and 2 deletions

View File

@ -1,6 +1,7 @@
package main
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
@ -165,6 +166,66 @@ func check_https(domain, ip string) (err error) {
return
}
// MATRIX
type matrix_result struct {
WellKnownResult struct {
Result string `json:"result"`
}
DNSResult struct {
SRVError *struct {
Message string
}
}
ConnectionReports map[string]struct {
Errors []string
}
ConnectionErrors map[string]struct {
Message string
}
Version struct {
Name string `json:"name"`
Version string `json:"version"`
}
FederationOK bool
}
func check_matrix(domain string) (err error) {
var resp *http.Response
resp, err = http.Get(fmt.Sprintf("https://federation-tester.adlin.nemunai.re/api/report?server_name=%s", strings.TrimSuffix(domain, ".")))
if err != nil {
return
}
defer resp.Body.Close()
if resp.StatusCode >= 300 {
return nil
}
var federationTest matrix_result
if federationTest.FederationOK {
return nil
} else if err = json.NewDecoder(resp.Body).Decode(&federationTest); err != nil {
log.Printf("Error in chech_matrix, when decoding json:", err.Error())
return nil
} else if federationTest.DNSResult.SRVError != nil && federationTest.WellKnownResult.Result != "" {
return fmt.Errorf("%s OR %s", federationTest.DNSResult.SRVError.Message, federationTest.WellKnownResult.Result)
} else if len(federationTest.ConnectionErrors) > 0 {
var msg strings.Builder
for srv, cerr := range federationTest.ConnectionErrors {
if msg.Len() > 0 {
msg.WriteString("; ")
}
msg.WriteString(srv)
msg.WriteString(": ")
msg.WriteString(cerr.Message)
}
return fmt.Errorf("Connection errors: %s", msg.String())
} else {
return fmt.Errorf("An unimplemented error occurs. Please report to nemunaire. But know that federation seems to be broken. Check https://federationtester.matrix.org/#%s", domain)
}
}
// Main
func minTunnelVersion(std *adlin.Student, suffixip int) (int, error) {
@ -193,9 +254,11 @@ func studentsChecker() {
log.Println("Unable to check students:", err)
return
}
log.Println("Checking students...")
check_matrix_for := (time.Now().Second()/30)*5 + time.Now().Minute()%5
for _, s := range students {
log.Printf("Checking students... (std_matrix%%10=%d)\n", check_matrix_for)
for istd, s := range students {
time.Sleep(250 * time.Millisecond)
// Check ping
std := s
@ -283,6 +346,23 @@ func studentsChecker() {
log.Printf("%s and HTTPS (with DNS ip=%s): %s\n", std.Login, addr.String(), err)
}
}
// Check Matrix (only if GLUE Ok and)
if glueErr == nil && istd%10 == check_matrix_for {
if err := check_matrix(std.MyDelegatedDomain()); err == nil {
if verbose {
log.Printf("%s just unlocked Matrix challenge\n", std.Login)
}
if _, err := std.UnlockChallenge(100*(tunnel_version-1)+6, ""); err != nil {
log.Printf("Unable to register challenge for %s: %s\n", std.Login, err.Error())
}
} else {
std.RegisterChallengeError(100*(tunnel_version-1)+6, err)
if verbose {
log.Printf("%s and Matrix: %s\n", std.Login, err)
}
}
}
}
} else {
if errreg := std.RegisterChallengeError(100*(tunnel_version-1)+3, err); errreg != nil {