summaryrefslogtreecommitdiff
path: root/aplus.go
blob: 3f3640b3ab27a1f60872fc1d669855a7ef85e265 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main

import (
	"encoding/json"
	"fmt"
	"html"
	"io"
	"net/http"
	"net/url"
	"strings"
)

func get_aplus(token string, link string, client http.Client) string {
	resp, err := client.Get(link)

	if err != nil {
		fmt.Println("Error performing GET request to initial link.")
	}
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)

	var aplus Aplus
	json.Unmarshal(body, &aplus)

	return aplus.URL
}

func get_form_from_request_body(req_body []byte) string {
	body_str := string(req_body)
	form_start := strings.Index(body_str, "<form")
	form_end := strings.Index(body_str, "</form>") + 7
	form_html := req_body[form_start:form_end]

	return string(form_html)
}

// parse_form extracts form fields and values from the given HTML form string.
func parse_form(form_html string) url.Values {
	form_values := make(url.Values)
	inputs := strings.Split(form_html, "<input")

	for _, input := range inputs {
		// Extract field name and value
		name := extract_attribute(input, "name")
		value := html.UnescapeString(extract_attribute(input, "value"))

		if name != "" {
			form_values.Add(name, value)
		}
	}

	return form_values
}

func extract_attribute(input string, attribute string) string {
	start := strings.Index(input, attribute+"=\"")
	if start == -1 {
		start = strings.Index(input, attribute+"='")
	}

	if start == -1 {
		return ""
	}

	start += len(attribute) + 2

	end := strings.Index(input[start:], "\"")
	if end == -1 {
		end = strings.Index(input[start:], "'")
	}

	if end == -1 {
		return ""
	}

	return input[start : start+end]
}

func launch_aplus(course_code int) {
	aplus_link := fmt.Sprintf("%s/courses/%d/external_tools/sessionless_launch?id=913&access_token=%s", base_link, course_code, token) // 7329 always works
	aplus := get_aplus(token, aplus_link, client)

	resp, err := client.Get(aplus)

	if err != nil {
		fmt.Println("Error while performing GET request to aplus auth link.")
	}

	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)

	form_str := get_form_from_request_body(body)

	form_values := parse_form(form_str)

	resp, _ = client.PostForm("https://floridapoly.aplusattendance.com/canvas", form_values)

	body, err = io.ReadAll(resp.Body)

	if err != nil {
		fmt.Println("Error reading body of post form response from aplus attendance.")
	}

	fmt.Println(string(body))
}