From 06b553ab3f6355e643049dad0ccb570a0bc0d613 Mon Sep 17 00:00:00 2001 From: kaa Date: Sat, 25 Nov 2023 12:40:23 -0800 Subject: WIP Directory traversal using go. --- cantree/config.go | 5 +++ cantree/go.mod | 3 ++ cantree/test/example.json | 1 + cantree/test/t.go | 17 ++++++++ cantree/tree.go | 102 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 128 insertions(+) create mode 100644 cantree/config.go create mode 100644 cantree/go.mod create mode 100644 cantree/test/example.json create mode 100644 cantree/test/t.go create mode 100644 cantree/tree.go (limited to 'cantree') 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) + } +} -- cgit v1.2.3