diff --git a/src/main/ipc-handlers/index.js b/src/main/ipc-handlers/index.js index db966b52..e51e4bcf 100644 --- a/src/main/ipc-handlers/index.js +++ b/src/main/ipc-handlers/index.js @@ -4,6 +4,7 @@ import views from './views'; import updates from './updates'; import application from './application'; import database from './database'; +import users from './users'; const connections = {}; @@ -12,6 +13,7 @@ export default () => { tables(connections); views(connections); database(connections); + users(connections); updates(); application(); }; diff --git a/src/main/ipc-handlers/users.js b/src/main/ipc-handlers/users.js new file mode 100644 index 00000000..9631ee3c --- /dev/null +++ b/src/main/ipc-handlers/users.js @@ -0,0 +1,15 @@ +import { ipcMain } from 'electron'; + +export default (connections) => { + ipcMain.handle('get-users', async (event, uid) => { + try { + const result = await connections[uid].getUsers(); + return { status: 'success', response: result }; + } + catch (err) { + if (err.code === 'ER_TABLEACCESS_DENIED_ERROR') + return { status: 'success', response: [] }; + return { status: 'error', response: err.toString() }; + } + }); +}; diff --git a/src/main/libs/clients/MySQLClient.js b/src/main/libs/clients/MySQLClient.js index e4ef0d6a..7637a720 100644 --- a/src/main/libs/clients/MySQLClient.js +++ b/src/main/libs/clients/MySQLClient.js @@ -145,9 +145,6 @@ export class MySQLClient extends AntaresCore { }; }); - // USERS - // TODO: SELECT `user`, `host`, IF(LENGTH(password)>0, password, authentication_string) AS `password` FROM `mysql`.`user`; - return { name: db.Database, tables: remappedTables, @@ -267,6 +264,24 @@ export class MySQLClient extends AntaresCore { }); } + /** + * SELECT `user`, `host`, IF(LENGTH(password)>0, password, authentication_string) AS `password` FROM `mysql`.`user` + * + * @returns {Array.} users list + * @memberof MySQLClient + */ + async getUsers () { + const { rows } = await this.raw('SELECT `user`, `host`, IF(LENGTH(password)>0, password, authentication_string) AS `password` FROM `mysql`.`user`'); + + return rows.map(row => { + return { + name: row.user, + host: row.host, + password: row.password + }; + }); + } + /** * SHOW CREATE VIEW * @@ -308,7 +323,7 @@ export class MySQLClient extends AntaresCore { */ async alterView (params) { const { view } = params; - let sql = `ALTER ALGORITHM = ${view.algorithm} DEFINER=${view.definer} SQL SECURITY ${view.security} VIEW \`${view.oldName}\` AS ${view.sql} ${view.updateOption ? `WITH ${view.updateOption} CHECK OPTION` : ''}`; + let sql = `ALTER ALGORITHM = ${view.algorithm}${view.definer ? ` DEFINER=${view.definer}` : ''} SQL SECURITY ${view.security} VIEW \`${view.oldName}\` AS ${view.sql} ${view.updateOption ? `WITH ${view.updateOption} CHECK OPTION` : ''}`; if (view.name !== view.oldName) sql += `; RENAME TABLE \`${view.oldName}\` TO \`${view.name}\``; diff --git a/src/renderer/components/ModalNewView.vue b/src/renderer/components/ModalNewView.vue index 996255e9..d04c2d16 100644 --- a/src/renderer/components/ModalNewView.vue +++ b/src/renderer/components/ModalNewView.vue @@ -27,13 +27,18 @@
- +
diff --git a/src/renderer/components/WorkspacePropsTabView.vue b/src/renderer/components/WorkspacePropsTabView.vue index 9f91bbc8..112668e0 100644 --- a/src/renderer/components/WorkspacePropsTabView.vue +++ b/src/renderer/components/WorkspacePropsTabView.vue @@ -39,12 +39,27 @@
- + + + +
diff --git a/src/renderer/ipc-api/Users.js b/src/renderer/ipc-api/Users.js new file mode 100644 index 00000000..3a243424 --- /dev/null +++ b/src/renderer/ipc-api/Users.js @@ -0,0 +1,8 @@ +'use strict'; +import { ipcRenderer } from 'electron'; + +export default class { + static getUsers (params) { + return ipcRenderer.invoke('get-users', params); + } +} diff --git a/src/renderer/store/modules/workspaces.store.js b/src/renderer/store/modules/workspaces.store.js index fdcff5ae..d9e04e58 100644 --- a/src/renderer/store/modules/workspaces.store.js +++ b/src/renderer/store/modules/workspaces.store.js @@ -1,6 +1,7 @@ 'use strict'; import Connection from '@/ipc-api/Connection'; import Database from '@/ipc-api/Database'; +import Users from '@/ipc-api/Users'; import { uidGen } from 'common/libs/uidGen'; const tabIndex = []; let lastBreadcrumbs = {}; @@ -100,6 +101,14 @@ export default { } : workspace); }, + REFRESH_USERS (state, { uid, users }) { + state.workspaces = state.workspaces.map(workspace => workspace.uid === uid + ? { + ...workspace, + users + } + : workspace); + }, ADD_WORKSPACE (state, workspace) { state.workspaces.push(workspace); }, @@ -221,6 +230,7 @@ export default { dispatch('refreshCollations', connection.uid); dispatch('refreshVariables', connection.uid); dispatch('refreshEngines', connection.uid); + dispatch('refreshUsers', connection.uid); } } catch (err) { @@ -275,6 +285,18 @@ export default { dispatch('notifications/addNotification', { status: 'error', message: err.stack }, { root: true }); } }, + async refreshUsers ({ dispatch, commit }, uid) { + try { + const { status, response } = await Users.getUsers(uid); + if (status === 'error') + dispatch('notifications/addNotification', { status, message: response }, { root: true }); + else + commit('REFRESH_USERS', { uid, users: response }); + } + catch (err) { + dispatch('notifications/addNotification', { status: 'error', message: err.stack }, { root: true }); + } + }, removeConnected ({ commit }, uid) { Connection.disconnect(uid); commit('REMOVE_CONNECTED', uid); @@ -300,6 +322,7 @@ export default { structure: {}, variables: [], collations: [], + users: [], breadcrumbs: {} };