লোকাল এরিয়া নেটওয়ার্ক (LAN)-এর ডিভাইসগুলো এমন যেকোনো অ্যাপ দ্বারা অ্যাক্সেস করা যায়, যার INTERNET পারমিশন আছে। এর ফলে অ্যাপগুলোর পক্ষে স্থানীয় ডিভাইসগুলোর সাথে সংযোগ স্থাপন করা সহজ হয়ে যায়, কিন্তু এর গোপনীয়তা সংক্রান্ত কিছু ঝুঁকিও রয়েছে, যেমন ব্যবহারকারীর ফিঙ্গারপ্রিন্ট তৈরি হওয়া এবং অবস্থানের প্রক্সি হিসেবে কাজ করা।
লোকাল নেটওয়ার্ক প্রোটেকশনস প্রকল্পের লক্ষ্য হলো একটি নতুন রানটাইম পারমিশনের মাধ্যমে লোকাল নেটওয়ার্কে প্রবেশাধিকার সীমিত করে ব্যবহারকারীর গোপনীয়তা রক্ষা করা।
প্রভাব
অ্যান্ড্রয়েড ১৬-এর সময়, এই অনুমতিটি একটি অপ্ট-ইন বৈশিষ্ট্য, যার অর্থ হলো শুধুমাত্র যে অ্যাপগুলো এটি গ্রহণ করবে, সেগুলোই প্রভাবিত হবে। এই অপ্ট-ইন-এর উদ্দেশ্য হলো অ্যাপ ডেভেলপাররা যেন বুঝতে পারেন যে তাদের অ্যাপের কোন অংশগুলো অন্তর্নিহিত লোকাল নেটওয়ার্ক অ্যাক্সেসের উপর নির্ভরশীল, যাতে তারা ভবিষ্যতের কোনো অ্যান্ড্রয়েড সংস্করণে সেগুলোর জন্য অনুমতি সুরক্ষার ব্যবস্থা করতে পারেন।
অ্যাপগুলি যদি ব্যবহারকারীর লোকাল নেটওয়ার্ক অ্যাক্সেস করার জন্য নিম্নলিখিত পদ্ধতি ব্যবহার করে, তবে সেগুলি প্রভাবিত হবে:
- লোকাল নেটওয়ার্ক অ্যাড্রেসে র সকেটের সরাসরি বা লাইব্রেরি ব্যবহার, যেমন—
Multicast DNS (mDNS)বাSimple Service Discovery Protocol (SSDP)। - ফ্রেমওয়ার্ক-স্তরের ক্লাসগুলির ব্যবহার যেগুলো লোকাল নেটওয়ার্ক অ্যাক্সেস করে, যেমন,
NsdManager।
প্রভাবের বিবরণ
একটি স্থানীয় নেটওয়ার্ক ঠিকানায় আসা-যাওয়ার জন্য স্থানীয় নেটওয়ার্ক অ্যাক্সেসের অনুমতি প্রয়োজন। নিম্নলিখিত সারণিতে কিছু সাধারণ ক্ষেত্র তালিকাভুক্ত করা হলো:
| অ্যাপ নিম্ন স্তরের নেটওয়ার্ক অপারেশন | স্থানীয় নেটওয়ার্কের অনুমতি প্রয়োজন |
|---|---|
| একটি বহির্গামী TCP সংযোগ তৈরি করা | হ্যাঁ |
| আগত TCP সংযোগ গ্রহণ করা হচ্ছে | হ্যাঁ |
| ইউডিপি ইউনিকাস্ট, মাল্টিকাস্ট, ব্রডকাস্ট পাঠানো | হ্যাঁ |
| আগত ইউডিপি ইউনিকাস্ট, মাল্টিকাস্ট, ব্রডকাস্ট গ্রহণ করা | হ্যাঁ |
এই বিধিনিষেধগুলি নেটওয়ার্কিং স্ট্যাকের গভীরে প্রয়োগ করা হয়, এবং তাই এগুলি সমস্ত নেটওয়ার্কিং এপিআই-এর ক্ষেত্রে প্রযোজ্য। এর মধ্যে অন্তর্ভুক্ত রয়েছে প্ল্যাটফর্ম বা ম্যানেজড কোডে তৈরি সকেট, ক্রোনেট এবং ওকেএইচটিটিপি-এর মতো নেটওয়ার্কিং লাইব্রেরি, এবং সেগুলির উপরে প্রয়োগ করা যেকোনো এপিআই। লোকাল নেটওয়ার্কে .local সাফিক্সযুক্ত সার্ভিস রিজলভ করার জন্য লোকাল নেটওয়ার্কের অনুমতি প্রয়োজন।
পূর্ববর্তী নিয়মগুলির ব্যতিক্রম:
- যদি কোনো ডিভাইসের ডিএনএস সার্ভার লোকাল নেটওয়ার্কে থাকে, তবে সেটিতে (পোর্ট ৫৩-এ) ট্র্যাফিকের জন্য লোকাল নেটওয়ার্ক অ্যাক্সেস পারমিশনের প্রয়োজন হয় না।
- যেসব অ্যাপ্লিকেশন তাদের ইন-অ্যাপ পিকার হিসেবে আউটপুট সুইচার ব্যবহার করে, সেগুলোর জন্য লোকাল নেটওয়ার্ক পারমিশনের প্রয়োজন হবে না (পরবর্তী রিলিজে এ বিষয়ে আরও নির্দেশনা দেওয়া হবে)।
অ্যান্ড্রয়েড ১৭ প্রয়োগ
অ্যান্ড্রয়েড ১৭ থেকে, অ্যান্ড্রয়েড ১৭ বা তার উচ্চতর সংস্করণের জন্য তৈরি অ্যাপগুলোর ক্ষেত্রে লোকাল নেটওয়ার্ক সুরক্ষা বাধ্যতামূলক এবং কার্যকর করা হয়েছে।
| দিক | অ্যান্ড্রয়েড ১৬ | অ্যান্ড্রয়েড ১৭ |
|---|---|---|
| টার্গেট এসডিকে | ৩৬ | ৩৭ বা তার বেশি |
| অনুমতি | সাময়িকভাবে ব্যবহৃত NEARBY_WIFI_DEVICES | অ্যাক্সেস_লোকাল_নেটওয়ার্ক |
| ডিফল্ট অ্যাক্সেস | স্থানীয় নেটওয়ার্ক অ্যাক্সেস উন্মুক্ত | যেসব অ্যাপ তাদের টার্গেট SDK আপডেট করে, তাদের জন্য লোকাল নেটওয়ার্ক ডিফল্টরূপে ব্লক করা থাকে। |
| অনুমতি গ্রুপ | বিদ্যমান NEARBY_DEVICES অনুমতি গোষ্ঠীর অংশ | |
এই নিয়ম কার্যকর হওয়ার পর অ্যাপের কার্যকারিতা ব্যাহত হচ্ছে না তা যাচাই করতে, SDK 37 বা তার উচ্চতর সংস্করণকে লক্ষ্য করে তৈরি অ্যাপ্লিকেশনগুলিকে স্থানীয় নেটওয়ার্ক অ্যাক্সেস পরিচালনা করার জন্য নিম্নলিখিত পথগুলির মধ্যে একটি অবলম্বন করতে হবে:
পথ A: গোপনীয়তা-সংরক্ষক পিকার ব্যবহার করা
সিস্টেম-মধ্যস্থ আবিষ্কার এবং সংযোগের কাজগুলোর জন্য, সম্পূর্ণ বিস্তৃত রানটাইম অনুমতির অনুরোধ এড়াতে পিকার ব্যবহার করুন। আপনার ব্যবহারের ক্ষেত্র অনুযায়ী নিম্নলিখিত পিকারগুলো ব্যবহার করুন:
- মিডিয়া স্ট্রিমিং: যেসব অ্যাপ্লিকেশন গুগল কাস্ট সমর্থন করে, তারা আউটপুট সুইচার ফিচারটি ব্যবহার করতে পারে। এর ফলে, অ্যাপটির ব্যাপক
ACCESS_LOCAL_NETWORKপারমিশনের অনুরোধ না করেই ডেভেলপাররা ব্যবহারকারীদের নির্দিষ্ট স্ট্রিমিং ডিভাইস বেছে নেওয়ার সুযোগ দিতে পারেন। - সাধারণ সংযোগ:
NsdManagerএ mDNS আবিষ্কারের জন্য একটি সিস্টেম-চালিত সার্ভিস পিকার অন্তর্ভুক্ত রয়েছে। অ্যাপটি পুরো নেটওয়ার্ক স্ক্যান করার পরিবর্তে, সিস্টেম একটি ডায়ালগ প্রদর্শন করে যা ব্যবহারকারীকে অ্যাপটির অ্যাক্সেসের জন্য একটিমাত্র ডিভাইস নির্বাচন করার সুযোগ দেয়।
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
পথ B: রানটাইম অনুমতির (ব্যাপক অ্যাক্সেস) জন্য অনুরোধ করা হচ্ছে
হোম অটোমেশন বা আইওটি ডিভাইস ম্যানেজমেন্টের মতো জটিল ব্যবহারের ক্ষেত্রে এই পথটি প্রয়োজন, যেগুলোর জন্য লোকাল নেটওয়ার্কে ব্যাপক ও নিরবচ্ছিন্ন অ্যাক্সেস দরকার।
ম্যানিফেস্টে অনুমতিটি ঘোষণা করুন:
AndroidManifest.xmlএACCESS_LOCAL_NETWORKস্পষ্টভাবে ঘোষণা করুন।রানটাইমে অনুমতির অনুরোধ: যেকোনো স্থানীয় নেটওয়ার্ক অ্যাক্সেসের চেষ্টা করার আগে, অ্যাপ্লিকেশনগুলিকে অবশ্যই পরীক্ষা করে দেখতে হবে যে অনুমতি দেওয়া হয়েছে কিনা। যদি না দেওয়া হয়ে থাকে, তবে স্ট্যান্ডার্ড সিস্টেম প্রম্পট চালু করার জন্য তাদের অবশ্যই
Activity.requestPermission()কল করতে হবে।পূর্ব-অনুমোদিত পরিস্থিতি:
ACCESS_LOCAL_NETWORKপারমিশনটিNEARBY_DEVICESপারমিশন গ্রুপের একটি অংশ। যদি কোনো ব্যবহারকারী এই গ্রুপে আগে থেকেই অন্য কোনো পারমিশন (যেমন ব্লুটুথ পারমিশন) দিয়ে থাকেন, তাহলে লোকাল নেটওয়ার্ক অ্যাক্সেসের জন্য তাকে পুনরায় অনুরোধ করা হবে না।অস্বীকৃতি এবং প্রত্যাহার পরিচালনা: ব্যবহারকারী যখন অনুরোধটি প্রত্যাখ্যান করেন বা পরে সিস্টেম সেটিংসে অনুমতি প্রত্যাহার করেন, তখন অ্যাপগুলিকে অবশ্যই তা সুষ্ঠুভাবে পরিচালনা করতে হবে। এই ধরনের পরিস্থিতিতে, স্থানীয় নেটওয়ার্ক ট্র্যাফিক ব্লক করা হবে।
অনুমতি অনুরোধ রিসেট কাউন্টার কৌশল
প্ল্যাটফর্মটি একটি কাউন্টার রিসেট কৌশল প্রয়োগ করে, যা এমন পরিস্থিতিগুলোর সমাধান করে যেখানে কোনো অ্যাপ তার NEARBY_DEVICES পারমিশন গ্রুপ (যার মধ্যে এখন ACCESS_LOCAL_NETWORK অন্তর্ভুক্ত) পূর্বে প্রত্যাখ্যান করার কারণে, তার যৌক্তিক কারণ যথাযথভাবে উপস্থাপন করার পরেও অনুমতি চাইতে পারেনি। এই ব্যবস্থাটি অ্যাপটিকে requestPermission() API কল করার জন্য অতিরিক্ত সুযোগ দেয়, যা কার্যকরভাবে ACCESS_LOCAL_NETWORK পারমিশনের জন্য প্রত্যাখ্যানের সংখ্যা রিসেট করে। এটি ব্যবহারকারীর সাথে আরও সূক্ষ্মভাবে পুনরায় সংযোগ স্থাপনের সুযোগ করে দেয়, বিশেষ করে যখন অ্যাপটি তার মূল কার্যকারিতার জন্য লোকাল নেটওয়ার্ক অ্যাক্সেসের প্রয়োজনীয়তা বোঝানোর আগেই প্রাথমিক প্রত্যাখ্যানটি ঘটেছিল।
বিভক্ত অনুমতি মডেল
লোকাল নেটওয়ার্ক পারমিশন, নতুন এবং পুরোনো অ্যাপ্লিকেশনগুলোকে তাদের টার্গেট SDK-এর উপর ভিত্তি করে ভিন্নভাবে পরিচালনা করার জন্য একটি বিভক্ত পারমিশন মাইগ্রেশন কৌশল ব্যবহার করে।
| বিভাগ | লক্ষ্য SDK স্তর | স্থানীয় নেটওয়ার্ক অ্যাক্সেস আচরণ | প্রয়োজনীয় ডেভেলপার পদক্ষেপ |
|---|---|---|---|
| নতুন অ্যাপ / আপডেট করা অ্যাপ | >= ৩৭ (অ্যান্ড্রয়েড ১৭) | ডিফল্টরূপে ব্লক করা | ACCESS_LOCAL_NETWORK রানটাইম অনুমতি ঘোষণা করুন এবং অনুরোধ করুন |
| লিগ্যাসি অ্যাপস | < ৩৭ | যেসব অ্যাপের INTERNET পারমিশন আছে, তারা ACCESS_LOCAL_NETWORK জন্য একটি অন্তর্নিহিত অনুমতি লাভ করে, যা তাদের অ্যাক্সেস বজায় রাখতে সাহায্য করে। এটি অস্থায়ী এবং অ্যাপটি তার টার্গেট SDK ৩৭-এ আপগ্রেড করলে এটি ডিফল্টরূপে ব্লক হয়ে যাবে। | তাৎক্ষণিক কোনো কোড পরিবর্তনের প্রয়োজন নেই। SDK 37 টার্গেট করার আগে রানটাইমে ACCESS_LOCAL_NETWORK জন্য অনুরোধ করবেন না। |
ব্যবহারের ক্ষেত্র অনুযায়ী এলএনপি কৌশল
কাস্টিং: মিডিয়া কাস্টিং কার্যকারিতার জন্য, সবচেয়ে উপযুক্ত এবং গোপনীয়তা-সংরক্ষক কৌশল হলো আউটপুট সুইচার ব্যবহার করা। এই পদ্ধতিটি সিস্টেমকে ব্যবহারকারীর পক্ষ থেকে স্থানীয় নেটওয়ার্ক শনাক্তকরণ এবং সংযোগ পরিচালনা করার সুযোগ দেয়, যার ফলে অ্যাপটির
ACCESS_LOCAL_NETWORKপারমিশন অনুরোধ করার প্রয়োজন হয় না।ব্রাউজার: প্রোটোকলের উপর ভিত্তি করে ত্রুটি ব্যবস্থাপনার জন্য ভিন্ন ভিন্ন পদ্ধতির প্রয়োজন হয়। UDP ত্রুটির ফলে
EPERMত্রুটি কোড দেখা দেয়। TCP সংযোগের ক্ষেত্রে, কোনো প্যাকেট LNP দ্বারা ব্লক করা হয়েছে কিনা তা নির্ধারণ করতে ব্রাউজারগুলোর NDK APIandroid_getnetworkblockedreason(int sockFd)ব্যবহার করা উচিত; এই API-টিANDROID_NETWORK_BLOCKED_REASON_LNPরিটার্ন করে।অন্যান্য ব্যবহারের ক্ষেত্র (উদাহরণস্বরূপ, IoT): যে অ্যাপ্লিকেশনগুলি mDNS ব্যবহার করে ডিভাইস খুঁজে বের করে, তাদের
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERব্যবহার করা উচিত, যা অনুমতি ছাড়াই ডিভাইস খুঁজে বের করতে সাহায্য করে, এবং IP অ্যাড্রেস পাওয়ার জন্যNsdManager#registerServiceInfoCallback/NsdManager#resolveServiceব্যবহার করা উচিত। এইভাবে প্রাপ্ত IP অ্যাড্রেসে সংযোগ করার জন্যACCESS_LOCAL_NETWORKঅনুমতির প্রয়োজন হয় না।
যেসব অ্যাপ্লিকেশনের সরাসরি লোকাল নেটওয়ার্ক যোগাযোগের প্রয়োজন হয় এবং সিস্টেম-মধ্যস্থ পিকার ব্যবহার করতে পারে না, তাদের জন্য অ্যান্ড্রয়েড ১৭ (এসডিকে ৩৭) বা তার উচ্চতর সংস্করণ টার্গেট করার সময় পারমিশন রিসেট কাউন্টার স্ট্র্যাটেজি ব্যবহার করার পরামর্শ দেওয়া হয়। যদি ব্যবহারকারী ACCESS_LOCAL_NETWORK পারমিশনটি প্রত্যাহার করে নেন, তবে এই পদ্ধতিটি অ্যাপটিকে পুনরায় পারমিশনের জন্য অনুরোধ করার অতিরিক্ত সুযোগ দেয়, যা ডেভেলপারদের ব্যবহারকারীর কাছে আরও স্পষ্ট যুক্তি উপস্থাপনের সুযোগ করে দেয়।
অ্যান্ড্রয়েড ১৬ নির্দেশিকা
স্থানীয় নেটওয়ার্ক বিধিনিষেধ চালু করতে, নিম্নলিখিতগুলি করুন:
- আপনার ডিভাইসটিকে অ্যান্ড্রয়েড ১৬ বিটা ৩ বা তার পরবর্তী সংস্করণের বিল্ডে ফ্ল্যাশ করুন।
- পরীক্ষা করার জন্য অ্যাপটি ইনস্টল করুন।
adb ব্যবহার করে Appcompat কনফিগারেশনটি পরিবর্তন করুন।
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>ডিভাইসটি রিবুট করুন
এখন আপনার অ্যাপের লোকাল নেটওয়ার্কে অ্যাক্সেস সীমাবদ্ধ করা হয়েছে এবং লোকাল নেটওয়ার্ক অ্যাক্সেস করার যেকোনো প্রচেষ্টার ফলে সকেট এরর দেখা দেবে। আপনি যদি এমন কোনো এপিআই (API) ব্যবহার করেন যা আপনার অ্যাপ প্রসেসের বাইরে লোকাল নেটওয়ার্ক অপারেশন সম্পাদন করে (উদাহরণস্বরূপ, NsdManager ), তবে এই অপ্ট-ইন চলাকালীন সেগুলি প্রভাবিত হবে না।
অ্যাক্সেস পুনরুদ্ধার করতে, আপনাকে অবশ্যই আপনার অ্যাপকে NEARBY_WIFI_DEVICES এর জন্য অনুমতি প্রদান করতে হবে।
- নিশ্চিত করুন যে অ্যাপটি তার
manifestNEARBY_WIFI_DEVICESপারমিশনটি ঘোষণা করেছে। - সেটিংস > অ্যাপস > [অ্যাপের নাম] > অনুমতি > কাছাকাছি ডিভাইস > অনুমতি দিন -এ যান
এখন আপনার অ্যাপের লোকাল নেটওয়ার্কে অ্যাক্সেস পুনরুদ্ধার হওয়া উচিত এবং আপনার সমস্ত সিনারিও অ্যাপটি অপ্ট-ইন করার আগের মতোই কাজ করা উচিত। অ্যাপের নেটওয়ার্ক ট্র্যাফিক কীভাবে প্রভাবিত হয় তা নিচে দেওয়া হলো।
| অনুমতি | বহির্গামী ল্যান অনুরোধ | বহির্গামী/অন্তর্গামী ইন্টারনেট অনুরোধ | ইনবাউন্ড ল্যান অনুরোধ |
|---|---|---|---|
| মঞ্জুর করা হয়েছে | কাজ | কাজ | কাজ |
| মঞ্জুর করা হয়নি | ব্যর্থ | কাজ | ব্যর্থ |
Appcompat কনফিগারেশনটি বন্ধ করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন।
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
ত্রুটি
অনুমতির অভাবে যদি স্থানীয় নেটওয়ার্ক অ্যাক্সেসের অনুরোধ ব্যর্থ হয়:
TCP সংযোগের ক্ষেত্রে সাধারণত টাইমআউট ত্রুটি দেখা দেয়।
UDP ত্রুটি এবং সাধারণ অনুমতি প্রত্যাখ্যানের ফলে সাধারণত একটি EPERM ত্রুটি কোড দেখা দেয়।
পোকা
নিম্নলিখিত বিষয়গুলির জন্য ত্রুটি ও মতামত জমা দিন :
- ল্যান অ্যাক্সেসে অসঙ্গতি (আপনি মনে করেন না যে একটি নির্দিষ্ট অ্যাক্সেসকে "লোকাল নেটওয়ার্ক" অ্যাক্সেস হিসাবে বিবেচনা করা উচিত)
- এমন বাগ যেখানে ল্যান অ্যাক্সেস ব্লক করা উচিত কিন্তু করা হয় না।
- এমন বাগ যেখানে ল্যান অ্যাক্সেস ব্লক করা উচিত নয়, কিন্তু করা হয়।
এই পরিবর্তনের ফলে নিম্নলিখিত বিষয়গুলো প্রভাবিত হবে না:
- ইন্টারনেটে প্রবেশাধিকার
- মোবাইল নেটওয়ার্ক