summaryrefslogtreecommitdiff
path: root/cantree
diff options
context:
space:
mode:
authorkaa <kaa@disroot.org>2023-11-25 12:40:23 -0800
committerkaa <kaa@disroot.org>2023-11-25 12:40:23 -0800
commit06b553ab3f6355e643049dad0ccb570a0bc0d613 (patch)
treeef758a08c2dea66085f11c333984f5e96d4ab444 /cantree
parent3df21ef899aafd2461570687ef3b9b1c9f9a555e (diff)
WIP Directory traversal using go.HEADmaster
Diffstat (limited to 'cantree')
-rw-r--r--cantree/config.go5
-rw-r--r--cantree/go.mod3
-rw-r--r--cantree/test/example.json1
-rw-r--r--cantree/test/t.go17
-rw-r--r--cantree/tree.go102
5 files changed, 128 insertions, 0 deletions
diff --git a/cantree/config.go b/cantree/config.go
new file mode 100644
index 0000000..147a7ee
--- /dev/null
+++ b/cantree/config.go
@@ -0,0 +1,5 @@
+package main
+
+const (
+ base = `https://sdccd.instructure.com/api/v1/`
+)
diff --git a/cantree/go.mod b/cantree/go.mod
new file mode 100644
index 0000000..14df6fb
--- /dev/null
+++ b/cantree/go.mod
@@ -0,0 +1,3 @@
+module mesacsclub.com/go/cantree
+
+go 1.20
diff --git a/cantree/test/example.json b/cantree/test/example.json
new file mode 100644
index 0000000..9fb056c
--- /dev/null
+++ b/cantree/test/example.json
@@ -0,0 +1 @@
+{"id":17428885,"name":"my files","full_name":"my files","context_id":9064950,"context_type":"User","parent_folder_id":null,"created_at":"2023-08-18T04:06:27Z","updated_at":"2023-08-18T04:06:27Z","lock_at":null,"unlock_at":null,"position":null,"locked":false,"folders_url":"https://sdccd.instructure.com/api/v1/folders/17428885/folders","files_url":"https://sdccd.instructure.com/api/v1/folders/17428885/files","files_count":15,"folders_count":10,"hidden":null,"locked_for_user":false,"hidden_for_user":false,"for_submissions":false,"can_upload":true}
diff --git a/cantree/test/t.go b/cantree/test/t.go
new file mode 100644
index 0000000..203d6b9
--- /dev/null
+++ b/cantree/test/t.go
@@ -0,0 +1,17 @@
+package main
+
+import (
+ "fmt"
+ "encoding/json"
+ "io"
+ "os"
+)
+
+func main() {
+ in, _ := os.Open("example.json")
+ contents, _ := io.ReadAll(in)
+
+ var m map[string]interface{}
+ json.Unmarshal(contents, &m)
+ fmt.Printf("%v\n", m)
+} \ No newline at end of file
diff --git a/cantree/tree.go b/cantree/tree.go
new file mode 100644
index 0000000..8a7464f
--- /dev/null
+++ b/cantree/tree.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "net/http"
+ "os"
+ "encoding/json"
+ "errors"
+ "io/fs"
+ "strconv"
+)
+
+var downloadKey string
+
+func request(dirID string) []byte {
+ req, err := http.NewRequest("GET", base+dirID, nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ req.Header.Add("Authorization", "Bearer "+downloadKey)
+
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ rt, err := io.ReadAll(resp.Body)
+ if err != nil {
+ log.Fatal(err)
+ }
+ resp.Body.Close()
+
+ return rt
+}
+
+func traverse(j map[string]interface{}) {
+ name := j["name"].(string)
+ /* Internally stored as float64.
+ Must be converted to int before string. */
+ id := strconv.Itoa(int(j["id"].(float64)))
+ fmt.Println(name, id)
+
+ var files []map[string]interface{}
+ var err error
+ str := "folders/" + string(id) + "/files"
+ fmt.Println(str)
+ err = json.Unmarshal(request("folders/"+string(id)+"/files"),
+ &files)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for _, i := range files {
+ for i, j := range i {
+ fmt.Printf("%s %v\n", i, j)
+ }
+ }
+
+ return
+ err = os.Mkdir(name, 0777)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ _ = os.Chdir(name)
+ defer os.Chdir("..")
+
+
+}
+
+// Traverse and download the contents of the Canvas API.
+func main() {
+ var set bool
+ downloadKey, set = os.LookupEnv("CANKEY")
+ if !set {
+ log.Fatal("Set the environment variable CANKEY to persistently contain your Canvas account API key.")
+ }
+
+ _, err := os.Stat("root")
+ if errors.Is(err, fs.ErrNotExist) {
+ os.Mkdir("root", 0777)
+ }
+ err = os.Chdir("root")
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ body := request("users/self/folders")
+
+ var m []map[string]interface{}
+ err = json.Unmarshal(body, &m)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for _, i := range m {
+ traverse(i)
+ }
+}