Skip to content

Commit 0683f93

Browse files
committed
bin/c-search: セキュリティとエラーハンドリングを改善
- require 'timeout' を追加(Timeout::Errorを使用しているため) - リダイレクト処理のバグを修正:リダイレクト先のsubdomainを正しく抽出 - APIレスポンスの検証を強化: - レスポンスがHashであることを確認 - groupsが存在することを確認 - group IDが取得できることを確認 - より堅牢なエラーハンドリングで予期しないAPIレスポンスに対応
1 parent 6b53ec8 commit 0683f93

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

bin/c-search

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ require 'connpass_api_v2'
44
require 'uri'
55
require 'net/http'
66
require 'json'
7+
require 'timeout'
78

89
if ENV['CONNPASS_API_KEY'].nil?
910
puts('CONNPASS_API_KEY が設定されていません')
@@ -74,9 +75,17 @@ def fetch_group_by_subdomain(subdomain, api_key, limit = 5)
7475
case res
7576
when Net::HTTPSuccess
7677
data = JSON.parse(res.body)
78+
return { success: false, message: "Invalid API response" } unless data.is_a?(Hash)
79+
7780
if data['results_returned'] && data['results_returned'] > 0
78-
group = data['groups'].first
79-
return { success: true, group_id: group['id'] }
81+
groups = data['groups']
82+
return { success: false, message: "Invalid API response: missing groups" } unless groups&.any?
83+
84+
group = groups.first
85+
group_id = group&.dig('id')
86+
return { success: false, message: "Invalid API response: missing group ID" } unless group_id
87+
88+
return { success: true, group_id: group_id }
8089
else
8190
return { success: false, message: "グループが見つかりませんでした (subdomain: #{subdomain})" }
8291
end
@@ -85,7 +94,10 @@ def fetch_group_by_subdomain(subdomain, api_key, limit = 5)
8594
if location
8695
# 新しいURIでリトライ
8796
new_uri = URI.join(uri, location)
88-
return fetch_group_by_subdomain(subdomain, api_key, limit - 1)
97+
# リダイレクト先のURIから新しいsubdomainを抽出
98+
new_subdomain = new_uri.host&.split('.')&.first
99+
return { success: false, message: "Invalid redirect URL" } unless new_subdomain
100+
return fetch_group_by_subdomain(new_subdomain, api_key, limit - 1)
89101
else
90102
return { success: false, message: "リダイレクト先が不明です" }
91103
end

0 commit comments

Comments
 (0)