Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge latest OS changes #430

Merged
merged 165 commits into from
Oct 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
165 commits
Select commit Hold shift + click to select a range
97b9814
Github Action (#1640)
dplewis Jan 13, 2021
8b72954
[Snyk] Upgrade parse from 2.17.0 to 2.18.0 (#1629)
snyk-bot Jan 13, 2021
e6c2f91
fix: upgrade commander from 6.2.0 to 6.2.1 (#1636)
snyk-bot Jan 13, 2021
1d2e0d3
fix: upgrade semver from 7.3.2 to 7.3.4 (#1634)
snyk-bot Jan 13, 2021
b8e3f71
chore(deps): bump ini from 1.3.5 to 1.3.8 (#1641)
dependabot[bot] Jan 13, 2021
5a31407
feat: upgrade react-ace from 8.0.0 to 9.2.1 (#1642)
snyk-bot Jan 19, 2021
c3e5f3e
fix: upgrade query-string from 6.13.7 to 6.13.8 (#1647)
davimacedo Jan 25, 2021
ed81576
fix: upgrade prismjs from 1.22.0 to 1.23.0 (#1646)
davimacedo Jan 25, 2021
3b52e61
fix: upgrade react-json-view from 1.19.1 to 1.20.0 (#1651)
davimacedo Feb 8, 2021
0d1595b
fix: upgrade react-json-view from 1.20.0 to 1.20.2 (#1652)
dplewis Feb 9, 2021
1c06a99
fix: upgrade react-json-view from 1.20.2 to 1.20.4 (#1655)
davimacedo Feb 17, 2021
a3697c9
fix: upgrade react-ace from 9.2.1 to 9.3.0 (#1659)
TomWFox Feb 22, 2021
088f8f0
fix: upgrade react-json-view from 1.20.4 to 1.20.5 (#1660)
TomWFox Feb 25, 2021
acecdeb
fix: upgrade @babel/runtime from 7.12.5 to 7.12.13 (#1661)
TomWFox Feb 25, 2021
281edbe
fix: upgrade react-json-view from 1.20.5 to 1.21.0 (#1662)
davimacedo Feb 26, 2021
1f72884
fix: upgrade react-json-view from 1.21.0 to 1.21.1 (#1663)
TomWFox Mar 1, 2021
c374e0c
fix: upgrade query-string from 6.13.8 to 6.14.0 (#1664)
TomWFox Mar 3, 2021
421a4bf
chore(deps): bump elliptic from 6.5.3 to 6.5.4 (#1666)
dependabot[bot] Mar 10, 2021
35cf0a7
fix: upgrade @babel/runtime from 7.12.13 to 7.12.18 (#1667)
TomWFox Mar 12, 2021
ef5d66d
fix: upgrade @babel/runtime from 7.12.18 to 7.13.6 (#1669)
snyk-bot Mar 16, 2021
376e267
fix: upgrade @babel/runtime from 7.13.6 to 7.13.7 (#1670)
snyk-bot Mar 17, 2021
0c64cfc
fix: upgrade query-string from 6.14.0 to 6.14.1 (#1672)
snyk-bot Mar 22, 2021
5a6af60
fix: upgrade @babel/runtime from 7.13.7 to 7.13.8 (#1673)
snyk-bot Mar 22, 2021
eb64b11
fix: upgrade @babel/runtime from 7.13.8 to 7.13.9 (#1674)
snyk-bot Mar 24, 2021
ebe0b21
fix: upgrade @babel/runtime from 7.13.9 to 7.13.10 (#1676)
snyk-bot Mar 30, 2021
efd24f8
fix: upgrade react-json-view from 1.21.1 to 1.21.3 (#1675)
snyk-bot Mar 30, 2021
924b5b7
Fix date filters (#1682)
sadakchap Apr 16, 2021
ab2a489
fix: upgrade react-ace from 9.3.0 to 9.4.0 (#1683)
snyk-bot Apr 19, 2021
8188e62
chore(deps): bump ssri from 6.0.1 to 6.0.2 (#1684)
dependabot[bot] Apr 19, 2021
f2e1f95
made expiresAt field readOnly (#1686)
sadakchap Apr 21, 2021
63cab5b
showing error message on failed clone row task (#1687)
sadakchap Apr 21, 2021
9698c72
showing a message when no locale is setup (#1685)
sadakchap Apr 21, 2021
ff6078a
Added tooltip for readonly fields (#1688)
sadakchap Apr 21, 2021
fda11f9
fix: upgrade js-beautify from 1.11.0 to 1.13.1 (#1649)
davimacedo Apr 23, 2021
bfc067e
fix: upgrade js-beautify from 1.13.1 to 1.13.5 (#1689)
snyk-bot Apr 23, 2021
5c43d6c
hiding setup locales msg (#1691)
sadakchap Apr 28, 2021
0264ec9
exculde hidden culomns (#1694)
itzharDev May 5, 2021
e5dc2e8
fix: upgrade js-beautify from 1.13.5 to 1.13.11 (#1696)
snyk-bot May 5, 2021
32eb99e
showing "(auto)" for readonly fields while adding new row (#1692)
sadakchap May 5, 2021
71db636
chore(deps): bump lodash from 4.17.20 to 4.17.21 (#1699)
dependabot[bot] May 7, 2021
bb6b7b2
chore(deps): bump ua-parser-js from 0.7.22 to 0.7.28 (#1698)
dependabot[bot] May 7, 2021
cc1c1a8
fix: upgrade js-beautify from 1.13.11 to 1.13.13 (#1701)
snyk-bot May 7, 2021
457a17d
chore(deps): bump hosted-git-info from 2.8.8 to 2.8.9 (#1702)
dependabot[bot] May 10, 2021
909ff92
Added ESC key binding (#1695)
sadakchap May 10, 2021
4cbc78d
updating counter in sidebar on success clone rows (#1703)
sadakchap May 10, 2021
597a0ed
updated fetch next query for pagination (#1706)
sadakchap May 12, 2021
a6181d6
fix: upgrade @babel/runtime from 7.13.10 to 7.13.16 (#1704)
snyk-bot May 12, 2021
0c9f766
chore(deps): bump codemirror from 5.58.1 to 5.61.0 (#1705)
dependabot[bot] May 12, 2021
ddf7548
fix: upgrade @babel/runtime from 7.13.16 to 7.13.17 (#1707)
snyk-bot May 13, 2021
46be742
added cancel button for new row (#1690)
sadakchap May 13, 2021
9d0504b
fix: upgrade @babel/runtime from 7.13.17 to 7.14.0 (#1710)
snyk-bot May 24, 2021
569db4b
feat(preventSort): allow preventSort from columnPreferences props (#1…
Klaitos May 24, 2021
cf3e1f7
chore(deps): bump browserslist from 4.14.5 to 4.16.6 (#1713)
dependabot[bot] May 24, 2021
83fb9cb
fix: Allow other key binding while adding new row (#1714)
May 27, 2021
0ee0ae6
update on file change (#1717)
sadakchap May 31, 2021
39396ff
Fix: Column name starting with numbers (#1718)
sadakchap May 31, 2021
b044768
chore(deps): bump normalize-url from 4.5.0 to 4.5.1 (#1725)
dependabot[bot] Jun 10, 2021
9e1470d
updated parse to 3.2.0 (#1733)
sadakchap Jun 15, 2021
2ed8c73
fix: upgrade react-popper-tooltip from 4.2.0 to 4.3.0 (#1736)
snyk-bot Jun 16, 2021
966b6dc
fix: upgrade react-ace from 9.4.0 to 9.4.1 (#1738)
snyk-bot Jun 28, 2021
8d7701b
chore(deps): bump prismjs from 1.23.0 to 1.24.0 (#1739)
dependabot[bot] Jun 29, 2021
a2acc2e
fix: upgrade @babel/runtime from 7.14.0 to 7.14.5 (#1740)
snyk-bot Jul 1, 2021
5d5ce92
fix: upgrade @babel/runtime from 7.14.5 to 7.14.6 (#1742)
snyk-bot Jul 6, 2021
92fe6a5
fix: upgrade js-beautify from 1.13.13 to 1.14.0 (#1743)
snyk-bot Jul 6, 2021
e4fab23
updated issue and PR templates (#1741)
mtrezza Jul 22, 2021
038be15
Showing * for required Columns (#1720)
sadakchap Jul 23, 2021
f73a523
fix: upgrade regenerator-runtime from 0.13.5 to 0.13.8 (#1748)
snyk-bot Jul 23, 2021
064472f
fix: package.json & package-lock.json to reduce vulnerabilities (#1745)
snyk-bot Jul 25, 2021
5e8987b
fix: upgrade prismjs from 1.24.0 to 1.24.1 (#1749)
snyk-bot Jul 25, 2021
58c9424
removing PR test from issue template
mtrezza Jul 25, 2021
526fedd
fixed comment style in issue template
mtrezza Jul 25, 2021
6cfcb46
Add option to create a field after creating a class #1726 (#1728)
fn-faisal Jul 26, 2021
b7698be
Arrays of Pointers dont render correctly #275 (#1727)
fn-faisal Jul 26, 2021
dd0a460
Delete index.html
mtrezza Jul 26, 2021
69bf041
Browse as Parse.User (Continuation) (#1750)
mtrezza Aug 3, 2021
f265b25
Improve cell value copying of pointer cell (#1708)
sadakchap Aug 3, 2021
ec0e944
Cloning Rows (#1697)
sadakchap Aug 6, 2021
2506945
fix: upgrade @babel/runtime from 7.14.6 to 7.14.8 (#1755)
snyk-bot Aug 11, 2021
0c5bafd
CSV Export of class data (#1494)
Vortec4800 Aug 17, 2021
1ddf29e
cell select height fix (#1754)
fn-faisal Aug 17, 2021
663aa39
Sidebar collapse (#1760)
mtrezza Aug 19, 2021
3c49967
fix: upgrade react-ace from 9.4.1 to 9.4.3 (#1762)
snyk-bot Aug 22, 2021
a599f2d
Exclude hidden fields (#1734)
sadakchap Aug 23, 2021
cb96799
Open pointer in new browser tab with [Cmd] click (#1757)
fn-faisal Aug 23, 2021
1270232
fixed incorrect row height (related to #1754)
mtrezza Aug 23, 2021
71c0791
fixed incorrect row height (related to #1754)
mtrezza Aug 23, 2021
a0a9cf2
Merge remote-tracking branch 'upstream/master'
mtrezza Aug 23, 2021
22b1d79
Merge remote-tracking branch 'upstream/master'
mtrezza Aug 23, 2021
7ce858a
Release 2.2.0 (#1763)
mtrezza Aug 23, 2021
8f13fcd
Fix typo in changelog
mtrezza Aug 23, 2021
e8c28ef
Added missing entry to readme toc
mtrezza Aug 23, 2021
ad26d62
Merge remote-tracking branch 'upstream/master'
mtrezza Aug 23, 2021
cd310b8
ci(changelog): add changelog reminder (#1764)
mtrezza Aug 23, 2021
0a3c86e
Merge remote-tracking branch 'upstream/master'
mtrezza Aug 24, 2021
35d0c04
fix typo in issue template
mtrezza Aug 25, 2021
c880f56
Merge remote-tracking branch 'upstream/master'
mtrezza Aug 27, 2021
4d43381
ci: add issue bot (#1766)
mtrezza Aug 27, 2021
e742442
Merge remote-tracking branch 'upstream/master'
mtrezza Aug 27, 2021
53abdb3
refactor: uniform issue templates across repos (#1767)
mtrezza Aug 27, 2021
7f5737c
Merge remote-tracking branch 'upstream/master'
mtrezza Aug 27, 2021
ef4c072
fix: date cell value not selected on double clicks (#1730)
fn-faisal Aug 31, 2021
c4e3200
fix: upgrade @babel/runtime from 7.14.8 to 7.15.3 (#1773)
snyk-bot Sep 2, 2021
a1463b5
chore(deps): bump object-path from 0.11.5 to 0.11.7 (#1774)
dependabot[bot] Sep 2, 2021
1603be9
Edit Array of pointers (#1771)
sadakchap Sep 2, 2021
a54a306
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 2, 2021
cbeaec0
Improve ui for array of pointer field (#1776)
sadakchap Sep 2, 2021
d0007b0
Merge branch 'master' of github.com:parse-community/parse-dashboard i…
sadakchap Sep 3, 2021
9f50ef2
Edit menu design fix
sadakchap Sep 3, 2021
f997779
Fix: Modal Z-index (#1778)
sadakchap Sep 3, 2021
5e660a8
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 4, 2021
206b3f1
refactor: remove parse issue bot (#1780)
mtrezza Sep 4, 2021
35d8486
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 4, 2021
9c04db2
ci: Fix docker image pushing to Docker Hub (#1781)
cbaker6 Sep 7, 2021
e452b1e
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 7, 2021
fe52082
ci: refactor docker ci (#1786)
mtrezza Sep 7, 2021
3650a01
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 7, 2021
29a4b48
feat: Add MFA to Dashboard (#1624)
dblythy Sep 7, 2021
7686c70
Fix: Update CLP for new class (#1785)
sadakchap Sep 7, 2021
2e2b461
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 7, 2021
0fe683a
fix(docker): increase node version in docker to 12 (#1788)
Sep 8, 2021
a637256
ci: modernize steps (#1789)
mtrezza Sep 9, 2021
d11f618
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 9, 2021
15bd67e
ci: Remove parse server dev dependency (#1796)
mtrezza Sep 9, 2021
c5d86cc
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 9, 2021
0ce85b1
Update sass and docker (#1792)
cbaker6 Sep 10, 2021
802c8fd
docs: Update node in README
Sep 10, 2021
dcb2909
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 10, 2021
233a63d
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 10, 2021
689df7c
fix: revert #1706 which introduced new database index requirements fo…
Sep 16, 2021
7371d06
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 16, 2021
db076e9
perf: asynchronously fetch classes counts in sidebar to not block das…
Sep 19, 2021
a0ad932
fix: upgrade react-router from 5.1.2 to 5.2.1 (#1805)
snyk-bot Sep 19, 2021
ab74741
fix: security upgrade prismjs from 1.24.1 to 1.25.0 (#1803)
snyk-bot Sep 19, 2021
d1f2435
fix: upgrade react-router-dom from 5.1.2 to 5.2.1 (#1804)
snyk-bot Sep 19, 2021
ea1409b
build: release 3.0.0 (#1806)
mtrezza Sep 19, 2021
e1c27ab
chore(deps): bump tmpl from 1.0.4 to 1.0.5 (#1808)
dependabot[bot] Sep 23, 2021
f94bb4d
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 23, 2021
b7217e5
ci: add release automation (#1810)
mtrezza Sep 23, 2021
c16c469
Merge remote-tracking branch 'upstream/master'
mtrezza Sep 23, 2021
501774a
ci: fix incorrect npm auth token name
mtrezza Sep 23, 2021
75045ae
ci: remove changelog todo from pull request template
mtrezza Sep 23, 2021
6782121
ci: update changelog todo in pull request template
mtrezza Sep 23, 2021
ad6048e
docs: fixed incorrect links in changelog
mtrezza Sep 23, 2021
d9960de
ci: upgrade @babel/runtime from 7.15.3 to 7.15.4 (#1816)
snyk-bot Sep 24, 2021
05b687e
Merge 'master' of back4app/parse-dashboard into mergeOS
sadakchap Sep 28, 2021
d411096
Merge 'master' of parse-community/parse-dashboard into mergeOS
sadakchap Sep 28, 2021
d668e52
menu icon css fix
sadakchap Sep 28, 2021
38cd755
added export functionality
sadakchap Sep 28, 2021
a2ee495
fixed setCurrent error on opening menu
sadakchap Sep 28, 2021
494ae23
added protected fields security dialog
sadakchap Sep 28, 2021
d8f1f28
edit clone rows modal state
sadakchap Sep 29, 2021
09b48da
fixed sidebar collapse pin
sadakchap Sep 29, 2021
2962f2e
added browser feature to tollbar
sadakchap Sep 29, 2021
7af903f
removed ci
sadakchap Sep 29, 2021
d2eb1e2
Create submenu option for browser menu
sadakchap Sep 30, 2021
518771b
added icon & active state
sadakchap Sep 30, 2021
8421095
added browsing feature as sub menu
sadakchap Sep 30, 2021
fe876d6
changed active styles
sadakchap Sep 30, 2021
81a8178
Merge 'master' of back4app/parse-dashboard into mergeOS
sadakchap Sep 30, 2021
a9b4d40
disabling subMenu
sadakchap Sep 30, 2021
d589a3b
closing both menus on click
sadakchap Oct 1, 2021
27c7ed5
display submenu on hover
sadakchap Oct 1, 2021
eae9707
fixing style for submenu items
sadakchap Oct 1, 2021
9489f2c
Import submenu
sadakchap Oct 1, 2021
46ae14d
reduced 1px btw menu & submenu
sadakchap Oct 1, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#
# --- Base Node Image ---
FROM node:8-alpine AS base
FROM node:lts-alpine AS base

RUN apk update; \
apk add git;
Expand All @@ -23,7 +23,7 @@ RUN npm run build

#
# --- Production Image ---
FROM node:8-alpine AS release
FROM node:lts-alpine AS release
WORKDIR /src

# Copy production node_modules
Expand Down
34 changes: 31 additions & 3 deletions Parse-Dashboard/Authentication.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var bcrypt = require('bcryptjs');
var csrf = require('csurf');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
const OTPAuth = require('otpauth')

/**
* Constructor for Authentication class
Expand All @@ -21,14 +22,22 @@ function initialize(app, options) {
options = options || {};
var self = this;
passport.use('local', new LocalStrategy(
function(username, password, cb) {
{passReqToCallback:true},
function(req, username, password, cb) {
var match = self.authenticate({
name: username,
pass: password
pass: password,
otpCode: req.body.otpCode
});
if (!match.matchingUsername) {
return cb(null, false, { message: 'Invalid username or password' });
}
if (match.otpMissing) {
return cb(null, false, { message: 'Please enter your one-time password.' });
}
if (!match.otpValid) {
return cb(null, false, { message: 'Invalid one-time password.' });
}
cb(null, match.matchingUsername);
})
);
Expand Down Expand Up @@ -82,6 +91,8 @@ function authenticate(userToTest, usernameOnly) {
let appsUserHasAccessTo = null;
let matchingUsername = null;
let isReadOnly = false;
let otpMissing = false;
let otpValid = true;

//they provided auth
let isAuthenticated = userToTest &&
Expand All @@ -91,6 +102,22 @@ function authenticate(userToTest, usernameOnly) {
this.validUsers.find(user => {
let isAuthenticated = false;
let usernameMatches = userToTest.name == user.user;
if (usernameMatches && user.mfa && !usernameOnly) {
if (!userToTest.otpCode) {
otpMissing = true;
} else {
const totp = new OTPAuth.TOTP({
algorithm: user.mfaAlgorithm || 'SHA1',
secret: OTPAuth.Secret.fromBase32(user.mfa)
});
const valid = totp.validate({
token: userToTest.otpCode
});
if (valid === null) {
otpValid = false;
}
}
}
let passwordMatches = this.useEncryptedPasswords && !usernameOnly ? bcrypt.compareSync(userToTest.pass, user.pass) : userToTest.pass == user.pass;
if (usernameMatches && (usernameOnly || passwordMatches)) {
isAuthenticated = true;
Expand All @@ -99,13 +126,14 @@ function authenticate(userToTest, usernameOnly) {
appsUserHasAccessTo = user.apps || null;
isReadOnly = !!user.readOnly; // make it true/false
}

return isAuthenticated;
}) ? true : false;

return {
isAuthenticated,
matchingUsername,
otpMissing,
otpValid,
appsUserHasAccessTo,
isReadOnly,
};
Expand Down
3 changes: 2 additions & 1 deletion Parse-Dashboard/parse-dashboard-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
"isOwner": true
}
}
]
],
"iconsFolder": "icons"
}
143 changes: 110 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Parse Dashboard
# Parse Dashboard <!-- omit in toc -->

[![Greenkeeper badge](https://badges.greenkeeper.io/parse-community/parse-dashboard.svg)](https://greenkeeper.io/)
[![Build Status](https://img.shields.io/travis/parse-community/parse-dashboard/master.svg?style=flat)](https://travis-ci.org/parse-community/parse-dashboard)
Expand All @@ -11,35 +11,40 @@

Parse Dashboard is a standalone dashboard for managing your [Parse Server](https://github.com/ParsePlatform/parse-server) apps.

* [Getting Started](#getting-started)
* [Local Installation](#local-installation)
* [Configuring Parse Dashboard](#configuring-parse-dashboard)
* [File](#file)
* [Environment variables](#environment-variables)
* [Multiple apps](#multiple-apps)
* [Single app](#single-app)
* [Managing Multiple Apps](#managing-multiple-apps)
* [GraphQL Playground](#graphql-playground)
* [App Icon Configuration](#app-icon-configuration)
* [App Background Color Configuration](#app-background-color-configuration)
* [Other Configuration Options](#other-configuration-options)
* [Running as Express Middleware](#running-as-express-middleware)
* [Deploying Parse Dashboard](#deploying-parse-dashboard)
* [Preparing for Deployment](#preparing-for-deployment)
* [Security Considerations](#security-considerations)
* [Configuring Basic Authentication](#configuring-basic-authentication)
* [Separating App Access Based on User Identity](#separating-app-access-based-on-user-identity)
* [Use Read-Only masterKey](#use-read-only-masterKey)
* [Making an app read-only for all users](#making-an-app-read-only-for-all-users)
* [Makings users read-only](#makings-users-read-only)
* [Making user's apps readOnly](#making-users-apps-readonly)
* [Configuring Localized Push Notifications](#configuring-localized-push-notifications)
* [Run with Docker](#run-with-docker)
* [Contributing](#contributing)
- [Getting Started](#getting-started)
- [Local Installation](#local-installation)
- [Configuring Parse Dashboard](#configuring-parse-dashboard)
- [File](#file)
- [Environment variables](#environment-variables)
- [Multiple apps](#multiple-apps)
- [Single app](#single-app)
- [Managing Multiple Apps](#managing-multiple-apps)
- [GraphQL Playground](#graphql-playground)
- [App Icon Configuration](#app-icon-configuration)
- [App Background Color Configuration](#app-background-color-configuration)
- [Other Configuration Options](#other-configuration-options)
- [Prevent columns sorting](#prevent-columns-sorting)
- [Running as Express Middleware](#running-as-express-middleware)
- [Deploying Parse Dashboard](#deploying-parse-dashboard)
- [Preparing for Deployment](#preparing-for-deployment)
- [Security Considerations](#security-considerations)
- [Configuring Basic Authentication](#configuring-basic-authentication)
- [Multi-Factor Authentication (One-Time Password)](#multi-factor-authentication-one-time-password)
- [Separating App Access Based on User Identity](#separating-app-access-based-on-user-identity)
- [Use Read-Only masterKey](#use-read-only-masterkey)
- [Making an app read-only for all users](#making-an-app-read-only-for-all-users)
- [Makings users read-only](#makings-users-read-only)
- [Making user's apps readOnly](#making-users-apps-readonly)
- [Configuring Localized Push Notifications](#configuring-localized-push-notifications)
- [Run with Docker](#run-with-docker)
- [Features](#features)
- [Browse as User](#browse-as-user)
- [CSV Export](#csv-export)
- [Contributing](#contributing)

# Getting Started

[Node.js](https://nodejs.org) version >= 8.9 is required to run the dashboard. You also need to be using Parse Server version 2.1.4 or higher.
[Node.js](https://nodejs.org) version >= 12 is required to run the dashboard. You also need to be using Parse Server version 2.1.4 or higher.

# Local Installation

Expand All @@ -57,7 +62,7 @@ parse-dashboard --dev --appId yourAppId --masterKey yourMasterKey --serverURL "h

You may set the host, port and mount path by supplying the `--host`, `--port` and `--mountPath` options to parse-dashboard. You can use anything you want as the app name, or leave it out in which case the app ID will be used.

NB: the `--dev` parameter is disabling production-ready security features, do not use this parameter when starting the dashboard in production. This parameter is useful if you are running on docker.
NB: the `--dev` parameter is disabling production-ready security features, do not use this parameter when starting the dashboard in production. This parameter is useful if you are running on docker.

After starting the dashboard, you can visit http://localhost:4040 in your browser:

Expand Down Expand Up @@ -241,6 +246,33 @@ You can set `appNameForURL` in the config file for each app to control the url o

To change the app to production, simply set `production` to `true` in your config file. The default value is false if not specified.

### Prevent columns sorting

You can prevent some columns to be sortable by adding `preventSort` to columnPreference options in each app configuration

```json

"apps": [
{
"appId": "local_app_id",
"columnPreference": {
"_User": [
{
"name": "createdAt",
"visible": true,
"preventSort": true
},
{
"name": "updatedAt",
"visible": true,
"preventSort": false
},
]
}
}
]
```

# Running as Express Middleware

Instead of starting Parse Dashboard with the CLI, you can also run it as an [express](https://github.com/expressjs/express) middleware.
Expand Down Expand Up @@ -347,7 +379,33 @@ You can configure your dashboard for Basic Authentication by adding usernames an
```

You can store the password in either `plain text` or `bcrypt` formats. To use the `bcrypt` format, you must set the config `useEncryptedPasswords` parameter to `true`.
You can encrypt the password using any online bcrypt tool e.g. [https://www.bcrypt-generator.com](https://www.bcrypt-generator.com).
You can generate encrypted passwords by using `parse-dashboard --createUser`, and pasting the result in your users config.

### Multi-Factor Authentication (One-Time Password)

You can add an additional layer of security for a user account by requiring multi-factor authentication (MFA) for the user to login.

With MFA enabled, a user must provide a one-time password that is typically bound to a physical device, in addition to their login password. This means in addition to knowing the login password, the user needs to have physical access to a device to generate the one-time password. This one-time password is time-based (TOTP) and only valid for a short amount of time, typically 30 seconds, until it expires.

The user requires an authenticator app to generate the one-time password. These apps are provided by many 3rd parties and mostly for free.

If you create a new user by running `parse-dashboard --createUser`, you will be asked whether you want to enable MFA for the new user. To enable MFA for an existing user,
run `parse-dashboard --createMFA` to generate a `mfa` secret that you then add to the existing user configuration, for example:

```json
{
"apps": [{"...": "..."}],
"users": [
{
"user":"user1",
"pass":"pass",
"mfa": "lmvmOIZGMTQklhOIhveqkumss"
}
]
}
```

Parse Dashboard follows the industry standard and supports the common OTP algorithm `SHA-1` by default, to be compatible with most authenticator apps. If you have specific security requirements regarding TOTP characteristics (algorithm, digit length, time period) you can customize them by using the guided configuration mentioned above.

### Separating App Access Based on User Identity
If you have configured your dashboard to manage multiple applications, you can restrict the management of apps based on user identity.
Expand Down Expand Up @@ -421,15 +479,15 @@ You can mark a user as a read-only user:
"appId": "myAppId1",
"masterKey": "myMasterKey1",
"readOnlyMasterKey": "myReadOnlyMasterKey1",
"serverURL": "myURL1",
"serverURL": "myURL1",
"port": 4040,
"production": true
},
{
"appId": "myAppId2",
"masterKey": "myMasterKey2",
"readOnlyMasterKey": "myReadOnlyMasterKey2",
"serverURL": "myURL2",
"serverURL": "myURL2",
"port": 4041,
"production": true
}
Expand Down Expand Up @@ -464,7 +522,7 @@ You can give read only access to a user on a per-app basis:
"appId": "myAppId1",
"masterKey": "myMasterKey1",
"readOnlyMasterKey": "myReadOnlyMasterKey1",
"serverURL": "myURL",
"serverURL": "myURL",
"port": 4040,
"production": true
},
Expand Down Expand Up @@ -505,7 +563,7 @@ You can provide a list of locales or languages you want to support for your dash

## Run with Docker

The official docker image is published on [docker hub](https://hub.docker.com/r/parseplatform/parse-dashboard)
The official docker image is published on [docker hub](https://hub.docker.com/r/parseplatform/parse-dashboard)

Run the image with your ``config.json`` mounted as a volume

Expand All @@ -529,6 +587,25 @@ docker run -d -p 80:8080 -v host/path/to/config.json:/src/Parse-Dashboard/parse-

If you are not familiar with Docker, ``--port 8080`` will be passed in as argument to the entrypoint to form the full command ``npm start -- --port 8080``. The application will start at port 8080 inside the container and port ``8080`` will be mounted to port ``80`` on your host machine.

# Features
*(The following is not a complete list of features but a work in progress to build a comprehensive feature list.)*

## Browse as User

▶️ *Core > Browser > Browse*

This feature allows you to use the data browser as another user, respecting that user's data permissions. For example, you will only see records and fields the user has permission to see.

> ⚠️ Logging in as another user will trigger the same Cloud Triggers as if the user logged in themselves using any other login method. Logging in as another user requires to enter that user's password.

## CSV Export

▶️ *Core > Browser > Export*

This feature will take either selected rows or all rows of an individual class and saves them to a CSV file, which is then downloaded. CSV headers are added to the top of the file matching the column names.

> ⚠️ There is currently a 10,000 row limit when exporting all data. If more than 10,000 rows are present in the class, the CSV file will only contain 10,000 rows.

# Contributing

We really want Parse to be yours, to see it grow and thrive in the open source community. Please see the [Contributing to Parse Dashboard guide](CONTRIBUTING.md).
Expand Down