Skip to content

Commit 40d017b

Browse files
authored
fix(misconf): correct Azure value-to-time conversion in AsTimeValue (#9015)
Signed-off-by: nikpivkin <[email protected]>
1 parent 87118a0 commit 40d017b

File tree

2 files changed

+58
-11
lines changed

2 files changed

+58
-11
lines changed

pkg/iac/scanners/azure/value.go

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -335,19 +335,28 @@ func (v Value) HasKey(key string) bool {
335335
return ok
336336
}
337337

338-
func (v Value) AsTimeValue(metadata types.Metadata) types.TimeValue {
338+
func (v Value) AsTimeValue(parentMeta types.Metadata) types.TimeValue {
339339
v.Resolve()
340-
if v.Kind != KindString {
341-
return types.Time(time.Time{}, metadata)
342-
}
343-
if v.Kind == KindNumber {
344-
return types.Time(time.Unix(int64(v.AsFloat()), 0), metadata)
345-
}
346-
t, err := time.Parse(time.RFC3339, v.rLit.(string))
347-
if err != nil {
348-
return types.Time(time.Time{}, metadata)
340+
341+
switch v.Kind {
342+
case KindString:
343+
t, err := time.Parse(time.RFC3339, v.rLit.(string))
344+
if err != nil {
345+
return types.Time(time.Time{}, parentMeta)
346+
}
347+
return types.Time(t, v.Metadata)
348+
case KindNumber:
349+
var tv int64
350+
switch vv := v.rLit.(type) {
351+
case float64:
352+
tv = int64(vv)
353+
case int64:
354+
tv = vv
355+
}
356+
return types.Time(time.Unix(tv, 0), v.Metadata)
357+
default:
358+
return types.Time(time.Time{}, parentMeta)
349359
}
350-
return types.Time(t, metadata)
351360
}
352361

353362
func (v Value) AsStringValuesList(defaultValue string) (stringValues []types.StringValue) {

pkg/iac/scanners/azure/value_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package azure
22

33
import (
44
"testing"
5+
"time"
56

67
"github.com/stretchr/testify/assert"
78

@@ -12,3 +13,40 @@ func Test_ValueAsInt(t *testing.T) {
1213
val := NewValue(int64(10), types.NewTestMetadata())
1314
assert.Equal(t, 10, val.AsInt())
1415
}
16+
17+
func Test_ValueAsTime(t *testing.T) {
18+
tests := []struct {
19+
name string
20+
val any
21+
expected time.Time
22+
}{
23+
{
24+
name: "string",
25+
val: "2023-12-15T14:45:00Z",
26+
expected: time.Date(2023, 12, 15, 14, 45, 0, 0, time.UTC),
27+
},
28+
{
29+
name: "int",
30+
val: int64(200),
31+
expected: time.Unix(200, 0),
32+
},
33+
{
34+
name: "float",
35+
val: float64(100),
36+
expected: time.Unix(100, 0),
37+
},
38+
{
39+
name: "invalid type",
40+
val: nil,
41+
expected: time.Time{},
42+
},
43+
}
44+
45+
for _, tt := range tests {
46+
t.Run(tt.name, func(t *testing.T) {
47+
val := NewValue(tt.val, types.NewTestMetadata())
48+
got := val.AsTimeValue(types.NewTestMetadata()).Value()
49+
assert.Equal(t, tt.expected, got)
50+
})
51+
}
52+
}

0 commit comments

Comments
 (0)