This is an automated email from the ASF dual-hosted git repository.
rubys pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git
The following commit(s) were added to refs/heads/master by this push:
new aa1bde1 wsc: support remote authentication
aa1bde1 is described below
commit aa1bde1728cf4cbb490172fd2803a274f5fce9ff
Author: Sam Ruby <[email protected]>
AuthorDate: Sat Oct 24 14:37:58 2020 -0400
wsc: support remote authentication
* Change to websocket-client-simple as it is actively maintained
* Enable the specification of the path to the websocket/session
* If not running locally, fetch session using HTTP basic auth
---
www/board/agenda/Gemfile | 2 +-
www/board/agenda/daemon/wsc.rb | 98 ++++++++++++++++++++++++++++--------------
www/board/agenda/main.rb | 2 -
3 files changed, 66 insertions(+), 36 deletions(-)
diff --git a/www/board/agenda/Gemfile b/www/board/agenda/Gemfile
index 83cfa0a..f39f3f8 100644
--- a/www/board/agenda/Gemfile
+++ b/www/board/agenda/Gemfile
@@ -25,7 +25,7 @@ gem 'erubis'
gem 'mustache'
gem 'websocket-eventmachine-server'
-gem 'websocket-client-simple'
+gem 'websocket-eventmachine-client'
gem 'concurrent-ruby'
gem 'rubyXL'
diff --git a/www/board/agenda/daemon/wsc.rb b/www/board/agenda/daemon/wsc.rb
index 5cda25a..c7f09b7 100644
--- a/www/board/agenda/daemon/wsc.rb
+++ b/www/board/agenda/daemon/wsc.rb
@@ -1,29 +1,27 @@
#!/usr/bin/env ruby
+# Web socket client:
+# - securely connects and authenticates with the web socket
+# - outputs the messages received
+
$LOAD_PATH.unshift '/srv/whimsy/lib'
-require 'websocket-client-simple'
+require 'websocket-eventmachine-client'
require 'optparse'
require 'ostruct'
require 'etc'
+require 'net/http'
+require 'json'
require_relative './session'
-# monkey patch for https://github.com/shokai/websocket-client-simple/issues/24
-class WebSocket::Client::Simple::Client
- def sleep(*args)
- close
- end
-end
-
########################################################################
# Parse argument list #
########################################################################
options = OpenStruct.new
-options.host = 'localhost'
-options.port = 34234
-options.protocol = 'ws'
+options.host = 'whimsy.local'
+options.path = '/board/agenda/websocket/'
options.user = Etc.getlogin
options.restart = false
@@ -34,10 +32,14 @@ opt_parser = OptionParser.new do |opts|
options.host = host
end
- opts.on "-p", "--port PORT", 'Port to connect to' do |port|
+ opts.on "--port PORT", 'Port to connect to' do |port|
options.port = port
end
+ opts.on "--path PORT", 'Path to connect to' do |path|
+ options.path = path
+ end
+
opts.on "--secure", 'Use secure web sockets (wss)' do
options.protocol = 'wss'
end
@@ -53,38 +55,68 @@ end
opt_parser.parse!(ARGV)
+options.port ||= (options.host.include?('whimsy') ? 80 : 34234)
+options.protocol ||= (options.host.include?('local') ? 'ws' : 'wss')
+
########################################################################
# Connect to WebSocket #
########################################################################
-url ="#{options.protocol}://#{options.host}:#{options.port}"
-ws = WebSocket::Client::Simple.connect url
+EM.run do
+ url = "#{options.protocol}://#{options.host}:#{options.port}#{options.path}"
+ puts "coonnecting to #{url}..."
+ ws = WebSocket::EventMachine::Client.connect uri: url
-ws.on :message do |msg|
- puts msg.data
-end
+ ws.onmessage do |msg, type|
+ puts msg
+ end
+
+ ws.onopen do
+ session = nil
+
+ # see if there is a local session we can use
+ if options.host.include? 'local'
+ Dir["#{Session::WORKDIR}/*"].find do |file|
+ session = File.basename(file) if File.read(file) == options.user
+ end
+ end
+
+ # fetch remote session
+ while not session
+ require 'io/console'
+ password = $stdin.getpass("password for #{options.user}: ")
-ws.on :open do
- Dir["#{Session::WORKDIR}/*"].find do |file|
- if File.read(file) == options.user
+ path = File.expand_path('../session.json', options.path)
+ request = Net::HTTP::Get.new(path)
+ request.basic_auth options.user, password
+ ssl = {use_ssl: options.protocol == 'wss'}
+
+ response = Net::HTTP.start(options.host, options.port, ssl) do |http|
+ http.request(request)
+ end
+
+ if Net::HTTPOK === response
+ session = JSON.parse(response.body)['session']
+ else
+ p response
+ end
+ end
+
+ if session
if options.restart
- ws.send "session: #{File.basename(file)}\nrestart: true\n\n"
+ ws.send "session: #{session}\nrestart: true\n\n"
else
- ws.send "session: #{File.basename(file)}\n\n"
+ ws.send "session: #{session}\n\n"
end
end
end
-end
-
-ws.on :close do |e|
- puts "closing: #{e.inspect}"
- exit 1
-end
-ws.on :error do |e|
- puts "error: #{e.inspect}"
-end
+ ws.onclose do |code, reason|
+ puts "closing: #{code}"
+ exit 1
+ end
-loop do
- ws.send STDIN.gets
+ ws.onerror do |error|
+ puts "error: #{error.inspect}"
+ end
end
diff --git a/www/board/agenda/main.rb b/www/board/agenda/main.rb
index 215da6c..4537f53 100755
--- a/www/board/agenda/main.rb
+++ b/www/board/agenda/main.rb
@@ -59,8 +59,6 @@ require_relative './helpers/integer'
require_relative './daemon/session'
require_relative './daemon/events'
-require 'websocket-client-simple'
-
# if AGENDA_WORK doesn't exist yet, make it
unless Dir.exist? AGENDA_WORK
require 'fileutils'