diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ced8e1c..db9be74 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -55,31 +55,16 @@ jobs: exit 1 fi - - name: Run functional tests - run: | - go test ./ -run=^Test_F -coverprofile=functional.out -json | tee -a gotest.json - env: - URL: http://localhost:8000 - - name: Run integration test run: | - go build -cover -o ctfd-setup cmd/ctfd-setup/main.go - mkdir coverdir - GOCOVERDIR=coverdir ./ctfd-setup - go tool covdata textfmt -i=coverdir -o integration.out - sed -i '/^\//d' integration.out + ./hack/examples.sh env: URL: http://localhost:8000 - APPEARANCE_NAME: 'CTFer.io' - APPEARANCE_DESCRIPTION: 'CTFer.io test CTFd setup' - ADMIN_NAME: 'ctfer' - ADMIN_EMAIL: 'ctfer-io@protonmail.com' - ADMIN_PASSWORD: 'ctfer' - name: Merge coverage data run: | go install go.shabbyrobe.org/gocovmerge/cmd/gocovmerge@fa4f82cfbf4d57c646c1ed0f35002bf1b89fbf7a - gocovmerge unit.out functional.out integration.out > cov.out + gocovmerge unit.out integration.out > cov.out - name: Upload coverage to Coveralls uses: shogo82148/actions-goveralls@785c9d68212c91196d3994652647f8721918ba11 # v1.9.0 diff --git a/cmd/ctfd-setup/main.go b/cmd/ctfd-setup/main.go index 631b78c..6138e92 100644 --- a/cmd/ctfd-setup/main.go +++ b/cmd/ctfd-setup/main.go @@ -174,7 +174,7 @@ func main() { // => Pages &cli.StringFlag{ Name: "pages.robots_txt", - Usage: "Define the /robots.txt file content, for web crawlers indexing.", + Usage: "Define the /robots.txt file content, for web crawlers indexing. Provide a path to a locally-accessible file.", EnvVars: []string{"PAGES_ROBOTS_TXT", "PLUGIN_PAGES_ROBOTS_TXT"}, Category: configuration, }, @@ -502,6 +502,14 @@ func run(ctx *cli.Context) error { if err != nil { return err } + tos, err := filePtr(ctx, "legal.tos.content") + if err != nil { + return err + } + privpol, err := filePtr(ctx, "legal.privacy_policy.content") + if err != nil { + return err + } conf := &ctfdsetup.Config{ Appearance: ctfdsetup.Appearance{ Name: ctx.String("appearance.name"), @@ -585,11 +593,11 @@ func run(ctx *cli.Context) error { Legal: &ctfdsetup.Legal{ TOS: ctfdsetup.ExternalReference{ URL: stringPtr(ctx, "legal.tos.url"), - Content: stringPtr(ctx, "legal.tos.content"), + Content: tos, }, PrivacyPolicy: ctfdsetup.ExternalReference{ URL: stringPtr(ctx, "legal.privacy_policy.url"), - Content: stringPtr(ctx, "legal.privacy_policy.content"), + Content: privpol, }, }, Mode: ctx.String("mode"), diff --git a/config.go b/config.go index c6aaa63..c13ad90 100644 --- a/config.go +++ b/config.go @@ -223,7 +223,7 @@ type ( URL *string `yaml:"url,omitempty" json:"url,omitempty"` // The content of the reference. - Content *string `yaml:"content,omitempty" json:"content,omitempty"` + Content *File `yaml:"content,omitempty" json:"content,omitempty"` } // Admin accesses. @@ -264,8 +264,15 @@ func NewConfig() *Config { Email: &Email{}, Time: &Time{}, Social: &Social{}, - Legal: &Legal{}, - Mode: "users", // default value + Legal: &Legal{ + TOS: ExternalReference{ + Content: &File{}, + }, + PrivacyPolicy: ExternalReference{ + Content: &File{}, + }, + }, + Mode: "users", // default value } } diff --git a/config_test.go b/config_test.go index 79ec95a..cbdf782 100644 --- a/config_test.go +++ b/config_test.go @@ -1,19 +1,10 @@ package ctfdsetup_test import ( - "context" - "os" - "path/filepath" "testing" ctfdsetup "github.com/ctfer-io/ctfd-setup" - "github.com/ctfer-io/go-ctfd/api" "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" -) - -const ( - dir = "examples" ) func Test_U_ConfigSchema(t *testing.T) { @@ -26,71 +17,3 @@ func Test_U_ConfigSchema(t *testing.T) { assert.NoError(err) assert.NotEmpty(schema) } - -func Test_F_Examples(t *testing.T) { - url, ok := os.LookupEnv("URL") - if !ok { - t.Fatal("environment variable URL is not defined") - } - - files, err := os.ReadDir(dir) - if !assert.NoError(t, err) { - return - } - - for _, f := range files { - if f.IsDir() { - continue - } - - t.Run(f.Name(), func(t *testing.T) { - assert := assert.New(t) - ctx := context.Background() - - c, err := os.ReadFile(filepath.Join(dir, f.Name())) - if !assert.NoError(err) { - return - } - - // Extract config - cfg := ctfdsetup.NewConfig() - err = yaml.Unmarshal(c, cfg) - assert.NoError(err) - - err = cfg.Validate() - if !assert.NoError(err) { - return - } - - // Login then reset (required to run multiple test cases) - defer func() { - nonce, session, err := api.GetNonceAndSession(url, api.WithContext(ctx)) - assert.NoError(err) - client := api.NewClient(url, nonce, session, "") - - err = client.Login(&api.LoginParams{ - Name: cfg.Admin.Name, - Password: cfg.Admin.Password.Content, - }, api.WithContext(ctx)) - assert.NoError(err) - - err = client.Reset(&api.ResetParams{ - Accounts: ptr("true"), - Submissions: ptr("true"), - Challenges: ptr("true"), - Pages: ptr("true"), - Notifications: ptr("true"), - }) - assert.NoError(err) - }() - - // Setup CTFd - err = ctfdsetup.Setup(ctx, url, "", cfg) - assert.NoError(err) - }) - } -} - -func ptr[T any](t T) *T { - return &t -} diff --git a/examples/minimal.yaml b/examples/minimal/.ctfd.yaml similarity index 100% rename from examples/minimal.yaml rename to examples/minimal/.ctfd.yaml diff --git a/examples/nobrackets2024/.ctfd.yaml b/examples/nobrackets2024/.ctfd.yaml new file mode 100644 index 0000000..d609e79 --- /dev/null +++ b/examples/nobrackets2024/.ctfd.yaml @@ -0,0 +1,32 @@ +appearance: + name: "NoBracketsCTF 2024 - Finale" + description: "" + +theme: + logo: + from_file: logo.png + small_icon: + from_file: tab-icon.png + name: core + header: + from_file: theme-header.html + +settings: + challenge_visibility: public + account_visibility: public + score_visibility: private + registration_visibility: public + +# Don't set time, not very usefull in replicability + +legal: + tos: + content: + from_file: tos.md + +mode: teams + +admin: + name: 'my-name' + email: 'my-email@dns.tld' + password: 'dont put password in a config file, use the varenv' diff --git a/examples/nobrackets2024/README.md b/examples/nobrackets2024/README.md new file mode 100644 index 0000000..7e265d0 --- /dev/null +++ b/examples/nobrackets2024/README.md @@ -0,0 +1,8 @@ +
+

+

NoBrackets 2024

+
+ +The NoBrackets 2024 example shows how to setup CTFd for this event. + +Stylesheet and images are the property of GCC and were granted free right of use by [GCC](https://github.com/gcc-ensibs) diff --git a/examples/nobrackets2024/index.html b/examples/nobrackets2024/index.html new file mode 100644 index 0000000..0b4687f --- /dev/null +++ b/examples/nobrackets2024/index.html @@ -0,0 +1,26 @@ +
+
+ +

Concours de cybersécurité à destination des lycéennes et des lycéens

+
+

Horaires de la finale :
20 novembre 2024 : 10h - 16h30

+
+

Créez-vous un compte puis rejoignez votre équipe avec le mot de passe fourni.

+
+

Accès à notre Wiki

+

Rejoindre le Discord

+
+

Un grand merci à nos partenaires et sponsors :

+ + + +
+

Le NoBracketsCTF est organisé par le club étudiant Galette Cidre CTF (GCC), par des élèves des spécialités Cyberdéfense, Cybersécurité du Logiciel et Cybersécurité et Sciences des Données de l'Ecole Nationale Supérieure d'Ingénieurs de Bretagne Sud (ENSIBS).

+

Suivez-nous sur les réseaux !

+

+   +   + +

+
+
\ No newline at end of file diff --git a/examples/nobrackets2024/logo.png b/examples/nobrackets2024/logo.png new file mode 100644 index 0000000..76d414f Binary files /dev/null and b/examples/nobrackets2024/logo.png differ diff --git a/examples/nobrackets2024/tab-icon.png b/examples/nobrackets2024/tab-icon.png new file mode 100644 index 0000000..bfe9a69 Binary files /dev/null and b/examples/nobrackets2024/tab-icon.png differ diff --git a/examples/nobrackets2024/theme-header.html b/examples/nobrackets2024/theme-header.html new file mode 100644 index 0000000..09a00f4 --- /dev/null +++ b/examples/nobrackets2024/theme-header.html @@ -0,0 +1,98 @@ + + \ No newline at end of file diff --git a/examples/nobrackets2024/tos.md b/examples/nobrackets2024/tos.md new file mode 100644 index 0000000..3d29aa0 --- /dev/null +++ b/examples/nobrackets2024/tos.md @@ -0,0 +1,91 @@ +# Conditions générales d'utilisation en vigeur depuis le 15/08/2024 +Les présentes conditions générales d'utilisation (dites « CGU ») ont pour objet l'encadrement juridique des modalités de mise à disposition du site et des services par le club GCC dépendant lui-même du BDE de l’ENSIBS et de définir les conditions d’accès et d’utilisation des services par « l'Utilisateur » participant au NoBracketsCTF (Capture The Flag). + +Toute inscription ou utilisation du site ou du service implique l'acceptation sans aucune réserve ni restriction des présentes CGU par l’utilisateur. En cas de non-acceptation des CGU stipulées dans le présent contrat, l'Utilisateur se doit de renoncer à l'accès des services proposés par le site. + +Le club GCC se réserve le droit de modifier unilatéralement et à tout moment le contenu des présentes CGU. + + +## ARTICLE 1 : Accès au site + +Le site https://nobrackets.fr permet à l'Utilisateur un accès gratuit aux servics suivants : +* Mise à disposition de machines de travail durant le CTF +* Authentification (identifiant + mot de passe) + +Le site est accessible gratuitement en tout lieu à tout Utilisateur ayant un accès à Internet. Tous les frais supportés par l'Utilisateur pour accéder au service (matériel informatique, logiciels, connexion Internet, etc.) sont à sa charge. +L’Utilisateur non-membre n'a pas accès aux services réservés. Pour cela, il doit s’inscrire en remplissant le formulaire. En acceptant de s’inscrire aux services réservés, l’Utilisateur membre s’engage à fournir des informations sincères et exactes concernant son état civil et ses coordonnées, notamment son nom et son prénom ainsi que le nom de son équipe. L’Utilisateur doit être inscrit au NoBracketsCTF pour accéder aux services. +Pour accéder aux services, l’Utilisateur doit ensuite s'identifier à l'aide de son identifiant et de son mot de passe. +Tout événement dû à un cas de force majeure ayant pour conséquence un dysfonctionnement du site ou serveur et sous réserve de toute interruption ou modification en cas de maintenance, n'engage pas la responsabilité de nobrackets.fr. Dans ces cas, l’Utilisateur accepte ainsi ne pas tenir rigueur à l’éditeur de toute interruption ou suspension de service, même sans préavis. +L'Utilisateur a la possibilité de contacter le site par messagerie électronique à l’adresse email nobrackets-ctf@mailo.com + +## ARTICLE 2 : Collecte des données + +Le site assure à l'Utilisateur une collecte et un traitement d'informations personnelles dans le respect de la vie privée conformément à la loi n°78-17 du 6 janvier 1978 relative à l'informatique, aux fichiers et aux libertés. +En vertu de la loi Informatique et Libertés, en date du 6 janvier 1978, l'Utilisateur dispose d'un droit d'accès, de rectification, de suppression et d'opposition de ses données personnelles. L'Utilisateur exerce ce droit : +* par mail à l'adresse email : nobrackets-ctf@mailo.com + +## ARTICLE 3 : Propriété intellectuelle + +Les marques, logos, signes ainsi que tous les contenus du site (textes, images, son…) font l'objet d'une protection par le Code de la propriété intellectuelle et plus particulièrement par le droit d'auteur. + +L'Utilisateur doit solliciter l'autorisation préalable du site pour toute reproduction, publication, copie des différents contenus. Il s'engage à une utilisation des contenus du site dans un cadre strictement privé, toute utilisation à des fins commerciales et publicitaires est strictement interdite. +Toute représentation totale ou partielle de ce site par quelque procédé que ce soit, sans l’autorisation expresse de l’exploitant du site Internet constituerait une contrefaçon sanctionnée par l’article L 335-2 et suivants du Code de la propriété intellectuelle. +Il est rappelé conformément à l’article L122-5 du Code de propriété intellectuelle que l’Utilisateur qui reproduit, copie ou publie le contenu protégé doit citer l’auteur et sa source. + +## ARTICLE 4 : Responsabilité + +Le club GCC est responsable des contenus figurant sur le site et s'engage à rester vigilant sur la diffusion des contenus. +Le site https://nobrackets.fr ne peut être tenu pour responsable d’éventuels virus qui pourraient infecter l’ordinateur ou tout matériel informatique de l’Internaute, suite à une utilisation, à l’accès, ou au téléchargement provenant de ce site. +Le club GCC ne garantit pas l'aptitude du site et/ou des services à répondre à des attentes ou besoins particuliers de l'Utilisateur. +Malgré des mises à jour régulières, le site https://nobrackets.fr ne peut être tenu responsable de la modification des dispositions administratives et juridiques survenant après la publication. De même, le site ne peut être tenu responsable de l’utilisation et de l’interprétation de l’information contenue dans ce site. +Le site ne pourra être tenu responsable : +* Des informations renseignées sur le compte par l'utilisateur, ainsi que de leur appréciation par une quelconque administration ou juridiction. +* De l'usage fait du site et/ou des services par tout utilisateur, notamment quant à la véracité des informations communiquées. + +Le site exclut toute responsabilité en cas d'utilisation frauduleuse par un tiers de l'identifiant et du mot de passe de l'Utilisateur dû à une négligence de l'Utilisateur ou au non-respect par ce dernier des consignes de sécurité prévues aux présentes CGU. L'Utilisateur conserve la possibilité de démontrer qu'il n'est pas responsable de l'utilisation frauduleuse de ses identifiant et mot de passe. +En outre, le site ne pourra être responsable des dommages pouvant être causés du fait : +* De l'utilisation des services par l'utilisateur de manière non conforme aux présentes CGU et à la réglementation en vigueur ; +* D'informations diffusées sur le compte de l'utilisateur ou de déclarations mensongères de l'utilisateur lors de la création du compte ; +* Du paramétrage de l'ordinateur de l'utilisateur permettant de s'identifier automatiquement et de laisser ainsi la possibilité à tout tiers d'utiliser le site ou les services avec son compte ou en usurpant son identité. En conséquence, pour limiter ce risque, l'utilisateur est invité à sécuriser l'accès à son compte. + + +Malgré des mises à jour régulières, le site https://nobrackets.fr ne peut être tenu responsable de la modification des dispositions administratives et juridiques survenant après la publication. De même, le site ne peut être tenu responsable de l’utilisation et de l’interprétation de l’information contenue dans ce site. +L’Utilisateur s’engage à ne pas partager les solutions aux challenges présents sur le site et ce, que ce soit via internet ou directement à d’autres personnes, sans autorisation préalable obtenue de la part du club GCC. +La responsabilité du site ne peut être engagée en cas de force majeure ou du fait imprévisible et insurmontable d'un tiers. + +## ARTICLE 5 : Responsabilité de l’Utilisateur + +L'Utilisateur est responsable de l'utilisation de son compte ainsi que de l'utilisation de ses éléments d'identification. +L'Utilisateur reconnaît que toute utilisation du site et/ou des services, et plus particulièrement tout accès à son compte avec ses éléments d'identification, est présumée faite par l'utilisateur et lui sera imputée, à charge pour l'Utilisateur d'apporter la preuve contraire. +L'Utilisateur est seul responsable des informations qu'il souhaite mettre sur son compte. +L'Utilisateur est responsable de tous les dommages qu'il pourra causer à https://nobrackets.fr du fait du non-respect des CGU. En cas de manquement de l'utilisateur aux présentes CGU, l'accès aux services pourra être automatiquement bloqué, sans préjudice de toute action judiciaire qui pourrait être intentée par https://nobrackets.fr et de tous dommages et intérêts qui pourraient être réclamés. +L’Utilisateur s'engage à informer le site sans délai, par tous moyens, de toute erreur, faute ou irrégularité qu'il constaterait dans l'utilisation du site, de son compte et/ou des services, et ce, dès qu'il en a connaissance. + +Afin de répondre à une alerte de sécurité (contrôle anti-virus, etc.), à la demande d'une autorité (administrative, judiciaire ou toute autorité habilitée), à une alerte émanant d'un autre Utilisateur, le site se réserve le droit le cas échéant : +* De conserver, à des fins de preuve, toute information ne respectant pas les règles fixées par les Conditions Générales d'Utilisation mais également tous logs ou traces de connexion en relation avec la gestion ou le contrôle du compte de l'utilisateur ; +* De conserver, à des fins de preuve, tous logs, traces de connexion ou données à caractère personnel ou non prouvant l'imputabilité à l'utilisateur des comportements ou actions en cause ; +* De modifier, rejeter et/ou supprimer l'accès à toute information ne respectant pas les règles fixées aux présentes CGU. + + +L’Utilisateur s’engage à ne pas perturber le bon fonctionnement de https://nobrackets.fr. A ce titre, sans que cette liste ne soit exhaustive, les comportements énoncés ci-après sont interdits : +* Accès ou maintien frauduleux à https://*.nobrackets.fr ; +* Entrave ou altération à son fonctionnement ; +* Introduction de virus ; +* Endommagement ; +* Accès illégal à des données stockées ; +* Utilisation des ressources d’une manière illégale ; + * Utilisation de ressources d’une manière pouvant porter atteinte à d’autres personnes ; + * Utilisation de robot d’aspiration de données (« scrapping »), ou plus généralement de tout autre outil de collecte de données dans le but d’extraire ou de réutiliser une partie substantielle des éléments de contenu. + + +Le non-respect des stipulations du présent paragraphe pourra engager la responsabilité de l’Utilisateur et dans certains cas, engendrer le prononcé de sanctions pénales. + +## ARTICLE 6 : Liens hypertextes + +Des liens hypertextes peuvent être présents sur le site. L’Utilisateur est informé qu’en cliquant sur ces liens, il sortira du site https://nobrackets.fr. Ce dernier n’a pas de contrôle sur les pages web sur lesquelles aboutissent ces liens et ne saurait, en aucun cas, être responsable de leur contenu. + + +## ARTICLE 7 : Droit applicable et juridiction compétente + +La législation française s'applique au présent contrat. En cas d'absence de résolution amiable d'un litige né entre les parties, les tribunaux français seront seuls compétents pour en connaître. +Pour toute question relative à l’application des présentes CGU, vous pouvez joindre l’éditeur aux coordonnées suivantes : nobrackets-ctf@mailo.com. diff --git a/hack/examples.sh b/hack/examples.sh new file mode 100755 index 0000000..f641258 --- /dev/null +++ b/hack/examples.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Build binary +go build -cover -o ctfd-setup cmd/ctfd-setup/main.go +GOCOVERDIR=coverdir +mkdir "$GOCOVERDIR" + +# Execute every examples +# WARNING: every '.admin' must be equal in order to reuse the CTFd instance +for dir in examples/*/; do + if [[ -d "$dir" ]]; then + ( + cd "$dir" + GOCOVERDIR="../../$GOCOVERDIR" ../../ctfd-setup --url "$URL" --file .ctfd.yaml + ) + fi +done + +# Merge coverage data +go tool covdata textfmt "-i=$GOCOVERDIR" -o integration.out +sed -i '/^\//d' integration.out + +# Remove traces +rm -rf "$GOCOVERDIR" +rm ctfd-setup diff --git a/setup.go b/setup.go index 8e15ad0..39c7da6 100644 --- a/setup.go +++ b/setup.go @@ -167,9 +167,9 @@ func updateSetup(ctx context.Context, client *api.Client, conf *Config) error { ViewAfterCTF: conf.Time.ViewAfter, SocialShares: conf.Social.Shares, PrivacyURL: conf.Legal.PrivacyPolicy.URL, - PrivacyText: conf.Legal.PrivacyPolicy.Content, + PrivacyText: ptr(string(conf.Legal.PrivacyPolicy.Content.Content)), TOSURL: conf.Legal.TOS.URL, - TOSText: conf.Legal.TOS.Content, + TOSText: ptr(string(conf.Legal.TOS.Content.Content)), UserMode: &conf.Mode, }