Convert audit_table to a proper table

Этот коммит содержится в:
JoramWilander
2016-02-04 10:35:31 -05:00
родитель a3df1eaa55
Коммит 66a5bdba2e
4 изменённых файлов: 400 добавлений и 410 удалений

Просмотреть файл

@@ -73,7 +73,8 @@ class AccessHistoryModal extends React.Component {
content = ( content = (
<AuditTable <AuditTable
audits={this.state.audits} audits={this.state.audits}
moreInfo={this.state.moreInfo} showIp={true}
showSession={true}
/> />
); );
} }

Просмотреть файл

@@ -60,8 +60,9 @@ export default class Audits extends React.Component {
<div style={{margin: '10px'}}> <div style={{margin: '10px'}}>
<AuditTable <AuditTable
audits={this.state.audits} audits={this.state.audits}
oneLine={true}
showUserId={true} showUserId={true}
showIp={true}
showSession={true}
/> />
</div> </div>
); );

Просмотреть файл

@@ -183,39 +183,128 @@ const holders = defineMessages({
loginFailure: { loginFailure: {
id: 'audit_table.loginFailure', id: 'audit_table.loginFailure',
defaultMessage: ' (Login failure)' defaultMessage: ' (Login failure)'
},
userId: {
id: 'audit_table.userId',
defaultMessage: 'User ID'
} }
}); });
class AuditTable extends React.Component { class AuditTable extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.handleMoreInfo = this.handleMoreInfo.bind(this);
this.formatAuditInfo = this.formatAuditInfo.bind(this);
this.handleRevokedSession = this.handleRevokedSession.bind(this);
this.state = {moreInfo: []};
} }
handleMoreInfo(index) { render() {
var newMoreInfo = this.state.moreInfo; var accessList = [];
newMoreInfo[index] = true;
this.setState({moreInfo: newMoreInfo});
}
handleRevokedSession(sessionId) {
return this.props.intl.formatMessage(holders.sessionRevoked, {sessionId: sessionId});
}
formatAuditInfo(currentAudit) {
const currentActionURL = currentAudit.action.replace(/\/api\/v[1-9]/, '');
const {formatMessage} = this.props.intl; const {formatMessage} = this.props.intl;
let currentAuditDesc = ''; for (var i = 0; i < this.props.audits.length; i++) {
const audit = this.props.audits[i];
const auditInfo = formatAuditInfo(audit, formatMessage);
if (currentActionURL.indexOf('/channels') === 0) { let uContent;
const channelInfo = currentAudit.extra_info.split(' '); if (this.props.showUserId) {
uContent = <td>{auditInfo.userId}</td>;
}
let iContent;
if (this.props.showIp) {
iContent = <td>{auditInfo.ip}</td>;
}
let sContent;
if (this.props.showSession) {
sContent = <td>{auditInfo.sessionId}</td>;
}
accessList[i] = (
<tr key={audit.id}>
<td>{auditInfo.timestamp}</td>
{uContent}
<td>{auditInfo.desc}</td>
{iContent}
{sContent}
</tr>
);
}
let userIdContent;
if (this.props.showUserId) {
userIdContent = (
<th>
<FormattedMessage
id='audit_table.userId'
defaultMessage='User ID'
/>
</th>
);
}
let ipContent;
if (this.props.showIp) {
ipContent = (
<th>
<FormattedMessage
id='audit_table.ip'
defaultMessage='IP Address'
/>
</th>
);
}
let sessionContent;
if (this.props.showSession) {
sessionContent = (
<th>
<FormattedMessage
id='audit_table.session'
defaultMessage='Session ID'
/>
</th>
);
}
return (
<table className='table'>
<thead>
<tr>
<th>
<FormattedMessage
id='audit_table.timestamp'
defaultMessage='Timestamp'
/>
</th>
{userIdContent}
<th>
<FormattedMessage
id='audit_table.action'
defaultMessage='Action'
/>
</th>
{ipContent}
{sessionContent}
</tr>
</thead>
<tbody>
{accessList}
</tbody>
</table>
);
}
}
AuditTable.propTypes = {
intl: intlShape.isRequired,
audits: React.PropTypes.array.isRequired,
showUserId: React.PropTypes.bool,
showIp: React.PropTypes.bool,
showSession: React.PropTypes.bool
};
export default injectIntl(AuditTable);
export function formatAuditInfo(audit, formatMessage) {
const actionURL = audit.action.replace(/\/api\/v[1-9]/, '');
let auditDesc = '';
if (actionURL.indexOf('/channels') === 0) {
const channelInfo = audit.extra_info.split(' ');
const channelNameField = channelInfo[0].split('='); const channelNameField = channelInfo[0].split('=');
let channelURL = ''; let channelURL = '';
@@ -231,19 +320,19 @@ class AuditTable extends React.Component {
} }
} }
switch (currentActionURL) { switch (actionURL) {
case '/channels/create': case '/channels/create':
currentAuditDesc = formatMessage(holders.channelCreated, {channelName: channelName}); auditDesc = formatMessage(holders.channelCreated, {channelName: channelName});
break; break;
case '/channels/create_direct': case '/channels/create_direct':
currentAuditDesc = formatMessage(holders.establishedDM, {username: Utils.getDirectTeammate(channelObj.id).username}); auditDesc = formatMessage(holders.establishedDM, {username: Utils.getDirectTeammate(channelObj.id).username});
break; break;
case '/channels/update': case '/channels/update':
currentAuditDesc = formatMessage(holders.nameUpdated, {channelName: channelName}); auditDesc = formatMessage(holders.nameUpdated, {channelName: channelName});
break; break;
case '/channels/update_desc': // support the old path case '/channels/update_desc': // support the old path
case '/channels/update_header': case '/channels/update_header':
currentAuditDesc = formatMessage(holders.headerUpdated, {channelName: channelName}); auditDesc = formatMessage(holders.headerUpdated, {channelName: channelName});
break; break;
default: { default: {
let userIdField = []; let userIdField = [];
@@ -259,50 +348,50 @@ class AuditTable extends React.Component {
} }
} }
if (/\/channels\/[A-Za-z0-9]+\/delete/.test(currentActionURL)) { if (/\/channels\/[A-Za-z0-9]+\/delete/.test(actionURL)) {
currentAuditDesc = formatMessage(holders.channelDeleted, {url: channelURL}); auditDesc = formatMessage(holders.channelDeleted, {url: channelURL});
} else if (/\/channels\/[A-Za-z0-9]+\/add/.test(currentActionURL)) { } else if (/\/channels\/[A-Za-z0-9]+\/add/.test(actionURL)) {
currentAuditDesc = formatMessage(holders.userAdded, {username: username, channelName: channelName}); auditDesc = formatMessage(holders.userAdded, {username: username, channelName: channelName});
} else if (/\/channels\/[A-Za-z0-9]+\/remove/.test(currentActionURL)) { } else if (/\/channels\/[A-Za-z0-9]+\/remove/.test(actionURL)) {
currentAuditDesc = formatMessage(holders.userRemoved, {username: username, channelName: channelName}); auditDesc = formatMessage(holders.userRemoved, {username: username, channelName: channelName});
} }
break; break;
} }
} }
} else if (currentActionURL.indexOf('/oauth') === 0) { } else if (actionURL.indexOf('/oauth') === 0) {
const oauthInfo = currentAudit.extra_info.split(' '); const oauthInfo = audit.extra_info.split(' ');
switch (currentActionURL) { switch (actionURL) {
case '/oauth/register': { case '/oauth/register': {
const clientIdField = oauthInfo[0].split('='); const clientIdField = oauthInfo[0].split('=');
if (clientIdField[0] === 'client_id') { if (clientIdField[0] === 'client_id') {
currentAuditDesc = formatMessage(holders.attemptedRegisterApp, {id: clientIdField[1]}); auditDesc = formatMessage(holders.attemptedRegisterApp, {id: clientIdField[1]});
} }
break; break;
} }
case '/oauth/allow': case '/oauth/allow':
if (oauthInfo[0] === 'attempt') { if (oauthInfo[0] === 'attempt') {
currentAuditDesc = formatMessage(holders.attemptedAllowOAuthAccess); auditDesc = formatMessage(holders.attemptedAllowOAuthAccess);
} else if (oauthInfo[0] === 'success') { } else if (oauthInfo[0] === 'success') {
currentAuditDesc = formatMessage(holders.successfullOAuthAccess); auditDesc = formatMessage(holders.successfullOAuthAccess);
} else if (oauthInfo[0] === 'fail - redirect_uri did not match registered callback') { } else if (oauthInfo[0] === 'fail - redirect_uri did not match registered callback') {
currentAuditDesc = formatMessage(holders.failedOAuthAccess); auditDesc = formatMessage(holders.failedOAuthAccess);
} }
break; break;
case '/oauth/access_token': case '/oauth/access_token':
if (oauthInfo[0] === 'attempt') { if (oauthInfo[0] === 'attempt') {
currentAuditDesc = formatMessage(holders.attemptedOAuthToken); auditDesc = formatMessage(holders.attemptedOAuthToken);
} else if (oauthInfo[0] === 'success') { } else if (oauthInfo[0] === 'success') {
currentAuditDesc = formatMessage(holders.successfullOAuthToken); auditDesc = formatMessage(holders.successfullOAuthToken);
} else { } else {
const oauthTokenFailure = oauthInfo[0].split('-'); const oauthTokenFailure = oauthInfo[0].split('-');
if (oauthTokenFailure[0].trim() === 'fail' && oauthTokenFailure[1]) { if (oauthTokenFailure[0].trim() === 'fail' && oauthTokenFailure[1]) {
currentAuditDesc = formatMessage(oauthTokenFailure, {token: oauthTokenFailure[1].trim()}); auditDesc = formatMessage(oauthTokenFailure, {token: oauthTokenFailure[1].trim()});
} }
} }
@@ -310,47 +399,47 @@ class AuditTable extends React.Component {
default: default:
break; break;
} }
} else if (currentActionURL.indexOf('/users') === 0) { } else if (actionURL.indexOf('/users') === 0) {
const userInfo = currentAudit.extra_info.split(' '); const userInfo = audit.extra_info.split(' ');
switch (currentActionURL) { switch (actionURL) {
case '/users/login': case '/users/login':
if (userInfo[0] === 'attempt') { if (userInfo[0] === 'attempt') {
currentAuditDesc = formatMessage(holders.attemptedLogin); auditDesc = formatMessage(holders.attemptedLogin);
} else if (userInfo[0] === 'success') { } else if (userInfo[0] === 'success') {
currentAuditDesc = formatMessage(holders.successfullLogin); auditDesc = formatMessage(holders.successfullLogin);
} else if (userInfo[0]) { } else if (userInfo[0]) {
currentAuditDesc = formatMessage(holders.failedLogin); auditDesc = formatMessage(holders.failedLogin);
} }
break; break;
case '/users/revoke_session': case '/users/revoke_session':
currentAuditDesc = this.handleRevokedSession(userInfo[0].split('=')[1]); auditDesc = formatMessage(holders.sessionRevoked, {sessionId: userInfo[0].split('=')[1]});
break; break;
case '/users/newimage': case '/users/newimage':
currentAuditDesc = formatMessage(holders.updatePicture); auditDesc = formatMessage(holders.updatePicture);
break; break;
case '/users/update': case '/users/update':
currentAuditDesc = formatMessage(holders.updateGeneral); auditDesc = formatMessage(holders.updateGeneral);
break; break;
case '/users/newpassword': case '/users/newpassword':
if (userInfo[0] === 'attempted') { if (userInfo[0] === 'attempted') {
currentAuditDesc = formatMessage(holders.attemptedPassword); auditDesc = formatMessage(holders.attemptedPassword);
} else if (userInfo[0] === 'completed') { } else if (userInfo[0] === 'completed') {
currentAuditDesc = formatMessage(holders.successfullPassword); auditDesc = formatMessage(holders.successfullPassword);
} else if (userInfo[0] === 'failed - tried to update user password who was logged in through oauth') { } else if (userInfo[0] === 'failed - tried to update user password who was logged in through oauth') {
currentAuditDesc = formatMessage(holders.failedPassword); auditDesc = formatMessage(holders.failedPassword);
} }
break; break;
case '/users/update_roles': { case '/users/update_roles': {
const userRoles = userInfo[0].split('=')[1]; const userRoles = userInfo[0].split('=')[1];
currentAuditDesc = formatMessage(holders.updatedRol); auditDesc = formatMessage(holders.updatedRol);
if (userRoles.trim()) { if (userRoles.trim()) {
currentAuditDesc += userRoles; auditDesc += userRoles;
} else { } else {
currentAuditDesc += formatMessage(holders.member); auditDesc += formatMessage(holders.member);
} }
break; break;
@@ -362,65 +451,65 @@ class AuditTable extends React.Component {
/* Either describes account activation/deactivation or a revoked session as part of an account deactivation */ /* Either describes account activation/deactivation or a revoked session as part of an account deactivation */
if (updateType === 'active') { if (updateType === 'active') {
if (updateField === 'true') { if (updateField === 'true') {
currentAuditDesc = formatMessage(holders.accountActive); auditDesc = formatMessage(holders.accountActive);
} else if (updateField === 'false') { } else if (updateField === 'false') {
currentAuditDesc = formatMessage(holders.accountInactive); auditDesc = formatMessage(holders.accountInactive);
} }
const actingUserInfo = userInfo[1].split('='); const actingUserInfo = userInfo[1].split('=');
if (actingUserInfo[0] === 'session_user') { if (actingUserInfo[0] === 'session_user') {
const actingUser = UserStore.getProfile(actingUserInfo[1]); const actingUser = UserStore.getProfile(actingUserInfo[1]);
const currentUser = UserStore.getCurrentUser(); const user = UserStore.getCurrentUser();
if (currentUser && actingUser && (Utils.isAdmin(currentUser.roles) || Utils.isSystemAdmin(currentUser.roles))) { if (user && actingUser && (Utils.isAdmin(user.roles) || Utils.isSystemAdmin(user.roles))) {
currentAuditDesc += formatMessage(holders.by, {username: actingUser.username}); auditDesc += formatMessage(holders.by, {username: actingUser.username});
} else if (currentUser && actingUser) { } else if (user && actingUser) {
currentAuditDesc += formatMessage(holders.byAdmin); auditDesc += formatMessage(holders.byAdmin);
} }
} }
} else if (updateType === 'session_id') { } else if (updateType === 'session_id') {
currentAuditDesc = this.handleRevokedSession(updateField); auditDesc = formatMessage(holders.sessionRevoked, {sessionId: updateField});
} }
break; break;
} }
case '/users/send_password_reset': case '/users/send_password_reset':
currentAuditDesc = formatMessage(holders.sentEmail, {email: userInfo[0].split('=')[1]}); auditDesc = formatMessage(holders.sentEmail, {email: userInfo[0].split('=')[1]});
break; break;
case '/users/reset_password': case '/users/reset_password':
if (userInfo[0] === 'attempt') { if (userInfo[0] === 'attempt') {
currentAuditDesc = formatMessage(holders.attemptedReset); auditDesc = formatMessage(holders.attemptedReset);
} else if (userInfo[0] === 'success') { } else if (userInfo[0] === 'success') {
currentAuditDesc = formatMessage(holders.successfullReset); auditDesc = formatMessage(holders.successfullReset);
} }
break; break;
case '/users/update_notify': case '/users/update_notify':
currentAuditDesc = formatMessage(holders.updateGlobalNotifications); auditDesc = formatMessage(holders.updateGlobalNotifications);
break; break;
default: default:
break; break;
} }
} else if (currentActionURL.indexOf('/hooks') === 0) { } else if (actionURL.indexOf('/hooks') === 0) {
const webhookInfo = currentAudit.extra_info.split(' '); const webhookInfo = audit.extra_info.split(' ');
switch (currentActionURL) { switch (actionURL) {
case '/hooks/incoming/create': case '/hooks/incoming/create':
if (webhookInfo[0] === 'attempt') { if (webhookInfo[0] === 'attempt') {
currentAuditDesc = formatMessage(holders.attemptedWebhookCreate); auditDesc = formatMessage(holders.attemptedWebhookCreate);
} else if (webhookInfo[0] === 'success') { } else if (webhookInfo[0] === 'success') {
currentAuditDesc = formatMessage(holders.succcessfullWebhookCreate); auditDesc = formatMessage(holders.succcessfullWebhookCreate);
} else if (webhookInfo[0] === 'fail - bad channel permissions') { } else if (webhookInfo[0] === 'fail - bad channel permissions') {
currentAuditDesc = formatMessage(holders.failedWebhookCreate); auditDesc = formatMessage(holders.failedWebhookCreate);
} }
break; break;
case '/hooks/incoming/delete': case '/hooks/incoming/delete':
if (webhookInfo[0] === 'attempt') { if (webhookInfo[0] === 'attempt') {
currentAuditDesc = formatMessage(holders.attemptedWebhookDelete); auditDesc = formatMessage(holders.attemptedWebhookDelete);
} else if (webhookInfo[0] === 'success') { } else if (webhookInfo[0] === 'success') {
currentAuditDesc = formatMessage(holders.successfullWebhookDelete); auditDesc = formatMessage(holders.successfullWebhookDelete);
} else if (webhookInfo[0] === 'fail - inappropriate conditions') { } else if (webhookInfo[0] === 'fail - inappropriate conditions') {
currentAuditDesc = formatMessage(holders.failedWebhookDelete); auditDesc = formatMessage(holders.failedWebhookDelete);
} }
break; break;
@@ -428,12 +517,12 @@ class AuditTable extends React.Component {
break; break;
} }
} else { } else {
switch (currentActionURL) { switch (actionURL) {
case '/logout': case '/logout':
currentAuditDesc = formatMessage(holders.logout); auditDesc = formatMessage(holders.logout);
break; break;
case '/verify_email': case '/verify_email':
currentAuditDesc = formatMessage(holders.verified); auditDesc = formatMessage(holders.verified);
break; break;
default: default:
break; break;
@@ -441,131 +530,36 @@ class AuditTable extends React.Component {
} }
/* If all else fails... */ /* If all else fails... */
if (!currentAuditDesc) { if (!auditDesc) {
/* Currently not called anywhere */ /* Currently not called anywhere */
if (currentAudit.extra_info.indexOf('revoked_all=') >= 0) { if (audit.extra_info.indexOf('revoked_all=') >= 0) {
currentAuditDesc = formatMessage(holders.revokedAll); auditDesc = formatMessage(holders.revokedAll);
} else { } else {
let currentActionDesc = ''; let actionDesc = '';
if (currentActionURL && currentActionURL.lastIndexOf('/') !== -1) { if (actionURL && actionURL.lastIndexOf('/') !== -1) {
currentActionDesc = currentActionURL.substring(currentActionURL.lastIndexOf('/') + 1).replace('_', ' '); actionDesc = actionURL.substring(actionURL.lastIndexOf('/') + 1).replace('_', ' ');
currentActionDesc = Utils.toTitleCase(currentActionDesc); actionDesc = Utils.toTitleCase(actionDesc);
} }
let currentExtraInfoDesc = ''; let extraInfoDesc = '';
if (currentAudit.extra_info) { if (audit.extra_info) {
currentExtraInfoDesc = currentAudit.extra_info; extraInfoDesc = audit.extra_info;
if (currentExtraInfoDesc.indexOf('=') !== -1) { if (extraInfoDesc.indexOf('=') !== -1) {
currentExtraInfoDesc = currentExtraInfoDesc.substring(currentExtraInfoDesc.indexOf('=') + 1); extraInfoDesc = extraInfoDesc.substring(extraInfoDesc.indexOf('=') + 1);
} }
} }
currentAuditDesc = currentActionDesc + ' ' + currentExtraInfoDesc; auditDesc = actionDesc + ' ' + extraInfoDesc;
} }
} }
const currentDate = new Date(currentAudit.create_at); const date = new Date(audit.create_at);
let currentAuditInfo = currentDate.toLocaleDateString(global.window.mm_locale, {month: 'short', day: '2-digit', year: 'numeric'}) + ' - ' + currentDate.toLocaleTimeString(global.window.mm_locale, {hour: '2-digit', minute: '2-digit'}); let auditInfo = {};
auditInfo.timestamp = date.toLocaleDateString(global.window.mm_locale, {month: 'short', day: '2-digit', year: 'numeric'}) + ' - ' + date.toLocaleTimeString(global.window.mm_locale, {hour: '2-digit', minute: '2-digit'});
auditInfo.userId = audit.user_id;
auditInfo.desc = auditDesc;
auditInfo.ip = audit.ip_address;
auditInfo.sessionId = audit.session_id;
if (this.props.showUserId) { return auditInfo;
currentAuditInfo += ' | ' + formatMessage(holders.userId) + ': ' + currentAudit.user_id;
} }
currentAuditInfo += ' | ' + currentAuditDesc;
return currentAuditInfo;
}
render() {
var accessList = [];
const {formatMessage} = this.props.intl;
for (var i = 0; i < this.props.audits.length; i++) {
const currentAudit = this.props.audits[i];
const currentAuditInfo = this.formatAuditInfo(currentAudit);
let moreInfo;
if (!this.props.oneLine) {
moreInfo = (
<a
href='#'
className='theme'
onClick={this.handleMoreInfo.bind(this, i)}
>
<FormattedMessage
id='audit_table.moreInfo'
defaultMessage='More info'
/>
</a>
);
}
if (this.state.moreInfo[i]) {
if (!currentAudit.session_id) {
currentAudit.session_id = 'N/A';
if (currentAudit.action.search('/users/login') >= 0) {
if (currentAudit.extra_info === 'attempt') {
currentAudit.session_id += formatMessage(holders.loginAttempt);
} else {
currentAudit.session_id += formatMessage(holders.loginFailure);
}
}
}
moreInfo = (
<div>
<div>
<FormattedMessage
id='audit_table.ip'
defaultMessage='IP: {ip}'
values={{
ip: currentAudit.ip_address
}}
/>
</div>
<div>
<FormattedMessage
id='audit_table.session'
defaultMessage='Session ID: {id}'
values={{
id: currentAudit.session_id
}}
/>
</div>
</div>
);
}
var divider = null;
if (i < this.props.audits.length - 1) {
divider = (<div className='divider-light'></div>);
}
accessList[i] = (
<div
key={'accessHistoryEntryKey' + i}
className='access-history__table'
>
<div className='access__report'>
<div className='report__time'>{currentAuditInfo}</div>
<div className='report__info'>
{moreInfo}
</div>
{divider}
</div>
</div>
);
}
return <form role='form'>{accessList}</form>;
}
}
AuditTable.propTypes = {
intl: intlShape.isRequired,
audits: React.PropTypes.array.isRequired,
oneLine: React.PropTypes.bool,
showUserId: React.PropTypes.bool
};
export default injectIntl(AuditTable);

Просмотреть файл

@@ -8,6 +8,54 @@
"about.date": "Build Date:", "about.date": "Build Date:",
"about.hash": "Build Hash:", "about.hash": "Build Hash:",
"about.close": "Close", "about.close": "Close",
"audit_table.sessionRevoked": "The session with id {sessionId} was revoked",
"audit_table.channelCreated": "Created the {channelName} channel/group",
"audit_table.establishedDM": "Established a direct message channel with {username}",
"audit_table.nameUpdated": "Updated the {channelName} channel/group name",
"audit_table.headerUpdated": "Updated the {channelName} channel/group header",
"audit_table.channelDeleted": "Deleted the channel/group with the URL {url}",
"audit_table.userAdded": "Added {username} to the {channelName} channel/group",
"audit_table.userRemoved": "Removed {username} to the {channelName} channel/group",
"audit_table.attemptedRegisterApp": "Attempted to register a new OAuth Application with ID {id}",
"audit_table.attemptedAllowOAuthAccess": "Attempted to allow a new OAuth service access",
"audit_table.successfullOAuthAccess": "Successfully gave a new OAuth service access",
"audit_table.failedOAuthAccess": "Failed to allow a new OAuth service access - the redirect URI did not match the previously registered callback",
"audit_table.attemptedOAuthToken": "Attempted to get an OAuth access token",
"audit_table.successfullOAuthToken": "Successfully added a new OAuth service",
"audit_table.oauthTokenFailed": "Failed to get an OAuth access token - {token}",
"audit_table.attemptedLogin": "Attempted to login",
"audit_table.successfullLogin": "Successfully logged in",
"audit_table.failedLogin": "FAILED login attempt",
"audit_table.updatePicture": "Updated your profile picture",
"audit_table.updateGeneral": "Updated the general settings of your account",
"audit_table.attemptedPassword": "Attempted to change password",
"audit_table.successfullPassword": "Successfully changed password",
"audit_table.failedPassword": "Failed to change password - tried to update user password who was logged in through oauth",
"audit_table.updatedRol": "Updated user role(s) to ",
"audit_table.member": "member",
"audit_table.accountActive": "Account made active",
"audit_table.accountInactive": "Account made inactive",
"audit_table.by": " by {username}",
"audit_table.byAdmin": " by an admin",
"audit_table.sentEmail": "Sent an email to {email} to reset your password",
"audit_table.attemptedReset": "Attempted to reset password",
"audit_table.successfullReset": "Successfully reset password",
"audit_table.updateGlobalNotifications": "Updated your global notification settings",
"audit_table.attemptedWebhookCreate": "Attempted to create a webhook",
"audit_table.successfullWebhookCreate": "Successfully created a webhook",
"audit_table.failedWebhookCreate": "Failed to create a webhook - bad channel permissions",
"audit_table.attemptedWebhookDelete": "Attempted to delete a webhook",
"audit_table.successfullWebhookDelete": "Successfully deleted a webhook",
"audit_table.failedWebhookDelete": "Failed to delete a webhook - inappropriate conditions",
"audit_table.logout": "Logged out of your account",
"audit_table.verified": "Sucessfully verified your email address",
"audit_table.revokedAll": "Revoked all current sessions for the team",
"audit_table.loginAttempt": " (Login attempt)",
"audit_table.loginFailure": " (Login failure)",
"audit_table.moreInfo": "More info",
"audit_table.ip": "IP Address",
"audit_table.session": "Session ID",
"audit_table.userId": "User ID",
"access_history.title": "Access History", "access_history.title": "Access History",
"activity_log_modal.iphoneNativeApp": "iPhone Native App", "activity_log_modal.iphoneNativeApp": "iPhone Native App",
"activity_log_modal.androidNativeApp": "Android Native App", "activity_log_modal.androidNativeApp": "Android Native App",
@@ -33,7 +81,6 @@
"admin.sidebar.statistics": "- Statistics", "admin.sidebar.statistics": "- Statistics",
"admin.sidebar.ldap": "LDAP Settings", "admin.sidebar.ldap": "LDAP Settings",
"admin.sidebar.license": "Edition and License", "admin.sidebar.license": "Edition and License",
"admin.sidebar.audits": "Audits",
"admin.sidebar.reports": "SITE REPORTS", "admin.sidebar.reports": "SITE REPORTS",
"admin.sidebar.view_statistics": "View Statistics", "admin.sidebar.view_statistics": "View Statistics",
"admin.sidebar.settings": "SETTINGS", "admin.sidebar.settings": "SETTINGS",
@@ -69,8 +116,6 @@
"admin.analytics.recentActive": "Recent Active Users", "admin.analytics.recentActive": "Recent Active Users",
"admin.analytics.newlyCreated": "Newly Created Users", "admin.analytics.newlyCreated": "Newly Created Users",
"admin.analytics.title": "Statistics for {title}", "admin.analytics.title": "Statistics for {title}",
"admin.audits.title": "Server Audits",
"admin.audits.reload": "Reload",
"admin.email.notificationDisplayExample": "Ex: \"Mattermost Notification\", \"System\", \"No-Reply\"", "admin.email.notificationDisplayExample": "Ex: \"Mattermost Notification\", \"System\", \"No-Reply\"",
"admin.email.notificationEmailExample": "Ex: \"mattermost@yourcompany.com\", \"admin@yourcompany.com\"", "admin.email.notificationEmailExample": "Ex: \"mattermost@yourcompany.com\", \"admin@yourcompany.com\"",
"admin.email.smtpUsernameExample": "Ex: \"admin@yourcompany.com\", \"AKIADTOVBGERKLCBV\"", "admin.email.smtpUsernameExample": "Ex: \"admin@yourcompany.com\", \"AKIADTOVBGERKLCBV\"",
@@ -295,11 +340,8 @@
"admin.log.save": "Save", "admin.log.save": "Save",
"admin.logs.title": "Server Logs", "admin.logs.title": "Server Logs",
"admin.logs.reload": "Reload", "admin.logs.reload": "Reload",
<<<<<<< HEAD
=======
"admin.audits.title": "User Activity", "admin.audits.title": "User Activity",
"admin.audits.reload": "Reload", "admin.audits.reload": "Reload",
>>>>>>> Rename audits tab
"admin.privacy.saving": "Saving Config...", "admin.privacy.saving": "Saving Config...",
"admin.privacy.title": "Privacy Settings", "admin.privacy.title": "Privacy Settings",
"admin.privacy.showEmailTitle": "Show Email Address: ", "admin.privacy.showEmailTitle": "Show Email Address: ",
@@ -447,54 +489,6 @@
"admin.user_item.makeActive": "Make Active", "admin.user_item.makeActive": "Make Active",
"admin.user_item.makeInactive": "Make Inactive", "admin.user_item.makeInactive": "Make Inactive",
"admin.user_item.resetPwd": "Reset Password", "admin.user_item.resetPwd": "Reset Password",
"audit_table.sessionRevoked": "The session with id {sessionId} was revoked",
"audit_table.channelCreated": "Created the {channelName} channel/group",
"audit_table.establishedDM": "Established a direct message channel with {username}",
"audit_table.nameUpdated": "Updated the {channelName} channel/group name",
"audit_table.headerUpdated": "Updated the {channelName} channel/group header",
"audit_table.channelDeleted": "Deleted the channel/group with the URL {url}",
"audit_table.userAdded": "Added {username} to the {channelName} channel/group",
"audit_table.userRemoved": "Removed {username} to the {channelName} channel/group",
"audit_table.attemptedRegisterApp": "Attempted to register a new OAuth Application with ID {id}",
"audit_table.attemptedAllowOAuthAccess": "Attempted to allow a new OAuth service access",
"audit_table.successfullOAuthAccess": "Successfully gave a new OAuth service access",
"audit_table.failedOAuthAccess": "Failed to allow a new OAuth service access - the redirect URI did not match the previously registered callback",
"audit_table.attemptedOAuthToken": "Attempted to get an OAuth access token",
"audit_table.successfullOAuthToken": "Successfully added a new OAuth service",
"audit_table.oauthTokenFailed": "Failed to get an OAuth access token - {token}",
"audit_table.attemptedLogin": "Attempted to login",
"audit_table.successfullLogin": "Successfully logged in",
"audit_table.failedLogin": "FAILED login attempt",
"audit_table.updatePicture": "Updated your profile picture",
"audit_table.updateGeneral": "Updated the general settings of your account",
"audit_table.attemptedPassword": "Attempted to change password",
"audit_table.successfullPassword": "Successfully changed password",
"audit_table.failedPassword": "Failed to change password - tried to update user password who was logged in through oauth",
"audit_table.updatedRol": "Updated user role(s) to ",
"audit_table.member": "member",
"audit_table.accountActive": "Account made active",
"audit_table.accountInactive": "Account made inactive",
"audit_table.by": " by {username}",
"audit_table.byAdmin": " by an admin",
"audit_table.sentEmail": "Sent an email to {email} to reset your password",
"audit_table.attemptedReset": "Attempted to reset password",
"audit_table.successfullReset": "Successfully reset password",
"audit_table.updateGlobalNotifications": "Updated your global notification settings",
"audit_table.attemptedWebhookCreate": "Attempted to create a webhook",
"audit_table.successfullWebhookCreate": "Successfully created a webhook",
"audit_table.failedWebhookCreate": "Failed to create a webhook - bad channel permissions",
"audit_table.attemptedWebhookDelete": "Attempted to delete a webhook",
"audit_table.successfullWebhookDelete": "Successfully deleted a webhook",
"audit_table.failedWebhookDelete": "Failed to delete a webhook - inappropriate conditions",
"audit_table.logout": "Logged out of your account",
"audit_table.verified": "Sucessfully verified your email address",
"audit_table.revokedAll": "Revoked all current sessions for the team",
"audit_table.loginAttempt": " (Login attempt)",
"audit_table.loginFailure": " (Login failure)",
"audit_table.userId": "User ID",
"audit_table.moreInfo": "More info",
"audit_table.ip": "IP: {ip}",
"audit_table.session": "Session ID: {id}",
"authorize.title": "An application would like to connect to your {teamName} account", "authorize.title": "An application would like to connect to your {teamName} account",
"authorize.app": "The app <strong>{appName}</strong> would like the ability to access and modify your basic information.", "authorize.app": "The app <strong>{appName}</strong> would like the ability to access and modify your basic information.",
"authorize.access": "Allow <strong>{appName}</strong> access?", "authorize.access": "Allow <strong>{appName}</strong> access?",