Bläddra i källkod

feat: persian locales + auth fix

NGPixel 7 år sedan
förälder
incheckning
759b66469c

+ 15 - 16
server/controllers/auth.js

@@ -5,7 +5,6 @@
 const Promise = require('bluebird')
 const express = require('express')
 const router = express.Router()
-const passport = require('passport')
 const ExpressBrute = require('express-brute')
 const ExpressBruteRedisStore = require('express-brute-redis')
 const moment = require('moment')
@@ -45,16 +44,16 @@ router.get('/login', function (req, res, next) {
 router.post('/login', bruteforce.prevent, function (req, res, next) {
   new Promise((resolve, reject) => {
     // [1] LOCAL AUTHENTICATION
-    passport.authenticate('local', function (err, user, info) {
+    wiki.auth.passport.authenticate('local', function (err, user, info) {
       if (err) { return reject(err) }
       if (!user) { return reject(new Error('INVALID_LOGIN')) }
       resolve(user)
     })(req, res, next)
   }).catch({ message: 'INVALID_LOGIN' }, err => {
-    if (appconfig.auth.ldap && appconfig.auth.ldap.enabled) {
+    if (_.has(wiki.config.auth.strategy, 'ldap')) {
       // [2] LDAP AUTHENTICATION
       return new Promise((resolve, reject) => {
-        passport.authenticate('ldapauth', function (err, user, info) {
+        wiki.auth.passport.authenticate('ldapauth', function (err, user, info) {
           if (err) { return reject(err) }
           if (info && info.message) { return reject(new Error(info.message)) }
           if (!user) { return reject(new Error('INVALID_LOGIN')) }
@@ -94,19 +93,19 @@ router.post('/login', bruteforce.prevent, function (req, res, next) {
  * Social Login
  */
 
-router.get('/login/ms', passport.authenticate('windowslive', { scope: ['wl.signin', 'wl.basic', 'wl.emails'] }))
-router.get('/login/google', passport.authenticate('google', { scope: ['profile', 'email'] }))
-router.get('/login/facebook', passport.authenticate('facebook', { scope: ['public_profile', 'email'] }))
-router.get('/login/github', passport.authenticate('github', { scope: ['user:email'] }))
-router.get('/login/slack', passport.authenticate('slack', { scope: ['identity.basic', 'identity.email'] }))
-router.get('/login/azure', passport.authenticate('azure_ad_oauth2'))
+router.get('/login/ms', wiki.auth.passport.authenticate('windowslive', { scope: ['wl.signin', 'wl.basic', 'wl.emails'] }))
+router.get('/login/google', wiki.auth.passport.authenticate('google', { scope: ['profile', 'email'] }))
+router.get('/login/facebook', wiki.auth.passport.authenticate('facebook', { scope: ['public_profile', 'email'] }))
+router.get('/login/github', wiki.auth.passport.authenticate('github', { scope: ['user:email'] }))
+router.get('/login/slack', wiki.auth.passport.authenticate('slack', { scope: ['identity.basic', 'identity.email'] }))
+router.get('/login/azure', wiki.auth.passport.authenticate('azure_ad_oauth2'))
 
-router.get('/login/ms/callback', passport.authenticate('windowslive', { failureRedirect: '/login', successRedirect: '/' }))
-router.get('/login/google/callback', passport.authenticate('google', { failureRedirect: '/login', successRedirect: '/' }))
-router.get('/login/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login', successRedirect: '/' }))
-router.get('/login/github/callback', passport.authenticate('github', { failureRedirect: '/login', successRedirect: '/' }))
-router.get('/login/slack/callback', passport.authenticate('slack', { failureRedirect: '/login', successRedirect: '/' }))
-router.get('/login/azure/callback', passport.authenticate('azure_ad_oauth2', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/ms/callback', wiki.auth.passport.authenticate('windowslive', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/google/callback', wiki.auth.passport.authenticate('google', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/facebook/callback', wiki.auth.passport.authenticate('facebook', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/github/callback', wiki.auth.passport.authenticate('github', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/slack/callback', wiki.auth.passport.authenticate('slack', { failureRedirect: '/login', successRedirect: '/' }))
+router.get('/login/azure/callback', wiki.auth.passport.authenticate('azure_ad_oauth2', { failureRedirect: '/login', successRedirect: '/' }))
 
 /**
  * Logout

+ 82 - 0
server/locales/fa/admin.json

@@ -0,0 +1,82 @@
+{
+  "profile": {
+    "displayname": "نام کامل",
+    "displaynameexample": "علی علوی",
+    "email": "ایمیل",
+    "lastprofileupdate": "آخرین زمان به روز رسانی پروفایل",
+    "membersince": "عضو از تاریخ",
+    "password": "گذرواژه",
+    "passwordverify": "تکرار گذرواژه",
+    "provider": "سرویس‌دهنده",
+    "savechanges": "ذخیره تغییرات",
+    "subtitle": "اطلاعات پروفایل و سیستم احراز هویت",
+    "tfa": "احراز هویت دو مرحله‌ای",
+    "tfadisable": "غیرفعال کردن سیستم احراز هویت دو مرحله‌ای",
+    "tfadisabled": "غیرفعال",
+    "tfaenable": "فعال کردن سیستم احراز هویت دو مرحله‌ای",
+    "tfaenabled": "فعال"
+  },
+  "stats": {
+    "subtitle": "آمار کلی وبسایت",
+    "entries": "مدخل",
+    "uploads": "آپلودها",
+    "users": "کاربران"
+  },
+  "settings": {
+    "subtitle": "مدیریت تنظیمات وبسایت"
+  },
+  "system": {
+    "subtitle": "ابزارها و اطلاعات برای ویکی شما",
+    "systemversion": "نسخه سیستم",
+    "currentversion": "نسخه فعلی",
+    "latestversion": "آخرین نسخه",
+    "upgrade": "به روز رسانی",
+    "reinstall": "نصب مجدد نسخه فعلی",
+    "versioncheckfailed": "امکان پیدا کردن آخرین نسخه نرم افزار وجود ندارد. لطفا بعدا امتحان کنید.",
+    "administrativetools": "ابزارهای مدیریت",
+    "flushcache": "پاک کردن کش و بازسازی فهرست‌ها",
+    "flushcachetext": "اگر به نظر میرسد محتوای وبسایت به روز نیست یا آخرین تغییرات در آن وجود ندارد، پاک کردن کش احتمالا میتواند به حل این مشکل کمک کند.",
+    "flushcachebtn": "پاک کردن و بازسازی",
+    "resetaccounts": "ریست کردن حسابهای کاربری به حالت پیش‌فرض",
+    "resetaccountstext": "حسابهای کاربری سیستمی (مثل حساب مهمان) به حالت پیش‌فرض برخواهند گشت.",
+    "resetaccountsbtn": "ریست کردن حسابهای سیستمی",
+    "flushsessions": "پاک کردن نشست تمام کاربران آنلاین",
+    "flushsessionstext": "نشست تمام کاربرانی که در حال حاضر مشغول استفاده از وبسایت هستند پاک و باید مجددا وارد سیستم شوند.",
+    "flushsessionsbtn": "پاک‌کردن نشست‌ها",
+    "hostinfo": "اطلاعات مربوط به سیستم میزبان",
+    "os": "سیستم عامل",
+    "nodeversion": "نسخه نود‌جی‌اس",
+    "hostname": "نام میزبان",
+    "cores": "تعداد هسته‌های پردازنده",
+    "totalmem": "مجموع حافظه",
+    "cwd": "دایرکتوری کاری"
+  },
+  "theme": {
+    "subtitle": "تغییر ظاهر وبسایت",
+    "primarycolor": "رنگ اصلی",
+    "primarycolordesc": "در نوار جهت‌یابی بالا، سرساز، پیوند‌ها و غیره استفاده میشود.",
+    "altcolor": "رنگ دوم",
+    "altcolordesc": "در نوارابزار گوشه استفاده میشود (با رنگ کمی تیره‌تر)",
+    "footercolor": "رنگ پاورقی",
+    "footercolordesc": "برای پاورقی پایین صفحه استفاده میشود (با رنگ کمی روشن‌تر)",
+    "codeblock": {
+      "title": "قطعات کد",
+      "dark": "استفاده از تم تیره",
+      "colorize": "رنگ‌آمیزی کد بر اساس سینتکس"
+    },
+    "savechanges": "ذخیره تغییرات",
+    "reset": "برگشت تغییرات به وضعیت پیش‌فرض"
+  },
+  "users": {
+    "createauthorize": "مدیریت کاربران",
+    "subtitle": "ایجاد یا تغییر دسترسی کاربران به وبسایت",
+    "name": "نام",
+    "email": "آدرس ایمیل",
+    "provider": "سرویس‌دهنده",
+    "createdon": "ساخته شده در تاریخ",
+    "updatedon": "به روز رسانی شده در تاریخ",
+    "returntousers": "بازگشت به لیست کاربران",
+    "edituser": "ویرایش کاربر",
+    "uniqueid": "شناسه یکتا"
+  }
+}

+ 32 - 0
server/locales/fa/auth.json

@@ -0,0 +1,32 @@
+{
+  "loginrequired": "باید وارد سیستم شوید",
+  "loginusing": "وارد شدن به وسیله...",
+  "loginusingalt": "یا وارد شدن به وسیله...",
+  "fields": {
+    "emailuser": "ایمیل/شناسه کاربری",
+    "password": "گذرواژه"
+  },
+  "actions": {
+    "login": "ورود"
+  },
+  "errors": {
+    "invalidlogin": "شناسه کاربری نادرست",
+    "invalidloginmsg": "آدرس ایمیل یا گذرواژه نادرست است.",
+    "invaliduseremail": "آدرس ایمیل نادرست",
+    "loginerror": "خطا در ورود به سیستم",
+    "notyetauthorized": "هنوز اجازه ورود به وبسایت به شما داده نشده است.",
+    "toomanyattempts": "تلاش‌های ناموفق زیاد!",
+    "toomanyattemptsmsg": "شما در مدت زمان کوتاهی تلاشهای ناموفق بسیاری کرده‌اید. لطفا مجددا بعد از {{time}} امتحان کنید.",
+    "usernotfound": "کاربر پیدا نشد"
+  },
+  "providers": {
+    "local": "محلی",
+    "windowslive": "حساب مایکروسافت",
+    "azure": "حساب اکتیو دایرکتوری اژر مایکروسافت",
+    "google": "حساب گوگل",
+    "facebook": "فیسبوک",
+    "github": "گیتهاب",
+    "slack": "اسلک",
+    "ldap": "ال‌دپ/اکتیو دایرکتوری"
+  }
+}

+ 85 - 0
server/locales/fa/browser.json

@@ -0,0 +1,85 @@
+{
+  "editor": {
+    "codeblockinsert": "وارد کردن بلوک کد",
+    "codeblocklanguage": "زبان",
+    "codeblockloading": "در حال بارگذاری سینتکس {{name}}",
+    "codeblockloadingerror": "خطا: امکان بارگذاری سینتکس برای این زبان وجود ندارد.",
+    "codeblocksuccess": "بلوک کد شما الحاق شد.",
+    "codeblocktitle": "الحاق بلوک کد",
+    "discard": "دور انداختن",
+    "filedeleteaction": "پاک کردن",
+    "filedeleteloading": "در حال پاک کردن فایل...",
+    "filedeletedefault": "این فایل",
+    "filedeletesuccess": "فایل با موفقیت پاک شد.",
+    "fileerror": "امکان دریافت فهرست به روز رسانی شده وجود ندارد.",
+    "filefolderempty": "این پوشه خالی است.",
+    "fileinsert": "افزودن لینک به فایل",
+    "fileloading": "در حال دریافت فایلها...",
+    "filemoveaction": "انتقال به...",
+    "filemoveerror": "خطا در انتقال: {{err}}",
+    "filemoveloading": "در حال انتقال فایل...",
+    "filemovesuccess": "فایل با موفقیت منتقل شد.",
+    "fileprocessing": "در حال پردازش...",
+    "filerenameaction": "تغییر نام",
+    "filesuccess": "پیوند به فایل الحاق شد.",
+    "filetitle": "الحاق فایل",
+    "fileupload": "بارگذاری فایل",
+    "fileuploaderror": "خطا در بارگذاری: {{err}}",
+    "fileuploadsuccess": "فایلها با موفقیت بارگذاری شدند.",
+    "folders": "پوشه‌ها",
+    "foldersloading": "در حال دریافت لیست پوشه‌ها...",
+    "imagetitle": "الحاق عکس",
+    "imageinsert": "الحاق عکس",
+    "imagesuccess": "عکس الحاق شد.",
+    "imageupload": "بارگذاری عکس",
+    "imagealignleft": "چپ (پیش‌فرض)",
+    "imagealigncenter": "مرکز",
+    "imagealignright": "راست",
+    "imagealignlogo": "لوگوی صفحه",
+    "newfolder": "پوشه جدید",
+    "videoanymp4file": "هر فایل ام‌پی‌۴ استاندارد",
+    "videoinsert": "الحاق ویدئو",
+    "videolinktitle": "برای قرار دادن ویدئوی توکار، پیوند ویدئو را وارد کنید:",
+    "videonotsupported": "این یوآرال نادرست است یا پشتیبانی نمی‌شود.",
+    "videosuccess": "کد ویدئو الحاق شد.",
+    "videosupportedtitle": "موارد زیر پشتیبانی میشوند:",
+    "videotitle": "الحاق ویدئو"
+  },
+  "history": {
+    "pastversions": "نسخه‌های پیشین",
+    "timestamp": "زمان",
+    "author": "نویسنده",
+    "commit": "کامیت",
+    "comparewith": "مقایسه کن با...",
+    "view": "نمایش",
+    "reverttoversion": "برگرداندن به نسخه",
+    "sidebyside": "نمایش پهلو به پهلو"
+  },
+  "modal": {
+    "abort": "قطع کردن",
+    "anchorerror": "کپی از کلیپ‌برد امکان‌پذیر نیست. لطفا پیوند را دستی وارد کنید.",
+    "anchorsuccess": "یوآرال در کلیپ‌برد کپی شد.",
+    "anchortitle": "پیوند به این قسمت را کپی کن",
+    "copyclipboard": "کپی در کلیپ‌برد",
+    "create": "ایجاد",
+    "createpageinvalid": "مسیر این صفحه نادرست است.",
+    "createpagepath": "مسیر جدید صفحه را وارد کنید:",
+    "createpagetitle": "ایجاد صفحه جدید",
+    "createuser": "ایجاد حساب کاربری",
+    "createuserauthorize": "دسترسی دادن به کاربر",
+    "createuseremail": "آدرس ایمیل:",
+    "createuseremailplaceholder": "مثلا john.doe@company.com",
+    "createusername": "نام کامل:",
+    "createusernameplaceholder": "مثلا علی علوی",
+    "createuserpassword": "گذرواژه:",
+    "createuserprovider": "سرویس‌دهنده:",
+    "createusertitle": "ساخت حساب کاربری",
+    "delete": "پاک کردن",
+    "deletefiletitle": "پاک شود؟",
+    "deletefilewarn": "آیا مطمئن هستید که میخواهید پاک شود؟",
+    "deleteusertitle": "حساب کاربری پاک شود؟",
+    "deleteuserwarning": "آیا مطمئن هستید که میخواهید حساب کاربری شود؟ این عمل قابل بازگشت نیست.",
+    "discard": "دور انداختن",
+    "discardpagecreate": "آیا مطمئن هستید که میخواهید از این صفحه بروید؟ تمام چیزهایی که تا این لحظه نوشتید از بین میروند."
+  }
+}

+ 2 - 0
server/modules/auth.js

@@ -33,6 +33,8 @@ module.exports = {
 
     // Load authentication strategies
 
+    wiki.config.auth.strategies.local = {}
+
     _.forOwn(wiki.config.auth.strategies, (strategyConfig, strategyKey) => {
       strategyConfig.callbackURL = `${wiki.config.site.host}${wiki.config.site.path}/login/${strategyKey}/callback`
       let strategy = require(`../authentication/${strategyKey}`)