wowsql-sdk 3.9.3 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 733ca78817394f358256715fd17bc810bb62d575cd3bac9a8371f6cd080dee3e
4
- data.tar.gz: f66dcf05b1d189946aec2a2d107572170e7d7aac62864176fa8675d59e01e9e9
3
+ metadata.gz: f82d49575289a354df9f59f3aad8c78f8bba8fd5e27f600e598e1fc6fa873bb4
4
+ data.tar.gz: 2b6674f1ddc575cc348e2c46ed7b9caadeccc3e902aa54f34b751d6b7c9f9773
5
5
  SHA512:
6
- metadata.gz: cb99407286c0edf67ce68faf420c7d2535eca07fc7d597c41d5064afeac5e7a8fb7f42848ea797b979fb83b09686a8714a24bd99f6a6bc7adfc99d5f001684f1
7
- data.tar.gz: 49c5a291fdacd15bccf7b17f0a4dfc7f639d32275605ec2e91a38e53e2df0b44e65290aedc6adcbf472b46ad83c603a8ffef71d70c551b3199b65ef9da9d1ca0
6
+ metadata.gz: deae84274b76b8881975b657de53a6841be12719ed04af9bc3aecf5c87b1e3ab4f87509ac6b1e7b8d9af54971ebcc5864bd9192bda8882eac502d7e962ba62d7
7
+ data.tar.gz: aa60076d325d857bc62781d5fde34b7edcfdf51705083360b348a07a491b634b0bf419dafb34d91c90f3d59fc59afda359f9be903954ccf91957449498b6a49e
data/CHANGELOG.md CHANGED
@@ -4,6 +4,18 @@ All notable changes to the WowSQL Ruby SDK will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [3.10.0] - 2026-10-18
9
+
10
+ ### Fixed
11
+ - Send `apikey` on database, auth, and storage calls (Bearer-only keys were 401 on project hosts).
12
+ - Session refresh uses `POST /refresh-token`.
13
+ - Storage public URLs use `/storage/v1/object/public/{bucket}/{path}`.
14
+ - Upload folder is the `folder` query parameter.
15
+ - Login replies with `requires_2fa` no longer store empty sessions.
16
+
17
+ ### Added
18
+ - TOTP 2FA: status, setup, enable, disable, recovery codes, and `verifyTwoFactorLogin`.
7
19
 
8
20
  ## [3.9.3] - 2026-10-10
9
21
 
data/lib/wowsql/auth.rb CHANGED
@@ -27,11 +27,7 @@ module WOWSQL
27
27
  end
28
28
 
29
29
  # Response for signup/login requests.
30
- AuthResponse = Struct.new(:session, :user, keyword_init: true) do
31
- def initialize(session:, user: nil)
32
- super
33
- end
34
- end
30
+ AuthResponse = Struct.new(:session, :user, :requires_2fa, :pending_token, :method, :email, keyword_init: true)
35
31
 
36
32
  # Interface for persisting tokens.
37
33
  module TokenStorage
@@ -115,6 +111,7 @@ module WOWSQL
115
111
  f.options.timeout = timeout
116
112
  end
117
113
 
114
+ @conn.headers['apikey'] = api_key
118
115
  @conn.headers['Authorization'] = "Bearer #{api_key}"
119
116
  @conn.headers['Content-Type'] = 'application/json'
120
117
  end
@@ -147,6 +144,14 @@ module WOWSQL
147
144
  payload = { email: email, password: password }
148
145
  payload[:captcha_token] = captcha_token if captcha_token && !captcha_token.to_s.empty?
149
146
  data = request('POST', '/login', nil, payload)
147
+ if data['requires_2fa']
148
+ return AuthResponse.new(
149
+ requires_2fa: true,
150
+ pending_token: data['pending_token'] || data['temp_token'],
151
+ method: data['method'],
152
+ email: data['email']
153
+ )
154
+ end
150
155
  session = persist_session(data)
151
156
  AuthResponse.new(session: session, user: nil)
152
157
  end
@@ -496,7 +501,45 @@ module WOWSQL
496
501
  }
497
502
  end
498
503
 
504
+ def verify_two_factor_login(pending_token, code: nil, backup_code: nil)
505
+ payload = { pending_token: pending_token, temp_token: pending_token }
506
+ payload[:code] = code if code
507
+ payload[:backup_code] = backup_code if backup_code
508
+ data = request('POST', '/2fa/verify-login', nil, payload)
509
+ session = persist_session(data)
510
+ AuthResponse.new(session: session)
511
+ end
512
+
513
+ def get_two_factor_status(access_token: nil)
514
+ token = access_token || @access_token || @storage.get_access_token
515
+ request_with_headers('GET', '/2fa/status', nil, nil, 'Authorization' => "Bearer #{token}")
516
+ end
517
+
518
+ def setup_totp(access_token: nil)
519
+ token = access_token || @access_token || @storage.get_access_token
520
+ request_with_headers('POST', '/2fa/setup-totp', nil, {}, 'Authorization' => "Bearer #{token}")
521
+ end
522
+
523
+ def enable_totp(code, access_token: nil)
524
+ token = access_token || @access_token || @storage.get_access_token
525
+ request_with_headers('POST', '/2fa/verify-and-enable', nil, { code: code, method: 'totp' }, 'Authorization' => "Bearer #{token}")
526
+ end
527
+
528
+ def disable_totp(code: nil, backup_code: nil, access_token: nil)
529
+ token = access_token || @access_token || @storage.get_access_token
530
+ payload = { method: 'totp' }
531
+ payload[:code] = code if code
532
+ payload[:backup_code] = backup_code if backup_code
533
+ request_with_headers('POST', '/2fa/disable', nil, payload, 'Authorization' => "Bearer #{token}")
534
+ end
535
+
536
+ def regenerate_recovery_codes(code, access_token: nil)
537
+ token = access_token || @access_token || @storage.get_access_token
538
+ request_with_headers('POST', '/2fa/recovery-codes', nil, { code: code, method: 'totp' }, 'Authorization' => "Bearer #{token}")
539
+ end
540
+
499
541
  def persist_session(data)
542
+ raise WOWSQLError.new('Invalid session response') unless data['access_token'] || data[:access_token]
500
543
  session = AuthSession.new(
501
544
  access_token: data['access_token'] || data[:access_token] || '',
502
545
  refresh_token: data['refresh_token'] || data[:refresh_token] || '',
data/lib/wowsql/client.rb CHANGED
@@ -55,6 +55,7 @@ module WOWSQL
55
55
  end
56
56
 
57
57
  @conn.headers['apikey'] = api_key
58
+ @conn.headers['Authorization'] = "Bearer #{api_key}"
58
59
  @conn.headers['Content-Type'] = 'application/json'
59
60
  end
60
61
 
data/lib/wowsql/schema.rb CHANGED
@@ -54,6 +54,7 @@ module WOWSQL
54
54
  f.options.timeout = timeout
55
55
  end
56
56
 
57
+ @conn.headers['apikey'] = service_key
57
58
  @conn.headers['Authorization'] = "Bearer #{service_key}"
58
59
  @conn.headers['Content-Type'] = 'application/json'
59
60
  end
@@ -140,6 +140,7 @@ module WOWSQL
140
140
  f.options.timeout = timeout
141
141
  end
142
142
 
143
+ @conn.headers['apikey'] = api_key
143
144
  @conn.headers['Authorization'] = "Bearer #{api_key}"
144
145
  end
145
146
 
@@ -318,7 +319,7 @@ module WOWSQL
318
319
  # @param file_path [String] File path within bucket
319
320
  # @return [String]
320
321
  def get_public_url(bucket_name, file_path)
321
- "#{@base_url}/api/v1/storage/projects/#{@project_slug}/files/#{bucket_name}/#{file_path}"
322
+ "#{@base_url}/storage/v1/object/public/#{bucket_name}/#{file_path}"
322
323
  end
323
324
 
324
325
  # Get storage statistics for the project.
@@ -1,4 +1,4 @@
1
1
  module WOWSQL
2
- VERSION = "3.9.3"
2
+ VERSION = "3.10.0"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wowsql-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.9.3
4
+ version: 3.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - WOWSQL Team