diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 08ecc0379..9f34c7f5e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -106,45 +106,6 @@ jobs: name: docker-database-production_up path: /tmp/database_up.tar - ############################################################################## - # JOB: DOCKER BUILD PRODUCTION LOGIN SERVER ################################## - ############################################################################## - build_production_login_server: - name: Docker Build Production - Login Server - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: recursive - ########################################################################## - # SET ENVS ############################################################### - ########################################################################## - - name: ENV - VERSION - run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV - - name: ENV - BUILD_DATE - run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV - - name: ENV - BUILD_VERSION - run: echo "BUILD_VERSION=${VERSION}.${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV - - name: ENV - BUILD_COMMIT - run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV - ########################################################################## - # LOGIN SERVER ########################################################### - ########################################################################## - - name: Login Server | Build `production` image - run: | - docker build -t "gradido/login_server:latest" -t "gradido/login_server:production" -t "gradido/login_server:${VERSION}" -t "gradido/login_server:${BUILD_VERSION}" login_server/ - docker save "gradido/login_server" > /tmp/login_server.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-login-server-production - path: /tmp/login_server.tar - ############################################################################## # JOB: DOCKER BUILD PRODUCTION COMMUNITY SERVER ############################## ############################################################################## @@ -262,7 +223,7 @@ jobs: upload_to_dockerhub: name: Upload to Dockerhub runs-on: ubuntu-latest - needs: [build_production_frontend, build_production_backend, build_production_database_up, build_production_login_server, build_production_community_server, build_production_mariadb, build_production_nginx] + needs: [build_production_frontend, build_production_backend, build_production_database_up, build_production_community_server, build_production_mariadb, build_production_nginx] env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} @@ -296,13 +257,6 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/database_up.tar - - name: Download Docker Image (Login Server) - uses: actions/download-artifact@v2 - with: - name: docker-login-server-production - path: /tmp - - name: Load Docker Image - run: docker load < /tmp/login_server.tar - name: Download Docker Image (Community Server) uses: actions/download-artifact@v2 with: @@ -335,8 +289,6 @@ jobs: run: docker push --all-tags gradido/backend - name: Push database run: docker push --all-tags gradido/database - - name: Push login_server - run: docker push --all-tags gradido/login_server - name: Push community_server run: docker push --all-tags gradido/community_server - name: Push MariaDB diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b21d0d355..9029afb8e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -107,28 +107,6 @@ jobs: name: docker-database-test_up path: /tmp/database_up.tar - ############################################################################## - # JOB: DOCKER BUILD TEST LOGIN SERVER ######################################## - ############################################################################## - build_test_login_server: - name: Docker Build Test - Login Server - runs-on: ubuntu-latest - #needs: [nothing] - steps: - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: true - ########################################################################## - # BUILD LOGIN SERVER DOCKER IMAGE ######################################## - ########################################################################## - - name: login server | Build `release` image - run: | - docker build -t "gradido/login_server:release" -f ./login_server/Dockerfile login_server/ - ############################################################################## # JOB: DOCKER BUILD TEST COMMUNITY SERVER #################################### ############################################################################## @@ -470,7 +448,7 @@ jobs: report_name: Coverage Admin Interface type: lcov result_path: ./coverage/lcov.info - min_coverage: 78 + min_coverage: 81 token: ${{ github.token }} ############################################################################## @@ -531,73 +509,6 @@ jobs: min_coverage: 38 token: ${{ github.token }} - ############################################################################## - # JOB: UNIT TEST LOGIN-SERVER ############################################### - ############################################################################## - unit_test_login_server: - name: Unit tests - Login-Server - runs-on: ubuntu-latest - needs: [] - services: - mariadb: - image: gradido/mariadb:test - env: - MARIADB_ALLOW_EMPTY_PASSWORD: 1 - MARIADB_USER: root - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" - --health-interval=6s - --health-timeout=3s - --health-retries=4 - steps: - # - name: Debug service - # run: echo "$(docker ps)" - #- name: Debug container choosing script - # run: echo "$(docker container ls | grep mariadb | awk '{ print $1 }')" - - name: get mariadb container id - run: echo "::set-output name=id::$(docker container ls | grep mariadb | awk '{ print $1 }')" - id: mariadb_container - - name: get automatic created network - run: echo "::set-output name=id::$(docker network ls | grep github_network | awk '{ print $1 }')" - id: network - ########################################################################## - # CHECKOUT CODE ########################################################## - ########################################################################## - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: true - # Database migration - - name: Start database migration - run: | - docker build --target production_up -t "gradido/database:production_up" database/ - docker run --network ${{ steps.network.outputs.id }} --name=database --env NODE_ENV=production --env DB_HOST=mariadb --env DB_DATABASE=gradido_community_test -d gradido/database:production_up - ########################################################################## - # Build Login-Server Test Docker image ################################### - ########################################################################## - - name: login server | Build `test` image - run: | - docker build -t "gradido/login_server:test" -f ./login_server/Dockerfiles/ubuntu/Dockerfile.test login_server/ - ########################################################################## - # UNIT TESTS BACKEND LOGIN-SERVER ####################################### - ########################################################################## - - name: Login-Server | Unit tests - run: | - docker run --network container:$(docker container ls | grep mariadb | awk '{ print $1 }') -v ~/coverage:/code/build_cov/coverage -v $(pwd)/configs/login_server:/etc/grd_login gradido/login_server:test - cp -r ~/coverage ./coverage - ########################################################################## - # COVERAGE CHECK BACKEND LOGIN-SERVER #################################### - ########################################################################## - - name: backend login | Coverage check - uses: webcraftmedia/coverage-check-action@master - with: - report_name: Coverage Backend Login - type: lcov - result_path: ./coverage/coverage.info - min_coverage: 34 - token: ${{ github.token }} - ############################################################################## # JOB: UNIT TEST COMMUNITY-SERVER ########################################### ############################################################################## @@ -627,11 +538,6 @@ jobs: - name: get database migration container id run: echo "::set-output name=id::$(docker container ls | grep database | awk '{ print $1 }')" id: database_container - - name: Start Login-Server - run: docker run --network ${{ steps.network.outputs.id }} --name=login-server -d gradido/login_server:with-config - - name: get login-server container id - run: echo "::set-output name=id::$(docker container ls | grep login_server | awk '{ print $1 }')" - id: login_server_container ########################################################################## # CHECKOUT CODE ########################################################## ########################################################################## @@ -647,9 +553,6 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/community_server.tar - # for debugging login-server - - name: check login-server - run: docker logs ${{ steps.login_server_container.outputs.id }} - name: check mariadb run: docker logs ${{ steps.mariadb_container.outputs.id }} - name: check migration diff --git a/.gitmodules b/.gitmodules index 22790ccc7..e884aaf3e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,34 +3,6 @@ url = https://github.com/gradido/gn.git branch = master -[submodule "login_server/dependencies/tinf"] - path = login_server/dependencies/tinf - url = https://github.com/jibsen/tinf.git -[submodule "login_server/dependencies/mariadb-connector-c"] - path = login_server/dependencies/mariadb-connector-c - url = https://github.com/MariaDB/mariadb-connector-c.git -[submodule "login_server/src/proto"] - path = login_server/src/proto - url = https://github.com/gradido/gradido_protocol.git -[submodule "login_server/dependencies/spirit-po"] - path = login_server/dependencies/spirit-po - url = https://github.com/cbeck88/spirit-po.git -[submodule "login_server/dependencies/poco"] - path = login_server/dependencies/poco - url = https://github.com/pocoproject/poco.git -[submodule "login_server/dependencies/cmake-modules"] - path = login_server/dependencies/cmake-modules - url = https://github.com/viaduck/cmake-modules.git - [submodule "community_server/src/protobuf"] path = community_server/src/protobuf url = https://github.com/gradido/gradido_protocol.git -[submodule "login_server/dependencies/libsodium"] - path = login_server/dependencies/libsodium - url = https://github.com/jedisct1/libsodium.git -[submodule "login_server/src/proto"] - path = login_server/src/proto - url = https://github.com/gradido/gradido_protocol.git -[submodule "login_server/dependencies/protobuf"] - path = login_server/dependencies/protobuf - url = https://github.com/protocolbuffers/protobuf.git diff --git a/README.md b/README.md index 355a40b82..4b0a3b6fd 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,6 @@ docker-compose -f docker-compose.yml up - [frontend](./frontend) Wallet frontend - [backend](./backend) GraphQL & Business logic backend - [mariadb](./mariadb) Database backend -- [login_server](./login_server) User credential storage & business logic backend - [community_server](./community_server/) Business logic backend We are currently restructuring the service to reduce dependencies and unify business logic into one place. Furthermore the databases defined for each service will be unified into one. diff --git a/admin/package.json b/admin/package.json index e38d21af8..11ca864c9 100644 --- a/admin/package.json +++ b/admin/package.json @@ -12,7 +12,7 @@ "dev": "yarn run serve", "build": "vue-cli-service build", "lint": "eslint --ext .js,.vue .", - "test": "jest --coverage", + "test": "TZ=UTC jest --coverage", "locales": "scripts/missing-keys.sh && scripts/sort.sh" }, "dependencies": { @@ -36,14 +36,12 @@ "graphql": "^15.6.1", "identity-obj-proxy": "^3.0.0", "jest": "26.6.3", - "moment": "^2.29.1", "regenerator-runtime": "^0.13.9", "stats-webpack-plugin": "^0.7.0", "vue": "^2.6.11", "vue-apollo": "^3.0.8", "vue-i18n": "^8.26.5", "vue-jest": "^3.0.7", - "vue-moment": "^4.1.0", "vue-router": "^3.5.3", "vue-toasted": "^1.1.28", "vuex": "^3.6.2", diff --git a/admin/src/components/CreationFormular.spec.js b/admin/src/components/CreationFormular.spec.js index b3807b16f..cfc23fa26 100644 --- a/admin/src/components/CreationFormular.spec.js +++ b/admin/src/components/CreationFormular.spec.js @@ -5,14 +5,6 @@ import { createPendingCreations } from '../graphql/createPendingCreations' const localVue = global.localVue -const apolloMock = jest.fn().mockResolvedValue({ - data: { - verifyLogin: { - name: 'success', - id: 0, - }, - }, -}) const apolloMutateMock = jest.fn().mockResolvedValue({ data: { createPendingCreation: [0, 0, 0], @@ -23,19 +15,12 @@ const toastedErrorMock = jest.fn() const toastedSuccessMock = jest.fn() const mocks = { - $t: jest.fn((t) => t), - $moment: jest.fn(() => { - return { - format: jest.fn((m) => m), - subtract: jest.fn(() => { - return { - format: jest.fn((m) => m), - } - }), - } + $t: jest.fn((t, options) => (options ? [t, options] : t)), + $d: jest.fn((d) => { + const date = new Date(d) + return date.toISOString().split('T')[0] }), $apollo: { - query: apolloMock, mutate: apolloMutateMock, }, $store: { @@ -56,7 +41,12 @@ const mocks = { const propsData = { type: '', creation: [], - itemsMassCreation: {}, +} + +const now = new Date(Date.now()) +const getCreationDate = (sub) => { + const date = sub === 0 ? now : new Date(now.getFullYear(), now.getMonth() - sub, 1, 0) + return date.toISOString().split('T')[0] } describe('CreationFormular', () => { @@ -75,21 +65,24 @@ describe('CreationFormular', () => { expect(wrapper.find('.component-creation-formular').exists()).toBeTruthy() }) - describe('server sends back moderator data', () => { - it('called store commit with mocked data', () => { - expect(stateCommitMock).toBeCalledWith('moderator', { name: 'success', id: 0 }) - }) - }) - - describe('server throws error for moderator data call', () => { - beforeEach(() => { - jest.clearAllMocks() - apolloMock.mockRejectedValueOnce({ message: 'Ouch!' }) - wrapper = Wrapper() + describe('text and value form props', () => { + beforeEach(async () => { + wrapper = mount(CreationFormular, { + localVue, + mocks, + propsData: { + creationUserData: { memo: 'Memo from property', amount: 42 }, + ...propsData, + }, + }) }) - it('has called store commit with fake data', () => { - expect(stateCommitMock).toBeCalledWith('moderator', { id: 0, name: 'Test Moderator' }) + it('has text taken from props', () => { + expect(wrapper.vm.text).toBe('Memo from property') + }) + + it('has value taken from props', () => { + expect(wrapper.vm.value).toBe(42) }) }) @@ -98,52 +91,6 @@ describe('CreationFormular', () => { expect(wrapper.findAll('input[type="radio"]').length).toBe(3) }) - describe('with mass creation', () => { - beforeEach(async () => { - jest.clearAllMocks() - await wrapper.setProps({ type: 'massCreation', creation: [200, 400, 600] }) - await wrapper.setData({ rangeMin: 180 }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) - }) - - describe('first radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(0).setChecked() - }) - - it('emits update-radio-selected with index 0', () => { - expect(wrapper.emitted()['update-radio-selected']).toEqual([ - [expect.arrayContaining([0])], - ]) - }) - }) - - describe('second radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(1).setChecked() - }) - - it('emits update-radio-selected with index 1', () => { - expect(wrapper.emitted()['update-radio-selected']).toEqual([ - [expect.arrayContaining([1])], - ]) - }) - }) - - describe('third radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(2).setChecked() - }) - - it('emits update-radio-selected with index 2', () => { - expect(wrapper.emitted()['update-radio-selected']).toEqual([ - [expect.arrayContaining([2])], - ]) - }) - }) - }) - describe('with single creation', () => { beforeEach(async () => { jest.clearAllMocks() @@ -153,17 +100,17 @@ describe('CreationFormular', () => { item: { email: 'benjamin@bluemchen.de' }, }) await wrapper.findAll('input[type="radio"]').at(1).setChecked() - await wrapper.find('textarea').setValue('Test create coins') await wrapper.find('input[type="number"]').setValue(90) }) describe('first radio button', () => { beforeEach(async () => { await wrapper.findAll('input[type="radio"]').at(0).setChecked() + await wrapper.find('textarea').setValue('Test create coins') }) it('sets rangeMax to 200', () => { - expect(wrapper.vm.rangeMax).toBe(400) + expect(wrapper.vm.rangeMax).toBe(200) }) describe('sendForm', () => { @@ -177,7 +124,7 @@ describe('CreationFormular', () => { mutation: createPendingCreation, variables: { email: 'benjamin@bluemchen.de', - creationDate: 'YYYY-MM-01', + creationDate: getCreationDate(2), amount: 90, memo: 'Test create coins', moderator: 0, @@ -185,9 +132,30 @@ describe('CreationFormular', () => { }), ) }) + + it('emits update-user-data', () => { + expect(wrapper.emitted('update-user-data')).toEqual([ + [{ email: 'benjamin@bluemchen.de' }, [0, 0, 0]], + ]) + }) + + it('toasts a success message', () => { + expect(toastedSuccessMock).toBeCalledWith([ + 'creation_form.toasted', + { email: 'benjamin@bluemchen.de', value: '90' }, + ]) + }) + + it('updates open creations in store', () => { + expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 1) + }) + + it('resets the form data', () => { + expect(wrapper.vm.value).toBe(0) + }) }) - describe('sendForm', () => { + describe('sendForm with server error', () => { beforeEach(async () => { apolloMutateMock.mockRejectedValueOnce({ message: 'Ouch!' }) await wrapper.find('.test-submit').trigger('click') @@ -373,9 +341,18 @@ describe('CreationFormular', () => { }) }) - describe('with mass creation', () => { + describe('mass creation with success', () => { beforeEach(async () => { jest.clearAllMocks() + apolloMutateMock.mockResolvedValue({ + data: { + createPendingCreations: { + success: true, + successfulCreation: ['bob@baumeister.de', 'bibi@bloxberg.de'], + failedCreation: [], + }, + }, + }) await wrapper.setProps({ type: 'massCreation', creation: [200, 400, 600], @@ -395,14 +372,14 @@ describe('CreationFormular', () => { pendingCreations: [ { email: 'bob@baumeister.de', - creationDate: 'YYYY-MM-01', + creationDate: getCreationDate(1), amount: 200, memo: 'Test mass create coins', moderator: 0, }, { email: 'bibi@bloxberg.de', - creationDate: 'YYYY-MM-01', + creationDate: getCreationDate(1), amount: 200, memo: 'Test mass create coins', moderator: 0, @@ -412,6 +389,73 @@ describe('CreationFormular', () => { }), ) }) + + it('updates open creations in store', () => { + expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 2) + }) + + it('emits remove-all-bookmark', () => { + expect(wrapper.emitted('remove-all-bookmark')).toBeTruthy() + }) + }) + + describe('mass creation with success but all failed', () => { + beforeEach(async () => { + jest.clearAllMocks() + apolloMutateMock.mockResolvedValue({ + data: { + createPendingCreations: { + success: true, + successfulCreation: [], + failedCreation: ['bob@baumeister.de', 'bibi@bloxberg.de'], + }, + }, + }) + await wrapper.setProps({ + type: 'massCreation', + creation: [200, 400, 600], + items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }], + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('textarea').setValue('Test mass create coins') + await wrapper.find('input[type="number"]').setValue(200) + await wrapper.find('.test-submit').trigger('click') + }) + + it('updates open creations in store', () => { + expect(stateCommitMock).toBeCalledWith('openCreationsPlus', 0) + }) + + it('toasts two errors', () => { + expect(toastedErrorMock).toBeCalledWith( + 'Could not created PendingCreation for bob@baumeister.de', + ) + expect(toastedErrorMock).toBeCalledWith( + 'Could not created PendingCreation for bibi@bloxberg.de', + ) + }) + }) + + describe('mass creation with error', () => { + beforeEach(async () => { + jest.clearAllMocks() + apolloMutateMock.mockRejectedValue({ + message: 'Oh no!', + }) + await wrapper.setProps({ + type: 'massCreation', + creation: [200, 400, 600], + items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }], + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('textarea').setValue('Test mass create coins') + await wrapper.find('input[type="number"]').setValue(200) + await wrapper.find('.test-submit').trigger('click') + }) + + it('toasts an error message', () => { + expect(toastedErrorMock).toBeCalledWith('Oh no!') + }) }) }) }) diff --git a/admin/src/components/CreationFormular.vue b/admin/src/components/CreationFormular.vue index 3c8c914e2..34df13e11 100644 --- a/admin/src/components/CreationFormular.vue +++ b/admin/src/components/CreationFormular.vue @@ -7,51 +7,15 @@ - - - - - - - - - - - - - - - + - -
+
@@ -62,7 +26,6 @@ :max="rangeMax" > -
-
+
@@ -100,18 +63,17 @@ variant="success" class="test-submit" @click="submitCreation" - :disabled="radioSelected === '' || value <= 0 || text.length < 10" + :disabled="selected === '' || value <= 0 || text.length < 10" > {{ $t('creation_form.update_creation') }} - {{ $t('creation_form.submit_creation') }} @@ -123,11 +85,12 @@
diff --git a/admin/src/components/EditCreationFormular.spec.js b/admin/src/components/EditCreationFormular.spec.js index ed0f412ba..84d3e26d3 100644 --- a/admin/src/components/EditCreationFormular.spec.js +++ b/admin/src/components/EditCreationFormular.spec.js @@ -7,8 +7,9 @@ const apolloMutateMock = jest.fn().mockResolvedValue({ data: { updatePendingCreation: { creation: [0, 0, 0], + amount: 500, date: new Date(), - memo: 'qwertzuiopasdfghjkl', + memo: 'Test Schöpfung 2', moderator: 0, }, }, @@ -20,15 +21,9 @@ const toastedSuccessMock = jest.fn() const mocks = { $t: jest.fn((t) => t), - $moment: jest.fn(() => { - return { - format: jest.fn((m) => m), - subtract: jest.fn(() => { - return { - format: jest.fn((m) => m), - } - }), - } + $d: jest.fn((d) => { + const date = new Date(d) + return date.toISOString().split('T')[0] }), $apollo: { mutate: apolloMutateMock, @@ -48,12 +43,18 @@ const mocks = { }, } +const now = new Date(Date.now()) +const getCreationDate = (sub) => { + const date = sub === 0 ? now : new Date(now.getFullYear(), now.getMonth() - sub, 1, 0) + return date.toISOString().split('T')[0] +} + const propsData = { creation: [200, 400, 600], creationUserData: { memo: 'Test schöpfung 1', amount: 100, - date: '2021-12-01', + date: getCreationDate(0), }, item: { id: 0, @@ -82,196 +83,79 @@ describe('EditCreationFormular', () => { expect(wrapper.findAll('input[type="radio"]').length).toBe(3) }) - describe('with single creation', () => { + it('has the third radio button checked', () => { + expect(wrapper.findAll('input[type="radio"]').at(0).element.checked).toBeFalsy() + expect(wrapper.findAll('input[type="radio"]').at(1).element.checked).toBeFalsy() + expect(wrapper.findAll('input[type="radio"]').at(2).element.checked).toBeTruthy() + }) + + it('has rangeMax of 700', () => { + expect(wrapper.find('input[type="number"]').attributes('max')).toBe('700') + }) + + describe('change and save memo and value with success', () => { beforeEach(async () => { - jest.clearAllMocks() - await wrapper.setProps({ creation: [200, 400, 600] }) - await wrapper.setData({ rangeMin: 180 }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) + await wrapper.find('input[type="number"]').setValue(500) + await wrapper.find('textarea').setValue('Test Schöpfung 2') + await wrapper.find('.test-submit').trigger('click') }) - describe('first radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(0).setChecked() - }) - - it('sets rangeMin to 0', () => { - expect(wrapper.vm.rangeMin).toBe(0) - }) - - it('sets rangeMax to 200', () => { - expect(wrapper.vm.rangeMax).toBe(200) - }) - - describe('sendForm', () => { - beforeEach(async () => { - await wrapper.find('.test-submit').trigger('click') - }) - - it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalledWith( - expect.objectContaining({ - variables: { - amount: 90, - creationDate: 'YYYY-MM-01', - email: 'bob@baumeister.de', - id: 0, - memo: 'Test create coins', - moderator: 0, - }, - }), - ) - }) - - it('emits update-user-data', () => { - expect(wrapper.emitted('update-user-data')).toBeTruthy() - expect(wrapper.emitted('update-user-data')).toEqual([ - [ - { - id: 0, - email: 'bob@baumeister.de', - }, - [0, 0, 0], - ], - ]) - }) - - it('toast success message', () => { - expect(toastedSuccessMock).toBeCalledWith('creation_form.toasted_update') - }) - - describe('sendForm with error', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutateMock.mockRejectedValue({ - message: 'Ouch!', - }) - wrapper = Wrapper() - await wrapper.setProps({ type: 'singleCreation', creation: [200, 400, 600] }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) - await wrapper.findAll('input[type="radio"]').at(0).setChecked() - await wrapper.setData({ rangeMin: 100 }) - await wrapper.find('.test-submit').trigger('click') - }) - - it('toast error message', () => { - expect(toastedErrorMock).toBeCalledWith('Ouch!') - }) - }) - }) + it('calls the API', () => { + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + variables: { + id: 0, + email: 'bob@baumeister.de', + creationDate: getCreationDate(0), + amount: 500, + memo: 'Test Schöpfung 2', + moderator: 0, + }, + }), + ) }) - describe('second radio button', () => { - beforeEach(async () => { - await wrapper.findAll('input[type="radio"]').at(1).setChecked() - }) - - it('sets rangeMin to 0', () => { - expect(wrapper.vm.rangeMin).toBe(0) - }) - - it('sets rangeMax to 400', () => { - expect(wrapper.vm.rangeMax).toBe(400) - }) - - describe('sendForm', () => { - beforeEach(async () => { - await wrapper.find('.test-submit').trigger('click') - }) - - it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalledWith( - expect.objectContaining({ - variables: { - amount: 90, - creationDate: 'YYYY-MM-01', - email: 'bob@baumeister.de', - id: 0, - memo: 'Test create coins', - moderator: 0, - }, - }), - ) - }) - - describe('sendForm with error', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutateMock.mockRejectedValue({ - message: 'Ouch!', - }) - wrapper = Wrapper() - await wrapper.setProps({ creation: [200, 400, 600] }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 100 }) - await wrapper.findAll('input[type="radio"]').at(1).setChecked() - await wrapper.setData({ rangeMin: 180 }) - await wrapper.find('.test-submit').trigger('click') - }) - - it('toast error message', () => { - expect(toastedErrorMock).toBeCalledWith('Ouch!') - }) - }) - }) + it('emits update-user-data', () => { + expect(wrapper.emitted('update-user-data')).toEqual([ + [ + { + id: 0, + email: 'bob@baumeister.de', + }, + [0, 0, 0], + ], + ]) }) - describe('third radio button', () => { - beforeEach(async () => { - await wrapper.setData({ rangeMin: 180 }) - await wrapper.findAll('input[type="radio"]').at(2).setChecked() - }) + it('emits update-creation-data', () => { + expect(wrapper.emitted('update-creation-data')).toEqual([ + [ + { + amount: 500, + date: expect.any(Date), + memo: 'Test Schöpfung 2', + moderator: 0, + row: expect.any(Object), + }, + ], + ]) + }) - it('sets rangeMin to 180', () => { - expect(wrapper.vm.rangeMin).toBe(180) - }) + it('toasts a success message', () => { + expect(toastedSuccessMock).toBeCalledWith('creation_form.toasted_update') + }) + }) - it('sets rangeMax to 700', () => { - expect(wrapper.vm.rangeMax).toBe(700) - }) + describe('change and save memo and value with error', () => { + beforeEach(async () => { + apolloMutateMock.mockRejectedValue({ message: 'Oh no!' }) + await wrapper.find('input[type="number"]').setValue(500) + await wrapper.find('textarea').setValue('Test Schöpfung 2') + await wrapper.find('.test-submit').trigger('click') + }) - describe('sendForm with success', () => { - beforeEach(async () => { - await wrapper.find('.test-submit').trigger('click') - }) - - it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalledWith( - expect.objectContaining({ - variables: { - amount: 90, - creationDate: 'YYYY-MM-DD', - email: 'bob@baumeister.de', - id: 0, - memo: 'Test create coins', - moderator: 0, - }, - }), - ) - }) - }) - - describe('sendForm with error', () => { - beforeEach(async () => { - jest.clearAllMocks() - apolloMutateMock.mockRejectedValue({ - message: 'Ouch!', - }) - wrapper = Wrapper() - await wrapper.setProps({ creation: [200, 400, 600] }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) - await wrapper.findAll('input[type="radio"]').at(2).setChecked() - await wrapper.setData({ rangeMin: 180 }) - await wrapper.find('.test-submit').trigger('click') - }) - - it('toast error message', () => { - expect(toastedErrorMock).toBeCalledWith('Ouch!') - }) - }) + it('toasts an error message', () => { + expect(toastedErrorMock).toBeCalledWith('Oh no!') }) }) }) diff --git a/admin/src/components/EditCreationFormular.vue b/admin/src/components/EditCreationFormular.vue index 2fa45dd8e..650b00410 100644 --- a/admin/src/components/EditCreationFormular.vue +++ b/admin/src/components/EditCreationFormular.vue @@ -6,65 +6,14 @@
- - - - - - - - - - - - - - - + -
@@ -76,7 +25,6 @@ :max="rangeMax" > - {{ $t('creation_form.update_creation') }} @@ -126,8 +74,11 @@ - - <% } else if(state == PAGE_ASK_PASSPHRASE) { %> - - - -
-
-
-
-

<%= gettext("Deine E-Mail Adresse wurde erfolgreich bestätigt.") %>

-
-
-
-
<%= gettext("Neue Gradido Adresse anlegen / wiederherstellen") %>
-

<%= gettext("Möchtest du ein neues Gradido-Konto anlegen oder ein bestehendes wiederherstellen?") %>

- -
-
-
-
-
- -
-
- -
-
-
- - -
- -
-
-
-
- -
-
- <% } else if(state == PAGE_FORCE_ASK_PASSPHRASE) { %> -
-
-
-
<%= gettext("Konto wiederherstellen / Neues Passwort anlegen") %>
-
-

<%= gettext("Um dein Konto wiederherzustellen und dir ein Neues Passwort auswählen zu können, tippe hier bitte die Wörter deiner Passphrase in der richtigen Reihenfolge ein, welche du dir aufgeschrieben hast.") %>

-
-
- - -
-
-
-
- <% } else { %> -
-
-
-
-
<%= gettext("Fehler") %>
-

<%= gettext("Ungültige Seite, wenn du das siehst stimmt hier etwas nicht. Bitte wende dich an den Server-Admin.") %>

-
-
-
-
- <% } %> -
-
-<%@ include file="include/footer_ripple.cpsp" %> diff --git a/login_server/src/cpsp/Register.cpsp b/login_server/src/cpsp/Register.cpsp deleted file mode 100644 index 4a806de59..000000000 --- a/login_server/src/cpsp/Register.cpsp +++ /dev/null @@ -1,85 +0,0 @@ -<%@ page class="RegisterPage" %> -<%@ page form="true" %> -<%@ page baseClass="PageRequestMessagedHandler" %> -<%@ header include="HTTPInterface/PageRequestMessagedHandler.h" %> -<%! -#include "SingletonManager/SessionManager.h" -#include "Poco/Net/HTTPCookie.h" -%> -<%% - const char* pageName = "Registrieren"; - auto sm = SessionManager::getInstance(); - - bool userReturned = false; - - if(!form.empty()) { - if(form.get("register-password2", "") != form.get("register-password", "")) { - addError(new Error("Passwort", "Passwörter sind nicht identisch."), false); - } else { - auto session = sm->getSession(request); - if(!session) { - session = sm->getNewSession(); - auto user_host = request.clientAddress().host(); - session->setClientIp(user_host); - response.addCookie(session->getLoginCookie()); - } - - userReturned = session->createUserDirect( - form.get("register-first-name", ""), - form.get("register-last-name", ""), - form.get("register-email", ""), - form.get("register-password", ""), - getBaseUrl() - ); - getErrors(session); - } - - } else { - // on enter login page with empty form - // remove old cookies if exist - sm->deleteLoginCookies(request, response); - } -%><%@ include file="include/header_old.cpsp" %> -
-

Einen neuen Account anlegen

- <%= getErrorsHtml() %> - <% if(!form.empty() && userReturned) {%> -
-
- Deine Anmeldung wird verarbeitet und es wird dir eine E-Mail zugeschickt. - Wenn sie da ist, befolge ihren Anweisungen. -
-
- <% } else { %> -
- -
- Account anlegen -

Bitte gebe deine Daten um einen Account anzulegen

-

- - "/> -

-

- - "/> -

-

- - "/> -

-

- - -

-

- - -

-
- - -
- <% } %> -
-<%@ include file="include/footer.cpsp" %> diff --git a/login_server/src/cpsp/RegisterAdmin.cpsp b/login_server/src/cpsp/RegisterAdmin.cpsp deleted file mode 100644 index 1711dc5b0..000000000 --- a/login_server/src/cpsp/RegisterAdmin.cpsp +++ /dev/null @@ -1,88 +0,0 @@ -<%@ page class="RegisterAdminPage" %> -<%@ page form="true" %> -<%@ page baseClass="SessionHTTPRequestHandler" %> -<%@ page ctorArg="Session*" %> -<%@ header include="HTTPInterface/SessionHTTPRequestHandler.h" %> -<%! -#include "SingletonManager/SessionManager.h" -#include "controller/Group.h" -#include "lib/DataTypeConverter.h" - -#include "Poco/Net/HTTPCookie.h" -#include "ServerConfig.h" - -%> -<%% - const char* pageName = "Admin Registrieren"; - auto sm = SessionManager::getInstance(); - - bool userReturned = false; - - if(!form.empty()) { - auto group_id_string = form.get("register-group", "0"); - int group_id = 0; - if(!sm->isValid(group_id_string, VALIDATE_ONLY_INTEGER)) { - addError(new Error("Group id", "group_id not integer")); - } else { - if(DataTypeConverter::strToInt(group_id_string, group_id) != DataTypeConverter::NUMBER_PARSE_OKAY) { - addError(new Error("Int Convert Error", "Error converting group_id to int")); - } - } - if(!errorCount()) { - userReturned = mSession->adminCreateUser( - form.get("register-first-name", ""), - form.get("register-last-name", ""), - form.get("register-email", ""), - group_id, - getBaseUrl() - ); - getErrors(mSession); - } - - } - - auto groups = controller::Group::listAll(); - - -%><%@ include file="include/header_old.cpsp" %> -
-

Einen neuen Account anlegen

- <%= getErrorsHtml() %> - <% if(!form.empty() && userReturned) {%> -
-
- Die Anmeldung wird verarbeitet und es wird dem Benutzer eine Aktivierungs-E-Mail zugeschickt. -
-
- Zurück - <% } else { %> -
- -
- Account anlegen -

Bitte gebe die Benutzer-Daten ein um einen Account anzulegen

-

- - "/> -

-

- - "/> -

-

- - "/> -

- -
- - -
- <% } %> -
-<%@ include file="include/footer.cpsp" %> diff --git a/login_server/src/cpsp/RegisterDirect.cpsp b/login_server/src/cpsp/RegisterDirect.cpsp deleted file mode 100644 index 7892a9e97..000000000 --- a/login_server/src/cpsp/RegisterDirect.cpsp +++ /dev/null @@ -1,102 +0,0 @@ -<%@ page class="RegisterDirectPage" %> -<%@ page form="true" %> -<%@ page baseClass="PageRequestMessagedHandler" %> -<%@ header include="HTTPInterface/PageRequestMessagedHandler.h" %> -<%! -#include "SingletonManager/SessionManager.h" -#include "controller/Group.h" -#include "lib/DataTypeConverter.h" -#include "Poco/Net/HTTPCookie.h" - -%> -<%% - const char* pageName = "Registrieren"; - auto sm = SessionManager::getInstance(); - - bool userReturned = false; - std::string caller_uri; - - if(!form.empty()) { - - caller_uri = form.get("caller_uri", ""); - - if(form.get("register-password2", "") != form.get("register-password", "")) { - addError(new Error("Passwort", "Passwörter sind nicht identisch."), false); - } else { - auto session = sm->getSession(request); - if(!session) { - session = sm->getNewSession(); - auto user_host = request.clientAddress().host(); - session->setClientIp(user_host); - session->setCallerUri(caller_uri); - response.addCookie(session->getLoginCookie()); - } - printf("caller uri after session: %s\n", caller_uri.data()); - auto email = form.get("register-email", ""); - auto password = form.get("register-password", ""); - if(email != "" && password != "") { - - userReturned = session->createUserDirect( - form.get("register-first-name", ""), - form.get("register-last-name", ""), - email, - password, - getBaseUrl() - ); - } - - getErrors(session); - - if(!errorCount() && userReturned) { - auto user_host = request.clientAddress().host(); - session->setClientIp(user_host); - response.addCookie(session->getLoginCookie()); - if(caller_uri == "") { - caller_uri = session->getCallerUri(); - } - if(caller_uri != "") { - std::string redirect_url = caller_uri; - redirect_url += "?session_id=" + std::to_string(session->getHandle()); - response.redirect(redirect_url); - return; - } - auto user = session->getNewUser(); - if(user->getModel()->getGroupId() == 0) { - response.redirect(getBaseUrl() + "/userUpdateGroup"); - } else { - response.redirect(user->getGroupBaseUrl()); - } - return; - } - } - - } else { - // on enter login page with empty form - // remove old cookies if exist - sm->deleteLoginCookies(request, response); - } - - -%><%@ include file="include/header.cpsp" %> -<%= getErrorsHtml() %> -
-
-

Einen neuen Account anlegen

-
-
-
-

Bitte gib deine Daten um einen Account anzulegen:

- - "/> - - "/> - - "/> - - - - - -
-
-<%@ include file="include/footer.cpsp" %> diff --git a/login_server/src/cpsp/ResetPassword.cpsp b/login_server/src/cpsp/ResetPassword.cpsp deleted file mode 100644 index 093b0e13f..000000000 --- a/login_server/src/cpsp/ResetPassword.cpsp +++ /dev/null @@ -1,166 +0,0 @@ -<%@ page class="ResetPasswordPage" %> -<%@ page form="true" %> -<%@ page baseClass="PageRequestMessagedHandler" %> -<%@ header include="HTTPInterface/PageRequestMessagedHandler.h" %> -<%! -#include "SingletonManager/LanguageManager.h" -#include "SingletonManager/SessionManager.h" -#include "SingletonManager/EmailManager.h" -#include "controller/User.h" -#include "controller/UserBackup.h" - -enum PageState { - PAGE_EMAIL_ASK, - PAGE_ASK, - PAGE_WAIT_EMAIL, - PAGE_WAIT_ADMIN, - PAGE_EMAIL_ALREADY_SEND -}; -%><%% - PageState state = PAGE_EMAIL_ASK; - auto lm = LanguageManager::getInstance(); - auto sm = SessionManager::getInstance(); - auto adminReceiver = EmailManager::getInstance()->getAdminReceiver(); - - const char* pageName = "Passwort vergessen"; - auto lang = chooseLanguage(request); - - // class="btn btn-outline-secondary flag-btn" - // class="btn btn-secondary disabled flag-btn" disabled - std::string eng_btn_classes = ""; - std::string de_btn_classes = ""; - - auto langCatalog = lm->getFreeCatalog(lang); - - std::string emailInputClass = "form-control"; - std::string passphraseRadioClass = "group"; - - std::string email = ""; - - if(!form.empty()) { - auto session = sm->getNewSession(); - email = form.get("email", ""); - auto passphraseMemorized = form.get("passphrase_memorized", ""); - auto user = controller::User::create(); - auto ask = form.get("ask_passphrase", ""); - - if(email != "") - { - bool user_exist = false; - bool sendUserEmail = false; - - if(!sm->isValid(email, VALIDATE_EMAIL)) { - addError(new Error(gettext(session, "E-Mail"), gettext(session, "Das ist keine gültige E-Mail Adresse")), false); - emailInputClass += " is-invalid"; - } - user_exist = user->load(email) == 1; - - if(ask == "true") - { - if(passphraseMemorized == "") { - addError(new Error(gettext(session, "Passphrase"), gettext(session, "Bitte wähle eine Option aus.")), false); - passphraseRadioClass += " group-is-invalid"; - } else if(passphraseMemorized == "true") { - sendUserEmail = true; - } - - } - else - { - if(user_exist && (!user->tryLoadPassphraseUserBackup() || !user->hasPublicKey())) { - sendUserEmail = true; - } - } - - if(!errorCount()) - { - // send reset password email - int result = 0; - if(user_exist) { - result = session->sendResetPasswordEmail(user, sendUserEmail, ServerConfig::g_serverPath + "/checkEmail"); - } - - if(2 == result) { - state = PAGE_EMAIL_ALREADY_SEND; - } else if(sendUserEmail) { - state = PAGE_WAIT_EMAIL; - } else { - state = PAGE_WAIT_ADMIN; - } - } - } - else - { - addError(new Error(gettext(session, "E-Mail"), gettext(session, "E-Mail Adresse nicht angegeben.")), false); - emailInputClass += " is-invalid"; - } - - } - - -%><%@ include file="include/header.cpsp" %> - <%= getErrorsHtml() %> -
-
-

Passwort zurücksetzen

-
- <% if(state == PAGE_EMAIL_ASK) { %> -
-
-
-
- - -
- -
-
-
- <% } else if(state == PAGE_ASK) { %> -
- <%@ include file="include/flags.cpsp" %> -
- - - - -
-
- -
-
- -
-
- -
- -
- <% } else if(state == PAGE_WAIT_EMAIL) { %> - <%= langCatalog->gettext("Dir wird eine E-Mail zugeschickt um dein Passwort zurückzusetzen.") %> - <% } else if(state == PAGE_WAIT_ADMIN) { %> - <%= langCatalog->gettext("Der Admin hat eine E-Mail bekommen und wird sich bei dir melden.") %> - <% } else if(state == PAGE_EMAIL_ALREADY_SEND) { %> -

<%= langCatalog->gettext("Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-Verzeichnis nach. ") %>

-

<%= langCatalog->gettext("Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten gewartet?") %>

-

<%= langCatalog->gettext("E-Mail an Support schicken")%>

- <% } %> -
- - - - - -<%@ include file="include/footer.cpsp" %> - diff --git a/login_server/src/cpsp/SaveKeys.cpsp b/login_server/src/cpsp/SaveKeys.cpsp deleted file mode 100644 index ded9dc3f5..000000000 --- a/login_server/src/cpsp/SaveKeys.cpsp +++ /dev/null @@ -1,137 +0,0 @@ -<%@ page class="SaveKeysPage" %> -<%@ page baseClass="SessionHTTPRequestHandler" %> -<%@ page ctorArg="Session*" %> -<%@ header include="HTTPInterface/SessionHTTPRequestHandler.h" %> -<%@ page form="true" %> -<%! -#include "Poco/Net/HTTPServerParams.h" - -enum PageState -{ - PAGE_ASK, - PAGE_SHOW_PUBKEY, - PAGE_ERROR -}; - -%> -<%% - const char* pageName = "Daten auf Server speichern?"; - bool hasErrors = mSession->errorCount() > 0; - // crypto key only in memory, if user has tipped in his passwort in this session - auto user = mSession->getNewUser(); - bool hasPassword = user->getModel()->hasPrivateKeyEncrypted(); - PageState state = PAGE_ASK; - auto uri_start = ServerConfig::g_php_serverPath;//request.serverParams().getServerName(); - - // skip asking user if he like to save keys and passphrase on server for now! - state = PAGE_SHOW_PUBKEY; - if(!mSession->generateKeys(true, true)) { - getErrors(mSession); - } - /* - if(!form.empty()) { - // privkey - auto savePrivkeyChoice = form.get("save-privkey"); - bool savePrivkey = false; - if(savePrivkeyChoice == "yes") { - if(!hasPassword) { - // check pwd - auto pwd = form.get("save-privkey-password", ""); - - if(!mSession->isPwdValid(pwd)) { - addError(new Error("Passwort", "Das Passwort stimmt nicht. Bitte verwende dein Passwort von der Registrierung"), false); - hasErrors = true; - } else { - savePrivkey = true; - } - } else { - savePrivkey = true; - } - } - if(!hasErrors) { - auto savePassphraseChoice = form.get("save-passphrase"); - bool savePassphrase = false; - if(savePassphraseChoice == "yes") { - savePassphrase = true; - } - if(!mSession->generateKeys(savePrivkey, savePassphrase)) { - hasErrors = true; - } else if(mSession->getSessionState() >= SESSION_STATE_KEY_PAIR_GENERATED) { - state = PAGE_SHOW_PUBKEY; - - //printf("uri_start: %s\n", uri_start.data()); - //response.redirect(uri_start + "/"); - } else { - state = PAGE_ERROR; - } - } - //printf("SaveKeysPage: hasErrors: %d, session state: %d, target state: %d\n", - //hasErrors, mSession->getSessionState(), SESSION_STATE_KEY_PAIR_GENERATED); - }*/ - getErrors(mSession); -%><%@ include file="include/header_old.cpsp" %> -
-

Daten speichern

- <%= getErrorsHtml() %> - <% if(state == PAGE_ASK) { %> -
-
- Gradido Private Key speichern -
-

Möchtest du deinen Gradido Private Key auf dem Server mit deinem Passwort verschlüsselt speichern?

-

Wenn du ihn speicherst brauchst du dich in Zukunft nur mit deiner E-Mail und deinem Passwort einzuloggen.

-

Wenn du ihn nicht speicherst, müsstest du jedes mal wenn du eine Transaktion machen willst, deine Passphrase hier reinkopieren.

-
-

- - -

- <% if(!hasPassword) { %> -

Ich brauche nochmal dein Passwort wenn du dich für ja entscheidest.

-

- - -

- <% } %> -

- - -

-
-
- Passphrase speichern -
-

Möchtest du deine Passphrase mit dem Server-Admin-Key verschlüsselt auf dem Server gespeichert haben?

-

Dann kann dir der Server-Admin deine Passphrase zuschicken wenn du sie verlegt hast.

-
-

- - -

-

- - -

-
- -
- <% } else if(state == PAGE_SHOW_PUBKEY) { %> -
-

<%= gettext("Daten gespeichert!") %>

-

<%= gettext("Deine Daten wurden verschlüsselt und gespeichert.") %>

- - - - Zurück zur Startseite -
- <% } else if(state == PAGE_ERROR) { %> -
-

Ein Fehler trat auf, bitte versuche es erneut oder wende dich an den Server-Admin

- <%= mSession->getSessionStateString() %> -
- <% } %> -
-<%@ include file="include/footer.cpsp" %> diff --git a/login_server/src/cpsp/TestUserGenerator.cpsp b/login_server/src/cpsp/TestUserGenerator.cpsp deleted file mode 100644 index 41c3ad99d..000000000 --- a/login_server/src/cpsp/TestUserGenerator.cpsp +++ /dev/null @@ -1,102 +0,0 @@ -<%@ page class="TestUserGenerator" %> -<%@ page form="true" %> -<%@ page baseClass="PageRequestMessagedHandler" %> -<%@ header include="HTTPInterface/PageRequestMessagedHandler.h" %> -<%! - #include "Crypto/SecretKeyCryptography.h" - #include "Crypto/KeyPairEd25519.h" - #include "ServerConfig.h" - #include "lib/DataTypeConverter.h" - - #include "controller/User.h" -%> -<%% - const char* pageName = "Test User Generator"; - // needed for header_large - auto user = controller::User::create(); - - std::string email; - std::string password_hashed; - std::string pubkey_hex; - std::string privkey_hex_encrypted; - std::string passphrase_str; - - bool user_created = false; - // add - if(!form.empty()) { - email = form.get("email", ""); - auto password = form.get("password", ""); - if(email == "") { - addError(new Error("Create User", "E-Mail is empty!")); - } - else if(password == "") { - addError(new Error("Create User", "Password is empty!")); - } - else - { - auto passphrase = Passphrase::generate(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]); - passphrase_str = passphrase->getString(); - auto key_pair = KeyPairEd25519::create(passphrase); - Poco::AutoPtr secret_key = new SecretKeyCryptography; - secret_key->createKey(email, password); - password_hashed = std::to_string(secret_key->getKeyHashed()); - auto privkey_encrypted = key_pair->getCryptedPrivKey(secret_key); - privkey_hex_encrypted = DataTypeConverter::binToHex(privkey_encrypted); - pubkey_hex = key_pair->getPublicKeyHex(); - user_created = true; - delete key_pair; - } - } - - // select all - auto groups = controller::Group::listAll(); - //auto groups = controller::Group::load("gdd1"); - //std::vector> groups; - -%><%@ include file="include/header_large.cpsp" %> -<%= getErrorsHtml() %> -
-
-

Einen neuen User anlegen

-
-
-
- - - - - -
-
- <% if(user_created) { %> -
-
-

Generierte Daten

-
-
-
-
E-Mail
-
<%= email %>
-
-
-
Password hash
-
<%= password_hashed %>
-
-
-
public key
-
0x<%= pubkey_hex %>
-
-
-
private key encrypted
-
0x<%= privkey_hex_encrypted %>
-
-
-
Passphrase
-
<%= passphrase_str %>
-
-
-
-
'<%= email %>', <%= password_hashed %>, 0x<%= pubkey_hex %>, 0x<%= privkey_hex_encrypted %>
- <% } %> -
-<%@ include file="include/footer.cpsp" %> diff --git a/login_server/src/cpsp/TranslatePassphrase.cpsp b/login_server/src/cpsp/TranslatePassphrase.cpsp deleted file mode 100644 index 1bc80e53c..000000000 --- a/login_server/src/cpsp/TranslatePassphrase.cpsp +++ /dev/null @@ -1,95 +0,0 @@ -<%@ page class="TranslatePassphrasePage" %> -<%@ page baseClass="SessionHTTPRequestHandler" %> -<%@ page ctorArg="Session*" %> -<%@ header include="HTTPInterface/SessionHTTPRequestHandler.h" %> -<%@ page form="true" %> -<%! -#include "Crypto/KeyPairEd25519.h" -#include "ServerConfig.h" -%> -<%% - chooseLanguage(request); - // variable needed for flags - auto lang = mSession->getLanguage(); - auto uri_start = ServerConfig::g_serverPath; - const char* pageName = gettext("Passphrase Transformieren"); - std::string passphrase; - auto role = mSession->getNewUser()->getModel()->getRole(); - std::string inputPassphrase; - - Mnemonic* wordSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]; - Mnemonic* targetSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES]; - if(lang == LANG_DE) { - wordSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES]; - targetSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]; - } - - if(!form.empty()) - { - - inputPassphrase = form.get("inputPassphrase", ""); - auto localPassphrase = Passphrase::filter(inputPassphrase); - - auto btnGenerate = form.get("btnGenerate", ""); - if("" != btnGenerate) { - auto passphrase_gen = Passphrase::generate(wordSource); - - localPassphrase = passphrase_gen->getString(); - inputPassphrase = localPassphrase; - } - auto passphrase_object = Passphrase::create(localPassphrase, wordSource); - if(localPassphrase != "" && passphrase_object.isNull() || !passphrase_object->checkIfValid()) { - addError(new Error( - gettext("Fehler"), - gettext("Diese Passphrase ist ungültig, bitte überprüfen oder neu generieren (lassen).") - ), false); - } else { - if(wordSource == &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]) { - targetSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES]; - } else { - targetSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]; - } - auto transformed_passphrase_obj = passphrase_object->transform(targetSource); - passphrase = transformed_passphrase_obj->getString(); - } - - - } -%><%@ include file="include/login_header.cpsp" %><%@ include file="include/flags.cpsp" %> -
-

<%= gettext("Passphrase umwandeln") %>

-
-
-
-
-
-
-
-
<%= gettext("Was zu tun ist:") %>
-

<%= gettext("Kopiere/schreibe deine Passphrase in die Textbox und du bekommst sie in die jeweils andere Sprache umgewandelt.") %>

-

<%= gettext("Du kannst mit beiden Varianten dein Konto wiederherstellen oder dein Passwort ändern.") %>

-
-
-
-
-
- -
- - <% if(model::table::ROLE_ADMIN == role) { %> - - <% } %> -
-
- <% if(passphrase != "") { %> -
-
-
Umgewandelte Passphrase:
-

<%= passphrase %>

-
-
- <% } %> -
-
-
-<%@ include file="include/footer_ripple.cpsp" %> \ No newline at end of file diff --git a/login_server/src/cpsp/UserUpdateGroup.cpsp b/login_server/src/cpsp/UserUpdateGroup.cpsp deleted file mode 100644 index 64dcf86a3..000000000 --- a/login_server/src/cpsp/UserUpdateGroup.cpsp +++ /dev/null @@ -1,139 +0,0 @@ -<%@ page class="UserUpdateGroupPage" %> -<%@ page baseClass="SessionHTTPRequestHandler" %> -<%@ page ctorArg="Session*" %> -<%@ header include="HTTPInterface/SessionHTTPRequestHandler.h" %> -<%! - -#include "controller/Group.h" -#include "SingletonManager/SessionManager.h" -#include "SingletonManager/PendingTasksManager.h" -#include "lib/DataTypeConverter.h" -#include "model/gradido/Transaction.h" - -enum PageState { - PAGE_STATE_OVERVIEW, - PAGE_STATE_REQUEST_IS_RUNNING, - PAGE_STATE_NO_GROUPS -}; - -%> -<%% - const char* pageName = gettext("Gruppe wählen"); - auto user = mSession->getNewUser(); - auto sm = SessionManager::getInstance(); - auto pt = PendingTasksManager::getInstance(); - PageState state = PAGE_STATE_OVERVIEW; - - auto groups = controller::Group::listAll(); - Poco::AutoPtr choosen_group; - - if(!form.empty()) { - auto group_id_string = form.get("group_id", ""); - if(group_id_string == "") { - addError(new Error(gettext("Fehler"), gettext("HTML Form Fehler"))); - } else { - int group_id = 0; - if(DataTypeConverter::NUMBER_PARSE_OKAY == DataTypeConverter::strToInt(group_id_string, group_id)) { - std::string group_alias = ""; - - for(auto it = groups.begin(); it != groups.end(); it++) { - auto group_model = (*it)->getModel(); - if(group_model->getID() == group_id) { - choosen_group = *it; - } - } - if(choosen_group.isNull()) { - addError(new Error(gettext("Fehler"), gettext("Interner Fehler"))); - } else { - auto addGroupMemberTransaction = - model::gradido::Transaction::createGroupMemberUpdate(user, choosen_group); - response.redirect(ServerConfig::g_serverPath + "/checkTransactions"); - return; - state = PAGE_STATE_REQUEST_IS_RUNNING; - } - } else { - addError(new Error(gettext("Fehler"), gettext("HTML Value Type Fehler"))); - } - } - } else { - if(groups.size() == 0) { - if(user->getModel()->getRole() == model::table::ROLE_ADMIN) { - response.redirect(getBaseUrl() + "/groups"); - return; - } - state = PAGE_STATE_NO_GROUPS; - - } else { - auto referer = request.find("Referer"); - std::string refererString; - if (referer != request.end()) { - refererString = referer->second; - } - - - - pt->lock("userUpdateGroup Page"); - auto has_pending_group_add_member_task = pt->hasPendingGradidoTransaction(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); - auto referer_was_checkTransaction = refererString.find("checkTransactions") != std::string::npos; - if(has_pending_group_add_member_task) { - state = PAGE_STATE_REQUEST_IS_RUNNING; - auto tasks = pt->getPendingGradidoTransactions(user, model::table::TASK_TYPE_GROUP_ADD_MEMBER); - // should be only one - auto transaction = tasks[0]; - if(transaction->getSignCount() == 0) { - pt->unlock(); - response.redirect(getBaseUrl() + "/checkTransactions"); - return; - } - } else if(referer_was_checkTransaction && user->getModel()->getGroupId()) { - pt->unlock(); - response.redirect(user->getGroupBaseUrl()); - return; - } - - pt->unlock(); - } - } - - - - -%><%@ include file="include/header.cpsp" %> -<%= getErrorsHtml() %> -
- <% if(PAGE_STATE_OVERVIEW == state ) { %> -
-

<%= gettext("Gruppe wählen") %>

-
-

<%= gettext("Bitte wähle die Gruppe/Gemeinschaft aus, zu der du gehörst.") %>

-

<%= gettext("Du bekommst eine Bestätigungsmail, nachdem dein Beitritt bestätigt wurde.") %>

-
-
-
-
<%= gettext("Auswahl") %>
-
Name
-
Alias
-
Url
-
<%= gettext("Description") %>
-
- <% for(auto it = groups.begin(); it != groups.end(); it++) { - auto group_model = (*it)->getModel(); %> -
-
-
<%= group_model->getName() %>
-
<%= group_model->getAlias() %>
-
<%= group_model->getUrl() %>
-
<%= group_model->getDescription()%>
-
- <% } %> - "/> -
-
- <% } else if(PAGE_STATE_REQUEST_IS_RUNNING == state) { %> -

<%= gettext("Deine Beitrittsanfrage wird bearbeitet, du bekommst eine E-Mail wenn sie bestätigt oder abgelehnt wurde.") %>

-

<%= gettext("Abmelden") %>

- <% } else if(PAGE_STATE_NO_GROUPS == state) { %> -

<%= gettext("Noch keine Gruppen vorhanden, bitte warte bis der Admin welche hinzugefügt hat.") %> - <% } %> -

-<%@ include file="include/footer.cpsp" %> diff --git a/login_server/src/cpsp/UserUpdatePassword.cpsp b/login_server/src/cpsp/UserUpdatePassword.cpsp deleted file mode 100644 index 260a29475..000000000 --- a/login_server/src/cpsp/UserUpdatePassword.cpsp +++ /dev/null @@ -1,102 +0,0 @@ -<%@ page class="UserUpdatePasswordPage" %> -<%@ page baseClass="SessionHTTPRequestHandler" %> -<%@ page ctorArg="Session*" %> -<%@ header include="HTTPInterface/SessionHTTPRequestHandler.h" %> -<%! -#include "SingletonManager/SessionManager.h" -#include "tasks/AuthenticatedEncryptionCreateKeyTask.h" -#include "Poco/Net/HTTPCookie.h" - -enum PageState { - PAGE_STATE_ASK_PASSWORD, - PAGE_STATE_SUCCEED -}; - -%> -<%% - const char* pageName = "Passwort bestimmen"; - auto user = mSession->getNewUser(); - auto sm = SessionManager::getInstance(); - auto uri_start = getBaseUrl(); - PageState state = PAGE_STATE_ASK_PASSWORD; - - // remove old cookies if exist - sm->deleteLoginCookies(request, response, mSession); - // save login cookie, because maybe we've get an new session - response.addCookie(mSession->getLoginCookie()); - - if(!form.empty()) { - auto pwd = form.get("register-password", ""); - if(pwd != "") { - if(!mSession->getLanguageCatalog()) { - mSession->setLanguage(LANG_EN); - } - if(pwd != form.get("register-password2", "")) { - mSession->addError(new Error("Passwort", "Passwörter sind nicht identisch."), false); - } else if(SessionManager::getInstance()->checkPwdValidation(pwd, mSession, mSession->getLanguageCatalog())) { - auto sessionState = mSession->getSessionState(); - - if(user->setNewPassword(pwd) >= 0) { - //std::string referUri = request.get("Referer", uri_start + "/"); - //printf("[updateUserPasswordPage] redirect to referUri: %s\n", referUri.data()); - - // I think we can savly assume that this session was loaded from verification code - //! \return 1 = konto already activated - //! -1 = invalid code - //! -2 = critical error - //! 0 = ok - auto code = mSession->getEmailVerificationCode(); - int retUpdateEmailCode = 0; - if(code) { - retUpdateEmailCode = mSession->updateEmailVerification(mSession->getEmailVerificationCode()); - } - //mSession->getErrors(user); - if(-2 == retUpdateEmailCode || -1 == retUpdateEmailCode || 1 == retUpdateEmailCode) { - response.redirect(uri_start + "/error500"); - return; - } - if(sessionState == SESSION_STATE_RESET_PASSWORD_REQUEST) { - state = PAGE_STATE_SUCCEED; - mSession->updateState(SESSION_STATE_RESET_PASSWORD_SUCCEED); - sm->deleteLoginCookies(request, response, mSession); - sm->releaseSession(mSession); - mSession = nullptr; - } else { - response.redirect(uri_start + "/passphrase"); - return; - } - } - } - } - } - if(mSession) { - getErrors(mSession); - } - //getErrors(user); - //printf("session state end [UpdateUserPassword Page]: %s\n", mSession->getSessionStateString()); -%><%@ include file="include/header.cpsp" %> -<%= getErrorsHtml() %> -
- <% if(PAGE_STATE_ASK_PASSWORD == state ) { %> -
-

Passwort bestimmen

-
-
-
-

- Bitte denke dir ein sicheres Passwort aus, das mindestens 8 Zeichen lang ist, einen Klein- und einen Großbuchstaben enthält, - eine Zahl und ein Sonderzeichen. -

- - - - - -
- <% } else if(PAGE_STATE_SUCCEED == state) { %> -

Deine Daten werden jetzt mit dem neuen Passwort verschlüsselt. Du kannst dich in etwa 1 Minute mit deinem neuen Passwort einloggen

- Zum Login - <% } %> -
-
-<%@ include file="include/footer.cpsp" %> diff --git a/login_server/src/cpsp/include/flags.cpsp b/login_server/src/cpsp/include/flags.cpsp deleted file mode 100644 index a98f823dd..000000000 --- a/login_server/src/cpsp/include/flags.cpsp +++ /dev/null @@ -1,12 +0,0 @@ -
-
- - -
-
\ No newline at end of file diff --git a/login_server/src/cpsp/include/footer.cpsp b/login_server/src/cpsp/include/footer.cpsp deleted file mode 100644 index 0117affe0..000000000 --- a/login_server/src/cpsp/include/footer.cpsp +++ /dev/null @@ -1,15 +0,0 @@ -
-

Copyright © Gradido 2020

-
-
-
- <%= mTimeProfiler.string() %> -
-
-

Login Server in Entwicklung

-

Alpha <%= ServerConfig::g_versionString %>

-
- - - - \ No newline at end of file diff --git a/login_server/src/cpsp/include/footer_chr.cpsp b/login_server/src/cpsp/include/footer_chr.cpsp deleted file mode 100644 index dddfac465..000000000 --- a/login_server/src/cpsp/include/footer_chr.cpsp +++ /dev/null @@ -1,22 +0,0 @@ - - - - -
- <%= mTimeProfiler.string() %> -
-
-

Community Server in Entwicklung

-

Alpha <%= ServerConfig::g_versionString %>

-
- - - - \ No newline at end of file diff --git a/login_server/src/cpsp/include/footer_ripple.cpsp b/login_server/src/cpsp/include/footer_ripple.cpsp deleted file mode 100644 index c40874f35..000000000 --- a/login_server/src/cpsp/include/footer_ripple.cpsp +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - -
- <%= mTimeProfiler.string() %> -
- - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/login_server/src/cpsp/include/header.cpsp b/login_server/src/cpsp/include/header.cpsp deleted file mode 100644 index 3c6ffc47a..000000000 --- a/login_server/src/cpsp/include/header.cpsp +++ /dev/null @@ -1,28 +0,0 @@ -<%! -#include "ServerConfig.h" -%><%% - bool withMaterialIcons = false; -%> - - - - - -Gradido Login Server: <%= pageName %> - -<% if(withMaterialIcons) { %> - -<% } %> - - -
-
- \ No newline at end of file diff --git a/login_server/src/cpsp/include/header_large.cpsp b/login_server/src/cpsp/include/header_large.cpsp deleted file mode 100644 index 60d1168ef..000000000 --- a/login_server/src/cpsp/include/header_large.cpsp +++ /dev/null @@ -1,32 +0,0 @@ -<%! -#include "ServerConfig.h" -%><%% - bool withMaterialIcons = false; -%> - - - - - -Gradido Login Server: <%= pageName %> - -<% if(withMaterialIcons) { %> - -<% } %> - - -
- -
\ No newline at end of file diff --git a/login_server/src/cpsp/include/header_navi.cpsp b/login_server/src/cpsp/include/header_navi.cpsp deleted file mode 100644 index 70a3cf3a2..000000000 --- a/login_server/src/cpsp/include/header_navi.cpsp +++ /dev/null @@ -1,91 +0,0 @@ -<%! -#include "ServerConfig.h" -#include "model/TransactionBase.h" -%> - - - - - -Gradido Login Server: <%= pageName %> - - - - -
-

Login Server in Entwicklung

-

Alpha <%= ServerConfig::g_versionString %>

-
- -
- - -
-
-
- -
-
\ No newline at end of file diff --git a/login_server/src/cpsp/include/header_navi_chr.cpsp b/login_server/src/cpsp/include/header_navi_chr.cpsp deleted file mode 100644 index 2c37a49b3..000000000 --- a/login_server/src/cpsp/include/header_navi_chr.cpsp +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - Gradido Login Server: <%= pageName %> - - - - - - - -
-
-
- -
- \ No newline at end of file diff --git a/login_server/src/cpsp/include/header_old.cpsp b/login_server/src/cpsp/include/header_old.cpsp deleted file mode 100644 index 774e5ab39..000000000 --- a/login_server/src/cpsp/include/header_old.cpsp +++ /dev/null @@ -1,54 +0,0 @@ -<%! -#include "ServerConfig.h" -%> - - - - - -Gradido Login Server: <%= pageName %> - - - - - -
-

Login Server in Entwicklung

-

Alpha <%= ServerConfig::g_versionString %>

-
diff --git a/login_server/src/cpsp/include/login_header.cpsp b/login_server/src/cpsp/include/login_header.cpsp deleted file mode 100644 index d9d72d856..000000000 --- a/login_server/src/cpsp/include/login_header.cpsp +++ /dev/null @@ -1,20 +0,0 @@ -<%@ include file="header.cpsp" %> -
- -
-
-
-
- <%= getErrorsHtml() %> -
-
\ No newline at end of file diff --git a/login_server/src/cpsp/include/navi.cpsp b/login_server/src/cpsp/include/navi.cpsp deleted file mode 100644 index 1b0ee25ac..000000000 --- a/login_server/src/cpsp/include/navi.cpsp +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/login_server/src/proto b/login_server/src/proto deleted file mode 160000 index 77dee5685..000000000 --- a/login_server/src/proto +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 77dee5685ebba543ea1cd2321580ad56c92f5775