diff --git a/server/controllers/auth.js b/server/controllers/auth.js index 179dbae8..317938a3 100644 --- a/server/controllers/auth.js +++ b/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 diff --git a/server/locales/fa/admin.json b/server/locales/fa/admin.json new file mode 100644 index 00000000..1b4d5000 --- /dev/null +++ b/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": "شناسه یکتا" + } +} diff --git a/server/locales/fa/auth.json b/server/locales/fa/auth.json new file mode 100644 index 00000000..87e7d6a5 --- /dev/null +++ b/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": "ال‌دپ/اکتیو دایرکتوری" + } +} diff --git a/server/locales/fa/browser.json b/server/locales/fa/browser.json new file mode 100644 index 00000000..69b46747 --- /dev/null +++ b/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": "آیا مطمئن هستید که میخواهید از این صفحه بروید؟ تمام چیزهایی که تا این لحظه نوشتید از بین میروند." + } +} diff --git a/server/modules/auth.js b/server/modules/auth.js index 95befaeb..7dd41afb 100644 --- a/server/modules/auth.js +++ b/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}`)