سلام دوست عزیز😃👋
به مسابقه «همکد ۵ - Front-end» خوش آمدی!
هرگونه ارتباط با سایر شرکتکنندگان و یا استفاده از ابزارهای تولید کد، مثل chatGPT
و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکتکنندگان مسابقه حذف میشوید. سوالات و مشکلات خودتان را میتوانید از طریق قسمت «سوال بپرسید» با ما در میان بگذارید.
سوال اول صرفاً برای آموزش کار با سیستم داوری است و هیچ تاثیری در نتیجهی مسابقه ندارد.
در صورت امکان انتخاب زبان، حل سوال با TypeScript
برای استخدام اولویت بالاتری دارد.
موفق باشید و بهتون خوش بگذره 😉✌
پروژهی اولیه را از این لینک دانلود کنید.
شما تنها مجاز به انجام تغییرات در فایلهای علامت زده میباشید
هر قسمت سوال شامل دو بخش میباشد
public
) میباشند، توسط سیستم داوری بررسی و نمره دهی میشوند.div#logs
نمایش داده شوند.در این سوال شما تنها مجاز به استفاده از کتابخانههای زیر میباشید:
ماجرا از این قرار است که مهیار نه تنها به هیچکس، حتی خودش اعتماد ندارد بلکه به نرمافزارها نیز اعتماد ندارد. به همین منظور، قصد دارد یک پیامرسان بسیار امن با رمزگذاری سرتاسری (End To End Encryption یه به اختصار E2EE) راهاندازی کند. در این پیامرسان پیامها به صورت کاملا رمزگذاری شده به ازای هر فرد بین کاربران ارسال میشود.
از دیگر قابلیتهای این پیامرسان امکان ایجاد گروه است! حتی چتهای شخصی در قالب یک گروه صورت میگیرند، در این پیامرسان از گروهها به عنوان اتاق (Room) یاد میشود.
همچنین این پیامرسان هیچ اطلاعاتی را نه در سمت سرور و نه در سمت کاربر نگه داری نمیکند فلذا بدین معنا است که پس از بسته شدن مرورگر توسط کاربر تمامی اطلاعات فراموششده و پس از بازگشت به برنامه باید اطلاعات مورد نیاز مجددا توسط کاربر وارد شوند.
به منظور مدیریت متغیرها به شیوه صحیح و با رعایت قید ذکر شده نیاز به پیاده سازی یک حافظه متغیر بسیار ساده “Key-Value Pair” وجود دارد که باید آن را درون فایل memory.ts
تکمیل نمایید، این حافظه چیزی جز یکobject
ساده نیست که چهار تابع برای مدیریت حافظه مذکور را دار میباشد:
getMemory
که از حافظه موقت یک رونوشت (Copy) را برمیگرداند.memoryForget
که با دریافت نام کلید آن را از حافظه موقت حذف میکند.memoryRecall که
با دریافت نام کلید مقدار تعیین شده برای آن کلید را بر میگرداند، در صورتی که کلید مذکور وجود نداشت باید مقدارundefined
برگردانده شود.memoryRemember
که با دریافت یک کلید و مقدار که میتواند یک متغیر باشد یا یک تابع که به عنوان ورودی مقدار متغیر قبلی را دریافت کرده و مقدار جدیدی را برمیگرداند، درون حافظه مقدار کلید را تنظیم و یا باز تنظیم کند. .
json با کلیدهای زیر بارگذاری نماید:name
وارد میشود و از جنس رشته میباشد و باید حداقل ۳ کارکتر باشد در صورتی که طول رشته کمتر از ۳ بود باید ارور با پیغام زیر برگردانده شود:public
در قالب یک رشته میباشد.private
در قالب یک رشته میباشد.همچنین در مورد کلیدهای شخصی و عمومی این رشته کدگذاری شده باید موارد زیر بررسی و صحت سنجی شوند:
آیا کلیدهای ارسالی از نوع RSA256
میباشد؟ در غیر این صورت اروری با پیغام زیر برگردانده شود
-برای مثال فایلی با محتوای زیر تمامی شرایط فوق را دارا میباشد:
برای تکمیل این قسمت شما باید موارد زیر را تکمیل نمایید
encrypt.ts
🔗در این فایل شما باید isValidData
از کلاس EncryptionService
را تکمیل نمایید بدین نحو که با دریافت کردن اطلاعات کاربر در قالب یک Object
، خطاها را در صورت وجود در قالب یک آرایه شامل رشتهها برگرداند و درصورتی که هیچ مشکلی در داده ورودی نبود آرایه خالی برگرداند.
main.ts
🔗در این فایل شما باید قابلیتی را پیاده سازی کنید در هنگامی که کاربر فایل جدید را در #file-upload
بارگذاری کرد آن را صحت سنجی کرده و آن را درون حافظه با کلید credentials
ذخیره نماید. و در صورت بروز خطا، خطاها را به کاربر نمایش دهد. همچنین در صورتی که فایل دارای مشکل بود باید پیغام زیر به کاربر نمایش داده شود:
همانطور که قبلا ذکر شد در این پیامرسان، مفهومی تحت عنوان اتاق وجود دارد که میتواند حداقل یک عضو داشته باشد. تمامی افراد میتوانند به شرط داشتن گذرواژه وارد این اتاقها شوند، البته فردی که اتاق را در ابتدا درست کرده است، میتواند به نحو خاصی که در ادامه به آن اشاره خواهد شد، فقط به افراد به خصوصی امکان اجازه دسترسی بدهد حتی اگر رمز و نام اتاق را به نحوی به دست آورده باشند این مکانیزم منجر به این قضیه خواهد شد تا افراد فاقد صلاحیت نتوانند وارد اتاق شوند.
همانطور که ذکر شد، کاربر برای ایجاد و یا عضویت در اتاق باید نام اتاق (roomName
) به همراه گذرواژه (password
) و کلید عمومی خود را در قالب یک شی به سمت سرور ارسال کند:
/api/join/
🔗در گام اول، کاربر اطلاعات مذکور را به آدرس /api/join/
ارسال میکند و با یکی از سه سناریوی زیر مواجه میشود:
در صورتی که کاربر اطلاعات را به درستی وارد کرده باشد ولی با خطای 404 مواجه شود، باید همان اطلاعات را به مسیر /api/create/
ارسال کند و پس از ایجاد، مجدداً درخواست اول تکرار و ارسال شود.
در صورتی که گذرواژه به اشتباه وارد شده باشد، باید پیغامی با محتوای زیر در div#request-status
نمایش داده شود:
div#request-status
پیغام زیر نمایش داده شود:/api/create/
🔗کاربر اطلاعات زیر را به آدرس /api/create/
ارسال میکند تا یک اتاق جدید ایجاد کند:
اگر ایجاد اتاق موفقیتآمیز باشد، سرور یک پیام موفقیت با محتوای زیر به کاربر بازمیگرداند:
در غیر این صورت، باید خطای دریافتی از سمت سرور درو div#request-status
نمایش داده شود.
الزاما داشتن نام اتاق و گذرواژه آن راه مطلوبی برای تضمین امنیت گروهها نیست زیرا در صورتی که اطلاعات حساس اتاق وصل شود هر فردی میتواند به این اتاق دسترسی پیدا کند به همین منظور مهیار تصمیم گرفت که برای مدیریت این قضیه قابلیتی اضافه کند تا افرادی که دارای صلاحیت هستند را با استفاده از کلید عمومی آنها به گروه اضافه کند برای این منظور باید به درخواست زیر ارسال شود:
room.ts
تکمیل نماییدmain.ts
مطابق فیلدهایی که در فایل index.html
عملکرد مطلوب را پیاده سازی کنید برای ارتباط بلادرنگ، کاربران باید به یک WebSocket متصل شوند که پیاده سازی آن در فایل socket.ts
باید صورت بگیرد. برای این کار، باید از آدرس زیر استفاده شود و باید token
حاصل شده از بخش قبلی را در بخش احراز هویت Header ارسال نماید:
پس از اتصال موفق، کاربر کلید عمومی همراه با نام خود و شناسه اتصال سوکت را برای تمامی کاربران حاضر در اتاق در قالب یک رخداد تحت عوان publicKey
ارسال مینماید. همچنین باقی کاربران پس از دریافت باید اطلاعات خود را نیز در قالب همان رخداد ارسال نمایند.
input
مربوطه بنویسید و سپس دکمه Send
را فشرده تا روند اصلی ارسال آغاز شود.