An unofficial, mostly Bitwarden-compatible API server written in Ruby (Sinatra and ActiveRecord)
1require_relative "spec_helper.rb"
2
3@access_token = nil
4
5describe "folder module" do
6 before do
7 User.all.delete_all
8
9 Rubywarden::Test::Factory.create_user
10 @access_token = Rubywarden::Test::Factory.login_user
11 end
12
13 it "should not allow access with bogus bearer token" do
14 post_json "/api/folders", {
15 :name => "2.d7MttWzJTSSKx1qXjHUxlQ==|01Ath5UqFZHk7csk5DVtkQ==|EMLoLREgCUP5Cu4HqIhcLqhiZHn+NsUDp8dAg1Xu0Io=",
16 }, {
17 "HTTP_AUTHORIZATION" => "Bearer #{@access_token.upcase}",
18 }
19
20 last_response.status.wont_equal 200
21 end
22
23 it "should allow creating, updating, and deleting folders" do
24 post_json "/api/folders", {
25 :name => "2.d7MttWzJTSSKx1qXjHUxlQ==|01Ath5UqFZHk7csk5DVtkQ==|EMLoLREgCUP5Cu4HqIhcLqhiZHn+NsUDp8dAg1Xu0Io=",
26 }, {
27 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
28 }
29
30 last_response.status.must_equal 200
31 uuid = last_json_response["Id"]
32 uuid.to_s.wont_equal ""
33
34 f = Folder.find_by_uuid(uuid)
35 f.wont_be_nil
36 f.uuid.must_equal uuid
37 f.name.must_equal "2.d7MttWzJTSSKx1qXjHUxlQ==|01Ath5UqFZHk7csk5DVtkQ==|EMLoLREgCUP5Cu4HqIhcLqhiZHn+NsUDp8dAg1Xu0Io="
38
39 # update
40
41 ik = Bitwarden.makeKey("asdf", "api@example.com",
42 User::DEFAULT_KDF_TYPE,
43 Bitwarden::KDF::DEFAULT_ITERATIONS[User::DEFAULT_KDF_TYPE])
44 new_name = Bitwarden.encrypt("some new name", ik).to_s
45
46 put_json "/api/folders/#{uuid}", {
47 :name => new_name,
48 }, {
49 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
50 }
51
52 last_response.status.must_equal 200
53 last_json_response["Id"].to_s.wont_equal ""
54
55 f = Folder.find_by_uuid(uuid)
56 f.name.must_equal new_name
57
58 # delete
59
60 delete_json "/api/folders/#{uuid}", {}, {
61 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
62 }
63 last_response.status.must_equal 200
64
65 Folder.find_by_uuid(uuid).must_be_nil
66 end
67
68 it "should not allow creating, updating, or deleting bogus ciphers" do
69 post_json "/api/folders", {
70 :name => "junk",
71 }, {
72 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
73 }
74
75 last_response.status.wont_equal 200
76
77 # create, then bogus update
78
79 post_json "/api/folders", {
80 :name => "2.d7MttWzJTSSKx1qXjHUxlQ==|01Ath5UqFZHk7csk5DVtkQ==|EMLoLREgCUP5Cu4HqIhcLqhiZHn+NsUDp8dAg1Xu0Io=",
81 }, {
82 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
83 }
84
85 last_response.status.must_equal 200
86 uuid = last_json_response["Id"]
87
88 put_json "/api/folders/#{uuid}", {
89 :name => "bogus",
90 }, {
91 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
92 }
93
94 last_response.status.wont_equal 200
95
96 # bogus delete
97
98 delete_json "/api/folders/something-bogus", {}, {
99 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
100 }
101 last_response.status.wont_equal 200
102 end
103
104 it "should show up in sync" do
105 n = "2.d7MttWzJTSSKx1qXjHUxlQ==|01Ath5UqFZHk7csk5DVtkQ==|EMLoLREgCUP5Cu4HqIhcLqhiZHn+NsUDp8dAg1Xu0Io="
106
107 post_json "/api/folders", {
108 :name => n,
109 }, {
110 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
111 }
112
113 last_response.status.must_equal 200
114 uuid = last_json_response["Id"]
115
116 get "/api/sync", {}, {
117 "HTTP_AUTHORIZATION" => "Bearer #{@access_token}",
118 }
119 last_response.status.must_equal 200
120
121 js = last_json_response
122 f = js["Folders"].select{|tf| tf["Id"] == uuid }.first
123 f.wont_be_nil
124
125 f["Name"].must_equal n
126 end
127end