سلیب که از امنیت کوئرا به ستوه آمده بود، با نیما (اسطورهی امنیت در سطح بینالمللی) در اینباره صحبتی را شروع کرد. نیما به این نتیجه رسید که کوئرا نیاز به یک اقدام امنیتی در ورود به حساب کاربری دارد. پیشنهاد او تأیید از طریق SMS بود و تأکید اکیدی بر زمان انقضای آنها داشت. به نظر او هر کد تأیید باید فقط برای ۱۰ ثانیه معتبر میبودند و پس از گذشت بیش از ۱۰ ثانیه، کد دیگر مورد قبول نباشد. سلیب از آنسو تاکید بر ماندگاری دیتاها داشت. به نظر او نیاز بود تا تمامی اطلاعات را به فرمت زیر در یک فایل CSV نگهداری کند:
Phone,Code,Expiration
در ستون اول شماره مورد نظر، ستون دوم کد ساخته شده برای شماره و در ستون سوم اعتبار کد را نمایش میدهد، در ادامه به بیان جزئیات بیشتر سؤال میپردازیم.
جزئیات پروژه
پروژهی اولیه را از این لینک دانلود کنید.
ساختار فایلهای پروژه بهصورت زیر است:
SMSAuthentication
├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └── org
│   │           └── quera
│   │               └── smsauthentication
│   │                   └── SMSAuthentication.java
│   └── test
│       └── java
│           └── org
│               └── quera
│                   └── smsauthentication
│                       └── SMSAuthenticationSampleTest.java
└── test.csv
شما باید متدهای generateCode، sendAuthenticationSMS، loadData، verifyCode موجود در کلاس SMSAuthentication را مطابق با خواستههای سؤال پیادهسازی کنید. نمای کلی فایل مورد نظر به شکل زیر است:
package org.quera.smsauthentication;
import ...
public class SMSAuthentication {
    public static String generateCode() {
        // TODO: Implement
    }
    public static String sendAuthenticationSMS(String phone, String path) {
        // TODO: Implement
    }
    public static List<String[]> loadData(String path) {
        // TODO: Implement
    }
    public static boolean verifyCode(String code, String phone, String path) {
        // TODO: Implement
    }
    public static void main(String[] args) {
        System.out.println(sendAuthenticationSMS("09381358888", "test.csv"));
        Scanner sc = new Scanner(System.in);
        String code = sc.next();
        System.out.println(verifyCode(code,"09381358888","test.csv"));
    }
}
متد generateCode
این متد باید یک رشته تصادفی به طول ۵ بسازد و مقدار آن را برگرداند. در این رشته میتوانید از فقط متشکل از ارقام انگلیسی استفاده کنید. نمونهی اجرای متد در زیر آمده است:
>>> generateCode()
40142
>>> generateCode()
18272
>>> generateCode()
00168
متد sendAuthenticationSMS
این متد یک رشته به عنوان شماره و رشتهای دیگر به عنوان آدرس فایلی که باید اطلاعات را در آن ذخیره کند، به عنوان ورودی دریافت میکند. خروجی این متد باید رشتهای به فرمت JSON باشد. در خروجی JSON مورد نظر باید کلید و مقدارهای زیر را داشته باشد:
- کلید 
phoneبرابر با مقدار شماره مورد نظر خواهد بود. - کلید 
codeبرابر با کد ساخته شده برای شماره مورد نظر خواهد بود. - کلید 
expبرابر با زمانی که کد مورد نظر منقضی میشود است، زمان در این سؤال به فرمت"yyyy/MM/dd-HH:mm:ss"استفاده میشود. 
این متد باید این محتوا را درون فایل CSV موجود در آدرس path ذخیره کند. خروجی و رفتار خواسته شده در بخش مثال با جزئیات بیشتری نمایش داده شده است.
مثال
>>> sendAuthenticationSMS("09381354444", "test.csv")
{"phone":"09381354444","code":"06505","exp":"2022/10/04-18:02:15"}
>>> sendAuthenticationSMS("09381354443", "test.csv")
{"phone":"09381354443","code":"26052","exp":"2022/10/04-18:07:39"}
>>> sendAuthenticationSMS("09381354444", "test.csv") // duplicate
{"phone":"09381354444","code":"00300","exp":"2022/10/04-19:02:48"}
محتوای چند خط آخر فایل test.csv پس از اجرای بالا برابر با زیر خواهد بود:
Phone,Code,Expiration
...
09381354444,06505,2022/10/04-18:02:15
09381354443,26052,2022/10/04-18:07:39
09381354444,00300,2022/10/04-19:02:48
متد loadData
این متد یک رشته به عنوان آدرس فایلی که باید اطلاعات آن را بخواند، به عنوان ورودی دریافت میکند. خروجی این متد لیستی از آرایهای از Stringها خواهد بود که برابر با مقادیر موجود در فایل CSV ورودی متد است.
مثال
برای مثال فرض کنید محتوای فایل CSV بهصورت زیر باشد:
Phone,Code,Expiration
09381354444,06505,2022/10/04-18:02:15
09381354443,26052,2022/10/04-18:07:39
09381354444,00300,2022/10/04-19:02:48
اگر متد را بهصورت زیر فراخوانی کنیم
List<String[]> allData = loadData("test.csv");
و بخواهیم خروجی متد را بهصورت زیر چاپ کنیم:
for(String[] data : allData) {
    for(String attr : data) {
        System.out.print(attr + " ");
    }
    System.out.println();
}
خروجی بهصورت زیر خواهد بود
09381354444 06505 2022/10/04-18:02:15
09381354443 26052 2022/10/04-18:07:39
09381354444 00300 2022/10/04-19:02:48
دقت کنید که خط اول (یا همان Phone,Code,Expiration) در خروجی متد وجود ندارد.
متد verifyCode
این متد یک رشته به عنوان کد، یک رشته به عنوان شماره و رشتهای دیگر به عنوان آدرس فایلی که باید اطلاعات را از آن بخواند، به عنوان ورودی دریافت میکند. خروجی این متد یک boolean است که در صورتی که کد با شماره مورد نظر تطابق داشت و کد منقضی نشده بود، باید مقدار true برگرداند و در غیر این صورت مقدار false برگرداند.
نکات
- شما در این سؤال مجاز به تغییر فایل 
pom.xmlنیستید. - برای کار با 
JSON، تنها مجاز به استفاده از کتابخانهopencsvهستید. - برای کار با CSV ، تنها مجاز به استفاده از کتابخانه 
jackson-databindهستید. - به جز کتابخانههای موجود در 
pom.xml، تنها مجاز به استفاده از کتابخانههای استاندارد جاوا هستید. - هر کد تنها ده ثانیه زمان دارد.
 - دقت کنید که تاریخ و زمان انقضای کد را باید دقیقا برابر با ۱۰ ثانیه پس از تولید کد (یا فراخوانی متد 
sendAuthenticationSMS) قرار دهید. - شما مجاز به عوض کردن فرمت ذخیرهسازی اطلاعات در فایل CSV نیستید و باید دقیقا برابر با فرمت خواسته شده، اطلاعات را ذخیره سازی کنید.
 - داوری این سؤال، بیشتر از باقی مسائل طول میکشد.
 
آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، فایل تمامی پروژه را زیپ کنید و آن را آپلود کنید. فایل زیپ شما باید بهصورتی باشد که پس از خروج از حالت فشرده، پوشهی src مشاهده شود.
ارسال پاسخ برای این سؤال