Merge branch 'user-permissions' of https://github.com/strapi/strapi into user-permissions

This commit is contained in:
Jim Laurie 2017-11-20 14:38:09 +01:00
commit 7b84df6fbc
12 changed files with 157 additions and 325 deletions

View File

@ -217,27 +217,25 @@
.inputDate{
> div:first-of-type{
&:before{
content: '\f073';
position: absolute;
left: 1px; top: 1px;
content: '\f073';
width: 32px;
height: 32px;
background: #FAFAFB;
border-radius: 3px 0px 0px 3px;
background: #FAFAFB;
color: #B3B5B9;
text-align: center;
font-family: 'FontAwesome';
font-size: 1.4rem;
line-height: 32px;
text-align: center;
color: #B3B5B9;
-webkit-font-smoothing: none;
}
input {
width: 100%;
padding-left: 42px;
box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05);
&:focus{
outline: none;
}
@ -263,26 +261,23 @@
.inputToggleButtons {
padding-top: 9px;
> button {
width: 5.3rem;
height: 3.4rem;
margin-bottom: 2.8rem;
padding: 0;
line-height: 3.4rem;
border: 1px solid #E3E9F3;
border-radius: 0.25rem;
margin-bottom: 2.8rem;
// color
color: #CED3DB;
background-color: white;
// text
box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05);
font-weight: 600;
font-size: 1.2rem;
letter-spacing: 0.1rem;
font-family: Lato;
line-height: 3.4rem;
cursor: pointer;
box-shadow: 0px 1px 1px rgba(104, 118, 142, 0.05);
&:first-of-type {
border-right: none;
}

View File

@ -7,6 +7,18 @@ const parse = JSON.parse;
const stringify = JSON.stringify;
const auth = {
clear(key) {
if (localStorage && localStorage.getItem(key)) {
return localStorage.removeItem(key);
}
if (sessionStorage && sessionStorage.getItem(key)) {
return sessionStorage.removeItem(key);
}
return null;
},
clearAppStorage() {
if (localStorage) {
return localStorage.clear();
@ -20,85 +32,57 @@ const auth = {
},
clearToken(tokenKey = TOKEN_KEY) {
if (localStorage) {
return localStorage.removeItem(tokenKey);
}
if (sessionStorage) {
return sessionStorage.removeItem(tokenKey);
}
return null;
return auth.clear(tokenKey);
},
clearUserInfo(userInfo = USER_INFO) {
if (localStorage) {
return localStorage.removeItem(userInfo);
return auth.clear(userInfo);
},
get(key) {
if (localStorage && localStorage.getItem(key)) {
return parse(localStorage.getItem(key)) || null;
}
if (sessionStorage) {
return sessionStorage.removeItem(userInfo);
if (sessionStorage && sessionStorage.getItem(key)) {
return parse(sessionStorage.getItem(key)) || null;
}
return null;
},
getToken(tokenKey = TOKEN_KEY) {
if (localStorage && localStorage.getItem(tokenKey)) {
return parse(localStorage.getItem(tokenKey)) || null;
}
if (sessionStorage && sessionStorage.getItem(tokenKey)) {
return parse(sessionStorage.getItem(tokenKey)) || null;
}
return null;
return auth.get(tokenKey);
},
getUserInfo(userInfo = USER_INFO) {
if (localStorage && localStorage.getItem(userInfo)) {
return parse(localStorage.getItem(userInfo)) || null;
}
if (sessionStorage && sessionStorage.getItem(userInfo)) {
return parse(sessionStorage.getItem(userInfo)) || null;
}
return null;
return auth.get(userInfo);
},
setToken(value = '', isLocalStorage = false, tokenKey = TOKEN_KEY) {
set(value, key, isLocalStorage) {
if (isEmpty(value)) {
return null;
}
if (isLocalStorage && localStorage) {
console.log('ok')
return localStorage.setItem(tokenKey, stringify(value));
}
if (sessionStorage && sessionStorage) {
return sessionStorage.setItem(tokenKey, stringify(value));
}
return null;
},
setUserInfo(value = '', isLocalStorage = false, userInfo = USER_INFO) {
if (isEmpty(value)) {
return null;
}
if (isLocalStorage && localStorage) {
return localStorage.setItem(userInfo, stringify(value));
return localStorage.setItem(key, stringify(value));
}
if (sessionStorage) {
return sessionStorage.setItem(userInfo, stringify(value));
return sessionStorage.setItem(key, stringify(value));
}
return null;
},
setToken(value = '', isLocalStorage = false, tokenKey = TOKEN_KEY) {
return auth.set(value, tokenKey, isLocalStorage);
},
setUserInfo(value = '', isLocalStorage = false, userInfo = USER_INFO) {
return auth.set(value, userInfo, isLocalStorage);
},
}
export default auth;

View File

@ -59,6 +59,13 @@ export function setForm(formType, email) {
email,
};
break;
case 'reset-password':
data = {
password: '',
passwordConfirmation: '',
code: email,
};
break;
default:
data = {};
}
@ -76,10 +83,10 @@ export function submit() {
};
}
export function submitError(errors) {
export function submitError(formErrors) {
return {
type: SUBMIT_ERROR,
errors,
formErrors,
};
}

View File

@ -66,6 +66,20 @@
"label": "users-permissions.Auth.form.register-success.email.label",
"placeholder": "users-permissions.Auth.form.register-success.email.placeholder"
}
],
"reset-password": [
{
"customBootstrapClass": "col-md-12",
"name": "password",
"type": "password",
"label": "users-permissions.Auth.form.register.password.label"
},
{
"customBootstrapClass": "col-md-12",
"name": "passwordConfirmation",
"type": "password",
"label": "users-permissions.Auth.form.register.confirmPassword.label"
}
]
}
}

View File

@ -10,7 +10,7 @@ import { connect } from 'react-redux';
import { bindActionCreators, compose } from 'redux';
import { Link } from 'react-router-dom';
import { FormattedMessage } from 'react-intl';
import { findIndex, get, isBoolean, isEmpty, map } from 'lodash';
import { findIndex, get, isBoolean, isEmpty, map, replace } from 'lodash';
import cn from 'classnames';
// Logo
@ -39,17 +39,20 @@ import styles from './styles.scss';
export class AuthPage extends React.Component { // eslint-disable-line react/prefer-stateless-function
componentDidMount() {
this.props.setForm(this.props.match.params.authType, this.props.match.params.id);
const params = this.props.location.search ? replace(this.props.location.search, '?code=', '') : this.props.match.params.id;
this.props.setForm(this.props.match.params.authType, params);
}
componentWillReceiveProps(nextProps) {
if (this.props.match.params.authType !== nextProps.match.params.authType) {
this.props.setForm(nextProps.match.params.authType, nextProps.match.params.id);
const params = nextProps.location.search ? replace(nextProps.location.search, '?code=', '') : nextProps.match.params.id;
this.props.setForm(nextProps.match.params.authType, params);
}
if (nextProps.submitSuccess) {
switch (this.props.match.params.authType) {
case 'login':
case 'reset-password':
this.props.history.push('/');
break;
case 'register':
@ -187,6 +190,7 @@ AuthPage.propTypes = {
didCheckErrors: PropTypes.bool.isRequired,
formErrors: PropTypes.array.isRequired,
history: PropTypes.object.isRequired,
location: PropTypes.object.isRequired,
match: PropTypes.object.isRequired,
modifiedData: PropTypes.object.isRequired,
onChangeInput: PropTypes.func.isRequired,

View File

@ -9,6 +9,7 @@ import {
ON_CHANGE_INPUT,
SET_ERRORS,
SET_FORM,
SUBMIT_ERROR,
SUBMIT_SUCCEEDED,
} from './constants';
@ -26,6 +27,7 @@ function authPageReducer(state = initialState, action) {
return state
.updateIn(['modifiedData', action.key], () => action.value);
case SET_ERRORS:
case SUBMIT_ERROR:
return state
.set('didCheckErrors', !state.get('didCheckErrors'))
.set('formErrors', List(action.formErrors));

View File

@ -1,29 +1,66 @@
import { set } from 'lodash';
import { call, fork, takeLatest, put, select } from 'redux-saga/effects';
import auth from 'utils/auth';
import request from 'utils/request';
import { makeSelectFormType, makeSelectModifiedData } from './selectors';
import { submitSucceeded } from './actions';
import { submitError, submitSucceeded } from './actions';
import { SUBMIT } from './constants';
export function* submitForm() {
try {
const formType = yield select(makeSelectFormType());
const body = yield select(makeSelectModifiedData());
let requestURL;
if (formType === 'login' || formType === 'register') {
const endPoint = formType === 'login' ? '' : '/register';
const response = yield call(request, `/auth/local${endPoint}`, { method: 'POST', body });
switch (formType) {
case 'login':
requestURL = '/auth/local';
break;
case 'register':
requestURL = '/auth/local/register';
break;
case 'reset-password':
requestURL = '/auth/reset-password';
break;
case 'forgot-password':
requestURL = '/auth/forgot-password';
set(body, 'url', `${strapi.backendURL}/admin/plugins/users-permissions/auth/reset-password`);
break;
default:
if (response.jwt) {
yield call(auth.setToken, response.jwt, body.rememberMe);
yield call(auth.setUserInfo, response.user, body.rememberMe);
}
}
const response = yield call(request, requestURL, { method: 'POST', body });
if (response.jwt) {
yield call(auth.setToken, response.jwt, body.rememberMe);
yield call(auth.setUserInfo, response.user, body.rememberMe);
}
if (formType === 'forgot-password') {
strapi.notification.info('The email has been sent');
}
yield put(submitSucceeded());
} catch(error) {
strapi.notification.error('An error occured');
const formType = yield select(makeSelectFormType());
const errors = [{ id: error.response.payload.message }];
let formErrors;
switch (formType) {
case 'forgot-password':
formErrors = [{ name: 'email', errors }];
break;
// TODO : handle other error type;
default:
}
strapi.notification.error(error.response.payload.message);
yield put(submitError(formErrors));
}
}

View File

@ -4,7 +4,7 @@
*
*/
import { fromJS, List, Map } from 'immutable';
import { concat, get } from 'lodash';
import { get } from 'lodash';
import {
ADD_USER,
GET_PERMISSIONS,
@ -67,8 +67,8 @@ export function onCancel() {
}
export function onChangeInput({ target }) {
const keys = concat(['modifiedData'], target.name.split('.'));
const keys = ['modifiedData'].concat(target.name.split('.'));
return {
type: ON_CHANGE_INPUT,
keys,

View File

@ -1,6 +1,7 @@
{
"Auth.form.button.register-success": "Send again",
"Auth.form.button.forgot-password": "Send again",
"Auth.form.button.forgot-password": "Send email",
"Auth.form.button.reset-password": "Change password",
"Auth.form.button.login": "Log in",
"Auth.form.button.register": "Ready to start",
@ -83,6 +84,7 @@
"notification.error.delete": "An error occured while trying to delete the item",
"notification.error.fetch": "An error occured while trying to fetch data",
"notification.info.emailSent": "The email has been sent",
"notification.success.delete": "The item has been deleted",
"plugin.description": "Protect your API with a full-authentication process",
@ -93,21 +95,21 @@
"Plugins.header.title": "Permissions",
"Plugins.header.description": "Only actions bound by a route are listed below.",
"popUpForm.button.cancel": "Cancel",
"popUpForm.button.save": "Save",
"popUpForm.header.add.providers": "Add New Provider",
"popUpForm.header.edit.email-templates": "Edit Email Templates",
"popUpForm.header.edit.providers": "Edit Provider",
"popUpForm.inputSelect.providers.label": "Choose the provider",
"popUpForm.inputToggle.providers.label": "Enable",
"popUpForm.inputToggle.providers.description": "If disabled, the users won't be able to use this provider.",
"popUpForm.inputText.shipperName.label": "Shipper name",
"popUpForm.inputEmail.shipperEmail.label": "Shipper email",
"popUpForm.inputEmail.responseEmail.label": "Response email",
"popUpForm.inputText.emailObject.label": "Object",
"popUpForm.inputText.emailObject.placeholder": "Please confirm your email address for %APP_NAME%",
"popUpForm.inputTextArea.message.label": "Message",
"popUpForm.inputTextArea.message.placeholder": "<p>Please click on this link to validate your account</p>",
"popUpForm.inputEmail.placeholder": "johndoe@gmail.com",
"popUpForm.inputText.shipperName.placeholder": "John Doe"
"PopUpForm.button.cancel": "Cancel",
"PopUpForm.button.save": "Save",
"PopUpForm.header.add.providers": "Add New Provider",
"PopUpForm.header.edit.email-templates": "Edit Email Templates",
"PopUpForm.header.edit.providers": "Edit Provider",
"PopUpForm.inputSelect.providers.label": "Choose the provider",
"PopUpForm.inputToggle.providers.label": "Enable",
"PopUpForm.inputToggle.providers.description": "If disabled, the users won't be able to use this provider.",
"PopUpForm.inputText.shipperName.label": "Shipper name",
"PopUpForm.inputEmail.shipperEmail.label": "Shipper email",
"PopUpForm.inputEmail.responseEmail.label": "Response email",
"PopUpForm.inputText.emailObject.label": "Object",
"PopUpForm.inputText.emailObject.placeholder": "Please confirm your email address for %APP_NAME%",
"PopUpForm.inputTextArea.message.label": "Message",
"PopUpForm.inputTextArea.message.placeholder": "<p>Please click on this link to validate your account</p>",
"PopUpForm.inputEmail.placeholder": "johndoe@gmail.com",
"PopUpForm.inputText.shipperName.placeholder": "John Doe"
}

View File

@ -1,6 +1,7 @@
{
"Auth.form.button.register-success": "Envoyer à nouveau",
"Auth.form.button.forgot-password": "Envoyer à nouveau",
"Auth.form.button.reset-password": "Changez votre mot de passe",
"Auth.form.button.login": "Se connecter",
"Auth.form.button.register": "Prêt à commencer",
@ -84,6 +85,7 @@
"notification.error.delete": "Une erreur est survenue en essayant de supprimer cet élément",
"notification.error.fetch": "Une erreur est survenue en essayant de récupérer les données",
"notification.info.emailSent": "L'email a été envoyé",
"notification.success.delete": "L'élément a bien été supprimé",
"plugin.description": "Protegez votre API avec un système d'authentification complet",

View File

@ -2,230 +2,6 @@
"0": {
"description": "",
"name": "",
"permissions": {
"content-manager": {
"controllers": {
"contentmanager": {
"models": {
"enabled": false,
"policy": ""
},
"find": {
"enabled": false,
"policy": ""
},
"count": {
"enabled": false,
"policy": ""
},
"findOne": {
"enabled": false,
"policy": ""
},
"create": {
"enabled": false,
"policy": ""
},
"update": {
"enabled": false,
"policy": ""
},
"delete": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
}
}
}
},
"content-type-builder": {
"controllers": {
"contenttypebuilder": {
"getModels": {
"enabled": false,
"policy": ""
},
"getModel": {
"enabled": false,
"policy": ""
},
"getConnections": {
"enabled": false,
"policy": ""
},
"createModel": {
"enabled": false,
"policy": ""
},
"updateModel": {
"enabled": false,
"policy": ""
},
"deleteModel": {
"enabled": false,
"policy": ""
},
"autoReload": {
"enabled": false,
"policy": ""
},
"checkTableExists": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
}
}
}
},
"settings-manager": {
"controllers": {
"settingsmanager": {
"menu": {
"enabled": false,
"policy": ""
},
"environments": {
"enabled": false,
"policy": ""
},
"languages": {
"enabled": false,
"policy": ""
},
"databases": {
"enabled": false,
"policy": ""
},
"database": {
"enabled": false,
"policy": ""
},
"databaseModel": {
"enabled": false,
"policy": ""
},
"get": {
"enabled": false,
"policy": ""
},
"update": {
"enabled": false,
"policy": ""
},
"createLanguage": {
"enabled": false,
"policy": ""
},
"deleteLanguage": {
"enabled": false,
"policy": ""
},
"createDatabase": {
"enabled": false,
"policy": ""
},
"updateDatabase": {
"enabled": false,
"policy": ""
},
"deleteDatabase": {
"enabled": false,
"policy": ""
},
"autoReload": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
}
}
}
},
"users-permissions": {
"controllers": {
"auth": {
"callback": {
"enabled": false,
"policy": ""
},
"register": {
"enabled": false,
"policy": ""
},
"forgotPassword": {
"enabled": false,
"policy": ""
},
"changePassword": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
}
},
"user": {
"find": {
"enabled": false,
"policy": ""
},
"findOne": {
"enabled": false,
"policy": ""
},
"create": {
"enabled": false,
"policy": ""
},
"update": {
"enabled": false,
"policy": ""
},
"destroy": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
}
},
"userspermissions": {
"getPermissions": {
"enabled": false,
"policy": ""
},
"getRole": {
"enabled": false,
"policy": ""
},
"index": {
"enabled": false,
"policy": ""
},
"init": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
}
}
}
},
"toto": {
"controllers": {}
}
}
"permissions": {}
}
}
}

View File

@ -60,6 +60,15 @@
"prefix": ""
}
},
{
"method": "POST",
"path": "/auth/reset-password",
"handler": "Auth.changePassword",
"config": {
"policies": [],
"prefix": ""
}
},
{
"method": "GET",