You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@whimsical.apache.org by sebb <se...@gmail.com> on 2020/10/24 22:59:25 UTC

Re: [whimsy] branch master updated: wsc: support remote authentication

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

>     * 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'
>

Re: [whimsy] branch master updated: wsc: support remote authentication

Posted by Sam Ruby <ru...@intertwingly.net>.
On Sat, Oct 24, 2020 at 7:00 PM sebb <se...@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'
> >