Skip to content

Commit cce0419

Browse files
author
davidebbo
committed
Generate host/function secrets if missing
1 parent 70dae1a commit cce0419

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

src/WebJobs.Script.WebHost/App_Start/AutofacBootstrap.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ internal static void Initialize(ContainerBuilder builder)
5555
builder.RegisterInstance<WebScriptHostManager>(scriptHostManager);
5656

5757
SecretManager secretManager = new SecretManager(secretsPath);
58+
// Make sure that host secrets get created on startup if they don't exist
59+
secretManager.GetHostSecrets();
5860
builder.RegisterInstance<SecretManager>(secretManager);
5961

6062
WebHookReceiverManager webHookRecieverManager = new WebHookReceiverManager(secretManager);

src/WebJobs.Script.WebHost/SecretManager.cs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Concurrent;
66
using System.Globalization;
77
using System.IO;
8+
using System.Security.Cryptography;
89
using Newtonsoft.Json;
910

1011
namespace WebJobs.Script.WebHost
@@ -52,8 +53,14 @@ public virtual HostSecrets GetHostSecrets()
5253
}
5354
else
5455
{
55-
// initialize with empty instance
56-
_hostSecrets = new HostSecrets();
56+
// initialize with new secrets and save it
57+
_hostSecrets = new HostSecrets
58+
{
59+
MasterKey = GenerateSecretString(),
60+
FunctionKey = GenerateSecretString()
61+
};
62+
63+
File.WriteAllText(secretFilePath, JsonConvert.SerializeObject(_hostSecrets, Formatting.Indented));
5764
}
5865
}
5966
return _hostSecrets;
@@ -81,14 +88,32 @@ public virtual FunctionSecrets GetFunctionSecrets(string functionName)
8188
}
8289
else
8390
{
84-
// initialize with empty instance
85-
secrets = new FunctionSecrets();
91+
// initialize with new secrets and save it
92+
secrets = new FunctionSecrets
93+
{
94+
Key = GenerateSecretString()
95+
};
96+
97+
File.WriteAllText(secretFilePath, JsonConvert.SerializeObject(secrets, Formatting.Indented));
8698
}
8799

88100
return secrets;
89101
});
90102
}
91103

104+
static string GenerateSecretString()
105+
{
106+
using (var rng = RandomNumberGenerator.Create())
107+
{
108+
byte[] data = new byte[40];
109+
rng.GetBytes(data);
110+
string secret = Convert.ToBase64String(data);
111+
112+
// Replace pluses as they are problematic as URL values
113+
return secret.Replace('+', 'a');
114+
}
115+
}
116+
92117
private void OnChanged(object sender, FileSystemEventArgs e)
93118
{
94119
// clear the cached secrets if they exist

0 commit comments

Comments
 (0)