On Sat, Oct 24, 2020 at 7:00 PM sebb <seb...@gmail.com> wrote: > > On Sat, 24 Oct 2020 at 19:40, <ru...@apache.org> wrote: > > > > 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 <ru...@intertwingly.net> > > AuthorDate: Sat Oct 24 14:37:58 2020 -0400 > > > > wsc: support remote authentication > > > > * Change to websocket-client-simple as it is actively maintained > > Huh? > > The change below replaces websocket-client-simple with > websocket-eventmachine-client
Yup. commit message bad. - Sam Ruby > > * 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' > >