Skip to content

Commit 1964a64

Browse files
committed
Add command-line flag to toggle audit logging
1 parent ad3cb79 commit 1964a64

File tree

4 files changed

+82
-23
lines changed

4 files changed

+82
-23
lines changed

enterprise/cli/root.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
11
package cli
22

33
import (
4-
"context"
5-
64
"github.com/spf13/cobra"
75

86
agpl "github.com/coder/coder/cli"
9-
agplcoderd "github.com/coder/coder/coderd"
10-
"github.com/coder/coder/enterprise/coderd"
117
)
128

139
func enterpriseOnly() []*cobra.Command {
1410
return []*cobra.Command{
15-
agpl.Server(func(ctx context.Context, options *agplcoderd.Options) (*agplcoderd.API, error) {
16-
api, err := coderd.New(ctx, &coderd.Options{
17-
Options: options,
18-
})
19-
if err != nil {
20-
return nil, err
21-
}
22-
return api.AGPL, nil
23-
}),
11+
server(),
2412
features(),
2513
licenses(),
2614
}

enterprise/cli/server.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cli
2+
3+
import (
4+
"context"
5+
6+
"github.com/spf13/cobra"
7+
8+
"github.com/coder/coder/cli/cliflag"
9+
"github.com/coder/coder/enterprise/coderd"
10+
11+
agpl "github.com/coder/coder/cli"
12+
agplcoderd "github.com/coder/coder/coderd"
13+
)
14+
15+
func server() *cobra.Command {
16+
var (
17+
auditLogging bool
18+
)
19+
cmd := agpl.Server(func(ctx context.Context, options *agplcoderd.Options) (*agplcoderd.API, error) {
20+
api, err := coderd.New(ctx, &coderd.Options{
21+
AuditLogging: auditLogging,
22+
Options: options,
23+
})
24+
if err != nil {
25+
return nil, err
26+
}
27+
return api.AGPL, nil
28+
})
29+
cliflag.BoolVarP(cmd.Flags(), &auditLogging, "audit-logging", "", "CODER_AUDIT_LOGGING", true,
30+
"Specifies whether audit logging is enabled.")
31+
32+
return cmd
33+
}

enterprise/coderd/coderd.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ func New(ctx context.Context, options *Options) (*API, error) {
7878
type Options struct {
7979
*coderd.Options
8080

81+
AuditLogging bool
8182
EntitlementsUpdateInterval time.Duration
8283
Keys map[string]ed25519.PublicKey
8384
}
@@ -125,7 +126,14 @@ func (api *API) updateEntitlements(ctx context.Context) error {
125126
api.mutex.Lock()
126127
defer api.mutex.Unlock()
127128
now := time.Now()
128-
auditLogs := api.auditLogs
129+
130+
// Default all entitlements to be disabled.
131+
activeUsers := codersdk.Feature{
132+
Enabled: false,
133+
Entitlement: codersdk.EntitlementNotEntitled,
134+
}
135+
auditLogs := codersdk.EntitlementNotEntitled
136+
129137
for _, l := range licenses {
130138
claims, err := validateDBLicense(l, api.Keys)
131139
if err != nil {
@@ -141,24 +149,25 @@ func (api *API) updateEntitlements(ctx context.Context) error {
141149
entitlement = codersdk.EntitlementGracePeriod
142150
}
143151
if claims.Features.UserLimit > 0 {
144-
api.activeUsers.Enabled = true
145-
api.activeUsers.Entitlement = entitlement
152+
activeUsers.Enabled = true
153+
activeUsers.Entitlement = entitlement
146154
currentLimit := int64(0)
147-
if api.activeUsers.Limit != nil {
148-
currentLimit = *api.activeUsers.Limit
155+
if activeUsers.Limit != nil {
156+
currentLimit = *activeUsers.Limit
149157
}
150158
limit := max(currentLimit, claims.Features.UserLimit)
151-
api.activeUsers.Limit = &limit
159+
activeUsers.Limit = &limit
152160
}
153161
if claims.Features.AuditLog > 0 {
154-
api.auditLogs = entitlement
162+
auditLogs = entitlement
155163
}
156164
}
165+
157166
if auditLogs != api.auditLogs {
158167
auditor := agplaudit.NewNop()
159168
// A flag could be added to the options that would allow disabling
160169
// enhanced audit logging here!
161-
if api.auditLogs == codersdk.EntitlementEntitled {
170+
if api.auditLogs == codersdk.EntitlementEntitled && api.AuditLogging {
162171
auditor = audit.NewAuditor(
163172
audit.DefaultFilter,
164173
backends.NewPostgres(api.Database, true),
@@ -167,6 +176,10 @@ func (api *API) updateEntitlements(ctx context.Context) error {
167176
}
168177
api.AGPL.Auditor.Store(auditor)
169178
}
179+
180+
api.activeUsers = activeUsers
181+
api.auditLogs = auditLogs
182+
170183
return nil
171184
}
172185

@@ -205,9 +218,9 @@ func (api *API) entitlements(rw http.ResponseWriter, r *http.Request) {
205218
// Audit logs
206219
resp.Features[codersdk.FeatureAuditLog] = codersdk.Feature{
207220
Entitlement: auditLogs,
208-
Enabled: true,
221+
Enabled: api.AuditLogging,
209222
}
210-
if auditLogs == codersdk.EntitlementGracePeriod {
223+
if auditLogs == codersdk.EntitlementGracePeriod && api.AuditLogging {
211224
resp.Warnings = append(resp.Warnings,
212225
"Audit logging is enabled but your license for this feature is expired.")
213226
}

enterprise/coderd/coderd_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,31 @@ func TestEntitlements(t *testing.T) {
5959
assert.Nil(t, al.Actual)
6060
assert.Empty(t, res.Warnings)
6161
})
62+
t.Run("FullLicenseToNone", func(t *testing.T) {
63+
t.Parallel()
64+
client := coderdenttest.New(t, nil)
65+
_ = coderdtest.CreateFirstUser(t, client)
66+
license := coderdenttest.AddLicense(t, client, coderdenttest.AddLicenseOptions{
67+
UserLimit: 100,
68+
AuditLog: true,
69+
})
70+
res, err := client.Entitlements(context.Background())
71+
require.NoError(t, err)
72+
assert.True(t, res.HasLicense)
73+
al := res.Features[codersdk.FeatureAuditLog]
74+
assert.Equal(t, codersdk.EntitlementEntitled, al.Entitlement)
75+
assert.True(t, al.Enabled)
76+
77+
err = client.DeleteLicense(context.Background(), license.ID)
78+
require.NoError(t, err)
79+
80+
res, err = client.Entitlements(context.Background())
81+
require.NoError(t, err)
82+
assert.True(t, res.HasLicense)
83+
al = res.Features[codersdk.FeatureAuditLog]
84+
assert.Equal(t, codersdk.EntitlementNotEntitled, al.Entitlement)
85+
assert.True(t, al.Enabled)
86+
})
6287
t.Run("Warnings", func(t *testing.T) {
6388
t.Parallel()
6489
client := coderdenttest.New(t, nil)

0 commit comments

Comments
 (0)