You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
2.5 KiB
Go

package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"github.com/joho/godotenv"
)
var (
Host string
AuthPDSToken string
Secret string
)
func main() {
godotenv.Load()
if v, present := os.LookupEnv("HOST"); present {
Host = v
} else {
Host = ":8080"
}
if v, present := os.LookupEnv("AUTHPDS_TOKEN"); present {
AuthPDSToken = v
} else {
log.Fatal(`missing AUTHPDS_TOKEN`)
}
if v, present := os.LookupEnv("SECRET"); present {
Secret = v
} else {
log.Fatal(`missing SECRET`)
}
r := http.NewServeMux()
r.HandleFunc("/check-maths-user", checkMathsUserHandler)
log.Printf("Starting server on %s...\n", Host)
http.ListenAndServe(Host, r)
}
func checkMathsUserHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
return
}
// Get the username from the query parameters
userName := r.URL.Query().Get("user")
// Check if the provided authorization header matches the expected secret token
if r.Header.Get("Authorization") != "Bearer "+Secret {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
userApiUrl := fmt.Sprintf("https://api.unipi.it/authPds/api/Carriera/studente/uid/%s/", userName)
// Create a GET request to the external API
ateneoRequest, err := http.NewRequest("GET", userApiUrl, nil)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
ateneoRequest.Header.Add("Accept", "*/*")
ateneoRequest.Header.Add("Authorization", "Bearer "+AuthPDSToken)
// Make the request to the external API
ateneoResponse, err := http.DefaultClient.Do(ateneoRequest)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer ateneoResponse.Body.Close()
isMatematica, err := checkUtenteDiMatematica(ateneoResponse)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(
map[string]any{
"result": isMatematica,
},
); err != nil {
log.Printf(`encode error: %v`, err)
return
}
}
func checkUtenteDiMatematica(r *http.Response) (bool, error) {
// Check if the response contains the desired keywords
body, err := io.ReadAll(r.Body)
if err != nil {
return false, err
}
keywords := []string{"MATEMATICA", "Mobilit", "Transizione"}
for _, keyword := range keywords {
if strings.Contains(string(body), keyword) {
return true, nil
}
}
return false, nil
}