diff options
-rw-r--r-- | canls.c | 99 | ||||
-rw-r--r-- | canup.c | 2 | ||||
-rw-r--r-- | dump | 10 | ||||
-rwxr-xr-x | dump.sh | 38 | ||||
-rw-r--r-- | makefile | 3 | ||||
-rw-r--r-- | shared.h | 28 |
6 files changed, 125 insertions, 55 deletions
@@ -1,55 +1,68 @@ #include <stdio.h> -#include <stdlib.h> -#include <string.h> +#include <stdlib.h> /* calloc */ +#include <string.h> /* memmove */ +#include <unistd.h> /* chdir */ +#include "shared.h" -enum { - bufsize = 16, -}; - -typedef char byte; - -struct listing { - long id, folder_id, size; - char *uuid, *filename, *upload_status, *content_type, *url; - char *created_at, *updated_at, *unlock_at, *lock_at, thumbnail_url; - char *modified_at, *mime_class, *media_entry_id, *category; - byte locked, hidden, hidden_for_user, locked_for_user; -}; - -typedef struct listing Listing; - -int -main() +static char *read_dir(FILE *dir_dump, char *buf) { - FILE* infile = fopen("dump", "r"); - if (infile == NULL) { - fprintf(stderr, "No dump provided. Run dump.sh.\n"); - } - - char buf[bufsize]; - char *contents = NULL; + static char *contents = NULL; int read, size = 0; - while ((read = fread(buf, 1, bufsize, infile)) > 0) { + while ((read = fread(buf, 1, bufsize, dir_dump)) > 0) { size += read; contents = realloc(contents, size); memmove(&contents[size-read], buf, read); } + return contents; +} + +const char *key_delim = "\":"; +/* Return character pointer to beginning of value. */ +char * +getval(char *str, char *key) +{ + key = realloc(key, strlen(key) + strlen(key_delim) + 1); + strcat(key, key_delim); + char *rt = strstr(str, key); + if (rt == NULL) { + fprintf(stderr, "%s\n", "Invalid key.\n"); + } + return rt; +} + +/* Count directories. */ +int +count_dir(char *contents) +{ + int count = 0; + char *p = contents; + while ((p = strstr(p, "\n")) != NULL) { + count++; + p = &p[1]; /* Increment p past the current '\n'. */ + } + return count; +} + +int +main(int argc, char **argv) +{ + + char *path = calloc(pathsize, sizeof(char)); + path[0] = '/'; - int i, j = 0; - char ch; - Listing *l = calloc(1, sizeof(Listing)); - int l_size = sizeof(Listing); - for (i = 0; i < size; i++) { - ch = contents[i]; - switch (ch) { - case '\n': - j++; - l_size += sizeof(Listing); - l = realloc(l, l_size); - break; - default: - } + chdir("dump"); + FILE *root_stream = fopen("folders", "r"); + if (root_stream == NULL) { + fprintf(stderr, "Generate a dump of your Canvas" + " account directory structure" + " using dump.sh.\n"); + return 1; } - printf("%d\n", l_size); + + char buf[bufsize]; + char *root_contents = read_dir(root_stream, buf); + int root_count = count_dir(root_contents); + printf("%d\n", root_count); + return 0; } @@ -4,7 +4,7 @@ #include <stdlib.h> #include <dirent.h> #include <unistd.h> -#include "config.h" +#include "shared.h" char *url = "https://sdccd.instructure.com/api/v1/users/self/files"; @@ -1,10 +0,0 @@ -"id":145759442,"uuid":"FBbPqRtIqzAsed4Nl1Huht1mWZCxauZfBQTYjbjd","folder_id":17503637,"display_name":"1-1.mp4","filename":"1.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759442/download?download_frd=1\u0026verifier=FBbPqRtIqzAsed4Nl1Huht1mWZCxauZfBQTYjbjd","size":457740,"created_at":"2023-10-10T18:22:45Z","updated_at":"2023-10-10T18:22:48Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:22:45Z","mime_class":"video","media_entry_id":"m-5VgVtDFKPLCjwPrGKvdEPJV7USYAS8p8","category":"uncategorized","locked_for_user":false -"id":145759448,"uuid":"OFek0dF01u2BaEEBzV6VWsh7gipwrwd59ozmsMAR","folder_id":17503637,"display_name":"1-2.mp4","filename":"1.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759448/download?download_frd=1\u0026verifier=OFek0dF01u2BaEEBzV6VWsh7gipwrwd59ozmsMAR","size":698610,"created_at":"2023-10-10T18:23:48Z","updated_at":"2023-10-10T18:23:51Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:23:48Z","mime_class":"video","media_entry_id":"m-pv8VkiJkWJDxxkJfhoGs4dSYYLom4j6","category":"uncategorized","locked_for_user":false -"id":145808071,"uuid":"FqiRoD9sO2WOJqzsDrQXNlW3YyDWv5J87ZoKwBwk","folder_id":17503637,"display_name":"1-3.mp4","filename":"1.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145808071/download?download_frd=1\u0026verifier=FqiRoD9sO2WOJqzsDrQXNlW3YyDWv5J87ZoKwBwk","size":7859303,"created_at":"2023-10-15T00:11:04Z","updated_at":"2023-10-15T00:16:10Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-15T00:11:04Z","mime_class":"video","media_entry_id":"m-2iJ8QpBNPNk9Dz9jxeE6iFgXtMCR3Pxi","category":"uncategorized","locked_for_user":false -"id":145759343,"uuid":"bw5CbntslXR4hpfaE25sP8UwTSbUiwnleqCs7yL3","folder_id":17503637,"display_name":"1.mp4","filename":"1.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759343/download?download_frd=1\u0026verifier=bw5CbntslXR4hpfaE25sP8UwTSbUiwnleqCs7yL3","size":394585,"created_at":"2023-10-10T18:13:47Z","updated_at":"2023-10-10T18:13:53Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:13:47Z","mime_class":"video","media_entry_id":"m-4AaUe8Wsar2aeUR2Gif6cuqTphvyoNqz","category":"uncategorized","locked_for_user":false -"id":145759359,"uuid":"AClgbYCaPnUaXx7XoIi4Uqv95Mj6tboBTvbKVQhi","folder_id":17503637,"display_name":"2.mp4","filename":"2.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759359/download?download_frd=1\u0026verifier=AClgbYCaPnUaXx7XoIi4Uqv95Mj6tboBTvbKVQhi","size":311927,"created_at":"2023-10-10T18:16:38Z","updated_at":"2023-10-10T18:21:39Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:16:38Z","mime_class":"video","media_entry_id":"m-p3NrT3AXosPwAcX7f1PawKfEGYjsQRw","category":"uncategorized","locked_for_user":false -"id":145759375,"uuid":"LfdmKamZskIckgWc9tF2Wky2R7AxO5K58v4nPdkI","folder_id":17503637,"display_name":"3.mp4","filename":"3.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759375/download?download_frd=1\u0026verifier=LfdmKamZskIckgWc9tF2Wky2R7AxO5K58v4nPdkI","size":null,"created_at":"2023-10-10T18:18:16Z","updated_at":"2023-10-10T18:18:16Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:18:16Z","mime_class":"video","media_entry_id":"m-2BwVBf9erBu5Q6tXn1knyxZ7FfeJDEQM","category":"uncategorized","locked_for_user":false -"id":145759410,"uuid":"90CiCh9Dp1MHqA8xxpFaethz99Nf8LS4MysPtOZa","folder_id":17503637,"display_name":"4.mp4","filename":"4.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759410/download?download_frd=1\u0026verifier=90CiCh9Dp1MHqA8xxpFaethz99Nf8LS4MysPtOZa","size":513597,"created_at":"2023-10-10T18:20:22Z","updated_at":"2023-10-10T18:20:25Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:20:22Z","mime_class":"video","media_entry_id":"m-4a4DtDGce89fexDZPcZwWfvLtF3CLLbi","category":"uncategorized","locked_for_user":false -"id":145759517,"uuid":"g0XdLJIZyfOYtj11QzKDu5dQWHmUUK2QxY8qinQu","folder_id":17503637,"display_name":"7_1-1.mp4","filename":"7_1.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759517/download?download_frd=1\u0026verifier=g0XdLJIZyfOYtj11QzKDu5dQWHmUUK2QxY8qinQu","size":512562,"created_at":"2023-10-10T18:31:08Z","updated_at":"2023-10-10T18:31:09Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:31:08Z","mime_class":"video","media_entry_id":"m-xgCoyMC1GBbEsp7VQyVygzHT34dAovn","category":"uncategorized","locked_for_user":false -"id":145759511,"uuid":"nXeUtVHYtGUarYFm1N8Wo1jXf6oryNiw36qAbVts","folder_id":17503637,"display_name":"7_1.mp4","filename":"7_1.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759511/download?download_frd=1\u0026verifier=nXeUtVHYtGUarYFm1N8Wo1jXf6oryNiw36qAbVts","size":512562,"created_at":"2023-10-10T18:30:37Z","updated_at":"2023-10-10T18:30:38Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:30:37Z","mime_class":"video","media_entry_id":"m-9VTHrTDPdeTL5CbshFAM7vFXwVTBa8R","category":"uncategorized","locked_for_user":false -"id":145759527,"uuid":"YTRw1Fii0QqILHlmfhsnSJVYB9nDak9kc1EDMjcB","folder_id":17503637,"display_name":"7_2.mp4","filename":"7_2.mp4","upload_status":"success","content-type":"video/mp4","url":"https://sdccd.instructure.com/files/145759527/download?download_frd=1\u0026verifier=YTRw1Fii0QqILHlmfhsnSJVYB9nDak9kc1EDMjcB","size":311927,"created_at":"2023-10-10T18:32:22Z","updated_at":"2023-10-10T18:32:24Z","unlock_at":null,"locked":false,"hidden":true,"lock_at":null,"hidden_for_user":true,"thumbnail_url":null,"modified_at":"2023-10-10T18:32:22Z","mime_class":"video","media_entry_id":"m-2sf1gc4JAtY95rs67DvBJAbuAjw7JCCR","category":"uncategorized","locked_for_user":false @@ -1,4 +1,40 @@ #!/bin/sh -curl -s -X GET "https://sdccd.instructure.com/api/v1/users/self/files" -H "Authorization: Bearer $CANKEY" | tr '}' '\n' | sed -e 's/{//g' -e's/\[//g' -e 's/\]//g' -e 's/^,//g' > dump +cd dump +base=https://sdccd.instructure.com/api/v1/ +get() +{ + url=$base$1 + curl -s -X GET "$url" -H "Authorization: Bearer $CANKEY" | tr '}' '\n' | sed -e 's/{//g' -e's/\[//g' -e 's/\]//g' -e 's/^,//g' +} +get users/self/folders > folders +get users/self/files > files +fi + +get_id() +{ + < folders sed -e 's/,.*//g' -e 's/.*://g' +} + +# Recursively resolve directories and files. +# Empty response: [] +get_dir() +{ + id=$1 + echo $id + mkdir $id + cd $id + get folders/$id/files > files + get folders/$id/folders > folders + for i in $(get_id) + do + get_dir $i + done + cd .. +} + +for i in $(get_id) +do + get_dir $i +done @@ -8,5 +8,8 @@ all: $(OUT) .c: $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $< + strip $@ clean: rm $(OUT) +dist: clean + rm -rf dump/* diff --git a/shared.h b/shared.h new file mode 100644 index 0000000..618d3df --- /dev/null +++ b/shared.h @@ -0,0 +1,28 @@ +enum { + cmdsize = 4096, + pathsize = 1024, + bufsize = 16, +}; + +typedef char byte; + +struct listing { + long id, folder_id, size; + char *uuid, *filename, *upload_status, *content_type, *url; + char *created_at, *updated_at, *unlock_at, *lock_at, thumbnail_url; + char *modified_at, *mime_class, *media_entry_id, *category; + byte locked, hidden, hidden_for_user, locked_for_user; +}; +typedef struct listing Listing; + +struct directory { + char *context_type, updated_at, folders_url, files_url, full_name; + char *lock_at, name, *created_at, *unlock_at; + long context_id, files_count, position, id, folders_count; + long parent_folder_id; + byte hidden, hidden_for_user, locked, locked_for_users; + byte for_submissions; +}; +typedef struct directory Directory; + +char *upload_key; |