پرش به محتوای اصلی

Parley: چت فدرال و غیرمتمرکز که IRC ساده صحبت می کند

هکرنیوز۱۴۰۵ مهر ۶, دوشنبه، ساعت ۱۴:۰۰حدود 12 دقیقه مطالعه

آدرس مقاله: https://git.mills.io/prologic/parley آدرس نظرات: https://news.ycombinator.com/item?id=49875913 امتیاز: 179 # نظرات: 83

چت فدرال و غیرمتمرکز که IRC ساده صحبت می کند.

Parley یک شبکه چت بدون مرکزی است. هر شخص (یا تیم) نمونه کوچکی را برای دامنه خود اجرا می کند. نمونه‌ها یکدیگر را از طریق DNS و اسناد هویتی معروف پیدا می‌کنند، پیام‌های امضا شده را از طریق HTTPS رد و بدل می‌کنند، و کل شبکه فدرال را به مشتریان عادی IRC مانند irssi، WeeChat یا Textual ارائه می‌کنند، بدون افزونه.

هویت ها شبیه ایمیل هستند: alice@foo.com در foo.com و bob@bar.com در bar.com اجرا می شود. باب /msg alice@foo.com سلام و فقط کار می کند، حتی اگر این دو نمونه قبلا هرگز نام یکدیگر را نشنیده باشند.

وضعیت: اثبات کار مفهوم. این طراحی را از انتها به انتها نشان می دهد و یک نمونه واقعی را اجرا می کند، اما هنوز سخت نشده است. محدودیت ها را ببینید.

دو نمونه (foo.com و bar.com)، دو جلسه سهام irssi.

آلیس به نمونه خود متصل می شود. باب به او وصل می شود:

Bob یک پرس و جو را با /msg alice@foo.com باز می کند و دو نمونه در همانجا با هم متحد می شوند. آلیس در bar.com باب را به عنوان باب می بیند. باب آلیس را به عنوان آلیس در foo.com می بیند:

هر دو به #lobby می‌پیوندند، یک کانال جهانی که در نمونه‌های آنها تکرار می‌شود:

-ناامن و حل و فصل فقط برای توسعه محلی وجود دارد. در تولید، هر نمونه دارای یک دامنه واقعی، یک گواهی TLS، یک رکورد SRV است و همتایان را از طریق DNS پیدا می کند.

نسخه ی نمایشی/ CoreDNS (معتبر برای foo.com و bar.com، با رکوردهای _parley._tcp SRV)، یک CA نسخه ی نمایشی محلی، و هر دو نمونه در Docker را می آورد، سپس جلسات IRC اسکریپت شده را اجرا می کند و شواهد را چاپ می کند:

تصویر ظرف prologic/parley است و docker-compose.example.yml نقطه شروع است. یک نمونه برای example.com که در chat.example.com قابل دسترسی است، نیاز دارد:

مکانی برای اجرای آن، با /داده در ذخیره‌سازی دائمی (کلید نمونه، حافظه پنهان، گزارش‌های کانال و حساب‌ها را در خود نگه می‌دارد):

سپس با parleyctl (در تصویر هم هست) یا صفحه مدیریت حساب ایجاد کنید:

بدون رمز مدیریت و بدون هیچ حساب کاربری، parleyd یک URL یکبار مصرف /setup را ثبت می کند که اولین مدیر را در مرورگر ایجاد می کند. ورود به سیستم از طریق OpenID Connect یا هدرهای هویت یک پروکسی معکوس در docs/AUTH.md توضیح داده شده است. کاربران SSO توکن های IRC را برای مشتریان خود در صفحه تنظیمات خود ضرب می کنند.

HTTPS در مقابل درگاه 8443 در chat.example.com. هر پروکسی معکوسی که TLS را خاتمه می دهد انجام می دهد. خود parleyd HTTP ساده را ارائه می دهد مگر اینکه به آن -tls-cert و -tls-key بدهید.

یک رکورد SRV تا سایر نمونه ها بتوانند شما را پیدا کنند:

بدون آن، همتایان به https://example.com/.well-known/parley/ باز می گردند.

IRC از طریق TLS برای مشتریان شما. شنونده IRC parleyd متن ساده است، بنابراین TLS را در مقابل آن خاتمه دهید. برای مثال، با ماژول لایه 4 Caddy:

سپس، در irssi: /connect -tls -tls_verify chat.example.com 6697 <password-or-token> alice .

پورت در اینجا هر چیزی است که پروکسی شما به آن گوش می دهد. اگر 6697 نیست، گفتگو را با -irc-port (و -irc-host، اگر IRC با نامی متفاوت از نقطه پایانی است) شروع کنید، یا PARLEY_IRC_PORT / PARLEY_IRC_HOST را تنظیم کنید:

صفحه فرود، صفحه تنظیمات، parleyctl و سند نمونه، همگی یک خط اتصال را از آن چاپ می کنند، و صفحه تنظیمات یک توکن زنده را در آن خط چاپ می کند. یک پورت اشتباه تحت نام میزبان درست هنوز تأیید گواهی را می گذراند، بنابراین توکن به هر چیز دیگری که در آنجا گوش می دهد می رود.

آن را از بیرون بررسی کنید. بررسی parleyctl یک نمونه را به روشی که یک همتا انجام می دهد بررسی می کند - رکورد SRV، اسناد شناخته شده، نقطه پایانی تبلیغ شده، صندوق ورودی، و پورت IRC TLS - و می گوید که چه چیزی باید برطرف شود:

به هیچ نشانه ای نیاز ندارد و بر خلاف نمونه های هر کسی عمل می کند، بنابراین نحوه ی این است که شما به همتایان خود بگویید چه مشکلی با آنها وجود دارد. خرابی رایج یک رکورد SRV از دست رفته است: نمونه کاملا در میزبان خود قابل دسترسی است، اما کسی که دامنه هویت را حل کند نمی تواند آن را پیدا کند. -resolve https://chat.example.com را برای بررسی مستقیم میزبان در حالی که DNS هنوز اشتباه است و -json را برای گزارش قابل خواندن توسط ماشین اضافه کنید. در صورت عدم موفقیت در هر چک، غیر صفر خارج می شود.

قالب سیم در docs/PROTOCOL.md مستند شده است.

هیچ فایل پیکربندی وجود ندارد. پیکربندی در دو مکان است و هر چیز دقیقا در یکی از آنها قرار دارد.

پرچم‌گذاری می‌کند که هر کدام دارای یک متغیر محیطی هستند، برای آنچه فرآیند قبل از اینکه بتواند پایگاه داده خود را باز کند، ماشین و شبکه‌ای که روی آن قرار دارد را توصیف می‌کند، و اسرار و تصمیمات اعتماد درباره اینکه چه کسی می‌تواند هویت خود را مطرح کند، پرچم‌گذاری می‌کند. یک پرچم بر متغیر خود پیروز می شود. فقط - دامنه مورد نیاز است.

تنظیمات، در پایگاه داده، برای هر چیزی که یک مدیر ممکن است در حین اجرای نمونه تغییر دهد. آنها از لحظه ذخیره شدن، بدون راه اندازی مجدد، اعمال می شوند و هیچ پرچم و متغیر محیطی ندارند. آنها را در صفحه مدیریت، از طریق PUT /api/v1/settings (docs/API.md)، یا با parleyctl تغییر دهید:

فقط آنچه با پیش‌فرض‌ها متفاوت است ذخیره می‌شود، بنابراین ارتقایی که یک پیش‌فرض را تغییر می‌دهد، آن را برای هر نمونه‌ای که هرگز آن کلید را لمس نکرده است، تغییر می‌دهد.

افراد تصویر خود را در قسمت تنظیمات در رابط وب تنظیم می‌کنند، یا از ادعای تصویر ارائه‌دهنده هویت آنها در هنگام ورود به سیستم می‌آید و دوباره در اینجا میزبانی می‌شود. برای مشتریان IRC به عنوان کلید فراداده آواتار IRCv3 و سایر نمونه‌های موجود در سند کاربر معروف منتشر می‌شود. به docs/PROTOCOL.md مراجعه کنید.

لوگوی نمونه در این جدول نیست، زیرا متن نیست: یک PNG با حداقل 512 پیکسل را در طولانی‌ترین سمت آن در زیر تنظیمات -> نشان‌واره در صفحه مدیریت آپلود کنید و Parley فاویکون، نماد صفحه اصلی و مربعی را که یک کلاینت IRC در کنار شبکه نشان می‌دهد استخراج می‌کند. یک مربع ایده آل است و یک علامت کلمه خوب است - هر چیزی که تا سه برابر بلند باشد به جای رد کردن، روی یک مربع شفاف متمرکز می شود. تا آن زمان، هر نمونه نماد خود پارلی را نشان می دهد، به همین دلیل است که دو تا از آنها در لیست شبکه مشتری شبیه هم هستند.

کمک چت. /help (یا /quote HELP <topic>) صفحات موجود در help/*.txt را ارائه می دهد که در باینری کامپایل شده اند. یک صفحه را ویرایش کنید و برای تغییر آن دوباره بسازید. خط اول عنوان آن است. یک فایل جدید یک موضوع جدید است -- آن را در help/index.txt فهرست کنید که بررسی های آزمایشی را انجام می دهد.

نقاط پایانی: /healthz برای liveness، /api/v1/status برای وضعیت JSON همتایان و کانال‌ها، /metrics برای Prometheus، و API در docs/API.md.

ارتقاء از یک فایل پیکربندی parleyd -config config.json دیگر فایل را نمی خواند: به ازای هر کلید موجود در آن، پرچم، متغیر یا تنظیمی که کلید تبدیل شده است را چاپ می کند و از آن خارج می شود. کلیدهای سطح فرآیند را به فایل واحد یا فایل نوشتن منتقل کنید، نمونه را شروع کنید، سپس تنظیمات parleyctl import config.json بقیه را یکباره اعمال می‌کند و مواردی را که نادیده گرفته شده نام‌گذاری می‌کند.

با پایان یافتن TLS در مقابل شنونده IRC، هر مشتری از پروکسی وارد می‌شود: گزارش‌ها میزبان اشتباهی را نام‌گذاری می‌کنند و محدودیت‌های هر آدرس یا کاری انجام نمی‌دهند یا همه را به یکباره قفل می‌کنند. پروکسی را در irc_proxies فهرست کنید و سپس باید یک سرصفحه پروتکل PROXY (v1 یا v2) به هر اتصال اضافه کند.

این دو تغییر است و هیچ کدام به تنهایی کار نمی کند. فهرست کردن پروکسی که هدر ارسال نمی کند، تمام اتصالات را از آن حذف می کند. ارسال سرصفحه از آدرسی که در لیست نیست، آن را به عنوان زباله به تجزیه کننده IRC می‌رساند. هیچ نظم امنی وجود ندارد، بنابراین هر دو را با هم تغییر دهید و آماده باشید که هر دو را دوباره برگردانید.

پیش‌فرض خالی است، که کل چیز خاموش است. 127.0.0.1/32 در زیر یک مثال است، نه پیش‌فرض - آدرسی را که اتصالات خود واقعا از آن می‌آیند جایگزین کنید:

به نام توجه کنید: PARLEY_TRUSTED_PROXIES معادل شنونده وب است و کاملا یک تصمیم متفاوت است.

برای پیدا کردن آدرس فهرست شده، یک بار متصل شوید و گزارش را بخوانید. هر آدرس مشتری اولین باری که مشاهده می شود گزارش می شود:

پشت پراکسی، هر کلاینت یک آدرس را به اشتراک می‌گذارد، به‌طوری‌که این یک خط است که دقیقا آنچه را که در irc_proxies تعلق دارد، نام می‌برد. همیشه آدرس روی سوکت است، هرگز آدرسی که هدر حمل می کند -- آدرس سرصفحه هرگز نمی تواند با لیست مطابقت داشته باشد، بنابراین گزارش آن یک مقدار تضمین شده برای شکست را به شما می دهد. هنگامی که پروکسی لیست شد و هدرها را ارسال کرد، خط با trusted_proxy=true دوباره برای آن ظاهر می‌شود، که تاییدی است بر اینکه اکنون دو نیمه موافق هستند.

فقط آدرس‌های فهرست‌شده باور می‌شود، و اتصال یکی از آن‌ها که هدر ندارد، به جای اینکه به‌عنوان یک ارتباط مستقیم در نظر گرفته شود، حذف می‌شود - با پذیرش هر دو شکل از یک مکان، آدرس جعلی را که سربرگ وجود دارد برای متوقف کردن بازگرداند. این افت‌ها در parley_irc_proxy_rejected_total محاسبه می‌شوند، که معیاری است که باید هنگام ایجاد تغییر مشاهده کرد.

شنونده وب همان نابینایی و تنظیمات خاص خود را دارد. در پشت یک پراکسی معکوس، هر درخواستی از آن پراکسی می‌رسد، بنابراین دروازه‌های هر آدرس در ورود به وب، صندوق ورودی فدراسیون و فید همه یک سطل را به اشتراک می‌گذارند - یک محدودیت نرخ جهانی با نام هر آدرس. پروکسی را در http_proxies لیست کنید و X-Forwarded-For از آن باور شده است و هیچ چیز دیگری تغییر نمی کند.

از آن به جای auth.trusted_headers.proxies استفاده کنید، که به نظر می‌رسد این کار را انجام می‌دهد و کارهای بیشتری انجام می‌دهد: یک پراکسی در آن لیست ممکن است نشان دهد که کاربر چه کسی است، بنابراین درخواست برای /ورودی که حاوی Remote-User است بدون رمز عبور وارد سیستم می‌شود. رفع محدودیت نرخ دلیلی برای فعال کردن ورود بدون رمز عبور نیست. فهرست هویت نشان‌دهنده آدرس یک است، زیرا یک پروکسی مورد اعتماد تا این حد نمی‌تواند در مورد یک آدرس شک کند.

نسخه گام به گام، شامل سفارشی که به جای دو قطع، یک قطع هزینه دارد، در docs/PROXY.md است.

با در دست داشتن آدرس‌های واقعی، max_conns_per_addr برای روشن کردن امن می‌شود، و با روشن کردن آن، سطل ورود هر آدرس به IRC نیز اعمال می‌شود. در حالی که شنونده پشت یک پراکسی فهرست نشده می‌نشیند، آن را روی 0 بگذارید: هر کلاینت یک آدرس را در آنجا به اشتراک می‌گذارد، بنابراین سقف هیچ‌کس را به‌خصوص محدود نمی‌کند، همه را یک‌باره قفل می‌کند. این یک تنظیم است، بنابراین روشن کردن آن تنظیمات parleyctl max_conns_per_addr 8 است و نیازی به راه اندازی مجدد ندارد. عقب نشینی ورود به حساب به هر صورت اعمال می شود - به docs/AUTH.md مراجعه کنید.

/metrics قالب متنی Prometheus را ارائه می‌کند: اتصالات، حساب‌های آنلاین، کانال‌ها، پیوندهای همتا، و شمارنده‌ها برای فشارها، رویدادهای صندوق ورودی، خواندن فید، پیام‌های برچسب و مواردی که رد شده است. به‌طور پیش‌فرض به یک توکن مدیریت نیاز دارد، زیرا تعداد افراد در یک نمونه به کسب‌وکار اپراتور مربوط می‌شود. تنظیم metrics_public را به گونه‌ای تنظیم کنید که به طور آشکار به آن ارائه شود. هر نمونه یک شمارش است -- بدون نام، بدون نام کانال، بدون دامنه همتا.

<data_dir>/identity.key تنها فایلی است که قابل بازسازی نیست. هویت دامنه جفت کلید است: آن را گم کنید و هر همتای که کلید عمومی قدیمی را در حافظه پنهان ذخیره کرده است، نمونه را رد می کند، و تنها راه حل یک کلید جدید است که همه باید دوباره به آن اعتماد کنند. پشتیبان گیری از آن در میزبان، خارج از میزبان:

اگر کلید نشت کند، تعویض آن یک عملیات پشتیبانی شده است تا یک فاجعه:

همسالان خود به خود بهبود می یابند. امضایی که نمی‌توانند تأیید کنند باعث می‌شود سند نمونه را یک بار دوباره بخوانند، جایی که کلید عمومی جدید را پیدا می‌کنند، بنابراین هزینه هر یک از درخواست‌های ناموفق است - و اگر آن درخواست یک سلام بود، چند دقیقه قبل از اینکه دوباره امتحان کنند، عقب‌نشینی کنند. کلید قدیمی به عنوان شناسه کلید.<انگشت>.bak نگهداری می شود زیرا تنها اشتباه غیرقابل جبران در اینجا تعویض کلیدی است که هنوز به آن نیاز داشتید. پس از آن، parleyd را مجددا راه اندازی کنید تا مورد جدید ارائه شود.

اینها به‌جای عبور از API، دایرکتوری داده‌ها را مستقیما می‌خوانند و می‌نویسند، زیرا یک نشانه مدیریت هرگز نباید بتواند کلید خصوصی را از طریق شبکه واکشی کند. آنها را روی میزبان نمونه اجرا کنید، با -data-dir یا PARLEY_DATA_DIR که به دایرکتوری داده اشاره می کند.

چیزی برای اجرا نیست: پایگاه داده در اولین شروع جداول جدید خود را به دست می آورد و جدول های قدیمی دست نخورده باقی می مانند. آنچه در زیر می آید تعداد انگشت شماری از چیزهایی است که در زمان شما تغییر کرده است، ابتدا جدیدترین.

چقدر یک حساب ممکن است بگوید اکنون محدود است. message_rate (1 در ثانیه) و message_burst (20 به طور همزمان) برای همه به جز ربات‌ها اعمال می‌شود که توسط حساب کلید می‌خورند، بنابراین مشتریان یک شخص یک بودجه مشترک دارند. به یک پیام رد شده پاسخ داده می شود. هر نمونه قبل از این اصلا محدودیتی نداشت، بنابراین اگر اتاق شما شلوغ‌تر از آن است، اعداد را افزایش دهید یا message_rate را روی 0 تنظیم کنید، که رفتار قدیمی است:

این یک تنظیم است، بنابراین بدون راه اندازی مجدد فرود می آید.

کسی در نمونه دیگری alice:foo.com است، نه alice/foo.com. جداکننده از draft/relaymsg قرض گرفته شده بود، و کپی کردن آن نیمه اشتباهی از قرارداد بود: یک کلاینت سختگیر از اشتباه گرفتن نام سرور با نام با نیاز به هر دو، محافظت می کند. و a : یا هیچ، و نام با دامنه دارای نقطه و بدون دو نقطه است. چنین کلاینتی کل پیشوند را به عنوان نام سرور می خواند و هر JOIN، PART، QUIT، NICK و AWAY را از یک کاربر راه دور حذف می کند، در حالی که PRIVMSG بی سر و صدا کاهش می یابد - به همین دلیل است که چت خوب به نظر می رسد و هیچ فهرستی هرگز به روز نشده است.

PARLEYSEP در ISUPPORT می گوید که کدام کاراکتر در حال استفاده است، بنابراین یک ربات باید آن را از آنجا بخواند تا کد سخت.

تله در حالی که یک شبکه در اواسط ارتقاء می‌یابد: به عنوان بایت، فدراسیون را از متن عبور کنید. شخصی در یک همتا که هنوز در / است alice/foo.com را تایپ می‌کند و تا زمانی که ارتقاء ندهند، با چیزی مطابقت ندارد. به جای اینکه اجازه دهید آن ها را پیدا کنند به همسالان خود بگویید.

واکنشی که به همتای قدیمی‌تر از v0.5.0 ارسال می‌شود، از بین می‌رود، در صف قرار نمی‌گیرد. آن نسخه‌ها به نوع رویدادی که با 422 پیاده‌سازی نمی‌کنند پاسخ می‌دهند، و رد کردن برای صندوق ارسالی فرستنده نهایی است: رویداد حذف می‌شود و به فرستنده گفته می‌شود که ارسال ناموفق است. از نسخه 0.5.0 به بعد، به یک نوع اجرا نشده 200 {"unsupported": true} پاسخ داده می شود، بنابراین این آخرین تغییری است که باید منتظر کل مش بود. واکنش‌های بین افراد در اینجا، و بین نمونه‌های ارتقا یافته، بی‌تأثیر است.

GET /api/v1/status دیگر فهرست کانال ها را منتشر نمی کند. این تنها نقطه پایانی تایید نشده است، و همه اعضای هر کانال جهانی را نام‌گذاری می‌کرد - از جمله کاربران همتای ما، از طرف آنها، زمانی که صفحه فرود آنها تعدادشان را منتشر می‌کند و هرگز نامی را منتشر نمی‌کند. یک کانال همچنان دارای نام، تعداد اعضا و دامنه های دیگر با اعضای آن است. هیچ چیز در فدراسیون آن را نخوانده است: همتایان اعضای خود را در عکس های لحظه ای سلام امضا شده مبادله می کنند.

history_replay اکنون از 20 به 50 پیش‌فرض می‌شود. فقط تنظیماتی که هرگز تنظیم نکرده‌اید از یک پیش‌فرض پیروی می‌کنند، بنابراین نمونه‌ای که عددی را انتخاب کرده است، آن را حفظ می‌کند.

اینها رفته اند نسخه جدید را شروع کنید، سپس لیست قدیمی را یک بار وارد کنید:

اجراهای آزمایشی را انجام می دهد سناریوهای پایان به انتها در فرآیند که کانال های جهانی و محلی را پوشش می دهد، پیام های مستقیم با همتاسازی خودکار، تبادل همتا، پیگیری پس از توقف، رد امضا و اصول اولیه IRC.

شکاف های شناخته شده، تقریبا به ترتیبی که باید بسته شوند:

خواندن متن کامل در هکرنیوزبه زبان اصلی، در سایت ناشر باز می‌شود
متن اصلی (انگلیسی)

Parley: Federated, decentralised chat that speaks plain IRC

Article URL: https://git.mills.io/prologic/parley Comments URL: https://news.ycombinator.com/item?id=49875913 Points: 179 # Comments: 83

همه‌ی اخبار فناوری