Chris McDonough
2010-10-03 4a8793edfc53df93a806d9eab896c5bae103d6ae
commit | author | age
7141c7 1 repoze.who Changelog
TS 2 ====================
aa8755 3
9a8e60 4 After 2.0a3 (unreleased)
TS 5 ------------------------
6
e8080a 7 - Added a single-file example BFG application demonstrating the use of
TS 8   the new 'login' and 'logout' methods of the API object.
9
924f24 10 - Add ``login`` and ``logout`` methods to the ``repoze.who.api.API`` object,
TS 11   as a convenience for application-driven login / logout code, which would
95f147 12   otherwise need to use private methods of the API, and reach down into
TS 13   its plugins.
9a8e60 14
eb7071 15 2.0a3 (2010-09030)
TS 16 ------------------
f80021 17
a446d6 18 - Deprecated the following plugins, moving their modules, tests, and docs
ff604c 19   to a new project, ``repoze.who.deprecatedplugins``:
a446d6 20
TS 21   - ``repoze.who.plugins.cookie.InsecureCookiePlugin``
22
23   - ``repoze.who.plugins.form.FormPlugin
24
25   - ``repoze.who.plugins.form.RedirectingFormPlugin
26
27 - Made the ``repoze.who.plugins.cookie.InsecureCookiePlugin`` take a
76e951 28   ``charset`` argument, and use to to encode / decode login and password.
TS 29   See http://bugs.repoze.org/issue155
30
a446d6 31 - Updated ``repoze.who.restrict`` to return headers as a list, to keep
TS 32   ``wsgiref`` from complaining.
5b6365 33
a446d6 34 - Helped default request classifier cope with xml submissions with an
6b7b34 35   explicit charset defined: http://bugs.repoze.org/issue145 (Lorenzo
CM 36   M. Catucci)
37
a446d6 38 - Corrected the handling of type and subtype when matching an XML post
6b7b34 39   to ``xmlpost`` in the default classifier, which, according to RFC
CM 40   2045, must be matched case-insensitively:
41   http://bugs.repoze.org/issue145 (Lorenzo M. Catucci)
42
a349a2 43 - Added ``repoze.who.config:make_api_factory_with_config``, a convenience
TS 44   method for applications which want to set up their own API Factory from
45   a configuration file.
46   
f80021 47 - Fixed example call to ``repoze.who.config:make_middleware_with_config``
TS 48   (added missing ``global_config`` argument).  See
49   http://bugs.repoze.org/issue114
50
c186ae 51 2.0a2 (2010-03-25)
TS 52 ------------------
52bc23 53
TS 54 Bugs Fixed
55 ~~~~~~~~~~
56
57 - Fixed failure to pass substution values in log message string formatting
58   for ``repoze.who.api:API.challenge``.  Fix included adding tests for all
59   logging done by the API object.  See http://bugs.repoze.org/issue122
60
61 Backward Incompatibilities
62 ~~~~~~~~~~~~~~~~~~~~~~~~~~
63
64 - Adjusted logging level for some lower-level details from ``info``
65   to ``debug``.
66
67
e25b84 68 2.0a1 (2010-02-24)
993216 69 ------------------
TS 70
b4b8ee 71 Features
TS 72 ~~~~~~~~
62cd25 73
c9c1c6 74 - Restored the ability to create the middleware using the old ``classifier``
TS 75   argument.  That argument is now a deprecated-but-will-work-forever alias for
76   ``request_classifier``.
cbc983 77
b0f81f 78 - The ``auth_tkt`` plugin now implements the ``IAuthenticator`` interface,
TS 79   and should normally be used both as an ``IIdentifier`` and an
80   ``IAuthenticator``.
81
993216 82 - Factored out the API of the middleware object to make it useful from
TS 83   within the application.  Applications using ``repoze.who``` now fall into
84   one of three catgeories:
85
86   - "middleware-only" applications are configured with middleware, and
87     use either ``REMOTE_USER`` or ``repoze.who.identity`` from the environment
88     to determing the authenticated user.
89
90   - "bare metal" applications use no ``repoze.who`` middleware at all:
91     instead, they configure and an ``APIFactory`` object at startup, and
92     use it to create an ``API`` object when needed on a per-request basis.
93
94   - "hybrid" applications are configured with ``repoze.who`` middleware,
95     but use a new library function to fetch the ``API`` object from the
c9c1c6 96     environ, e.g. to permit calling ``remember`` after a signup or successful
TS 97     login.
993216 98
b4b8ee 99 Bugs Fixed
TS 100 ~~~~~~~~~~
101
102 - Fix http://bugs.repoze.org/issue102: when no challengers existed,
103   logging would cause an exception.
104
105 - Remove ``ez_setup.py`` and dependency on it in setup.py (support
106   distribute).
107
108 Backward Incompatibilities
109 ~~~~~~~~~~~~~~~~~~~~~~~~~~
110
b213af 111 - The middleware used to allow identifier plugins to "pre-authenticate"
TS 112   an identity.  This feature is no longer supported: the ``auth_tkt`` 
113   plugin, which used to use the feature, is now configured to work as
c9c1c6 114   an authenticator plugin (as well as an identifier).
b213af 115
b4b8ee 116 - The ``repoze.who.middleware:PluggableAuthenticationMiddleware`` class
TS 117   no longer has the following (non-API) methods (now made API methods
118   of the ``repoze.who.api:API`` class):
119
120   - ``add_metadata``
121   - ``authenticate``
122   - ``challenge``
123   - ``identify``
124
125 - The following (non-API) functions moved from ``repoze.who.middleware`` to
126   ``repoze.who.api``:
127   
128   - ``make_registries``
129   - ``match_classification``
130   - ``verify``
131
132
060054 133 1.0.18 (2009-11-05)
TS 134 -------------------
798feb 135
TS 136 - Issue #104:  AuthTkt plugin was passing an invalid cookie value in
137   headers from ``forget``, and was not setting the ``Max-Age`` and 
138   ``Expires`` attributes of those cookies.
139
b4b8ee 140
6e136f 141 1.0.17 (2009-11-05)
TS 142 -------------------
e0d138 143
TS 144 - Fixed the ``repoze.who.plugins.form.make_plugin`` factory's ``formcallable``
145   argument handling, to allow passing in a dotted name (e.g., from a config
146   file).
147
b4b8ee 148
6b15ee 149 1.0.16 (2009-11-04)
028e4d 150 -------------------
1ec83d 151
8dd881 152 - Exposed ``formcallable`` argument for ``repoze.who.plugins.form.FormPlugin``
TS 153   to the callers of the ``repoze.who.plugins.form.make_plugin`` factory.
154   Thanks to Roland Hedburg for the report.
21a9c5 155
8dd881 156 - Fixed an issue that caused the following symptom when using the
TS 157   ini configuration parser::
158
159    TypeError: _makePlugin() got multiple values for keyword argument 'name'
21a9c5 160
CM 161   See http://bugs.repoze.org/issue92 for more details.  Thanks to vaab
162   for the bug report and initial fix.
163
1ec83d 164
7141c7 165 1.0.15 (2009-06-25)
TS 166 -------------------
299b4c 167
a14163 168 - If the form post value ``max_age`` exists while in the ``identify``
CM 169   method is handling the ``login_handler_path``, pass the max_age
170   value in the returned identity dictionary as ``max_age``.  See the
171   below bullet point for why.
172
299b4c 173 - If the ``identity`` dict passed to the ``auth_tkt`` ``remember``
CM 174   method contains a ``max_age`` key with a string (or integer) value,
175   treat it as a cue to set the ``Max-Age`` and ``Expires`` headers in
176   the returned cookies.  The cookie ``Max-Age`` is set to the value
177   and the ``Expires`` is computed from the current time.
178
7141c7 179
TS 180 1.0.14 (2009-06-17)
181 -------------------
9318dd 182
1810b2 183 - Fix test breakage on Windows.  See http://bugs.repoze.org/issue79 .
TS 184
00a6d9 185 - Documented issue with using ``include_ip`` setting in the ``auth_tkt``
TS 186   plugin.  See http://bugs.repoze.org/issue81 .
187
0dd808 188 - Added 'passthrough_challenge_decider', which avoids re-challenging 401
TS 189   responses which have been "pre-challenged" by the application.
190
9318dd 191 - One-hundred percent unit test coverage.
TS 192
a6f6dc 193 - Add ``timeout`` and ``reissue_time`` arguments to the auth_tkt
CM 194   identifier plugin, courtesty of Paul Johnston.
195
196 - Add a ``userid_checker`` argument to the auth_tkt identifier plugin,
197   courtesty of Gustavo Narea.
198
199   If ``userid_checker`` is provided, it must be a dotted Python name
200   that resolves to a function which accepts a userid and returns a
201   boolean True or False, indicating whether that user exists in a
202   database.  This is a workaround.  Due to a design bug in repoze.who,
203   the only way who can check for user existence is to use one or more
204   IAuthenticator plugin ``authenticate`` methods.  If an
205   IAuthenticator's ``authenticate`` method returns true, it means that
206   the user exists.  However most IAuthenticator plugins expect *both*
207   a username and a password, and will return False unconditionally if
208   both aren't supplied.  This means that an authenticator can't be
209   used to check if the user "only" exists.  The identity provided by
210   an auth_tkt does not contain a password to check against.  The
211   actual design bug in repoze.who is this: when a user presents
212   credentials from an auth_tkt, he is considered "preauthenticated".
213   IAuthenticator.authenticate is just never called for a
214   "preauthenticated" identity, which works fine, but it means that the
215   user will be considered authenticated even if you deleted the user's
216   record from whatever database you happen to be using.  However, if
217   you use a userid_checker, you can ensure that a user exists for the
218   auth_tkt supplied userid.  If the userid_checker returns False, the
219   auth_tkt credentials are considered "no good".
220
7141c7 221
TS 222 1.0.13 (2009-04-24)
223 -------------------
64ba13 224
TS 225 - Added a paragraph to ``IAuthenticator`` docstring, documenting that plugins
226   are allowed to add keys to the ``identity`` dictionary (e.g., to save a
ced7bd 227   second database query in an ``IMetadataProvider`` plugin).
64ba13 228
08b2ae 229 - Patch supplied for issue #71 (http://bugs.repoze.org/issue71)
CM 230   whereby a downstream app can return a generator, relying on an
231   upstream component to call start_response.  We do this because the
232   challenge decider needs the status and headers to decide what to do.
233
56d0c5 234
7141c7 235 1.0.12 (2009-04-19)
TS 236 -------------------
56d0c5 237 - auth_tkt plugin tried to append REMOTE_USER_TOKENS data to
CM 238   existing tokens data returned by auth_tkt.parse_tkt; this was
239   incorrect; just overwrite.
0ee58d 240
TS 241 - Extended auth_tkt plugin factory to allow passing secret in a separate
242   file from the main config file.  See http://bugs.repoze.org/issue40 .
243
7141c7 244
TS 245 1.0.11 (2009-04-10)
246 -------------------
afbbcd 247
8c20ba 248 - Fix auth_tkt plugin; cookie values are now quoted, making it possible
CM 249   to put spaces and other whitespace, etc in usernames. (thanks to Michael
95736b 250   Pedersen).
8c20ba 251
afbbcd 252 - Fix corner case issue of an exception raised when attempting to log
CM 253   when there are no identifiers or authenticators.
254
7141c7 255
TS 256 1.0.10 (2009-01-23)
257 -------------------
7b931d 258
CM 259 - The RedirectingFormPlugin now passes along SetCookie headers set
260   into the response by the application within the NotFound response
261   (fixes TG2 "flash" issue).
262
7141c7 263
TS 264 1.0.9 (2008-12-18)
265 ------------------
30ab69 266
9238cd 267 - The RedirectingFormPlugin now attempts to find a header named
CM 268   ``X-Authentication-Failure-Reason`` among the response headers set
269   by the application when a challenge is issued.  If a value for this
270   header exists (and is non-blank), the value is attached to the
271   redirect URL's query string as the ``reason`` parameter (or a
272   user-settable key).  This makes it possible for downstream
273   applications to issue a response that initiates a challenge with
274   this header and subsequently display the reason in the login form
275   rendered as a result of the challenge.
30ab69 276
7141c7 277
TS 278 1.0.8 (2008-12-13)
279 ------------------
186ff6 280
9238cd 281 - The ``PluggableAuthenticationMiddleware`` constructor accepts a
CM 282   ``log_stream`` argument, which is typically a file.  After this
283   release, it can also be a PEP 333 ``Logger`` instance; if it is a
284   PEP 333 ``Logger`` instance, this logger will be used as the
285   repoze.who logger (instead of one being constructed by the
286   middleware, as was previously always the case).  When the
287   ``log_stream`` argument is a PEP 333 Logger object, the
288   ``log_level`` argument is ignored.
186ff6 289
7141c7 290
TS 291 1.0.7 (2008-08-28)
292 ------------------
37de44 293
9238cd 294 - ``repoze.who`` and ``repoze.who.plugins`` were not added to the
CM 295   ``namespace_packages`` list in setup.py, potentially making 1.0.6 a
296   brownbag release, given that making these packages namespace
297   packages was the only reason for its release.
37de44 298
7141c7 299
TS 300 1.0.6 (2008-08-28)
301 ------------------
facdf8 302
9238cd 303 - Make repoze.who and repoze.who.plugins into namespace packages
CM 304   mainly so we can allow plugin authors to distribute packages in the
305   repoze.who.plugins namespace.
facdf8 306
7141c7 307
TS 308 1.0.5 (2008-08-23)
309 ------------------
519300 310
9238cd 311 - Fix auth_tkt plugin to set the same cookies in its ``remember``
CM 312   method that it does in its ``forget`` method.  Previously, logging
313   out and relogging back in to a site that used auth_tkt identifier
314   plugin was slightly dicey and would only work sometimes.
facdf8 315
9238cd 316 - The FormPlugin plugin has grown a redirect-on-unauthorized feature.
CM 317   Any response from a downstream application that causes a challenge
318   and includes a Location header will cause a redirect to the value of
319   the Location header.
dee08c 320
7141c7 321
TS 322 1.0.4 (2008-08-22)
323 ------------------
b95a59 324
9238cd 325 - Added a key to the '[general]' config section: ``remote_user_key``.
CM 326   If you use this key in the config file, it tells who to 1) not
327   perform any authentication if it exists in the environment during
328   ingress and 2) to set the key in the environment for the downstream
329   app to use as the REMOTE_USER variable.  The default is
330   ``REMOTE_USER``.
b95a59 331
9238cd 332 - Using unicode user ids in combination with the auth_tkt plugin would
CM 333   cause problems under mod_wsgi.
55dc7a 334
9238cd 335 - Allowed 'cookie_path' argument to InsecureCookiePlugin (and config
CM 336   constructor).  Thanks to Gustavo Narea.
55dc7a 337
7141c7 338
TS 339 1.0.3 (2008-08-16)
340 ------------------
f693fe 341
9238cd 342 - A bug in the middleware's ``authenticate`` method made it impossible
CM 343   to authenticate a user with a userid that was null (e.g. 0, False),
344   which are valid identifiers.  The only invalid userid is now None.
c7e12d 345
9238cd 346 - Applied patch from Olaf Conradi which logs an error when an invalid
CM 347   filename is passed to the HTPasswdPlugin.
c7e12d 348
7141c7 349
TS 350 1.0.2 (2008-06-16)
351 ------------------
cad90d 352
9238cd 353 - Fix bug found by Chris Perkins: the auth_tkt plugin's "remember"
CM 354   method didn't handle userids which are Python "long" instances
355   properly.  Symptom: TypeError: cannot concatenate 'str' and 'long'
356   objects in "paste.auth.auth_tkt".
a2c030 357
9238cd 358 - Added predicate-based "restriction" middleware support
CM 359   (repoze.who.restrict), allowing configuratio-driven authorization as
360   a WSGI filter.  One example predicate, 'authenticated_predicate', is
361   supplied, which requires that the user be authenticated either via
362   'REMOTE_USER' or via 'repoze.who.identity'.  To use the filter to
363   restrict access::
cad90d 364
TS 365      [filter:authenticated_only]
366      use = egg:repoze.who#authenticated
367
368    or::
369
370      [filter:some_predicate]
371      use = egg:repoze.who#predicate
372      predicate = my.module:some_predicate
373      some_option = a value
374
7141c7 375
TS 376 1.0.1 (2008-05-24)
377 ------------------
8199a1 378
9238cd 379 - Remove dependency-link to dist.repoze.org to prevent easy_install
CM 380   from inserting that path into its search paths (the dependencies are
381   available from PyPI).
8199a1 382
7141c7 383
TS 384 1.0 (2008-05-04)
385 -----------------
419946 386
9238cd 387 - The plugin at plugins.form.FormPlugin didn't redirect properly after
CM 388   collecting identification information.  Symptom: a downstream app
389   would receive a POST request with a blank body, which would
390   sometimes result in a Bad Request error.
f39349 391
9238cd 392 - Fixed interface declarations of
CM 393   'classifiers.default_request_classifier' and
394   'classifiers.default_password_compare'.
515c69 395
9238cd 396 - Added actual config-driven middleware factory,
CM 397   'config.make_middleware_with_config'
515c69 398
9238cd 399 - Removed fossilized 'who_conf' argument from plugin factory functions.
515c69 400
7141c7 401 - Added ConfigParser-based WhoConfig, implementing the spec outlined at
9238cd 402   http://www.plope.com/static/misc/sphinxtest/intro.html#middleware-configuration-via-config-file,
CM 403   with the following changes:
419946 404
7141c7 405   - "Bare" plugins (requiring no configuration options) may be specified
419946 406      as either egg entry points (e.g., 'egg:distname#entry_point_name') or
TS 407      as dotted-path-with-colon (e.g., 'dotted.name:object_id').
408
7141c7 409   - Therefore, the separator between a plugin and its classifier is now
TS 410     a semicolon, rather than a colon. E.g.::
419946 411
TS 412      [plugins:id_plugin]
413      use = egg:another.package#identify_with_frobnatz
414      frobnatz = baz
415
416      [identifiers]
417      plugins =
418        egg:my.egg#identify;browser
419        dotted.name:identifier
420        id_plugin
421
7141c7 422
779caf 423 0.9.1 (2008-04-27)
7141c7 424 ------------------
779caf 425
9238cd 426 - Fix auth_tkt plugin to be able to encode and decode integer user
CM 427   ids.
779caf 428
7141c7 429
88e646 430 0.9 (2008-04-01)
7141c7 431 ----------------
88e646 432
9238cd 433 - Fix bug introduced in FormPlugin in 0.8 release (rememberer headers
CM 434   not set).
88e646 435
9238cd 436 - Add PATH_INFO to started and ended log info.
d9f046 437
9238cd 438 - Add a SQLMetadataProviderPlugin (in plugins/sql).
d9f046 439
9238cd 440 - Change constructor of SQLAuthenticatorPlugin: it now accepts only
CM 441   "query", "conn_factory", and "compare_fn".  The old constructor
442   accepted a DSN, but some database systems don't use DBAPI DSNs.  The
443   new constructor accepts no DSN; the conn_factory is assumed to do
444   all the work to make a connection, including knowing the DSN if one
445   is required.  The "conn_factory" should return something that, when
446   called with no arguments, returns a database connection.
d9f046 447
9238cd 448 - The "make_plugin" helper in plugins/sql has been renamed
CM 449   "make_authenticator_plugin".  When called, this helper will return a
450   SQLAuthenticatorPlugin.  A bit of helper logic in the
451   "make_authenticator_plugin" allows a connection factory to be
452   computed.  The top-level callable referred to by conn_factory in
453   this helper should return a function that, when called with no
454   arguments, returns a datbase connection.  The top-level callable
455   itself is called with "who_conf" (global who configuration) and any
456   number of non-top-level keyword arguments as they are passed into
457   the helper, to allow for a DSN or URL or whatever to be passed in.
d9f046 458
9238cd 459 - A "make_metatata_plugin" helper has been added to plugins/sql. When
CM 460   called, this will make a SQLMetadataProviderPlugin.  See the
461   implementation for details.  It is similar to the
462   "make_authenticator_plugin" helper.
d9f046 463
7141c7 464
cbe4e3 465 0.8 (2008-03-27)
7141c7 466 ----------------
b5a331 467
9238cd 468 - Add a RedirectingFormIdentifier plugin.  This plugin is willing to
CM 469   redirect to an external (or downstream application) login form to
470   perform identification.  The external login form must post to the
471   "login_handler_path" of the plugin (optimally with a "came_from"
472   value to tell the plugin where to redirect the response to if the
473   authentication works properly).  The "logout_handler_path" of this
474   plugin can be visited to perform a logout.  The "came_from" value
475   also works there.
a400b0 476
9238cd 477 - Identifier plugins are now permitted to set a key in the environment
CM 478   named 'repoze.who.application' on ingress (in 'identify').  If an
479   identifier plugin does so, this application is used instead of the
480   "normal" downstream application.  This feature was added to more
481   simply support the redirecting form identifier plugin.
a400b0 482
7141c7 483
a400b0 484 0.7 (2008-03-26)
7141c7 485 ----------------
a400b0 486
9238cd 487 - Change the IMetadataProvider interface: this interface used to have
CM 488   a "metadata" method which returned a dictionary.  This method is not
489   part of that API anymore.  It's been replaced with an "add_metadata"
490   method which has the signature::
b5a331 491
CM 492     def add_metadata(environ, identity):
493         """
494         Add metadata to the identity (which is a dictionary)
495         """
496
497    The return value is ignored.  IMetadataProvider plugins are now
498    assumed to be responsible for 'scribbling' directly on the identity
499    that is passed in (it's a dictionary).  The user id can always be
500    retrieved from the identity via identity['repoze.who.userid'] for
501    metadata plugins that rely on that value.
502
7141c7 503
a400b0 504 0.6 (2008-03-20)
7141c7 505 ----------------
e35c64 506
9238cd 507 - Renaming: repoze.pam is now repoze.who
cb5426 508
9238cd 509 - Bump ez_setup.py version.
e35c64 510
9238cd 511 - Add IMetadataProvider plugin type.  Chris says 'Whit rules'.
fa9581 512
7141c7 513
3b67e9 514 0.5 (2008-03-09)
7141c7 515 ----------------
db4cf5 516
9238cd 517 - Allow "remote user key" (default: REMOTE_USER) to be overridden
CM 518   (pass in remote_user_key to middleware constructor).
db4cf5 519
9238cd 520 - Allow form plugin to override the default form.
db4cf5 521
9238cd 522 - API change: IIdentifiers are no longer required to put both 'login'
CM 523   and 'password' in a returned identity dictionary.  Instead, an
524   IIdentifier can place arbitrary key/value pairs in the identity
525   dictionary (or return an empty dictionary).
40a968 526
9238cd 527 - API return value change: the "failure" identity which IIdentifiers
CM 528   return is now None rather than an empty dictionary.
40a968 529
9238cd 530 - The IAuthenticator interface now specifies that IAuthenticators must
CM 531   not raise an exception when evaluating an identity that does not
532   have "expected" key/value pairs (e.g. when an IAuthenticator that
533   expects login and password inspects an identity returned by an
534   IP-based auth system which only puts the IP address in the
535   identity); instead they fail gracefully by returning None.
40a968 536
9238cd 537 - Add (cookie) "auth_tkt" identification plugin.
a5b033 538
9238cd 539 - Stamp identity dictionaries with a userid by placing a key named
CM 540   'repoze.pam.userid' into the identity for each authenticated
541   identity.
a5b033 542
9238cd 543 - If an IIdentifier plugin inserts a 'repoze.pam.userid' key into the
CM 544   identity dictionary, consider this identity "preauthenticated".  No
545   authenticator plugins will be asked to authenticate this identity.
546   This is designed for things like the recently added auth_tkt plugin,
547   which embeds the user id into the ticket.  This effectively alllows
548   an IIdentifier plugin to become an IAuthenticator plugin when
549   breaking apart the responsibility into two separate plugins is
550   "make-work".  Preauthenticated identities will be selected first
551   when deciding which identity to use for any given request.
a5b033 552
9238cd 553 - Insert a 'repoze.pam.identity' key into the WSGI environment on
CM 554   ingress if an identity is found.  Its value will be the identity
555   dictionary related to the identity selected by repoze.pam on
556   ingress.  Downstream consumers are allowed to mutate this
557   dictionary; this value is passed to "remember" and "forget", so its
558   main use is to do a "credentials reset"; e.g. a user has changed his
559   username or password within the application, but we don't want to
560   force him to log in again after he does so.
a5b033 561
7141c7 562
247f34 563 0.4 (03-07-2008)
7141c7 564 ----------------
247f34 565
9238cd 566 - Allow plugins to specify a classifiers list per interface (instead
CM 567   of a single classifiers list per plugin).
247f34 568
7141c7 569
fb510d 570 0.3 (03-05-2008)
7141c7 571 ----------------
fb510d 572
9238cd 573 - Make SQLAuthenticatorPlugin's default_password_compare use hexdigest
CM 574   sha instead of base64'ed binary sha for simpler conversion.
fb510d 575
7141c7 576
196bc2 577 0.2 (03-04-2008)
7141c7 578 ----------------
196bc2 579
9238cd 580 - Added SQLAuthenticatorPlugin (see plugins/sql.py).
196bc2 581
7141c7 582
318832 583 0.1 (02-27-2008)
7141c7 584 ----------------
318832 585
9238cd 586 - Initial release (no configuration file support yet).