Account.initialize()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
1
# frozen_string_literal: true
2
3
require_relative '../mixin/entity'
4
require_relative 'policy'
5
require_relative 'public_key'
6
require_relative 'private_key'
7
require_relative 'privilege'
8
9
module AMA
10
  module Chef
11
    module User
12
      module Model
13
        # Depicts linux user account
14
        #
15
        # Private and public keys are stored in { owner => { owner keys } }
16
        # structure (grouped by effective owner).
17
        #
18
        # @!attribute id
19
        #   @return [Symbol]
20
        # @!attribute privileges
21
        #   @return [Hash{Symbol, Privilege}]
22
        # @!attribute public_keys
23
        #   @return [Hash{Symbol, Hash{Symbol, PublicKey}}]
24
        # @!attribute private_keys
25
        #   @return [Hash{Symbol, Hash{Symbol, PrivateKey}]
26
        # @!attribute policy
27
        #   @return [Symbol] :edit or :manage
28
        class Account
29
          include Mixin::Entity
30
31
          # rubocop:disable Metrics/LineLength
32
          attribute :id, Symbol
33
          attribute :privileges, [Hash, K: Symbol, V: Privilege], default: {}
34
          attribute :public_keys, [Hash, K: Symbol, V: [Hash, K: Symbol, V: PublicKey]], default: {}
35
          attribute :private_keys, [Hash, K: Symbol, V: [Hash, K: Symbol, V: PrivateKey]], default: {}
36
          attribute :policy, Policy, default: Policy::NONE
37
          # rubocop:enable Metrics/LineLength
38
39
          denormalizer_block do |input, type, context, &block|
40
            if input.is_a?(Hash) && [:id, 'id'].none? { |key| input.key?(key) }
41
              input[:id] = context.path.current.name
42
            end
43
            block.call(input, type, context)
44
          end
45
46
          def initialize(id = nil)
47
            @id = id
48
            @privileges = {}
49
            @public_keys = {}
50
            @private_keys = {}
51
            @policy = Policy::NONE
52
          end
53
54
          def policy=(policy)
55
            @policy = Policy.wrap(policy)
56
          end
57
58
          def public_keys!(client_id)
59
            public_keys[client_id] = {} unless public_keys.key?(client_id)
60
            public_keys[client_id]
61
          end
62
63
          def private_keys!(client_id)
64
            private_keys[client_id] = {} unless private_keys.key?(client_id)
65
            private_keys[client_id]
66
          end
67
68
          # rubocop:disable Metrics/AbcSize
69
          # @param [Account] other
70
          def merge(other)
71
            other.privileges.each do |type, privilege|
72
              privileges[type] = privilege unless privileges[type]
73
              privileges[type].options.merge!(privilege.options)
74
            end
75
            other.public_keys.each do |owner, keys|
76
              public_keys!(owner).merge!(keys)
77
            end
78
            other.private_keys.each do |owner, keys|
79
              private_keys!(owner).merge!(keys)
80
            end
81
            self.policy = [policy, other.policy].max
82
            self
83
          end
84
          # rubocop:enable Metrics/AbcSize
85
86
          def to_s
87
            "Account :#{id} { policy: :#{policy} }"
88
          end
89
        end
90
      end
91
    end
92
  end
93
end
94