{"id":37075739,"url":"https://github.com/spkcspider/spkcspider","last_synced_at":"2026-01-14T08:54:47.309Z","repository":{"id":55953469,"uuid":"108724496","full_name":"spkcspider/spkcspider","owner":"spkcspider","description":"Your decentral spider for your digital identity","archived":false,"fork":false,"pushed_at":"2020-12-04T17:17:15.000Z","size":3953,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-25T11:49:53.112Z","etag":null,"topics":["authentication","dsgvo","shopping","spider"],"latest_commit_sha":null,"homepage":"https://spkcspider.net","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spkcspider.png","metadata":{"files":{"readme":"README.md","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":"2017-10-29T10:27:27.000Z","updated_at":"2025-04-17T02:25:17.000Z","dependencies_parsed_at":"2022-08-15T10:10:56.383Z","dependency_job_id":null,"html_url":"https://github.com/spkcspider/spkcspider","commit_stats":null,"previous_names":[],"tags_count":81,"template":false,"template_full_name":null,"purl":"pkg:github/spkcspider/spkcspider","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spkcspider%2Fspkcspider","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spkcspider%2Fspkcspider/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spkcspider%2Fspkcspider/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spkcspider%2Fspkcspider/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spkcspider","download_url":"https://codeload.github.com/spkcspider/spkcspider/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spkcspider%2Fspkcspider/sbom","scorecard":{"id":841769,"data":{"date":"2025-08-11","repo":{"name":"github.com/spkcspider/spkcspider","commit":"97e448b4da412acebd66c4469c7fcdd07bf90ed2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.6,"checks":[{"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":"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"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":"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":"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":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"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":"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"}},{"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: MIT License: 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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating python:3 to python:3@sha256:3b2f1b9c9948e9dc96e1a2f4668ba9870ff43ab834f91155697476142b3bc299","Warn: downloadThenRun not pinned by hash: Dockerfile:5","Warn: pipCommand not pinned by hash: Dockerfile:7","Warn: pipCommand not pinned by hash: Dockerfile:8","Info:   0 out of   1 downloadThenRun dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned"],"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":"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":"Vulnerabilities","score":0,"reason":"83 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2021-865 / GHSA-vv2x-vrpj-qqpq","Warn: Project is vulnerable to: PYSEC-2021-858 / GHSA-q4xr-rc97-m4xx","Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: GHSA-3ww4-gg4f-jr7f","Warn: Project is vulnerable to: GHSA-5cpq-8wj7-hf2v","Warn: Project is vulnerable to: GHSA-9v9h-cgj8-h64p","Warn: Project is vulnerable to: PYSEC-2023-254 / GHSA-jfhm-5ghh-2f97","Warn: Project is vulnerable to: GHSA-jm77-qphf-c4w8","Warn: Project is vulnerable to: PYSEC-2021-63 / GHSA-rhm9-p9w5-fwm7","Warn: Project is vulnerable to: GHSA-v8gr-m533-ghj9","Warn: Project is vulnerable to: GHSA-w7pp-m8wf-vj6r","Warn: Project is vulnerable to: GHSA-x4qr-2fvf-3mr5","Warn: Project is vulnerable to: PYSEC-2021-98 / GHSA-68w8-qjq3-2gfm","Warn: Project is vulnerable to: GHSA-7xr5-9hcq-chf9","Warn: Project is vulnerable to: GHSA-8x94-hmjh-97hq","Warn: Project is vulnerable to: PYSEC-2021-9 / GHSA-fvgf-6h6h-3322","Warn: Project is vulnerable to: PYSEC-2021-99 / GHSA-p99v-5w3c-jqq9","Warn: Project is vulnerable to: PYSEC-2021-8 / GHSA-qm57-vhq3-3fwf","Warn: Project is vulnerable to: GHSA-rrqc-c2jx-6jgv","Warn: Project is vulnerable to: PYSEC-2021-7 / GHSA-rxjp-mfm9-w4wr","Warn: Project is vulnerable to: PYSEC-2021-439 / GHSA-v6rh-hp5x-86rv","Warn: Project is vulnerable to: PYSEC-2021-6 / GHSA-xgxc-v2qg-chmh","Warn: Project is vulnerable to: PYSEC-2021-109 / GHSA-xpfp-f569-q3p2","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-3f63-hfp8-52jq","Warn: Project is vulnerable to: PYSEC-2021-41 / GHSA-3wvg-mj6g-m9cv","Warn: Project is vulnerable to: GHSA-44wm-f244-xhp3","Warn: Project is vulnerable to: GHSA-4fx9-vc88-q2xc","Warn: Project is vulnerable to: PYSEC-2021-35 / GHSA-57h3-9rgr-c24m","Warn: Project is vulnerable to: PYSEC-2021-331 / GHSA-7534-mm45-c74v","Warn: Project is vulnerable to: PYSEC-2021-137 / GHSA-77gc-v2xv-rvvh","Warn: Project is vulnerable to: PYSEC-2021-92 / GHSA-7r7m-5h27-29hp","Warn: Project is vulnerable to: PYSEC-2023-227 / GHSA-8ghj-p4vj-mr35","Warn: Project is vulnerable to: PYSEC-2022-10 / GHSA-8vj2-vxx3-667w","Warn: Project is vulnerable to: PYSEC-2021-36 / GHSA-8xjq-8fcg-g5hw","Warn: Project is vulnerable to: PYSEC-2021-42 / GHSA-95q3-8gr9-gm8w","Warn: Project is vulnerable to: PYSEC-2021-317 / GHSA-98vv-pw6r-q6q4","Warn: Project is vulnerable to: PYSEC-2021-38 / GHSA-9hx2-hgq2-2g4f","Warn: Project is vulnerable to: PYSEC-2022-168 / GHSA-9j59-75qj-795w","Warn: Project is vulnerable to: PYSEC-2021-40 / GHSA-f4w8-cv6p-x6r5","Warn: Project is vulnerable to: PYSEC-2021-69 / GHSA-f5g8-5qq7-938w","Warn: Project is vulnerable to: PYSEC-2021-139 / GHSA-g6rj-rv7j-xwp4","Warn: Project is vulnerable to: PYSEC-2021-71 / GHSA-hf64-x4gq-p99h","Warn: Project is vulnerable to: PYSEC-2021-94 / GHSA-hjfx-8p6c-g7gx","Warn: Project is vulnerable to: GHSA-j7hp-h8jx-5ppr","Warn: Project is vulnerable to: GHSA-jgpv-4h4c-xhw3","Warn: Project is vulnerable to: PYSEC-2022-42979 / GHSA-m2vv-5vj5-2hm7","Warn: Project is vulnerable to: PYSEC-2021-37 / GHSA-mvg9-xffr-p774","Warn: Project is vulnerable to: PYSEC-2021-39 / GHSA-p43w-g3c5-g5mq","Warn: Project is vulnerable to: PYSEC-2022-8 / GHSA-pw3c-h7wp-cvhx","Warn: Project is vulnerable to: PYSEC-2021-93 / GHSA-q5hq-fp76-qmrc","Warn: Project is vulnerable to: PYSEC-2021-138 / GHSA-rwv7-3v45-hg29","Warn: Project is vulnerable to: PYSEC-2021-70 / GHSA-vqcj-wrf2-7v73","Warn: Project is vulnerable to: PYSEC-2022-9 / GHSA-xrcv-f9gm-v42c","Warn: Project is vulnerable to: PYSEC-2023-175","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: GHSA-2m57-hf25-phgg","Warn: Project is vulnerable to: PYSEC-2021-333 / GHSA-p5w8-wqhj-9hhf","Warn: Project is vulnerable to: PYSEC-2023-87 / GHSA-rrm6-wvj7-cwh2","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: PYSEC-2023-207 / GHSA-gwvm-45gx-3cf8","Warn: Project is vulnerable to: PYSEC-2019-133 / GHSA-mh33-7rrq-662w","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2019-132 / GHSA-r64q-w8jr-g9qp","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: PYSEC-2020-148 / GHSA-wqvq-5m8c-6g24","Warn: Project is vulnerable to: PYSEC-2018-32 / GHSA-www2-v7xj-xrc6","Warn: Project is vulnerable to: PYSEC-2021-108","Warn: Project is vulnerable to: PYSEC-2024-211 / GHSA-3f84-rpwh-47g6","Warn: Project is vulnerable to: PYSEC-2022-169 / GHSA-4f7p-27jc-3c36","Warn: Project is vulnerable to: PYSEC-2024-188 / GHSA-mg3v-6m49-jhp3","Warn: Project is vulnerable to: GHSA-2g68-c3qc-8985","Warn: Project is vulnerable to: GHSA-f9vj-2wh5-fj8j","Warn: Project is vulnerable to: PYSEC-2023-221 / GHSA-hrfv-mqp8-q5rw","Warn: Project is vulnerable to: PYSEC-2023-57 / GHSA-px8h-6qxv-m22q","Warn: Project is vulnerable to: GHSA-q34m-jh98-gwm2","Warn: Project is vulnerable to: PYSEC-2023-58 / GHSA-xg9f-g7g7-2323","Warn: Project is vulnerable to: PYSEC-2022-203","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T20:38:15.601Z","repository_id":55953469,"created_at":"2025-08-23T20:38:15.601Z","updated_at":"2025-08-23T20:38:15.601Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28414713,"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":["authentication","dsgvo","shopping","spider"],"created_at":"2026-01-14T08:54:46.710Z","updated_at":"2026-01-14T08:54:47.295Z","avatar_url":"https://github.com/spkcspider.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Simple protection-knocking (visiting) card Spider (short: spkcspider)\n--------------------------------------------------------\n\nspkcspider provides a digital visiting card which can e.g. be used for authentication, shopping and payment. For this a multifactor authentication is provided.\nIt keeps your online data safe while shopping by just providing a link to a potion of your data. Doing this, the user may can provide some knocking mechanism (e.g. has to provide some code, tan) to protect the content.\n\nFurther features and advantages of spkcspider are:\n\n* cross device configuration without saving user data on webshop/service.\n  This makes them easily DSGVO compatible without adjustments\n* Address Data have to changed only on one place if you move. This is especially useful if you move a lot\n  Also if you travel and want to buy something on the way.\n* Verification of data is possible.\n* Privacy: private servers are easily set up (only requirement: cgi), also compatible to tor\n* Travelling: some people don't respect common rules for privacy. This tool allows you to keep your digital life private.\n  * You don't have it on the device\n  * You can hide your data with the travel mode (against the worst kind of inspectors)\n    * Note: traces could be still existent (like \"recently-used\" feature, bookmarks)\n  * for governments: use psychology instead of breaking into systems! The only victims are law-abidding citizens.\n\n\n# Installation\n\nThis project can either be used as a standalone project (clone repo) or as a set of reusable apps (setup.py installation).\n\n\n## Build Requirements\n* npm\n* pip \u003e=19 (and poetry)\n\n## Poetry (within virtual environment)\n~~~~ sh\npoetry install\n# for installing with extras specify -E extra1 -E extra2\n~~~~\n\n## Pip\n~~~~ sh\npip install .\n~~~~\n\n## Setup\n~~~~ sh\nnpm install --no-save\n./manager.py migrate\n./manager.py collectstatic\n# or simply use\n./tools/install_deps.sh\n~~~~\n\n## Caveats\n\nallow_domain_mode NULL errors:\n\nsome migration failed and now it is neccessary to redo them manually\n\nconnect to database and execute:\nALTER TABLE spider_base_usercomponent DROP COLUMN allow_domain_mode;\nALTER TABLE spider_base_assignedcontent DROP COLUMN allow_domain_mode;\n\nthis doesn't work in sqlite3 (\n  export data (and remove allow_domain_mode if specified)\n  recreate db file\n  import data\n  see: http://www.sqlitetutorial.net/sqlite-alter-table/ why you don't want to try it manually\n)\n\n\nMysql works with some special settings:\nRequire mysql to use utf8 charset\nTo unbreak tests, use 'CHARSET': 'utf8':\n\n~~~~ python\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.mysql',\n        ...\n        'TEST': {\n            'CHARSET': 'utf8'\n        }\n    }\n}\n\n~~~~\n\n### Possibilities how to add utf8 charset to mysql:\n* use 'read_default_file' and add \"default-character-set = utf8\" in config\n* create database with \"CHARACTER SET utf8\"\n* see: https://docs.djangoproject.com/en/dev/ref/databases/#mysql-notes\n\n\n### \\_\\_old crashes object creation:\ndowngrade sqlite3 to 3.25 or upgrade django to at least 2.1.5/2.0.10\n\nimporting data:\n\nset:\nUPDATE_DYNAMIC_AFTER_MIGRATION = False\nbefore importing data (with loaddata), update dynamic creates data\n\n### keep pathes if switching from cgi\n~~~~\nlocation /cgi-bin/cgihandler.fcgi {\n   rewrite /cgi-bin/cgihandler.fcgi/?(.*)$ https://new.spkcspider.net/$1 redirect ;\n}\n~~~~\n\n### logging\nIn this model tokens are transferred as GET parameters. Consider disabling the\nlogging of GET parameters (at least the sensible ones) or better:\ndisable logging of succeeding requests\n\n\nnginx filter tokens only (hard):\n~~~~\nlocation / {\n  set $filtered_request $request;\n  if ($filtered_request ~ (.*)token=[^\u0026]*(.*)) {\n      set $filtered_request $1token=****$2;\n  }\n}\nlog_format filtered_combined '$remote_addr - $remote_user [$time_local] '\n                    '\"$filtered_request\" $status $body_bytes_sent '\n                    '\"$http_referer\" \"$http_user_agent\"';\n\naccess_log /var/logs/nginx-access.log filtered_combined;\n~~~~\n\nnginx filter GET parameters:\n~~~~\nlog_format filtered_combined '$remote_addr - $remote_user [$time_local] '\n                    '\"$uri\" $status $body_bytes_sent '\n                    '\"$http_referer\" \"$http_user_agent\"';\n\naccess_log /var/logs/nginx-access.log filtered_combined;\n~~~~\n\napache filter GET parameters:\n~~~~\nLogFormat \"%h %l %u %t \\\"%m %U %H\\\" %\u003es %b \\\"%{Referer}i\\\" \\\"%{User-agent}i\\\"\" combined\n\n~~~~\n\n### localization\n\nDon't use path based localization! This breaks the whole model.\nPathes should be unique for validation. Localisation in curl requests\ncan be archieved by headers.\n\n\n# External usage\n\nThere are special GET parameters for controlling spkcspider:\n* page=\u003cint\u003e: page number\n* token=xy: token as GET parameter, if invalid: retrieve token as GET parameter\n* token=prefer: uses invalid mechanic, easier to see what it does\n* raw=true: optimize output for machines, use turtle format\n* raw=embed: embed content of components, use turtle format\n* id=id\u0026id=id: limit content ids (Content lists only)\n* search=foo\u0026search=!notfoo: search case insensitive a string\n* search=\\_unlisted, search=%1eunlisted%1e: List \"unlisted\" content if owner, special user (doesn't work in public list)\n* search=%1efoobar%1e: activate strict info search\n* protection=false: fail if protections are required\n* protection=xy\u0026protection=yx...: protections to use\n* intention=auth: try to login with UserComponent authentication (falls back to login redirect)\n* referrer=\u003curl\u003e: activate referrer mode\n  * intention=domain: domain verify referrer mode\n  * intention=sl: server-less referrer mode\n  * payload=\u003cfoo\u003e: passed on successful requests (including post), e.g. for sessionid\n  * intention=login: referrer uses spkcspider for login (note: referrer should be the one where the user is logging in, check referrer field for that)\n  * intention=persist: referrer can persist data on webserver\n* embed_big=true: only for staff and superuser: Overrides maximal size of files which are embedded in graphs (only for default helper)\n\n## special header\n* Content-Type/Accept=application/json: some forms are rendered as json (currently only deletion form)\n\n## Referrer\n* normal referrer mode: send token to referrer, client verifies with hash that he sent the token.\n* server-less referrer mode (sl): token is transferred as GET parameter and no POST request is made (less secure as client sees token and client is not authenticated)\n* domain referrer mode (domain): referrer domain is add to token. Doesn't work with other intentions (but \"live\" mode is active as no filter will be created) and works only if domain_mode is for context active (e.g. feature or access context (content)). Can be automated, doesn't require user approval. Useful for tag updates (only active if feature requests domain mode).\n\nverified_by urls should return last verification date for a hash\n\n### special intentions:\n* persist: referrer token is persistent and can persist contents\n* sl: activates server less mode\n* live: filter live instead using fixed ids\n\n## search parameters\n\n* search also searches UserComponents name and description fields\n* can only be used with \"list\"-views\n* items can be negated with !foo\n* strict infofield, name search can be activated with \\_\n* strict infofield search can be activated with 1e chars\n* !!foo escapes a !foo item\n* \\_\\_foo escapes a \\_foo item\n* !\\_ negates a strict infofield, name search\n* \\_unlisted: it lists with \"unlisted\" marked contents\n\n### component search\n\n* \\_index, index: reveals the index component\n* !\\_index, !index: explicit hides the index component\n\n## raw mode\n\nraw mode can follow references even in other components because it is readonly.\nOtherwise security could be compromised.\n\n## Important Features\n\n* Persistence: Allow referrer to save data (used and activated by persistent features)\n* WebConfig: Allow remote websites and servers to save config data on your server (requires Persistence)\n* TmpConfig: Allow remote websites and servers to save config data on your server, attached to temporary tokens (means: they are gone after a while)\n\n\n# internal API\n\n\n## Structure\n\n### spider:\nFor spiders and contents\n\n* spkcspider.apps.spider: store User Components, common base, WARNING: has spider_base namespace to not break existing apps\n* spkcspider.apps.spider_accounts: user implementation suitable for the spiders. You can supply your own user model instead.\n* spkcspider.apps.spider_filets: File and Text Content types\n* spkcspider.apps.spider_keys: Public keys and anchors\n* spkcspider.apps.spider_tags: verified information tags\n* spkcspider.apps.spider_webcfg: WebConfig Feature\n* spkcspider: contains spkcspider url detection and wsgi handler\n\n### verifier:\nBase reference implementation of a verifier.\n\nspkcspider.apps.verifier: verifier base utils WARNING: has spider_verifier namespace to not break existing apps\n\n\n## info field syntax\n\nThe info field is a simple key value storage. The syntax is (strip the spaces):\n\nflag syntax: \\\\x1e key \\\\x1e\nkey value syntax: \\\\x1e key=value \\\\x1e\n\nNote: I use the semantic ascii seperators \\\\x1e. Why? Sperating with an non-printable character eases escaping and sanitizing.\nNote 2: I reverted from using \\\\x1f instead of = because the info field is used in searchs\n\nWhy not a json field? Django has no uniform json field for every db adapter yet.\n\n\n## forms\n* forms.initial: will be used for rdf\n* field.initial: only for initialization\n\n\n## authentication/privileges\n\n* request.is_staff: requesting user used staff rights to access view (not true in ComponentPublicIndex)\n* request.is_owner: requesting user owns the components\n* request.is_special_user: requesting user owns the components or is_staff\n* request.protections: int: enough protections were fullfilled, maximal measured strength, list: protections which failed, False: no access; access with protections not possible\n\n## Special Scopes\n\n* add: create content, with AssignedContent form\n* update: update content\n* raw_update: update Content, without AssignedContent form, adds second raw update mode (raw_add is not existent, can be archieved by returning HttpResponse in add scope)\n* export: export data (import not implemented yet)\n* view: present content to untrusted parties\n\n## strength (component)\n* 0: no protection. Complete content visible\n* 1-3: protection strength which can be provided by protections. Meta data (names, descriptions) visible, inclusion in sitemap, public components\n* 4: login only, user password. Still with inclusion of metadata\n* 5: public attribute not set. No inclusion in sitemap or public components index anymore\n* 6-8: protections + public attribute not set\n* 9: login only, user password + public attribute not set\n* 10: index, login only, special protected. Protections are used for login. Content here can be made unique per user by using unique per component attribute\n\n= extra[\"strength\"] on token (if available elsewise treat as zero):\n\nthe strength of the usercomponent for which it was created at the creation point\n\n## strength (protection)\n* 0: no protection\n* 1-3: weak, medium, strong\n* 4: do component authentication\n\n= extra[\"prot_strength\"] on token (if available elsewise treat as zero):\n\nthe strength of protections which was passed for creating the token\n\nNote: access tokens created by admin have strength 0\n\n## get usercomponent/content from url/urlpart for features\n\nUse UserComponent.objects.from_url_part(url) / AssignedContent.from_url_part(url, [matchers]) for that\nor use a domain_mode or persistent token.\nNote: the difference between a domain_mode and a persistent token is, that the domain_mode token has a variable lifetime (user specific but defaults to 7 days)\nNote: AssignedContent.objects.from_url_part(url) returns tuple: (matched feature/content, content which contains content/feature or None)\n\n\n# API Breaks\n* \u003e0.5: settings rename\\*\\_ TLD_PARAMS_MAPPING to \\*\\_REQUEST_KWARGS_MAP with new syntax (hosts are allowed, tlds start with .)\n  * Note: port arguments are stripped, localhost matches localhost:80, localhost:8000, ...\n* \u003e=0.18: change order of filter parameters, nearly all filters start with request (for compatibility with (django) decorators)\n* \u003e=0.21: huge change in python API, http API should be backward compatible\n* \u003e=0.22: switch to datacontent (except in rare special cases like in SpiderTag), 3party modules will break if they used BaseContent\n\n# TODO\n* split out constants and common features\n* implement encryption: a flag marks keys they should be used for encryption\n* implement UploadTextareaWidget\n* maybe: status codes if forms fail should represent it\n* fix RDF export and view of spider_tags\n* examples\n* documentation\n* test admin\n* cleanup travelprotection: either no trigger_passwords if no trigger action is selected, or depend for trigger on trigger_passwords\n  * partly done, missing in frontend\n* Localisation\n  * harmonize punctation\n* css theme instead inline style\n\n## Later\n* verify subproperties without resource:\n  * delay hash calculation if Bnode, then create hash from hashable hash of bnode\n  * this case currently doesn't happen as embed/raw is solely used and no bigger no-contents are currently in use\n* delayed deletion of user (disable and strength 9 everywhere)\n* maybe: make quota type overridable (maybe add extra nonsaved quota: other or use 0)\n* create client side script for import (pushing to server, index token for auth?)\n  * use browerside javascript?\n* textfilet etherpad like synchronization\n* pw protection: add migration tool for changed SECRET_KEY\n* log changes\n* improve protections, add protections\n\n\n### Implement Web Comments\n* every internal page can be annotated (to keep contact to author)\n  * send as message?\n  * CommentBox?\n* Comment: url, subcommentlist, commenttext, reactionlist (reaction, counter)\n* view: load iframe with original content?\n* js for loading subcomments (only 1 level), sanitize!\n* you see only the comments of your friends\n* implement with messaging? Would keep comments private\n* Later/Maybe:\n  * way to register your comment url on webpage, so others can see all comments\n  * social media stuff: find content via comments and likes\n  * annotation of other pages\n\n\n# Thanks\n\n* Default theme uses Font Awesome by Dave Gandy - http://fontawesome.io\n* Some text fields use Trumbowyg by Alexander Demode\n* Django team for their excellent product\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspkcspider%2Fspkcspider","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspkcspider%2Fspkcspider","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspkcspider%2Fspkcspider/lists"}