github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/tests/system/lib/bitwarden.rb (about)

     1  class Bitwarden
     2    module Types
     3      LOGIN = 1
     4      SECURENOTE = 2
     5      CARD = 3
     6      IDENTITY = 4
     7    end
     8  
     9    @number = 0
    10  
    11    def self.next_number
    12      @number += 1
    13    end
    14  
    15    def initialize(inst)
    16      @inst = inst
    17      @dir = File.join Helpers.current_dir, "bw_#{Bitwarden.next_number}"
    18    end
    19  
    20    def exec(cmd, session = true)
    21      cmd = "#{cmd} --session '#{@session}'" if session
    22      result = `BITWARDENCLI_APPDATA_DIR='#{@dir}' bw #{cmd}`.chomp
    23      code = $?
    24      ap "Status code #{code} for bw #{cmd}" unless code.success?
    25      result
    26    end
    27  
    28    def login
    29      `mkdir -p #{@dir}`
    30      exec "config server http://#{@inst.domain}/bitwarden", false
    31      domain = @inst.domain.split(':')[0]
    32      @session = exec "login --raw me@#{domain} #{@inst.passphrase}", false
    33    end
    34  
    35    def logout
    36      exec "logout", false
    37    end
    38  
    39    def sync
    40      exec "sync"
    41    end
    42  
    43    def force_sync
    44      exec "sync -f"
    45    end
    46  
    47    def json_exec(cmd)
    48      JSON.parse exec(cmd), symbolize_names: true
    49    end
    50  
    51    def get(object, id)
    52      json_exec "get #{object} #{id}"
    53    end
    54  
    55    def template(id)
    56      get :template, id
    57    end
    58  
    59    def list(object)
    60      json_exec "list #{object}"
    61    end
    62  
    63    def items
    64      list :items
    65    end
    66  
    67    def folders
    68      list :folders
    69    end
    70  
    71    def organizations
    72      list :organizations
    73    end
    74  
    75    def collections
    76      list :collections
    77    end
    78  
    79    def capture(cmd, data, session = true)
    80      cmd = "#{cmd} --session '#{@session}'" if session
    81      env = { 'BITWARDENCLI_APPDATA_DIR' => @dir }
    82      out, err, status = Open3.capture3(env, "bw #{cmd}", stdin_data: data)
    83      unless status.success?
    84        ap "Status code #{status} for bw #{cmd}"
    85        ap "Stderr: #{err}"
    86      end
    87      out
    88    end
    89  
    90    def encode(data)
    91      Base64.encode64(data.to_json).chomp
    92    end
    93  
    94    def create(object, data, flags = "")
    95      capture "create #{flags} #{object}", encode(data)
    96    end
    97  
    98    def create_folder(name)
    99      create :folder, name: name
   100    end
   101  
   102    def create_item(data, org_id = nil)
   103      flags = "--organizationid #{org_id}" if org_id
   104      create :item, data, flags
   105    end
   106  
   107    def edit(object, id, data)
   108      capture "edit #{object} #{id}", encode(data)
   109    end
   110  
   111    def edit_folder(id, name)
   112      edit :folder, id, name: name
   113    end
   114  
   115    def edit_item(id, data)
   116      edit :item, id, data
   117    end
   118  
   119    def delete(object, id)
   120      exec "delete #{object} #{id} --permanent"
   121    end
   122  
   123    def delete_folder(id)
   124      delete :folder, id
   125    end
   126  
   127    def delete_item(id)
   128      delete :item, id
   129    end
   130  
   131    def share(item_id, org_id, coll_id)
   132      capture "share #{item_id} #{org_id}", encode([coll_id])
   133    end
   134  
   135    def fingerprint
   136      exec "get fingerprint me"
   137    end
   138  end