هل أنا مجنون أم لا يوجد أي تحقق من صحة عنوان URL لصورة التوقيع للمدخلات من المستخدم؟
بشكل أساسي، يمكن للمستخدم إدخال أي شيء يريده وسيتم دفعه للمستخدمين الآخرين؟
أيضًا، لماذا حجم قاعدة بيانات عنوان URL للتوقيع مضبوط على 32000؟
لماذا سيحتاج أي شخص إلى 32000 حرف لعنوان URL لصورة؟
مخيف
لقد قمت بتعديل CSS إلى هذا من أجل ترميز الحد الأقصى للارتفاع والعرض يدويًا؛
لقد أضفت هذا في أسفل “on(:user_updated) do |user|” في plugin.rb (لن أستخدم الوضع المتقدم)
# التحقق من صحة عنوان URL إذا لم يكن في الوضع المتقدم
if !SiteSetting.signatures_advanced_mode && user.custom_fields["signature_url"]
url = user.custom_fields["signature_url"]
# التحقق الصارم: HTTPS فقط، أنواع ملفات صور معينة فقط
unless url =~ /\Ahttps:\/\/a-zA-Z0-9.\-\/_]+\.(png|jpe?g|gif|webp)(\?[a-zA-Z0-9=\&]+)?\z/
Rails.logger.warn("[discourse-signatures] Rejected invalid signature_url for user #{user.id}: #{url.inspect}")
user.custom_fields["signature_url"] = nil
user.save
end
end
إذا كنت أفعل أي شيء خاطئ هنا (لم أعمل مع Discourse من قبل)، فيرجى تصحيحه وإظهار الطريقة الصحيحة للقيام بذلك.
عند ترقية Discourse إلى الإصدار 3.5.0.beta8 (الإصدار 3.5.0.beta9-dev يمثل مشكلة أيضًا)، تم اكتشاف أن المستخدم قام بتعديل التوقيع ولا يمكنه حفظه (على الرغم من أنه يظهر محفوظًا ولكنه لا يسري)، ولا يزال طبيعيًا في الإصدار 3.5.0.beta7. نأمل في إصلاحه قريبًا، حيث تم تضمين العديد من الإضافات من الإصدار beta7 إلى الإصدار beta8.
يمكنك النقر بزر الماوس الأيمن > فحص للحصول على مُعرِّف/فئة عنصر لإخفائه باستخدام display:none. أخشى أنني على هاتفي الآن لذلك لا يمكنني التحقق من الفئات/المُعرِّفات .
شكرًا لك. أنا سيئ في معرفة تلك الأشياء. ليس لدي فكرة كيف يمكنني فعل ذلك حتى. يجب أن يكون هناك إعداد. أسهل بكثير. ليس لدي فكرة لماذا قد ترغب أي مجموعة في السماح بالتواقيع للجميع. أتمنى أيضًا أن يكون هناك خيار لإخفاء الإعداد “تمكين التواقيع - انظر تواقيع المستخدمين أسفل المشاركات”.
يجب أن يكون هناك أيضًا خيار لتحديد عدد الأحرف في التوقيع النصي وتحديد حجم الصورة لتوقيع الشعار.
حسنًا، بالنسبة لأولئك الذين يريدون حقًا جعل توقيعاتهم تعمل بشكل أفضل لمجموعتهم (خاصة إذا كنت تريد استخدام الخيارات لجعل التوقيع جزءًا من ترقية/اشتراك مدفوع)، إليك الكود (والأسباب وراءه) الذي أعتقد أنه يجعله أفضل بكثير، ويمكن أن يساعدك في دفع المزيد من الترقيات. لقد استغرق الأمر مني الكثير من المحاولات، ولكنه يعمل. انتبه إلى الأماكن التي تحتاج فيها إلى استبدال أجزاء “XXXXX”.
أردت تحقيق الأمرين التاليين:
أ) أردت تعطيل القدرة على عدم عرض التوقيعات. هذا يعني أن المستخدمين الذين يقومون بالترقية يعلمون أن توقيعهم سيظهر للجميع.
ب) أردت فقط مجموعة معينة لديها القدرة على إنشاء توقيع.
اذهب إلى Admin > Appearance > Themes & components > Components > Install > Create new
أضف هذا الكود إلى علامة التبويب :
<script>
// انتظر حتى يتم تحميل هيكل الصفحة الأساسي أولاً
document.addEventListener("DOMContentLoaded", function() {
// قم بإعداد المراقب
const observer = new MutationObserver(function(mutations) {
// ابحث عن جميع تسميات التحكم في الصفحة
const labels = document.querySelectorAll('label.control-label');
labels.forEach(label => {
// ابحث عن تسمية التوقيعات المحددة
if (label.textContent.trim() === 'Enable Signatures') {
// ابحث عن الحاوية الرئيسية التي تحتوي على كل من التسمية ومربع الاختيار وأخفها
const controlGroup = label.closest('.control-group') || label.parentElement;
if (controlGroup) {
controlGroup.style.display = 'none';
}
}
});
});
// ابدأ الآن بمراقبة الجسم، لأننا نعلم أنه موجود
observer.observe(document.body, { childList: true, subtree: true });
});
</script>
3. أضف هذا الكود إلى علامة التبويب css (استبدل XXXXX باسم مجموعتك):
/* إخفاء قسم التوقيع للجميع */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
display: none !important;
}
/* إظهاره فقط إذا كان الفصل 'user-is-XXXXX' موجودًا على الجسم */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
display: block !important;
}
أضف هذا الكود إلى علامة التبويب أسفل الكتلة الأولى أعلاه (استبدل XXXXX باسم مجموعتك):
<script>
(function() {
const checkAccess = () => {
// يخزن Discourse مجموعات المستخدم الحالي في هذا الكائن العام
const user = window.Discourse && window.Discourse.User && window.Discourse.User.current();
if (user && user.groups) {
// تحقق مما إذا كان أي اسم مجموعة يطابق "XXXXX"
const isXXXXX = user.groups.some(g => g.name === 'XXXXX');
if (isXXXXX) {
document.body.classList.add('user-is-XXXXX');
}
}
};
// تشغيل فوري
checkAccess();
// التشغيل في كل مرة يتنقل فيها المستخدم بين الصفحات
document.addEventListener('discourse-ready', checkAccess);
// احتياطي: التشغيل مرة أخرى بعد ثانية واحدة لالتقاط التحميلات البطيئة
setTimeout(checkAccess, 1000);
})();
</script>
أضف هذا الكود إلى علامة التبويب css أسفل الكتلة الأولى أعلاه (استبدل XXXXX باسم مجموعتك):
/* إخفاء قسم التوقيع للجميع */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
display: none !important;
}
/* إظهاره فقط إذا كان الفصل 'user-is-XXXXX' موجودًا على الجسم */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
display: block !important;
}
تم.
أنا لست مطورًا. كل ما أعرفه هو أن هذا يعمل بنسبة 100٪ على موقعي.
كيف نختبر هذا؟ آسف على السؤال المبتدئ. أفضل هذا على ما توصلت إليه أعلاه. أيضًا، هل سيكون من الممكن إضافة خيار لإيقاف توقيعات الصور والسماح فقط بالتوقيعات النصية؟ شكرًا لك!