From a52b1106bbda03f2958a077ca0c04ff99b3fe867 Mon Sep 17 00:00:00 2001 From: Lucas TESSON Date: Tue, 11 Feb 2025 16:35:53 +0100 Subject: [PATCH 1/2] feat: propagate ctfer-io/terraform-provider-ctfd#153 + fix provider Go sdk major version --- Makefile | 2 +- .../pulumi-resource-ctfd/bridge-metadata.json | 22 ++--- provider/cmd/pulumi-resource-ctfd/schema.json | 58 +++++------ provider/go.mod | 2 +- provider/go.sum | 4 +- sdk/dotnet/Config/Config.cs | 32 +++--- sdk/dotnet/Provider.cs | 62 ++++++------ sdk/go.mod | 2 +- sdk/go/ctfd/challengeDynamic.go | 4 +- sdk/go/ctfd/challengeStandard.go | 4 +- sdk/go/ctfd/config/config.go | 20 ++-- sdk/go/ctfd/file.go | 4 +- sdk/go/ctfd/flag.go | 4 +- sdk/go/ctfd/getChallengesDynamic.go | 2 +- sdk/go/ctfd/getChallengesStandard.go | 2 +- sdk/go/ctfd/getTeams.go | 2 +- sdk/go/ctfd/getUsers.go | 2 +- sdk/go/ctfd/hint.go | 4 +- sdk/go/ctfd/init.go | 2 +- sdk/go/ctfd/provider.go | 62 +++++++----- sdk/go/ctfd/pulumiTypes.go | 2 +- sdk/go/ctfd/team.go | 4 +- sdk/go/ctfd/user.go | 4 +- sdk/nodejs/config/vars.ts | 26 ++--- sdk/nodejs/provider.ts | 34 ++++--- .../ctfer-io_pulumi-ctfd/config/__init__.pyi | 14 +-- .../ctfer-io_pulumi-ctfd/config/vars.py | 20 ++-- sdk/python/ctfer-io_pulumi-ctfd/provider.py | 98 ++++++++++--------- 28 files changed, 266 insertions(+), 232 deletions(-) diff --git a/Makefile b/Makefile index 9a9da21..49858f2 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ ORG := ctfer-io PROJECT := github.com/${ORG}/pulumi-${PACK} NODE_MODULE_NAME := @ctfer-io/${PACK} TF_NAME := ${PACK} -PROVIDER_PATH := provider +PROVIDER_PATH := provider/v2 VERSION_PATH := ${PROVIDER_PATH}/pkg/version.Version TFGEN := pulumi-tfgen-${PACK} diff --git a/provider/cmd/pulumi-resource-ctfd/bridge-metadata.json b/provider/cmd/pulumi-resource-ctfd/bridge-metadata.json index a2f8849..506e7e3 100644 --- a/provider/cmd/pulumi-resource-ctfd/bridge-metadata.json +++ b/provider/cmd/pulumi-resource-ctfd/bridge-metadata.json @@ -3,7 +3,7 @@ "resources": { "ctfd_challenge_dynamic": { "current": "ctfd:index/challengeDynamic:ChallengeDynamic", - "majorVersion": 1, + "majorVersion": 2, "fields": { "requirements": { "fields": { @@ -22,7 +22,7 @@ }, "ctfd_challenge_standard": { "current": "ctfd:index/challengeStandard:ChallengeStandard", - "majorVersion": 1, + "majorVersion": 2, "fields": { "requirements": { "fields": { @@ -41,15 +41,15 @@ }, "ctfd_file": { "current": "ctfd:index/file:File", - "majorVersion": 1 + "majorVersion": 2 }, "ctfd_flag": { "current": "ctfd:index/flag:Flag", - "majorVersion": 1 + "majorVersion": 2 }, "ctfd_hint": { "current": "ctfd:index/hint:Hint", - "majorVersion": 1, + "majorVersion": 2, "fields": { "requirements": { "maxItemsOne": false @@ -58,7 +58,7 @@ }, "ctfd_team": { "current": "ctfd:index/team:Team", - "majorVersion": 1, + "majorVersion": 2, "fields": { "members": { "maxItemsOne": false @@ -67,13 +67,13 @@ }, "ctfd_user": { "current": "ctfd:index/user:User", - "majorVersion": 1 + "majorVersion": 2 } }, "datasources": { "ctfd_challenges_dynamic": { "current": "ctfd:index/getChallengesDynamic:getChallengesDynamic", - "majorVersion": 1, + "majorVersion": 2, "fields": { "challenges": { "maxItemsOne": false, @@ -99,7 +99,7 @@ }, "ctfd_challenges_standard": { "current": "ctfd:index/getChallengesStandard:getChallengesStandard", - "majorVersion": 1, + "majorVersion": 2, "fields": { "challenges": { "maxItemsOne": false, @@ -125,7 +125,7 @@ }, "ctfd_teams": { "current": "ctfd:index/getTeams:getTeams", - "majorVersion": 1, + "majorVersion": 2, "fields": { "members": { "maxItemsOne": false @@ -134,7 +134,7 @@ }, "ctfd_users": { "current": "ctfd:index/getUsers:getUsers", - "majorVersion": 1 + "majorVersion": 2 } } }, diff --git a/provider/cmd/pulumi-resource-ctfd/schema.json b/provider/cmd/pulumi-resource-ctfd/schema.json index 693c733..bbbec05 100644 --- a/provider/cmd/pulumi-resource-ctfd/schema.json +++ b/provider/cmd/pulumi-resource-ctfd/schema.json @@ -26,7 +26,7 @@ "rootNamespace": "CTFerio" }, "go": { - "importBasePath": "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd", + "importBasePath": "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd", "generateResourceContainerTypes": true, "generateExtraInputTypes": true }, @@ -61,19 +61,19 @@ "description": "User API key. Could use `CTFD_API_KEY` environment variable instead. Despite being the most convenient way to\nauthenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation\npolicy.\n", "secret": true }, - "nonce": { + "password": { "type": "string", - "description": "User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead.\n", - "secret": true - }, - "session": { - "type": "string", - "description": "User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead.\n", + "description": "The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable\ninstead.\n", "secret": true }, "url": { "type": "string", "description": "CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead.\n" + }, + "username": { + "type": "string", + "description": "The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable\ninstead.\n", + "secret": true } } }, @@ -347,19 +347,19 @@ "description": "User API key. Could use `CTFD_API_KEY` environment variable instead. Despite being the most convenient way to\nauthenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation\npolicy.\n", "secret": true }, - "nonce": { - "type": "string", - "description": "User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead.\n", - "secret": true - }, - "session": { + "password": { "type": "string", - "description": "User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead.\n", + "description": "The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable\ninstead.\n", "secret": true }, "url": { "type": "string", "description": "CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead.\n" + }, + "username": { + "type": "string", + "description": "The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable\ninstead.\n", + "secret": true } }, "inputProperties": { @@ -368,25 +368,25 @@ "description": "User API key. Could use `CTFD_API_KEY` environment variable instead. Despite being the most convenient way to\nauthenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation\npolicy.\n", "secret": true }, - "nonce": { + "password": { "type": "string", - "description": "User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead.\n", - "secret": true - }, - "session": { - "type": "string", - "description": "User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead.\n", + "description": "The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable\ninstead.\n", "secret": true }, "url": { "type": "string", "description": "CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead.\n" + }, + "username": { + "type": "string", + "description": "The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable\ninstead.\n", + "secret": true } } }, "resources": { "ctfd:index/challengeDynamic:ChallengeDynamic": { - "description": "CTFd is built around the Challenge resource, which contains all the attributes to define a part of the Capture The Flag event.\n\nThis implementation has support of a more dynamic behavior for its scoring through time/solves thus is different from a standard challenge.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\nimport * as fs from \"fs\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\nconst httpHint1 = new ctfd.Hint(\"httpHint1\", {\n challengeId: http.id,\n content: \"Some super-helpful hint\",\n cost: 50,\n});\nconst httpHint2 = new ctfd.Hint(\"httpHint2\", {\n challengeId: http.id,\n content: \"Even more helpful hint !\",\n cost: 50,\n requirements: [httpHint1.id],\n});\nconst httpFile = new ctfd.File(\"httpFile\", {\n challengeId: http.id,\n contentb64: fs.readFileSync(\".../image.png\", { encoding: \"base64\" }),\n});\n```\n```python\nimport pulumi\nimport base64\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\nhttp_hint1 = ctfd.Hint(\"httpHint1\",\n challenge_id=http.id,\n content=\"Some super-helpful hint\",\n cost=50)\nhttp_hint2 = ctfd.Hint(\"httpHint2\",\n challenge_id=http.id,\n content=\"Even more helpful hint !\",\n cost=50,\n requirements=[http_hint1.id])\nhttp_file = ctfd.File(\"httpFile\",\n challenge_id=http.id,\n contentb64=(lambda path: base64.b64encode(open(path).read().encode()).decode())(\".../image.png\"))\n```\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\n\t\nstring ReadFileBase64(string path) \n{\n return Convert.ToBase64String(Encoding.UTF8.GetBytes(File.ReadAllText(path)));\n}\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n var httpHint1 = new Ctfd.Hint(\"httpHint1\", new()\n {\n ChallengeId = http.Id,\n Content = \"Some super-helpful hint\",\n Cost = 50,\n });\n\n var httpHint2 = new Ctfd.Hint(\"httpHint2\", new()\n {\n ChallengeId = http.Id,\n Content = \"Even more helpful hint !\",\n Cost = 50,\n Requirements = new[]\n {\n httpHint1.Id,\n },\n });\n\n var httpFile = new Ctfd.File(\"httpFile\", new()\n {\n ChallengeId = http.Id,\n Contentb64 = ReadFileBase64(\".../image.png\"),\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/base64\"\n\t\"os\"\n\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc filebase64OrPanic(path string) string {\n\tif fileData, err := os.ReadFile(path); err == nil {\n\t\treturn base64.StdEncoding.EncodeToString(fileData[:])\n\t} else {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttpHint1, err := ctfd.NewHint(ctx, \"httpHint1\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Some super-helpful hint\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint2\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Even more helpful hint !\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t\tRequirements: pulumi.StringArray{\n\t\t\t\thttpHint1.ID(),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFile(ctx, \"httpFile\", \u0026ctfd.FileArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContentb64: pulumi.String(filebase64OrPanic(\".../image.png\")),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport com.pulumi.ctfd.Hint;\nimport com.pulumi.ctfd.HintArgs;\nimport com.pulumi.ctfd.File;\nimport com.pulumi.ctfd.FileArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n var httpHint1 = new Hint(\"httpHint1\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Some super-helpful hint\")\n .cost(50)\n .build());\n\n var httpHint2 = new Hint(\"httpHint2\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Even more helpful hint !\")\n .cost(50)\n .requirements(httpHint1.id())\n .build());\n\n var httpFile = new File(\"httpFile\", FileArgs.builder()\n .challengeId(http.id())\n .contentb64(Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(\".../image.png\"))))\n .build());\n\n }\n}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", + "description": "CTFd is built around the Challenge resource, which contains all the attributes to define a part of the Capture The Flag event.\n\nThis implementation has support of a more dynamic behavior for its scoring through time/solves thus is different from a standard challenge.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\nimport * as fs from \"fs\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\nconst httpHint1 = new ctfd.Hint(\"httpHint1\", {\n challengeId: http.id,\n content: \"Some super-helpful hint\",\n cost: 50,\n});\nconst httpHint2 = new ctfd.Hint(\"httpHint2\", {\n challengeId: http.id,\n content: \"Even more helpful hint !\",\n cost: 50,\n requirements: [httpHint1.id],\n});\nconst httpFile = new ctfd.File(\"httpFile\", {\n challengeId: http.id,\n contentb64: fs.readFileSync(\".../image.png\", { encoding: \"base64\" }),\n});\n```\n```python\nimport pulumi\nimport base64\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\nhttp_hint1 = ctfd.Hint(\"httpHint1\",\n challenge_id=http.id,\n content=\"Some super-helpful hint\",\n cost=50)\nhttp_hint2 = ctfd.Hint(\"httpHint2\",\n challenge_id=http.id,\n content=\"Even more helpful hint !\",\n cost=50,\n requirements=[http_hint1.id])\nhttp_file = ctfd.File(\"httpFile\",\n challenge_id=http.id,\n contentb64=(lambda path: base64.b64encode(open(path).read().encode()).decode())(\".../image.png\"))\n```\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\n\t\nstring ReadFileBase64(string path) \n{\n return Convert.ToBase64String(Encoding.UTF8.GetBytes(File.ReadAllText(path)));\n}\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n var httpHint1 = new Ctfd.Hint(\"httpHint1\", new()\n {\n ChallengeId = http.Id,\n Content = \"Some super-helpful hint\",\n Cost = 50,\n });\n\n var httpHint2 = new Ctfd.Hint(\"httpHint2\", new()\n {\n ChallengeId = http.Id,\n Content = \"Even more helpful hint !\",\n Cost = 50,\n Requirements = new[]\n {\n httpHint1.Id,\n },\n });\n\n var httpFile = new Ctfd.File(\"httpFile\", new()\n {\n ChallengeId = http.Id,\n Contentb64 = ReadFileBase64(\".../image.png\"),\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/base64\"\n\t\"os\"\n\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc filebase64OrPanic(path string) string {\n\tif fileData, err := os.ReadFile(path); err == nil {\n\t\treturn base64.StdEncoding.EncodeToString(fileData[:])\n\t} else {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttpHint1, err := ctfd.NewHint(ctx, \"httpHint1\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Some super-helpful hint\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint2\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Even more helpful hint !\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t\tRequirements: pulumi.StringArray{\n\t\t\t\thttpHint1.ID(),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFile(ctx, \"httpFile\", \u0026ctfd.FileArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContentb64: pulumi.String(filebase64OrPanic(\".../image.png\")),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport com.pulumi.ctfd.Hint;\nimport com.pulumi.ctfd.HintArgs;\nimport com.pulumi.ctfd.File;\nimport com.pulumi.ctfd.FileArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n var httpHint1 = new Hint(\"httpHint1\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Some super-helpful hint\")\n .cost(50)\n .build());\n\n var httpHint2 = new Hint(\"httpHint2\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Even more helpful hint !\")\n .cost(50)\n .requirements(httpHint1.id())\n .build());\n\n var httpFile = new File(\"httpFile\", FileArgs.builder()\n .challengeId(http.id())\n .contentb64(Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(\".../image.png\"))))\n .build());\n\n }\n}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", "properties": { "attribution": { "type": "string", @@ -618,7 +618,7 @@ } }, "ctfd:index/challengeStandard:ChallengeStandard": { - "description": "CTFd is built around the Challenge resource, which contains all the attributes to define a part of the Capture The Flag event.\n\nIt is the first historic implementation of its kind, with basic functionalities.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\nimport * as fs from \"fs\";\n\nconst http = new ctfd.ChallengeStandard(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\nconst httpHint1 = new ctfd.Hint(\"httpHint1\", {\n challengeId: http.id,\n content: \"Some super-helpful hint\",\n cost: 50,\n});\nconst httpHint2 = new ctfd.Hint(\"httpHint2\", {\n challengeId: http.id,\n content: \"Even more helpful hint !\",\n cost: 50,\n requirements: [httpHint1.id],\n});\nconst httpFile = new ctfd.File(\"httpFile\", {\n challengeId: http.id,\n contentb64: fs.readFileSync(\".../image.png\", { encoding: \"base64\" }),\n});\n```\n```python\nimport pulumi\nimport base64\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeStandard(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\nhttp_hint1 = ctfd.Hint(\"httpHint1\",\n challenge_id=http.id,\n content=\"Some super-helpful hint\",\n cost=50)\nhttp_hint2 = ctfd.Hint(\"httpHint2\",\n challenge_id=http.id,\n content=\"Even more helpful hint !\",\n cost=50,\n requirements=[http_hint1.id])\nhttp_file = ctfd.File(\"httpFile\",\n challenge_id=http.id,\n contentb64=(lambda path: base64.b64encode(open(path).read().encode()).decode())(\".../image.png\"))\n```\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\n\t\nstring ReadFileBase64(string path) \n{\n return Convert.ToBase64String(Encoding.UTF8.GetBytes(File.ReadAllText(path)));\n}\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeStandard(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n var httpHint1 = new Ctfd.Hint(\"httpHint1\", new()\n {\n ChallengeId = http.Id,\n Content = \"Some super-helpful hint\",\n Cost = 50,\n });\n\n var httpHint2 = new Ctfd.Hint(\"httpHint2\", new()\n {\n ChallengeId = http.Id,\n Content = \"Even more helpful hint !\",\n Cost = 50,\n Requirements = new[]\n {\n httpHint1.Id,\n },\n });\n\n var httpFile = new Ctfd.File(\"httpFile\", new()\n {\n ChallengeId = http.Id,\n Contentb64 = ReadFileBase64(\".../image.png\"),\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/base64\"\n\t\"os\"\n\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc filebase64OrPanic(path string) string {\n\tif fileData, err := os.ReadFile(path); err == nil {\n\t\treturn base64.StdEncoding.EncodeToString(fileData[:])\n\t} else {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeStandard(ctx, \"http\", \u0026ctfd.ChallengeStandardArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttpHint1, err := ctfd.NewHint(ctx, \"httpHint1\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Some super-helpful hint\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint2\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Even more helpful hint !\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t\tRequirements: pulumi.StringArray{\n\t\t\t\thttpHint1.ID(),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFile(ctx, \"httpFile\", \u0026ctfd.FileArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContentb64: pulumi.String(filebase64OrPanic(\".../image.png\")),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeStandard;\nimport com.pulumi.ctfd.ChallengeStandardArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport com.pulumi.ctfd.Hint;\nimport com.pulumi.ctfd.HintArgs;\nimport com.pulumi.ctfd.File;\nimport com.pulumi.ctfd.FileArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeStandard(\"http\", ChallengeStandardArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n var httpHint1 = new Hint(\"httpHint1\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Some super-helpful hint\")\n .cost(50)\n .build());\n\n var httpHint2 = new Hint(\"httpHint2\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Even more helpful hint !\")\n .cost(50)\n .requirements(httpHint1.id())\n .build());\n\n var httpFile = new File(\"httpFile\", FileArgs.builder()\n .challengeId(http.id())\n .contentb64(Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(\".../image.png\"))))\n .build());\n\n }\n}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", + "description": "CTFd is built around the Challenge resource, which contains all the attributes to define a part of the Capture The Flag event.\n\nIt is the first historic implementation of its kind, with basic functionalities.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\nimport * as fs from \"fs\";\n\nconst http = new ctfd.ChallengeStandard(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\nconst httpHint1 = new ctfd.Hint(\"httpHint1\", {\n challengeId: http.id,\n content: \"Some super-helpful hint\",\n cost: 50,\n});\nconst httpHint2 = new ctfd.Hint(\"httpHint2\", {\n challengeId: http.id,\n content: \"Even more helpful hint !\",\n cost: 50,\n requirements: [httpHint1.id],\n});\nconst httpFile = new ctfd.File(\"httpFile\", {\n challengeId: http.id,\n contentb64: fs.readFileSync(\".../image.png\", { encoding: \"base64\" }),\n});\n```\n```python\nimport pulumi\nimport base64\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeStandard(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\nhttp_hint1 = ctfd.Hint(\"httpHint1\",\n challenge_id=http.id,\n content=\"Some super-helpful hint\",\n cost=50)\nhttp_hint2 = ctfd.Hint(\"httpHint2\",\n challenge_id=http.id,\n content=\"Even more helpful hint !\",\n cost=50,\n requirements=[http_hint1.id])\nhttp_file = ctfd.File(\"httpFile\",\n challenge_id=http.id,\n contentb64=(lambda path: base64.b64encode(open(path).read().encode()).decode())(\".../image.png\"))\n```\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\n\t\nstring ReadFileBase64(string path) \n{\n return Convert.ToBase64String(Encoding.UTF8.GetBytes(File.ReadAllText(path)));\n}\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeStandard(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n var httpHint1 = new Ctfd.Hint(\"httpHint1\", new()\n {\n ChallengeId = http.Id,\n Content = \"Some super-helpful hint\",\n Cost = 50,\n });\n\n var httpHint2 = new Ctfd.Hint(\"httpHint2\", new()\n {\n ChallengeId = http.Id,\n Content = \"Even more helpful hint !\",\n Cost = 50,\n Requirements = new[]\n {\n httpHint1.Id,\n },\n });\n\n var httpFile = new Ctfd.File(\"httpFile\", new()\n {\n ChallengeId = http.Id,\n Contentb64 = ReadFileBase64(\".../image.png\"),\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/base64\"\n\t\"os\"\n\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc filebase64OrPanic(path string) string {\n\tif fileData, err := os.ReadFile(path); err == nil {\n\t\treturn base64.StdEncoding.EncodeToString(fileData[:])\n\t} else {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeStandard(ctx, \"http\", \u0026ctfd.ChallengeStandardArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\thttpHint1, err := ctfd.NewHint(ctx, \"httpHint1\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Some super-helpful hint\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint2\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Even more helpful hint !\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t\tRequirements: pulumi.StringArray{\n\t\t\t\thttpHint1.ID(),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFile(ctx, \"httpFile\", \u0026ctfd.FileArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContentb64: pulumi.String(filebase64OrPanic(\".../image.png\")),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeStandard;\nimport com.pulumi.ctfd.ChallengeStandardArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport com.pulumi.ctfd.Hint;\nimport com.pulumi.ctfd.HintArgs;\nimport com.pulumi.ctfd.File;\nimport com.pulumi.ctfd.FileArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeStandard(\"http\", ChallengeStandardArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n var httpHint1 = new Hint(\"httpHint1\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Some super-helpful hint\")\n .cost(50)\n .build());\n\n var httpHint2 = new Hint(\"httpHint2\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Even more helpful hint !\")\n .cost(50)\n .requirements(httpHint1.id())\n .build());\n\n var httpFile = new File(\"httpFile\", FileArgs.builder()\n .challengeId(http.id())\n .contentb64(Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(\".../image.png\"))))\n .build());\n\n }\n}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", "properties": { "attribution": { "type": "string", @@ -809,7 +809,7 @@ } }, "ctfd:index/file:File": { - "description": "A CTFd file for a challenge.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\nimport * as fs from \"fs\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFile = new ctfd.File(\"httpFile\", {\n challengeId: http.id,\n contentb64: fs.readFileSync(\".../image.png\", { encoding: \"base64\" }),\n});\n```\n```python\nimport pulumi\nimport base64\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_file = ctfd.File(\"httpFile\",\n challenge_id=http.id,\n contentb64=(lambda path: base64.b64encode(open(path).read().encode()).decode())(\".../image.png\"))\n```\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\n\t\nstring ReadFileBase64(string path) \n{\n return Convert.ToBase64String(Encoding.UTF8.GetBytes(File.ReadAllText(path)));\n}\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFile = new Ctfd.File(\"httpFile\", new()\n {\n ChallengeId = http.Id,\n Contentb64 = ReadFileBase64(\".../image.png\"),\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/base64\"\n\t\"os\"\n\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc filebase64OrPanic(path string) string {\n\tif fileData, err := os.ReadFile(path); err == nil {\n\t\treturn base64.StdEncoding.EncodeToString(fileData[:])\n\t} else {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFile(ctx, \"httpFile\", \u0026ctfd.FileArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContentb64: pulumi.String(filebase64OrPanic(\".../image.png\")),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.File;\nimport com.pulumi.ctfd.FileArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFile = new File(\"httpFile\", FileArgs.builder()\n .challengeId(http.id())\n .contentb64(Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(\".../image.png\"))))\n .build());\n\n }\n}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", + "description": "A CTFd file for a challenge.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\nimport * as fs from \"fs\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFile = new ctfd.File(\"httpFile\", {\n challengeId: http.id,\n contentb64: fs.readFileSync(\".../image.png\", { encoding: \"base64\" }),\n});\n```\n```python\nimport pulumi\nimport base64\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_file = ctfd.File(\"httpFile\",\n challenge_id=http.id,\n contentb64=(lambda path: base64.b64encode(open(path).read().encode()).decode())(\".../image.png\"))\n```\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\n\t\nstring ReadFileBase64(string path) \n{\n return Convert.ToBase64String(Encoding.UTF8.GetBytes(File.ReadAllText(path)));\n}\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFile = new Ctfd.File(\"httpFile\", new()\n {\n ChallengeId = http.Id,\n Contentb64 = ReadFileBase64(\".../image.png\"),\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"encoding/base64\"\n\t\"os\"\n\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc filebase64OrPanic(path string) string {\n\tif fileData, err := os.ReadFile(path); err == nil {\n\t\treturn base64.StdEncoding.EncodeToString(fileData[:])\n\t} else {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFile(ctx, \"httpFile\", \u0026ctfd.FileArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContentb64: pulumi.String(filebase64OrPanic(\".../image.png\")),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.File;\nimport com.pulumi.ctfd.FileArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFile = new File(\"httpFile\", FileArgs.builder()\n .challengeId(http.id())\n .contentb64(Base64.getEncoder().encodeToString(Files.readAllBytes(Paths.get(\".../image.png\"))))\n .build());\n\n }\n}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", "properties": { "challengeId": { "type": "string", @@ -887,7 +887,7 @@ } }, "ctfd:index/flag:Flag": { - "description": "A flag to solve the challenge.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n http:\n type: ctfd:ChallengeDynamic\n properties:\n category: misc\n description: '...'\n value: 500\n decay: 100\n minimum: 50\n state: visible\n function: logarithmic\n topics:\n - Misc\n tags:\n - misc\n - basic\n httpFlag:\n type: ctfd:Flag\n properties:\n challengeId: ${http.id}\n content: CTF{some_flag}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", + "description": "A flag to solve the challenge.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n }\n}\n```\n```yaml\nresources:\n http:\n type: ctfd:ChallengeDynamic\n properties:\n category: misc\n description: '...'\n value: 500\n decay: 100\n minimum: 50\n state: visible\n function: logarithmic\n topics:\n - Misc\n tags:\n - misc\n - basic\n httpFlag:\n type: ctfd:Flag\n properties:\n challengeId: ${http.id}\n content: CTF{some_flag}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", "properties": { "challengeId": { "type": "string", @@ -961,7 +961,7 @@ } }, "ctfd:index/hint:Hint": { - "description": "A hint for a challenge to help players solve it.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\nconst httpHint = new ctfd.Hint(\"httpHint\", {\n challengeId: http.id,\n content: \"Some super-helpful hint\",\n cost: 50,\n});\nconst httpHint2 = new ctfd.Hint(\"httpHint2\", {\n challengeId: http.id,\n content: \"Even more helpful hint !\",\n cost: 50,\n requirements: [ctfd_hint.http_hint_1.id],\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\nhttp_hint = ctfd.Hint(\"httpHint\",\n challenge_id=http.id,\n content=\"Some super-helpful hint\",\n cost=50)\nhttp_hint2 = ctfd.Hint(\"httpHint2\",\n challenge_id=http.id,\n content=\"Even more helpful hint !\",\n cost=50,\n requirements=[ctfd_hint[\"http_hint_1\"][\"id\"]])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n var httpHint = new Ctfd.Hint(\"httpHint\", new()\n {\n ChallengeId = http.Id,\n Content = \"Some super-helpful hint\",\n Cost = 50,\n });\n\n var httpHint2 = new Ctfd.Hint(\"httpHint2\", new()\n {\n ChallengeId = http.Id,\n Content = \"Even more helpful hint !\",\n Cost = 50,\n Requirements = new[]\n {\n ctfd_hint.Http_hint_1.Id,\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Some super-helpful hint\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint2\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Even more helpful hint !\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t\tRequirements: pulumi.StringArray{\n\t\t\t\tctfd_hint.Http_hint_1.Id,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport com.pulumi.ctfd.Hint;\nimport com.pulumi.ctfd.HintArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n var httpHint = new Hint(\"httpHint\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Some super-helpful hint\")\n .cost(50)\n .build());\n\n var httpHint2 = new Hint(\"httpHint2\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Even more helpful hint !\")\n .cost(50)\n .requirements(ctfd_hint.http_hint_1().id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n http:\n type: ctfd:ChallengeDynamic\n properties:\n category: misc\n description: '...'\n value: 500\n decay: 100\n minimum: 50\n state: visible\n function: logarithmic\n topics:\n - Misc\n tags:\n - misc\n - basic\n httpFlag:\n type: ctfd:Flag\n properties:\n challengeId: ${http.id}\n content: CTF{some_flag}\n httpHint:\n type: ctfd:Hint\n properties:\n challengeId: ${http.id}\n content: Some super-helpful hint\n cost: 50\n httpHint2:\n type: ctfd:Hint\n properties:\n challengeId: ${http.id}\n content: Even more helpful hint !\n cost: 50\n requirements:\n - ${ctfd_hint.http_hint_1.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", + "description": "A hint for a challenge to help players solve it.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst http = new ctfd.ChallengeDynamic(\"http\", {\n category: \"misc\",\n description: \"...\",\n value: 500,\n decay: 100,\n minimum: 50,\n state: \"visible\",\n \"function\": \"logarithmic\",\n topics: [\"Misc\"],\n tags: [\n \"misc\",\n \"basic\",\n ],\n});\nconst httpFlag = new ctfd.Flag(\"httpFlag\", {\n challengeId: http.id,\n content: \"CTF{some_flag}\",\n});\nconst httpHint = new ctfd.Hint(\"httpHint\", {\n challengeId: http.id,\n content: \"Some super-helpful hint\",\n cost: 50,\n});\nconst httpHint2 = new ctfd.Hint(\"httpHint2\", {\n challengeId: http.id,\n content: \"Even more helpful hint !\",\n cost: 50,\n requirements: [ctfd_hint.http_hint_1.id],\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nhttp = ctfd.ChallengeDynamic(\"http\",\n category=\"misc\",\n description=\"...\",\n value=500,\n decay=100,\n minimum=50,\n state=\"visible\",\n function=\"logarithmic\",\n topics=[\"Misc\"],\n tags=[\n \"misc\",\n \"basic\",\n ])\nhttp_flag = ctfd.Flag(\"httpFlag\",\n challenge_id=http.id,\n content=\"CTF{some_flag}\")\nhttp_hint = ctfd.Hint(\"httpHint\",\n challenge_id=http.id,\n content=\"Some super-helpful hint\",\n cost=50)\nhttp_hint2 = ctfd.Hint(\"httpHint2\",\n challenge_id=http.id,\n content=\"Even more helpful hint !\",\n cost=50,\n requirements=[ctfd_hint[\"http_hint_1\"][\"id\"]])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var http = new Ctfd.ChallengeDynamic(\"http\", new()\n {\n Category = \"misc\",\n Description = \"...\",\n Value = 500,\n Decay = 100,\n Minimum = 50,\n State = \"visible\",\n Function = \"logarithmic\",\n Topics = new[]\n {\n \"Misc\",\n },\n Tags = new[]\n {\n \"misc\",\n \"basic\",\n },\n });\n\n var httpFlag = new Ctfd.Flag(\"httpFlag\", new()\n {\n ChallengeId = http.Id,\n Content = \"CTF{some_flag}\",\n });\n\n var httpHint = new Ctfd.Hint(\"httpHint\", new()\n {\n ChallengeId = http.Id,\n Content = \"Some super-helpful hint\",\n Cost = 50,\n });\n\n var httpHint2 = new Ctfd.Hint(\"httpHint2\", new()\n {\n ChallengeId = http.Id,\n Content = \"Even more helpful hint !\",\n Cost = 50,\n Requirements = new[]\n {\n ctfd_hint.Http_hint_1.Id,\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\thttp, err := ctfd.NewChallengeDynamic(ctx, \"http\", \u0026ctfd.ChallengeDynamicArgs{\n\t\t\tCategory: pulumi.String(\"misc\"),\n\t\t\tDescription: pulumi.String(\"...\"),\n\t\t\tValue: pulumi.Int(500),\n\t\t\tDecay: pulumi.Int(100),\n\t\t\tMinimum: pulumi.Int(50),\n\t\t\tState: pulumi.String(\"visible\"),\n\t\t\tFunction: pulumi.String(\"logarithmic\"),\n\t\t\tTopics: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"Misc\"),\n\t\t\t},\n\t\t\tTags: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"misc\"),\n\t\t\t\tpulumi.String(\"basic\"),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewFlag(ctx, \"httpFlag\", \u0026ctfd.FlagArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"CTF{some_flag}\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Some super-helpful hint\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewHint(ctx, \"httpHint2\", \u0026ctfd.HintArgs{\n\t\t\tChallengeId: http.ID(),\n\t\t\tContent: pulumi.String(\"Even more helpful hint !\"),\n\t\t\tCost: pulumi.Int(50),\n\t\t\tRequirements: pulumi.StringArray{\n\t\t\t\tctfd_hint.Http_hint_1.Id,\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.ChallengeDynamic;\nimport com.pulumi.ctfd.ChallengeDynamicArgs;\nimport com.pulumi.ctfd.Flag;\nimport com.pulumi.ctfd.FlagArgs;\nimport com.pulumi.ctfd.Hint;\nimport com.pulumi.ctfd.HintArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var http = new ChallengeDynamic(\"http\", ChallengeDynamicArgs.builder()\n .category(\"misc\")\n .description(\"...\")\n .value(500)\n .decay(100)\n .minimum(50)\n .state(\"visible\")\n .function(\"logarithmic\")\n .topics(\"Misc\")\n .tags( \n \"misc\",\n \"basic\")\n .build());\n\n var httpFlag = new Flag(\"httpFlag\", FlagArgs.builder()\n .challengeId(http.id())\n .content(\"CTF{some_flag}\")\n .build());\n\n var httpHint = new Hint(\"httpHint\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Some super-helpful hint\")\n .cost(50)\n .build());\n\n var httpHint2 = new Hint(\"httpHint2\", HintArgs.builder()\n .challengeId(http.id())\n .content(\"Even more helpful hint !\")\n .cost(50)\n .requirements(ctfd_hint.http_hint_1().id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n http:\n type: ctfd:ChallengeDynamic\n properties:\n category: misc\n description: '...'\n value: 500\n decay: 100\n minimum: 50\n state: visible\n function: logarithmic\n topics:\n - Misc\n tags:\n - misc\n - basic\n httpFlag:\n type: ctfd:Flag\n properties:\n challengeId: ${http.id}\n content: CTF{some_flag}\n httpHint:\n type: ctfd:Hint\n properties:\n challengeId: ${http.id}\n content: Some super-helpful hint\n cost: 50\n httpHint2:\n type: ctfd:Hint\n properties:\n challengeId: ${http.id}\n content: Even more helpful hint !\n cost: 50\n requirements:\n - ${ctfd_hint.http_hint_1.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", "properties": { "challengeId": { "type": "string", @@ -1041,7 +1041,7 @@ } }, "ctfd:index/team:Team": { - "description": "CTFd defines a Team as a group of Users who will attend the Capture The Flag event.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst ctfer = new ctfd.User(\"ctfer\", {\n email: \"ctfer-io@protonmail.com\",\n password: \"password\",\n});\nconst cybercombattants = new ctfd.Team(\"cybercombattants\", {\n email: \"lucastesson@protonmail.com\",\n password: \"password\",\n members: [ctfer.id],\n captain: ctfer.id,\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nctfer = ctfd.User(\"ctfer\",\n email=\"ctfer-io@protonmail.com\",\n password=\"password\")\ncybercombattants = ctfd.Team(\"cybercombattants\",\n email=\"lucastesson@protonmail.com\",\n password=\"password\",\n members=[ctfer.id],\n captain=ctfer.id)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ctfer = new Ctfd.User(\"ctfer\", new()\n {\n Email = \"ctfer-io@protonmail.com\",\n Password = \"password\",\n });\n\n var cybercombattants = new Ctfd.Team(\"cybercombattants\", new()\n {\n Email = \"lucastesson@protonmail.com\",\n Password = \"password\",\n Members = new[]\n {\n ctfer.Id,\n },\n Captain = ctfer.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tctfer, err := ctfd.NewUser(ctx, \"ctfer\", \u0026ctfd.UserArgs{\n\t\t\tEmail: pulumi.String(\"ctfer-io@protonmail.com\"),\n\t\t\tPassword: pulumi.String(\"password\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewTeam(ctx, \"cybercombattants\", \u0026ctfd.TeamArgs{\n\t\t\tEmail: pulumi.String(\"lucastesson@protonmail.com\"),\n\t\t\tPassword: pulumi.String(\"password\"),\n\t\t\tMembers: pulumi.StringArray{\n\t\t\t\tctfer.ID(),\n\t\t\t},\n\t\t\tCaptain: ctfer.ID(),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.User;\nimport com.pulumi.ctfd.UserArgs;\nimport com.pulumi.ctfd.Team;\nimport com.pulumi.ctfd.TeamArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ctfer = new User(\"ctfer\", UserArgs.builder()\n .email(\"ctfer-io@protonmail.com\")\n .password(\"password\")\n .build());\n\n var cybercombattants = new Team(\"cybercombattants\", TeamArgs.builder()\n .email(\"lucastesson@protonmail.com\")\n .password(\"password\")\n .members(ctfer.id())\n .captain(ctfer.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ctfer:\n type: ctfd:User\n properties:\n email: ctfer-io@protonmail.com\n password: password\n cybercombattants:\n type: ctfd:Team\n properties:\n email: lucastesson@protonmail.com\n password: password\n members:\n - ${ctfer.id}\n captain: ${ctfer.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", + "description": "CTFd defines a Team as a group of Users who will attend the Capture The Flag event.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst ctfer = new ctfd.User(\"ctfer\", {\n email: \"ctfer-io@protonmail.com\",\n password: \"password\",\n});\nconst cybercombattants = new ctfd.Team(\"cybercombattants\", {\n email: \"lucastesson@protonmail.com\",\n password: \"password\",\n members: [ctfer.id],\n captain: ctfer.id,\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nctfer = ctfd.User(\"ctfer\",\n email=\"ctfer-io@protonmail.com\",\n password=\"password\")\ncybercombattants = ctfd.Team(\"cybercombattants\",\n email=\"lucastesson@protonmail.com\",\n password=\"password\",\n members=[ctfer.id],\n captain=ctfer.id)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ctfer = new Ctfd.User(\"ctfer\", new()\n {\n Email = \"ctfer-io@protonmail.com\",\n Password = \"password\",\n });\n\n var cybercombattants = new Ctfd.Team(\"cybercombattants\", new()\n {\n Email = \"lucastesson@protonmail.com\",\n Password = \"password\",\n Members = new[]\n {\n ctfer.Id,\n },\n Captain = ctfer.Id,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tctfer, err := ctfd.NewUser(ctx, \"ctfer\", \u0026ctfd.UserArgs{\n\t\t\tEmail: pulumi.String(\"ctfer-io@protonmail.com\"),\n\t\t\tPassword: pulumi.String(\"password\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = ctfd.NewTeam(ctx, \"cybercombattants\", \u0026ctfd.TeamArgs{\n\t\t\tEmail: pulumi.String(\"lucastesson@protonmail.com\"),\n\t\t\tPassword: pulumi.String(\"password\"),\n\t\t\tMembers: pulumi.StringArray{\n\t\t\t\tctfer.ID(),\n\t\t\t},\n\t\t\tCaptain: ctfer.ID(),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.User;\nimport com.pulumi.ctfd.UserArgs;\nimport com.pulumi.ctfd.Team;\nimport com.pulumi.ctfd.TeamArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ctfer = new User(\"ctfer\", UserArgs.builder()\n .email(\"ctfer-io@protonmail.com\")\n .password(\"password\")\n .build());\n\n var cybercombattants = new Team(\"cybercombattants\", TeamArgs.builder()\n .email(\"lucastesson@protonmail.com\")\n .password(\"password\")\n .members(ctfer.id())\n .captain(ctfer.id())\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ctfer:\n type: ctfd:User\n properties:\n email: ctfer-io@protonmail.com\n password: password\n cybercombattants:\n type: ctfd:Team\n properties:\n email: lucastesson@protonmail.com\n password: password\n members:\n - ${ctfer.id}\n captain: ${ctfer.id}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", "properties": { "affiliation": { "type": "string", @@ -1198,7 +1198,7 @@ } }, "ctfd:index/user:User": { - "description": "CTFd defines a User as someone who will either play or administrate the Capture The Flag event.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst ctfer = new ctfd.User(\"ctfer\", {\n email: \"ctfer-io@protonmail.com\",\n hidden: true,\n password: \"password\",\n type: \"admin\",\n verified: true,\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nctfer = ctfd.User(\"ctfer\",\n email=\"ctfer-io@protonmail.com\",\n hidden=True,\n password=\"password\",\n type=\"admin\",\n verified=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ctfer = new Ctfd.User(\"ctfer\", new()\n {\n Email = \"ctfer-io@protonmail.com\",\n Hidden = true,\n Password = \"password\",\n Type = \"admin\",\n Verified = true,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := ctfd.NewUser(ctx, \"ctfer\", \u0026ctfd.UserArgs{\n\t\t\tEmail: pulumi.String(\"ctfer-io@protonmail.com\"),\n\t\t\tHidden: pulumi.Bool(true),\n\t\t\tPassword: pulumi.String(\"password\"),\n\t\t\tType: pulumi.String(\"admin\"),\n\t\t\tVerified: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.User;\nimport com.pulumi.ctfd.UserArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ctfer = new User(\"ctfer\", UserArgs.builder()\n .email(\"ctfer-io@protonmail.com\")\n .hidden(true)\n .password(\"password\")\n .type(\"admin\")\n .verified(true)\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ctfer:\n type: ctfd:User\n properties:\n email: ctfer-io@protonmail.com\n hidden: true\n password: password\n # Make the user administrator of the CTFd instance\n type: admin\n verified: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", + "description": "CTFd defines a User as someone who will either play or administrate the Capture The Flag event.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as ctfd from \"@ctfer-io/pulumi-ctfd\";\n\nconst ctfer = new ctfd.User(\"ctfer\", {\n email: \"ctfer-io@protonmail.com\",\n hidden: true,\n password: \"password\",\n type: \"admin\",\n verified: true,\n});\n```\n```python\nimport pulumi\nimport ctfer-io_pulumi-ctfd as ctfd\n\nctfer = ctfd.User(\"ctfer\",\n email=\"ctfer-io@protonmail.com\",\n hidden=True,\n password=\"password\",\n type=\"admin\",\n verified=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Ctfd = CTFerio.Ctfd;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var ctfer = new Ctfd.User(\"ctfer\", new()\n {\n Email = \"ctfer-io@protonmail.com\",\n Hidden = true,\n Password = \"password\",\n Type = \"admin\",\n Verified = true,\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := ctfd.NewUser(ctx, \"ctfer\", \u0026ctfd.UserArgs{\n\t\t\tEmail: pulumi.String(\"ctfer-io@protonmail.com\"),\n\t\t\tHidden: pulumi.Bool(true),\n\t\t\tPassword: pulumi.String(\"password\"),\n\t\t\tType: pulumi.String(\"admin\"),\n\t\t\tVerified: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.ctfd.User;\nimport com.pulumi.ctfd.UserArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n var ctfer = new User(\"ctfer\", UserArgs.builder()\n .email(\"ctfer-io@protonmail.com\")\n .hidden(true)\n .password(\"password\")\n .type(\"admin\")\n .verified(true)\n .build());\n\n }\n}\n```\n```yaml\nresources:\n ctfer:\n type: ctfd:User\n properties:\n email: ctfer-io@protonmail.com\n hidden: true\n password: password\n # Make the user administrator of the CTFd instance\n type: admin\n verified: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n", "properties": { "affiliation": { "type": "string", diff --git a/provider/go.mod b/provider/go.mod index 3f4271d..2810af9 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -5,7 +5,7 @@ go 1.23.2 replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9 require ( - github.com/ctfer-io/terraform-provider-ctfd/v2 v2.1.1 + github.com/ctfer-io/terraform-provider-ctfd/v2 v2.2.0 github.com/pulumi/pulumi-terraform-bridge/v3 v3.102.0 ) diff --git a/provider/go.sum b/provider/go.sum index 9d70c48..09a6682 100644 --- a/provider/go.sum +++ b/provider/go.sum @@ -323,8 +323,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/ctfer-io/go-ctfd v0.10.2 h1:DpQSaxcHN7ugC72xlpEl0HIUbusOSolPkWD8Ki7vc7U= github.com/ctfer-io/go-ctfd v0.10.2/go.mod h1:ebgSW8LdP/qtRCpglK4djBp+g6kU5YM98XBZKowiCeY= -github.com/ctfer-io/terraform-provider-ctfd/v2 v2.1.1 h1:NtiwSQ26dUgoRoY5JaKZANjNtNPitkzmq2TqzfLCVos= -github.com/ctfer-io/terraform-provider-ctfd/v2 v2.1.1/go.mod h1:xXn075uZ3WrNwxagzNke4guvEu+JLwQemk8qhQkRrkg= +github.com/ctfer-io/terraform-provider-ctfd/v2 v2.2.0 h1:ZbbcrpYQTJU76kvfKQNm80Daziuq2QgSk71rZ+GXZZU= +github.com/ctfer-io/terraform-provider-ctfd/v2 v2.2.0/go.mod h1:xXn075uZ3WrNwxagzNke4guvEu+JLwQemk8qhQkRrkg= github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/sdk/dotnet/Config/Config.cs b/sdk/dotnet/Config/Config.cs index 54669f4..f706d68 100644 --- a/sdk/dotnet/Config/Config.cs +++ b/sdk/dotnet/Config/Config.cs @@ -44,24 +44,15 @@ public static string? ApiKey set => _apiKey.Set(value); } - private static readonly __Value _nonce = new __Value(() => __config.Get("nonce")); + private static readonly __Value _password = new __Value(() => __config.Get("password")); /// - /// User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + /// The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + /// instead. /// - public static string? Nonce + public static string? Password { - get => _nonce.Get(); - set => _nonce.Set(value); - } - - private static readonly __Value _session = new __Value(() => __config.Get("session")); - /// - /// User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. - /// - public static string? Session - { - get => _session.Get(); - set => _session.Set(value); + get => _password.Get(); + set => _password.Set(value); } private static readonly __Value _url = new __Value(() => __config.Get("url")); @@ -74,5 +65,16 @@ public static string? Url set => _url.Set(value); } + private static readonly __Value _username = new __Value(() => __config.Get("username")); + /// + /// The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + /// instead. + /// + public static string? Username + { + get => _username.Get(); + set => _username.Set(value); + } + } } diff --git a/sdk/dotnet/Provider.cs b/sdk/dotnet/Provider.cs index ded73c7..f0f68e5 100644 --- a/sdk/dotnet/Provider.cs +++ b/sdk/dotnet/Provider.cs @@ -28,16 +28,11 @@ public partial class Provider : global::Pulumi.ProviderResource public Output ApiKey { get; private set; } = null!; /// - /// User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + /// The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + /// instead. /// - [Output("nonce")] - public Output Nonce { get; private set; } = null!; - - /// - /// User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. - /// - [Output("session")] - public Output Session { get; private set; } = null!; + [Output("password")] + public Output Password { get; private set; } = null!; /// /// CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. @@ -45,6 +40,13 @@ public partial class Provider : global::Pulumi.ProviderResource [Output("url")] public Output Url { get; private set; } = null!; + /// + /// The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + /// instead. + /// + [Output("username")] + public Output Username { get; private set; } = null!; + /// /// Create a Provider resource with the given unique name, arguments, and options. @@ -67,8 +69,8 @@ private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? AdditionalSecretOutputs = { "apiKey", - "nonce", - "session", + "password", + "username", }, }; var merged = CustomResourceOptions.Merge(defaultOptions, options); @@ -98,44 +100,46 @@ public Input? ApiKey } } - [Input("nonce")] - private Input? _nonce; + [Input("password")] + private Input? _password; /// - /// User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + /// The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + /// instead. /// - public Input? Nonce + public Input? Password { - get => _nonce; + get => _password; set { var emptySecret = Output.CreateSecret(0); - _nonce = Output.Tuple?, int>(value, emptySecret).Apply(t => t.Item1); + _password = Output.Tuple?, int>(value, emptySecret).Apply(t => t.Item1); } } - [Input("session")] - private Input? _session; + /// + /// CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. + /// + [Input("url")] + public Input? Url { get; set; } + + [Input("username")] + private Input? _username; /// - /// User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. + /// The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + /// instead. /// - public Input? Session + public Input? Username { - get => _session; + get => _username; set { var emptySecret = Output.CreateSecret(0); - _session = Output.Tuple?, int>(value, emptySecret).Apply(t => t.Item1); + _username = Output.Tuple?, int>(value, emptySecret).Apply(t => t.Item1); } } - /// - /// CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. - /// - [Input("url")] - public Input? Url { get; set; } - public ProviderArgs() { } diff --git a/sdk/go.mod b/sdk/go.mod index c019cd0..07049ac 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -1,4 +1,4 @@ -module github.com/ctfer-io/pulumi-ctfd/sdk +module github.com/ctfer-io/pulumi-ctfd/sdk/v2 go 1.22.3 diff --git a/sdk/go/ctfd/challengeDynamic.go b/sdk/go/ctfd/challengeDynamic.go index d94e523..9370ef5 100644 --- a/sdk/go/ctfd/challengeDynamic.go +++ b/sdk/go/ctfd/challengeDynamic.go @@ -8,7 +8,7 @@ import ( "reflect" "errors" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -26,7 +26,7 @@ import ( // "encoding/base64" // "os" // -// "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" +// "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" // "github.com/pulumi/pulumi/sdk/v3/go/pulumi" // // ) diff --git a/sdk/go/ctfd/challengeStandard.go b/sdk/go/ctfd/challengeStandard.go index 90fde2b..3f83fcf 100644 --- a/sdk/go/ctfd/challengeStandard.go +++ b/sdk/go/ctfd/challengeStandard.go @@ -8,7 +8,7 @@ import ( "reflect" "errors" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -26,7 +26,7 @@ import ( // "encoding/base64" // "os" // -// "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" +// "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" // "github.com/pulumi/pulumi/sdk/v3/go/pulumi" // // ) diff --git a/sdk/go/ctfd/config/config.go b/sdk/go/ctfd/config/config.go index f588a24..b6a2f7f 100644 --- a/sdk/go/ctfd/config/config.go +++ b/sdk/go/ctfd/config/config.go @@ -4,7 +4,7 @@ package config import ( - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumi/config" ) @@ -18,17 +18,19 @@ func GetApiKey(ctx *pulumi.Context) string { return config.Get(ctx, "ctfd:apiKey") } -// User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. -func GetNonce(ctx *pulumi.Context) string { - return config.Get(ctx, "ctfd:nonce") -} - -// User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. -func GetSession(ctx *pulumi.Context) string { - return config.Get(ctx, "ctfd:session") +// The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable +// instead. +func GetPassword(ctx *pulumi.Context) string { + return config.Get(ctx, "ctfd:password") } // CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. func GetUrl(ctx *pulumi.Context) string { return config.Get(ctx, "ctfd:url") } + +// The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable +// instead. +func GetUsername(ctx *pulumi.Context) string { + return config.Get(ctx, "ctfd:username") +} diff --git a/sdk/go/ctfd/file.go b/sdk/go/ctfd/file.go index 503733e..0c97776 100644 --- a/sdk/go/ctfd/file.go +++ b/sdk/go/ctfd/file.go @@ -7,7 +7,7 @@ import ( "context" "reflect" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -23,7 +23,7 @@ import ( // "encoding/base64" // "os" // -// "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" +// "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" // "github.com/pulumi/pulumi/sdk/v3/go/pulumi" // // ) diff --git a/sdk/go/ctfd/flag.go b/sdk/go/ctfd/flag.go index 3358d02..947e2c2 100644 --- a/sdk/go/ctfd/flag.go +++ b/sdk/go/ctfd/flag.go @@ -8,7 +8,7 @@ import ( "reflect" "errors" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -21,7 +21,7 @@ import ( // // import ( // -// "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" +// "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" // "github.com/pulumi/pulumi/sdk/v3/go/pulumi" // // ) diff --git a/sdk/go/ctfd/getChallengesDynamic.go b/sdk/go/ctfd/getChallengesDynamic.go index 43f56e7..3407fb6 100644 --- a/sdk/go/ctfd/getChallengesDynamic.go +++ b/sdk/go/ctfd/getChallengesDynamic.go @@ -7,7 +7,7 @@ import ( "context" "reflect" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/sdk/go/ctfd/getChallengesStandard.go b/sdk/go/ctfd/getChallengesStandard.go index a1628d3..75a0488 100644 --- a/sdk/go/ctfd/getChallengesStandard.go +++ b/sdk/go/ctfd/getChallengesStandard.go @@ -7,7 +7,7 @@ import ( "context" "reflect" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/sdk/go/ctfd/getTeams.go b/sdk/go/ctfd/getTeams.go index 402b131..8ebac70 100644 --- a/sdk/go/ctfd/getTeams.go +++ b/sdk/go/ctfd/getTeams.go @@ -7,7 +7,7 @@ import ( "context" "reflect" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/sdk/go/ctfd/getUsers.go b/sdk/go/ctfd/getUsers.go index 27be97c..78b51ba 100644 --- a/sdk/go/ctfd/getUsers.go +++ b/sdk/go/ctfd/getUsers.go @@ -7,7 +7,7 @@ import ( "context" "reflect" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/sdk/go/ctfd/hint.go b/sdk/go/ctfd/hint.go index c936e98..97ff336 100644 --- a/sdk/go/ctfd/hint.go +++ b/sdk/go/ctfd/hint.go @@ -8,7 +8,7 @@ import ( "reflect" "errors" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -21,7 +21,7 @@ import ( // // import ( // -// "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" +// "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" // "github.com/pulumi/pulumi/sdk/v3/go/pulumi" // // ) diff --git a/sdk/go/ctfd/init.go b/sdk/go/ctfd/init.go index e34410e..ecc934b 100644 --- a/sdk/go/ctfd/init.go +++ b/sdk/go/ctfd/init.go @@ -7,7 +7,7 @@ import ( "fmt" "github.com/blang/semver" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/sdk/go/ctfd/provider.go b/sdk/go/ctfd/provider.go index 4451645..2efde8b 100644 --- a/sdk/go/ctfd/provider.go +++ b/sdk/go/ctfd/provider.go @@ -7,7 +7,7 @@ import ( "context" "reflect" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -22,12 +22,14 @@ type Provider struct { // authenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation // policy. ApiKey pulumi.StringPtrOutput `pulumi:"apiKey"` - // User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. - Nonce pulumi.StringPtrOutput `pulumi:"nonce"` - // User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. - Session pulumi.StringPtrOutput `pulumi:"session"` + // The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + // instead. + Password pulumi.StringPtrOutput `pulumi:"password"` // CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. Url pulumi.StringPtrOutput `pulumi:"url"` + // The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + // instead. + Username pulumi.StringPtrOutput `pulumi:"username"` } // NewProvider registers a new resource with the given unique name, arguments, and options. @@ -40,16 +42,16 @@ func NewProvider(ctx *pulumi.Context, if args.ApiKey != nil { args.ApiKey = pulumi.ToSecret(args.ApiKey).(pulumi.StringPtrInput) } - if args.Nonce != nil { - args.Nonce = pulumi.ToSecret(args.Nonce).(pulumi.StringPtrInput) + if args.Password != nil { + args.Password = pulumi.ToSecret(args.Password).(pulumi.StringPtrInput) } - if args.Session != nil { - args.Session = pulumi.ToSecret(args.Session).(pulumi.StringPtrInput) + if args.Username != nil { + args.Username = pulumi.ToSecret(args.Username).(pulumi.StringPtrInput) } secrets := pulumi.AdditionalSecretOutputs([]string{ "apiKey", - "nonce", - "session", + "password", + "username", }) opts = append(opts, secrets) opts = internal.PkgResourceDefaultOpts(opts) @@ -66,12 +68,14 @@ type providerArgs struct { // authenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation // policy. ApiKey *string `pulumi:"apiKey"` - // User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. - Nonce *string `pulumi:"nonce"` - // User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. - Session *string `pulumi:"session"` + // The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + // instead. + Password *string `pulumi:"password"` // CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. Url *string `pulumi:"url"` + // The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + // instead. + Username *string `pulumi:"username"` } // The set of arguments for constructing a Provider resource. @@ -80,12 +84,14 @@ type ProviderArgs struct { // authenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation // policy. ApiKey pulumi.StringPtrInput - // User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. - Nonce pulumi.StringPtrInput - // User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. - Session pulumi.StringPtrInput + // The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + // instead. + Password pulumi.StringPtrInput // CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. Url pulumi.StringPtrInput + // The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + // instead. + Username pulumi.StringPtrInput } func (ProviderArgs) ElementType() reflect.Type { @@ -132,14 +138,10 @@ func (o ProviderOutput) ApiKey() pulumi.StringPtrOutput { return o.ApplyT(func(v *Provider) pulumi.StringPtrOutput { return v.ApiKey }).(pulumi.StringPtrOutput) } -// User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. -func (o ProviderOutput) Nonce() pulumi.StringPtrOutput { - return o.ApplyT(func(v *Provider) pulumi.StringPtrOutput { return v.Nonce }).(pulumi.StringPtrOutput) -} - -// User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. -func (o ProviderOutput) Session() pulumi.StringPtrOutput { - return o.ApplyT(func(v *Provider) pulumi.StringPtrOutput { return v.Session }).(pulumi.StringPtrOutput) +// The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable +// instead. +func (o ProviderOutput) Password() pulumi.StringPtrOutput { + return o.ApplyT(func(v *Provider) pulumi.StringPtrOutput { return v.Password }).(pulumi.StringPtrOutput) } // CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. @@ -147,6 +149,12 @@ func (o ProviderOutput) Url() pulumi.StringPtrOutput { return o.ApplyT(func(v *Provider) pulumi.StringPtrOutput { return v.Url }).(pulumi.StringPtrOutput) } +// The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable +// instead. +func (o ProviderOutput) Username() pulumi.StringPtrOutput { + return o.ApplyT(func(v *Provider) pulumi.StringPtrOutput { return v.Username }).(pulumi.StringPtrOutput) +} + func init() { pulumi.RegisterInputType(reflect.TypeOf((*ProviderInput)(nil)).Elem(), &Provider{}) pulumi.RegisterOutputType(ProviderOutput{}) diff --git a/sdk/go/ctfd/pulumiTypes.go b/sdk/go/ctfd/pulumiTypes.go index 3b7d834..64adca7 100644 --- a/sdk/go/ctfd/pulumiTypes.go +++ b/sdk/go/ctfd/pulumiTypes.go @@ -7,7 +7,7 @@ import ( "context" "reflect" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/sdk/go/ctfd/team.go b/sdk/go/ctfd/team.go index 3a8a517..68c23e4 100644 --- a/sdk/go/ctfd/team.go +++ b/sdk/go/ctfd/team.go @@ -8,7 +8,7 @@ import ( "reflect" "errors" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -21,7 +21,7 @@ import ( // // import ( // -// "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" +// "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" // "github.com/pulumi/pulumi/sdk/v3/go/pulumi" // // ) diff --git a/sdk/go/ctfd/user.go b/sdk/go/ctfd/user.go index 1f1c856..d608e5c 100644 --- a/sdk/go/ctfd/user.go +++ b/sdk/go/ctfd/user.go @@ -8,7 +8,7 @@ import ( "reflect" "errors" - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd/internal" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd/internal" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) @@ -21,7 +21,7 @@ import ( // // import ( // -// "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" +// "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" // "github.com/pulumi/pulumi/sdk/v3/go/pulumi" // // ) diff --git a/sdk/nodejs/config/vars.ts b/sdk/nodejs/config/vars.ts index fd17161..67a552a 100644 --- a/sdk/nodejs/config/vars.ts +++ b/sdk/nodejs/config/vars.ts @@ -21,34 +21,36 @@ Object.defineProperty(exports, "apiKey", { }); /** - * User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + * The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + * instead. */ -export declare const nonce: string | undefined; -Object.defineProperty(exports, "nonce", { +export declare const password: string | undefined; +Object.defineProperty(exports, "password", { get() { - return __config.get("nonce"); + return __config.get("password"); }, enumerable: true, }); /** - * User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. + * CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. */ -export declare const session: string | undefined; -Object.defineProperty(exports, "session", { +export declare const url: string | undefined; +Object.defineProperty(exports, "url", { get() { - return __config.get("session"); + return __config.get("url"); }, enumerable: true, }); /** - * CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. + * The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + * instead. */ -export declare const url: string | undefined; -Object.defineProperty(exports, "url", { +export declare const username: string | undefined; +Object.defineProperty(exports, "username", { get() { - return __config.get("url"); + return __config.get("username"); }, enumerable: true, }); diff --git a/sdk/nodejs/provider.ts b/sdk/nodejs/provider.ts index 69d198d..81a9572 100644 --- a/sdk/nodejs/provider.ts +++ b/sdk/nodejs/provider.ts @@ -32,17 +32,19 @@ export class Provider extends pulumi.ProviderResource { */ public readonly apiKey!: pulumi.Output; /** - * User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + * The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + * instead. */ - public readonly nonce!: pulumi.Output; - /** - * User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. - */ - public readonly session!: pulumi.Output; + public readonly password!: pulumi.Output; /** * CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. */ public readonly url!: pulumi.Output; + /** + * The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + * instead. + */ + public readonly username!: pulumi.Output; /** * Create a Provider resource with the given unique name, arguments, and options. @@ -56,12 +58,12 @@ export class Provider extends pulumi.ProviderResource { opts = opts || {}; { resourceInputs["apiKey"] = args?.apiKey ? pulumi.secret(args.apiKey) : undefined; - resourceInputs["nonce"] = args?.nonce ? pulumi.secret(args.nonce) : undefined; - resourceInputs["session"] = args?.session ? pulumi.secret(args.session) : undefined; + resourceInputs["password"] = args?.password ? pulumi.secret(args.password) : undefined; resourceInputs["url"] = args ? args.url : undefined; + resourceInputs["username"] = args?.username ? pulumi.secret(args.username) : undefined; } opts = pulumi.mergeOptions(utilities.resourceOptsDefaults(), opts); - const secretOpts = { additionalSecretOutputs: ["apiKey", "nonce", "session"] }; + const secretOpts = { additionalSecretOutputs: ["apiKey", "password", "username"] }; opts = pulumi.mergeOptions(opts, secretOpts); super(Provider.__pulumiType, name, resourceInputs, opts); } @@ -78,15 +80,17 @@ export interface ProviderArgs { */ apiKey?: pulumi.Input; /** - * User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + * The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + * instead. */ - nonce?: pulumi.Input; - /** - * User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. - */ - session?: pulumi.Input; + password?: pulumi.Input; /** * CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. */ url?: pulumi.Input; + /** + * The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + * instead. + */ + username?: pulumi.Input; } diff --git a/sdk/python/ctfer-io_pulumi-ctfd/config/__init__.pyi b/sdk/python/ctfer-io_pulumi-ctfd/config/__init__.pyi index 43fe9d1..801b9cb 100644 --- a/sdk/python/ctfer-io_pulumi-ctfd/config/__init__.pyi +++ b/sdk/python/ctfer-io_pulumi-ctfd/config/__init__.pyi @@ -21,18 +21,20 @@ authenticate yourself, we do not recommend it as you will probably generate a lo policy. """ -nonce: Optional[str] +password: Optional[str] """ -User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. +The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable +instead. """ -session: Optional[str] +url: Optional[str] """ -User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. +CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. """ -url: Optional[str] +username: Optional[str] """ -CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. +The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable +instead. """ diff --git a/sdk/python/ctfer-io_pulumi-ctfd/config/vars.py b/sdk/python/ctfer-io_pulumi-ctfd/config/vars.py index 21a3c46..990647f 100644 --- a/sdk/python/ctfer-io_pulumi-ctfd/config/vars.py +++ b/sdk/python/ctfer-io_pulumi-ctfd/config/vars.py @@ -30,23 +30,25 @@ def api_key(self) -> Optional[str]: return __config__.get('apiKey') @property - def nonce(self) -> Optional[str]: + def password(self) -> Optional[str]: """ - User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + instead. """ - return __config__.get('nonce') + return __config__.get('password') @property - def session(self) -> Optional[str]: + def url(self) -> Optional[str]: """ - User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. + CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. """ - return __config__.get('session') + return __config__.get('url') @property - def url(self) -> Optional[str]: + def username(self) -> Optional[str]: """ - CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. + The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + instead. """ - return __config__.get('url') + return __config__.get('username') diff --git a/sdk/python/ctfer-io_pulumi-ctfd/provider.py b/sdk/python/ctfer-io_pulumi-ctfd/provider.py index 7b35e2f..2408b82 100644 --- a/sdk/python/ctfer-io_pulumi-ctfd/provider.py +++ b/sdk/python/ctfer-io_pulumi-ctfd/provider.py @@ -20,26 +20,28 @@ class ProviderArgs: def __init__(__self__, *, api_key: Optional[pulumi.Input[str]] = None, - nonce: Optional[pulumi.Input[str]] = None, - session: Optional[pulumi.Input[str]] = None, - url: Optional[pulumi.Input[str]] = None): + password: Optional[pulumi.Input[str]] = None, + url: Optional[pulumi.Input[str]] = None, + username: Optional[pulumi.Input[str]] = None): """ The set of arguments for constructing a Provider resource. :param pulumi.Input[str] api_key: User API key. Could use `CTFD_API_KEY` environment variable instead. Despite being the most convenient way to authenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation policy. - :param pulumi.Input[str] nonce: User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. - :param pulumi.Input[str] session: User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. + :param pulumi.Input[str] password: The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + instead. :param pulumi.Input[str] url: CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. + :param pulumi.Input[str] username: The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + instead. """ if api_key is not None: pulumi.set(__self__, "api_key", api_key) - if nonce is not None: - pulumi.set(__self__, "nonce", nonce) - if session is not None: - pulumi.set(__self__, "session", session) + if password is not None: + pulumi.set(__self__, "password", password) if url is not None: pulumi.set(__self__, "url", url) + if username is not None: + pulumi.set(__self__, "username", username) @property @pulumi.getter(name="apiKey") @@ -57,27 +59,16 @@ def api_key(self, value: Optional[pulumi.Input[str]]): @property @pulumi.getter - def nonce(self) -> Optional[pulumi.Input[str]]: - """ - User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. - """ - return pulumi.get(self, "nonce") - - @nonce.setter - def nonce(self, value: Optional[pulumi.Input[str]]): - pulumi.set(self, "nonce", value) - - @property - @pulumi.getter - def session(self) -> Optional[pulumi.Input[str]]: + def password(self) -> Optional[pulumi.Input[str]]: """ - User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. + The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + instead. """ - return pulumi.get(self, "session") + return pulumi.get(self, "password") - @session.setter - def session(self, value: Optional[pulumi.Input[str]]): - pulumi.set(self, "session", value) + @password.setter + def password(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "password", value) @property @pulumi.getter @@ -91,6 +82,19 @@ def url(self) -> Optional[pulumi.Input[str]]: def url(self, value: Optional[pulumi.Input[str]]): pulumi.set(self, "url", value) + @property + @pulumi.getter + def username(self) -> Optional[pulumi.Input[str]]: + """ + The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + instead. + """ + return pulumi.get(self, "username") + + @username.setter + def username(self, value: Optional[pulumi.Input[str]]): + pulumi.set(self, "username", value) + class Provider(pulumi.ProviderResource): @overload @@ -98,9 +102,9 @@ def __init__(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, api_key: Optional[pulumi.Input[str]] = None, - nonce: Optional[pulumi.Input[str]] = None, - session: Optional[pulumi.Input[str]] = None, + password: Optional[pulumi.Input[str]] = None, url: Optional[pulumi.Input[str]] = None, + username: Optional[pulumi.Input[str]] = None, __props__=None): """ The provider type for the ctfd package. By default, resources use package-wide configuration @@ -113,9 +117,11 @@ def __init__(__self__, :param pulumi.Input[str] api_key: User API key. Could use `CTFD_API_KEY` environment variable instead. Despite being the most convenient way to authenticate yourself, we do not recommend it as you will probably generate a long-live token without any rotation policy. - :param pulumi.Input[str] nonce: User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. - :param pulumi.Input[str] session: User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. + :param pulumi.Input[str] password: The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + instead. :param pulumi.Input[str] url: CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. + :param pulumi.Input[str] username: The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + instead. """ ... @overload @@ -145,9 +151,9 @@ def _internal_init(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, api_key: Optional[pulumi.Input[str]] = None, - nonce: Optional[pulumi.Input[str]] = None, - session: Optional[pulumi.Input[str]] = None, + password: Optional[pulumi.Input[str]] = None, url: Optional[pulumi.Input[str]] = None, + username: Optional[pulumi.Input[str]] = None, __props__=None): opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) if not isinstance(opts, pulumi.ResourceOptions): @@ -158,10 +164,10 @@ def _internal_init(__self__, __props__ = ProviderArgs.__new__(ProviderArgs) __props__.__dict__["api_key"] = None if api_key is None else pulumi.Output.secret(api_key) - __props__.__dict__["nonce"] = None if nonce is None else pulumi.Output.secret(nonce) - __props__.__dict__["session"] = None if session is None else pulumi.Output.secret(session) + __props__.__dict__["password"] = None if password is None else pulumi.Output.secret(password) __props__.__dict__["url"] = url - secret_opts = pulumi.ResourceOptions(additional_secret_outputs=["apiKey", "nonce", "session"]) + __props__.__dict__["username"] = None if username is None else pulumi.Output.secret(username) + secret_opts = pulumi.ResourceOptions(additional_secret_outputs=["apiKey", "password", "username"]) opts = pulumi.ResourceOptions.merge(opts, secret_opts) super(Provider, __self__).__init__( 'ctfd', @@ -181,25 +187,27 @@ def api_key(self) -> pulumi.Output[Optional[str]]: @property @pulumi.getter - def nonce(self) -> pulumi.Output[Optional[str]]: + def password(self) -> pulumi.Output[Optional[str]]: """ - User session nonce, comes with session. Could use `CTFD_NONCE` environment variable instead. + The administrator or service account password to login with. Could use `CTFD_ADMIN_PASSWORD` environment variable + instead. """ - return pulumi.get(self, "nonce") + return pulumi.get(self, "password") @property @pulumi.getter - def session(self) -> pulumi.Output[Optional[str]]: + def url(self) -> pulumi.Output[Optional[str]]: """ - User session token, comes with nonce. Could use `CTFD_SESSION` environment variable instead. + CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. """ - return pulumi.get(self, "session") + return pulumi.get(self, "url") @property @pulumi.getter - def url(self) -> pulumi.Output[Optional[str]]: + def username(self) -> pulumi.Output[Optional[str]]: """ - CTFd base URL (e.g. `https://my-ctf.lan`). Could use `CTFD_URL` environment variable instead. + The administrator or service account username to login with. Could use `CTFD_ADMIN_USERNAME` environment variable + instead. """ - return pulumi.get(self, "url") + return pulumi.get(self, "username") From 199b3ef741efec95758b04095dfca9acfaea264f Mon Sep 17 00:00:00 2001 From: Lucas TESSON Date: Tue, 11 Feb 2025 16:42:00 +0100 Subject: [PATCH 2/2] docs: update to fit major changes --- docs/_index.md | 2 +- docs/installation-configuration.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_index.md b/docs/_index.md index 4b30032..af068bd 100644 --- a/docs/_index.md +++ b/docs/_index.md @@ -81,7 +81,7 @@ let ch = new ctfd.Challenge('some-challenge', { package main import ( - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" ) diff --git a/docs/installation-configuration.md b/docs/installation-configuration.md index 53fdd79..db8b6d5 100644 --- a/docs/installation-configuration.md +++ b/docs/installation-configuration.md @@ -55,7 +55,7 @@ For instance, you can set the url using `pulumi config set url https://my-ctf.la package main import ( - "github.com/ctfer-io/pulumi-ctfd/sdk/go/ctfd" + "github.com/ctfer-io/pulumi-ctfd/sdk/v2/go/ctfd" "github.com/pulumi/pulumi/sdk/v3/go/pulumi" "github.com/pulumi/pulumi/sdk/v3/go/pulumi/config" )