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