diff --git a/admin/sync/exercice_hints.go b/admin/sync/exercice_hints.go index 469f65e8..82919969 100644 --- a/admin/sync/exercice_hints.go +++ b/admin/sync/exercice_hints.go @@ -1,31 +1,68 @@ package sync import ( + "bufio" + "encoding/hex" "fmt" + "io" + "os" "path" + "strings" "srs.epita.fr/fic-server/libfic" + + "github.com/dchest/blake2b" ) -func SyncExerciceHints(i Importer, exercice fic.Exercice) []string { - var errs []string - +func SyncExerciceHints(i Importer, exercice fic.Exercice) (errs []string) { if _, err := exercice.WipeHints(); err != nil { errs = append(errs, err.Error()) } else if ! i.exists(path.Join(exercice.Path, "hints")) { - return errs + return } else if hints, err := i.listDir(path.Join(exercice.Path, "hints")); err != nil { errs = append(errs, err.Error()) } else { for n, hfile := range hints { - if hint_cnt, err := getFileContent(i, path.Join(exercice.Path, "hints", hfile)); err != nil { + var hint_cnt string + + if fi, err := i.stat(path.Join(exercice.Path, "hints", hfile)); err != nil { + errs = append(errs, fmt.Sprintf("%q: unable to add hint %q: %s", path.Base(exercice.Path), hfile, err)) + } else if ! fi.IsDir() && fi.Size() > 512 { + // Handle big files as downloadable content + if res, err := i.importFile(path.Join(exercice.Path, "hints", hfile), func(filePath string, origin string) (interface{}, error) { + // Calculate hash + hash512 := blake2b.New512() + if fd, err := os.Open(filePath); err != nil { + return nil, err + } else { + defer fd.Close() + + reader := bufio.NewReader(fd) + if _, err := io.Copy(hash512, reader); err != nil { + return nil, err + } + } + result512 := hash512.Sum(nil) + + return "$FILES" + hex.EncodeToString(result512) + strings.TrimPrefix(filePath, fic.FilesDir), nil + }); err != nil { + errs = append(errs, fmt.Sprintf("%q: unable to import hint file %q: %s", path.Base(exercice.Path), hfile, err)) + continue + } else if s, ok := res.(string); !ok { + errs = append(errs, fmt.Sprintf("%q: unable to import hint file %q: invalid string returned as filename", path.Base(exercice.Path), hfile)) + continue + } else { + hint_cnt = s + } + } else if hint_cnt, err = getFileContent(i, path.Join(exercice.Path, "hints", hfile)); err != nil { errs = append(errs, fmt.Sprintf("%q: unable to read hint file %q: %s", path.Base(exercice.Path), hfile, err)) continue - } else if _, err := exercice.AddHint(fmt.Sprintf("Astuce #%d", n + 1), hint_cnt, 1); err != nil { + } + + if _, err := exercice.AddHint(fmt.Sprintf("Astuce #%d", n + 1), hint_cnt, 1); err != nil { errs = append(errs, fmt.Sprintf("%q: unable to add hint %q: %s", path.Base(exercice.Path), hfile, err)) - continue } } } - return errs + return } diff --git a/frontend/static/css/fic.css b/frontend/static/css/fic.css index 21f429f5..92b80fa9 100644 --- a/frontend/static/css/fic.css +++ b/frontend/static/css/fic.css @@ -102,6 +102,7 @@ samp.cksum { max-width: 16vw; display: inline-block; vertical-align: middle; + word-wrap: normal; } h1 small.authors { diff --git a/frontend/static/views/theme.html b/frontend/static/views/theme.html index 9cc61643..b5498453 100644 --- a/frontend/static/views/theme.html +++ b/frontend/static/views/theme.html @@ -34,19 +34,19 @@ -
-
+
+
Indices
diff --git a/libfic/hint.go b/libfic/hint.go index 7029cb8d..be84f5e6 100644 --- a/libfic/hint.go +++ b/libfic/hint.go @@ -16,8 +16,10 @@ type EHint struct { func treatHintContent(h *EHint) { if strings.HasPrefix(h.Content, "$FILES") { - h.File = path.Join(FilesDir, strings.TrimPrefix(h.Content, "$FILES")) - h.Content = "" + fpath := strings.TrimPrefix(h.Content, "$FILES") + h.Content = fpath[:128] + fpath = fpath[128:] + h.File = path.Join(FilesDir, fpath) } }