passlist

package module
v1.3.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 19, 2023 License: GPL-3.0 Imports: 12 Imported by: 2

README

PassList

Golang GoDoc Go Report Issues Size Tag License View examples


Purpose

Sometimes there is a need to password-protect your web-server, either in whole or just some parts of it. That's were this little package comes in. It offers to simply integrate the popular BasicAuth mechanism into your own web-server.

Note: To be on the safe side your web-server should use HTTPS instead of plain old HTTP to avoid the chance of someone eavesdropping on the username/password transmission.

Installation

You can use Go to install this package for you:

go get -u github.com/mwat56/passlist

Then in your application you add

import "github.com/mwat56/passlist"

and use the provided functions (discussed below) as you see fit.

Usage

PassList provides an easy way to handle HTTP Basic Authentication by simply calling the package's Wrap() function and implementing the TAuthDecider interface which only requires the single function or method

NeedAuthentication(aRequest *http.Request) bool

That function may decide on whatever means necessary whether to grant access (returning true) or deny it (returning false).

For your ease there are two TAuthDecider implementations provided: TAuthSkipper (which generally returns false) and TAuthNeeder (which generally returns true). Just instantiate one of those – or, of course, your own implementation – and pass it to the Wrap() function.

func Wrap(aHandler http.Handler, aRealm, aPasswdFile string, aAuthDecider TAuthDecider) http.Handler

The arguments mean:

  • aHandler: the HTTP handler you implemented for your web-server; you will use the return value of Wrap() instead after you called this function.

  • aRealm: the name of the host/domain to protect (this can be any string you like); it will be shown by most browsers when the username/password is requested.

  • aPasswdFile: the name of the password file that holds all the username/password pairs to use when authentication is actually required.

  • aAuthDecider: the deciding function we talked about above.

So, in short: implement the TAuthDecider interface and call passlist.Wrap(…), and you're done.

However, the package provides a TPassList class with methods to work with a username/password list. It's fairly well documented, so it shouldn't be too hard to use it on your own if you don't like the automatic handling provided by Wrap(). You can create a new instance by either calling passlist.LoadPasswords(aFilename string) (which, as its name says, tries to load the given password file at once), or you call passlist.NewList(aFilename string) (which leaves it to you when to actually read the password file by calling the TPassList object's Load() method).

There's an additional convenience function called passlist.Deny() which sends an "Unauthorised" notice to the remote host in case the remote user couldn't be authenticated; this function is called internally whenever your TAuthDecider required authentication and wasn't given valid credentials from the remote user.

To further improve the safety of the passwords they are peppered before hashing and storing them. The default pepper value can be read by calling

pepper := passlist.Pepper()

And the pepper value can be changed by calling

myPepper := "This is my common 'pepper' value for the user passwords"
passlist.SetPepper(myPepper)

Note: Changing the pepper value after storing user/password pairs will invalidate all existing userlist entries!

Please refer to the source code documentation for further details ot the TPassList class.

In the package's ./app folder you'll find the passlist.go program which implements the maintenance of password files with the following options:

-add string
	<username> name of the user to add to the file (prompting for the password)
-chk string
	<username> name of the user whose pass to check (prompting for the password)
-del string
	<username> name of the user to remove from the file
-file string
	<filename> name of the passwordfile to use (default "pwaccess.db")
-lst
	list all current usernames from the list
-q    whether to be quiet or not (suppress screen output)
-upd string
	<username> name of the user to update in the file (prompting for the password)

Password list

This library provides a couple of functions you can use in your own program to maintain your own password list without having to use the TPassList class directly.

  • AddUser(aUser, aFilename string) reads a password for aUser from the commandline and adds it to aFilename.
  • CheckUser(aUser, aFilename string) reads a password for aUser from the commandline and compares it with the one stored in aFilename.
  • DeleteUser(aUser, aFilename string) removes the entry for aUser from the password list stored in aFilename.
  • ListUsers(aFilename string) reads aFilename and lists all users stored in that file.
  • UpdateUser(aUser, aFilename string) reads a password for aUser from the commandline and updates the entry in the password list in aFilename.

Note: All these functions do not return to the caller but terminate the respective program with error code 0 (zero) if successful, or 1 (one) otherwise.

Libraries

The following external libraries are used building PassList:

  • Crypto supplementary Go cryptography libraries.

Licence

Copyright © 2019, 2023  M.Watermann, 10247 Berlin, Germany
                All rights reserved
            EMail : <support@mwat.de>

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

You should have received a copy of the GNU General Public License along with this program. If not, see the GNU General Public License for details.


Documentation

Overview

Copyright © 2019, 2022 M.Watermann, 10247 Berlin, Germany
            All rights reserved
        EMail : <support@mwat.de>

Package passlist provides a `BasicAuth` middleware plugin for Go web-servers.

Copyright © 2019, 2023 M.Watermann, 10247 Berlin, Germany
                All rights reserved
            EMail : <support@mwat.de>

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

You should have received a copy of the GNU General Public License along with this program. If not, see the [GNU General Public License](http://www.gnu.org/licenses/gpl.html) for details.

Copyright © 2019, 2022 M.Watermann, 10247 Berlin, Germany
                All rights reserved
            EMail : <support@mwat.de>

Index

Constants

This section is empty.

Variables

View Source
var (
	// Verbose determines whether or not to print some output
	// when executing the commands.
	Verbose = true
)

Functions

func AddUser added in v1.2.0

func AddUser(aUser, aFilename string)

AddUser reads a password for `aUser` from the commandline and adds it to `aFilename`.

NOTE: This function does not return but terminates the program with error code `0` (zero) if successful, or `1` (one) otherwise.

`aUser` the username to add to the password file.
`aFilename` name of the password file to use.

func CheckUser added in v1.2.0

func CheckUser(aUser, aFilename string)

CheckUser reads a password for `aUser` from the commandline and compares it with the one stored in `aFilename`.

NOTE: This function does not return but terminates the program with error code `0` (zero) if successful, or `1` (one) otherwise.

`aUser` the username to check in the password file.
`aFilename` name of the password file to use.

func DeleteUser added in v1.2.0

func DeleteUser(aUser, aFilename string)

DeleteUser removes the entry for `aUser` from the password list `aFilename`.

NOTE: This function does not return but terminates the program with error code `0` (zero) if successful, or `1` (one) otherwise.

`aUser` the username to remove from the password file.
`aFilename` name of the password file to use.

func Deny

func Deny(aRealm string, aWriter http.ResponseWriter)

Deny sends an "Unauthorised" notice to the remote host.

`aRealm` The symbolic name of the host/domain to protect.
`aWriter` Used by an HTTP handler to construct an HTTP response.

func ListUsers added in v1.2.0

func ListUsers(aFilename string)

ListUsers reads `aFilename` and lists all users stored in there.

NOTE: This function does not return but terminates the program with error code `0` (zero) if successful, or `1` (one) otherwise.

`aFilename` name of the password file to use.

func Pepper added in v1.1.0

func Pepper() string

Pepper returns the value used for peppering passwords.

func SetPepper added in v1.1.0

func SetPepper(aPepper string)

SetPepper changes the value used for peppering passwords.

If the given `aPepper` value is an empty string it is ignored and the current pepper value remains unchanged.

`aPepper` The new pepper value to use.

func UpdateUser added in v1.2.0

func UpdateUser(aUser, aFilename string)

UpdateUser reads a password for `aUser` from the commandline and updates the entry in the password list `aFilename`.

NOTE: This function does not return but terminates the program with error code `0` (zero) if successful, or `1` (one) otherwise.

`aUser` the username to remove from the password file.
`aFilename` name of the password file to use.

func Wrap

func Wrap(aHandler http.Handler, aRealm, aPasswdFile string, aAuthDecider TAuthDecider) http.Handler

Wrap returns a handler function that includes authentication, wrapping the given `aHandler` and calling it internally.

`aHandler` responds to the actual HTTP request; this is

the handler to be called after successful authentication.

`aRealm` The symbolic name of the domain/host to protect.
`aPasswdFile` The name of the password file to use.
`aAuthDecider`

Types

type TAuthDecider

type TAuthDecider interface {
	// NeedAuthentication returns `true` if authentication
	// is required, or `false` otherwise.
	//
	//	`aRequest` holds the URL to check.
	NeedAuthentication(aRequest *http.Request) bool
}

TAuthDecider is an interface deciding whether a given URL needs authentication or not.

type TAuthNeeder

type TAuthNeeder int

TAuthNeeder provides a `TAuthDecider` implementation always returning `true`.

func (TAuthNeeder) NeedAuthentication

func (ad TAuthNeeder) NeedAuthentication(aRequest *http.Request) bool

NeedAuthentication returns `true` thus requiring authentication for any URL.

type TAuthSkipper

type TAuthSkipper int

TAuthSkipper provides a `TAuthDecider` implementation always returning `false`.

func (TAuthSkipper) NeedAuthentication

func (ad TAuthSkipper) NeedAuthentication(aRequest *http.Request) bool

NeedAuthentication returns `false` thus skipping any authentication.

type TPassList

type TPassList tPassList

TPassList holds the list of username/password values.

func LoadPasswords

func LoadPasswords(aFilename string) (*TPassList, error)

LoadPasswords reads the given `aFilename` returning a `TUserList` instance filled with data read from the password file and a possible error condition.

This function reads one line at a time of the password file skipping both empty lines and comments (identified by `#` or `;` at line start).

`aFilename` The name of the password file to read.

func NewList

func NewList(aFilename string) *TPassList

NewList returns a new `TUserList` instance.

`aFilename` The name of the password file to use for

`Load()` and `Store()`

func (*TPassList) Add

func (ul *TPassList) Add(aUser, aPassword string) error

Add inserts `aUser` with `aPassword` into the list.

Before storing `aPassword` it gets peppered and hashed.

`aUser` The new user's name to use.
`aPassword` The user's password to store.

func (*TPassList) Clear

func (ul *TPassList) Clear() *TPassList

Clear empties the internal data structure.

func (*TPassList) Exists

func (ul *TPassList) Exists(aUser string) (rOK bool)

Exists returns `true` if `aUser` exists in the list, or `false` if not found.

`aUser` The username to lookup.

func (*TPassList) Find

func (ul *TPassList) Find(aUser string) (rHash string, rOK bool)

Find returns the hashed password of `aUser` and `true`, or an empty string and `false` if not found.

`aUser` The username to lookup.

func (*TPassList) IsAuthenticated

func (ul *TPassList) IsAuthenticated(aRequest *http.Request) error

IsAuthenticated checks `aRequest` for authentication data, returning `nil` for successful authentication, or an `error` otherwise.

On success the username/password are stored in the `aRequest.URL.User` structure to allow for other handlers checking its existence and act accordingly.

`aRequest` The HTTP request received by a server.

func (*TPassList) Len

func (ul *TPassList) Len() int

Len returns the number of entries in the userlist.

func (*TPassList) List

func (ul *TPassList) List() (rList []string)

List returns a list of all usernames in the list.

func (*TPassList) Load

func (ul *TPassList) Load() error

Load reads the password file named in `LoadPasswords()` or `NewList()` replacing any older list's contents with the file's.

func (*TPassList) Matches

func (ul *TPassList) Matches(aUser, aPassword string) (rOK bool)

Matches checks whether `aPassword` of `aUser` matches the stored password.

`aUser` The username to lookup.
`aPassword` The (unhashed) password to check.

func (*TPassList) Remove

func (ul *TPassList) Remove(aUser string) *TPassList

Remove deletes `aUser` from the list.

`aUser` The username to remove.

func (*TPassList) Store

func (ul *TPassList) Store() (int, error)

Store writes the list to `aFilename`, truncating the file if it already exists.

The method returns the number of bytes written and an error, if any.

func (*TPassList) String

func (ul *TPassList) String() string

String returns the list as a single, LF-separated string.

Directories

Path Synopsis
Copyright © 2019, 2022 M.Watermann, 10247 Berlin, Germany
Copyright © 2019, 2022 M.Watermann, 10247 Berlin, Germany

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL