A pure-Haskell SSH server library

Export unexported functions in Internal modules

fr33domloverThu Mar 31 05:27:18 UTC 2016

Some fixes and updates to the export lists

fr33domloverThu Mar 31 05:27:09 UTC 2016

Handle name shadowing warning

fr33domloverThu Mar 31 05:27:18 UTC 2016

Fix type error in test

fr33domloverThu Mar 31 05:27:21 UTC 2016

Expose internal modules for testing

fr33domloverThu Mar 31 05:27:15 UTC 2016

Write export lists and make the API content clearer

Some modules' concents were moved under a new Internal submodule, and the public modules simply export some of the symbols of the internal ones.

Most of the exported API is what Darcsden uses, and most of the rest isn't exported. It's better to export little and add later (minor version upgrade) and to export too much and remove later (major version upgrade).

The API still isn't organized in the public modules as coherently as it can be, but this is hopefully a good starting point.

The Debug and Util modules which were already private moved to Internal too.

fr33domloverThu Mar 31 05:27:08 UTC 2016

Turn SessionT into a newtype wrapper instead of an alias

Also, since both Session and Channel modules ended up having state manipulation functions by the same name, I changed the names to make them unique and allow using both without qualified imports.

fr33domloverThu Mar 31 05:27:05 UTC 2016

Turn ChannelT into a newtype wrapper instead of an alias

fr33domloverThu Mar 31 05:27:04 UTC 2016

Resolve name ambiguity in the tests

fr33domloverThu Mar 31 05:27:14 UTC 2016

User auth now stores optional user ID in addition to username

Some applications, especially ones which use SQL databases, identify users by some numeric or other ID which isn't the username (and then, for example, the username can change while the ID never changes). This record allows the supplied scAuthorize function to return such an ID, and later ccRequestHandler can use that ID, e.g. for database queries.

fr33domloverThu Mar 31 05:27:01 UTC 2016

Rename modules NetReader and Packet to NetGet and NetPut

I think these names are clearer because:

  1. The NetReader and Packet types don't exist anymore, as binary's Get and Put are not being used.
  2. The new names reflect the duality: One mudule encodes data into a byte stream, and the other decodes it back to Haskell types
fr33domloverThu Mar 31 05:27:00 UTC 2016

Re-implement NetReader using Data.Binary.Get instead of State

fr33domloverThu Mar 31 05:26:58 UTC 2016

Remove ByteString utils which recently became just aliases

fr33domloverThu Mar 31 05:26:57 UTC 2016

Make some ByteString utils into aliases of existing functions

When these utils were written, at least some of them weren't available yet in the bytestring package. Now they are, so let's use them instead of writing our own. I also added a lower bound for bytestring (>=0.10). Hopefully this isn't a problem for maintained packages using 'ssh' because the first 0.10 release was made in 2012 (more than 3 years ago).

fr33domloverThu Mar 31 05:26:53 UTC 2016

Remove the 'Packet' type alias, just use 'Put'

fr33domloverThu Mar 31 05:26:53 UTC 2016

Revise the packet builder code

  • Add some integer and bytestring related utilities to the Util module
  • Using Data.Binary.Put instead of Writer for Packet building
  • Move bytestring building logic to the Put builder functions, and the functions returning bytestrings simply runPut those builders
  • Add doc comments and examples to some utility functions
fr33domloverThu Mar 31 05:26:48 UTC 2016

Move the modules under the Network module

fr33domloverThu Mar 31 05:26:45 UTC 2016

Support building with stack and latest LTS

fr33domloverThu Mar 31 05:26:29 UTC 2016

major version bump to reflect API changes

ganeshFri Mar 18 06:33:41 UTC 2016

Initial support for arbitrary MonadIO base monads

The SSH server has been using two monads, both being StateT over IO. One holds state for an entire session, and the other holds state for a single channel. If you wanted to pass some extra information to the monadic computations, you'd have to pass them when starting the server or use IO based storage like IORef.

This record keeps those two monads defined as StateT, but instead of wrapping IO itself, they wrap an arbitrary MonadIO instance which you can choose. That can allow much more flexibility.

Since sessions and channels run in separate threads, there are two type parameters, m and n, one for each base monad. If you set them both to IO, you get the old usual behavior.

fr33domloverSat Mar 5 22:53:35 UTC 2016

Allow recent versions of testing packages

fr33domloverSat Mar 5 04:24:12 UTC 2016

Allow building with RSA-2.2

fr33domloverSat Mar 5 04:22:38 UTC 2016

TAG 0.3.2

ganeshTue Oct 6 20:20:56 UTC 2015

appease cabal sdist: remove non-existent test files from cabal file

ganeshTue Oct 6 20:19:26 UTC 2015

bump version to 0.3.2

ganeshTue Oct 6 20:12:35 UTC 2015

Bump RSA dependency from 1.0.6 to 2.1.0

In RSA key verification, I assume that any error in the process should be treated a failed verification rather than a proper error. This is meant to maintain the behavior checked by tests.

lsixMon Oct 5 07:41:45 UTC 2015

use explicit import lists and export lists on non-exposed modules

ganeshFri Jun 19 19:26:03 UTC 2015

TAG 0.3.1

ganeshMon Apr 27 21:27:07 UTC 2015

bump version to 0.3.1

ganeshMon Apr 27 21:26:58 UTC 2015

drop note about basic maintenance from README

ganeshMon Apr 27 05:57:07 UTC 2015