1# coding=utf-8
2
3from __future__ import unicode_literals
4
5from datetime import datetime
6
7from .. import BaseProvider
8
9
10class Provider(BaseProvider):
11    user_agents = (
12        'chrome', 'firefox', 'internet_explorer', 'opera', 'safari',
13    )
14
15    windows_platform_tokens = (
16        'Windows 95', 'Windows 98', 'Windows 98; Win 9x 4.90', 'Windows CE',
17        'Windows NT 4.0', 'Windows NT 5.0', 'Windows NT 5.01',
18        'Windows NT 5.1', 'Windows NT 5.2', 'Windows NT 6.0', 'Windows NT 6.1',
19        'Windows NT 6.2',
20    )
21
22    linux_processors = ('i686', 'x86_64',)
23
24    mac_processors = ('Intel', 'PPC', 'U; Intel', 'U; PPC',)
25
26    def mac_processor(self):
27        return self.random_element(self.mac_processors)
28
29    def linux_processor(self):
30        return self.random_element(self.linux_processors)
31
32    def user_agent(self):
33        name = self.random_element(self.user_agents)
34        return getattr(self, name)()
35
36    def chrome(self, version_from=13, version_to=63,
37               build_from=800, build_to=899):
38        saf = str(self.generator.random.randint(531, 536)) + \
39            str(self.generator.random.randint(0, 2))
40        tmplt = '({0}) AppleWebKit/{1} (KHTML, like Gecko)' \
41                ' Chrome/{2}.0.{3}.0 Safari/{4}'
42        platforms = (
43            tmplt.format(self.linux_platform_token(),
44                         saf,
45                         self.generator.random.randint(version_from, version_to),
46                         self.generator.random.randint(build_from, build_to),
47                         saf),
48            tmplt.format(self.windows_platform_token(),
49                         saf,
50                         self.generator.random.randint(version_from, version_to),
51                         self.generator.random.randint(build_from, build_to),
52                         saf),
53            tmplt.format(self.mac_platform_token(),
54                         saf,
55                         self.generator.random.randint(version_from, version_to),
56                         self.generator.random.randint(build_from, build_to),
57                         saf),
58        )
59
60        return 'Mozilla/5.0 ' + self.random_element(platforms)
61
62    def firefox(self):
63        ver = (
64            'Gecko/{0} Firefox/{1}.0'.format(
65                self.generator.date_time_between(
66                    datetime(2011, 1, 1)
67                ),
68                self.generator.random.randint(4, 15)
69            ),
70            'Gecko/{0} Firefox/3.6.{1}'.format(
71                self.generator.date_time_between(
72                    datetime(2010, 1, 1)
73                ),
74                self.generator.random.randint(1, 20)),
75            'Gecko/{0} Firefox/3.8'.format(
76                self.generator.date_time_between(datetime(2010, 1, 1)),
77            ),
78        )
79        tmplt_win = '({0}; {1}; rv:1.9.{2}.20) {3}'
80        tmplt_lin = '({0}; rv:1.9.{1}.20) {2}'
81        tmplt_mac = '({0}; rv:1.9.{1}.20) {2}'
82        platforms = (
83            tmplt_win.format(self.windows_platform_token(),
84                             self.generator.locale().replace('_', '-'),
85                             self.generator.random.randint(0, 2),
86                             self.generator.random.choice(ver)),
87            tmplt_lin.format(self.linux_platform_token(),
88                             self.generator.random.randint(5, 7),
89                             self.generator.random.choice(ver)),
90            tmplt_mac.format(self.mac_platform_token(),
91                             self.generator.random.randint(2, 6),
92                             self.generator.random.choice(ver)),
93        )
94
95        return 'Mozilla/5.0 ' + self.random_element(platforms)
96
97    def safari(self):
98        saf = "{0}.{1}.{2}".format(self.generator.random.randint(531, 535),
99                                   self.generator.random.randint(1, 50),
100                                   self.generator.random.randint(1, 7))
101        if not self.generator.random.getrandbits(1):
102            ver = "{0}.{1}".format(self.generator.random.randint(4, 5),
103                                   self.generator.random.randint(0, 1))
104        else:
105            ver = "{0}.0.{1}".format(self.generator.random.randint(4, 5),
106                                     self.generator.random.randint(1, 5))
107        tmplt_win = '(Windows; U; {0}) AppleWebKit/{1} (KHTML, like Gecko)' \
108                    ' Version/{2} Safari/{3}'
109        tmplt_mac = '({0} rv:{1}.0; {2}) AppleWebKit/{3} (KHTML, like Gecko)' \
110                    ' Version/{4} Safari/{5}'
111        tmplt_ipod = '(iPod; U; CPU iPhone OS {0}_{1} like Mac OS X; {2})' \
112                     ' AppleWebKit/{3} (KHTML, like Gecko) Version/{4}.0.5' \
113                     ' Mobile/8B{5} Safari/6{6}'
114        locale = self.generator.locale().replace('_', '-')
115        platforms = (
116            tmplt_win.format(self.windows_platform_token(),
117                             saf,
118                             ver,
119                             saf),
120            tmplt_mac.format(self.mac_platform_token(),
121                             self.generator.random.randint(2, 6),
122                             locale,
123                             saf,
124                             ver,
125                             saf),
126            tmplt_ipod.format(self.generator.random.randint(3, 4),
127                              self.generator.random.randint(0, 3),
128                              locale,
129                              saf,
130                              self.generator.random.randint(3, 4),
131                              self.generator.random.randint(111, 119),
132                              saf),
133        )
134
135        return 'Mozilla/5.0 ' + self.random_element(platforms)
136
137    def opera(self):
138        platform = '({0}; {1}) Presto/2.9.{2} Version/{3}.00'.format(
139            (
140                self.linux_platform_token()
141                if self.generator.random.getrandbits(1)
142                else self.windows_platform_token()
143            ),
144            self.generator.locale().replace('_', '-'),
145            self.generator.random.randint(160, 190),
146            self.generator.random.randint(10, 12),
147        )
148        return 'Opera/{0}.{1}.{2}'.format(
149            self.generator.random.randint(8, 9),
150            self.generator.random.randint(10, 99),
151            platform,
152        )
153
154    def internet_explorer(self):
155        tmplt = 'Mozilla/5.0 (compatible; MSIE {0}.0; {1}; Trident/{2}.{3})'
156        return tmplt.format(self.generator.random.randint(5, 9),
157                            self.windows_platform_token(),
158                            self.generator.random.randint(3, 5),
159                            self.generator.random.randint(0, 1))
160
161    def windows_platform_token(self):
162        return self.random_element(self.windows_platform_tokens)
163
164    def linux_platform_token(self):
165        return 'X11; Linux {0}'.format(
166            self.random_element(self.linux_processors))
167
168    def mac_platform_token(self):
169        return 'Macintosh; {0} Mac OS X 10_{1}_{2}'.format(
170            self.random_element(self.mac_processors),
171            self.generator.random.randint(5, 12),
172            self.generator.random.randint(0, 9),
173        )
174