Skip to content

Commit d3a01db

Browse files
committed
Add authentication to the package server
1 parent 58760ac commit d3a01db

File tree

7 files changed

+189
-136
lines changed

7 files changed

+189
-136
lines changed

backend/experiments/CanvasHack/Main.fs

+32-29
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ type CanvasHackConfig =
2525
CanvasId : Option<string>
2626

2727
[<Legivel.Attributes.YamlField("main")>]
28-
Main : string }
28+
Main : string
29+
30+
[<Legivel.Attributes.YamlField("required-secrets")>]
31+
requiredSecrets : Option<List<string>> }
2932

3033
let parseYamlExn<'a> (filename : string) : 'a =
3134
let contents = System.IO.File.ReadAllText filename
@@ -56,7 +59,7 @@ let destroyCanvas (id : CanvasID) : Task<unit> =
5659
}
5760

5861

59-
let seedCanvas (canvasName : string) =
62+
let seedCanvas (canvasName : string) (secrets : Map<string, string>) =
6063
task {
6164
let canvasDir = $"{baseDir}/{canvasName}"
6265
let config = parseYamlExn<CanvasHackConfig> $"{canvasDir}/config.yml"
@@ -81,6 +84,21 @@ let seedCanvas (canvasName : string) =
8184
do! destroyCanvas canvasID
8285
do! LibCloud.Canvas.createWithExactID canvasID ownerID domain
8386

87+
match config.requiredSecrets with
88+
| Some requiredSecrets ->
89+
do!
90+
requiredSecrets
91+
|> Task.iterSequentially (fun secretName ->
92+
task {
93+
let secretValue =
94+
Map.find secretName secrets
95+
|> Exception.unwrapOptionInternal
96+
"secret not found"
97+
[ "secretName", secretName ]
98+
do! LibCloud.Secret.insert canvasID secretName secretValue 0
99+
})
100+
| None -> ()
101+
84102
let resolver =
85103
let builtIns =
86104
LibExecution.Builtin.combine
@@ -117,27 +135,6 @@ let seedCanvas (canvasName : string) =
117135
do! C.saveTLIDs canvasID tls
118136

119137

120-
// now that the canvas has been seeded, load any secrets in a .secrets file
121-
let secretsFileLocation = $"{canvasDir}/.secrets"
122-
123-
if System.IO.File.Exists secretsFileLocation then
124-
// read this file
125-
do!
126-
secretsFileLocation
127-
|> System.IO.File.ReadAllLines
128-
|> Array.filter (String.startsWith "#" >> not)
129-
|> Array.filter (String.isEmpty >> not)
130-
|> Array.map (fun line ->
131-
match line.Split('=') with
132-
| [| key; value |] -> (key, value)
133-
| _ -> Exception.raiseInternal "invalid .secrets file" [])
134-
|> Array.toList
135-
|> Task.iterSequentially (fun (k, v) ->
136-
LibCloud.Secret.insert canvasID k v 0)
137-
else
138-
// we don't have secrets to load - we're done
139-
()
140-
141138
let host = $"http://{domain}:{LibService.Config.bwdServerPort}"
142139
let experimentalHost = $"http://{domain}:{LibService.Config.bwdDangerServerPort}"
143140
print
@@ -152,15 +149,21 @@ let main (args : string[]) =
152149
initSerializers ()
153150

154151
task {
155-
match args with
156-
| [||]
157-
| [| "--help" |] ->
152+
match Array.toList args with
153+
| []
154+
| [ "--help" ] ->
158155
print $"`canvas-hack {CommandNames.import}` to load dark-editor from disk"
159156

160-
| [| canvasName |]
161-
| [| CommandNames.import; canvasName |] ->
157+
| CommandNames.import :: canvasName :: secrets ->
162158
print $"Loading canvas {canvasName} from disk"
163-
do! seedCanvas canvasName
159+
let secrets =
160+
secrets
161+
|> List.map (fun s ->
162+
match String.split "=" s with
163+
| [ name; value ] -> name, value
164+
| _ -> Exception.raiseInternal $"Invalid secret {s}" [])
165+
|> Map.ofList
166+
do! seedCanvas canvasName secrets
164167

165168
| _ ->
166169
let args = args |> Array.toList |> String.concat " "

backend/src/LocalExec/local-exec.dark

+42-27
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@ let listPackageFilesOnDisk (dir: String) : List<String> =
2525

2626

2727
let saveItemToCanvas
28-
(host: String)
2928
(json: String)
29+
(host: String)
30+
(password: String)
3031
(name: String)
3132
: PACKAGE.Darklang.Stdlib.Result.Result<Unit, String> =
3233
let response =
3334
PACKAGE.Darklang.Stdlib.HttpClient.request
3435
"POST"
3536
$"{host}/{name}s"
36-
[]
37+
[PACKAGE.Darklang.Stdlib.HttpClient.bearerToken password]
3738
(PACKAGE.Darklang.Stdlib.String.toBytes json)
3839

3940
let errMsg = $"Error saving {name} to canvas"
@@ -51,6 +52,7 @@ let saveItemToCanvas
5152
Builtin.printLine
5253
$"Body: {response.body |> PACKAGE.Darklang.Stdlib.String.fromBytesWithReplacement}"
5354

55+
Builtin.printLine $"pw[{password}]"
5456
Builtin.printLine errMsg
5557
PACKAGE.Darklang.Stdlib.Result.Result.Error errMsg
5658
| Error err ->
@@ -62,7 +64,8 @@ let saveItemToCanvas
6264

6365

6466
let loadPackageFileIntoDarkCanvas
65-
(host : string)
67+
(host: String)
68+
(password: String)
6669
(filename: String)
6770
: PACKAGE.Darklang.Stdlib.Result.Result<Unit, String> =
6871
let package =
@@ -78,44 +81,56 @@ let loadPackageFileIntoDarkCanvas
7881
|> PACKAGE.Darklang.Stdlib.List.map (fun fn ->
7982
let owner = fn.name.owner
8083
let modules = fn.name.modules |> PACKAGE.Darklang.Stdlib.String.join "."
81-
let name = match fn.name.name with
82-
| FnName name -> name
84+
85+
let name =
86+
match fn.name.name with
87+
| FnName name -> name
88+
8389
let version = PACKAGE.Darklang.Stdlib.Int64.toString_v0 fn.name.version
84-
let name = $"Function {owner}.{modules}.{name}_v{version}"
90+
let name = $"Function {owner}.{modules}.{name}_v{version}"
8591

8692
Builtin.printLine $"Saving {name}"
93+
8794
fn
8895
|> Builtin.Json.serialize<PACKAGE.Darklang.LanguageTools.ProgramTypes.PackageFn.PackageFn>
89-
|> saveItemToCanvas host "function")
96+
|> saveItemToCanvas host password "function")
9097

9198
let typeResults =
9299
package.types
93100
|> PACKAGE.Darklang.Stdlib.List.map (fun t ->
94101

95102
let owner = t.name.owner
96103
let modules = t.name.modules |> PACKAGE.Darklang.Stdlib.String.join "."
97-
let name = match t.name.name with
98-
| TypeName name -> name
104+
105+
let name =
106+
match t.name.name with
107+
| TypeName name -> name
108+
99109
let version = PACKAGE.Darklang.Stdlib.Int64.toString_v0 t.name.version
100-
let name = $"Type {owner}.{modules}.{name}_v{version}"
110+
let name = $"Type {owner}.{modules}.{name}_v{version}"
101111
Builtin.printLine $"Saving {name}"
112+
102113
t
103114
|> Builtin.Json.serialize<PACKAGE.Darklang.LanguageTools.ProgramTypes.PackageType>
104-
|> saveItemToCanvas host "type")
115+
|> saveItemToCanvas host password "type")
105116

106117
let constantResults =
107118
package.constants
108119
|> PACKAGE.Darklang.Stdlib.List.map (fun c ->
109120
let owner = c.name.owner
110121
let modules = c.name.modules |> PACKAGE.Darklang.Stdlib.String.join "."
111-
let name = match c.name.name with
112-
| ConstantName name -> name
122+
123+
let name =
124+
match c.name.name with
125+
| ConstantName name -> name
126+
113127
let version = PACKAGE.Darklang.Stdlib.Int64.toString_v0 c.name.version
114-
let name = $"Constant {owner}.{modules}.{name}_v{version}"
128+
let name = $"Constant {owner}.{modules}.{name}_v{version}"
115129
Builtin.printLine $"Saving {name}"
130+
116131
c
117132
|> Builtin.Json.serialize<PACKAGE.Darklang.LanguageTools.ProgramTypes.PackageConstant>
118-
|> saveItemToCanvas host "constant")
133+
|> saveItemToCanvas host password "constant")
119134

120135
// Flatten all the result lists into one list
121136
let allResults =
@@ -174,7 +189,7 @@ let printAllPackagesInDb () : Unit =
174189
// parse args and execute
175190
type CliOptions =
176191
| Help
177-
| LoadPackagesIntoDarkCanvas of String
192+
| LoadPackagesIntoDarkCanvas of String * String
178193
| ListPackages
179194
| BadOption of String
180195

@@ -184,7 +199,7 @@ let usage () : String =
184199
Options:
185200
-h, --help Show this help message and exit
186201
load-packages-dlio Load packages from disk into local dark packages canvas
187-
load-packages-darklang-com Load packages from disk into production packages canvas
202+
load-packages-darklang-com PASSWORD Load packages from disk into production packages canvas
188203
list-packages List packages
189204
"
190205

@@ -199,8 +214,10 @@ let parseArgs (args: List<String>) : CliOptions =
199214
| [ "load-packages" ] ->
200215
CliOptions.BadOption
201216
"`load-packages` now executes in F# (not sure how you got here)"
202-
| [ "load-packages-dlio" ] -> CliOptions.LoadPackagesIntoDarkCanvas "http://dark-packages.dlio.localhost:11003"
203-
| [ "load-packages-darklang-com" ] -> CliOptions.LoadPackagesIntoDarkCanvas "https://packages.darklang.com"
217+
| [ "load-packages-dlio" ] ->
218+
CliOptions.LoadPackagesIntoDarkCanvas("http://dark-packages.dlio.localhost:11003", "password")
219+
| [ "load-packages-darklang-com", password ] ->
220+
CliOptions.LoadPackagesIntoDarkCanvas("https://packages.darklang.com", password)
204221

205222
| _ -> CliOptions.BadOption "Invalid arguments"
206223

@@ -216,8 +233,10 @@ let main (args: List<String>) : Int64 =
216233
printAllPackagesInDb ()
217234
0L
218235

219-
| LoadPackagesIntoDarkCanvas host ->
220-
let files = (listPackageFilesOnDisk "/home/dark/app/packages") |> PACKAGE.Darklang.Stdlib.List.sort
236+
| LoadPackagesIntoDarkCanvas(host, password) ->
237+
let files =
238+
(listPackageFilesOnDisk "/home/dark/app/packages")
239+
|> PACKAGE.Darklang.Stdlib.List.sort
221240

222241
// Wait for canvas to be ready
223242
let available =
@@ -228,11 +247,7 @@ let main (args: List<String>) : Int64 =
228247
match found with
229248
| Ok() -> PACKAGE.Darklang.Stdlib.Result.Result.Ok()
230249
| Error _ ->
231-
(PACKAGE.Darklang.Stdlib.HttpClient.request
232-
"GET"
233-
$"{host}/health"
234-
[]
235-
[])
250+
(PACKAGE.Darklang.Stdlib.HttpClient.request "GET" $"{host}/health" [] [])
236251
|> PACKAGE.Darklang.Stdlib.Result.map (fun _ -> ())
237252
|> PACKAGE.Darklang.Stdlib.Result.mapError (fun err ->
238253
let errMsg = PACKAGE.Darklang.Stdlib.HttpClient.toString err
@@ -259,7 +274,7 @@ let main (args: List<String>) : Int64 =
259274
match acc with
260275
| Error _err -> acc
261276
| Ok() ->
262-
match loadPackageFileIntoDarkCanvas host f with
277+
match loadPackageFileIntoDarkCanvas host password f with
263278
| Error err ->
264279
PACKAGE.Darklang.Stdlib.Result.Result.Error(
265280
$"Failed to load packages from {f}:\n" ++ err

canvases/dark-packages/config.yml

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
version: 2
22
id: 11111111-1111-1111-1111-111111111112
33
main: main
4+
required-secrets:
5+
- AUTH_PASSWORD

0 commit comments

Comments
 (0)