{ "info": { "author": "Castle Intelligence, Inc.", "author_email": "info@castle.io", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "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" ], "description": "Python SDK for Castle\n=====================\n\n.. image:: https://travis-ci.org/castle/castle-python.png\n :alt: Build Status\n :target: https://travis-ci.org/castle/castle-python\n\n`Castle `_ **analyzes device, location, and\ninteraction patterns in your web and mobile apps and lets you stop\naccount takeover attacks in real-time.**\n\nInstallation\n------------\n\n``pip install castle``\n\nConfiguration\n-------------\n\nimport and configure the library with your Castle API secret.\n\n.. code:: python\n\n from castle.configuration import configuration\n\n # Same as setting it through Castle.api_secret\n configuration.api_secret = ':YOUR-API-SECRET'\n\n # For authenticate method you can set failover strategies: allow(default), deny, challenge, throw\n configuration.failover_strategy = 'deny'\n\n # Castle::RequestError is raised when timing out in milliseconds (default: 500 milliseconds)\n configuration.request_timeout = 1000\n\n # Whitelisted and Blacklisted headers are case insensitive and allow to use _ and - as a separator, http prefixes are removed\n # Whitelisted headers\n configuration.whitelisted = ['X_HEADER']\n # or append to default\n configuration.whitelisted = configuration.whitelisted + ['http-x-header']\n\n # Blacklisted headers take advantage over whitelisted elements\n configuration.blacklisted = ['HTTP-X-header']\n # or append to default\n configuration.blacklisted = configuration.blacklisted + ['X_HEADER']\n\nTracking\n--------\n\nHere is a simple example of track event.\n\n.. code:: python\n\n from castle.client import Client\n from castle import events\n\n castle = Client.from_request(request)\n castle.track({\n 'event': events.LOGIN_SUCCEEDED,\n 'user_id': 'user_id'\n })\n\nThe client will automatically configure the context for each request.\n\nSignature\n---------\n\n.. code:: python\n\n from secure_mode import signature\n\n signature(user_id)\n\nwill create a signed user_id.\n\nAsync tracking\n--------------\n\nBy default Castle sends requests synchronously. To send requests in a\nbackground worker you can generate data for a worker:\n\n.. code:: python\n\n from castle.client import Client\n from castle import events\n\n context = Client.to_context(request)\n options = Client.to_options({\n 'event': events.LOGIN_SUCCEEDED,\n 'user_id': user.id,\n 'properties': {\n 'key': 'value'\n },\n 'user_traits': {\n 'key': 'value'\n }\n })\n\nand use it later in a way\n\n.. code:: python\n\n from castle.client import Client\n\n client = Client(context)\n client.track(options)\n\nImpersonation mode\n------------------\n\nhttps://castle.io/docs/impersonation\n\n\nExceptions\n----------\n\n``CastleError`` will be thrown if the Castle API returns a 400 or a 500\nlevel HTTP response. You can also choose to catch a more `finegrained\nerror `__.\n\nDocumentation\n-------------\n\nDocumentation and links to additional resources are available at\nhttps://castle.io/docs\n\n.. |Build Status| image:: https://travis-ci.org/castle/castle-python.svg?branch=master\n :target: https://travis-ci.org/castle/castle-python\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/castle/castle-python", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "castle", "package_url": "https://pypi.org/project/castle/", "platform": "", "project_url": "https://pypi.org/project/castle/", "project_urls": { "Homepage": "https://github.com/castle/castle-python" }, "release_url": "https://pypi.org/project/castle/2.3.1/", "requires_dist": [ "requests (>=2.5)" ], "requires_python": "", "summary": "Castle protects your users from account compromise", "version": "2.3.1" }, "last_serial": 5102881, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "c2dc96cf1c12c2028fe7af345f87a483", "sha256": "2ece65401aecedbbd506f662f6245af2cf8d2ac37031b57057c97d01dd775072" }, "downloads": -1, "filename": "castle-0.0.1.tar.gz", "has_sig": false, "md5_digest": "c2dc96cf1c12c2028fe7af345f87a483", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1046, "upload_time": "2016-12-02T18:50:27", "url": "https://files.pythonhosted.org/packages/85/5d/c529b970eeda1593809c8ae265d107167e8beee4a4aaf8956eb5ae584aa6/castle-0.0.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "d541ee4aef828952945c8d47baf616f3", "sha256": "bd6e8ea3dd6663783e9a0063448a56801035a7e591c32219797845890dbb5a07" }, "downloads": -1, "filename": "castle-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d541ee4aef828952945c8d47baf616f3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27709, "upload_time": "2017-10-18T13:09:52", "url": "https://files.pythonhosted.org/packages/ec/dd/3d5972e3912f0990c54b9a9e0fd055672d074ca81c7d9e6413e81a73ebf8/castle-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3028a93272ed71ab6321154a2c968062", "sha256": "b46a21c384e85f5c77f6f8dfcdb888f2ab250335ed1ff70c6376060227aafa32" }, "downloads": -1, "filename": "castle-1.0.0.tar.gz", "has_sig": false, "md5_digest": "3028a93272ed71ab6321154a2c968062", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13020, "upload_time": "2017-10-18T13:09:54", "url": "https://files.pythonhosted.org/packages/8e/2e/d70b9a4f5b7af4ffda1047fff722813cecd17627cab9b3a778d165dfd2f8/castle-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "c7b5ab798c7985a3e1ba568ce3f5050f", "sha256": "7d35aa8c69729d5c3f21fb43cc14a774a4964c9710cb8c06495869ec392db700" }, "downloads": -1, "filename": "castle-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c7b5ab798c7985a3e1ba568ce3f5050f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27837, "upload_time": "2017-12-08T20:54:30", "url": "https://files.pythonhosted.org/packages/6e/02/cb407e86f5c690d7f351db9f7e6f11be903d7d795e9fca7c8b283e338fd0/castle-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d45ad8aca05984c538be78ec878e832a", "sha256": "aaa05bf00126e5d21264d88cf212d5bf420a5d9d85591ba993a59292799a9781" }, "downloads": -1, "filename": "castle-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d45ad8aca05984c538be78ec878e832a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13159, "upload_time": "2017-12-08T20:54:33", "url": "https://files.pythonhosted.org/packages/bb/38/f3d7ed4b8f4ea11f81069a8c9856b46d29a5be2f092923f3a19ef668c61c/castle-1.0.1.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "4f521829bc6264892b7f9c54ce39a2ec", "sha256": "8a50e37a093d5628da02a327faed140494801c708c9f700922ebd45aa04e3a7f" }, "downloads": -1, "filename": "castle-2.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4f521829bc6264892b7f9c54ce39a2ec", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 34019, "upload_time": "2018-02-09T12:13:03", "url": "https://files.pythonhosted.org/packages/26/59/b33ed4b2219fe50a81b5ac0cc25abe44cbf75f620084781a8a9484de4579/castle-2.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fb098f55bb334a8770d80969f3e8a885", "sha256": "744a4222ebb8f0a536c633feab5a0bb7a81017f1efee33f399544bfcdb62aa3d" }, "downloads": -1, "filename": "castle-2.0.0.tar.gz", "has_sig": false, "md5_digest": "fb098f55bb334a8770d80969f3e8a885", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15481, "upload_time": "2018-02-09T12:13:08", "url": "https://files.pythonhosted.org/packages/19/c7/5481042a8def06b7e10e72f492cab01e3a58374400798b76e0a34717abe9/castle-2.0.0.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "eb2783afe8ec1a782c0296bed23b57fb", "sha256": "cb3791c87a76cd16055274c7b7ec90fe0ed0482a1aed1883778637fa0e36ec29" }, "downloads": -1, "filename": "castle-2.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "eb2783afe8ec1a782c0296bed23b57fb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 35705, "upload_time": "2018-02-09T20:24:54", "url": "https://files.pythonhosted.org/packages/dc/51/b804ab183230bfc43a00c8238cf2290b47543441c920d19d8d6bafe0a0ec/castle-2.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "868cd75b61dc17c52d11fa4576037e47", "sha256": "7039c2ad7a832a6c4a702e11e95a7cfc309ebb8deacba3cbecd48757a7f0c086" }, "downloads": -1, "filename": "castle-2.1.0.tar.gz", "has_sig": false, "md5_digest": "868cd75b61dc17c52d11fa4576037e47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16063, "upload_time": "2018-02-09T20:24:57", "url": "https://files.pythonhosted.org/packages/5a/3a/93a2ed497988304ae6fe79ef7bd06f3487e8f39e366a879242323f5285d4/castle-2.1.0.tar.gz" } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "c9341118846c2e05129fc66378b034c4", "sha256": "fb3916b9b6121320375a759d24ecec9fe5fc0b71239eb52e31ec921da54d3492" }, "downloads": -1, "filename": "castle-2.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c9341118846c2e05129fc66378b034c4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 34523, "upload_time": "2018-04-18T12:13:38", "url": "https://files.pythonhosted.org/packages/19/d7/85bc0ac0820fb7959de083b071248c909c093b19b020bd1a1c648bc67008/castle-2.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5987f902dd307ca3b5300931510b94a5", "sha256": "77177977358e5bcf34376e6cec5b105911e13fbac2792eb055ef464d98e2b6b2" }, "downloads": -1, "filename": "castle-2.2.0.tar.gz", "has_sig": false, "md5_digest": "5987f902dd307ca3b5300931510b94a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17270, "upload_time": "2018-04-18T12:13:40", "url": "https://files.pythonhosted.org/packages/c8/18/699630ebff620ddf380e27fa8698ecbfa1257b231894cec734cc841f51fc/castle-2.2.0.tar.gz" } ], "2.2.1": [ { "comment_text": "", "digests": { "md5": "ece5189730bcd0363ed72f781642ddef", "sha256": "20b970dac657759a35fe25d11a82bd50b68937db10530da4308fbacc021ccc5d" }, "downloads": -1, "filename": "castle-2.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ece5189730bcd0363ed72f781642ddef", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 32581, "upload_time": "2018-09-04T17:25:08", "url": "https://files.pythonhosted.org/packages/b9/a5/7730895357d24a3c89fb8a94e83824787a44dc59880ad56991d15da171b9/castle-2.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5665e640428640fb807871d5249fd8b4", "sha256": "53d3d81f0b460ebaac5931124797342b64cc38b99b9b9088c1e09ca441e4d42e" }, "downloads": -1, "filename": "castle-2.2.1.tar.gz", "has_sig": false, "md5_digest": "5665e640428640fb807871d5249fd8b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17490, "upload_time": "2018-09-04T17:25:10", "url": "https://files.pythonhosted.org/packages/6c/66/7c07a79a2902d5dde62dd55bc920f1dce936d03e620ff56b3af4e0ef1527/castle-2.2.1.tar.gz" } ], "2.3.0": [ { "comment_text": "", "digests": { "md5": "474a6ded7627232f7242b5a5b05ab10b", "sha256": "3231942347ae071c23e09004938cef8a5d9496263620a8308a07961ef8fb36b3" }, "downloads": -1, "filename": "castle-2.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "474a6ded7627232f7242b5a5b05ab10b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 35476, "upload_time": "2019-01-16T14:21:07", "url": "https://files.pythonhosted.org/packages/0c/71/2d57e3c45b6790c5c359f1a18a5bba2bbfe2c8e1a29296b1bc26e5e629de/castle-2.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d427f10ab25a8fa38592e91304626426", "sha256": "7da4d350ba9d529fef2557f1ef27da75c72ef54036e77df85803ef931dd7cfb6" }, "downloads": -1, "filename": "castle-2.3.0.tar.gz", "has_sig": false, "md5_digest": "d427f10ab25a8fa38592e91304626426", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19303, "upload_time": "2019-01-16T14:21:10", "url": "https://files.pythonhosted.org/packages/9f/7b/5cedfbd827c08e4e5932554f26d9bace766a9597d46141f64c1da377a69f/castle-2.3.0.tar.gz" } ], "2.3.1": [ { "comment_text": "", "digests": { "md5": "6ccb679727581886f3679e8f4c019d2a", "sha256": "4533c2f3756b80f27b7012757561bc66d4797cc8b1ceb18ebab3a9b3f3a165fe" }, "downloads": -1, "filename": "castle-2.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6ccb679727581886f3679e8f4c019d2a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 35623, "upload_time": "2019-04-05T09:43:59", "url": "https://files.pythonhosted.org/packages/ed/28/f07e16e6f12b2a269238684e717e3b9486aad6dbb19d04c1ae51b542a5f8/castle-2.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "961ab59b37abd163253be0bf2bf4adce", "sha256": "e60e57bbdd277dd7bd5d10b1520c471af425720765720a2efa0c97dbf56440ad" }, "downloads": -1, "filename": "castle-2.3.1.tar.gz", "has_sig": false, "md5_digest": "961ab59b37abd163253be0bf2bf4adce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19469, "upload_time": "2019-04-05T09:44:00", "url": "https://files.pythonhosted.org/packages/e8/d7/1660027277e4a3bfc8ad0858865d549b1c524b04dd202a335991d1249827/castle-2.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6ccb679727581886f3679e8f4c019d2a", "sha256": "4533c2f3756b80f27b7012757561bc66d4797cc8b1ceb18ebab3a9b3f3a165fe" }, "downloads": -1, "filename": "castle-2.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6ccb679727581886f3679e8f4c019d2a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 35623, "upload_time": "2019-04-05T09:43:59", "url": "https://files.pythonhosted.org/packages/ed/28/f07e16e6f12b2a269238684e717e3b9486aad6dbb19d04c1ae51b542a5f8/castle-2.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "961ab59b37abd163253be0bf2bf4adce", "sha256": "e60e57bbdd277dd7bd5d10b1520c471af425720765720a2efa0c97dbf56440ad" }, "downloads": -1, "filename": "castle-2.3.1.tar.gz", "has_sig": false, "md5_digest": "961ab59b37abd163253be0bf2bf4adce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19469, "upload_time": "2019-04-05T09:44:00", "url": "https://files.pythonhosted.org/packages/e8/d7/1660027277e4a3bfc8ad0858865d549b1c524b04dd202a335991d1249827/castle-2.3.1.tar.gz" } ] }