From 6e9edea55e9f285adc7d9bcd321b5ac670c9edb9 Mon Sep 17 00:00:00 2001 From: oxeo0 Date: Mon, 31 Mar 2025 19:52:21 +0200 Subject: [PATCH] add status update script and some debug output --- opsec/index.autogen.html | 500 +++++++++++++++++++++++++++++++++++++++ statusupdate.out.txt | 137 +++++++++++ statusupdate.py | 58 +++++ 3 files changed, 695 insertions(+) create mode 100644 opsec/index.autogen.html create mode 100644 statusupdate.out.txt create mode 100644 statusupdate.py diff --git a/opsec/index.autogen.html b/opsec/index.autogen.html new file mode 100644 index 0000000..c1ede30 --- /dev/null +++ b/opsec/index.autogen.html @@ -0,0 +1,500 @@ + + + + + + + + + + OPSEC: Privacy, Anonymity and Deniability Tutorials + + + + + + +
+
+
+
+ Previous Page

Operational Security: Privacy, Anonymity and Deniability

+

Tutorials to show how to achieve Privacy, Anonymity and Deniability online. + I have a quality standard as to how i do these tutorials, if there are any improvements i can do on them please let me know.

+ + +

SHOWCASED ARTICLE: Learn how to audit your own setup, to determine your Operational Security (OPSEC) Level, and find out what is the most appropriate internet use for it.

+


+

Articles Status:

+
    +
  1. ⭐: Personal Favorite
  2. +
  3. ✅: Completed
  4. +
  5. 🚧: Work in progress
  6. +
  7. ❌: Not started yet (can be brainstormed on their assigned Forgejo issues here)
  8. +

+ +⚠️ This Blog is open to contributions: +

If you want to contribute, check out the Forgejo repository for contributions (along with the guidelines) here, check out the project board here to know the status of which tutorial being assigned to whom. (i'm rewarding 10 to 50 euros in monero per new complete blogpost, as advertised on Xmrbazaar). if the blogpost you want to contribute is not listed below, contact me directly so that I can validate your blogpost idea beforehand. For a step-by-step tutorial on how to contribute, please check out this tutorial.

+ + +
+
+
+
+ +
+ +
+
+
+
+
+

OPSEC LEVEL 1: Privacy

+ +
+ +

📝 Explaining Privacy

+
    +
  1. What is Privacy ? Why is it important ?
  2. +
  3. Why can't I trust closed-source software for Privacy?
  4. +
  5. The lack of Open Source Hardware (CPUs, Motherboards, GPUs)
  6. +
  7. Why can't I trust Server-side Encryption ?
  8. +
  9. ❌ Cloudflare : The world's largest Man in the Middle
  10. +
  11. ❌ Why is metadata detrimental to my privacy ?
  12. +
+

💻 Getting started

+
    +
  1. How to have Privacy on your Computer (Kicksecure) ⭐
  2. +
  3. How to have Privacy on your Phone (GrapheneOS)
  4. +
  5. ❌ How to have Privacy on your Router (Openwrt)
  6. +
  7. Easy Private Chats - SimpleX
  8. +
  9. How to setup Qubes OS
  10. +
+ +

💻 File Sharing

+
    +
  1. One on One large file sharing (Syncthing over VPN)
  2. +
  3. P2P large file sharing (Torrents over VPN)
  4. +

+

💻 Maintaining Privacy

+
    +
  1. ❌ How to use Linux - The essentials
  2. +
  3. How to compile open source software + How to verify software integrity
  4. +
  5. How to Virtualize Machines (QEMU/KVM Hypervisor)
  6. +
  7. Password Management 101 (How to use Keepass)
  8. +
  9. Private Messaging (PGP encryption)
  10. +
  11. How to navigate Qubes OS
  12. +
+

💻 Privacy from your ISP

+
    +
  1. How to get privacy from your ISP using a VPN inside a VM
  2. +
  3. How to Route VMs traffic through a VPN on the Host OS
  4. +
  5. ❌ How to route your entire network through a VPN on the Router
  6. +
  7. ❌ How to route your entire network through XRay on the Router
  8. + + +
+ +

💻 Monitoring that your Privacy is intact

+
    +
  1. ❌ Physical surveillance of your devices
  2. +
  3. ✅ Anti-tampering measures for your devices
  4. +
  5. ❌ Network intrusion detection and surveillance
  6. +
  7. ❌ Operating System intrusion detection and Integrity checks
  8. +
+

⚠️ Miscellaneous - In real life

+
    +
  1. ❌ How to hide the contents of a mail package
  2. +
+ +
+ + +
+
+
+
+
+
+
+
+

OPSEC LEVEL 2: Anonymity

+
+ +

📝 Explaining Anonymity

+
    +
  1. What is Anonymity ? Why is it Important ?
  2. +
  3. Why isn't Privacy enough for Anonymous use ?
  4. +
  5. Phone Numbers are incompatible with Anonymity
  6. +
  7. ❌ Why is metadata detrimental to Anonymity ?
  8. + +
  9. The main source of Anonymity: The Tor Network
  10. +
  11. How to use Tor Safely: (Tor + VPN combinations)
  12. +
  13. Why is the Darknet superior to the Clearnet ?
  14. +
  15. How to explore the Darknet? (Visibility and Discoverability)
  16. +
  17. How to run your own Darknet Lantern for Visibility and Discoverability
  18. +
  19. ❌ When should I use I2P instead of Tor ?
  20. + +

+

💻 Clientside Anonymity (⚠️ Check if your ISP allows Tor or Not!)

+
    + +
  1. ❌ How to obtain Internet access anonymously
  2. +
  3. VMs for Long-term Anonymity (Whonix QEMU VMs)
  4. +
  5. Tor Web Browser Setup (on Desktop and Mobile)
  6. +
  7. How to Anonymously access websites that block Tor
  8. +
  9. How to Anonymous access websites that block Tor and VPNs
  10. +
  11. Easy Anonymous Chats - SimpleX (and onion-only servers)
  12. +
  13. How to Receive Anonymous SMSes (Remote SMSes as a Service)
  14. +
  15. How to Get an Email Account Anonymously (Emails as a Service)
  16. + +

+ + +

💻 Clientside - Censorship Evasion

+
    +
  1. How to access Tor when it is being blocked, using VPNs
  2. +
  3. ❌ How to temporarily access Tor when VPNs are blocked, using Tor bridges
  4. +
  5. How to access Tor when VPNs are blocked, using v2ray
  6. + +

+

💻 Clientside - Fingerprinting Protection

+
    +
  1. Stylometry protection (Running a Local LLM and copy pasting messages)
  2. +
  3. ❌ How to protect against fingerprinting (persona, text, files)
  4. + +

+ +

💻 File Sharing

+
    +
  1. How to send small files Anonymously (Onionshare)
  2. +
  3. How to send large files using Syncthing over Tor
  4. +
  5. P2P large file sharing (Torrents over i2p?)
  6. +

+ + +

💻 Clientside - Decentralized Finances ⭐

+
    +
  1. Why Financial decentralisation ? (Cryptocurrencies, Exchanges and KYC) ⭐
  2. +
  3. How to setup a Monero Wallet
  4. +
  5. Why can't I trust Centralised Exchanges, and random Monero nodes ?
  6. +
  7. ❌ How to get your first Monero ? (xmrbazaar.com, crypto swaps, p2p chats, or work)
  8. +
  9. Haveno Decentralised Exchange direct Fiat -> XMR transaction ⭐
  10. +
  11. Haveno DEX Dispute resolution (Fiat -> XMR)
  12. +
  13. Haveno DEX Bank Transfer (ex: SEPA) -> XMR transaction
  14. +
  15. Haveno DEX Cash By Mail -> XMR transaction ⭐
  16. +
  17. ❌ Convert Monero into other Cryptos Anonymously (XMR -> BTC w/ BasicSwap DEX)
  18. +
  19. How to get a credit card anonymously (Credit cards as a service)
  20. +
  21. Monero Inheritence Management (VaultWarden Emergency Contacts)
  22. +

+ + + + +

🧅 Serverside - Contributing to Anonymity

+
    +
  1. Tor Node
  2. +
  3. Tor Bridge Node
  4. +
  5. Tor Exit Node
  6. +
  7. Monero Node
  8. +
  9. Monero Mining with p2pool (help validate the network)
  10. +
  11. Haveno Seed Node
  12. +
  13. ❌ Haveno DEX Network
  14. +

+ +

🧅 Serverside - Anonymous Hidden Services

+
    + +
  1. Where to host Anonymous Hidden Services ?
  2. +
  3. How to rent remote servers anonymously (Cloud resellers) ⭐
  4. +
  5. Hidden Service with custom .onion domain Vanity V3 address
  6. +
  7. ❌ How to Verify one's Identity while maintaining Anonymity using PGP canaries ?
  8. +
  9. Forgejo .onion Setup (Anonymous Code Repositories and Collaboration)
  10. +
  11. Nextcloud .onion Setup (Anonymous File Hosting)
  12. +
  13. ❌ How to setup Nerostr (Nostr blogging)
  14. +
  15. ❌ How to monitor your servers Anonymously
  16. +
    +

+

🧅 Serverside - Anonymous Clearnet Services

+
    +
  1. Where to host Anonymous Clearnet Services ?
  2. +
  3. How to rent Clearnet domains anonymously (Registrar resellers) ⭐
  4. +
  5. Remote anonymous access setup (SSH through tor)
  6. +
  7. Clearnet Bind9 DNS server setup (with DNSSEC)
  8. +
  9. Anonymous (remote or self-hosted) Clearnet Mail Server ⭐
  10. +
    +

+

⚠️ Miscellaneous - In real life

+
    +
  1. ❌ How to send a mail package anonymously
  2. +
  3. ❌ How to recieve a mail package anonymously
  4. +
  5. How to remain Anonymous during a protest
  6. +

+ + + + + +


+ +
+
+
+
+
+
+
+
+ +

OPSEC LEVEL 3: Deniability

+ +
+ +

📝 Explaining Plausible Deniability

+
    +
  1. What is Plausible Deniability ? Why is it Important ?
  2. +
  3. Why isn't Anonymity enough for Sensitive use ?
  4. +

+ +

💻 Clientside - Getting Started

+
    +
  1. Tails OS for Easy Temporary Sensitive Use
  2. +
  3. Using the Host-OS in live-mode to enable Sensitive Use
  4. +
  5. The main source of Plausible Deniability: Deniable Encryption
  6. +
  7. Sensitive use VMs Setup (Whonix VMs in a Veracrypt Hidden Volume)⭐
  8. +
  9. Plausibly Deniable Critical Data Backups
  10. +

+

💻 Steganography - Hiding secrets in plain sight

+
    +
  1. Other sources of Plausible Deniability: Steganography Introduction
  2. +
  3. Hiding files in images with Steghide
  4. +
  5. Hiding entire zipfiles into videofiles files (zulucrypt)
  6. +

+ +

💻 Decentralised Finances

+
    +
  1. ❌ Where to hide your Monero Wealth ?
  2. +
  3. ❌ How to Cash out your crypto gains (Fiat income limits, and justifications)
  4. +

+ + + +

🧅 Serverside - Plausible Deniability at Home (⚠️ Self Hosting = Risky!)

+
    +
  1. ❌ Host OS WAN Failover Configuration
  2. +
  3. Electrical Failover (basic UPS setup)
  4. +
  5. ❌ Isolating on-premise hidden services (VM-based restrictive networking)
  6. +
  7. Deniable Encryption Protection Automation
  8. +

+

🧅 Serverside - Remote Plausible Deniability (⚠️ Remote Hosting = Safer!)

+
    +
  1. Sensitive Services: Self-Host or Host Remotely ?
  2. +
  3. When the Adversary is the cloud provider himself
  4. +
  5. ❌ Sensitive remote servers organisation
  6. +
  7. ✅ Anonymous Servers Monitoring
  8. +
  9. ❌ Protecting against cold boot attacks, encrypting RAM with no Hardware access
  10. +
  11. ❌ System Intrusion / Integrity monitoring (kernel modules, binary files, unwanted processes, hardware changes)
  12. +
  13. ❌ Anti-tampering custom Linux OS (debian-based)
  14. +
  15. ❌ Obtaining a non-KYC dedicated server, with a custom OS
  16. +
  17. ❌ Intrusion detection on remote servers
  18. +

+ + +

🧅 Serverside - High Availability for Deniability (⚠️ Remote Hosting = Safer!)

+
    +
  1. Why is High Availability Important for Deniability ?
  2. +
  3. How to setup a basic NGINX / PHP / MySQL app
  4. +
  5. How to setup a MySQL Master-Master replication over Tor
  6. +
  7. OnionBalance for .onion domains load balancing
  8. +
  9. Endgame V3 (.onion service Anti DDOS / Load Balancer / WAF + Captcha) ⭐
  10. + +

+ + + +

⚠️ Miscellaneous - In real life

+
    +
  1. ❌ When protests go wrong - SimpleX Disappearing Messages
  2. +

+ + +


+
+
+
+
+ + + + + + + + + + + +
+ +
+ + + + +
+
+
+
+

Inspirations

+ +
    +
  1. The Hitchhiker's guide to Anonymity (the entire opsec category was inspired from this awesome guide, check them out!)
  2. +
  3. Hack Liberty Resources
  4. +

+

Non-KYC VPS providers



+

Current services used:

+
    +
  1. ServersGuru (KYC-Free reseller of cloud providers like Hetzner)
  2. +
  3. nicevps.net (KYC-Free registrar)
  4. +
+
+

Previous services:

+
    +
  1. Incognet (both registrar and cloud provider) warning: they suck at handling support tickets
  2. +
  3. Hostiko (cloud provider)
  4. +
  5. Other Non-KYC Cloud Providers
  6. + +
+

+ +

+LEGAL DISCLAIMER: 
+Across the entirety of my blog, in all articles that I made, I advocate for the legal use of technologies, even when I am talking about Privacy-enhancing and Anonymity-enabling technologies. In no way am I advocating for any illegal use of any technology showcased in any article on my blog. as the goal of this blog is to remain stricly informative and educative.
+
+
+I decline any and all responsibility for any mis-use of any of the technology i showcase in the entirety of my blog. I also decline any and all responsibility for any physical, digital and psychological damage caused by the mis-use of any showcased technology, as the responsibility of such acts remains with the perpretating third-party. By reading this blog, you permanently, irrevocably and world-widely agree that I am in no way am responsible for any illegal action done by you or anyone that uses any of the showcased technology in my blog articles.
+
+
+ + + +
+
+
+
+ + + +
+
+
+
+

Nihilism

+

+ Until there is Nothing left.



Creative Commons Zero: No Rights Reserved
+ +

+
+ +
+

My Links

+

+ + RSS Feed
SimpleX Chat
+ +

+
+ +
+

About nihilist

+

Donate XMR: 8AUYjhQeG3D5aodJDtqG499N5jXXM71gYKD8LgSsFB9BUV1o7muLv3DXHoydRTK4SZaaUBq4EAUqpZHLrX2VZLH71Jrd9k8


+
+ +
+ +
+
+ + + + + + + diff --git a/statusupdate.out.txt b/statusupdate.out.txt new file mode 100644 index 0000000..3a4f0a6 --- /dev/null +++ b/statusupdate.out.txt @@ -0,0 +1,137 @@ +Issue ID: 235 Symbol Offset: 4053 Current: ❌ Determined: ❌ +Issue ID: 236 Symbol Offset: 4230 Current: ❌ Determined: ❌ +Issue ID: 259 Symbol Offset: 4446 Current: ✅ Determined: ✅ +Issue ID: 67 Symbol Offset: 4657 Current: ✅ Determined: ✅ +Issue ID: 68 Symbol Offset: 5148 Current: ✅ Determined: ✅ +Issue ID: 69 Symbol Offset: 5501 Current: ✅ Determined: ✅ +Issue ID: 242 Symbol Offset: 5812 Current: ❌ Determined: ❌ +Issue ID: 70 Symbol Offset: 6057 Current: ✅ Determined: ✅ +Issue ID: 71 Symbol Offset: 6448 Current: 🚧 Determined: ❌ +Issue ID: 72 Symbol Offset: 6898 Current: ✅ Determined: ✅ +Issue ID: 56 Symbol Offset: 7270 Current: ✅ Determined: ✅ +Issue ID: 232 Symbol Offset: 7550 Current: ❌ Determined: ❌ +Issue ID: 241 Symbol Offset: 7768 Current: ❌ Determined: ❌ +Issue ID: 73 Symbol Offset: 8420 Current: ✅ Determined: ✅ +Issue ID: 261 Symbol Offset: 8686 Current: ✅ Determined: ✅ +Issue ID: 75 Symbol Offset: 8970 Current: ✅ Determined: ✅ +Issue ID: 262 Symbol Offset: 9263 Current: ✅ Determined: ✅ +Issue ID: 215 Symbol Offset: 9546 Current: ❌ Determined: ❌ +Issue ID: 212 Symbol Offset: 9751 Current: ❌ Determined: ❌ +Issue ID: 76 Symbol Offset: 9992 Current: ✅ Determined: ✅ +Issue ID: 78 Symbol Offset: 10306 Current: ✅ Determined: ✅ +Issue ID: 161 Symbol Offset: 10624 Current: ❌ Determined: ❌ +Issue ID: 61 Symbol Offset: 10890 Current: 🚧 Determined: ❌ +Issue ID: 42 Symbol Offset: 11180 Current: ✅ Determined: ✅ +Issue ID: 11 Symbol Offset: 11450 Current: ✅ Determined: ✅ +Issue ID: 12 Symbol Offset: 11724 Current: ✅ Determined: ✅ +Issue ID: 240 Symbol Offset: 12049 Current: ❌ Determined: ❌ +Issue ID: 79 Symbol Offset: 12277 Current: ✅ Determined: ✅ +Issue ID: 80 Symbol Offset: 12577 Current: ✅ Determined: ✅ +Issue ID: 83 Symbol Offset: 12858 Current: 🚧 Determined: ❌ +Issue ID: 85 Symbol Offset: 13142 Current: ✅ Determined: ✅ +Issue ID: 265 Symbol Offset: 13388 Current: ✅ Determined: ✅ +Issue ID: 81 Symbol Offset: 13688 Current: ✅ Determined: ✅ +Issue ID: 82 Symbol Offset: 14007 Current: 🚧 Determined: ❌ +Issue ID: 183 Symbol Offset: 14290 Current: ❌ Determined: ❌ +Issue ID: 184 Symbol Offset: 14589 Current: ❌ Determined: ❌ +Issue ID: 190 Symbol Offset: 14947 Current: ❌ Determined: ❌ +Issue ID: 176 Symbol Offset: 15139 Current: ❌ Determined: ✅ +Issue ID: 191 Symbol Offset: 15334 Current: ❌ Determined: ❌ +Issue ID: 192 Symbol Offset: 15533 Current: ❌ Determined: ❌ +Issue ID: 139 Symbol Offset: 15783 Current: ❌ Determined: ❌ +Issue ID: 86 Symbol Offset: 16412 Current: ✅ Determined: ❌ +Issue ID: 87 Symbol Offset: 16690 Current: ✅ Determined: ✅ +Issue ID: 14 Symbol Offset: 16998 Current: ✅ Determined: ✅ +Issue ID: 237 Symbol Offset: 17312 Current: ❌ Determined: ❌ +Issue ID: 88 Symbol Offset: 17509 Current: ✅ Determined: ✅ +Issue ID: 89 Symbol Offset: 17857 Current: 🚧 Determined: ❌ +Issue ID: 169 Symbol Offset: 18242 Current: ✅ Determined: ✅ +Issue ID: 266 Symbol Offset: 18512 Current: ✅ Determined: ✅ +Issue ID: 267 Symbol Offset: 18798 Current: ✅ Determined: ✅ +Issue ID: 168 Symbol Offset: 19133 Current: ❌ Determined: ❌ +Issue ID: 170 Symbol Offset: 19506 Current: ❌ Determined: ❌ +Issue ID: 93 Symbol Offset: 19739 Current: ✅ Determined: ✅ +Issue ID: 90 Symbol Offset: 20094 Current: ✅ Determined: ✅ +Issue ID: 54 Symbol Offset: 20412 Current: ✅ Determined: ✅ +Issue ID: 268 Symbol Offset: 20726 Current: ✅ Determined: ✅ +Issue ID: 129 Symbol Offset: 21045 Current: 🚧 Determined: ❌ +Issue ID: 27 Symbol Offset: 21359 Current: ✅ Determined: ✅ +Issue ID: 26 Symbol Offset: 21675 Current: ✅ Determined: ✅ +Issue ID: 94 Symbol Offset: 22059 Current: ✅ Determined: ✅ +Issue ID: 57 Symbol Offset: 22369 Current: ❌ Determined: ❌ +Issue ID: 59 Symbol Offset: 22664 Current: 🚧 Determined: ❌ +Issue ID: 13 Symbol Offset: 23055 Current: ✅ Determined: ✅ +Issue ID: 43 Symbol Offset: 23385 Current: ❌ Determined: ❌ +Issue ID: 15 Symbol Offset: 23682 Current: ✅ Determined: ✅ +Issue ID: 16 Symbol Offset: 23991 Current: ✅ Determined: ✅ +Issue ID: 17 Symbol Offset: 24302 Current: ✅ Determined: ❌ +Issue ID: 95 Symbol Offset: 24653 Current: ✅ Determined: ✅ +Issue ID: 52 Symbol Offset: 25145 Current: ✅ Determined: ✅ +Issue ID: 96 Symbol Offset: 25405 Current: ✅ Determined: ✅ +Issue ID: 50 Symbol Offset: 25737 Current: ❌ Determined: ❌ +Issue ID: 269 Symbol Offset: 26015 Current: ✅ Determined: ✅ +Issue ID: 97 Symbol Offset: 26356 Current: ✅ Determined: ✅ +Issue ID: 98 Symbol Offset: 26679 Current: ✅ Determined: ✅ +Issue ID: 99 Symbol Offset: 27046 Current: ✅ Determined: ✅ +Issue ID: 64 Symbol Offset: 27396 Current: ❌ Determined: ❌ +Issue ID: 28 Symbol Offset: 27749 Current: ✅ Determined: ✅ +Issue ID: 48 Symbol Offset: 28081 Current: ✅ Determined: ✅ +Issue ID: 101 Symbol Offset: 28450 Current: 🚧 Determined: ❌ +Issue ID: 100 Symbol Offset: 28678 Current: ✅ Determined: ✅ +Issue ID: 102 Symbol Offset: 28915 Current: ✅ Determined: ✅ +Issue ID: 103 Symbol Offset: 29153 Current: ✅ Determined: ✅ +Issue ID: 104 Symbol Offset: 29425 Current: ✅ Determined: ✅ +Issue ID: 18 Symbol Offset: 29697 Current: ✅ Determined: ✅ +Issue ID: 19 Symbol Offset: 29935 Current: ❌ Determined: ❌ +Issue ID: 105 Symbol Offset: 30310 Current: ✅ Determined: ✅ +Issue ID: 109 Symbol Offset: 30569 Current: ✅ Determined: ✅ +Issue ID: 156 Symbol Offset: 30941 Current: ✅ Determined: ✅ +Issue ID: 179 Symbol Offset: 31259 Current: ❌ Determined: ❌ +Issue ID: 270 Symbol Offset: 31517 Current: ✅ Determined: ✅ +Issue ID: 233 Symbol Offset: 31844 Current: ✅ Determined: ❌ +Issue ID: 47 Symbol Offset: 32148 Current: ❌ Determined: ❌ +Issue ID: 221 Symbol Offset: 32445 Current: ❌ Determined: ❌ +Issue ID: 105 Symbol Offset: 32736 Current: ✅ Determined: ✅ +Issue ID: 110 Symbol Offset: 33047 Current: ✅ Determined: ✅ +Issue ID: 111 Symbol Offset: 33413 Current: ✅ Determined: ✅ +Issue ID: 112 Symbol Offset: 33675 Current: 🚧 Determined: ❌ +Issue ID: 114 Symbol Offset: 33934 Current: ✅ Determined: ✅ +Issue ID: 30 Symbol Offset: 34351 Current: ❌ Determined: ❌ +Issue ID: 31 Symbol Offset: 34570 Current: ❌ Determined: ❌ +Issue ID: 32 Symbol Offset: 34792 Current: ✅ Determined: ✅ +Issue ID: 271 Symbol Offset: 35541 Current: ✅ Determined: ✅ +Issue ID: 272 Symbol Offset: 35824 Current: ✅ Determined: ✅ +Issue ID: 92 Symbol Offset: 36220 Current: ✅ Determined: ✅ +Issue ID: 160 Symbol Offset: 36493 Current: 🚧 Determined: ❌ +Issue ID: 255 Symbol Offset: 36779 Current: 🚧 Determined: ❌ +Issue ID: 256 Symbol Offset: 37074 Current: 🚧 Determined: ❌ +Issue ID: 130 Symbol Offset: 37460 Current: 🚧 Determined: ❌ +Issue ID: 45 Symbol Offset: 37833 Current: ✅ Determined: ✅ +Issue ID: 46 Symbol Offset: 38130 Current: ✅ Determined: ✅ +Issue ID: 273 Symbol Offset: 38393 Current: ✅ Determined: ✅ +Issue ID: 167 Symbol Offset: 38721 Current: ❌ Determined: ❌ +Issue ID: 49 Symbol Offset: 38984 Current: ❌ Determined: ❌ +Issue ID: 185 Symbol Offset: 39465 Current: ❌ Determined: ❌ +Issue ID: 274 Symbol Offset: 39692 Current: ✅ Determined: ✅ +Issue ID: 66 Symbol Offset: 39956 Current: ❌ Determined: ❌ +Issue ID: 33 Symbol Offset: 40261 Current: 🚧 Determined: ❌ +Issue ID: 177 Symbol Offset: 40769 Current: 🚧 Determined: ❌ +Issue ID: 36 Symbol Offset: 41056 Current: ✅ Determined: ✅ +Issue ID: 222 Symbol Offset: 41347 Current: ❌ Determined: ❌ +Issue ID: 37 Symbol Offset: 41723 Current: ❌ Determined: ❌ +Issue ID: 38 Symbol Offset: 41992 Current: ❌ Determined: ❌ +Issue ID: 39 Symbol Offset: 42293 Current: ❌ Determined: ❌ +Issue ID: 40 Symbol Offset: 42533 Current: ❌ Determined: ❌ +Issue ID: 41 Symbol Offset: 42785 Current: ❌ Determined: ❌ +Issue ID: 186 Symbol Offset: 43167 Current: ✅ Determined: ✅ +Issue ID: 187 Symbol Offset: 43454 Current: ✅ Determined: ✅ +Issue ID: 188 Symbol Offset: 43813 Current: ✅ Determined: ❌ +Issue ID: 207 Symbol Offset: 44181 Current: ✅ Determined: ❌ +Issue ID: 178 Symbol Offset: 44497 Current: 🚧 Determined: ❌ +Issue ID: 63 Symbol Offset: 44844 Current: ❌ Determined: ❌ +Issue ID: 250 Symbol Offset: 45678 Current: ❌ Determined: ✅ +Issue ID: 275 Symbol Offset: 45859 Current: ✅ Determined: ❌ +Issue ID: 200 Symbol Offset: 46077 Current: ✅ Determined: ✅ +Issue ID: 203 Symbol Offset: 46293 Current: ✅ Determined: ✅ +Issue ID: 249 Symbol Offset: 46511 Current: ❌ Determined: ✅ +Issue ID: 153 Symbol Offset: 46696 Current: ✅ Determined: ✅ diff --git a/statusupdate.py b/statusupdate.py new file mode 100644 index 0000000..1568573 --- /dev/null +++ b/statusupdate.py @@ -0,0 +1,58 @@ +import re +import requests +from bs4 import BeautifulSoup + +GIT_BASE = 'http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion/nihilist/blog-contributions' +PROXIES = {'http': 'socks5h://127.0.0.1:9050'} +PATTERN = re.compile(r']*href="' + GIT_BASE + r'/issues/(?P\d+)"[^>]*>(?P[✅❌🚧])', re.DOTALL) + +# makes HTTP request to the git page of given issue +# retrieves the labels and returns them as dictionary +def check_issue_labels(iid: int) -> dict[str, bool]: + r = requests.get(GIT_BASE+f'/issues/{iid}', proxies=PROXIES) + + soup = BeautifulSoup(r.content, "html.parser") + + # find the labels list element in html + labels_span = soup.find('span', class_='labels-list ugc-labels') + + result_dict = {} + + if labels_span: + anchors = labels_span.find_all("a", class_="item") + + for anchor in anchors: + label_text = anchor.find('div', class_='ui label').get_text(strip=True) + # if label has 'tw-hidden' class, it means it's not present + result_dict[label_text] = "tw-hidden" not in anchor['class'] + + return result_dict + +# if there're no labels, the blog is done +def is_done_by_labels(labels: dict[str, bool]) -> bool: + return not any(labels.values()) + +f = open('opsec/index.html') +html_content = f.read() +f.close() + +# used for changing the symbols +scratch_hc = list(html_content) + +# iterate over found git issue references +for match in PATTERN.finditer(html_content): + issue_id = match.group('issue_id') + symbol_offset = match.start('symbol') + + print(f"Issue ID: {issue_id}\tSymbol Offset: {symbol_offset}\tCurrent: {html_content[symbol_offset]}\t", end='') + + issue_labels = check_issue_labels(issue_id) + is_done = is_done_by_labels(issue_labels) + symbol = '✅' if is_done else '❌' + print(f"Determined: {symbol}") + + scratch_hc[symbol_offset] = symbol + +fo = open('opsec/index.autogen.html', 'w', encoding='utf-8') +fo.write(''.join(scratch_hc)) +fo.close()