{"id":37083560,"url":"https://github.com/quarkslab/irmacl-async","last_synced_at":"2026-01-14T10:11:47.435Z","repository":{"id":54295575,"uuid":"156359612","full_name":"quarkslab/irmacl-async","owner":"quarkslab","description":"Asynchronous client library for IRMA API","archived":false,"fork":false,"pushed_at":"2021-02-26T02:21:00.000Z","size":553,"stargazers_count":2,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-12-03T08:25:42.976Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/quarkslab.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-11-06T09:34:46.000Z","updated_at":"2024-10-13T07:39:56.000Z","dependencies_parsed_at":"2022-08-13T11:10:52.188Z","dependency_job_id":null,"html_url":"https://github.com/quarkslab/irmacl-async","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/quarkslab/irmacl-async","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkslab%2Firmacl-async","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkslab%2Firmacl-async/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkslab%2Firmacl-async/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkslab%2Firmacl-async/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/quarkslab","download_url":"https://codeload.github.com/quarkslab/irmacl-async/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quarkslab%2Firmacl-async/sbom","scorecard":{"id":755321,"data":{"date":"2025-08-11","repo":{"name":"github.com/quarkslab/irmacl-async","commit":"59e90af1aebadf0fb19e8c09f8637045b9af1f93"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/20 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: irmacl_async/tests/functionals/samples/fish:1","Warn: binary detected: irmacl_async/tests/functionals/samples/ls:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}}]},"last_synced_at":"2025-08-22T21:31:03.131Z","repository_id":54295575,"created_at":"2025-08-22T21:31:03.131Z","updated_at":"2025-08-22T21:31:03.131Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28416667,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-14T10:11:46.796Z","updated_at":"2026-01-14T10:11:47.428Z","avatar_url":"https://github.com/quarkslab.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Irmacl-async: Asynchronous client library for IRMA API\n======================================================\n\n|docs|\n\nIRMA is an asynchronous and customizable analysis system for suspicious files.\nThis repository is a subproject of IRMA and contains the source code for IRMA\nAPI client.\n\nIrmacl-async requires python 3.5+ and an IRMA server with **API version 2**. The\nexact expected version is defined in ``AAPI.IRMA_VERSION``.\n\nInstallation\n------------\n\nFrom the sources, clone the repository and run\n\n.. code-block:: console\n\n   $ python setup.py install\n\nOr with pip just run\n\n.. code-block:: console\n\n  $ pip install irmacl-async\n\n\nConfiguration\n`````````````\n\nIrmacl-async configuration is done with a ``Config`` object that should be\ngiven to ``AAPI`` at initialisation. The details of expected configuration is\navailable with ``help(Config)``. A ``Config`` object can be initialized from an\nirma.yml file, which is a yaml file containing the parameters of a ``Config``\nobject.  All parameters are optional.\n\n.. code-block:: yaml\n\n   api_endpoint: \"https://172.16.1.30/api/v2\"\n   verify: true\n   ca: /etc/irma/ca.crt\n   cert: /etc/irma/client.crt\n   key: /etc/irma/client.key\n   submitter: kiosk\n   submitter_id: kiosk-D205\n\nirma.yml is searched in these locations in following order:\n\n* current directory\n* environment variable *IRMA_CONF*\n* user home directory\n* global directory  */etc/irma*\n\nOnce you set up a working irma.yml settings file, you could run tests on your\nrunning IRMA server:\n\n.. code-block:: console\n\n   $ python setup.py test\n\n\nUsage\n-----\n\nIrmacl-async is an asynchronous library. It is meant to ease the development of\npython code that communicates with an IRMA server.\n\nHello world\n```````````\n\n.. code-block:: pycon\n\n   \u003e\u003e\u003e import asyncio\n   \u003e\u003e\u003e from irmacl_async import AAPI\n   \u003e\u003e\u003e\n   \u003e\u003e\u003e async def main():\n   ...     async with AAPI() as api:\n   ...         resp = await api.about()\n   ...         print(resp['version'])\n   ...\n   \u003e\u003e\u003e loop = asyncio.get_event_loop()\n   \u003e\u003e\u003e loop.run_until_complete(main())\n   v2.2.3-20-g06a29b45\n\nThe ``main`` coroutine just prints the version of the IRMA server counterpart.\nThere is few things to notice in this example.\n\nFirst, an async context pattern must be opened to create a session and perform\nrequests. Moreover, AAPI will check the version of IRMA and prints a warning if\nit mismatches the expected one (``apicheck=False`` to prevent this behavior).\nIrmacl-async uses ``aiohttp.ClientSession`` in backend, you can set\n``AAPI().session`` manually at your own risks but it is not recommenced.\n\nSecond, ``api.about`` does not return a result but a ``Future`` that needs to\nbe awaited before being able to get its result.\n\nFinally, the ``main`` coroutine cannot just be called as a regular function but\nneeds to be awaited from another coroutine or run into an event loop.\n\n\nBasic usage\n```````````\n\n.. code-block:: pycon\n\n   \u003e\u003e\u003e import asyncio\n   \u003e\u003e\u003e from pathlib import Path\n   \u003e\u003e\u003e from irmacl_async import AAPI\n   \u003e\u003e\u003e\n   \u003e\u003e\u003e async def scandir(directory):\n   ...     files = (p for p in directory.iterdir() if p.is_file())\n   ...     async with AAPI() as api:\n   ...         scan = await api.scans.scan(files, linger=True)\n   ...         res = [api.scans.result(fe) for fe in scan.results]\n   ...         return await asyncio.gather(*res)\n   ...\n   \u003e\u003e\u003e loop = asyncio.get_event_loop()\n   \u003e\u003e\u003e d = Path(\"irmacl_async/tests/functionals/samples\")\n   \u003e\u003e\u003e loop.run_until_complete(scandir(d))\n   [FileExt.d13ab478-b24e-43a2-a51a-38c10355e929, ...]\n\nThe ``scandir`` coroutine is a bit more complex and benefits from the\nasynchronicity of the irmacl-async library. It scans the contents of a directory and\nwait for the result (``linger=True``). Then, it queries the result of every\nindividual file of the scan. Instead of a ``for`` loop, that would query the\nfiles one at a time, it uses ``asyncio.gather``.  Finally it waits for every\nrequest to be complete and returns the results.\n\n\nReferences\n----------\n\nAAPI\n````\n\nEvery method is -or at least should be- fully documented, use ``help(AAPI)`` or\n``help(AAPI().files)`` to get a exhaustive list of every available method and\ntheir parameters.\n\nObjects\n```````\n::\n\n   | Links between objects, example\n   |                             +---------------+         +---------------+\n   |                             |               |         |               |\n   |   +---------------+    +----+ FileExt 0933  +---------+   File 3099   |\n   |   |               |    |    |               |         |               |\n   |   |   Scan 1de3   +----+    ----------------+         +---------------+\n   |   |               |    |\n   |   +----------------    |\n   |                        |    +---------------+\n   |                        |    |               |\n   |                        +----+ FileExt aa1a  +----+\n   |                             |               |    |    +---------------+\n   |                             +---------------+    |    |               |\n   |                                                  +----+   File ab89   |\n   |   +---------------+                              |    |               |\n   |   |               |         +---------------+    |    +---------------+\n   |   |   Scan b987   +----+    |               |    |\n   |   |               |    +----+ FileExt f823  +----+\n   |   +---------------+         |               |\n   |                             +---------------+\n\nA ``File`` contains the actual contents of a file. Putting a file onto analysis\ncreates a ``FileExt`` that contains the results of the analysis for this file.\nFinally a ``Scan`` is a collection of ``FileExts`` In the example above, the\nscan b987 contains one file ab89. The scan 1de3 contains two files 3099 and\nab89.\n\n\nIrmaFileInfo\n  IrmaFileInfo are the metadata information linked to a IrmaFile\n\nIrmaScan\n  IrmaScan keep tracks of the IrmaFileExt scanned together, probe list used and\n  scan options.\n\nIrmaFileExt\n  IrmaFileExt object are scan results for a IrmaFile. One IrmaFileExt could be\n  linked to only one IrmaScan.  If you submit multiple times the same file and\n  scan it each time, you create only one IrmaFile but create multiple\n  IrmaFileExt all linked to the same IrmaFile.\n\nIrmaTag\n  Tag will be directly linked to IrmaFiles, each IrmaFileExt linked to this\n  IrmaFile will be tagged indirectly.\n\n\nOther\n-----\n\nDocumentation\n`````````````\n\nThe full IRMA documentation is available `on Read The Docs Website`_.\n\n\nGetting help\n````````````\n\nJoin the #qb_irma channel on irc.freenode.net. Lots of helpful people hang out\nthere.\n\n\nContribute to IRMA\n``````````````````\n\nIRMA is an ambitious project. Make yourself known on the #qb_irma channel on\nirc.freenode.net. We will be please to greet you and to find a way to get you\ninvolved in the project.\n\n\n.. |docs| image:: https://readthedocs.org/projects/irma/badge/\n    :alt: Documentation Status\n    :scale: 100%\n    :target: https://irma.readthedocs.io\n.. _on Read The Docs Website: https://irma.readthedocs.io\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquarkslab%2Firmacl-async","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquarkslab%2Firmacl-async","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquarkslab%2Firmacl-async/lists"}