hotspotlogin 1.2.2 → 1.3.0.1

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.
data/Changelog ADDED
@@ -0,0 +1,41 @@
1
+ * 1.3.0 (2011-09-29)
2
+ * Italian and English localization based on R18n
3
+ * some mobile-friendliness (without special layouts or device detection)
4
+ * improved JS code for user stats
5
+
6
+ * 1.2.2 (2011-08-08)
7
+ * Fix logo link and links style
8
+
9
+ * 1.2.1 (2011-08-08)
10
+ * Fix command line options
11
+
12
+ * 1.2.0 (2011-08-08)
13
+ * --logo-link
14
+ * --my-url ("My Account" link w/ dynamic replacement of the actual username)
15
+
16
+ * 1.1.0 (2011-08-03)
17
+ * --signup-url
18
+
19
+ * 1.0.2 (2010-12-08)
20
+ * Display Reply-Message properly
21
+ * fix serious encoding issues
22
+ * use Rack instead of ERB utils for escaping
23
+
24
+ * 1.0.1 (2010-11-17)
25
+ * Urgent bugfix -- handle config['logo'] == nil (TypeError)
26
+
27
+ * 1.0.0 (2010-11-16)
28
+ * Major rewrite based on CoovaChilli JSON API (coova.org/CoovaChilli/JSON).
29
+ * tested with CoovaChilli 1.2.5, and IE7, FF3, Epiphany/WebKit
30
+ * uses JavaScript and popups, your browser must support/allow them
31
+ * periodic auto-refresh of accounting data to the end user, including
32
+ downstream and upstream network traffic
33
+ * supports Session and Idle Timeout, showing relevant info if applicable,
34
+ and refreshing info when user is disconnected
35
+ * view customization, with Your Org logo, custom text, etc.
36
+ * some legacy code still around, sorry
37
+
38
+ * 0.1.2 (2010-11-08)
39
+ * Become session leader when forking/daemonizing.
40
+ * this is to avoid trapping terminal interrupts from a parent console
41
+ process, etc.
data/README.rdoc CHANGED
@@ -7,8 +7,8 @@ hotspotlogin.cgi used with ChilliSpot and compatible Network Access
7
7
  Controllers to provide a Captive Portal environment.
8
8
 
9
9
  This release features displaying of detailed accounting info for the end user,
10
- and is strongly based on CoovaChilli Network Access Controller and its
11
- JSON interface.
10
+ Italian and English localization (based on R18n) and is strongly based on
11
+ CoovaChilli Network Access Controller and its JSON interface.
12
12
 
13
13
  * http://github.com/gderosa/hotspotlogin.rb
14
14
 
@@ -71,15 +71,22 @@ All this options may be put into the YAML config file specified by --conf
71
71
 
72
72
  See also chilli.conf(5) manual page.
73
73
 
74
+ ==== CoovaChilli configuration
75
+
76
+ If hotspotlogin.rb listens, say, at 192.168.100.100:4990, CoovaChilli must be
77
+ configured to redirect user to http://192.168.100.100:4990/hotspotlogin
78
+ (+uamserver+ parameter). Also +uamsecret+ must match in Chilli and hotspotlogin
79
+ configuration.
80
+
74
81
  ==== Unix Signals
75
82
 
76
83
  USR1 sync/update log file (flush buffered I/O)
77
-
84
+
78
85
  == LICENSE:
79
86
 
80
87
  (The MIT License)
81
88
 
82
- Copyright (c) 2010 Guido De Rosa (guido.derosa*vemarsas.it)
89
+ Copyright (c) 2010, 2011 Guido De Rosa (guido.derosa*vemarsas.it)
83
90
 
84
91
  Permission is hereby granted, free of charge, to any person obtaining
85
92
  a copy of this software and associated documentation files (the
data/i18n/en.yml ADDED
@@ -0,0 +1,31 @@
1
+ login:
2
+ "you!": sign in
3
+ result:
4
+ success: "logged in to HotSpot"
5
+ failed: "HotSpot login failed"
6
+ logoff: "logged out from HotSpot"
7
+ already: "already logged in to HotSpot"
8
+ notyet: "logged out from HotSpot"
9
+ logging_into: "logging into HotSpot"
10
+ none: "what do you want here?"
11
+ signup:
12
+ "you!": sign up
13
+ account:
14
+ dont_have:
15
+ you: "don”t have an account"
16
+ username:
17
+ short: login
18
+ long: username
19
+ logout: logout
20
+ refresh: refresh
21
+ my: my account
22
+ status:
23
+ username: username
24
+ client_state: client state
25
+ session_time: session time
26
+ session_time_left: session time left
27
+ idle_time_timeout: idle time/timeout
28
+ download_traffic: download
29
+ upload_traffic: upload
30
+ auto_updated_every: auto updated every
31
+
data/i18n/it.yml ADDED
@@ -0,0 +1,30 @@
1
+ login:
2
+ "you!": accedi
3
+ result:
4
+ success: "accesso effettuato"
5
+ failed: "autenticazione fallita"
6
+ logoff: "disconnesso dall’HotSpot"
7
+ already: "già connesso all’HotSpot"
8
+ notyet: "accedi all’HotSpot"
9
+ logging_into: "accesso in corso"
10
+ none: "uhm..."
11
+ signup:
12
+ "you!": registrati
13
+ account:
14
+ dont_have:
15
+ you: non hai un account
16
+ username:
17
+ short: utente
18
+ long: nome utente
19
+ logout: esci
20
+ refresh: aggiorna
21
+ my: gestisci account
22
+ status:
23
+ username: utente
24
+ client_state: stato
25
+ session_time: durata sessione
26
+ session_time_left: tempo rimanente
27
+ idle_time_timeout: "inattività/(max)"
28
+ download_traffic: download
29
+ upload_traffic: upload
30
+ auto_updated_every: "aggiornato automaticam. ogni"
@@ -1,5 +1,7 @@
1
1
  require 'rubygems'
2
+ require 'facets/string'
2
3
  require 'sinatra/base'
4
+ require 'sinatra/r18n'
3
5
  require 'erb'
4
6
 
5
7
  require 'hotspotlogin/constants'
@@ -16,6 +18,8 @@ module HotSpotLogin
16
18
  set :port, HotSpotLogin.config['port']
17
19
  set :logging, HotSpotLogin.config['log-http']
18
20
 
21
+ register Sinatra::R18n
22
+
19
23
  #set :run, false
20
24
 
21
25
  result, titel, headline, bodytext = '', '', '', ''
@@ -64,7 +68,7 @@ module HotSpotLogin
64
68
  # setup of "conditional" HTTPS reverse proxies
65
69
 
66
70
  get '/' do
67
- redirect '/hotspotlogin'
71
+ redirect "/hotspotlogin?#{request.query_string}"
68
72
  end
69
73
 
70
74
  get '/hotspotlogin/favicon.ico' do
@@ -92,6 +96,11 @@ module HotSpotLogin
92
96
  not_found
93
97
  end
94
98
  end
99
+
100
+ get '/hotspotlogin/js/UserStatus.js' do
101
+ content_type 'text/javascript'
102
+ erb :"js/UserStatus.js", :layout => false # localized strings...
103
+ end
95
104
 
96
105
  get '/hotspotlogin/?' do
97
106
  if HotSpotLogin.config['uamsecret'] and
@@ -103,7 +112,9 @@ module HotSpotLogin
103
112
  userpassword = HotSpotLogin.config['userpassword']
104
113
 
105
114
  # attempt to login
106
- if params['login'] == 'login'
115
+ if params['login'] # == 'login'
116
+ # So you can put whichever text you want in submit button
117
+ # as in <input type="submit" name="login" value="MyText"...
107
118
  hexchal = Array[params['chal']].pack('H32')
108
119
  if uamsecret
109
120
  newchal =
@@ -116,8 +127,8 @@ module HotSpotLogin
116
127
  # bitwise XOR between (binary) Strings (operator ^)
117
128
  # implemented in extensions/
118
129
  pappassword = (newpwd ^ newchal).unpack('H32').join
119
- titel = 'Logging in to HotSpot'
120
- headline = 'Logging in to HotSpot'
130
+ titel = headline = t.login.result.logging_into.uppercase + '...'
131
+ # 'Logging in to HotSpot'
121
132
 
122
133
  #if uamsecret and userpassword
123
134
  if userpassword # PAP
@@ -133,41 +144,45 @@ module HotSpotLogin
133
144
  end
134
145
  elsif params['res'] == 'success'
135
146
  result = Result::SUCCESS
136
- titel = 'Logged in to HotSpot'
137
- headline = 'Logged in to HotSpot'
138
- bodytext = 'Welcome'
147
+ titel = headline = t.login.result.success.uppercase
148
+ # 'Logged in to HotSpot'
149
+ bodytext = 'Welcome' # used?
139
150
  elsif params['res'] == 'failed'
140
151
  result = Result::FAILED
141
- titel = 'HotSpot Login Failed'
142
- headline = 'HotSpot Login Failed'
152
+ titel = headline = t.login.result.failed.uppercase
153
+ # 'HotSpot Login Failed'
143
154
  elsif params['res'] == 'logoff'
144
155
  result = Result::LOGOFF
145
- titel = 'Logged out from HotSpot'
146
- headline = 'Logged out from HotSpot'
156
+ titel = headline = t.login.result.logoff.uppercase
157
+ # 'Logged out from HotSpot'
147
158
  elsif params['res'] == 'already'
148
159
  result = Result::ALREADY
149
- titel = 'Already logged in to HotSpot'
150
- headline = 'Already logged in to HotSpot'
160
+ titel = headline = t.login.result.already.uppercase
161
+ # 'Already logged in to HotSpot'
151
162
  elsif params['res'] == 'notyet'
152
163
  result = Result::NOTYET
153
- titel = 'Logged out from HotSpot'
154
- headline = 'Logged out from HotSpot'
164
+ titel = headline = t.login.result.notyet.uppercase
165
+ # 'Logged out from HotSpot'
155
166
  elsif params['res'] == 'popup1'
156
167
  result = Result::PopUp::LOGGING_IN
157
- titel = 'Logging into HotSpot'
158
- headline = 'Logged in to HotSpot'
168
+ titel = t.login.result.logging_into.uppercase + '...'
169
+ # 'Logging into HotSpot'
170
+ headline = t.login.result.success.uppercase
171
+ # 'Logged in to HotSpot'
159
172
  elsif params['res'] == 'popup2'
160
173
  result = Result::PopUp::LOGGED_IN
161
- titel = 'Logged in to HotSpot'
162
- headline = 'Logged in to HotSpot'
174
+ titel = headline = t.login.result.success.uppercase
175
+ # 'Logged in to HotSpot'
163
176
  elsif params['res'] == 'popup3'
164
- result= Result::PopUp::LOGGED_OUT
165
- titel = 'Logged out from HotSpot'
166
- headline = 'Logged out from HotSpot'
167
- elsif params['res'] == '' or !params['res'] # not a form request: err!
177
+ result = Result::PopUp::LOGGED_OUT
178
+ titel = headline = t.login.result.logoff.uppercase
179
+ # 'Logged out from HotSpot'
180
+
181
+ elsif params['res'] == '' or !params['res'] # Not a form request nor a redirect..
168
182
  result = Result::NONE
169
- titel = 'What do you want here?'
170
- headline = 'HotSpot Login Failed'
183
+ titel = t.login.result.none.uppercase # 'What do you want here?'
184
+ headline = t.login.result.failed.uppercase
185
+ # 'HotSpot Login Failed'
171
186
  end
172
187
 
173
188
  logoext = nil
@@ -1,6 +1,6 @@
1
1
  module HotSpotLogin
2
2
 
3
- VERSION = '1.2.2'
3
+ VERSION = '1.3.0.1'
4
4
 
5
5
  DEFAULT_CONFIG = {
6
6
  'listen-address' => '0.0.0.0',
@@ -1,5 +1,14 @@
1
- class String
2
- # bitwise XOR, behaves like in Perl or PHP
1
+ require 'facets/string'
2
+
3
+ class String
4
+
5
+ # Escape single quote for use in generated JavaScript
6
+ def escape_js
7
+ gsub("'", "\\\\'")
8
+ end
9
+
10
+ =begin # use Facets implementation instead
11
+ # Bitwise XOR, behaves like in Perl or PHP
3
12
  def ^(other)
4
13
  # treat as a raw/binary sequence of bytes
5
14
  s1 = self.force_encoding 'ASCII-8BIT'
@@ -13,6 +22,6 @@ class String
13
22
  end
14
23
  return bytes_result.map{|b| b.chr}.join
15
24
  end
25
+ =end
16
26
  end
17
27
 
18
-
@@ -1,27 +1,30 @@
1
1
  body {
2
- font-size: 10pt;
2
+ font-family: sans-serif;
3
+ margin: 1em auto;
4
+ padding: 0 0.75em;
3
5
  }
4
6
  h1, h2 {
5
7
  text-align: center;
6
- font-family: sans-serif;
7
8
  }
8
9
  h1 {
9
- font-size: 160%;
10
10
  margin: 0.1ex 0;
11
11
  }
12
- h2 {
13
- font-size: 135%;
12
+ h1#custom-headline {
13
+ font-style: italic;
14
+ font-weight: normal;
15
+ }
16
+ h2#headline {
17
+ font-size: 110%;
14
18
  margin-top: 0.1ex;
15
- margin-bottom: 0.5ex;
19
+ margin-bottom: 0.1em;
16
20
  font-style: italic;
17
21
  }
18
22
  #powered-by {
19
23
  text-align: right;
20
24
  font-style: italic;
21
- margin-right: 3em;
25
+ margin-right: 2em;
22
26
  margin-bottom: 1ex;
23
- font-family: sans-serif;
24
- font-size:smaller;
27
+ font-size:70%;
25
28
  }
26
29
  #logo-container {
27
30
  text-align: center;
@@ -43,35 +46,41 @@ h2 {
43
46
  }
44
47
  #logInLogOut-container {
45
48
  padding: 0;
46
- margin: 0.5em 0;
49
+ margin: 0 0 0.5em 0;
47
50
  text-align: center;
51
+ line-height: 1.6em;
48
52
  }
49
53
  #logInLogOut-container a {
50
- margin: 0 0.4ex;
54
+ margin: 0 0.5ex;
55
+ white-space: nowrap;
51
56
  }
52
57
  #status-container {
53
58
  text-align: center;
54
- margin: 0 0 1em 0;
55
59
  }
56
60
  #status-table {
57
- margin: auto;
58
- border: 1px blue solid;
59
- padding: 0.5ex;
61
+ font-size: 90%;
62
+ margin: 0.5em auto;
60
63
  }
61
64
  #status-table th {
62
65
  text-align: left;
66
+ text-transform: capitalize;
63
67
  }
64
68
  #status-table td {
65
69
  text-align: right;
66
70
  }
71
+ #status-table th, #status-table td {
72
+ background: #eef;
73
+ }
67
74
  #status-table th.optinfo {
68
- font-size: smaller;
75
+ font-size: 90%;
69
76
  font-style: italic;
70
77
  }
71
78
  #submit-container {
79
+ text-align: left;
72
80
  }
73
81
  #submit-container button, #submit-container input[type="submit"] {
74
- width: 5em;
82
+ width: 4.5em;
83
+ margin-top: 0.3em;
75
84
  }
76
85
  #custom-text {
77
86
  font-size: 94%;
@@ -79,8 +88,33 @@ h2 {
79
88
  margin-bottom: 1.5em;
80
89
  }
81
90
  #custom-footer {
82
- margin-top: 2em;
83
- font-size: small;
84
- font-family: sans-serif;
85
- text-align: center;
91
+ margin-top: 2.6em;
92
+ font-size: 90%;
93
+ }
94
+
95
+ /* button, input[type="submit"] {
96
+ background: white;
97
+ } */
98
+
99
+ #signup-container{
100
+ font-style:italic;
101
+ font-weight: normal;
102
+ margin-top:0.2em;
103
+ }
104
+
105
+ a#signup {
106
+ border: none;
107
+ color: white;
108
+ background: #77f;
109
+ padding: 0 0.2em 0.1em 0.2em;
110
+ font-style:normal;
111
+ }
112
+
113
+ a#signup {
114
+ text-decoration: none;
115
+ margin-left: 0.2em;
116
+ }
117
+
118
+ a img {
119
+ border: none;
86
120
  }
@@ -6,16 +6,23 @@
6
6
  <table>
7
7
  <tbody>
8
8
  <tr>
9
- <th scope="row">Login:</td>
10
- <td><input type="text" name="UserName" size="20" maxlength="255"></td>
9
+ <th scope="row"><%= t.username.short.capitalize %>:</td>
10
+ <td><input type="text" name="UserName" size="16" maxlength="255"></td>
11
11
  </tr>
12
12
  <tr>
13
13
  <th scope="row">Password:</td>
14
- <td><input type="password" name="Password" size="20" maxlength="255"></td>
14
+ <td><input type="password" name="Password" size="16" maxlength="255"></td>
15
+ </tr>
16
+ <tr> <!-- yeah, it's horrible -->
17
+ <td colspan="2" id="submit-container">
18
+ <input type="submit" name="login" value="<%= t.login.you!.capitalize %>">
19
+ </td>
15
20
  </tr>
16
21
  </tbody>
17
22
  </table>
18
- <div id="submit-container">
19
- <input type="submit" name="login" value="login"><% if signup_url =~ /\S/ %> OR <a href="<%= signup_url %>" target="_blank">Signup!</a><% end %>
20
- </div>
21
23
  </form>
24
+ <% if signup_url =~ /\S/ %><span id="signup-container">
25
+ <%= t.account.dont_have.you.capitalize %>?
26
+ <a id="signup" href="<%= signup_url %>" target="_blank"><%= t.signup.you!.capitalize %>!</a>
27
+ </span><% end %>
28
+
@@ -1,4 +1,6 @@
1
1
  <%
2
+ require 'facets/string'
3
+ require 'sinatra/r18n'
2
4
  require 'hotspotlogin/app/helpers'
3
5
  %>
4
6
 
@@ -8,17 +10,18 @@
8
10
  -->
9
11
 
10
12
  <% if custom_headline %>
11
- <h1><%= custom_headline %></h1>
13
+ <h1 id="custom-headline"><%= custom_headline %></h1>
12
14
  <% end %>
13
15
  <% if logoext %>
14
16
  <div id="logo-container">
15
- <% if logo_link =~ /\S/ %><a href="<%= logo_link %>" target="_blank"><% end %>
17
+ <% if logo_link =~ /\S/ %><a class="img" href="<%= logo_link %>" target="_blank"><% end %>
16
18
  <img src="/hotspotlogin/logo<%= logoext %>"/>
17
19
  <% if logo_link =~ /\S/ %></a><% end %>
18
20
  </div>
19
21
  <% end %>
20
22
 
21
23
  <h2 id="headline"><%= titel %></h2>
24
+
22
25
  <div id="Reply-Message">
23
26
  <% if params['reply'] %>
24
27
  <%= Rack::Utils::escape_html params['reply'] %>
@@ -34,14 +37,14 @@
34
37
  <div id="logInLogOut-container">
35
38
  <a
36
39
  id="logInLogOut"
37
- href="http://<%= uamip %>:<%= uamport %>/logoff">Logout</a>
38
- <a href="#" onClick="javascript:chilliController.refresh();">Refresh</a>
40
+ href="http://<%= uamip %>:<%= uamport %>/logoff"><%= t.logout.titlecase %></a>
41
+ <a href="#logInLogOut-container" onClick="javascript:chilliController.refresh();"><%= t.refresh.titlecase %></a>
39
42
  <a
40
43
  id="myAccount"
41
44
  href=""
42
45
  target="_blank"
43
46
  style="display:none;"
44
- >My Account<a>
47
+ ><%= t.my.titlecase %></a>
45
48
  </div>
46
49
  <% elsif [2, 5, 3, 13].include? result %>
47
50
  <div id="form-container">
@@ -66,36 +69,39 @@
66
69
  <div id="status-container">
67
70
  <table id="status-table">
68
71
  <tbody>
72
+ <%
73
+ # Yeah, do not use Ruby String methods, instead use CSS text-transform...
74
+ %>
69
75
  <tr id="userName:row">
70
- <th scope="row">Username</th>
76
+ <th scope="row"><%= t.status.username %></th>
71
77
  <td id="userName"></td>
72
78
  <tr id="clientState:row">
73
- <th scope="row">Client State</th>
79
+ <th scope="row"><%= t.status.client_state %></th>
74
80
  <td id="clientState"></td>
75
81
  </tr>
76
82
  <tr id="sessionTime:row">
77
- <th scope="row">Session Time</th>
83
+ <th scope="row"><%= t.status.session_time %></th>
78
84
  <td id="sessionTime"></td>
79
85
  </tr>
80
86
  <tr id="sessionTimeLeft:row">
81
- <th scope="row">Session Time Left</th>
87
+ <th scope="row"><%= t.status.session_time_left %></th>
82
88
  <td id="sessionTimeLeft"></th>
83
89
  </tr>
84
- <tr id="idleTimeout:row">
85
- <th scope="row">Idle Time/Timeout</th>
90
+ <!-- nobody really cares... -->
91
+ <tr id="idleTimeout:row" style="display:none;">
92
+ <th scope="row"><%= t.status.idle_time_timeout %></th>
86
93
  <td id="idleTimeout"></th>
87
94
  </tr>
88
95
  <tr id="download:row">
89
- <th scope="row">Download Traffic</th>
96
+ <th scope="row"><%= t.status.download_traffic %></th>
90
97
  <td id="download"></td>
91
98
  </tr>
92
99
  <tr id="upload:row">
93
- <th scope="row">Upload Traffic</th>
100
+ <th scope="row"><%= t.status.upload_traffic %></th>
94
101
  <td id="upload"></td>
95
102
  </tr>
96
- <tr id="interval:row">
97
- <th scope="row" class="optinfo">Automatically updated every</th>
98
- <td id="interval"></td>
103
+ <tr id="interval:row" style="font-size:95%">
104
+ <td style="background:transparent; text-align:right" colspan="2" class="optinfo"><span style="font-style:italic; margin-left:0.8em;"><%= t.status.auto_updated_every.uppercase %>:</span> <span style="" id="interval"></td>
99
105
  </tr>
100
106
  </tbody>
101
107
  </table>
@@ -1,3 +1,8 @@
1
+ <%
2
+ require 'facets/string'
3
+ require 'sinatra/r18n'
4
+ require 'hotspotlogin/extensions/string'
5
+ %>
1
6
  // Requires ChilliLibrary.js
2
7
  // See: http://www.coova.org/CoovaChilli/JSON
3
8
  //
@@ -53,6 +58,21 @@ chilliController.scheduleIdleTimeoutAutorefresh = function() {
53
58
  }
54
59
  }
55
60
 
61
+ chilliController.formatBytesShort = function( b , zeroReturn ) {
62
+ return chilliController.formatBytes( b , zeroReturn ).
63
+ replace('Bytes', 'B' ).
64
+ replace('Kilobytes', 'KB').
65
+ replace('Megabytes', 'MB').
66
+ replace('Gigabytes', 'GB');
67
+ }
68
+
69
+ chilliController.refreshAndLogoff = function() {
70
+ chilliController.refresh();
71
+ setTimeout('chilliController.logoff()', 250); // a delay is necessary...
72
+ }
73
+
74
+
75
+
56
76
  function showUserStatus(h) {
57
77
 
58
78
  // Utility functions and objects
@@ -113,10 +133,10 @@ function showUserStatus(h) {
113
133
  txt = null;
114
134
  switch(clientState) {
115
135
  case chilliController.stateCodes.NOT_AUTH:
116
- txt = 'Logged out from HotSpot';
136
+ txt = '<%= t.login.result.logoff.uppercase.escape_js %>';
117
137
  break;
118
138
  case chilliController.stateCodes.AUTH:
119
- txt = 'Logged in to HotSpot';
139
+ txt = '<%= t.login.result.success.uppercase.escape_js %>';
120
140
  break;
121
141
  }
122
142
  if (txt) {
@@ -132,12 +152,13 @@ function showUserStatus(h) {
132
152
  switch(clientState) {
133
153
  case chilliController.stateCodes.NOT_AUTH:
134
154
  e.setAttribute('href', loginURL());
135
- e.innerHTML = 'Login';
155
+ e.innerHTML = '<%= t.login.you!.uppercase.escape_js %>';
136
156
  break;
137
157
  case chilliController.stateCodes.AUTH:
138
- e.setAttribute('href', '#');
139
- e.onclick = chilliController.logoff;
140
- e.innerHTML = 'Logout';
158
+ e.setAttribute('href', '#headline');
159
+ // e.onclick = chilliController.logoff;
160
+ e.onclick = chilliController.refreshAndLogoff;
161
+ e.innerHTML = '<%= t.logout.uppercase.escape_js %>';
141
162
  break;
142
163
  }
143
164
  }
@@ -176,6 +197,8 @@ function showUserStatus(h) {
176
197
  var download_e = document.getElementById('download');
177
198
  var upload_e = document.getElementById('upload');
178
199
  var interval_e = document.getElementById('interval');
200
+ var interval_row_e = document.getElementById('interval:row');
201
+
179
202
  if (userName_e) {
180
203
  userName_e.innerHTML = (
181
204
  chilliController.session.userName
@@ -186,56 +209,67 @@ function showUserStatus(h) {
186
209
  formatStateCode(chilliController.clientState)
187
210
  );
188
211
  }
212
+
189
213
  //if (chilliController.terminateCause) {
190
214
  // document.getElementById('terminateCause').innerHTML = (
191
215
  // chilliController.terminateCause
192
216
  // )
193
217
  //}
194
- if (sessionTime_e) {
195
- document.getElementById('sessionTime').innerHTML = (
196
- chilliController.formatTime(
197
- chilliController.accounting.sessionTime, '0')
198
- );
199
- }
200
- if (sessionTimeLeft_e) {
201
- if (chilliController.session.sessionTimeout) {
202
- document.getElementById('sessionTimeLeft').innerHTML = (
203
- chilliController.formatTime(chilliController.sessionTimeLeft(), 0)
218
+
219
+ // So at logoff session stats are preserved :)
220
+ if (chilliController.clientState == chilliController.stateCodes.AUTH) {
221
+
222
+ if (sessionTime_e) {
223
+ document.getElementById('sessionTime').innerHTML = (
224
+ chilliController.formatTime(
225
+ chilliController.accounting.sessionTime, '0')
226
+ );
227
+ }
228
+ if (sessionTimeLeft_e) {
229
+ if (chilliController.session.sessionTimeout) {
230
+ document.getElementById('sessionTimeLeft').innerHTML = (
231
+ chilliController.formatTime(chilliController.sessionTimeLeft(), 0)
232
+ );
233
+ document.getElementById('sessionTimeLeft:row').style.display = '';
234
+ } else {
235
+ document.getElementById('sessionTimeLeft').innerHTML = ''
236
+ }
237
+ }
238
+ if (chilliController.session.idleTimeout) {
239
+ document.getElementById('idleTimeout').innerHTML = (
240
+ chilliController.formatTime(chilliController.accounting.idleTime) +
241
+ ' / ' +
242
+ chilliController.formatTime(chilliController.session.idleTimeout)
243
+ );
244
+ // document.getElementById('idleTimeout:row').style.display = '';
245
+ // nobody really cares...
246
+ }
247
+ var download_bytes =
248
+ chilliController.accounting.inputOctets +
249
+ Math.pow(2, 32) * chilliController.accounting.inputGigawords;
250
+ var upload_bytes =
251
+ chilliController.accounting.outputOctets +
252
+ Math.pow(2, 32) * chilliController.accounting.outputGigawords;
253
+ if (download_e) {
254
+ download_e.innerHTML = (
255
+ chilliController.formatBytesShort(download_bytes, 0)
256
+ );
257
+ }
258
+ if (upload_e) {
259
+ upload_e.innerHTML = (
260
+ chilliController.formatBytesShort(upload_bytes, 0)
204
261
  );
205
- document.getElementById('sessionTimeLeft:row').style.display = '';
206
- } else {
207
- document.getElementById('sessionTimeLeft').innerHTML = ''
208
262
  }
209
263
  }
210
- if (chilliController.session.idleTimeout) {
211
- document.getElementById('idleTimeout').innerHTML = (
212
- chilliController.formatTime(chilliController.accounting.idleTime) +
213
- ' / ' +
214
- chilliController.formatTime(chilliController.session.idleTimeout)
215
- );
216
- document.getElementById('idleTimeout:row').style.display = '';
217
- }
218
- var download_bytes =
219
- chilliController.accounting.inputOctets +
220
- Math.pow(2, 32) * chilliController.accounting.inputGigawords;
221
- var upload_bytes =
222
- chilliController.accounting.outputOctets +
223
- Math.pow(2, 32) * chilliController.accounting.outputGigawords;
224
- if (download_e) {
225
- download_e.innerHTML = (
226
- chilliController.formatBytes(download_bytes, 0)
227
- );
228
- }
229
- if (upload_e) {
230
- upload_e.innerHTML = (
231
- chilliController.formatBytes(upload_bytes, 0)
232
- );
233
- }
264
+
234
265
  if (interval_e) {
235
266
  interval_e.innerHTML = (
236
267
  chilliController.formatTime(chilliController.interval, 0)
237
268
  );
238
269
  }
270
+ if (chilliController.clientState == chilliController.stateCodes.NOT_AUTH) {
271
+ interval_row_e.style.display = 'none';
272
+ }
239
273
 
240
274
  chilliController.scheduleSessionTimeoutAutorefresh();
241
275
  chilliController.scheduleIdleTimeoutAutorefresh();
@@ -248,4 +282,3 @@ function showUserStatus(h) {
248
282
 
249
283
 
250
284
  }
251
-
data/views/layout.erb CHANGED
@@ -13,9 +13,11 @@
13
13
  <meta http-equiv="Cache-control" content="no-cache">
14
14
  <meta http-equiv="Pragma" content="no-cache">
15
15
 
16
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
17
+
16
18
  <script language="JavaScript"> // legacy stuff from hotspotlogin.cgi/php
17
19
  var width = 560; // popup
18
- var height = 560; // popup
20
+ var height = 600; // popup
19
21
  var blur = 0;
20
22
  var starttime = new Date();
21
23
  var startclock = starttime.getTime();
metadata CHANGED
@@ -4,9 +4,10 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 2
8
- - 2
9
- version: 1.2.2
7
+ - 3
8
+ - 0
9
+ - 1
10
+ version: 1.3.0.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - Guido De Rosa
@@ -14,11 +15,11 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-08-08 00:00:00 +00:00
18
+ date: 2011-09-29 00:00:00 +00:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
- name: sinatra
22
+ name: facets
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
24
25
  none: false
@@ -31,7 +32,7 @@ dependencies:
31
32
  type: :runtime
32
33
  version_requirements: *id001
33
34
  - !ruby/object:Gem::Dependency
34
- name: rack
35
+ name: sinatra
35
36
  prerelease: false
36
37
  requirement: &id002 !ruby/object:Gem::Requirement
37
38
  none: false
@@ -43,6 +44,32 @@ dependencies:
43
44
  version: "0"
44
45
  type: :runtime
45
46
  version_requirements: *id002
47
+ - !ruby/object:Gem::Dependency
48
+ name: rack
49
+ prerelease: false
50
+ requirement: &id003 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ type: :runtime
59
+ version_requirements: *id003
60
+ - !ruby/object:Gem::Dependency
61
+ name: sinatra-r18n
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ type: :runtime
72
+ version_requirements: *id004
46
73
  description: Traditionally, a PHP or Perl/CGI web page has been used to login unauthenticated users to a Network Access Controller like ChilliSpot; this hotspotlogin implementation is based on Sinatra instead, and relies heavily on the CoovaChilli JSON interface.
47
74
  email: guido.derosa@vemarsas.it
48
75
  executables:
@@ -52,10 +79,13 @@ extensions: []
52
79
  extra_rdoc_files:
53
80
  - README.rdoc
54
81
  files:
82
+ - Changelog
55
83
  - README.rdoc
56
84
  - bin/hotspotlogin
57
85
  - examples/hotspotlogin.conf.yaml
58
86
  - examples/etc/lighttpd/lighttpd.conf
87
+ - i18n/en.yml
88
+ - i18n/it.yml
59
89
  - lib/hotspotlogin.rb
60
90
  - lib/hotspotlogin/app.rb
61
91
  - lib/hotspotlogin/app/helpers.rb
@@ -64,7 +94,7 @@ files:
64
94
  - lib/hotspotlogin/extensions/string.rb
65
95
  - public/hotspotlogin/css/default.css
66
96
  - public/hotspotlogin/js/ChilliLibrary.js
67
- - public/hotspotlogin/js/UserStatus.js
97
+ - views/js/UserStatus.js.erb
68
98
  - views/layout.erb
69
99
  - views/hotspotlogin.erb
70
100
  - views/404.erb