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  }