mobile-subscriber 1.0.0.alpha4 → 1.0.0.alpha5
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 +4 -4
- data/lib/mobile-subscriber.rb +13 -3
- data/lib/mobile_subscriber/dictionaries/dialing_and_country_codes.rb +468 -28
- data/lib/mobile_subscriber/http/known_imsi_headers.rb +22 -0
- data/lib/mobile_subscriber/http/known_msisdn_headers.rb +68 -0
- data/lib/mobile_subscriber/http/request_info.rb +166 -0
- data/lib/mobile_subscriber/identity.rb +97 -1
- data/lib/mobile_subscriber/version.rb +1 -1
- data/mobile_subscriber.thor +41 -0
- data/spec/factories/mobile_requests.rb +28 -0
- data/spec/factories/mobile_requests_from_claro.rb +257 -0
- data/spec/factories/mobile_requests_from_iusacell.rb +13 -0
- data/spec/factories/mobile_requests_from_movistar.rb +15 -0
- data/spec/factories/mobile_requests_from_telcel.rb +14 -0
- data/spec/factories/mobile_requests_from_vivo.rb +13 -0
- data/spec/features/claro_user_detection_spec.rb +170 -0
- data/spec/features/iusacell_user_detection_spec.rb +19 -0
- data/spec/features/movistar_user_detection_spec.rb +19 -0
- data/spec/features/telcel_user_detection_spec.rb +19 -0
- data/spec/models/{isdn_spec.rb → identity_spec.rb} +5 -5
- data/spec/shared_examples/identity_detection_in_argentina.rb +11 -0
- data/spec/shared_examples/identity_detection_in_brazil.rb +12 -0
- data/spec/shared_examples/identity_detection_in_chile.rb +12 -0
- data/spec/shared_examples/identity_detection_in_colombia.rb +12 -0
- data/spec/shared_examples/identity_detection_in_costa_rica.rb +15 -0
- data/spec/shared_examples/identity_detection_in_dominican_republic.rb +12 -0
- data/spec/shared_examples/identity_detection_in_ecuador.rb +12 -0
- data/spec/shared_examples/identity_detection_in_el_salvador.rb +15 -0
- data/spec/shared_examples/identity_detection_in_guatemala.rb +15 -0
- data/spec/shared_examples/identity_detection_in_honduras.rb +11 -0
- data/spec/shared_examples/identity_detection_in_mexico.rb +11 -0
- data/spec/shared_examples/identity_detection_in_nicaragua.rb +12 -0
- data/spec/shared_examples/identity_detection_in_panama.rb +12 -0
- data/spec/shared_examples/identity_detection_in_peru.rb +12 -0
- data/spec/shared_examples/identity_detection_in_puerto_rico.rb +14 -0
- data/spec/shared_examples/of_msisdn_detection_from_http_request.rb +3 -188
- data/templates/dialing_and_country_codes.rb.erb +20 -0
- metadata +58 -28
- data/lib/mobile_subscriber/detection/from_msisdn_http_request_header.rb +0 -48
- data/lib/mobile_subscriber/detection/from_x_nokia_msisdn_http_request_header.rb +0 -58
- data/lib/mobile_subscriber/detection/from_x_up_calling_line_id_http_request_header.rb +0 -65
- data/lib/mobile_subscriber/detection/from_x_up_ch_msisdn_http_request_header.rb +0 -35
- data/lib/mobile_subscriber/detection/from_x_up_subno_http_request_header.rb +0 -44
- data/lib/mobile_subscriber/detection/from_x_wap_msisdn_http_request_header.rb +0 -37
- data/lib/mobile_subscriber/detection/from_x_wap_sesiones3g_mdn_http_request_header.rb +0 -39
- data/lib/mobile_subscriber/detection/from_x_ztgo_beareraddress_http_request_header.rb +0 -36
- data/lib/mobile_subscriber/detection/http_request_info.rb +0 -77
- data/lib/mobile_subscriber/isdn.rb +0 -89
- data/spec/detection/from_msisdn_http_request_header_spec.rb +0 -53
- data/spec/detection/from_x_nokia_msisdn_http_request_header_spec.rb +0 -99
- data/spec/detection/from_x_up_calling_line_id_http_request_header_spec.rb +0 -39
- data/spec/detection/from_x_up_subno_http_request_header_spec.rb +0 -43
- data/spec/detection/from_x_wap_msisdn_http_request_header_spec.rb +0 -32
- data/spec/detection/from_x_wap_sesiones3g_mdn_http_request_header_spec.rb +0 -29
- data/spec/factories/requests.rb +0 -229
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
2
|
-
|
3
|
-
module MobileSubscriber::Detection
|
4
|
-
|
5
|
-
# Módulo que provee métodos de deteccion y validacion para MSISDN's de:
|
6
|
-
# - Telcel México
|
7
|
-
# - Claro Argentina
|
8
|
-
# - Claro Costa Rica
|
9
|
-
# - Claro Puerto Rico
|
10
|
-
# - Claro Guatemala
|
11
|
-
# - Claro Honduras
|
12
|
-
# - Claro Nicaragua
|
13
|
-
# - Claro El Salvador
|
14
|
-
module FromXNokiaMsisdnHttpRequestHeader
|
15
|
-
|
16
|
-
def extract_from_x_nokia_msisdn_http_request_header(http_request_info)
|
17
|
-
if msisdn = http_request_info.headers['X-Nokia-Msisdn'] and msisdn.length >= 8
|
18
|
-
|
19
|
-
country_code = (
|
20
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,2]] ||
|
21
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,3]] || # Dominican 3-digit needed
|
22
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,1]] # Puerto Rico 1-digit country code of "1"
|
23
|
-
)
|
24
|
-
|
25
|
-
# Determine the Network Operator tuple (MCC + MNC):
|
26
|
-
# TODO: Validate IP ranges, additional headers, etc.
|
27
|
-
network_id_tuple = case country_code
|
28
|
-
when 'PR' # Claro Puerto Rico:
|
29
|
-
{ mcc: "330", mnc: "110" }
|
30
|
-
when 'MX' # Telcel México:
|
31
|
-
{ mcc: "334", mnc: "020" }
|
32
|
-
when 'GT' # Claro Guatemala:
|
33
|
-
{ mcc: "704", mnc: "01" }
|
34
|
-
when 'SV' # Claro El Salvador:
|
35
|
-
{ mcc: "706", mnc: "01" }
|
36
|
-
when 'HN' # Claro Honduras:
|
37
|
-
{ mcc: "708", mnc: "001" }
|
38
|
-
when 'NI' # Claro Nicaragua:
|
39
|
-
{ mcc: "710", mnc: "21" }
|
40
|
-
when 'CR' # Claro Costa Rica
|
41
|
-
{ mcc: "712", mnc: "03" }
|
42
|
-
when 'AR' # Claro Argentina:
|
43
|
-
{ mcc: "722", mnc: "330" }
|
44
|
-
end
|
45
|
-
|
46
|
-
# Return only if we identified the network:
|
47
|
-
if network_id_tuple.present?
|
48
|
-
{
|
49
|
-
id: msisdn,
|
50
|
-
mobile_country_code: network_id_tuple[:mcc],
|
51
|
-
mobile_network_code: network_id_tuple[:mnc],
|
52
|
-
http_request_info: http_request_info
|
53
|
-
}
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
2
|
-
|
3
|
-
module MobileSubscriber::Detection
|
4
|
-
|
5
|
-
# Módulo que provee métodos de deteccion y validacion para MSISDN por el
|
6
|
-
# header de HTTP 'X-Up-Calling-Line-Id':
|
7
|
-
# - Claro Perú
|
8
|
-
# - TIM (Telecom Italia Mobile) Brasil
|
9
|
-
# - OI Brasil
|
10
|
-
# - Movistar México
|
11
|
-
# - Movistar Argentina
|
12
|
-
# - Movistar Perú
|
13
|
-
module FromXUpCallingLineIdHttpRequestHeader
|
14
|
-
|
15
|
-
def extract_from_x_up_calling_line_id_http_request_header(http_request_info)
|
16
|
-
if msisdn = http_request_info.headers['X-Up-Calling-Line-Id'] and msisdn.length >= 8
|
17
|
-
|
18
|
-
country_code = (
|
19
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,2]] ||
|
20
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,3]]
|
21
|
-
)
|
22
|
-
|
23
|
-
# Determine the Network Operator tuple (MCC + MNC):
|
24
|
-
# TODO: Validate IP ranges, additional headers, etc.
|
25
|
-
network_id_tuple = case country_code
|
26
|
-
when 'PE'
|
27
|
-
# Claro Perú includes the "X-Nokia-Imsi" header...
|
28
|
-
imsi = http_request_info.headers['X-Nokia-Imsi']
|
29
|
-
if imsi.present?
|
30
|
-
# Claro Peru: (IP's 190.113.x)
|
31
|
-
{ mcc: "716", mnc: "10" } if imsi.start_with?('71610')
|
32
|
-
else
|
33
|
-
# Movistar Peru: (IP's 190.238.x)
|
34
|
-
{ mcc: "716", mnc: "06" }
|
35
|
-
end
|
36
|
-
when 'BR'
|
37
|
-
if x_msp_apn_header = request.env["X-Msp-Apn"] and x_msp_apn_header.present?
|
38
|
-
if http_request_x_msp_apn_header =~ /OI/i
|
39
|
-
# Oi Brazil:
|
40
|
-
{ mcc: "724", mnc: "30" }
|
41
|
-
else
|
42
|
-
# TIM Brazil:
|
43
|
-
{ mcc: "724", mnc: "02" }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
when 'MX' # Movistar Mexico:
|
47
|
-
{ mcc: "334", mnc: "030" }
|
48
|
-
when 'AR' # Movistar Argentina:
|
49
|
-
# TODO: Determine (if possible) the MNC (010 or 070)
|
50
|
-
{ mcc: "722", mnc: "010" }
|
51
|
-
end
|
52
|
-
|
53
|
-
# Return only if we identified the network:
|
54
|
-
if network_id_tuple.present?
|
55
|
-
{
|
56
|
-
id: msisdn,
|
57
|
-
mobile_country_code: network_id_tuple[:mcc],
|
58
|
-
mobile_network_code: network_id_tuple[:mnc],
|
59
|
-
http_request_info: http_request_info
|
60
|
-
}
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
2
|
-
module MobileSubscriber::Detection
|
3
|
-
# Módulo que provee métodos de deteccion y validacion para MSISDN's de:
|
4
|
-
# - Vivo Brasil
|
5
|
-
module FromXUpChMsisdnHttpRequestHeader
|
6
|
-
|
7
|
-
def extract_from_x_up_ch_msisdn_http_request_header(http_request_info)
|
8
|
-
if msisdn = http_request_info.headers['X-Up-Ch-Msisdn'] and msisdn.length >= 8
|
9
|
-
|
10
|
-
country_code = (
|
11
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,2]] ||
|
12
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,3]]
|
13
|
-
)
|
14
|
-
|
15
|
-
# Determine the Network Operator tuple (MCC + MNC):
|
16
|
-
# TODO: Validate IP ranges, additional headers, etc.
|
17
|
-
network_id_tuple = case country_code
|
18
|
-
when 'BR' # Vivo Brazil:
|
19
|
-
# TODO: Determine (if possible) the MNC (06, 10, 11, 23)
|
20
|
-
{ mcc: "724", mnc: "06" }
|
21
|
-
end
|
22
|
-
|
23
|
-
# Return only if we identified the network:
|
24
|
-
if network_id_tuple.present?
|
25
|
-
{
|
26
|
-
id: msisdn,
|
27
|
-
mobile_country_code: network_id_tuple[:mcc],
|
28
|
-
mobile_network_code: network_id_tuple[:mnc],
|
29
|
-
http_request_info: http_request_info
|
30
|
-
}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
2
|
-
|
3
|
-
module MobileSubscriber::Detection
|
4
|
-
# Módulo que provee métodos de deteccion y validacion para MSISDN por el
|
5
|
-
# header de HTTP 'X-Up-Subno':
|
6
|
-
# - Claro Colombia
|
7
|
-
# - Claro Panamá
|
8
|
-
# - Comcel Colombia
|
9
|
-
module FromXUpSubnoHttpRequestHeader
|
10
|
-
|
11
|
-
def extract_from_x_up_subno_http_request_header(http_request_info)
|
12
|
-
if msisdn = http_request_info.headers['X-Up-Subno'] and msisdn.length >= 8
|
13
|
-
|
14
|
-
country_code = (
|
15
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,2]] ||
|
16
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,3]]
|
17
|
-
)
|
18
|
-
|
19
|
-
# Determine the Network Operator tuple (MCC + MNC):
|
20
|
-
# TODO: Validate IP ranges, additional headers, etc.
|
21
|
-
network_id_tuple = case country_code
|
22
|
-
when 'CO'
|
23
|
-
# TODO: Discernir por ip/hostname
|
24
|
-
#{ mcc: "732", mnc: "101" } # Comcel Colombia
|
25
|
-
|
26
|
-
# Claro Colombia
|
27
|
-
{ mcc: "732", mnc: "101" }
|
28
|
-
when 'PA' # Claro Panamá:
|
29
|
-
{ mcc: "714", mnc: "03" }
|
30
|
-
end
|
31
|
-
|
32
|
-
# Return only if we identified the network:
|
33
|
-
if network_id_tuple.present?
|
34
|
-
{
|
35
|
-
id: msisdn,
|
36
|
-
mobile_country_code: network_id_tuple[:mcc],
|
37
|
-
mobile_network_code: network_id_tuple[:mnc],
|
38
|
-
http_request_info: http_request_info
|
39
|
-
}
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
2
|
-
|
3
|
-
module MobileSubscriber::Detection
|
4
|
-
|
5
|
-
# Módulo que provee métodos de detección y validacion para MSISDN por el
|
6
|
-
# header de HTTP 'X-Wap-Msisdn':
|
7
|
-
# - Claro Chile
|
8
|
-
module FromXWapMsisdnHttpRequestHeader
|
9
|
-
|
10
|
-
def extract_from_x_wap_msisdn_http_request_header(http_request_info)
|
11
|
-
if msisdn = http_request_info.headers['X-Wap-Msisdn'] and msisdn.length >= 8
|
12
|
-
|
13
|
-
country_code = (
|
14
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,2]] ||
|
15
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,3]]
|
16
|
-
)
|
17
|
-
|
18
|
-
# Determine the Network Operator tuple (MCC + MNC):
|
19
|
-
# TODO: Validate IP ranges, additional headers, etc.
|
20
|
-
network_id_tuple = case country_code
|
21
|
-
when 'CL' # Claro Chile
|
22
|
-
{ mcc: "730", mnc: "03" }
|
23
|
-
end
|
24
|
-
|
25
|
-
# Return only if we identified the network:
|
26
|
-
if network_id_tuple.present?
|
27
|
-
{
|
28
|
-
id: msisdn,
|
29
|
-
mobile_country_code: network_id_tuple[:mcc],
|
30
|
-
mobile_network_code: network_id_tuple[:mnc],
|
31
|
-
http_request_info: http_request_info
|
32
|
-
}
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
2
|
-
|
3
|
-
module MobileSubscriber::Detection
|
4
|
-
# Módulo que provee métodos de detección y validacion para MSISDN por el
|
5
|
-
# header de HTTP 'X-Wap-Sesiones3g-Mdn':
|
6
|
-
# - Iusacell
|
7
|
-
module FromXWapSesiones3gMdnHttpRequestHeader
|
8
|
-
|
9
|
-
def extract_from_x_wap_sesiones3g_mdn_http_request_header(http_request_info)
|
10
|
-
if msisdn = http_request_info.headers['X-Wap-Sesiones3g-Mdn'] and msisdn.length >= 8
|
11
|
-
|
12
|
-
country_code = (
|
13
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,2]] ||
|
14
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,3]]
|
15
|
-
)
|
16
|
-
|
17
|
-
# Determine the Network Operator tuple (MCC + MNC):
|
18
|
-
# TODO: Validate IP ranges, additional headers, etc.
|
19
|
-
network_id_tuple = case country_code
|
20
|
-
when 'MX' # Iusacell Mexico:
|
21
|
-
# TODO: Determine (if possible) the MNC:
|
22
|
-
# - MNC "040": Iusacell/Unefon
|
23
|
-
# - MNC "050": Iusacell
|
24
|
-
{ mcc: "334", mnc: "040" }
|
25
|
-
end
|
26
|
-
|
27
|
-
# Return only if we identified the network:
|
28
|
-
if network_id_tuple.present?
|
29
|
-
{
|
30
|
-
id: msisdn,
|
31
|
-
mobile_country_code: network_id_tuple[:mcc],
|
32
|
-
mobile_network_code: network_id_tuple[:mnc],
|
33
|
-
http_request_info: http_request_info
|
34
|
-
}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
2
|
-
|
3
|
-
module MobileSubscriber::Detection
|
4
|
-
# Módulo que provee métodos de detección y validacion para MSISDN por el
|
5
|
-
# header de HTTP 'X-Ztgo-Beareraddress':
|
6
|
-
# - Movistar Ecuador
|
7
|
-
module FromXZtgoBeareraddressHttpRequestHeader
|
8
|
-
|
9
|
-
def extract_from_x_ztgo_beareraddress_http_request_header(http_request_info)
|
10
|
-
if msisdn = http_request_info.headers['X-Ztgo-Beareraddress'] and msisdn.length >= 8
|
11
|
-
|
12
|
-
country_code = (
|
13
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,2]] ||
|
14
|
-
MobileSubscriber::DIALING_COUNTRY_CODES[msisdn[0,3]]
|
15
|
-
)
|
16
|
-
|
17
|
-
# Determine the Network Operator tuple (MCC + MNC):
|
18
|
-
# TODO: Validate IP ranges, additional headers, etc.
|
19
|
-
network_id_tuple = case country_code
|
20
|
-
when 'EC' # Movistar Ecuador:
|
21
|
-
{ mcc: "740", mnc: "00" }
|
22
|
-
end
|
23
|
-
|
24
|
-
# Return only if we identified the network:
|
25
|
-
if network_id_tuple.present?
|
26
|
-
{
|
27
|
-
id: msisdn,
|
28
|
-
mobile_country_code: network_id_tuple[:mcc],
|
29
|
-
mobile_network_code: network_id_tuple[:mnc],
|
30
|
-
http_request_info: http_request_info
|
31
|
-
}
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
module MobileSubscriber::Detection
|
2
|
-
class HttpRequestInfo
|
3
|
-
attr_reader :remote_ip, :headers
|
4
|
-
|
5
|
-
def initialize(env)
|
6
|
-
|
7
|
-
@remote_ip = env['REMOTE_ADDR']
|
8
|
-
|
9
|
-
# Reference Links:
|
10
|
-
# - http://www.slideshare.net/DefCamp/mobile-networks-exploiting-http-headers-and-data-traffic
|
11
|
-
# - http://www.mulliner.org/collin/academic/publications/mobile_web_privacy_icin10_mulliner.pdf
|
12
|
-
@headers = [
|
13
|
-
# HTTP Headers that contain important request details for validation
|
14
|
-
'Max-Forwards', # Para validar el número de forwards que el cliente permite... muy pobre..
|
15
|
-
'Via',
|
16
|
-
'X-Forwarded-For', # lista de IP's que originaron la petición, en caso de pasar por proxies:
|
17
|
-
|
18
|
-
# HTTP headers that contain the MSISDN:
|
19
|
-
# http://www.mulliner.org/collin/academic/publications/mobile_web_privacy_icin10_mulliner.pdf
|
20
|
-
'Cookie',
|
21
|
-
'Igcli',
|
22
|
-
'Msisdn',
|
23
|
-
'Rapmin',
|
24
|
-
'X-Fh-Msisdn',
|
25
|
-
"X-H3-G-Msisdn",
|
26
|
-
'X-Hts-Clid',
|
27
|
-
'X-Jinny-Cid',
|
28
|
-
'X-Msisdn',
|
29
|
-
'X-Msp-Clid',
|
30
|
-
'X-Msp-Msisdn',
|
31
|
-
'X-Network-Info',
|
32
|
-
'X-Nokia-Imsi', # This is a VERY useful one... if you have it!
|
33
|
-
'X-Nokia-Msisdn',
|
34
|
-
'X-Nx-Clid',
|
35
|
-
'X-Orange-Cli',
|
36
|
-
'X-Up-Calling-Line',
|
37
|
-
'X-Up-Calling-Line-Id', # Not in referenced literature
|
38
|
-
'X-Up-Ch-Msisdn', # Not in referenced literature
|
39
|
-
'X-Up-Lsid',
|
40
|
-
'X-Up-Subno', # Not in referenced literature
|
41
|
-
'X-Wap-Fh-Subscriber-Info',
|
42
|
-
'X-Wap-Msisdn',
|
43
|
-
'X-Wap-Sesiones3g-Mdn', # Not in referenced literature
|
44
|
-
'X-Wsb-Cli',
|
45
|
-
'X-Ztgo-Beareraddress', # Not in referenced literature
|
46
|
-
|
47
|
-
# Headers that contain bearer information:
|
48
|
-
# http://www.mulliner.org/collin/academic/publications/mobile_web_privacy_icin10_mulliner.pdf
|
49
|
-
'Bearer',
|
50
|
-
'Bearer-Indication',
|
51
|
-
'New-Bearer-Header',
|
52
|
-
'Nokia-Bearer',
|
53
|
-
'X-Nokia-Bearer',
|
54
|
-
'X-Nokia-Musicshop-Bearer',
|
55
|
-
'X-Up-Bear-Type', # NOT A TYPO
|
56
|
-
'X-Up-Bearer-Type',
|
57
|
-
'X-Bearer-Type',
|
58
|
-
|
59
|
-
# Headers that contain roaming information:
|
60
|
-
# http://www.mulliner.org/collin/academic/publications/mobile_web_privacy_icin10_mulliner.pdf
|
61
|
-
'X-Orange-Roaming',
|
62
|
-
'X-Nokia-Roaming',
|
63
|
-
'X-Roaming',
|
64
|
-
'X-Sdp-Roaming'
|
65
|
-
].inject({}.with_indifferent_access) do |collected_headers, header_name|
|
66
|
-
header_env_key = "HTTP_#{header_name.gsub('-','_').upcase}"
|
67
|
-
|
68
|
-
if env.has_key? header_env_key
|
69
|
-
collected_headers[header_name] = env[header_env_key].strip
|
70
|
-
end
|
71
|
-
|
72
|
-
collected_headers
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'mobile_subscriber/dictionaries/mobile_and_iso_country_codes'
|
2
|
-
require 'mobile_subscriber/dictionaries/dialing_and_country_codes'
|
3
|
-
require 'mobile_subscriber/dictionaries/operator_data'
|
4
|
-
|
5
|
-
module MobileSubscriber
|
6
|
-
|
7
|
-
class ISDN
|
8
|
-
|
9
|
-
attr_reader :id, :mobile_country_code, :mobile_network_code, :http_request_info
|
10
|
-
alias_method :to_s, :id
|
11
|
-
|
12
|
-
extend MobileSubscriber::Detection::FromMsisdnHttpRequestHeader
|
13
|
-
extend MobileSubscriber::Detection::FromXNokiaMsisdnHttpRequestHeader
|
14
|
-
extend MobileSubscriber::Detection::FromXUpCallingLineIdHttpRequestHeader
|
15
|
-
extend MobileSubscriber::Detection::FromXUpChMsisdnHttpRequestHeader
|
16
|
-
extend MobileSubscriber::Detection::FromXUpSubnoHttpRequestHeader
|
17
|
-
extend MobileSubscriber::Detection::FromXWapMsisdnHttpRequestHeader
|
18
|
-
extend MobileSubscriber::Detection::FromXWapSesiones3gMdnHttpRequestHeader
|
19
|
-
extend MobileSubscriber::Detection::FromXZtgoBeareraddressHttpRequestHeader
|
20
|
-
|
21
|
-
def initialize(attributes={})
|
22
|
-
@id = attributes.delete :id
|
23
|
-
@mobile_country_code = attributes.delete :mobile_country_code
|
24
|
-
@mobile_network_code = attributes.delete :mobile_network_code
|
25
|
-
@http_request_info = attributes.delete :http_request_info
|
26
|
-
end
|
27
|
-
|
28
|
-
def dialing_code
|
29
|
-
self.id[0,2]
|
30
|
-
end
|
31
|
-
alias_method :country_dialing_code, :dialing_code
|
32
|
-
|
33
|
-
def iso_3166_country_code
|
34
|
-
if self.mobile_country_code.present?
|
35
|
-
MobileSubscriber::MCC_ISO_COUNTRY_CODES[self.mobile_country_code]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def mobile_network_brand
|
40
|
-
if self.mobile_country_code.present? && self.mobile_network_code.present?
|
41
|
-
key = [self.mobile_country_code, self.mobile_network_code]
|
42
|
-
MobileSubscriber::OPERATOR_DATA[key][:brand]
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def mobile_network_operator
|
47
|
-
if self.mobile_country_code.present? && self.mobile_network_code.present?
|
48
|
-
key = [self.mobile_country_code, self.mobile_network_code]
|
49
|
-
MobileSubscriber::OPERATOR_DATA[key][:operator]
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def inspect
|
54
|
-
"<MobileSubscriber::ISDN #{self.id} (#{self.http_validated? ? '' : 'not '}validated by HTTP)>"
|
55
|
-
end
|
56
|
-
|
57
|
-
def http_validated?
|
58
|
-
@http_validated ||= false
|
59
|
-
end
|
60
|
-
|
61
|
-
# Creates a new MobileSubscriber::ISDN from a Rack::Request object
|
62
|
-
def self.new_from_request(request)
|
63
|
-
http_request_info = Detection::HttpRequestInfo.new request.env
|
64
|
-
|
65
|
-
detection_results = self.methods.select do |x|
|
66
|
-
x.to_s =~ /\Aextract_from_(\w+)_http_request_header\z/i
|
67
|
-
end.map do |detection_method|
|
68
|
-
self.send detection_method, http_request_info
|
69
|
-
end.compact
|
70
|
-
|
71
|
-
# TODO: Select first from a preference order:
|
72
|
-
detection = detection_results.first if detection_results.any?
|
73
|
-
|
74
|
-
if detection.present?
|
75
|
-
validated_isdn = new(detection)
|
76
|
-
validated_isdn.send :http_validated!
|
77
|
-
validated_isdn
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
protected
|
82
|
-
|
83
|
-
def http_validated!
|
84
|
-
@http_validated = true
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|