Skip to content

Commit 930edbd

Browse files
committed
[rb] update virtual auth credential implementation to match conventions
1 parent 227137b commit 930edbd

File tree

4 files changed

+150
-146
lines changed

4 files changed

+150
-146
lines changed

rb/.rubocop.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ RSpec/Rails/AvoidSetupHook: # new in 2.4
358358
Style/EnvHome: # new in 1.29
359359
Enabled: true
360360
Layout/LineContinuationLeadingSpace: # new in 1.31
361-
Enabled: true
361+
Enabled: false
362362
Layout/LineContinuationSpacing: # new in 1.31
363363
Enabled: true
364364
Lint/ConstantOverwrittenInRescue: # new in 1.31

rb/lib/selenium/webdriver/common/virtual_authenticator/credential.rb

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -25,65 +25,59 @@
2525
module Selenium
2626
module WebDriver
2727
class Credential
28-
def initialize(id:, is_resident_credential:, rp_id:, user_handle:, private_key:, sign_count:)
28+
class << self
29+
def resident(**opts)
30+
Credential.new(resident_credential: true, **opts)
31+
end
32+
33+
def non_resident(**opts)
34+
Credential.new(resident_credential: false, **opts)
35+
end
36+
37+
def encode(byte_array)
38+
Base64.urlsafe_encode64(byte_array&.pack('C*'))
39+
end
40+
41+
def decode(base64)
42+
Base64.urlsafe_decode64(base64).unpack('C*')
43+
end
44+
45+
def from_json(opts)
46+
user_handle = opts['userHandle'] ? decode(opts['userHandle']) : nil
47+
new(id: decode(opts["credentialId"]),
48+
resident_credential: opts["isResidentCredential"],
49+
rp_id: opts['rpId'],
50+
private_key: opts['privateKey'],
51+
sign_count: opts['signCount'],
52+
user_handle: user_handle)
53+
end
54+
end
55+
56+
attr_reader :id, :resident_credential, :rp_id, :user_handle, :private_key, :sign_count
57+
alias_method :resident_credential?, :resident_credential
58+
59+
def initialize(id:, resident_credential:, rp_id:, private_key:, user_handle: nil, sign_count: 0)
2960
@id = id
30-
@is_resident_credential = is_resident_credential
61+
@resident_credential = resident_credential
3162
@rp_id = rp_id
3263
@user_handle = user_handle
3364
@private_key = private_key
3465
@sign_count = sign_count
3566
end
3667

37-
attr_reader :id, :is_resident_credential, :rp_id, :user_handle, :private_key, :sign_count
38-
39-
def self.create_resident_credential(id, rp_id, user_handle, private_key, sign_count)
40-
Credential.new(id: id, is_resident_credential: true, rp_id: rp_id, user_handle: user_handle,
41-
private_key: private_key, sign_count: sign_count)
42-
end
43-
44-
def self.create_non_resident_credential(id, rp_id, private_key, sign_count)
45-
Credential.new(id: id, is_resident_credential: false, rp_id: rp_id, user_handle: nil,
46-
private_key: private_key, sign_count: sign_count)
47-
end
48-
4968
#
5069
# @api private
5170
#
5271

5372
def as_json(*)
54-
credential_data = {
55-
credentialId: Base64.urlsafe_encode64(@id&.pack('C*')),
56-
isResidentCredential: @is_resident_credential,
57-
rpId: @rp_id,
58-
privateKey: Base64.urlsafe_encode64(@private_key),
59-
signCount: @sign_count
60-
}
61-
62-
credential_data[:userHandle] = Base64.urlsafe_encode64(@user_handle&.pack('C*')) unless user_handle.nil?
73+
credential_data = {'credentialId' => Credential.encode(id),
74+
'isResidentCredential' => resident_credential?,
75+
'rpId' => rp_id,
76+
'privateKey' => Credential.encode(private_key),
77+
'signCount' => sign_count}
78+
credential_data['userHandle'] = Credential.encode(user_handle) if user_handle
6379
credential_data
6480
end
65-
66-
#
67-
# @api private
68-
#
69-
70-
def self.from_json(data)
71-
id = Base64.urlsafe_decode64(data["credentialId"]).unpack('C*')
72-
is_resident_credential = data["isResidentCredential"]
73-
rp_id = data['rpId']
74-
private_key = Base64.urlsafe_decode64(data["privateKey"])
75-
sign_count = data['signCount']
76-
user_handle = (Base64.urlsafe_decode64(data["userHandle"]).unpack('C*') if data.key?("userHandle"))
77-
78-
Credential.new(
79-
id: id,
80-
is_resident_credential: is_resident_credential,
81-
rp_id: rp_id,
82-
user_handle: user_handle,
83-
private_key: private_key,
84-
sign_count: sign_count
85-
)
86-
end
8781
end # Credential
8882
end # WebDriver
8983
end # Selenium

rb/spec/integration/selenium/webdriver/virtual_authenticator_spec.rb

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,11 @@ def extract_id_from(response)
142142
# Add a non-resident credential using the testing API.
143143
#
144144
@authenticator = create_rk_disabled_ctap2_authenticator
145-
credential = Credential.create_non_resident_credential(
146-
[1, 2, 3, 4],
147-
'localhost',
148-
Base64.urlsafe_decode64(base64_encoded_pk),
149-
0
145+
credential = Credential.non_resident(
146+
id: [1, 2, 3, 4],
147+
rp_id: 'localhost',
148+
private_key: Credential.decode(base64_encoded_pk),
149+
sign_count: 0
150150
)
151151

152152
@authenticator.add_credential(credential)
@@ -160,15 +160,15 @@ def extract_id_from(response)
160160
it 'should test add non-resident credential when authenticator uses U2F protocol' do
161161
@authenticator = create_rk_disabled_u2f_authenticator
162162
base64_enc_pk =
163-
"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8_zMDQDYAxlU-Q"\
164-
"hk1Dwkf0v18GZca1DMF3SaJ9HPdmShRANCAASNYX5lyVCOZLzFZzrIKmeZ2jwU"\
163+
"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8_zMDQDYAxlU-Q" \
164+
"hk1Dwkf0v18GZca1DMF3SaJ9HPdmShRANCAASNYX5lyVCOZLzFZzrIKmeZ2jwU" \
165165
"RmgsJYxGP__fWN_S-j5sN4tT15XEpN_7QZnt14YvI6uvAgO0uJEboFaZlOEB"
166166

167-
credential = Credential.create_non_resident_credential(
168-
[1, 2, 3, 4],
169-
'localhost',
170-
Base64.urlsafe_decode64(base64_enc_pk),
171-
0
167+
credential = Credential.non_resident(
168+
id: [1, 2, 3, 4],
169+
rp_id: 'localhost',
170+
private_key: Credential.decode(base64_enc_pk),
171+
sign_count: 0
172172
)
173173
@authenticator.add_credential(credential)
174174
response = get_assertion_for([1, 2, 3, 4])
@@ -177,12 +177,12 @@ def extract_id_from(response)
177177

178178
it 'should test add resident credential' do
179179
@authenticator = create_rk_enabled_ctap2_authenticator
180-
credential = Credential.create_resident_credential(
181-
[1, 2, 3, 4],
182-
'localhost',
183-
[1],
184-
Base64.urlsafe_decode64(base64_encoded_pk),
185-
0
180+
credential = Credential.resident(
181+
id: [1, 2, 3, 4],
182+
rp_id: 'localhost',
183+
user_handle: [1],
184+
private_key: Credential.decode(base64_encoded_pk),
185+
sign_count: 0
186186
)
187187
@authenticator.add_credential(credential)
188188
#
@@ -198,16 +198,16 @@ def extract_id_from(response)
198198
it 'should test add resident credential not supported when authenticator uses U2F protocol' do
199199
@authenticator = create_rk_enabled_u2f_authenticator
200200
base64_enc_pk =
201-
"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8_zMDQDYAxlU-Q"\
202-
"hk1Dwkf0v18GZca1DMF3SaJ9HPdmShRANCAASNYX5lyVCOZLzFZzrIKmeZ2jwU"\
201+
"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg8_zMDQDYAxlU-Q" \
202+
"hk1Dwkf0v18GZca1DMF3SaJ9HPdmShRANCAASNYX5lyVCOZLzFZzrIKmeZ2jwU" \
203203
"RmgsJYxGP__fWN_S-j5sN4tT15XEpN_7QZnt14YvI6uvAgO0uJEboFaZlOEB"
204204

205-
credential = Credential.create_resident_credential(
206-
[1, 2, 3, 4],
207-
'localhost',
208-
[1],
209-
Base64.urlsafe_decode64(base64_enc_pk),
210-
0
205+
credential = Credential.resident(
206+
id: [1, 2, 3, 4],
207+
rp_id: 'localhost',
208+
user_handle: [1],
209+
private_key: Credential.decode(base64_enc_pk),
210+
sign_count: 0
211211
)
212212

213213
#
@@ -266,13 +266,13 @@ def extract_id_from(response)
266266
end
267267
end
268268

269-
expect(credential1.is_resident_credential).to eq(true)
269+
expect(credential1.resident_credential?).to eq(true)
270270
expect(credential1.private_key).not_to eq(nil)
271271
expect(credential1.rp_id).to eq('localhost')
272272
expect(credential1.user_handle).to eq([1])
273273
expect(credential1.sign_count).to eq(1)
274274

275-
expect(credential2.is_resident_credential).to eq(false)
275+
expect(credential2.resident_credential?).to eq(false)
276276
expect(credential2.private_key).not_to eq(nil)
277277
#
278278
# Non resident keys do not store raw RP IDs or user handles.
@@ -341,7 +341,7 @@ def extract_id_from(response)
341341
#
342342

343343
response = driver.execute_async_script(
344-
"getCredential([{"\
344+
"getCredential([{" \
345345
" \"type\": \"public-key\"," \
346346
" \"id\": Int8Array.from(arguments[0])," \
347347
"}, {" \
@@ -362,7 +362,7 @@ def extract_id_from(response)
362362
#
363363

364364
response = driver.execute_async_script(
365-
"registerCredential({authenticatorSelection: {userVerification: 'required'}})"\
365+
"registerCredential({authenticatorSelection: {userVerification: 'required'}})" \
366366
" .then(arguments[arguments.length - 1]);"
367367
)
368368
expect(response['status']).to eq('OK')

0 commit comments

Comments
 (0)