diff --git a/frontend/src/views/Layout/DashboardNavbar.vue b/frontend/src/views/Layout/DashboardNavbar.vue index 7c83bef1b..4cbcb3ca5 100755 --- a/frontend/src/views/Layout/DashboardNavbar.vue +++ b/frontend/src/views/Layout/DashboardNavbar.vue @@ -1,7 +1,7 @@ diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue new file mode 100644 index 000000000..e0d112ad3 --- /dev/null +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue @@ -0,0 +1,73 @@ + + + diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue new file mode 100644 index 000000000..b46898907 --- /dev/null +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue @@ -0,0 +1,41 @@ + + + diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue new file mode 100644 index 000000000..50f67976b --- /dev/null +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue @@ -0,0 +1,59 @@ + + + diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue new file mode 100644 index 000000000..3992d993e --- /dev/null +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue @@ -0,0 +1,46 @@ + + + diff --git a/frontend/src/views/Pages/UserProfileActivity.vue b/frontend/src/views/Pages/UserProfileActivity.vue deleted file mode 100644 index 6d69bc162..000000000 --- a/frontend/src/views/Pages/UserProfileActivity.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - diff --git a/frontend/src/views/Pages/UserProfileCard.vue b/frontend/src/views/Pages/UserProfileCard.vue deleted file mode 100644 index aa96cdbad..000000000 --- a/frontend/src/views/Pages/UserProfileCard.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/frontend/src/views/Pages/UserProfileEdit.vue b/frontend/src/views/Pages/UserProfileEdit.vue deleted file mode 100644 index 1fb1d220f..000000000 --- a/frontend/src/views/Pages/UserProfileEdit.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/frontend/src/views/Pages/UserProfileOverview.vue b/frontend/src/views/Pages/UserProfileOverview.vue new file mode 100644 index 000000000..c51d38b1d --- /dev/null +++ b/frontend/src/views/Pages/UserProfileOverview.vue @@ -0,0 +1,33 @@ + + + diff --git a/frontend/src/views/Pages/UserProfileTransactionList.vue b/frontend/src/views/Pages/UserProfileTransactionList.vue index 6b1a32d48..1da6c2831 100644 --- a/frontend/src/views/Pages/UserProfileTransactionList.vue +++ b/frontend/src/views/Pages/UserProfileTransactionList.vue @@ -1,10 +1,6 @@ diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue index b46898907..524a1d8e2 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue @@ -1,31 +1,39 @@ diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue index 50f67976b..1affed191 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue @@ -1,15 +1,20 @@ diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue index 3992d993e..a5c08cff4 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue @@ -1,46 +1,64 @@ diff --git a/frontend/src/views/Pages/UserProfileOverview.vue b/frontend/src/views/Pages/UserProfileOverview.vue index c51d38b1d..c67afacfb 100644 --- a/frontend/src/views/Pages/UserProfileOverview.vue +++ b/frontend/src/views/Pages/UserProfileOverview.vue @@ -4,8 +4,8 @@ - - + + From c15f23f5c890dc9f95b490b282939ee76c477e57 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 28 May 2021 11:05:44 +0200 Subject: [PATCH 09/33] fix bug --- community_server/src/Controller/AppRequestsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community_server/src/Controller/AppRequestsController.php b/community_server/src/Controller/AppRequestsController.php index 4d70a68b1..b061bcf52 100644 --- a/community_server/src/Controller/AppRequestsController.php +++ b/community_server/src/Controller/AppRequestsController.php @@ -343,7 +343,7 @@ class AppRequestsController extends AppController $decay = true; $transactions = []; $transactions_from_db = $stateUserTransactionsQuery->toArray(); - if($stateUserTransactionsQuery->count() > 0) { + if(count(transactions_from_db)) { if($orderDirection == 'DESC') { $transactions_from_db = array_reverse($transactions_from_db); } From 49ce525692069a6c616c4a1590ec693a94069d2b Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 31 May 2021 17:47:24 +0200 Subject: [PATCH 10/33] missing $ --- community_server/src/Controller/AppRequestsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/community_server/src/Controller/AppRequestsController.php b/community_server/src/Controller/AppRequestsController.php index b061bcf52..456065c36 100644 --- a/community_server/src/Controller/AppRequestsController.php +++ b/community_server/src/Controller/AppRequestsController.php @@ -343,7 +343,7 @@ class AppRequestsController extends AppController $decay = true; $transactions = []; $transactions_from_db = $stateUserTransactionsQuery->toArray(); - if(count(transactions_from_db)) { + if(count($transactions_from_db)) { if($orderDirection == 'DESC') { $transactions_from_db = array_reverse($transactions_from_db); } From 92aea993352f2f6d8fb96594f2bbae2847ca109b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 1 Jun 2021 12:49:24 +0200 Subject: [PATCH 11/33] unit tests for pagination buttons --- .../src/components/PaginationButtons.spec.js | 53 +++++++++++++ frontend/src/components/PaginationButtons.vue | 4 +- .../GddTransactionList.spec.js | 74 ++++++++++++++++--- .../AccountOverview/GddTransactionList.vue | 6 +- 4 files changed, 122 insertions(+), 15 deletions(-) create mode 100644 frontend/src/components/PaginationButtons.spec.js diff --git a/frontend/src/components/PaginationButtons.spec.js b/frontend/src/components/PaginationButtons.spec.js new file mode 100644 index 000000000..7a03d0443 --- /dev/null +++ b/frontend/src/components/PaginationButtons.spec.js @@ -0,0 +1,53 @@ +import { mount } from '@vue/test-utils' +import PaginationButtons from './PaginationButtons' + +const localVue = global.localVue + +describe('PaginationButtons', () => { + let wrapper + + const Wrapper = () => { + return mount(PaginationButtons, { localVue }) + } + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders the component', () => { + expect(wrapper.find('div.pagination-buttons').exists()).toBeTruthy() + }) + + it('has previous page button disabled by default', () => { + expect(wrapper.find('button.previous-page').attributes('disabled')).toBe('disabled') + }) + + it('has bext page button disabled by default', () => { + expect(wrapper.find('button.next-page').attributes('disabled')).toBe('disabled') + }) + + it('shows the text "1 / 1" by default"', () => { + expect(wrapper.find('p.text-center').text()).toBe('1 / 1') + }) + + describe('with active buttons', () => { + beforeEach(async () => { + await wrapper.setProps({ + hasNext: true, + hasPrevious: true, + }) + }) + + it('emits show-previous when previous page button is clicked', () => { + wrapper.find('button.previous-page').trigger('click') + expect(wrapper.emitted('show-previous')).toBeTruthy() + }) + + it('emits show-next when next page button is clicked', () => { + wrapper.find('button.next-page').trigger('click') + expect(wrapper.emitted('show-next')).toBeTruthy() + }) + }) + }) +}) diff --git a/frontend/src/components/PaginationButtons.vue b/frontend/src/components/PaginationButtons.vue index 82440a40e..ac7ff73c6 100644 --- a/frontend/src/components/PaginationButtons.vue +++ b/frontend/src/components/PaginationButtons.vue @@ -2,7 +2,7 @@
- + @@ -10,7 +10,7 @@

{{ currentPage }} / {{ totalPages }}

- + diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js b/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js index aa0a6f2d2..93dd748d6 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js @@ -202,16 +202,6 @@ describe('GddTransactionList', () => { expect(transaction.findAll('div').at(3).text()).toBe('decay') }) }) - - describe('pageSize property set to 2', () => { - beforeEach(async () => { - await wrapper.setProps({ pageSize: 2 }) - }) - - it('shows only 2 transactions', () => { - expect(wrapper.findAll('div.gdd-transaction-list-item')).toHaveLength(2) - }) - }) }) describe('with invalid transaction type', () => { @@ -234,5 +224,69 @@ describe('GddTransactionList', () => { expect(errorHandler).toHaveBeenCalled() }) }) + + describe('pagination buttons', () => { + const transactions = Array.from({ length: 42 }, (_, idx) => { + return { + balance: '3.14', + date: '2021-04-29T17:26:40+00:00', + memo: 'Kreiszahl PI', + name: 'Euklid', + transaction_id: idx + 1, + type: 'receive', + } + }) + + let paginationButtons + + beforeEach(async () => { + await wrapper.setProps({ + transactions, + transactionCount: 42, + showPagination: true, + }) + paginationButtons = wrapper.find('div.pagination-buttons') + }) + + it('shows the pagination buttons', () => { + expect(paginationButtons.exists()).toBeTruthy() + }) + + it('has the previous button disabled', () => { + expect(paginationButtons.find('button.previous-page').attributes('disabled')).toBe( + 'disabled', + ) + }) + + it('shows the text "1 / 2"', () => { + expect(paginationButtons.find('p.text-center').text()).toBe('1 / 2') + }) + + it('emits update-transactions when next button is clicked', async () => { + paginationButtons.find('button.next-page').trigger('click') + await wrapper.vm.$nextTick() + expect(wrapper.emitted('update-transactions')[1]).toEqual([{ firstPage: 2, items: 25 }]) + }) + + it('shows text "2 / 2" when next button is clicked', async () => { + paginationButtons.find('button.next-page').trigger('click') + await wrapper.vm.$nextTick() + expect(paginationButtons.find('p.text-center').text()).toBe('2 / 2') + }) + + it('has next-button disabled when next button is clicked', async () => { + paginationButtons.find('button.next-page').trigger('click') + await wrapper.vm.$nextTick() + expect(paginationButtons.find('button.next-page').attributes('disabled')).toBe('disabled') + }) + + it('emits update-transactions when preivous button is clicked after next buton', async () => { + paginationButtons.find('button.next-page').trigger('click') + await wrapper.vm.$nextTick() + paginationButtons.find('button.previous-page').trigger('click') + await wrapper.vm.$nextTick() + expect(wrapper.emitted('update-transactions')[2]).toEqual([{ firstPage: 1, items: 25 }]) + }) + }) }) }) diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue index a9aafdb85..55f03f9e2 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue @@ -2,7 +2,7 @@
@@ -104,7 +104,7 @@ export default { }, props: { transactions: { default: () => [] }, - pageSize: { type: Number, default: 5 }, + pageSize: { type: Number, default: 25 }, timestamp: { type: Number, default: 0 }, transactionCount: { type: Number, default: 0 }, showPagination: { type: Boolean, default: false }, @@ -129,7 +129,7 @@ export default { methods: { updateTransactions() { this.$emit('update-transactions', { - firstPage: 1 + this.pageSize * (this.currentPage - 1), + firstPage: this.currentPage, items: this.pageSize, }) }, From a860e7a707329c754a7e44e10dd95b9e3884c4dd Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 1 Jun 2021 12:57:44 +0200 Subject: [PATCH 12/33] unit test coverage frontend to 21% --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 92ac77d86..1dbddef5d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -212,7 +212,7 @@ jobs: report_name: Coverage Frontend type: lcov result_path: ./coverage/lcov.info - min_coverage: 20 + min_coverage: 21 token: ${{ github.token }} #test: From 178a03eca3eec3019086573c4176675b8410eec9 Mon Sep 17 00:00:00 2001 From: ogerly Date: Wed, 2 Jun 2021 16:31:42 +0200 Subject: [PATCH 13/33] profil: api implements edit user profile --- frontend/src/apis/loginAPI.js | 63 ++++++++++++------- frontend/src/store/store.js | 7 +++ frontend/src/store/store.test.js | 4 +- .../src/views/Layout/DashboardLayout_gdd.vue | 2 - .../src/views/Pages/UserProfile/UserCard.vue | 2 +- .../UserProfile/UserCard_FormUserData.vue | 57 ++++++++--------- .../UserProfile/UserCard_FormUsername.vue | 27 ++++---- .../src/views/Pages/UserProfileOverview.vue | 49 ++++++++++++--- 8 files changed, 133 insertions(+), 78 deletions(-) diff --git a/frontend/src/apis/loginAPI.js b/frontend/src/apis/loginAPI.js index 62ea680df..799ff25bc 100644 --- a/frontend/src/apis/loginAPI.js +++ b/frontend/src/apis/loginAPI.js @@ -78,6 +78,47 @@ const loginAPI = { CONFIG.LOGIN_API_URL + 'loginViaEmailVerificationCode?emailVerificationCode=' + optin, ) }, + getUserInfos: async (sessionId, email) => { + const payload = { + session_id: sessionId, + email: email, + ask: ['user.first_name', 'user.last_name'], + } + return apiPost(CONFIG.LOGIN_API_URL + 'getUserInfos', payload) + }, + updateUserInfos: async (sessionId, email, firstName, lastName /*, description */) => { + const payload = { + session_id: sessionId, + email, + update: { + 'User.first_name': firstName, + 'User.last_name': lastName, + /* 'User.description': description, */ + }, + } + return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) + }, + + // `POST http://localhost/login_api/getUserInfos` + // + // with: + // + // ```json + // { + // "session_id": -127182, + // "email": "max.musterman@gmail.de", + // "ask": [ + // "EmailVerificationCode.Register", + // "loginServer.path", + // "user.pubkeyhex", + // "user.first_name", + // "user.last_name", + // "user.disabled", + // "user.email_checked", + // "user.language" + // ] + // } + changePassword: async (sessionId, email, password) => { const payload = { session_id: sessionId, @@ -99,16 +140,6 @@ const loginAPI = { } return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) }, - changeEmailProfil: async (sessionId, email, emailNew) => { - const payload = { - session_id: sessionId, - email, - update: { - 'User.emailNew': emailNew, - }, - } - return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) - }, changeUsernameProfil: async (sessionId, email, usernameNew) => { const payload = { session_id: sessionId, @@ -129,18 +160,6 @@ const loginAPI = { } return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) }, - updateUserdata: async (sessionId, email, firstName, lastName, description) => { - const payload = { - session_id: sessionId, - email, - update: { - 'User.first_name': firstName, - 'User.last_name': lastName, - 'User.description': description, - }, - } - return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) - }, } export default loginAPI diff --git a/frontend/src/store/store.js b/frontend/src/store/store.js index 1d89894fb..79f04da61 100644 --- a/frontend/src/store/store.js +++ b/frontend/src/store/store.js @@ -13,6 +13,10 @@ export const mutations = { sessionId: (state, sessionId) => { state.sessionId = sessionId }, + username: (state, username) => { + // console.log('store username mutation', username) + state.username = username + }, } export const actions = { @@ -20,10 +24,12 @@ export const actions = { commit('sessionId', data.sessionId) commit('email', data.user.email) commit('language', data.user.language) + commit('username', data.user.username ? '' : 'teststoreusername') }, logout: ({ commit, state }) => { commit('sessionId', null) commit('email', null) + commit('username', null) sessionStorage.clear() }, } @@ -39,6 +45,7 @@ export const store = new Vuex.Store({ email: '', language: null, modals: false, + username: 'testname', }, getters: {}, // Syncronous mutation of the state diff --git a/frontend/src/store/store.test.js b/frontend/src/store/store.test.js index 11dd5949b..3f466f723 100644 --- a/frontend/src/store/store.test.js +++ b/frontend/src/store/store.test.js @@ -40,7 +40,7 @@ describe('Vuex store', () => { { commit, state }, { sessionId: 1234, user: { email: 'someone@there.is', language: 'en' } }, ) - expect(commit).toHaveBeenCalledTimes(3) + expect(commit).toHaveBeenCalledTimes(4) }) it('commits sessionId', () => { @@ -74,7 +74,7 @@ describe('Vuex store', () => { it('calls two commits', () => { logout({ commit, state }) - expect(commit).toHaveBeenCalledTimes(2) + expect(commit).toHaveBeenCalledTimes(3) }) it('commits sessionId', () => { diff --git a/frontend/src/views/Layout/DashboardLayout_gdd.vue b/frontend/src/views/Layout/DashboardLayout_gdd.vue index 81d8b6432..2e66c11d6 100755 --- a/frontend/src/views/Layout/DashboardLayout_gdd.vue +++ b/frontend/src/views/Layout/DashboardLayout_gdd.vue @@ -87,8 +87,6 @@ export default { pending: true, UserProfileTestData: { username: 'Mustermax', - name: 'Max', - lastname: 'Mustermann', desc: 'Max Mustermann seine Beschreibung. Max Mustermann seine Beschreibung. Max Mustermann seine Beschreibung. Max Mustermann seine Beschreibung. ', }, diff --git a/frontend/src/views/Pages/UserProfile/UserCard.vue b/frontend/src/views/Pages/UserProfile/UserCard.vue index 1e94867e6..94c21fdaf 100755 --- a/frontend/src/views/Pages/UserProfile/UserCard.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard.vue @@ -14,7 +14,7 @@ GDD
- {{ $n(transactionCount) }} + {{ transactionCount }} {{ $t('transactions') }}
diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue index 2e27db338..723a5cee9 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue @@ -25,10 +25,10 @@ {{ $t('form.firstname') }} - {{ UserProfileTestData.name }} + {{ userdata.first_name }} - + @@ -36,10 +36,10 @@ {{ $t('form.lastname') }} - {{ UserProfileTestData.lastname }} + {{ userdata.last_name }} - + @@ -50,12 +50,7 @@ {{ UserProfileTestData.desc }} - +
@@ -63,39 +58,37 @@ From 2250fea3398f52e5b6fb0b93b23f5e260be69c92 Mon Sep 17 00:00:00 2001 From: ogerly Date: Wed, 2 Jun 2021 16:54:50 +0200 Subject: [PATCH 14/33] profil: review changes incorporated from Moritz --- frontend/src/apis/loginAPI.js | 24 ++----------------- frontend/src/locales/de.json | 3 --- .../UserProfile/UserCard_FormUserData.vue | 10 ++++---- .../UserProfile/UserCard_FormUserMail.vue | 8 +++---- .../UserProfile/UserCard_FormUserPasswort.vue | 5 ++-- .../UserProfile/UserCard_FormUsername.vue | 2 +- 6 files changed, 14 insertions(+), 38 deletions(-) diff --git a/frontend/src/apis/loginAPI.js b/frontend/src/apis/loginAPI.js index 799ff25bc..5f4e72807 100644 --- a/frontend/src/apis/loginAPI.js +++ b/frontend/src/apis/loginAPI.js @@ -99,26 +99,6 @@ const loginAPI = { return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) }, - // `POST http://localhost/login_api/getUserInfos` - // - // with: - // - // ```json - // { - // "session_id": -127182, - // "email": "max.musterman@gmail.de", - // "ask": [ - // "EmailVerificationCode.Register", - // "loginServer.path", - // "user.pubkeyhex", - // "user.first_name", - // "user.last_name", - // "user.disabled", - // "user.email_checked", - // "user.language" - // ] - // } - changePassword: async (sessionId, email, password) => { const payload = { session_id: sessionId, @@ -129,7 +109,7 @@ const loginAPI = { } return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) }, - changePasswordProfil: async (sessionId, email, password, passwordNew) => { + changePasswordProfile: async (sessionId, email, password, passwordNew) => { const payload = { session_id: sessionId, email, @@ -140,7 +120,7 @@ const loginAPI = { } return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) }, - changeUsernameProfil: async (sessionId, email, usernameNew) => { + changeUsernameProfile: async (sessionId, email, usernameNew) => { const payload = { session_id: sessionId, email, diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 3781e87d0..5a499b7f4 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -105,9 +105,6 @@ "add_work":"neuer Gemeinschaftsbeitrag" }, "profil": { - "edit": { - - }, "activity": { "chart":"Gemeinschaftsstunden Chart", "new":"Neue Gemeinschaftsstunden eintragen", diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue index 723a5cee9..87490dfab 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue @@ -28,7 +28,7 @@ {{ userdata.first_name }} - +
@@ -39,7 +39,7 @@ {{ userdata.last_name }} - + @@ -67,11 +67,11 @@ export default { data() { return { edit_userdata: true, - sessionId: null, + sessionId: this.$store.state.sessionId, email: null, form: { - first_name: this.userdata.first_name, - last_name: this.userdata.last_name, + firstName: this.userdata.first_name, + lastName: this.userdata.last_name, desc: this.UserProfileTestData.desc, }, } diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue index 524a1d8e2..c41ba367c 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserMail.vue @@ -25,7 +25,7 @@ {{ $store.state.email }} - + @@ -39,16 +39,16 @@ export default { data() { return { edit_email: true, + newEmail: '', } }, methods: { async onSubmit() { // console.log(this.data) const result = await loginAPI.changeEmailProfil( - this.sessionId, + this.$store.state.sessionId, this.email, - this.password, - this.passwordNew, + this.newEmail, ) if (result.success) { alert('changePassword success') diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue index 1affed191..e1ade4ae0 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue @@ -68,7 +68,6 @@ export default { data() { return { edit_pwd: true, - sessionId: null, email: null, password: '', passwordNew: '', @@ -78,8 +77,8 @@ export default { methods: { async onSubmit() { // console.log(this.data) - const result = await loginAPI.changePasswordProfil( - this.sessionId, + const result = await loginAPI.changePasswordProfile( + this.$store.state.sessionId, this.email, this.password, this.passwordNew, diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue index 7d073ec0e..b195f6ef6 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue @@ -54,7 +54,7 @@ export default { methods: { async onSubmit() { // console.log(this.data) - const result = await loginAPI.changeUsernameProfil(this.username) + const result = await loginAPI.changeUsernameProfile(this.username) if (result.success) { alert('changeUsername success') } else { From 601ccd9ef427f406b3eab6251b8b3f99e0b401c1 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 3 Jun 2021 14:49:09 +0200 Subject: [PATCH 15/33] user data can be updated in DB --- frontend/src/apis/loginAPI.js | 6 +-- frontend/src/store/store.js | 19 +++++-- .../UserProfile/UserCard_FormUserData.vue | 50 ++++++++++--------- .../src/views/Pages/UserProfileOverview.vue | 42 +--------------- 4 files changed, 46 insertions(+), 71 deletions(-) diff --git a/frontend/src/apis/loginAPI.js b/frontend/src/apis/loginAPI.js index 5f4e72807..850a3a44d 100644 --- a/frontend/src/apis/loginAPI.js +++ b/frontend/src/apis/loginAPI.js @@ -86,13 +86,13 @@ const loginAPI = { } return apiPost(CONFIG.LOGIN_API_URL + 'getUserInfos', payload) }, - updateUserInfos: async (sessionId, email, firstName, lastName /*, description */) => { + updateUserInfos: async (sessionId, email, data) => { const payload = { session_id: sessionId, email, update: { - 'User.first_name': firstName, - 'User.last_name': lastName, + 'User.first_name': data.firstName, + 'User.last_name': data.lastName, /* 'User.description': description, */ }, } diff --git a/frontend/src/store/store.js b/frontend/src/store/store.js index 79f04da61..02e8f0561 100644 --- a/frontend/src/store/store.js +++ b/frontend/src/store/store.js @@ -14,9 +14,14 @@ export const mutations = { state.sessionId = sessionId }, username: (state, username) => { - // console.log('store username mutation', username) state.username = username }, + firstName: (state, firstName) => { + state.firstName = firstName + }, + lastName: (state, lastName) => { + state.lastName = lastName + }, } export const actions = { @@ -24,12 +29,16 @@ export const actions = { commit('sessionId', data.sessionId) commit('email', data.user.email) commit('language', data.user.language) - commit('username', data.user.username ? '' : 'teststoreusername') + commit('username', data.user.username) + commit('firstName', data.user.first_name) + commit('lastName', data.user.last_name) }, logout: ({ commit, state }) => { commit('sessionId', null) commit('email', null) - commit('username', null) + commit('username', '') + commit('firstName', '') + commit('lastName', '') sessionStorage.clear() }, } @@ -45,7 +54,9 @@ export const store = new Vuex.Store({ email: '', language: null, modals: false, - username: 'testname', + firstName: '', + lastName: '', + username: '', }, getters: {}, // Syncronous mutation of the state diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue index 87490dfab..e89a17e84 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue @@ -3,14 +3,14 @@ - + {{ $t('form.edit') }}
{{ $t('form.save') }} - + {{ $t('form.cancel') }} @@ -24,8 +24,8 @@ {{ $t('form.firstname') }} - - {{ userdata.first_name }} + + {{ form.firstName }} @@ -35,8 +35,8 @@ {{ $t('form.lastname') }} - - {{ userdata.last_name }} + + {{ form.lastName }} @@ -46,7 +46,7 @@ {{ $t('form.description') }} - + {{ UserProfileTestData.desc }} @@ -58,37 +58,41 @@ From 0489ab0746380721a106f23dabcb1cd0dcfd89a0 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 4 Jun 2021 17:20:48 +0200 Subject: [PATCH 16/33] add new API Call checkUsername with that it is possible - to check if username exist already in a given Group - if a group_id exist in db - which group_id a group_alias has --- docu/login_server.api.md | 50 ++++++++++ .../cpp/JSONInterface/JsonCheckUsername.cpp | 93 +++++++++++++++++++ .../src/cpp/JSONInterface/JsonCheckUsername.h | 16 ++++ .../JsonRequestHandlerFactory.cpp | 4 + login_server/src/cpp/controller/User.cpp | 4 +- login_server/src/cpp/model/table/ModelBase.h | 43 +++++++++ 6 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp create mode 100644 login_server/src/cpp/JSONInterface/JsonCheckUsername.h diff --git a/docu/login_server.api.md b/docu/login_server.api.md index b466be7fc..fb9409cf0 100644 --- a/docu/login_server.api.md +++ b/docu/login_server.api.md @@ -89,6 +89,56 @@ In case of success returns: nginx was wrong configured. - `session_id`: can be also negative +## Check username +### Request +`GET http://localhost/login_api/checkUsername?username=&group_id=` + +`POST http://localhost/login_api/checkUsername` +with +```json +{ + "username": "Maxilein", + "group_id": 1, + "group_alias": "gdd1" +} +``` + +group_id or group_alias, one of both is enough. +group_id is better, because one db request less + +### Response + +If username is not already taken +```json +{ + "state":"success" +} +``` + +If username is already taken +```json +{ + "state":"warning", + "msg":"username already in use" +} +``` + +If only group_alias was given and group with that alias was found in db +```json +{ + "state":"success", + "group_id": 1 +} +``` + +If group_id or group_alias unknown +```json +{ + "state":"error", + "msg": "unknown group" +} +``` + ## Create user Register a new User diff --git a/login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp b/login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp new file mode 100644 index 000000000..cf19ae69d --- /dev/null +++ b/login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp @@ -0,0 +1,93 @@ +#include "JsonCheckUsername.h" +#include "Poco/URI.h" +#include "controller/User.h" +#include "lib/DataTypeConverter.h" + +Poco::JSON::Object* JsonCheckUsername::handle(Poco::Dynamic::Var params) +{ + std::string username; + int group_id = 0; + std::string group_alias; + + // if is json object + if (params.type() == typeid(Poco::JSON::Object::Ptr)) { + Poco::JSON::Object::Ptr paramJsonObject = params.extract(); + /// Throws a RangeException if the value does not fit + /// into the result variable. + /// Throws a NotImplementedException if conversion is + /// not available for the given type. + /// Throws InvalidAccessException if Var is empty. + + auto username_obj = paramJsonObject->get("username"); + auto group_id_obj = paramJsonObject->get("group_id"); + auto group_alias_obj = paramJsonObject->get("group_alias"); + + try { + paramJsonObject->get("username").convert(username); + + if (!username_obj.isEmpty()) { + username_obj.convert(username); + } + + if (!group_id_obj.isEmpty()) { + group_id_obj.convert(group_id); + } + if (!group_alias_obj.isEmpty()) { + group_alias_obj.convert(group_alias); + } + + } + catch (Poco::Exception& ex) { + return stateError("username not found or invalid"); + } + + } + else if (params.isVector()) { + const Poco::URI::QueryParameters queryParams = params.extract(); + for (auto it = queryParams.begin(); it != queryParams.end(); it++) { + if (it->first == "username") { + username = it->second; + } + else if (it->first == "group_id") { + DataTypeConverter::strToInt(it->second, group_id); + } + else if (it->first == "group_alias") { + group_alias = it->second; + } + } + } + else { + return stateError("format not implemented", std::string(params.type().name())); + } + + if (!group_id && group_alias == "") { + return stateError("no group given"); + } + if (!group_id) { + auto groups = controller::Group::load(group_alias); + if (groups.size() > 1) { + return stateError("group is ambiguous"); + } + if (!groups.size()) { + return stateError("unknown group"); + } + group_id = groups[0]->getModel()->getID(); + } + auto group = controller::Group::load(group_id); + if (group.isNull()) { + return stateError("unknown group"); + } + auto user = controller::User::create(); + user->getModel()->setGroupId(group_id); + if (username == "") { + Poco::JSON::Object* result = new Poco::JSON::Object; + result->set("state", "success"); + result->set("group_id", group_id); + return result; + } + if (user->isUsernameAlreadyUsed(username)) { + return stateWarning("username already in use"); + } + return stateSuccess(); + +} \ No newline at end of file diff --git a/login_server/src/cpp/JSONInterface/JsonCheckUsername.h b/login_server/src/cpp/JSONInterface/JsonCheckUsername.h new file mode 100644 index 000000000..71873a6ac --- /dev/null +++ b/login_server/src/cpp/JSONInterface/JsonCheckUsername.h @@ -0,0 +1,16 @@ +#ifndef __JSON_INTERFACE_JSON_CHECK_USERNAME_ +#define __JSON_INTERFACE_JSON_CHECK_USERNAME_ + +#include "JsonRequestHandler.h" + +class JsonCheckUsername : public JsonRequestHandler +{ +public: + Poco::JSON::Object* handle(Poco::Dynamic::Var params); + +protected: + + +}; + +#endif // __JSON_INTERFACE_JSON_CHECK_USERNAME_ \ No newline at end of file diff --git a/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp b/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp index 4f0e10d6f..3f8536a74 100644 --- a/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp +++ b/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp @@ -7,6 +7,7 @@ #include "JsonAdminEmailVerificationResend.h" #include "JsonCheckSessionState.h" +#include "JsonCheckUsername.h" #include "JsonAppLogin.h" #include "JsonAquireAccessToken.h" #include "JsonCreateTransaction.h" @@ -74,6 +75,9 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c else if (url_first_part == "/checkSessionState") { return new JsonCheckSessionState; } + else if (url_first_part == "/checkUsername") { + return new JsonCheckUsername; + } else if (url_first_part == "/createTransaction") { return new JsonCreateTransaction; } diff --git a/login_server/src/cpp/controller/User.cpp b/login_server/src/cpp/controller/User.cpp index cd71da96b..5c26e3a12 100644 --- a/login_server/src/cpp/controller/User.cpp +++ b/login_server/src/cpp/controller/User.cpp @@ -108,7 +108,9 @@ namespace controller { bool User::isUsernameAlreadyUsed(const std::string& username) { auto db = getModel(); - return db->loadFromDB({ "username", "group_id" }, username, db->getGroupId(), model::table::MYSQL_CONDITION_AND) > 0; + auto results = db->loadMultipleFromDB({ "username", "group_id" }, username, db->getGroupId(), model::table::MYSQL_CONDITION_AND); + return results.size() > 0; + } int User::load(const unsigned char* pubkey_array) diff --git a/login_server/src/cpp/model/table/ModelBase.h b/login_server/src/cpp/model/table/ModelBase.h index 15f08f66c..c769dcfd9 100644 --- a/login_server/src/cpp/model/table/ModelBase.h +++ b/login_server/src/cpp/model/table/ModelBase.h @@ -61,6 +61,12 @@ namespace model { template size_t loadFromDB(const std::vector& fieldNames, const T1& field1Value, const T2& field2Value, MysqlConditionType conditionType = MYSQL_CONDITION_AND); + template + std::vector loadMultipleFromDB( + const std::vector& fieldNames, + const T1& field1Value, const T2& field2Value, + MysqlConditionType conditionType = MYSQL_CONDITION_AND); + template std::vector loadMultipleFromDB( const std::vector& fieldNames, @@ -290,6 +296,43 @@ namespace model { return resultCount; } + template + std::vector ModelBase::loadMultipleFromDB( + const std::vector& fieldNames, + const T1& field1Value, const T2& field2Value, + MysqlConditionType conditionType/* = MYSQL_CONDITION_AND*/) + { + auto cm = ConnectionManager::getInstance(); + std::vector results; + if (fieldNames.size() != 2) { + addError(new Error(getTableName(), "error in loadFromDB with 2 different field values, fieldNames count isn't 2")); + return results; + } + Poco::ScopedLock _lock(mWorkMutex); + + auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); + Poco::Data::Statement select = _loadMultipleFromDB(session, fieldNames, conditionType); + select, Poco::Data::Keywords::into(results), + Poco::Data::Keywords::useRef(field1Value), Poco::Data::Keywords::useRef(field2Value); + + size_t resultCount = 0; + try { + resultCount = select.execute(); + } + catch (Poco::Exception& ex) { + lock(); + addError(new ParamError(getTableName(), "mysql error by selecting with 2 different field types", ex.displayText())); + int count = 0; + for (auto it = fieldNames.begin(); it != fieldNames.end(); it++) { + addError(new ParamError(getTableName(), "field name for select: ", *it)); + } + + //addError(new ParamError(getTableName(), "field name for select: ", fieldName.data())); + unlock(); + } + return results; + } + template std::vector ModelBase::loadMultipleFromDB( const std::vector& fieldNames, From f77a63c6a098aec2a97f262e6b4f7c497eb3ef29 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 7 Jun 2021 10:04:43 +0200 Subject: [PATCH 17/33] fix testsystem, remove hedera tests --- login_server/CMakeLists.txt | 6 +- login_server/conanfile.txt | 1 + .../cpp/test/controller/TestHederaAccount.cpp | 14 -- .../cpp/test/controller/TestHederaAccount.h | 13 -- .../src/cpp/test/controller/TestHederaId.cpp | 14 -- .../src/cpp/test/controller/TestHederaId.h | 13 -- .../cpp/test/controller/TestHederaTopic.cpp | 0 .../src/cpp/test/controller/TestHederaTopic.h | 0 login_server/src/cpp/test/main.cpp | 171 ++---------------- 9 files changed, 18 insertions(+), 214 deletions(-) delete mode 100644 login_server/src/cpp/test/controller/TestHederaAccount.cpp delete mode 100644 login_server/src/cpp/test/controller/TestHederaAccount.h delete mode 100644 login_server/src/cpp/test/controller/TestHederaId.cpp delete mode 100644 login_server/src/cpp/test/controller/TestHederaId.h delete mode 100644 login_server/src/cpp/test/controller/TestHederaTopic.cpp delete mode 100644 login_server/src/cpp/test/controller/TestHederaTopic.h diff --git a/login_server/CMakeLists.txt b/login_server/CMakeLists.txt index f6a5445a7..b9d4a5444 100644 --- a/login_server/CMakeLists.txt +++ b/login_server/CMakeLists.txt @@ -170,6 +170,7 @@ FILE(GLOB TEST_CRYPTO "src/cpp/test/crypto/*.cpp" "src/cpp/test/crypto/*.h") FILE(GLOB TEST_MODEL "src/cpp/test/model/*.cpp" "src/cpp/test/model/*.h") FILE(GLOB TEST_MODEL_TABLE "src/cpp/test/model/table/*.cpp" "src/cpp/test/model/table/*.h") FILE(GLOB TEST_CONTROLLER "src/cpp/test/controller/*.cpp" "src/cpp/test/controller/*.h") +FILE(GLOB TEST_JSON_INTERFACE "src/cpp/test/JSONInterface/*.cpp" "src/cpp/test/JSONInterface/*.h") SET(LOCAL_SRCS ${CONTROLLER} ${TINF} ${MAIN} ${HTTPInterface} ${COMPILED_PAGES} @@ -179,7 +180,7 @@ SET(LOCAL_SRCS ${PROTO_GRADIDO} ) SET(LOCAL_TEST_SRC - ${TEST} ${TEST_CRYPTO} ${TEST_MODEL} ${TEST_MODEL_TABLE} ${TEST_CONTROLLER} + ${TEST} ${TEST_CRYPTO} ${TEST_MODEL} ${TEST_MODEL_TABLE} ${TEST_CONTROLLER} ${TEST_JSON_INTERFACE} ) aux_source_directory("src/cpp" LOCAL_SRCS) @@ -204,6 +205,7 @@ if(MSVC) source_group("Test\\model\\table" FILES ${TEST_MODEL_TABLE}) source_group("Test\\model" FILES ${TEST_MODEL}) source_group("Test\\controller" FILES ${TEST_CONTROLLER}) + source_group("Test\\Json-Interface" FILES ${TEST_JSON_INTERFACE}) source_group("Test" FILES ${TEST}) endif() @@ -287,7 +289,7 @@ target_compile_definitions(Gradido_LoginServer_Test PUBLIC "_TEST_BUILD") target_link_libraries(Gradido_LoginServer_Test ${GRPC_LIBS} ) if(WIN32) - target_link_libraries(Gradido_LoginServer_Test ${CONAN_LIBS} ) + target_link_libraries(Gradido_LoginServer_Test ${CONAN_LIBS} libmariadb libprotobuf) #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test optimized ${MYSQL_LIBRARIES} Shlwapi) #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${GRPC_LIBS} ${PROTOBUF_DEBUG_LIBS}) diff --git a/login_server/conanfile.txt b/login_server/conanfile.txt index 276925116..121e3693b 100644 --- a/login_server/conanfile.txt +++ b/login_server/conanfile.txt @@ -2,6 +2,7 @@ Poco/1.9.4@pocoproject/stable libsodium/1.0.18@bincrafters/stable boost/1.71.0@conan/stable +gtest/1.10.0 [options] Poco:enable_pagecompiler=True diff --git a/login_server/src/cpp/test/controller/TestHederaAccount.cpp b/login_server/src/cpp/test/controller/TestHederaAccount.cpp deleted file mode 100644 index aaeaea723..000000000 --- a/login_server/src/cpp/test/controller/TestHederaAccount.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "TestHederaAccount.h" -#include "../../SingletonManager/ConnectionManager.h" -namespace controller { - - void TestHederaAccount::SetUp() - { - - } - - TEST_F(TestHederaAccount, TestPick) { - auto hedera_account = controller::HederaAccount::pick(ServerConfig::HEDERA_TESTNET, false); - EXPECT_FALSE(hedera_account.isNull()); - } -} diff --git a/login_server/src/cpp/test/controller/TestHederaAccount.h b/login_server/src/cpp/test/controller/TestHederaAccount.h deleted file mode 100644 index 721ba17e8..000000000 --- a/login_server/src/cpp/test/controller/TestHederaAccount.h +++ /dev/null @@ -1,13 +0,0 @@ -#include "gtest/gtest.h" - -#include "../../controller/HederaAccount.h" - - -namespace controller { - - class TestHederaAccount : public ::testing::Test { - protected: - void SetUp() override; - }; - -} diff --git a/login_server/src/cpp/test/controller/TestHederaId.cpp b/login_server/src/cpp/test/controller/TestHederaId.cpp deleted file mode 100644 index d08dc7e59..000000000 --- a/login_server/src/cpp/test/controller/TestHederaId.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "TestHederaId.h" -#include "../../SingletonManager/ConnectionManager.h" -namespace controller { - - void TestHederaId::SetUp() - { - - } - - TEST_F(TestHederaId, TestFindTopicId) { - auto hedera_topic_id = controller::HederaId::find(1, ServerConfig::HEDERA_TESTNET); - EXPECT_FALSE(hedera_topic_id.isNull()); - } -} diff --git a/login_server/src/cpp/test/controller/TestHederaId.h b/login_server/src/cpp/test/controller/TestHederaId.h deleted file mode 100644 index e19b56862..000000000 --- a/login_server/src/cpp/test/controller/TestHederaId.h +++ /dev/null @@ -1,13 +0,0 @@ -#include "gtest/gtest.h" - -#include "../../controller/HederaId.h" - - -namespace controller { - - class TestHederaId : public ::testing::Test { - protected: - void SetUp() override; - }; - -} diff --git a/login_server/src/cpp/test/controller/TestHederaTopic.cpp b/login_server/src/cpp/test/controller/TestHederaTopic.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/login_server/src/cpp/test/controller/TestHederaTopic.h b/login_server/src/cpp/test/controller/TestHederaTopic.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/login_server/src/cpp/test/main.cpp b/login_server/src/cpp/test/main.cpp index 62482c664..7df845f75 100644 --- a/login_server/src/cpp/test/main.cpp +++ b/login_server/src/cpp/test/main.cpp @@ -75,182 +75,37 @@ int load() { // clean up and fill db std::string tables[] = { - "hedera_accounts", - "hedera_ids", - "crypto_keys", - "hedera_topics", "groups", - "node_servers", "users" }; - for (int i = 0; i < 7; i++) { + for (int i = 0; i < 2; i++) { runMysql("TRUNCATE " + tables[i]); runMysql("ALTER TABLE " + tables[i] + " AUTO_INCREMENT = 1"); } std::stringstream ss; - ss << "INSERT INTO `users` (`id`, `email`, `first_name`, `last_name`, `password`, `pubkey`, `privkey`, `created`, `email_checked`, `passphrase_shown`, `language`, `disabled`) VALUES " - << "(1, 'einhorn_silas@ist-allein.info', 'DDD', 'Schultz', 13134558453895551556, 0x146d3fb9e88abc0fca0b0091c1ab1b32b399be037436f340befa8bf004461889, 0x0dcc08960f45f631fe23bc7ddee0724cedc9ec0c861ce30f5091d20ffd96062d08ca215726fb9bd64860c754772e945eea4cc872ed0a36c7b640e8b0bf7a873ec6765fa510711622341347ce2307b5ce, '2020-02-20 16:05:44', 1, 0, 'de', 0), " - << "(2, 'Dario.Rekowski@buerotiger.de', 'Darios', 'Bruder', 12910944485867375321, 0x952e215a21d4376b4ac252c4bf41e156e1498e1b6b8ccf2a6826d96712f4f461, 0x4d40bf0860655f728312140dc3741e897bc2d13d00ea80a63e2961046a5a7bd8315397dfb488b89377087bc1a5f4f3af8ffdcf203329ae23ba04be7d38ad3852699d90ff1fc00e5b1ca92b64cc59c01f, '2020-02-20 16:05:44', 1, 0, 'de', 0), " - << "(3, 'morgenstern175@es-ist-liebe.de', 'Dieter', 'Schultz', 13528673707291575501, 0xb539944bf6444a2bfc988244f0c0c9dc326452be9b8a2a43fcd90663719f4f6d, 0x5461fda60b719b65ba00bd6298e48410c4cbf0e89deb13cc784ba8978cf047454e8556ee3eddc8487ee835c33a83163bc8d8babbf2a5c431876bc0a0c114ff0a0d6b57baa12cf8f23c64fb642c862db5, '2020-02-20 16:05:45', 1, 0, 'de', 0), " - << "(4, 'spaceteam@gmx.de', 'Bernd', 'Hückstädt', 15522411320147607375, 0x476b059744f08b0995522b484c90f8d2f47d9b59f4b3c96d9dc0ae6ab7b84979, 0x5277bf044cba4fec64e6f4d38da132755b029161231daefc9a7b4692ad37e05cdd88e0a2c2215baf854dd3a813578c214167af1113607e9f999ca848a7598ba5068e38f2a1afb097e4752a88024d79c8, '2020-02-20 16:05:46', 1, 0, 'de', 0), " - << "(5, 'em741@gmx.de', 'Thomas', 'Markuk', 7022671043835614958, 0xb1584e169d60a7e771d3a348235dfd7b5f9e8235fcc26090761a0264b0daa6ff, 0xb46fb7110bf91e28f367aa80f84d1bbd639b6f689f4b0aa28c0f71529232df9bf9ee0fb02fa4c1b9f5a6799c82d119e5646f7231d011517379faaacf6513d973ac3043d4c786490ba62d56d75b86164d, '2020-02-20 16:05:46', 1, 0, 'de', 0), " - << "(6, 'coin-info12@gradido.net', 'coin-info12', 'Test', 1548398919826089202, 0x4046ae49c1b620f2a321aba0c874fa2bc7ba844ab808bb0eeb18a908d468db14, 0x9522657ecd7456eedf86d065aa087ba7a94a8961a8e4950d044136155d38fe0840f2c0a2876ce055b3eaa6e9ab95c5feba89e535e0434fb2648d94d6e6ec68211aa2ea9e42d1ccd40b6b3c31e41f848e, '2020-02-20 16:05:47', 1, 0, 'de', 0), " - << "(7, 'info@einhornimmond.de', 'Alex', 'Wesper', 5822761891727948301, 0xb13ede3402abb8f29722b14fec0a2006ae7a3a51fb677cd6a2bbd797ac6905a5, 0x6aa39d7670c64a31639c7d89b874ad929b2eaeb2e5992dbad71b6cea700bf9e3c6cf866d0f0fdc22b44a0ebf51a860799e880ef86266199931dd0a301e5552db44b9b7fa99ed5945652bc7b31eff767c, '2020-02-20 16:05:47', 1, 0, 'de', 0); "; + ss << "INSERT INTO `users` (`id`, `email`, `first_name`, `last_name`, `username`, `password`, `pubkey`, `privkey`, `created`, `email_checked`, `passphrase_shown`, `language`, `disabled`, `group_id`) VALUES " + << "(1, 'd_schultz32@gmx.de', 'DDD', 'Schultz', 'Diddel', 13134558453895551556, 0x146d3fb9e88abc0fca0b0091c1ab1b32b399be037436f340befa8bf004461889, 0x0dcc08960f45f631fe23bc7ddee0724cedc9ec0c861ce30f5091d20ffd96062d08ca215726fb9bd64860c754772e945eea4cc872ed0a36c7b640e8b0bf7a873ec6765fa510711622341347ce2307b5ce, '2020-02-20 16:05:44', 1, 0, 'de', 0, 1), " + << "(2, 'Jeet_bb@gmail.com', 'Darios', 'Bruder', 'Jeet', 12910944485867375321, 0x952e215a21d4376b4ac252c4bf41e156e1498e1b6b8ccf2a6826d96712f4f461, 0x4d40bf0860655f728312140dc3741e897bc2d13d00ea80a63e2961046a5a7bd8315397dfb488b89377087bc1a5f4f3af8ffdcf203329ae23ba04be7d38ad3852699d90ff1fc00e5b1ca92b64cc59c01f, '2020-02-20 16:05:44', 1, 0, 'de', 0, 1), " + << "(3, 'Tiger_231@yahoo.com', 'Dieter', 'Schultz', 'Tiger', 13528673707291575501, 0xb539944bf6444a2bfc988244f0c0c9dc326452be9b8a2a43fcd90663719f4f6d, 0x5461fda60b719b65ba00bd6298e48410c4cbf0e89deb13cc784ba8978cf047454e8556ee3eddc8487ee835c33a83163bc8d8babbf2a5c431876bc0a0c114ff0a0d6b57baa12cf8f23c64fb642c862db5, '2020-02-20 16:05:45', 1, 0, 'de', 0, 1), " + << "(4, 'Nikola_Tesla@email.de', 'Nikola', 'Tesla', 'Erfinder', 15522411320147607375, 0x476b059744f08b0995522b484c90f8d2f47d9b59f4b3c96d9dc0ae6ab7b84979, 0x5277bf044cba4fec64e6f4d38da132755b029161231daefc9a7b4692ad37e05cdd88e0a2c2215baf854dd3a813578c214167af1113607e9f999ca848a7598ba5068e38f2a1afb097e4752a88024d79c8, '2020-02-20 16:05:46', 1, 0, 'de', 0, 1), " + << "(5, 'Elfenhausen@arcor.de', 'Thomas', 'Markuk', 'Elf', 7022671043835614958, 0xb1584e169d60a7e771d3a348235dfd7b5f9e8235fcc26090761a0264b0daa6ff, 0xb46fb7110bf91e28f367aa80f84d1bbd639b6f689f4b0aa28c0f71529232df9bf9ee0fb02fa4c1b9f5a6799c82d119e5646f7231d011517379faaacf6513d973ac3043d4c786490ba62d56d75b86164d, '2020-02-20 16:05:46', 1, 0, 'de', 0, 1), " + << "(6, 'coin-info12@gradido.net', 'coin-info12', 'Test', 'Test Username', 1548398919826089202, 0x4046ae49c1b620f2a321aba0c874fa2bc7ba844ab808bb0eeb18a908d468db14, 0x9522657ecd7456eedf86d065aa087ba7a94a8961a8e4950d044136155d38fe0840f2c0a2876ce055b3eaa6e9ab95c5feba89e535e0434fb2648d94d6e6ec68211aa2ea9e42d1ccd40b6b3c31e41f848e, '2020-02-20 16:05:47', 1, 0, 'de', 0, 1), " + << "(7, 'AlexWesper@gmail.com', 'Alex', 'Wesper', 'Wespe', 5822761891727948301, 0xb13ede3402abb8f29722b14fec0a2006ae7a3a51fb677cd6a2bbd797ac6905a5, 0x6aa39d7670c64a31639c7d89b874ad929b2eaeb2e5992dbad71b6cea700bf9e3c6cf866d0f0fdc22b44a0ebf51a860799e880ef86266199931dd0a301e5552db44b9b7fa99ed5945652bc7b31eff767c, '2020-02-20 16:05:47', 1, 0, 'de', 0, 1); "; runMysql(ss.str()); ss.str(std::string()); - ss << "INSERT INTO `groups` (`id`, `alias`, `name`, `url`, `description`) VALUES " - << "(1, 'gdd1', 'Gradido1', 'gdd1.gradido.com', 'Der erste offizielle Gradido Server (zum Testen)'); "; + ss << "INSERT INTO `groups` (`id`, `alias`, `name`, `url`, `description`) VALUES" + << "(1, 'gdd1', 'Gradido1', 'gdd1.gradido.com', 'Der erste offizielle Gradido Server (zum Testen)'), " + << "(2, 'gdd_test', 'Gradido Test', 'gdd1.gradido.com', 'Testgroup (zum Testen)'); "; runMysql(ss.str()); ss.str(std::string()); - ss << "INSERT INTO `hedera_accounts` (`id`, `user_id`, `account_hedera_id`, `account_key_id`, `balance`, `network_type`, `updated`) VALUES " - << "(1, 2, 15, 1, 1000000000000, 1, '2020-09-03 11:13:52'), " - << "(2, 2, 17, 2, 22787166159, 0, '2020-09-03 11:13:56'); "; - runMysql(ss.str()); - ss.str(std::string()); - - ss << "INSERT INTO `hedera_ids` (`id`, `shardNum`, `realmNum`, `num`) VALUES " - << "(1, 0, 0, 3), " - << "(2, 0, 0, 4)," - << "(3, 0, 0, 5)," - << "(4, 0, 0, 6)," - << "(6, 0, 0, 3)," - << "(10, 0, 0, 7)," - << "(11, 0, 0, 8)," - << "(12, 0, 0, 9)," - << "(13, 0, 0, 10)," - << "(14, 0, 0, 12)," - << "(15, 0, 0, 3327)," - << "(16, 0, 0, 3323)," - << "(17, 0, 0, 8707)," - << "(18, 0, 0, 39446);"; - runMysql(ss.str()); - ss.str(std::string()); - ss << "INSERT INTO `crypto_keys` (`id`, `private_key`, `public_key`, `crypto_key_type_id`) VALUES " - << "(1, 0xd2d4735174e6d2577573a0ec2767fba6511b1e37cd1cd98674912797fd37e12373d6b4d771034cc114f80b2afb2956b6b3e020ddea2db1142c61f3fa87c72a6c, 0x73d6b4d771034cc114f80b2afb2956b6b3e020ddea2db1142c61f3fa87c72a6c, 3), " - << "(2, 0xf1c3285be6ef869a2a8deef6caee56a5a7c2660e2bce24f39e420dd8d42fe8894bd027b2799e46dc7111a4fdd0eac3848054331f844a358de15c5b0ed3eb1740fab13ecb5a271d480e040c9266bcd584, 0xd6f6d29fb277f86ac7c3098dc799028974223e8dce6b1dd57b03940bf35fae7f, 1); "; - runMysql(ss.str()); - ss.str(std::string()); - - ss << "INSERT INTO `hedera_topics` (`id`, `topic_hedera_id`, `name`, `auto_renew_account_hedera_id`, `auto_renew_period`, `group_id`, `admin_key_id`, `submit_key_id`, `current_timeout`, `sequence_number`, `updated`) VALUES " - << "(1, 18, 'from Pauls created with his python script', 1, 0, 1, NULL, NULL, '1999-12-31 23:00:00', 0, '2020-09-14 18:29:04'); "; - runMysql(ss.str()); - ss.str(std::string()); - - ss << "INSERT INTO `node_servers` (`id`, `url`, `port`, `group_id`, `server_type`, `node_hedera_id`, `last_live_sign`) VALUES " - << "(1, 'http://0.testnet.hedera.com', 50211, 0, 4, 1, '2000-01-01 00:00:00'), " - << "(2, 'http://1.testnet.hedera.com', 50211, 0, 4, 2, '2000-01-01 00:00:00'), " - << "(3, 'http://2.testnet.hedera.com', 50211, 0, 4, 3, '2000-01-01 00:00:00'), " - << "(4, 'http://3.testnet.hedera.com', 50211, 0, 4, 4, '2000-01-01 00:00:00'), " - << "(5, 'http://35.237.200.180', 50211, 0, 3, 6, '2000-01-01 00:00:00'), " - << "(6, 'http://35.186.191.247', 50211, 0, 3, 2, '2000-01-01 00:00:00'), " - << "(7, 'http://35.192.2.25', 50211, 0, 3, 3, '2000-01-01 00:00:00'), " - << "(8, 'http://35.199.161.108', 50211, 0, 3, 4, '2000-01-01 00:00:00'), " - << "(9, 'http://35.203.82.240', 50211, 0, 3, 10, '2000-01-01 00:00:00'), " - << "(10, 'http://35.236.5.219', 50211, 0, 3, 11, '2000-01-01 00:00:00'), " - << "(11, 'http://35.197.192.225', 50211, 0, 3, 12, '2000-01-01 00:00:00'), " - << "(12, 'http://35.242.233.154', 50211, 0, 3, 13, '2000-01-01 00:00:00'), " - << "(13, 'http://35.240.118.96', 50211, 0, 3, 12, '2000-01-01 00:00:00'), " - << "(14, 'http://35.204.86.32', 50211, 0, 3, 14, '2000-01-01 00:00:00'), " - << "(15, 'https://gradido.dario-rekowski.de/', 443, 1, 2, 0, '2000-01-01 00:00:00'), " - << "(16, 'http://192.168.178.232', 8340, 1, 1, 0, '2000-01-01 00:00:00'); "; - runMysql(ss.str()); printf("init db in : %s\n", timeUsed.string().data()); - /*mysqlStatement - << "TRUNCATE hedera_accounts; " - << "ALTER TABLE hedera_accounts AUTO_INCREMENT = 1; " - << "TRUNCATE hedera_ids; " - << "ALTER TABLE hedera_ids AUTO_INCREMENT = 1; " - << "TRUNCATE crypto_keys; " - << "ALTER TABLE crypto_keys AUTO_INCREMENT = 1; " - << "TRUNCATE hedera_topics; " - << "ALTER TABLE hedera_topics AUTO_INCREMENT = 1; " - << "TRUNCATE groups; " - << "ALTER TABLE groups AUTO_INCREMENT = 1; " - << "TRUNCATE node_servers; " - << "ALTER TABLE node_servers AUTO_INCREMENT = 1; " - << "TRUNCATE users; " - << "ALTER TABLE users AUTO_INCREMENT = 1; " - ; - - try { - mysqlStatement.execute(true); - } - catch (Poco::Exception& ex) { - printf("exception by cleaning up db: %s\n", ex.displayText().data()); - } - mysqlStatement.reset(session); - mysqlStatement - << "INSERT INTO `users` (`id`, `email`, `first_name`, `last_name`, `password`, `pubkey`, `privkey`, `created`, `email_checked`, `passphrase_shown`, `language`, `disabled`) VALUES " - << "(1, 'einhorn_silas@ist-allein.info', 'DDD', 'Schultz', 13134558453895551556, 0x146d3fb9e88abc0fca0b0091c1ab1b32b399be037436f340befa8bf004461889, 0x0dcc08960f45f631fe23bc7ddee0724cedc9ec0c861ce30f5091d20ffd96062d08ca215726fb9bd64860c754772e945eea4cc872ed0a36c7b640e8b0bf7a873ec6765fa510711622341347ce2307b5ce, '2020-02-20 16:05:44', 1, 0, 'de', 0), " - << "(2, 'Dario.Rekowski@buerotiger.de', 'Darios', 'Bruder', 12910944485867375321, 0x952e215a21d4376b4ac252c4bf41e156e1498e1b6b8ccf2a6826d96712f4f461, 0x4d40bf0860655f728312140dc3741e897bc2d13d00ea80a63e2961046a5a7bd8315397dfb488b89377087bc1a5f4f3af8ffdcf203329ae23ba04be7d38ad3852699d90ff1fc00e5b1ca92b64cc59c01f, '2020-02-20 16:05:44', 1, 0, 'de', 0), " - << "(3, 'morgenstern175@es-ist-liebe.de', 'Dieter', 'Schultz', 13528673707291575501, 0xb539944bf6444a2bfc988244f0c0c9dc326452be9b8a2a43fcd90663719f4f6d, 0x5461fda60b719b65ba00bd6298e48410c4cbf0e89deb13cc784ba8978cf047454e8556ee3eddc8487ee835c33a83163bc8d8babbf2a5c431876bc0a0c114ff0a0d6b57baa12cf8f23c64fb642c862db5, '2020-02-20 16:05:45', 1, 0, 'de', 0), " - << "(4, 'spaceteam@gmx.de', 'Bernd', 'Hückstädt', 15522411320147607375, 0x476b059744f08b0995522b484c90f8d2f47d9b59f4b3c96d9dc0ae6ab7b84979, 0x5277bf044cba4fec64e6f4d38da132755b029161231daefc9a7b4692ad37e05cdd88e0a2c2215baf854dd3a813578c214167af1113607e9f999ca848a7598ba5068e38f2a1afb097e4752a88024d79c8, '2020-02-20 16:05:46', 1, 0, 'de', 0), " - << "(5, 'em741@gmx.de', 'Thomas', 'Markuk', 7022671043835614958, 0xb1584e169d60a7e771d3a348235dfd7b5f9e8235fcc26090761a0264b0daa6ff, 0xb46fb7110bf91e28f367aa80f84d1bbd639b6f689f4b0aa28c0f71529232df9bf9ee0fb02fa4c1b9f5a6799c82d119e5646f7231d011517379faaacf6513d973ac3043d4c786490ba62d56d75b86164d, '2020-02-20 16:05:46', 1, 0, 'de', 0), " - << "(6, 'coin-info12@gradido.net', 'coin-info12', 'Test', 1548398919826089202, 0x4046ae49c1b620f2a321aba0c874fa2bc7ba844ab808bb0eeb18a908d468db14, 0x9522657ecd7456eedf86d065aa087ba7a94a8961a8e4950d044136155d38fe0840f2c0a2876ce055b3eaa6e9ab95c5feba89e535e0434fb2648d94d6e6ec68211aa2ea9e42d1ccd40b6b3c31e41f848e, '2020-02-20 16:05:47', 1, 0, 'de', 0), " - << "(7, 'info@einhornimmond.de', 'Alex', 'Wesper', 5822761891727948301, 0xb13ede3402abb8f29722b14fec0a2006ae7a3a51fb677cd6a2bbd797ac6905a5, 0x6aa39d7670c64a31639c7d89b874ad929b2eaeb2e5992dbad71b6cea700bf9e3c6cf866d0f0fdc22b44a0ebf51a860799e880ef86266199931dd0a301e5552db44b9b7fa99ed5945652bc7b31eff767c, '2020-02-20 16:05:47', 1, 0, 'de', 0); " - - << "INSERT INTO `groups` (`id`, `alias`, `name`, `url`, `description`) VALUES " - << "(1, 'gdd1', 'Gradido1', 'gdd1.gradido.com', 'Der erste offizielle Gradido Server (zum Testen)'); " - - << "INSERT INTO `hedera_accounts` (`id`, `user_id`, `account_hedera_id`, `account_key_id`, `balance`, `network_type`, `updated`) VALUES " - << "(1, 2, 15, 1, 1000000000000, 1, '2020-09-03 11:13:52'), " - << "(2, 2, 17, 2, 22787166159, 0, '2020-09-03 11:13:56'); " - - << "INSERT INTO `hedera_ids` (`id`, `shardNum`, `realmNum`, `num`) VALUES " - << "(1, 0, 0, 3), " - << "(2, 0, 0, 4)," - << "(3, 0, 0, 5)," - << "(4, 0, 0, 6)," - << "(6, 0, 0, 3)," - << "(10, 0, 0, 7)," - << "(11, 0, 0, 8)," - << "(12, 0, 0, 9)," - << "(13, 0, 0, 10)," - << "(14, 0, 0, 12)," - << "(15, 0, 0, 3327)," - << "(16, 0, 0, 3323)," - << "(17, 0, 0, 8707)," - << "(18, 0, 0, 39446);" - - << "INSERT INTO `crypto_keys` (`id`, `private_key`, `public_key`, `crypto_key_type_id`) VALUES " - << "(1, 0xd2d4735174e6d2577573a0ec2767fba6511b1e37cd1cd98674912797fd37e12373d6b4d771034cc114f80b2afb2956b6b3e020ddea2db1142c61f3fa87c72a6c, 0x73d6b4d771034cc114f80b2afb2956b6b3e020ddea2db1142c61f3fa87c72a6c, 3), " - << "(2, 0xf1c3285be6ef869a2a8deef6caee56a5a7c2660e2bce24f39e420dd8d42fe8894bd027b2799e46dc7111a4fdd0eac3848054331f844a358de15c5b0ed3eb1740fab13ecb5a271d480e040c9266bcd584, 0xd6f6d29fb277f86ac7c3098dc799028974223e8dce6b1dd57b03940bf35fae7f, 1); " - - << "INSERT INTO `hedera_topics` (`id`, `topic_hedera_id`, `name`, `auto_renew_account_hedera_id`, `auto_renew_period`, `group_id`, `admin_key_id`, `submit_key_id`, `current_timeout`, `sequence_number`, `updated`) VALUES " - << "(1, 18, 'from Pauls created with his python script', 1, 0, 1, NULL, NULL, '1999-12-31 23:00:00', 0, '2020-09-14 18:29:04'); " - - << "INSERT INTO `node_servers` (`id`, `url`, `port`, `group_id`, `server_type`, `node_hedera_id`, `last_live_sign`) VALUES " - << "(1, 'http://0.testnet.hedera.com', 50211, 0, 4, 1, '2000-01-01 00:00:00'), " - << "(2, 'http://1.testnet.hedera.com', 50211, 0, 4, 2, '2000-01-01 00:00:00'), " - << "(3, 'http://2.testnet.hedera.com', 50211, 0, 4, 3, '2000-01-01 00:00:00'), " - << "(4, 'http://3.testnet.hedera.com', 50211, 0, 4, 4, '2000-01-01 00:00:00'), " - << "(5, 'http://35.237.200.180', 50211, 0, 3, 6, '2000-01-01 00:00:00'), " - << "(6, 'http://35.186.191.247', 50211, 0, 3, 2, '2000-01-01 00:00:00'), " - << "(7, 'http://35.192.2.25', 50211, 0, 3, 3, '2000-01-01 00:00:00'), " - << "(8, 'http://35.199.161.108', 50211, 0, 3, 4, '2000-01-01 00:00:00'), " - << "(9, 'http://35.203.82.240', 50211, 0, 3, 10, '2000-01-01 00:00:00'), " - << "(10, 'http://35.236.5.219', 50211, 0, 3, 11, '2000-01-01 00:00:00'), " - << "(11, 'http://35.197.192.225', 50211, 0, 3, 12, '2000-01-01 00:00:00'), " - << "(12, 'http://35.242.233.154', 50211, 0, 3, 13, '2000-01-01 00:00:00'), " - << "(13, 'http://35.240.118.96', 50211, 0, 3, 12, '2000-01-01 00:00:00'), " - << "(14, 'http://35.204.86.32', 50211, 0, 3, 14, '2000-01-01 00:00:00'), " - << "(15, 'https://gradido.dario-rekowski.de/', 443, 1, 2, 0, '2000-01-01 00:00:00'), " - << "(16, 'http://192.168.178.232', 8340, 1, 1, 0, '2000-01-01 00:00:00'); " - ; - - try { - mysqlStatement.execute(); - } - catch (Poco::Exception& ex) { - printf("exception by init db with data: %s\n", ex.displayText().data()); - } - */ + fillTests(); for (std::list::iterator it = gTests.begin(); it != gTests.end(); it++) { From 864ede416aafecdb97132990dde0c0dbbb3060f6 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 7 Jun 2021 10:06:29 +0200 Subject: [PATCH 18/33] add tests for check username, fix bugs shown with tests (._.); --- .../cpp/JSONInterface/JsonCheckUsername.cpp | 5 +- .../JSONInterface/TestJsonCheckUsername.cpp | 123 ++++++++++++++++++ 2 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 login_server/src/cpp/test/JSONInterface/TestJsonCheckUsername.cpp diff --git a/login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp b/login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp index cf19ae69d..f05f503ee 100644 --- a/login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp +++ b/login_server/src/cpp/JSONInterface/JsonCheckUsername.cpp @@ -23,8 +23,7 @@ Poco::JSON::Object* JsonCheckUsername::handle(Poco::Dynamic::Var params) auto group_alias_obj = paramJsonObject->get("group_alias"); try { - paramJsonObject->get("username").convert(username); - + if (!username_obj.isEmpty()) { username_obj.convert(username); } @@ -38,7 +37,7 @@ Poco::JSON::Object* JsonCheckUsername::handle(Poco::Dynamic::Var params) } catch (Poco::Exception& ex) { - return stateError("username not found or invalid"); + return stateError("Poco Exception", ex.displayText()); } } diff --git a/login_server/src/cpp/test/JSONInterface/TestJsonCheckUsername.cpp b/login_server/src/cpp/test/JSONInterface/TestJsonCheckUsername.cpp new file mode 100644 index 000000000..d399689ee --- /dev/null +++ b/login_server/src/cpp/test/JSONInterface/TestJsonCheckUsername.cpp @@ -0,0 +1,123 @@ +#include "gtest/gtest.h" + +#include "JSONInterface/JsonCheckUsername.h" + +TEST(TestJsonCheckUsername, InvalidGroupAlias) +{ + JsonCheckUsername jsonCall; + Poco::JSON::Object::Ptr params = new Poco::JSON::Object; + params->set("group_alias", "robert"); + auto result = jsonCall.handle(params); + auto msg = result->get("msg"); + ASSERT_FALSE(msg.isEmpty()); + ASSERT_TRUE(msg.isString()); + ASSERT_EQ(msg.toString(), "unknown group"); + + delete result; +} + +TEST(TestJsonCheckUsername, InvalidGroupId) +{ + JsonCheckUsername jsonCall; + Poco::JSON::Object::Ptr params = new Poco::JSON::Object; + params->set("group_id", "4"); + auto result = jsonCall.handle(params); + auto msg = result->get("msg"); + ASSERT_FALSE(msg.isEmpty()); + ASSERT_TRUE(msg.isString()); + ASSERT_EQ(msg.toString(), "unknown group"); + + delete result; +} + +TEST(TestJsonCheckUsername, ValidGroupAlias) +{ + JsonCheckUsername jsonCall; + Poco::JSON::Object::Ptr params = new Poco::JSON::Object; + params->set("group_alias", "gdd1"); + auto result = jsonCall.handle(params); + auto state = result->get("state"); + ASSERT_FALSE(state.isEmpty()); + ASSERT_TRUE(state.isString()); + ASSERT_EQ(state.toString(), "success"); + + auto group_id = result->get("group_id"); + ASSERT_FALSE(group_id.isEmpty()); + ASSERT_TRUE(group_id.isInteger()); + int group_id_int = 0; + group_id.convert(group_id_int); + ASSERT_EQ(group_id_int, 1); + + delete result; +} + +TEST(TestJsonCheckUsername, UsernameWithoutGroup) +{ + JsonCheckUsername jsonCall; + Poco::JSON::Object::Ptr params = new Poco::JSON::Object; + params->set("username", "maxi"); + auto result = jsonCall.handle(params); + + auto state = result->get("state"); + ASSERT_FALSE(state.isEmpty()); + ASSERT_TRUE(state.isString()); + ASSERT_EQ(state.toString(), "error"); + + auto msg = result->get("msg"); + ASSERT_FALSE(msg.isEmpty()); + ASSERT_TRUE(msg.isString()); + ASSERT_EQ(msg.toString(), "no group given"); + + + delete result; +} + +TEST(TestJsonCheckUsername, ExistingUsername) +{ + JsonCheckUsername jsonCall; + Poco::JSON::Object::Ptr params = new Poco::JSON::Object; + params->set("username", "Erfinder"); + params->set("group_id", 1); + auto result = jsonCall.handle(params); + + auto state = result->get("state"); + ASSERT_FALSE(state.isEmpty()); + ASSERT_TRUE(state.isString()); + ASSERT_EQ(state.toString(), "warning"); + + auto msg = result->get("msg"); + ASSERT_FALSE(msg.isEmpty()); + ASSERT_TRUE(msg.isString()); + ASSERT_EQ(msg.toString(), "username already in use"); +} + +TEST(TestJsonCheckUsername, NewUsername) +{ + JsonCheckUsername jsonCall; + Poco::JSON::Object::Ptr params = new Poco::JSON::Object; + params->set("username", "Maxi"); + params->set("group_id", 1); + auto result = jsonCall.handle(params); + + auto state = result->get("state"); + ASSERT_FALSE(state.isEmpty()); + ASSERT_TRUE(state.isString()); + ASSERT_EQ(state.toString(), "success"); +} + +TEST(TestJsonCheckUsername, UsernameExistInOtherGroup) +{ + JsonCheckUsername jsonCall; + Poco::JSON::Object::Ptr params = new Poco::JSON::Object; + params->set("username", "Erfinder"); + params->set("group_id", 2); + auto result = jsonCall.handle(params); + + auto state = result->get("state"); + ASSERT_FALSE(state.isEmpty()); + ASSERT_TRUE(state.isString()); + ASSERT_EQ(state.toString(), "success"); + +} + + From 4b50b6781be71c9d5734a61cd433c10f80d49dae Mon Sep 17 00:00:00 2001 From: ogerly Date: Mon, 7 Jun 2021 14:52:37 +0200 Subject: [PATCH 19/33] merge master --- login_server/dependencies/grpc | 1 + login_server/src/proto | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 160000 login_server/dependencies/grpc diff --git a/login_server/dependencies/grpc b/login_server/dependencies/grpc new file mode 160000 index 000000000..7d7e45676 --- /dev/null +++ b/login_server/dependencies/grpc @@ -0,0 +1 @@ +Subproject commit 7d7e4567625db7cfebf8969a225948097a3f9f89 diff --git a/login_server/src/proto b/login_server/src/proto index 77dee5685..924b51c87 160000 --- a/login_server/src/proto +++ b/login_server/src/proto @@ -1 +1 @@ -Subproject commit 77dee5685ebba543ea1cd2321580ad56c92f5775 +Subproject commit 924b51c87fea29d5aaf053af43251dab44c2eeb7 From 2c2417a3f15075ddc7c37abf7341c8505465d678 Mon Sep 17 00:00:00 2001 From: Dario Rekowski on RockPI Date: Mon, 7 Jun 2021 13:06:09 +0000 Subject: [PATCH 20/33] change transfer confirmation email, to not contain sender email address as reply to field anymore --- .../src/Model/Transactions/TransactionTransfer.php | 4 ++-- .../src/Template/Email/text/notification_transfer.ctp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php index 4f3f4e88c..12d2878fc 100644 --- a/community_server/src/Model/Transactions/TransactionTransfer.php +++ b/community_server/src/Model/Transactions/TransactionTransfer.php @@ -204,9 +204,9 @@ class TransactionTransfer extends TransactionBase { $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id); return false; } - $email->setFrom([$serverAdminEmail => $senderUser->getNames() . ' via Gradido Community']) + $noReplyEmail = Configure::read('noReplyEmail'); + $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)']) ->setTo([$receiverUser->email => $receiverUser->getNames()]) - ->setReplyTo($senderUser->email) ->setSubject(__('Gradidos erhalten')) ->send(); } catch(Exception $e) { diff --git a/community_server/src/Template/Email/text/notification_transfer.ctp b/community_server/src/Template/Email/text/notification_transfer.ctp index 2cc692e02..155304c2c 100644 --- a/community_server/src/Template/Email/text/notification_transfer.ctp +++ b/community_server/src/Template/Email/text/notification_transfer.ctp @@ -15,7 +15,7 @@ $senderNames = $senderUser->first_name . ' ' . $senderUser->last_name; - + Gradido Community Server \ No newline at end of file From 9a4c433d73fc873a99403223bd415863594e0ee9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 7 Jun 2021 15:21:37 +0200 Subject: [PATCH 21/33] fix missing update --- login_server/src/cpp/model/table/User.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/login_server/src/cpp/model/table/User.cpp b/login_server/src/cpp/model/table/User.cpp index 24f1371ee..2b9dba755 100644 --- a/login_server/src/cpp/model/table/User.cpp +++ b/login_server/src/cpp/model/table/User.cpp @@ -83,11 +83,11 @@ namespace model { if (mPasswordHashed) { - insert << "INSERT INTO users (email, first_name, last_name, username, description, password, email_hash, language, group_id) VALUES(?,?,?,?,?,?,?,?);", + insert << "INSERT INTO users (email, first_name, last_name, username, description, password, email_hash, language, group_id) VALUES(?,?,?,?,?,?,?,?,?);", use(mEmail), use(mFirstName), use(mLastName), use(mUsername), use(mDescription), bind(mPasswordHashed), use(mEmailHash), use(mLanguageKey), use(mGroupId); } else { - insert << "INSERT INTO users (email, first_name, last_name, username, description, email_hash, language, group_id) VALUES(?,?,?,?,?,?,?);", + insert << "INSERT INTO users (email, first_name, last_name, username, description, email_hash, language, group_id) VALUES(?,?,?,?,?,?,?,?);", use(mEmail), use(mFirstName), use(mLastName), use(mUsername), use(mDescription), use(mEmailHash), use(mLanguageKey), use(mGroupId); } From d8428844909259d517bf3ede9363e31db91785f6 Mon Sep 17 00:00:00 2001 From: Dario Rekowski on RockPI Date: Mon, 7 Jun 2021 14:26:08 +0000 Subject: [PATCH 22/33] fix email setup problem in default config --- configs/community_server/app.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/configs/community_server/app.php b/configs/community_server/app.php index f0cf46220..5acd4ce51 100644 --- a/configs/community_server/app.php +++ b/configs/community_server/app.php @@ -214,9 +214,8 @@ return [ 'timeout' => 30, 'username' => null, 'password' => null, - 'client' => null, - 'tls' => null, - 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null), + 'className' => 'Smtp', + 'tls' => true ], ], @@ -304,11 +303,11 @@ return [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, - 'host' => 'localhost', + 'host' => 'mariadb', //'port' => 'non_standard_port_number', - 'username' => 'my_app', - 'password' => 'secret', - 'database' => 'test_myapp', + 'username' => 'root', + 'password' => '', + 'database' => 'gradido_community_test', //'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'cacheMetadata' => true, From d2497c9c7c3d6fa208f36e42cc8e93f734b7cd7f Mon Sep 17 00:00:00 2001 From: Dario Rekowski on RockPI Date: Mon, 7 Jun 2021 14:36:57 +0000 Subject: [PATCH 23/33] if email couldn't sended make warning not error and transmit to login-server --- .../Controller/JsonRequestHandlerController.php | 4 ++++ .../src/Model/Transactions/Transaction.php | 13 ++++++++++--- .../src/Model/Transactions/TransactionBase.php | 16 +++++++++++++++- .../Model/Transactions/TransactionCreation.php | 1 + .../Model/Transactions/TransactionTransfer.php | 1 + 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php index 12e03be8d..c1f7e4701 100644 --- a/community_server/src/Controller/JsonRequestHandlerController.php +++ b/community_server/src/Controller/JsonRequestHandlerController.php @@ -387,6 +387,10 @@ class JsonRequestHandlerController extends AppController { //echo "after validate
"; if ($transaction->save()) { + $result = ['state' => 'success']; + if($transaction->hasWarnings()) { + $result['warnings'] = $transaction->getWarnings(); + } // success return $this->returnJson(['state' => 'success']); } else { diff --git a/community_server/src/Model/Transactions/Transaction.php b/community_server/src/Model/Transactions/Transaction.php index 40be13cd3..810f20c9d 100644 --- a/community_server/src/Model/Transactions/Transaction.php +++ b/community_server/src/Model/Transactions/Transaction.php @@ -25,7 +25,7 @@ class Transaction extends TransactionBase { //$transactionBin = base64_decode($base64Data, true); //if($transactionBin == false) { //sodium_base64_VARIANT_URLSAFE_NO_PADDING - if(is_a($base64Data, '\Proto\Gradido\Transaction')) { + if(is_a($base64Data, '\Proto\Gradido\GradidoTransaction')) { $this->mProtoTransaction = $base64Data; $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes()); return; @@ -93,7 +93,11 @@ class Transaction extends TransactionBase { return $this->mTransactionBody; } - public function getFirstPublic() { + public function getFirstPublic() + { + if(!$this->mProtoTransaction || !$this->mProtoTransaction->getSigMap()) { + return ''; + } $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair(); return $sigPairs[0]->getPubKey(); } @@ -111,6 +115,7 @@ class Transaction extends TransactionBase { $sigMap = $this->mProtoTransaction->getSigMap(); if(!$sigMap) { $this->addError('Transaction', 'signature map is zero'); + //var_dump($this->mProtoTransaction); return false; } //var_dump($sigMap); @@ -193,8 +198,10 @@ class Transaction extends TransactionBase { $connection->commit(); - $this->mTransactionBody->getSpecificTransaction()->sendNotificationEmail($this->mTransactionBody->getMemo()); + $specificTransaction = $this->mTransactionBody->getSpecificTransaction(); + $specificTransaction->sendNotificationEmail($this->mTransactionBody->getMemo()); + $this->addWarnings($specificTransaction->getWarnings()); return true; } diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php index 607903d8d..e106b8ac2 100644 --- a/community_server/src/Model/Transactions/TransactionBase.php +++ b/community_server/src/Model/Transactions/TransactionBase.php @@ -6,24 +6,38 @@ use Cake\ORM\TableRegistry; class TransactionBase { private $errors = []; + private $warnings = []; static $tables = []; public function getErrors() { return $this->errors; } - + + public function getWarnings() { + return $this->warnings; + } public function addError($functionName, $errorName) { array_push($this->errors, [$functionName => $errorName]); } + public function addWarning($functionName, $warningName) { + $this->warnings[] = [$functionName => $warningName]; + } public function addErrors($errors) { $this->errors = array_merge($this->errors, $errors); } + + public function addWarnings($warnings) { + $this->warnings = array_merge($this->warnings, $warnings); + } public function hasErrors() { return count($this->errors) > 0; } + public function hasWarnings() { + return count($this->warnings) > 0; + } public static function getTable($tableName) { if(!isset(self::$tables[$tableName])) { self::$tables[$tableName] = TableRegistry::getTableLocator()->get($tableName); diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php index f9b3c7657..9150d24eb 100644 --- a/community_server/src/Model/Transactions/TransactionCreation.php +++ b/community_server/src/Model/Transactions/TransactionCreation.php @@ -209,6 +209,7 @@ class TransactionCreation extends TransactionBase { ->send(); } catch(Exception $e) { // $this->addError('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); + $this->addWarning('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); return false; } return true; diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php index 12d2878fc..be4f45b88 100644 --- a/community_server/src/Model/Transactions/TransactionTransfer.php +++ b/community_server/src/Model/Transactions/TransactionTransfer.php @@ -211,6 +211,7 @@ class TransactionTransfer extends TransactionBase { ->send(); } catch(Exception $e) { //$this->addError('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); + $this->addWarning('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); return false; } return true; From de269e97ea2d85442f1db9bd39c316d050893576 Mon Sep 17 00:00:00 2001 From: Dario Rekowski on RockPI Date: Mon, 7 Jun 2021 15:14:50 +0000 Subject: [PATCH 24/33] missing update --- community_server/config/routes.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/community_server/config/routes.php b/community_server/config/routes.php index 3b0dfedc1..20fc1ff62 100644 --- a/community_server/config/routes.php +++ b/community_server/config/routes.php @@ -60,19 +60,21 @@ Router::scope('/', function (RouteBuilder $routes) { $whitelist = ['JsonRequestHandler', 'ElopageWebhook', 'AppRequests']; $ajaxWhitelist = ['TransactionSendCoins', 'TransactionCreations']; + $callerIp = $request->clientIp(); + foreach($whitelist as $entry) { if($request->getParam('controller') === $entry) { if($entry == 'ElopageWebhook' || $entry == 'AppRequests') { return true; } $allowedIpLocalhost = ['127.0.0.1', 'localhost', '', '::1']; - if(in_array($clientIp, $allowedIpLocalhost)) { + if(in_array($callerIp, $allowedIpLocalhost)) { return true; } $allowedCaller = Configure::read('API.allowedCaller'); $ipPerHost = []; if($allowedCaller && count($allowedCaller) > 0) { - $callerIp = $request->clientIp(); + foreach($allowedCaller as $allowed) { $ip = gethostbyname($allowed); $ipPerHost[$allowed] = $ip; From 2fc3fe94a09bae199bf2f34f9df90e8fc3879c2b Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 7 Jun 2021 17:20:11 +0200 Subject: [PATCH 25/33] add warning to able to forward warnings from community server to client --- .../JSONInterface/JsonCreateTransaction.cpp | 9 ++ login_server/src/cpp/lib/JsonRequest.cpp | 101 ++---------------- login_server/src/cpp/lib/JsonRequest.h | 1 - login_server/src/cpp/lib/Notification.cpp | 6 ++ login_server/src/cpp/lib/Notification.h | 2 + login_server/src/cpp/lib/NotificationList.cpp | 56 +++++++++- login_server/src/cpp/lib/NotificationList.h | 7 ++ login_server/src/cpp/lib/Warning.cpp | 58 ++++++++++ login_server/src/cpp/lib/Warning.h | 31 ++++++ .../src/cpp/model/gradido/Transaction.cpp | 8 +- 10 files changed, 184 insertions(+), 95 deletions(-) create mode 100644 login_server/src/cpp/lib/Warning.cpp create mode 100644 login_server/src/cpp/lib/Warning.h diff --git a/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp b/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp index 7fb40913e..5478f78cf 100644 --- a/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp +++ b/login_server/src/cpp/JSONInterface/JsonCreateTransaction.cpp @@ -135,6 +135,7 @@ Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params) else { printf("user hasn't valid key pair set\n"); } + Poco::JSON::Array* json_warnings = nullptr; if (!result) { try { auto transaction = model::gradido::Transaction::createTransfer(sender_user, target_pubkey, mTargetGroup, amount, mMemo, mBlockchainType); @@ -149,6 +150,10 @@ Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params) if (errors.size() > 0) { return stateError("error by signing transaction", errors); } + if (transaction->warningCount() > 0) { + json_warnings = new Poco::JSON::Array; + json_warnings->add(transaction->getWarningsArray()); + } } } catch (Poco::Exception& ex) { @@ -164,6 +169,10 @@ Poco::JSON::Object* JsonCreateTransaction::transfer(Poco::Dynamic::Var params) return stateError("exception"); } result = stateSuccess(); + if (json_warnings) { + result->set("warnings", json_warnings); + delete json_warnings; + } } mm->releaseMemory(target_pubkey); return result; diff --git a/login_server/src/cpp/lib/JsonRequest.cpp b/login_server/src/cpp/lib/JsonRequest.cpp index c20c69898..411ec07a0 100644 --- a/login_server/src/cpp/lib/JsonRequest.cpp +++ b/login_server/src/cpp/lib/JsonRequest.cpp @@ -11,6 +11,7 @@ #include "sodium.h" #include "../SingletonManager/MemoryManager.h" #include "DataTypeConverter.h" +#include "Warning.h" JsonRequest::JsonRequest(const std::string& serverHost, int serverPort) : mServerHost(serverHost), mServerPort(serverPort) @@ -125,11 +126,19 @@ JsonRequestReturn JsonRequest::request(const char* methodName, const Poco::JSON: return JSON_REQUEST_RETURN_ERROR; } else if (stateString == "success") { + auto warnings_obj = object.get("warnings"); + if (!warnings_obj.isEmpty()) { + Poco::JSON::Object warnings = *parsedJson.extract(); + for (auto it = warnings.begin(); it != warnings.end(); it++) { + addWarning(new Warning(it->first, it->second.toString())); + } + } for (auto it = object.begin(); it != object.end(); it++) { if (it->first == "state") continue; std::string index = it->first; std::string value = it->second.toString(); - printf("[JsonRequest] %s: %s\n", index.data(), value.data()); + + //printf("[JsonRequest] %s: %s\n", index.data(), value.data()); } } } @@ -165,95 +174,5 @@ JsonRequestReturn JsonRequest::request(const char* methodName) return request(methodName, requestJson); } -#include "Poco/JSON/Stringifier.h" -JsonRequestReturn JsonRequest::requestGRPCRelay(const Poco::Net::NameValueCollection& payload) -{ - static const char* functionName = "JsonRequest::requestGRPCRelay"; - Poco::JSON::Object requestJson; - - for (auto it = payload.begin(); it != payload.end(); it++) { - requestJson.set(it->first, it->second); - } - // send post request via https - // 443 = HTTPS Default - // TODO: adding port into ServerConfig - try { - Profiler phpRequestTime; - Poco::Net::HTTPClientSession httpClientSession(mServerHost, mServerPort); - Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/hedera_rpc_relay/gRPCProxy.php"); - - request.setChunkedTransferEncoding(false); - std::ostream& requestStream = httpClientSession.sendRequest(request); - requestJson.stringify(requestStream); - - std::stringstream ss; - requestJson.stringify(ss); - auto f = fopen("grpc.txt", "wt"); - std::string grpc = ss.str(); - fwrite(grpc.data(), grpc.size(), 1, f); - fclose(f); - - Poco::Net::HTTPResponse response; - std::istream& request_stream = httpClientSession.receiveResponse(response); - - // debugging answer - - std::stringstream responseStringStream; - for (std::string line; std::getline(request_stream, line); ) { - responseStringStream << line << std::endl; - } - Poco::Logger& speedLog = Poco::Logger::get("SpeedLog"); - speedLog.information("[gRPC relay] php server time: %s", phpRequestTime.string()); - - // extract parameter from request - Poco::JSON::Parser jsonParser; - Poco::Dynamic::Var parsedJson; - try { - parsedJson = jsonParser.parse(responseStringStream.str()); - } - catch (Poco::Exception& ex) { - addError(new ParamError(functionName, "error parsing request answer grpc relay", ex.displayText().data())); - - std::string fileName = "response_grpc_"; - fileName += ".html"; - - FILE* f = fopen(fileName.data(), "wt"); - std::string responseString = responseStringStream.str(); - fwrite(responseString.data(), 1, responseString.size(), f); - fclose(f); - // */ - sendErrorsAsEmail(responseStringStream.str()); - return JSON_REQUEST_RETURN_PARSE_ERROR; - } - - Poco::JSON::Object object = *parsedJson.extract(); - auto state = object.get("state"); - std::string stateString = state.convert(); - if (stateString == "error") { - addError(new Error(functionName, "php server return error")); - if (!object.isNull("msg")) { - addError(new ParamError(functionName, "msg:", object.get("msg").convert().data())); - } - if (!object.isNull("details")) { - addError(new ParamError(functionName, "details:", object.get("details").convert().data())); - } - // send copy of errors as email, to have result also in db - sendErrorsAsEmail("", true); - return JSON_REQUEST_RETURN_ERROR; - } - ss.clear(); - Poco::JSON::Stringifier::stringify(object, ss); - printf("json request result: %s\n", ss.str().data()); - } - catch (Poco::Exception& e) { - addError(new ParamError(functionName, "connect error to php server", e.displayText().data())); - sendErrorsAsEmail(); - return JSON_REQUEST_CONNECT_ERROR; - } - - - - return JSON_REQUEST_RETURN_OK; -} diff --git a/login_server/src/cpp/lib/JsonRequest.h b/login_server/src/cpp/lib/JsonRequest.h index 0def2465d..cfb9055d5 100644 --- a/login_server/src/cpp/lib/JsonRequest.h +++ b/login_server/src/cpp/lib/JsonRequest.h @@ -32,7 +32,6 @@ public: JsonRequestReturn request(const char* methodName, const Poco::Net::NameValueCollection& payload); JsonRequestReturn request(const char* methodName, const Poco::JSON::Object& payload); JsonRequestReturn request(const char* methodName); - JsonRequestReturn requestGRPCRelay(const Poco::Net::NameValueCollection& payload); protected: int mServerPort; diff --git a/login_server/src/cpp/lib/Notification.cpp b/login_server/src/cpp/lib/Notification.cpp index f2fb628d1..4a79b085f 100644 --- a/login_server/src/cpp/lib/Notification.cpp +++ b/login_server/src/cpp/lib/Notification.cpp @@ -10,4 +10,10 @@ Notification::Notification(const char* functionName, const std::string& message) : mFunctionName(functionName), mMessage(message) { +} + +Notification::Notification(const std::string& functionName, const std::string& message) + : mFunctionName(functionName), mMessage(message) +{ + } \ No newline at end of file diff --git a/login_server/src/cpp/lib/Notification.h b/login_server/src/cpp/lib/Notification.h index 39a712aa6..07de555ae 100644 --- a/login_server/src/cpp/lib/Notification.h +++ b/login_server/src/cpp/lib/Notification.h @@ -8,6 +8,7 @@ class Notification public: Notification(const char* functionName, const char* message); Notification(const char* functionName, const std::string& message); + Notification(const std::string& functionName, const std::string& message); const char* getFunctionName() { return mFunctionName.data(); } const char* getMessage() { return mMessage.data(); } @@ -16,6 +17,7 @@ public: virtual bool isError() { return false; } virtual bool isSuccess() { return false; } + virtual bool isWarning() { return false; } protected: std::string mFunctionName; diff --git a/login_server/src/cpp/lib/NotificationList.cpp b/login_server/src/cpp/lib/NotificationList.cpp index d29774bce..4d5883367 100644 --- a/login_server/src/cpp/lib/NotificationList.cpp +++ b/login_server/src/cpp/lib/NotificationList.cpp @@ -54,6 +54,11 @@ NotificationList::~NotificationList() delete mErrorStack.top(); mErrorStack.pop(); } + + while (mWarningStack.size() > 0) { + delete mWarningStack.top(); + mWarningStack.pop(); + } } void NotificationList::addError(Notification* error, bool log/* = true */) @@ -61,12 +66,21 @@ void NotificationList::addError(Notification* error, bool log/* = true */) if (log) { std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S"); - mLogging.error("%s [ErrorList::addError] %s", dateTimeString, error->getString(false)); + mLogging.error("%s [NotificationList::addError] %s", dateTimeString, error->getString(false)); } mErrorStack.push(error); } +void NotificationList::addWarning(Warning* warning, bool log/* = true*/) +{ + if (log) { + std::string dateTimeString = Poco::DateTimeFormatter::format(Poco::DateTime(), "%d.%m.%y %H:%M:%S"); + mLogging.warning("%s [NotificationList::addWarning] %s", dateTimeString, warning->getString(false)); + } + mWarningStack.push(warning); +} + void NotificationList::addNotification(Notification* notification) { mErrorStack.push(notification); @@ -86,6 +100,20 @@ Notification* NotificationList::getLastError() return error; } +Warning* NotificationList::getLastWarning() +{ + if (mWarningStack.size() == 0) { + return nullptr; + } + + Warning* warning = mWarningStack.top(); + if (warning) { + mWarningStack.pop(); + } + + return warning; +} + void NotificationList::clearErrors() { while (mErrorStack.size()) { @@ -109,6 +137,17 @@ int NotificationList::getErrors(NotificationList* send) return iCount; } +int NotificationList::getWarnings(NotificationList* send) +{ + Warning* warning = nullptr; + int iCount = 0; + while (warning = send->getLastWarning()) { + addWarning(warning, false); + iCount++; + } + return iCount; +} + void NotificationList::printErrors() { while (mErrorStack.size() > 0) { @@ -134,6 +173,21 @@ std::vector NotificationList::getErrorsArray() return result; } +std::vector NotificationList::getWarningsArray() +{ + std::vector result; + result.reserve(mWarningStack.size()); + + while (mWarningStack.size() > 0) { + auto warning = mWarningStack.top(); + mWarningStack.pop(); + //result->add(error->getString()); + result.push_back(warning->getString()); + delete warning; + } + return result; +} + std::string NotificationList::getErrorsHtml() { std::string res; diff --git a/login_server/src/cpp/lib/NotificationList.h b/login_server/src/cpp/lib/NotificationList.h index 2e04ce708..ecb821ee8 100644 --- a/login_server/src/cpp/lib/NotificationList.h +++ b/login_server/src/cpp/lib/NotificationList.h @@ -11,6 +11,7 @@ #define DR_LUA_WEB_MODULE_ERROR_ERROR_LIST_H #include "Error.h" +#include "Warning.h" #include #include "../tasks/CPUTask.h" @@ -28,11 +29,14 @@ public: // push error, error will be deleted in deconstructor virtual void addError(Notification* error, bool log = true); void addNotification(Notification* notification); + virtual void addWarning(Warning* warning, bool log = true); // return error on top of stack, please delete after using Notification* getLastError(); + Warning* getLastWarning(); inline size_t errorCount() { return mErrorStack.size(); } + inline size_t warningCount() { return mWarningStack.size(); } // delete all errors void clearErrors(); @@ -41,16 +45,19 @@ public: return recv->getErrors(send); } int getErrors(NotificationList* send); + int getWarnings(NotificationList* send); void printErrors(); std::string getErrorsHtml(); std::string getErrorsHtmlNewFormat(); std::vector getErrorsArray(); + std::vector getWarningsArray(); void sendErrorsAsEmail(std::string rawHtml = "", bool copy = false); protected: std::stack mErrorStack; + std::stack mWarningStack; // poco logging Poco::Logger& mLogging; }; diff --git a/login_server/src/cpp/lib/Warning.cpp b/login_server/src/cpp/lib/Warning.cpp new file mode 100644 index 000000000..77bb343cb --- /dev/null +++ b/login_server/src/cpp/lib/Warning.cpp @@ -0,0 +1,58 @@ +#include "Warning.h" +#include + +Warning::Warning(const char* functionName, const char* message) + : Notification(functionName, message) +{ + +} + +Warning::Warning(const std::string& functionName, const std::string& message) + : Notification(functionName, message) +{ + +} + +std::string Warning::getString(bool withNewline/* = true*/) const +{ + std::stringstream ss; + ss << mFunctionName << ": " << mMessage; + if (withNewline) ss << std::endl; + + return ss.str(); +} +std::string Warning::getHtmlString() const +{ + std::stringstream ss; + ss << mFunctionName << ": " << mMessage; + + return ss.str(); +} + +ParamWarning::ParamWarning(const char* functionName, const char* message, std::string param) + : Warning(functionName, message), mParam(param) +{ + +} + +ParamWarning::ParamWarning(const char* functionName, const char* message, int param) + : Warning(functionName, message), mParam(std::to_string(param)) +{ + +} + +std::string ParamWarning::getString(bool withNewline/* = true*/) const +{ + std::stringstream ss; + ss << mFunctionName << ": " << mMessage << " " << mParam; + if (withNewline) ss << std::endl; + + return ss.str(); +} +std::string ParamWarning::getHtmlString() const +{ + std::stringstream ss; + ss << mFunctionName << ": " << mMessage << " " << mParam; + + return ss.str(); +} \ No newline at end of file diff --git a/login_server/src/cpp/lib/Warning.h b/login_server/src/cpp/lib/Warning.h new file mode 100644 index 000000000..8b032d8f0 --- /dev/null +++ b/login_server/src/cpp/lib/Warning.h @@ -0,0 +1,31 @@ +#ifndef GRADIDO_LOGIN_SERVER_LIB_WARNING_H +#define GRADIDO_LOGIN_SERVER_LIB_WARNING_H + +#include "Notification.h" + +class Warning : public Notification +{ +public: + Warning(const char* functionName, const char* message); + Warning(const std::string& functionName, const std::string& message); + + std::string getString(bool withNewline = true) const; + std::string getHtmlString() const; + + virtual bool isWarning() { return true; } +}; + +class ParamWarning : public Warning +{ +public: + ParamWarning(const char* functionName, const char* message, std::string param); + ParamWarning(const char* functionName, const char* message, int param); + + std::string getString(bool withNewline = true) const; + std::string getHtmlString() const; + +protected: + std::string mParam; +}; + +#endif //GRADIDO_LOGIN_SERVER_LIB_WARNING_H \ No newline at end of file diff --git a/login_server/src/cpp/model/gradido/Transaction.cpp b/login_server/src/cpp/model/gradido/Transaction.cpp index 20f47bb83..22ac8937f 100644 --- a/login_server/src/cpp/model/gradido/Transaction.cpp +++ b/login_server/src/cpp/model/gradido/Transaction.cpp @@ -561,17 +561,21 @@ namespace model { Poco::Net::NameValueCollection param; param.set("transaction", base_64_message); auto result = json_request.request("putTransaction", param); - if (JSON_REQUEST_RETURN_OK == result) { + json_request.getWarnings(&json_request); + + if (JSON_REQUEST_RETURN_OK == result) + { if (!json_request.errorCount()) { finishSuccess(); } else { - getErrors(&json_request); + getErrors(&json_request); return -1; } return 1; } + json_request.getWarnings(&json_request); getErrors(&json_request); return -1; From 57afba390162657bf9ede0770915b742897097ad Mon Sep 17 00:00:00 2001 From: Dario Rekowski on RockPI Date: Mon, 7 Jun 2021 15:25:01 +0000 Subject: [PATCH 26/33] fix bug --- .../JsonRequestHandlerController.php | 2 +- .../src/Model/Transactions/TransactionBase.php | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php index c1f7e4701..2677390ed 100644 --- a/community_server/src/Controller/JsonRequestHandlerController.php +++ b/community_server/src/Controller/JsonRequestHandlerController.php @@ -392,7 +392,7 @@ class JsonRequestHandlerController extends AppController { $result['warnings'] = $transaction->getWarnings(); } // success - return $this->returnJson(['state' => 'success']); + return $this->returnJson($result); } else { $this->sendEMailTransactionFailed($transaction, 'save'); diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php index e106b8ac2..6b3817201 100644 --- a/community_server/src/Model/Transactions/TransactionBase.php +++ b/community_server/src/Model/Transactions/TransactionBase.php @@ -10,21 +10,21 @@ class TransactionBase { static $tables = []; public function getErrors() { - return $this->errors; + return $this->errors; } public function getWarnings() { return $this->warnings; } public function addError($functionName, $errorName) { - array_push($this->errors, [$functionName => $errorName]); + array_push($this->errors, [$functionName => $errorName]); } public function addWarning($functionName, $warningName) { - $this->warnings[] = [$functionName => $warningName]; + array_push($this->warnings, [$functionName => $warningName]); } public function addErrors($errors) { - $this->errors = array_merge($this->errors, $errors); + $this->errors = array_merge($this->errors, $errors); } public function addWarnings($warnings) { @@ -32,17 +32,17 @@ class TransactionBase { } public function hasErrors() { - return count($this->errors) > 0; + return count($this->errors) > 0; } public function hasWarnings() { return count($this->warnings) > 0; } public static function getTable($tableName) { - if(!isset(self::$tables[$tableName])) { - self::$tables[$tableName] = TableRegistry::getTableLocator()->get($tableName); - } - return self::$tables[$tableName]; + if(!isset(self::$tables[$tableName])) { + self::$tables[$tableName] = TableRegistry::getTableLocator()->get($tableName); + } + return self::$tables[$tableName]; } From c0c57bd28aa19e3a31cfbdc162167a3fba3005a3 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 7 Jun 2021 17:37:28 +0200 Subject: [PATCH 27/33] add fake delay for passwords which don't match security criteria --- login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp index 59e33e5d0..e82e75dc8 100644 --- a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp +++ b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp @@ -77,7 +77,7 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) Poco::JSON::Object* result = new Poco::JSON::Object; if (!password.size() || !sm->checkPwdValidation(password, &pwd_errors, LanguageManager::getInstance()->getFreeCatalog(LANG_EN))) { - + Poco::Thread::sleep(ServerConfig::g_FakeLoginSleepTime); result->set("state", "error"); result->set("msg", pwd_errors.getLastError()->getString(false)); if (pwd_errors.errorCount()) { From 81a6b2a0a23e0c6021fba4ff8caa2f7a8cb3af07 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 7 Jun 2021 17:39:12 +0200 Subject: [PATCH 28/33] don't give away the info about security criteria of password --- login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp index e82e75dc8..0457b572e 100644 --- a/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp +++ b/login_server/src/cpp/JSONInterface/JsonUnsecureLogin.cpp @@ -79,10 +79,8 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params) if (!password.size() || !sm->checkPwdValidation(password, &pwd_errors, LanguageManager::getInstance()->getFreeCatalog(LANG_EN))) { Poco::Thread::sleep(ServerConfig::g_FakeLoginSleepTime); result->set("state", "error"); - result->set("msg", pwd_errors.getLastError()->getString(false)); - if (pwd_errors.errorCount()) { - result->set("details", pwd_errors.getLastError()->getString(false)); - } + result->set("msg", "password incorrect"); + return result; } From 13c1dd5894258bc37d15b21cb51f840dc2494884 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 8 Jun 2021 10:32:46 +0200 Subject: [PATCH 29/33] fix reviwes --- frontend/src/store/store.test.js | 4 ++-- .../src/views/Pages/UserProfile/UserCard_FormUserData.vue | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/store/store.test.js b/frontend/src/store/store.test.js index 3f466f723..d2fa0fc1d 100644 --- a/frontend/src/store/store.test.js +++ b/frontend/src/store/store.test.js @@ -40,7 +40,7 @@ describe('Vuex store', () => { { commit, state }, { sessionId: 1234, user: { email: 'someone@there.is', language: 'en' } }, ) - expect(commit).toHaveBeenCalledTimes(4) + expect(commit).toHaveBeenCalledTimes(6) }) it('commits sessionId', () => { @@ -74,7 +74,7 @@ describe('Vuex store', () => { it('calls two commits', () => { logout({ commit, state }) - expect(commit).toHaveBeenCalledTimes(3) + expect(commit).toHaveBeenCalledTimes(5) }) it('commits sessionId', () => { diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue index e89a17e84..a1e620f3c 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue @@ -1,4 +1,5 @@