github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/types/metadata.go (about) 1 package types 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strings" 7 ) 8 9 type Metadata struct { 10 rnge Range 11 ref string 12 isManaged bool 13 isDefault bool 14 isExplicit bool 15 isUnresolvable bool 16 parent *Metadata 17 internal interface{} 18 } 19 20 func (m Metadata) MarshalJSON() ([]byte, error) { 21 return json.Marshal(map[string]interface{}{ 22 "range": m.rnge, 23 "ref": m.ref, 24 "managed": m.isManaged, 25 "default": m.isDefault, 26 "explicit": m.isExplicit, 27 "unresolvable": m.isUnresolvable, 28 "parent": m.parent, 29 }) 30 } 31 32 func (m *Metadata) UnmarshalJSON(data []byte) error { 33 var keys map[string]interface{} 34 if err := json.Unmarshal(data, &keys); err != nil { 35 return err 36 } 37 if keys["range"] != nil { 38 raw, err := json.Marshal(keys["range"]) 39 if err != nil { 40 return err 41 } 42 var r Range 43 if err := json.Unmarshal(raw, &r); err != nil { 44 return err 45 } 46 m.rnge = r 47 } 48 if keys["ref"] != nil { 49 m.ref = keys["ref"].(string) 50 } 51 if keys["managed"] != nil { 52 m.isManaged = keys["managed"].(bool) 53 } 54 if keys["default"] != nil { 55 m.isDefault = keys["default"].(bool) 56 } 57 if keys["explicit"] != nil { 58 m.isExplicit = keys["explicit"].(bool) 59 } 60 if keys["unresolvable"] != nil { 61 m.isUnresolvable = keys["unresolvable"].(bool) 62 } 63 if keys["parent"] != nil { 64 if _, ok := keys["parent"].(map[string]interface{}); ok { 65 raw, err := json.Marshal(keys["parent"]) 66 if err != nil { 67 return err 68 } 69 var parent Metadata 70 if err := json.Unmarshal(raw, &parent); err != nil { 71 return err 72 } 73 m.parent = &parent 74 } 75 } 76 return nil 77 } 78 79 func (m *Metadata) ToRego() interface{} { 80 input := map[string]interface{}{ 81 "filepath": m.Range().GetLocalFilename(), 82 "startline": m.Range().GetStartLine(), 83 "endline": m.Range().GetEndLine(), 84 "sourceprefix": m.Range().GetSourcePrefix(), 85 "managed": m.isManaged, 86 "explicit": m.isExplicit, 87 "fskey": CreateFSKey(m.Range().GetFS()), 88 "resource": m.Reference(), 89 } 90 if m.parent != nil { 91 input["parent"] = m.parent.ToRego() 92 } 93 return input 94 } 95 96 func NewMetadata(r Range, ref string) Metadata { 97 return Metadata{ 98 rnge: r, 99 ref: ref, 100 isManaged: true, 101 } 102 } 103 104 func NewUnresolvableMetadata(r Range, ref string) Metadata { 105 unres := NewMetadata(r, ref) 106 unres.isUnresolvable = true 107 return unres 108 } 109 110 func NewExplicitMetadata(r Range, ref string) Metadata { 111 m := NewMetadata(r, ref) 112 m.isExplicit = true 113 return m 114 } 115 116 func (m Metadata) WithParent(p Metadata) Metadata { 117 m.parent = &p 118 return m 119 } 120 121 func (m *Metadata) SetParentPtr(p *Metadata) { 122 m.parent = p 123 } 124 125 func (m Metadata) Parent() *Metadata { 126 return m.parent 127 } 128 129 func (m Metadata) Root() Metadata { 130 meta := &m 131 for meta.Parent() != nil { 132 meta = meta.Parent() 133 } 134 return *meta 135 } 136 137 func (m Metadata) WithInternal(internal interface{}) Metadata { 138 m.internal = internal 139 return m 140 } 141 142 func (m Metadata) Internal() interface{} { 143 return m.internal 144 } 145 146 func (m Metadata) IsMultiLine() bool { 147 return m.rnge.GetStartLine() < m.rnge.GetEndLine() 148 } 149 150 func NewUnmanagedMetadata() Metadata { 151 m := NewMetadata(NewRange("", 0, 0, "", nil), "") 152 m.isManaged = false 153 return m 154 } 155 156 func NewTestMetadata() Metadata { 157 return NewMetadata(NewRange("test.test", 123, 123, "", nil), "") 158 } 159 160 func NewApiMetadata(provider string, parts ...string) Metadata { 161 return NewMetadata(NewRange(fmt.Sprintf("/%s/%s", provider, strings.Join(parts, "/")), 0, 0, "", nil), "") 162 } 163 164 func NewRemoteMetadata(id string) Metadata { 165 return NewMetadata(NewRange(id, 0, 0, "remote", nil), id) 166 } 167 168 func (m Metadata) IsDefault() bool { 169 return m.isDefault 170 } 171 172 func (m Metadata) IsResolvable() bool { 173 return !m.isUnresolvable 174 } 175 176 func (m Metadata) IsExplicit() bool { 177 return m.isExplicit 178 } 179 180 func (m Metadata) String() string { 181 return m.ref 182 } 183 184 func (m Metadata) Reference() string { 185 return m.ref 186 } 187 188 func (m Metadata) Range() Range { 189 return m.rnge 190 } 191 192 func (m Metadata) IsManaged() bool { 193 return m.isManaged 194 } 195 196 func (m Metadata) IsUnmanaged() bool { 197 return !m.isManaged 198 } 199 200 type BaseAttribute struct { 201 metadata Metadata 202 } 203 204 func (b BaseAttribute) GetMetadata() Metadata { 205 return b.metadata 206 } 207 208 func (m Metadata) GetMetadata() Metadata { 209 return m 210 } 211 212 func (m Metadata) GetRawValue() interface{} { 213 return nil 214 } 215 216 func (m *Metadata) SetReference(ref string) { 217 m.ref = ref 218 } 219 220 func (m *Metadata) SetRange(r Range) { 221 m.rnge = r 222 }