اسم مستخدم يونيكود مع Σ كحرف أخير يؤدي إلى خطأ في تحميل صفحة الملف الشخصي

هل يمكن أن يؤثر هذا أيضًا على الروابط الخاصة بالمستخدمين؟ (التي تحتوي على اسم المستخدم)
لدينا عدد قليل من المستخدمين الذين يستخدمون أسماء مستخدمين بتنسيق UTF-8، ولا يمكن لبعضهم الوصول إلى ملفاتهم الشخصية…

إعجابَين (2)

لا ينبغي أن يؤثر ذلك على المستخدم على الإطلاق، حيث أن المسارات مختلفة تمامًا.

هل يمكنك مشاركة رابط حيث يفشل تحميل الملف الشخصي؟ أو على الأقل مثال على اسم مستخدم يُحفّز هذا الخطأ؟

4 إعجابات

هذه حالة واحدة: https://rembetiko.gr/u/σπυρος

اسم المستخدم هو ΣΠΥΡΟΣ (وهو الشكل الكبير لـ σπυρος)


آسف على استخدام اللغة اليونانية :sweat_smile:

إعجابَين (2)

هذه الصفحة خلف وكيل Cloudflare؟ هل يمكنك الاختبار مع إيقافه؟

أيضًا، ما هي قيم الإعدادات:

  • الأحرف المسموح بها لأسماء المستخدمين Unicode

  • أسماء المستخدمين Unicode

3 إعجابات

إليك القيم (عادية جداً :sweat_smile:)

نعم

لقد قمت بتعطيل الوكيل للتو وأعدت الاختبار. للأسف، لا يزال المشكلة قائمة. سأبقي الوكيل معطلاً لفترة قصيرة حتى تتمكن من تجربته بنفسك إذا أردت :slight_smile:


شكراً جزيلاً لمساعدتك! :smiley:

إعجابَين (2)

ممم.

عند محاولة تحميل الحروف الكبيرة، يتم تحميل الرابط: Προφίλ - ΣΠΥΡΟΣ - Ρεμπέτικο Φόρουμ في البداية، ثم يفشل في جلب JSON لاحقًا إلى النسخة الصغيرة.

يبدو أن هناك خطأ في معالجة الحروف الكبيرة والصغيرة لدينا.

6 إعجابات

من الغريب أن هذا يعمل:

https://rembetiko.gr/u/αγγελικη_ντοτη

اسم المستخدم هو ΑΓΓΕΛΙΚΗ_ΝΤΟΤΗ (مرة أخرى، الصيغة الكبيرة من αγγελικη_ντοτη)

إعجابَين (2)

هل يمكن أن يكون في اللغة اليونانية طريقتان لتحويل حرف ‘Σ’ إلى صغير؟

  • ‘ς’ عند استخدامه في نهاية الكلمة
  • ‘σ’ في أي مكان آخر
إعجابَين (2)

إذن هل هذا خطأ؟

[1] pry(main) > "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
إعجابَين (2)

نعم، من الناحية النحوية هذا غير صحيح. الصيغة الصحيحة هي “σπυρος”

إعجابَين (2)

أوه، إذن أخشى أن هذا خطأ في Ruby:

➜  ruby --version           
ruby 3.0.0dev (2020-12-16T18:46:44Z master 93ba3ac036) [x86_64-linux]
➜  irb           
irb(main):001:0> "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
3 إعجابات

لكنه يعمل بشكل جيد عند إنشاء الرابط… إذن يجب أن يكون هناك طريقة لجعله يعمل… (?)

https://rembetiko.gr/u/σπυρος

إعجابَين (2)

لا يجب أن يهم إذا قام Ruby بتحويل اسم المستخدم إلى النسخة الصحيحة قواعدياً بأحرف صغيرة، طالما أنه يبحث دائماً عن المستخدمين باستخدام اسم المستخدم الموحّد (User.normalize_username في Ruby) و username_lower في قاعدة البيانات.

أي طلب JSON يفشل؟ ومن المرجح جداً أن هناك مساراً يستخدم آلية مختلفة لمقارنة أسماء المستخدمين.

4 إعجابات

ربما يكون ذلك بسبب أن Ruby و JS لديهما تنفيذان مختلفان؟

➜  ruby --version           
ruby 3.0.0dev (2020-12-16T18:46:44Z master 93ba3ac036) [x86_64-linux]
➜  irb           
irb(main):001:0> "ΣΠΥΡΟΣ".downcase
=> "σπυροσ"
➜  node
Welcome to Node.js v12.11.1.
Type ".help" for more information.
> "ΣΠΥΡΟΣ".toLowerCase()
'σπυρος'

يقوم Firefox بنفس ما يفعله NodeJS في اختباراتي.

النقطة الطرفية /u/#{username}.json تجلب عمود اسم المستخدم فقط وليس عمود username_lower، لذا ربما نعتمد على المتصفح هنا؟ أبحث في الأمر الآن…

6 إعجابات

أوه، هذا سيء. إذن، المشكلة على الأرجح هي:

كنتُ سأنصح بإضافة username_lower إلى UserSerializer على الخادم بدلاً من القيام بذلك على العميل، لكن هذا سيتركنا مع بضع حالات أخرى لـ username.toLowerCase.

أتساءل عما إذا كانت الحل الأفضل هو استخدام mini_racer لحساب username_lower على الخادم عندما يحتوي على أحرف غير ASCII. :thinking:

6 إعجابات

حسنًا، بغض النظر عن الحل البديل الذي نسعى إليه، سأبلغ عنه إلى Ruby.

8 إعجابات

للمرجعية فقط، يتصرف PHP بنفس الطريقة مثل Ruby… ما يجعلني أعتقد أن ذلك تصميم مقصود (?)

يمكنك اختبار الكود هنا:

إعجاب واحد (1)

من المثير للاهتمام أن PostgreSQL يفشل هنا أيضًا:

[2] pry(main)> DB.query_single('select lower(?)', 'ΣΠΥΡΟΣ')
=> ["σπυροσ"]

ربما ينبغي لنا ببساطة معالجة هذه الغرابة بشكل خاص في طريقة Discourse الداخلية التي تتعامل مع حساب username_lower؟

ابحث عن جميع الطرق التي تستدعي username_lower، ثم اربطها بدالة مركزية، وامنح هذه الحالة الخاصة استثناءً (أعتقد أنه يمكننا استخدام استدعاء mini_racer هنا إذا أردنا، أو ببساطة استدعاء .lower وتصحيحها لاحقًا باستخدام استدعاء sub).

تحديث عنوان المنشور الأصلي هنا لجعله أكثر وضوحًا.

3 إعجابات

بافتراض:

[4] pry(main)> "σπυρος".downcase
=> "σπυρος"

@chrispanag، حل بديل تافه لك هو ببساطة تغيير اسم المستخدم إلى σπυρος، حيث سيكون اسم المستخدم و username_lower متطابقين تمامًا، وسيكون هذا الحل فعالاً.

أنا متردد بشأن إضافة حلول بديلة للنواة فقط لهذه الحالة المحددة، خاصةً عندما يوجد حل بديل تافه تمامًا.

بالإضافة إلى ذلك، يمكنك منع استخدام الحرف Σ في أسماء المستخدمين باستخدام إعدادنا “حروف اليونيكود المسموح بها في أسماء المستخدمين”، مما يضمن عدم ظهور هذه المشكلة مرة أخرى.

أنا مؤيد لإصلاح Ruby و Postgres هنا، لكن هذا صراع طويل يمتد لسنوات عديدة للحصول على إصلاح هذه الأمور.

5 إعجابات

أتفق تمامًا معك، نحن نبلغ عن الأخطاء في النسخة الأصلية، ويمكن لمستخدمي Discourse استخدام الأدوات الحالية لتجاوز المشكلة في الوقت الراهن.

5 إعجابات