{ "info": { "author": "Ming Chen", "author_email": "mockey.chen@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP" ], "description": "Django CAS NG\n=============\n\n.. image:: https://travis-ci.org/mingchen/django-cas-ng.svg?branch=master\n :target: https://travis-ci.org/mingchen/django-cas-ng\n\n\n``django-cas-ng`` is a Central Authentication Service (CAS) client implementation.\nThis project inherits from `django-cas`_ (which has not been updated since\nApril 2013). The NG stands for \"next generation\". Our fork will include\nbugfixes and new features contributed by the community.\n\n\nFeatures\n--------\n\n- Supports CAS_ versions 1.0, 2.0 and 3.0.\n- Support Single Sign Out\n- Supports Token auth schemes\n- Can fetch Proxy Granting Ticket\n- Supports Django 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 1.11 and 2.0\n- Supports using a `User custom model`_\n- Supports Python 2.7, 3.x\n\n\nInstallation\n------------\n\nInstall with `pip`_::\n\n pip install django-cas-ng\n\n\nInstall the latest code::\n\n pip install https://github.com/mingchen/django-cas-ng/archive/master.zip\n\n\nInstall from source code::\n\n python setup.py install\n\n\nSettings\n--------\n\nNow add it to the middleware, authentication backends and installed apps in your settings.\nMake sure you also have the authentication middleware installed.\nHere's an example:\n\n.. code-block:: python\n\n INSTALLED_APPS = (\n 'django.contrib.admin',\n 'django.contrib.auth',\n 'django.contrib.contenttypes',\n 'django.contrib.sessions',\n 'django.contrib.messages',\n 'django.contrib.staticfiles',\n 'django_cas_ng',\n ...\n )\n\n MIDDLEWARE_CLASSES = (\n 'django.middleware.common.CommonMiddleware',\n 'django.contrib.sessions.middleware.SessionMiddleware',\n 'django.contrib.auth.middleware.AuthenticationMiddleware',\n\t'django_cas_ng.middleware.CASMiddleware',\n ...\n )\n\n AUTHENTICATION_BACKENDS = (\n 'django.contrib.auth.backends.ModelBackend',\n 'django_cas_ng.backends.CASBackend',\n )\n\nSet the following required setting in ``settings.py``:\n\n* ``CAS_SERVER_URL``: This is the only setting you must explicitly define.\n Set it to the base URL of your CAS source (e.g. https://account.example.com/cas/).\n\nOptional settings include:\n\n* ``CAS_ADMIN_PREFIX``: The URL prefix of the Django administration site.\n If undefined, the CAS middleware will check the view being rendered to\n see if it lives in ``django.contrib.admin.views``.\n* ``CAS_CREATE_USER``: Create a user when the CAS authentication is successful.\n The default is ``True``.\n* ``CAS_CREATE_USER_WITH_ID``: Create a user using the ``id`` field provided by\n the attributes returned by the CAS provider. Default is ``False``. Raises\n ``ImproperlyConfigured`` exception if attributes are not provided or do not\n contain the field ``id``.\n* ``CAS_LOGIN_MSG``: Welcome message send via the messages framework upon\n successful authentication. Take the user login as formatting argument.\n The default is ``\"Login succeeded. Welcome, %s.\"`` or some translation of it\n if you have enabled django internationalization (``USE_I18N = True``)\n You cas disable it by setting this parametter to ``None``\n* ``CAS_LOGGED_MSG``: Welcome message send via the messages framework upon\n authentication attempt if the user is already authenticated.\n Take the user login as formatting argument.\n The default is ``\"You are logged in as %s.\"`` or some translation of it\n if you have enabled django internationalization (``USE_I18N = True``)\n You cas disable it by setting this parametter to ``None``\n* ``CAS_EXTRA_LOGIN_PARAMS``: Extra URL parameters to add to the login URL\n when redirecting the user. Example::\n\n CAS_EXTRA_LOGIN_PARAMS = {'renew': true}\n\n If you need these parameters to be dynamic, then we recommend to implement\n a wrapper for our default login view (the same can be done in case of the\n logout view). See an example in the section below.\n\n* ``CAS_RENEW``: whether pass ``renew`` parameter on login and verification\n of ticket to enforce that the login is made with a fresh username and password\n verification in the CAS server. Default is ``False``.\n* ``CAS_IGNORE_REFERER``: If ``True``, logging out of the application will\n always send the user to the URL specified by ``CAS_REDIRECT_URL``.\n* ``CAS_LOGOUT_COMPLETELY``: If ``False``, logging out of the application\n won't log the user out of CAS as well.\n* ``CAS_REDIRECT_URL``: Where to send a user after logging in or out if\n there is no referrer and no next page set. This setting also accepts named\n URL patterns. Default is ``/``.\n* ``CAS_RETRY_LOGIN``: If ``True`` and an unknown or invalid ticket is\n received, the user is redirected back to the login page.\n* ``CAS_STORE_NEXT``: If ``True``, the page to redirect to following login will be stored\n as a session variable, which can avoid encoding errors depending on the CAS implementation.\n* ``CAS_VERSION``: The CAS protocol version to use. ``'1'`` ``'2'`` ``'3'`` and ``'CAS_2_SAML_1_0'`` are\n supported, with ``'2'`` being the default.\n* ``CAS_USERNAME_ATTRIBUTE``: The CAS user name attribute from response. The default is ``uid``.\n* ``CAS_PROXY_CALLBACK``: The full url to the callback view if you want to\n retrive a Proxy Granting Ticket\n* ``CAS_ROOT_PROXIED_AS``: Useful if behind a proxy server. If host is listening on http://foo.bar:8080 but request\n is https://foo.bar:8443. Add CAS_ROOT_PROXIED_AS = 'https://foo.bar:8443' to your settings.\n* ``CAS_FORCE_CHANGE_USERNAME_CASE``: If ``lower``, usernames returned from CAS are lowercased before\n we check whether their account already exists. Allows user `Joe` to log in to CAS either as\n `joe` or `JOE` without duplicate accounts being created by Django (since Django allows\n case-sensitive duplicates). If ``upper``, the submitted username will be uppercased. Default is ``False``.\n* ``CAS_APPLY_ATTRIBUTES_TO_USER``: If ``True`` any attributes returned by the CAS provider\n included in the ticket will be applied to the User model returned by authentication. This is\n useful if your provider is including details about the User which should be reflected in your model.\n The default is ``False``.\n* ``CAS_RENAME_ATTRIBUTES``: a dict used to rename the (key of the) attributes that the CAS server may retrun.\n For example, if ``CAS_RENAME_ATTRIBUTES = {'ln':'last_name'}`` the ``ln`` attribute returned by the cas server\n will be renamed as ``last_name``. Used with ``CAS_APPLY_ATTRIBUTES_TO_USER = True``, this provides an easy way\n to fill in Django Users' info independtly from the attributes' keys returned by the CAS server.\n* ``CAS_VERIFY_SSL_CERTIFICATE``: If ``False`` CAS server certificate won't be verified. This is useful when using a\n CAS test server with a self-signed certificate in a development environment. Default is ``True``.\n\nMake sure your project knows how to log users in and out by adding these to\nyour URL mappings:\n\n.. code-block:: python\n\n import django_cas_ng.views\n\n url(r'^accounts/login$', django_cas_ng.views.login, name='cas_ng_login'),\n url(r'^accounts/logout$', django_cas_ng.views.logout, name='cas_ng_logout'),\n\nIf you use the middleware, the ``login`` url must given the name ``cas_ng_login`` or it will create redirection issues.\n\nYou should also add an URL mapping for the ``CAS_PROXY_CALLBACK`` settings:\n\n.. code-block:: python\n\n url(r'^accounts/callback$', django_cas_ng.views.callback, name='cas_ng_proxy_callback'),\n\n\nRun ``./manage.py syncdb`` to create Single Sign On and Proxy Granting Ticket tables.\nOn update you can just delete the ``django_cas_ng_sessionticket`` table and the\n``django_cas_ng_proxygrantingticket`` before calling ``./manage.py syncdb``.\n\nConsider running the command ``./manage.py django_cas_ng_clean_sessions`` on a regular basis\nright after the command ``./manage.py clearsessions`` cf `clearsessions`_.\nIt could be a good idea to put it in the crontab.\n\nUsers should now be able to log into your site using CAS.\n\nView-wrappers example\n---------------------\n\nThe ``settings.CAS_EXTRA_LOGIN_PARAMS`` allows you to define a static\ndictionary of extra parameters to be passed on to the CAS login page. But what\nif you want this dictionary to be dynamic (e.g. based on user session)?\n\nOur current advice is to implement simple wrappers for our default views, like\nthese ones:\n\n.. code-block:: python\n\n from django_cas_ng import views as baseviews\n\n @csrf_exempt\n def login(request, **kwargs):\n return _add_locale(request, baseviews.login(request, **kwargs))\n\n\n def logout(request, **kwargs):\n return _add_locale(request, baseviews.logout(request, **kwargs))\n\n\n def _add_locale(request, response):\n \"\"\"If the given HttpResponse is a redirect to CAS, then add the proper\n `locale` parameter to it (and return the modified response). If not, simply\n return the original response.\"\"\"\n\n if (\n isinstance(response, HttpResponseRedirect)\n and response['Location'].startswith(settings.CAS_SERVER_URL)\n ):\n from ourapp.some_module import get_currently_used_language\n url = response['Location']\n url += '&' if '?' in url else '&'\n url += \"locale=%s\" % get_currently_used_language(request)\n response['Location'] = url\n return response\n\nCustom backends\n---------------\n\nThe ``CASBackend`` class is heavily inspired from Django's own\n``RemoteUserBackend`` and allows for some configurability through subclassing\nif you need more control than django-cas-ng's settings provide. For instance,\nhere is an example backend that only allows some users to login through CAS:\n\n.. code-block:: python\n\n from django_cas_ng.backends import CASBackend\n\n class MyCASBackend(CASBackend):\n def user_can_authenticate(self, user):\n if user.has_permission('can_cas_login'):\n return True\n return False\n\nIf you need more control over the authentication mechanism of your project than\ndjango-cas-ng's settings provide, you can create your own authentication\nbackend that inherits from ``django_cas_ng.backends.CASBackend`` and override\nthese attributes or methods:\n\n**CASBackend.clean_username(username)**\n\nPerforms any cleaning on the ``username`` prior to using it to get or create a\n``User`` object. Returns the cleaned username. The default implementations\nchanges the case according to the value of ``CAS_FORCE_CHANGE_USERNAME_CASE``.\n\n**CASBackend.user_can_authenticate(user)**\n\nReturns whether the user is allowed to authenticate. For consistency with\nDjango's own behavior, django-cas-ng will allow all users to authenticate\nthrough CAS on Django versions lower than 1.10; starting with Django 1.10\nhowever, django-cas-ng will prevent users with ``is_active=False`` from\nauthenticating.\n\n**CASBackend.configure_user(user)**\n\nConfigures a newly created user. This method is called immediately after a new\nuser is created, and can be used to perform custom setup actions. Returns the\nuser object.\n\n**CASBackend.bad_attributes_reject(request, username, attributes)**\n\nRejects a user if the returned username/attributes are not OK. For example, to\naccept a user belonging to departmentNumber 421 only, define in ``mysite/settings.py``\nthe key-value constant:\n\n.. code-block:: python\n\n MY_ATTRIBUTE_CONTROL = ('departmentNumber', '421')\n\nand the authentication backends:\n\n.. code-block:: python\n\n AUTHENTICATION_BACKENDS = [\n 'django.contrib.auth.backends.ModelBackend',\n\t'mysite.backends.MyCASBackend',\n ]\n\nand create a file ``mysite/backends.py`` containing:\n\n.. code-block:: python\n\n from django_cas_ng.backends import CASBackend\n from django.contrib import messages\n from django.conf import settings\n\n\n class MyCASBackend(CASBackend):\n def user_can_authenticate(self, user):\n return True\n\n def bad_attributes_reject(self, request, username, attributes):\n attribute = settings.MY_ATTRIBUTE_CONTROL[0]\n value = settings.MY_ATTRIBUTE_CONTROL[1]\n\n if attribute not in attributes:\n message = 'No \\''+ attribute + '\\' in SAML attributes'\n messages.add_message(request, messages.ERROR, message)\n return message\n\n if value not in attributes[attribute]:\n message = 'User ' + str(username) + ' is not in ' + value + ' ' + attribute + ', should be one of ' + str(attributes[attribute])\n messages.add_message(request, messages.ERROR, message)\n return message\n\n return None\n\n\nSignals\n-------\n\ndjango_cas_ng.signals.cas_user_authenticated\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSent on successful authentication, the ``CASBackend`` will fire the ``cas_user_authenticated`` signal.\n\n**Arguments sent with this signal**\n\n**sender**\n The authentication backend instance that authenticated the user.\n\n**user**\n The user instance that was just authenticated.\n\n**created**\n Boolean as to whether the user was just created.\n\n**attributes**\n Attributes returned during by the CAS during authentication.\n\n**ticket**\n The ticket used to authenticate the user with the CAS.\n\n**service**\n The service used to authenticate the user with the CAS.\n\n**request**\n The request that was used to login.\n\n\ndjango_cas_ng.signals.cas_user_logout\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nSent on user logout. Will be fired over manual logout or logout via CAS SingleLogOut query.\n\n**Arguments sent with this signal**\n\n**sender**\n ``manual`` if manual logout, ``slo`` on SingleLogOut\n\n**user**\n The user instance that is logged out.\n\n**session**\n The current session we are loging out.\n\n**ticket**\n The ticket used to authenticate the user with the CAS. (if found, else value if set to ``None``)\n\n\nProxy Granting Ticket\n---------------------\n\nIf you want your application to be able to issue Proxy Ticket to authenticate against some other CAS application,\nsetup the CAS_PROXY_CALLBACK parameter.\nAllow on the CAS config django_cas_ng to act as a Proxy application.\nThen after a user has logged in using the CAS, you can retrieve a Proxy Ticket as follow:\n\n.. code-block:: python\n\n from django_cas_ng.models import ProxyGrantingTicket\n\n def my_pretty_view(request, ...):\n proxy_ticket = ProxyGrantingTicket.retrieve_pt(request, service)\n\nwhere ``service`` is the service url for which you want a proxy ticket.\n\n\nInternationalization\n--------------------\n\nYou can contribute to the translation of welcome messages by running ``django-admin makemessages -l lang_code``\ninside of the django_cas_ng directory. Where ``lang_code`` is the language code for which you want to submit a\ntranslation. Then open the file ``django_cas_ng/locale/lang_code/LC_MESSAGES/django.po`` with a gettex translations\neditor (for example https://poedit.net/). Translate and save the file.\nThink to add ``django_cas_ng/locale/lang_code/LC_MESSAGES/django.po`` to repo. Please do not add ``django_cas_ng/locale/lang_code/LC_MESSAGES/django.mo`` to repo since .mo file can be generated by .po file.\n\n\nTesting\n-------\n\nEvery code commit triggers a **travis-ci** build. checkout current build status at https://travis-ci.org/mingchen/django-cas-ng\n\nTesting is managed by ``pytest`` and ``tox``.\nBefore run install, you need install required packages for testing::\n\n pip install -r requirements-dev.txt\n\n\nTo run testing on locally::\n\n py.test\n\n\nTo run all testing on all enviroments locally::\n\n tox\n\n\nContribution\n------------\n\nContributions are welcome!\n\nIf you would like to contribute this project.\nPlease feel free to fork and send pull request.\nPlease make sure tests are passed.\nAlso welcome to add your name to **Credits** section of this document.\n\nNew code should follow both `PEP8`_ and the `Django coding style`_.\n\n\nCredits\n-------\n\n* `django-cas`_\n* `Stefan Horomnea`_\n* `Piotr Buli\u0144ski`_\n* `Piper Merriam`_\n* `Nathan Brown`_\n* `Jason Brownbridge`_\n* `Bryce Groff`_\n* `Jeffrey P Gill`_\n* `timkung1`_\n* `Domingo Yeray Rodr\u00edguez Mart\u00edn`_\n* `Rayco Abad-Mart\u00edn`_\n* `\u00c9douard Lopez`_\n* `Guillaume Vincent`_\n* `Wojciech Rygielski`_\n* `Valentin Samir`_\n* `Alexander Kavanaugh`_\n* `Daniel Davis`_\n* `Peter Baehr`_\n\nReferences\n----------\n\n* `django-cas`_\n* `CAS protocol`_\n* `Jasig CAS server`_\n\n.. _CAS: https://www.apereo.org/cas\n.. _CAS protocol: https://www.apereo.org/cas\n.. _django-cas: https://bitbucket.org/cpcc/django-cas\n.. _clearsessions: https://docs.djangoproject.com/en/1.8/topics/http/sessions/#clearing-the-session-store\n.. _pip: http://www.pip-installer.org/\n.. _PEP8: http://www.python.org/dev/peps/pep-0008\n.. _Django coding style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style\n.. _User custom model: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/\n.. _Jasig CAS server: http://jasig.github.io/cas\n.. _Piotr Buli\u0144ski: https://github.com/piotrbulinski\n.. _Stefan Horomnea: https://github.com/choosy\n.. _Piper Merriam: https://github.com/pipermerriam\n.. _Nathan Brown: https://github.com/tsitra\n.. _Jason Brownbridge: https://github.com/jbrownbridge\n.. _Bryce Groff: https://github.com/bgroff\n.. _Jeffrey P Gill: https://github.com/jpg18\n.. _timkung1: https://github.com/timkung1\n.. _Domingo Yeray Rodr\u00edguez Mart\u00edn: https://github.com/dyeray\n.. _Rayco Abad-Mart\u00edn: https://github.com/Rayco\n.. _\u00c9douard Lopez: https://github.com/edouard-lopez\n.. _Guillaume Vincent: https://github.com/guillaumevincent\n.. _Wojciech Rygielski: https://github.com/wrygiel\n.. _Valentin Samir: https://github.com/nitmir\n.. _Alexander Kavanaugh: https://github.com/kavdev\n.. _Daniel Davis: https://github.com/danizen\n.. _Peter Baehr: https://github.com/pbaehr\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/mingchen/django-cas-ng/releases", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mingchen/django-cas-ng", "keywords": "django,cas,cas2,cas3,client,sso,single sign-on,authentication,auth", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "django-cas-ng", "package_url": "https://pypi.org/project/django-cas-ng/", "platform": "", "project_url": "https://pypi.org/project/django-cas-ng/", "project_urls": { "Download": "https://github.com/mingchen/django-cas-ng/releases", "Homepage": "https://github.com/mingchen/django-cas-ng" }, "release_url": "https://pypi.org/project/django-cas-ng/3.6.0/", "requires_dist": [ "Django (>=1.11)", "python-cas (>=1.4.0)" ], "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "CAS 1.0/2.0 client authentication backend for Django (inherited from django-cas)", "version": "3.6.0" }, "last_serial": 4521640, "releases": { "3.0.0": [ { "comment_text": "", "digests": { "md5": "041f792aede9e87b0b1a43bce48beaf3", "sha256": "a13601089490dbd564ce1dc17b21b4c7321a587f8b245d73b117b446c92c1acd" }, "downloads": -1, "filename": "django-cas-ng-3.0.0.tar.gz", "has_sig": false, "md5_digest": "041f792aede9e87b0b1a43bce48beaf3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6416, "upload_time": "2014-05-23T23:29:26", "url": "https://files.pythonhosted.org/packages/e9/5e/a0740f68c9ef3e01770014b3bc8e229db3cd125e0a7276f58ebd6c085f23/django-cas-ng-3.0.0.tar.gz" } ], "3.1.0": [ { "comment_text": "", "digests": { "md5": "76b7817e2a98826c16ff034b71e742cf", "sha256": "a3878ce40f348a6efa8e7fddbf9dba275a7ff0bdcf89fd2f60d08e5b252201e6" }, "downloads": -1, "filename": "django-cas-ng-3.1.0.tar.gz", "has_sig": false, "md5_digest": "76b7817e2a98826c16ff034b71e742cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7922, "upload_time": "2014-05-27T18:42:48", "url": "https://files.pythonhosted.org/packages/3c/ec/ffe443dadca83c402a5b5fedb068ca93501bdbe117c1ca8920e7cb60b79a/django-cas-ng-3.1.0.tar.gz" } ], "3.2.0": [ { "comment_text": "", "digests": { "md5": "96cbaa390751e2ccbb6d0ef91a9962ed", "sha256": "878e2431d75c7381eac8e71b51f51b8dc5206bc386f7ab699ac2e30164f346a4" }, "downloads": -1, "filename": "django-cas-ng-3.2.0.tar.gz", "has_sig": false, "md5_digest": "96cbaa390751e2ccbb6d0ef91a9962ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8441, "upload_time": "2014-10-25T16:36:23", "url": "https://files.pythonhosted.org/packages/ad/c7/347187554594e425d5cfed55c68aa1e8c451508f347ad3c68601fdb1df7a/django-cas-ng-3.2.0.tar.gz" } ], "3.3.0": [ { "comment_text": "", "digests": { "md5": "94db019911eec753cbae18bf695ffed3", "sha256": "8962f1471ea9453bddcb0a858f06f4461eeef82fd8fceb6dc51bd05c581f84bd" }, "downloads": -1, "filename": "django-cas-ng-3.3.0.tar.gz", "has_sig": false, "md5_digest": "94db019911eec753cbae18bf695ffed3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8636, "upload_time": "2014-11-05T22:19:16", "url": "https://files.pythonhosted.org/packages/db/8b/59f771ac161b1a49748c03b424502305d2d720e7255461a396055f2336e7/django-cas-ng-3.3.0.tar.gz" } ], "3.4.0": [ { "comment_text": "", "digests": { "md5": "a10d52d6e4d0554337095b36323ce376", "sha256": "c479a83c8f38b98adca65566281b596949076ea51d962ebc052b576fe115c61f" }, "downloads": -1, "filename": "django-cas-ng-3.4.0.tar.gz", "has_sig": false, "md5_digest": "a10d52d6e4d0554337095b36323ce376", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9482, "upload_time": "2014-11-12T21:27:11", "url": "https://files.pythonhosted.org/packages/fe/46/bc8da738a1945d0bb0d4250cf9e75a5cecaa7cc6115ac60d82af2cac3015/django-cas-ng-3.4.0.tar.gz" } ], "3.4.1": [ { "comment_text": "", "digests": { "md5": "e6f1ffb2d91edd1c3893ab9cd16e6d25", "sha256": "957a5f482deeafa85318f8e2cd7e6c6dd1f3ef7b5864a9e2e2c3e1e8fdc97a59" }, "downloads": -1, "filename": "django-cas-ng-3.4.1.tar.gz", "has_sig": false, "md5_digest": "e6f1ffb2d91edd1c3893ab9cd16e6d25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9797, "upload_time": "2014-11-27T17:54:14", "url": "https://files.pythonhosted.org/packages/27/6a/2707f87e158fa4d47ff17fc3f816cbc1883dc67b36d120b59b0c0c15c001/django-cas-ng-3.4.1.tar.gz" } ], "3.4.2": [ { "comment_text": "", "digests": { "md5": "7982b2749da37834c06481f5fdfa1b3e", "sha256": "1e27acbe740a67e47f5134d7660d6cfcfecf3207e921cadc12791627bcdb4b98" }, "downloads": -1, "filename": "django-cas-ng-3.4.2.tar.gz", "has_sig": false, "md5_digest": "7982b2749da37834c06481f5fdfa1b3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9835, "upload_time": "2015-01-11T22:14:55", "url": "https://files.pythonhosted.org/packages/0f/1a/7a3ee3aed590f746093d817cbca94596def85cf50dcb445ad5fb84bc2f04/django-cas-ng-3.4.2.tar.gz" } ], "3.5.0": [ { "comment_text": "", "digests": { "md5": "e9698eca3b11aa48e944e4e55db43c4c", "sha256": "2defd37b002233b2e09c5c7d29392f9c2c31e86e8d024dfe9b9460ecf8982e78" }, "downloads": -1, "filename": "django-cas-ng-3.5.0.tar.gz", "has_sig": false, "md5_digest": "e9698eca3b11aa48e944e4e55db43c4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13433, "upload_time": "2015-11-08T17:00:10", "url": "https://files.pythonhosted.org/packages/74/31/df013e5a2b9399f3edcac963afc76838b6b26ddac035dad7660a11f7d7ca/django-cas-ng-3.5.0.tar.gz" } ], "3.5.1": [ { "comment_text": "", "digests": { "md5": "537db248d9902907721cae140dda4175", "sha256": "face4ea2762656d2b65d998fcf9073a65ae6fec6ad0405a9edd355ce1fa895c0" }, "downloads": -1, "filename": "django-cas-ng-3.5.1.tar.gz", "has_sig": false, "md5_digest": "537db248d9902907721cae140dda4175", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13390, "upload_time": "2015-11-11T01:14:52", "url": "https://files.pythonhosted.org/packages/06/9d/df7cb9094f096f81b60b7968d8342cce4e1a747bacd3750f8ca8c3b7d8b1/django-cas-ng-3.5.1.tar.gz" } ], "3.5.10": [ { "comment_text": "", "digests": { "md5": "645716458950638f25294b3f178c0c43", "sha256": "055dc859c563c5da61f00ebb920eae82ba49e6cfdeac828f116a204f6bc4a4a6" }, "downloads": -1, "filename": "django-cas-ng-3.5.10.tar.gz", "has_sig": false, "md5_digest": "645716458950638f25294b3f178c0c43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25129, "upload_time": "2018-10-09T18:18:39", "url": "https://files.pythonhosted.org/packages/d4/c0/2b6614a8893d5f9d3927cbf73f41ed58e7e21240597aff169a0a9f4bbd27/django-cas-ng-3.5.10.tar.gz" } ], "3.5.2": [ { "comment_text": "", "digests": { "md5": "23885abb6b735b8a677eee44ba933b0b", "sha256": "4887a1c5633cd8c4a11f571e600471a33e1d9be1dc0b87347689224584288b42" }, "downloads": -1, "filename": "django-cas-ng-3.5.2.tar.gz", "has_sig": false, "md5_digest": "23885abb6b735b8a677eee44ba933b0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13795, "upload_time": "2015-11-19T18:08:42", "url": "https://files.pythonhosted.org/packages/87/79/1e50141bfe7e190f0bc5f7e4c293c1f7680434b2f4b1eb49f7d818cfc9c0/django-cas-ng-3.5.2.tar.gz" } ], "3.5.3": [ { "comment_text": "", "digests": { "md5": "9827883e05ba8f37832f11ce48736704", "sha256": "aa0b7b2088f68dfec07c4be6182a8d8f4b9063b62f3a21264fd2f49aa674cc7a" }, "downloads": -1, "filename": "django-cas-ng-3.5.3.tar.gz", "has_sig": false, "md5_digest": "9827883e05ba8f37832f11ce48736704", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14050, "upload_time": "2015-11-20T18:07:29", "url": "https://files.pythonhosted.org/packages/4a/33/ba406ee8658a34774c311bfff6a400ffa835df7ed83eed7c694b6fcbf6b0/django-cas-ng-3.5.3.tar.gz" } ], "3.5.4": [ { "comment_text": "", "digests": { "md5": "75dab91a7ae1684dbcba01559e4590be", "sha256": "912ee44bc08ae1e66eafa8d054bf0e8567fd4386056e1083cea036df3232d54b" }, "downloads": -1, "filename": "django-cas-ng-3.5.4.tar.gz", "has_sig": false, "md5_digest": "75dab91a7ae1684dbcba01559e4590be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14875, "upload_time": "2016-04-27T19:37:24", "url": "https://files.pythonhosted.org/packages/58/cd/d1490513281c42c40764f59e7b1a9a4d33e764ea809d1bb3162ae6dbc4d5/django-cas-ng-3.5.4.tar.gz" } ], "3.5.5": [ { "comment_text": "", "digests": { "md5": "8d1b7d5098cd522931949be403a0af8e", "sha256": "1dbac459a3dd8ccb2e8dd421e80c3b148afb561d1b6316894a99fcaf0124e69a" }, "downloads": -1, "filename": "django-cas-ng-3.5.5.tar.gz", "has_sig": false, "md5_digest": "8d1b7d5098cd522931949be403a0af8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15089, "upload_time": "2016-09-28T17:34:25", "url": "https://files.pythonhosted.org/packages/f3/2b/09f0eea7e79f7752496fbfde430d453432443ec72e9665c13119f7de86a4/django-cas-ng-3.5.5.tar.gz" } ], "3.5.6": [ { "comment_text": "", "digests": { "md5": "9110e7bafe06c800889c951245f0a26d", "sha256": "d8fba58d34e981f28ceef2ba2aa561fb15e72bca63beb797679c711863ccbafb" }, "downloads": -1, "filename": "django-cas-ng-3.5.6.tar.gz", "has_sig": false, "md5_digest": "9110e7bafe06c800889c951245f0a26d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15099, "upload_time": "2016-11-06T02:47:19", "url": "https://files.pythonhosted.org/packages/58/f6/e0220555b9ba485f8a7f27294967056dcff4ab3a8604a78466989b4d4edd/django-cas-ng-3.5.6.tar.gz" } ], "3.5.7": [ { "comment_text": "", "digests": { "md5": "34cd8b48e882b971900ae49aea931c61", "sha256": "df9cad30fb959ebdf3a114f6353f7cc19514404d6cd7340b4729cf449b4a454c" }, "downloads": -1, "filename": "django-cas-ng-3.5.7.tar.gz", "has_sig": false, "md5_digest": "34cd8b48e882b971900ae49aea931c61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16279, "upload_time": "2017-04-02T05:24:14", "url": "https://files.pythonhosted.org/packages/09/a6/b1b69d017fd977814706fbf1b8e69e4a7c092931d005061f462f91ef994e/django-cas-ng-3.5.7.tar.gz" } ], "3.5.8": [ { "comment_text": "", "digests": { "md5": "4cef171507e29a46fa0c3058eee40629", "sha256": "4d9c2824e7ffbbb006b33771edffa8a91a66ee4e20a1c381af955d7ecdd26b3d" }, "downloads": -1, "filename": "django-cas-ng-3.5.8.tar.gz", "has_sig": false, "md5_digest": "4cef171507e29a46fa0c3058eee40629", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16926, "upload_time": "2017-06-30T15:50:14", "url": "https://files.pythonhosted.org/packages/9b/68/8c56ae5753fce4b1f86df3e76def2a74458432a73c7c16db414e20b4826e/django-cas-ng-3.5.8.tar.gz" } ], "3.5.9": [ { "comment_text": "", "digests": { "md5": "75a84f77d48f6b6547fe8ee9035c2e84", "sha256": "9feed2ba9b4deec172e697f96a65863580e166c8b2f18ea99240694c299ec33a" }, "downloads": -1, "filename": "django-cas-ng-3.5.9.tar.gz", "has_sig": false, "md5_digest": "75a84f77d48f6b6547fe8ee9035c2e84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24453, "upload_time": "2018-03-13T22:02:27", "url": "https://files.pythonhosted.org/packages/a7/ea/4da01fff13f0258e92ee552a2e6aee74d9c8a1e996d0d207f8d116e2e167/django-cas-ng-3.5.9.tar.gz" } ], "3.6.0": [ { "comment_text": "", "digests": { "md5": "7603890276815bbf32cdeb4bd7499042", "sha256": "298b8b7d809b61f31caf188c3a4a568790f259cbac6e4f49ed4cb3ac4f8db9d2" }, "downloads": -1, "filename": "django_cas_ng-3.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7603890276815bbf32cdeb4bd7499042", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 33372, "upload_time": "2018-11-23T19:54:20", "url": "https://files.pythonhosted.org/packages/d7/af/cfdfd22b67ac5e0ffa3259b201a32db4beb2a3244cf7a61172d6ea4bf580/django_cas_ng-3.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2bfb2ec4943ad50a37a751df2d946114", "sha256": "108e6a8bf578b3b817dfcfda25d11b9898856f3e1b82bf69150ffe5198455ba5" }, "downloads": -1, "filename": "django-cas-ng-3.6.0.tar.gz", "has_sig": false, "md5_digest": "2bfb2ec4943ad50a37a751df2d946114", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 25778, "upload_time": "2018-11-23T19:54:22", "url": "https://files.pythonhosted.org/packages/e6/0c/7fe6deefe604c2a1b105a45bcad21cddde78ab44a942e3cb3ed23b8f5867/django-cas-ng-3.6.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7603890276815bbf32cdeb4bd7499042", "sha256": "298b8b7d809b61f31caf188c3a4a568790f259cbac6e4f49ed4cb3ac4f8db9d2" }, "downloads": -1, "filename": "django_cas_ng-3.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7603890276815bbf32cdeb4bd7499042", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 33372, "upload_time": "2018-11-23T19:54:20", "url": "https://files.pythonhosted.org/packages/d7/af/cfdfd22b67ac5e0ffa3259b201a32db4beb2a3244cf7a61172d6ea4bf580/django_cas_ng-3.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2bfb2ec4943ad50a37a751df2d946114", "sha256": "108e6a8bf578b3b817dfcfda25d11b9898856f3e1b82bf69150ffe5198455ba5" }, "downloads": -1, "filename": "django-cas-ng-3.6.0.tar.gz", "has_sig": false, "md5_digest": "2bfb2ec4943ad50a37a751df2d946114", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 25778, "upload_time": "2018-11-23T19:54:22", "url": "https://files.pythonhosted.org/packages/e6/0c/7fe6deefe604c2a1b105a45bcad21cddde78ab44a942e3cb3ed23b8f5867/django-cas-ng-3.6.0.tar.gz" } ] }