hotspotlogin 1.2.2 → 1.3.0.1

Sign up to get free protection for your applications and to get access to all the features.
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