इस प्रोजेक्ट के बारे में
Wappie एक मल्टी-टेनेंट WhatsApp API सर्वर है जिसमें एक सील्ड आर्काइव है, साथ ही एक वेब क्लाइंट है जो उसी API का उपयोग करता है। यह HTTP और WebSocket के माध्यम से बिजनेस सिस्टम को WhatsApp से जोड़ता है, जिसमें साझा वर्कस्पेस, प्रति-नंबर अनुमतियाँ और एक मैसेजिंग क्लाइंट शामिल हैं। सर्वर, CLI, वेब क्लाइंट और बुनियादी प्रशासन Apache-2.0 ओपन सोर्स हैं; मैनेज्ड होस्टिंग और कमर्शियल बिलिंग अलग से बनाए रखे गए हैं, होस्टेड पायलट केवल आमंत्रण-आधारित और निःशुल्क है, और वहां भुगतान सिम्युलेटेड हैं।
कार्यात्मक रूप से, सर्वर टर्मिनल का उपयोग करके WhatsApp डिवाइस को या तो आठ-अक्षर के कोड (Linked devices के तहत टाइप किया गया) या टर्मिनल में रेंडर किए गए QR के माध्यम से पेयर करता है, और फिर आने वाले उस डिवाइस के ट्रैफ़िक को सील कर देता है। यह हिस्ट्री सिंक, प्रोजेक्ट एडिट्स, रिवोकेशन और रिएक्शन को इंजेस्ट करता है, रसीदें रिकॉर्ड करता है, और ट्रैक करता है कि प्रत्येक रीडर की स्क्रीन पर कौन सा रिविजन था। इनबाउंड मीडिया को ठीक वैसे ही स्टोर किया जाता है जैसे Meta CDN ने इसे सर्व किया था, और आउटबाउंड मीडिया अपलोड और सेंड समर्थित हैं, साथ ही view-once भी। स्ट्रक्चर्ड कंटेंट (लोकेशन, पोल, कॉन्टैक्ट, इवेंट), कॉन्टैक्ट्स, नाम और प्रोफाइल पिक्चर, ऑन-डिमांड बैकफिल और अनरीड काउंट, टिक, प्रेजेंस, ग्रुप और पोल के साथ एक कन्वर्सेशन लेयर सभी लागू हैं। एक्सेस एक CLI टूल (`wsctl`) और एक HTTP/WebSocket API के माध्यम से है, जिसमें एक होस्टेड एंडपॉइंट और WebSocket के लिए `/v1/ws` है।
आर्काइव प्रोटेक्शन मॉडल इस प्रोजेक्ट का मुख्य केंद्र है। WhatsApp मीडिया पहले से ही 32-बाइट मीडिया कुंजी के तहत encrypt-then-MAC HMAC के साथ AES-256-CBC एन्क्रिप्टेड आता है; सिफरटेक्स्ट को शब्दशः स्टोर किया जाता है और केवल मीडिया कुंजी को डिवाइस पब्लिक की (public key) के साथ सील किया जाता है। मैसेज बॉडीज को एक बैच को कवर करने वाली कंटेंट की (content key) के तहत HPKE (RFC 9180, X25519 + HKDF-SHA256 + AES-256-GCM) के साथ सील किया जाता है, जिसे README में थ्रूपुट के बजाय लागत के आधार पर उचित ठहराया गया है। सर्वर केवल पब्लिक की रखता है: यह सील कर सकता है लेकिन खोल नहीं सकता। प्रत्येक डिवाइस की एक आर्काइव की-पेयर होती है जिसे उसे पेयर करने वाले क्लाइंट द्वारा जेनरेट किया जाता है; प्राइवेट हिस्सा उस हर अकाउंट की पब्लिक की के साथ सील किया जाता है जो उस डिवाइस को पढ़ सकता है (एक की ग्रांट) और फिर उसे भुला दिया जाता है। अकाउंट प्राइवेट कीज़ साइनअप के समय ब्राउज़र में जेनरेट की जाती हैं, अकाउंट एड्रेस से जुड़े Argon2id-व्युत्पन्न कुंजी के तहत रैप की जाती हैं, और कभी ट्रांसमिट नहीं की जाती हैं; एक रिकवरी कोड उसी कुंजी को दूसरी बार रैप करता है। ब्राउज़र पेज के अंदर HPKE, कंटेंट-की हैंडलिंग, मैसेज बॉडीज, कॉन्टैक्ट नाम, प्रोफाइल पिक्चर और अटैचमेंट डिक्रिप्शन करता है।
अनुमतियाँ लेयर्ड हैं: API कीज़ में `read`, `send` या `full` का स्कोप होता है; एक सदस्य केवल उन डिवाइस तक पहुँचता है जो उन्हें दिए गए हैं; एक ओनर या एडमिन हर डिवाइस के एनवेलप तक पहुँच सकता है और पेयर, ग्रांट, कीज़ मिंट और डिवाइस को डिस्क्रीट और लाउड के बीच टॉगल कर सकता है; कोई भी स्कोप टेनेंट कॉन्फ़िगरेशन तक नहीं पहुँचता। किसी तीसरे पक्ष को एक सर्विस अकाउंट दिया जाता है — बिना पासवर्ड वाला एक की-पेयर, जिसे किसी व्यक्ति की तरह डिवाइस दिए जाते हैं और जो उसके रूप में कार्य करने वाली API की के माध्यम से पहुँचा जाता है। रिटेंशन डिफ़ॉल्ट रूप से बंद है; एक टेनेंट एक विंडो सेट कर सकता है जिसे सर्वर संदेशों, रसीदों, ग्रुप इवेंट्स और अटैचमेंट पर प्रति घंटे लागू करता है, जबकि चैट्स और कॉन्टैक्ट्स बने रहते हैं। किसी व्यक्ति को हर डिवाइस के आर्काइव से मिटाया जा सकता है, और डिवाइस को हटाने या आर्काइव को रीसेट करने से उसके अटैचमेंट ऑब्जेक्ट स्टोरेज से हट जाते हैं। लॉग हर स्तर पर आइडेंटिफायर्स को मास्क करते हैं।
लोकल रनिंग के लिए `uuidv7()` के लिए PostgreSQL 18 या उससे नया संस्करण और एक नॉन-सुपरयूज़र रोल की आवश्यकता होती है क्योंकि सुपरयूज़र्स रो-लेवल सिक्योरिटी को बायपास करते हैं। ऑब्जेक्ट स्टोरेज वैकल्पिक है: यदि कोई कॉन्फ़िगर नहीं है, तो अटैचमेंट डेटाबेस में तब तक कतारबद्ध रहते हैं जब तक स्टोरेज उपलब्ध न हो जाए। एक `make dev-up` टारगेट Docker में Postgres और MinIO को चालू करता है। टेस्ट टारगेट फॉर्मेटिंग, वेटिंग, लेआउट, रेस-इनेबल्ड टेस्ट, ब्राउज़र क्लाइंट के टाइपचेक और बिल्ड, कवरेज और फज़िंग को कवर करते हैं, और प्रत्येक टेस्ट अपने स्वयं के Postgres स्कीमा में चलता है। वेब क्लाइंट को Vite के साथ `web/dist` में बनाया गया है और `WS_WEB_DIR` द्वारा सर्व किया जाता है; Go बाइनरी में कुछ भी एम्बेडेड नहीं है, और बिना बिल्ड के सर्वर केवल API सर्व करता है। डेवलपमेंट के दौरान Vite सर्वर `/v1` को Go पोर्ट पर प्रॉक्सी करता है, क्योंकि वेबसॉकेट हैंडलर केवल सेम-ओरिजिन कनेक्शन स्वीकार करता है।
README स्पष्ट रूप से सीमाओं को बताता है। एक हमलावर जो लाइव सर्वर पर कोड चला रहा है, वह Signal डिक्रिप्शन, सीलिंग और स्टोरेज के बीच ट्रांज़िट में प्लेनटेक्स्ट देख सकता है, इसलिए एट-रेस्ट सीलिंग चोरी हुई डिस्क, लीक हुए बैकअप या डेटाबेस डंप की रक्षा करती है, न कि कॉम्प्रोमाइज्ड प्रोसेस की। whatsmeow सेशन स्टोर प्रोसेस द्वारा पठनीय रहना चाहिए; जो कोई भी इसे चुराता है वह डिवाइस का रूप धारण कर सकता है और नए संदेश पढ़ सकता है, लेकिन आर्काइव नहीं। आउटबाउंड टेक्स्ट और आउटबाउंड मीडिया स्पष्ट रूप से पास होते हैं, क्योंकि WhatsApp का अपलोड केवल क्लियरटेक्स्ट स्वीकार करता है; इनबाउंड मीडिया सर्वर-साइड पर कभी डिक्रिप्ट नहीं किया जाता है। अटैचमेंट मेटाडेटा (प्रकार, आकार, आयाम, अवधि, हैश) और रूटिंग मेटाडेटा, जिसमें रसीदें शामिल हैं, पठनीय हैं, इसलिए एक डेटाबेस डंप सोशल ग्राफ और किसने क्या और कब पढ़ा, यह प्रकट करता है, लेकिन कंटेंट नहीं। ग्रांट को रिवोक करने से कुंजी को दोबारा प्राप्त करना बंद हो जाता है लेकिन पहले से अनलॉक की गई कॉपी को वापस नहीं लिया जा सकता, क्योंकि कुंजी ब्राउज़र में थी। एक्सेस के हर रास्ते को खोने से आर्काइव स्थायी रूप से सबके लिए खो जाता है। ब्राउज़र सेशन मटेरियल नॉन-एक्सट्रैक्टेबल WebCrypto कीज़ के तहत सिफरटेक्स्ट के रूप में IndexedDB में रहता है, और क्लाइंट एक कंटेंट सिक्योरिटी पॉलिसी भेजता है और कोई थर्ड-पार्टी जावास्क्रिप्ट लोड नहीं करता है।
स्टेटस टेबल कंकाल, माइग्रेशन और मीडिया क्रिप्टो से लेकर पेयरिंग, इंजेस्ट, एडिट/रिवोक/रिएक्ट प्रोजेक्शन, मीडिया इनबाउंड और आउटबाउंड, हिस्ट्री सिंक, मीडिया रिट्राय, कॉन्टैक्ट्स, ऑन-डिमांड बैकफिल, वेब क्लाइंट, प्रति-डिवाइस कीज़ और अकाउंट्स, कन्वर्सेशन लेयर, इनकॉग्निटो और कोटा, और एक सुरक्षा ऑडिट पास तक के पूर्ण चरणों को सूचीबद्ध करता है; एडमिन कंसोल को अगले चरण के रूप में सूचीबद्ध किया गया है। क्रॉस-इम्प्लीमेंटेशन टेस्ट वेक्टर्स Go में जेनरेट किए जाते हैं और दोनों इम्प्लीमेंटेशन द्वारा खोले जाते हैं, जिसमें नेगेटिव केस भी शामिल हैं जैसे कि एक ब्लॉब को दूसरी रो में ले जाना या दूसरे प्रकार के तहत प्रस्तुत करना, ताकि ब्राउज़र क्लाइंट चुपचाप केवल अपने आप से सहमत न हो। एक `seeddemo` टूल क्लाइंट को बिना फोन पेयर किए विकसित करने के लिए वास्तविक इंजेस्ट पाइपलाइन के माध्यम से एक छोटी नकली बातचीत लिखता है।
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.