checker: deduce basechellenge from tunnel version

This commit is contained in:
nemunaire 2020-04-09 12:27:25 +02:00
parent b695eeb748
commit e1ee8d76ee
2 changed files with 34 additions and 9 deletions

View File

@ -13,7 +13,6 @@ import (
"git.nemunai.re/lectures/adlin/libadlin"
)
var baseChallenge = 100
var verbose = false
// ICMP
@ -74,12 +73,33 @@ func check_https(domain, ip string) (err error) {
// Main
func minTunnelVersion(std adlin.Student) (int, error) {
tunnels, err := std.GetTunnelTokens()
if err != nil {
return 0, err
}
var minversion int = 2147483647
for _, tunnel := range tunnels {
if tunnel.Version == 0 {
continue
}
if tunnel.Dump != nil && tunnel.Version < minversion {
minversion = tunnel.Version
}
}
return minversion, nil
}
func studentsChecker() {
students, err := adlin.GetStudents()
if err != nil {
log.Println("Unable to check students:", err)
return
}
log.Println("Checking students...")
for _, s := range students {
time.Sleep(250 * time.Millisecond)
@ -87,18 +107,24 @@ func studentsChecker() {
std := s
stdIP := adlin.StudentIP(std.Id).String() + "1"
go check_ping(stdIP, func(pkt *ping.Packet) {
tunnel_version, err := minTunnelVersion(std)
if verbose {
log.Printf("%s PONG\n", std.Login)
log.Printf("%s PONG; version=%d (%v)\n", std.Login, tunnel_version, err)
}
std.OnPong(true)
if tunnel_version == 2147483647 || tunnel_version == 0 {
log.Printf("%s unknown tunnel version: %d skipping tests (%v)", std.Login, tunnel_version, err)
return
}
// Check HTTP
if err := check_http(stdIP); err == nil {
if verbose {
log.Printf("%s just unlocked HTTP challenge\n", std.Login)
}
if _, err := std.UnlockNewChallenge(baseChallenge+0, ""); err != nil {
if _, err := std.UpdateUnlockedChallenge(baseChallenge+0, ""); err != nil {
if _, err := std.UnlockNewChallenge(100*(tunnel_version-1)+0, ""); err != nil {
if _, err := std.UpdateUnlockedChallenge(100*(tunnel_version-1)+0, ""); err != nil {
log.Printf("Unable to register challenge for %s: %s\n", std.Login, err.Error())
}
}
@ -109,8 +135,8 @@ func studentsChecker() {
if verbose {
log.Printf("%s just unlocked HTTPS challenge\n", std.Login)
}
if _, err := std.UnlockNewChallenge(baseChallenge+1, ""); err != nil {
if _, err := std.UpdateUnlockedChallenge(baseChallenge+1, ""); err != nil {
if _, err := std.UnlockNewChallenge(100*(tunnel_version-1)+1, ""); err != nil {
if _, err := std.UpdateUnlockedChallenge(100*(tunnel_version-1)+1, ""); err != nil {
log.Printf("Unable to register challenge for %s: %s\n", std.Login, err.Error())
}
}
@ -121,8 +147,8 @@ func studentsChecker() {
if verbose {
log.Printf("%s just unlocked DNS challenge\n", std.Login)
}
if _, err := std.UnlockNewChallenge(baseChallenge+2, ""); err != nil {
if _, err := std.UpdateUnlockedChallenge(baseChallenge+2, ""); err != nil {
if _, err := std.UnlockNewChallenge(100*(tunnel_version-1)+2, ""); err != nil {
if _, err := std.UpdateUnlockedChallenge(100*(tunnel_version-1)+2, ""); err != nil {
log.Printf("Unable to register challenge for %s: %s\n", std.Login, err.Error())
}
}

View File

@ -13,7 +13,6 @@ import (
func main() {
var dsn = flag.String("dsn", adlin.DSNGenerator(), "DSN to connect to the MySQL server")
flag.IntVar(&baseChallenge, "basechallenge", baseChallenge, "Base number for current challenges")
flag.BoolVar(&verbose, "verbose", verbose, "Enable verbose mode")
flag.Parse()