حلقه16 از 37
در درس «[ابزارهایی که به فایلها دست میزنند](tools-that-touch-files)» دیدید mini چطور ابزارهای فایلش را درونِ یک پوشه نگه میدارد. اینجا همان بررسی را مینویسید، و آزمونها مسیرهای فریبندهای را امتحان میکنند که ممکن است یک مدل بفرستد.
## ورودی
خطِ اول پوشهی کاری را نام میبرد، و بعد در هر خط یک مسیر، همانطور که یک مدل ممکن است به یک ابزار بدهد:
``text
root /home/leila/project
notes.txt
../secrets.txt
/etc/passwd
/home/leila/project-old/notes.txt
`
## چه بنویسید
inside_folder(root, path) اگر مسیر درونِ پوشه بماند True و اگر از آن بیرون برود False برمیگرداند. کدِ زیرِ آن پیش از هر مسیر allowed یا blocked چاپ میکند. برای نمونهی بالا:
`text
allowed notes.txt
blocked ../secrets.txt
blocked /etc/passwd
blocked /home/leila/project-old/notes.txt
`
قاعدهها، همان قاعدههای inside در mini:
- مسیر نسبت به پوشه حساب میشود، مگر اینکه با / شروع شود؛ آن وقت همانطور که هست به کار میرود. posixpath.join(root, path) دقیقاً همین کار را میکند.
- با posixpath.normpath حساب کنید مسیر واقعاً به کجا میرسد؛ این تابع reports/../notes.txt را به notes.txt تبدیل میکند. پیش از آن root را هم به همین شکل یکدست کنید، چون ممکن است با اسلش تمام شود.
- مسیر درونِ پوشه است اگر خودِ پوشه باشد، یا با اسمِ پوشه و بعد / شروع شود. بدونِ اسلش، /home/leila/project-old درونِ /home/leila/project به نظر میرسید.
- یک قاعده که mini ندارد: هر مسیری را که با ~ شروع میشود ممنوع کنید. برای یک آدم ~ یعنی پوشهی خانگی؛ برای join فقط پوشهای به اسمِ ~ است. در هر دو حالت، چیزی نیست که یک ابزار دربارهاش حدس بزند.
فقط به متنِ مسیر نگاه کنید، هرگز به دیسک: posixpath` به فایلها دست نمیزند. (حدِ این بررسی هم همین است: پیوندی درونِ پوشه که به بیرون اشاره کند رد میشود. درس میگوید چه چیزی جلوی آن را میگیرد.)
ورود برای امتحان این تمرین.