1. 14 Jul, 2011 1 commit
  2. 09 Jul, 2011 1 commit
    • Joel Martin's avatar
      Pull websockify socket() static method. · 4f8c7465
      Joel Martin authored
      Pull websockify 46e2fbe.
      
      WebSocketServer.socket() is a static method takes a host and port and
      an optional connect parameter. If connect is not set then it returns
      a socket listening on host and port. If connect is set then
      a connection will be made host and port and the socket returned. This
      has IPv6 support like the addrinfo method it replaces.
      
      Also, prefer IPv4 resolutions if they are in the list. This can be
      overriden to prefer IPv6 resolutions for the same host using the
      optional prefer_ipv6 parameter.
      4f8c7465
  3. 07 Jul, 2011 2 commits
  4. 26 Jun, 2011 1 commit
    • Joel Martin's avatar
      Pull fix of recording from websockify. · 8c305c60
      Joel Martin authored
      Pull websockify 7f487fdbd.
      
      The reocrd parameter will turn on recording of all messages sent
      to and from the client. The record parameter is a file prefix. The
      full file-name will be the prefix with an extension '.HANDLER_ID'
      based on the handler ID.
      8c305c60
  5. 12 May, 2011 2 commits
  6. 19 Apr, 2011 1 commit
  7. 26 Mar, 2011 1 commit
  8. 01 Feb, 2011 1 commit
  9. 31 Jan, 2011 2 commits
  10. 13 Jan, 2011 1 commit
  11. 12 Jan, 2011 1 commit
    • Joel Martin's avatar
      wsproxy, wstelnet: wrap command, WS telnet client. · f2538f33
      Joel Martin authored
      wswrapper:
      
          Getting the wswrapper.c LD_PRELOAD model working has turned out to
          involve too many dark corners of the glibc/POSIX file descriptor
          space. I realized that 95% of what I want can be accomplished by
          adding a "wrap command" mode to wsproxy.
      
          The code is still there for now, but consider it experimental at
          best. Minor fix to dup2 and add dup and dup3 logging.
      
      wsproxy Wrap Command:
      
          In wsproxy wrap command mode, a command line is specified instead
          of a target address and port. wsproxy then uses a much simpler
          LD_PRELOAD library, rebind.so, to move intercept any bind() system
          calls made by the program. If the bind() call is for the wsproxy
          listen port number then the real bind() system call is issued for
          an alternate (free high) port on loopback/localhost.  wsproxy then
          forwards from the listen address/port to the moved port.
      
          The --wrap-mode argument takes three options that determine the
          behavior of wsproxy when the wrapped command returns an exit code
          (exit or daemonizing): ignore, exit, respawn.
      
          For example, this runs vncserver on turns port 5901 into
          a WebSockets port (rebind.so must be built first):
      
              ./utils/wsproxy.py --wrap-mode=ignore 5901 -- vncserver :1
      
          The vncserver command backgrounds itself so the wrap mode is set
          to "ignore" so that wsproxy keeps running even after it receives
          an exit code from vncserver.
      
      wstelnet:
      
          To demonstrate the wrap command mode, I added WebSockets telnet
          client.
      
          For example, this runs telnetd (krb5-telnetd) on turns port 2023
          into a WebSockets port (using "respawn" mode since telnetd exits
          after each connection closes):
      
              sudo ./utils/wsproxy.py --wrap-mode=respawn 2023 -- telnetd -debug 2023
      
          Then the utils/wstelnet.html page can be used to connect to the
          telnetd server on port 2023. The telnet client includes VT100.js
          (from http://code.google.com/p/sshconsole) which handles the
          terminal emulation and rendering.
      
      rebind:
      
          The rebind LD_PRELOAD library is used by wsproxy in wrap command
          mode to intercept bind() system calls and move the port to
          a different port on loopback/localhost. The rebind.so library can
          be built by running make in the utils directory.
      
          The rebind library can be used separately from wsproxy by setting
          the REBIND_OLD_PORT and REBIND_NEW_PORT environment variables
          prior to executing a command. For example:
      
              export export REBIND_PORT_OLD="23"
              export export REBIND_PORT_NEW="65023"
              LD_PRELOAD=./rebind.so telnetd -debug 23
      
          Alternately, the rebind script does the same thing:
      
              rebind 23 65023 telnetd -debug 23
      
      Other changes/notes:
      
      - wsproxy no longer daemonizes by default. Remove -f/--foreground
        option and add -D/--deamon option.
      
      - When wsproxy is used to wrap a command in "respawn" mode, the
        command will not be respawn more often than 3 times within 10
        seconds.
      
      - Move getKeysym routine out of Canvas object so that it can be called
        directly.
      f2538f33
  12. 08 Jan, 2011 1 commit
    • Joel Martin's avatar
      Refactor and cleanup websocket.py and deps. · 6a883409
      Joel Martin authored
      Moved websocket.py code into a class WebSocketServer. WebSockets
      server implementations will sub-class and define a handler() method
      which is passed the client socket after. Global variable settings have been
      changed to be parameters for WebSocketServer when created.
      
      Subclass implementations still have to handle queueing and sending but
      the parent class handles everything else (daemonizing, websocket
      handshake, encode/decode, etc). It would be better if the parent class
      could handle queueing and sending. This adds some buffering and
      polling complexity to the parent class but it would be better to do so
      at some point. However, the result is still much cleaner as can be
      seen in wsecho.py.
      
      Refactored wsproxy.py and wstest.py (formerly ws.py) to use the new
      class. Added wsecho.py as a simple echo server.
      
      - rename tests/ws.py to utils/wstest.py and add a symlink from
        tests/wstest.py
      
      - rename tests/ws.html to tests/wstest.html to match utils/wstest.py.
      
      - add utils/wsecho.py
      
      - add tests/wsecho.html which communicates with wsecho.py and simply
        sends periodic messages and shows what is received.
      6a883409
  13. 07 Jan, 2011 1 commit
    • Joel Martin's avatar
      wsproxy.py: add web serving capability. · 96bc3d30
      Joel Martin authored
      - Added ability to respond to normal web requests. This is basically
        integrating web.py functionality into wsproxy. This is only in the
        python version and it is off by default when calling wsproxy. Turn
        it on with --web DIR where DIR is the web root directory.
      
      Next task is to clean up wsproxy.py. It's gotten unwieldy and it
      really no longer needs to be parallel to the C version.
      96bc3d30
  14. 04 Jan, 2011 1 commit
    • Joel Martin's avatar
      wsproxy: warn when no cert. C sock close cleanup. · 58dc1947
      Joel Martin authored
      Warn early about no SSL cert and add clearer warning when a connection
      comes in as SSL but no cert file exists.
      
      For the C version, cleanup closing of the connection socket. Use
      shutdown for a cleaner cleanup with the client.
      58dc1947
  15. 06 Nov, 2010 1 commit
  16. 15 Sep, 2010 1 commit
    • Joel Martin's avatar
      proxy: Issue #14: detect and allow wss:// from Safari. · 7e63919e
      Joel Martin authored
      Addresses this issue:
      http://github.com/kanaka/noVNC/issues#issue/14
      
      Safari starts with '\x80' rather than '\x16' like Chrome and Firefox
      and having PROTOCOL_TLSv1 doesn't work with Safari. But just removing
      the ssl_version allows things to work with Safari wss:// connections.
      
      Also, if the handshake (after SSL wrapping) is null then terminate the
      connection. This probably means the certificate was refused by the
      client. Unfortunately Safari (the version I have) doesn't cleanly
      shutdown WebSockets connections until the page is reloaded (even if
      the object is no longer referenced).
      7e63919e
  17. 11 Sep, 2010 1 commit
  18. 10 Sep, 2010 2 commits
    • Joel Martin's avatar
      proxy: do handshake in forked process too. · edc47252
      Joel Martin authored
      edc47252
    • Joel Martin's avatar
      wsproxy: multiprocess capable. · a0315ab1
      Joel Martin authored
      Add -m, --multiprocess option which forks a handler for each
      connection allowing multiple connections to the same target using the
      same proxy instance.
      
      Cleaned up the output of the handler process. Each process' output is
      prefixed with an ordinal value.
      
      Changed both the C and python versions of the proxy.
      a0315ab1
  19. 27 Aug, 2010 1 commit
    • Joel Martin's avatar
      Remove psuedo-UTF8 encoding. · 55dee432
      Joel Martin authored
      It's less efficient on average that base64 (150% vs 133%). It's
      non-standard (0 shifted to 256 before encoding). And I rarely use it.
      55dee432
  20. 04 Aug, 2010 2 commits
  21. 17 Jul, 2010 1 commit
  22. 01 Jul, 2010 2 commits
  23. 24 Jun, 2010 2 commits
  24. 17 Jun, 2010 1 commit
  25. 16 Jun, 2010 2 commits
  26. 07 Jun, 2010 1 commit
  27. 28 May, 2010 1 commit
    • Joel Martin's avatar
      Test non-base64 (straight UTF-8) encoding. · 507b473a
      Joel Martin authored
      Also add a wsencoding test client/server program to test send a set of
      values between client and server and vice-versa to test encodings.
      
      Not turned on by default.
      
      Add support for encode/decode of UTF-8 in the proxy. This leverages
      the browser for decoding the WebSocket stream directly instead of
      doing base64 decode in the browser itself.
      
      Unfortunately, in Chrome this has negligible impact (round-trip time
      is increased slightly likely due to extra python processing).
      
      In firefox, due to the use of the flash WebSocket emulator the
      performance is even worse. This is because it's really annoying to get
      the flash WebSocket emulator to properly decode a UTF-8 bytestream.
      The problem is that the readUTFBytes and readMultiByte methods of an
      ActionScript ByteArray don't treat 0x00 correctly. They return
      a string that ends at the first 0x00, but the index into the ByteArray
      has been advanced by however much you requested.
      
      This is very silly for two reasons: ActionScript (and Javascript)
      strings can contain 0x00 (they are not null terminated) and second,
      UTF-8 can legitimately contain 0x00 values. Since UTF-8 is not
      constant width there isn't a great way to determine if those methods
      in fact did encounter a 0x00 or they just read the number of bytes
      requested.
      
      Doing manual decoding using readUTFByte one character at a time slows
      things down quite a bit. And to top it all off, those methods don't
      support the alternate UTF-8 encoding for 0x00 ("\xc0\x80"). They also
      just treat that encoding as the end of string too.
      
      So to get around this, for now I'm encoding zero as 256 ("\xc4\x80")
      and then doing mod 256 in Javascript. Still doesn't result in much
      benefit in firefox.
      
      But, it's an interesting approach that could use some more exploration
      so I'm leaving in the code in both places.
      507b473a
  28. 15 May, 2010 1 commit
  29. 06 May, 2010 1 commit