Merge branch 'master' into 1920-feature-create-contribution-link-table
@ -4,7 +4,7 @@
|
||||
"main": "index.js",
|
||||
"author": "Moriz Wahl",
|
||||
"version": "1.8.3",
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"start": "node run/server.js",
|
||||
|
||||
@ -13,6 +13,14 @@
|
||||
{
|
||||
"type": "dateFile",
|
||||
"filename": "../logs/backend/apollo.log",
|
||||
"pattern": "%d{ISO8601} %p %c %m",
|
||||
"keepFileExt" : true,
|
||||
"fileNameSep" : "_"
|
||||
},
|
||||
"backend":
|
||||
{
|
||||
"type": "dateFile",
|
||||
"filename": "../logs/backend/backend.log",
|
||||
"pattern": "%d{ISO8601} %p %c %X{user} %f:%l %m",
|
||||
"keepFileExt" : true,
|
||||
"fileNameSep" : "_"
|
||||
@ -31,24 +39,52 @@
|
||||
"level": "error",
|
||||
"appender": "errorFile"
|
||||
},
|
||||
"out":
|
||||
"out":
|
||||
{
|
||||
"type": "stdout",
|
||||
"layout":
|
||||
{
|
||||
"type": "pattern", "pattern": "%d{ISO8601} %p %c %X{user} %f:%l %m"
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
"apolloOut":
|
||||
{
|
||||
"type": "stdout",
|
||||
"layout":
|
||||
{
|
||||
"type": "pattern", "pattern": "%d{ISO8601} %p %c %m"
|
||||
}
|
||||
}
|
||||
},
|
||||
"categories":
|
||||
"categories":
|
||||
{
|
||||
"default":
|
||||
{
|
||||
"appenders":
|
||||
[
|
||||
"out",
|
||||
"errors"
|
||||
],
|
||||
"level": "debug",
|
||||
"enableCallStack": true
|
||||
},
|
||||
"apollo":
|
||||
{
|
||||
"appenders":
|
||||
[
|
||||
"apollo",
|
||||
"apolloOut",
|
||||
"errors"
|
||||
],
|
||||
"level": "debug",
|
||||
"enableCallStack": true
|
||||
},
|
||||
"backend":
|
||||
{
|
||||
"appenders":
|
||||
[
|
||||
"backend",
|
||||
"out",
|
||||
"errors"
|
||||
],
|
||||
"level": "debug",
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
"main": "src/index.ts",
|
||||
"repository": "https://github.com/gradido/gradido/backend",
|
||||
"author": "Ulf Gebhardt",
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"build": "tsc --build",
|
||||
|
||||
@ -3,7 +3,7 @@ import CONFIG from './index'
|
||||
describe('config/index', () => {
|
||||
describe('decay start block', () => {
|
||||
it('has the correct date set', () => {
|
||||
expect(CONFIG.DECAY_START_TIME).toEqual(new Date('2021-05-13 17:46:31'))
|
||||
expect(CONFIG.DECAY_START_TIME).toEqual(new Date('2021-05-13 17:46:31-0000'))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -11,7 +11,7 @@ Decimal.set({
|
||||
|
||||
const constants = {
|
||||
DB_VERSION: '0036-unique_previous_in_transactions',
|
||||
DECAY_START_TIME: new Date('2021-05-13 17:46:31'), // GMT+0
|
||||
DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0
|
||||
LOG4JS_CONFIG: 'log4js-config.json',
|
||||
// default log level on production should be info
|
||||
LOG_LEVEL: process.env.LOG_LEVEL || 'info',
|
||||
|
||||
@ -19,7 +19,4 @@ export default class UpdateUserInfosArgs {
|
||||
|
||||
@Field({ nullable: true })
|
||||
passwordNew?: string
|
||||
|
||||
@Field({ nullable: true })
|
||||
coinanimation?: boolean
|
||||
}
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
enum Setting {
|
||||
COIN_ANIMATION = 'coinanimation',
|
||||
}
|
||||
|
||||
export { Setting }
|
||||
@ -15,8 +15,6 @@ export class User {
|
||||
this.language = user.language
|
||||
this.publisherId = user.publisherId
|
||||
this.isAdmin = user.isAdmin
|
||||
// TODO
|
||||
this.coinanimation = null
|
||||
this.klickTipp = null
|
||||
this.hasElopage = null
|
||||
}
|
||||
@ -61,11 +59,6 @@ export class User {
|
||||
@Field(() => Date, { nullable: true })
|
||||
isAdmin: Date | null
|
||||
|
||||
// TODO this is a bit inconsistent with what we query from the database
|
||||
// therefore all those fields are now nullable with default value null
|
||||
@Field(() => Boolean, { nullable: true })
|
||||
coinanimation: boolean | null
|
||||
|
||||
@Field(() => KlickTipp, { nullable: true })
|
||||
klickTipp: KlickTipp | null
|
||||
|
||||
|
||||
@ -344,7 +344,6 @@ describe('UserResolver', () => {
|
||||
expect.objectContaining({
|
||||
data: {
|
||||
login: {
|
||||
coinanimation: true,
|
||||
email: 'bibi@bloxberg.de',
|
||||
firstName: 'Bibi',
|
||||
hasElopage: false,
|
||||
@ -479,7 +478,6 @@ describe('UserResolver', () => {
|
||||
firstName: 'Bibi',
|
||||
lastName: 'Bloxberg',
|
||||
language: 'de',
|
||||
coinanimation: true,
|
||||
klickTipp: {
|
||||
newsletterState: false,
|
||||
},
|
||||
|
||||
@ -3,7 +3,7 @@ import { backendLogger as logger } from '@/server/logger'
|
||||
|
||||
import { Context, getUser } from '@/server/context'
|
||||
import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware, Mutation } from 'type-graphql'
|
||||
import { getConnection, getCustomRepository } from '@dbTools/typeorm'
|
||||
import { getConnection } from '@dbTools/typeorm'
|
||||
import CONFIG from '@/config'
|
||||
import { User } from '@model/User'
|
||||
import { User as DbUser } from '@entity/User'
|
||||
@ -13,8 +13,6 @@ import CreateUserArgs from '@arg/CreateUserArgs'
|
||||
import UnsecureLoginArgs from '@arg/UnsecureLoginArgs'
|
||||
import UpdateUserInfosArgs from '@arg/UpdateUserInfosArgs'
|
||||
import { klicktippNewsletterStateMiddleware } from '@/middleware/klicktippMiddleware'
|
||||
import { UserSettingRepository } from '@repository/UserSettingRepository'
|
||||
import { Setting } from '@enum/Setting'
|
||||
import { OptInType } from '@enum/OptInType'
|
||||
import { LoginEmailOptIn } from '@entity/LoginEmailOptIn'
|
||||
import { sendResetPasswordEmail as sendResetPasswordEmailMailer } from '@/mailer/sendResetPasswordEmail'
|
||||
@ -228,15 +226,6 @@ export class UserResolver {
|
||||
// Elopage Status & Stored PublisherId
|
||||
user.hasElopage = await this.hasElopage(context)
|
||||
|
||||
// coinAnimation
|
||||
const userSettingRepository = getCustomRepository(UserSettingRepository)
|
||||
const coinanimation = await userSettingRepository
|
||||
.readBoolean(userEntity.id, Setting.COIN_ANIMATION)
|
||||
.catch((error) => {
|
||||
logger.error('error:', error)
|
||||
throw new Error(error)
|
||||
})
|
||||
user.coinanimation = coinanimation
|
||||
logger.debug(`verifyLogin... successful: ${user.firstName}.${user.lastName}, ${user.email}`)
|
||||
return user
|
||||
}
|
||||
@ -294,15 +283,6 @@ export class UserResolver {
|
||||
DbUser.save(dbUser)
|
||||
}
|
||||
|
||||
// coinAnimation
|
||||
const userSettingRepository = getCustomRepository(UserSettingRepository)
|
||||
const coinanimation = await userSettingRepository
|
||||
.readBoolean(dbUser.id, Setting.COIN_ANIMATION)
|
||||
.catch((error) => {
|
||||
throw new Error(error)
|
||||
})
|
||||
user.coinanimation = coinanimation
|
||||
|
||||
context.setHeaders.push({
|
||||
key: 'token',
|
||||
value: encode(dbUser.pubKey),
|
||||
@ -598,12 +578,10 @@ export class UserResolver {
|
||||
@Mutation(() => Boolean)
|
||||
async updateUserInfos(
|
||||
@Args()
|
||||
{ firstName, lastName, language, password, passwordNew, coinanimation }: UpdateUserInfosArgs,
|
||||
{ firstName, lastName, language, password, passwordNew }: UpdateUserInfosArgs,
|
||||
@Ctx() context: Context,
|
||||
): Promise<boolean> {
|
||||
logger.info(
|
||||
`updateUserInfos(${firstName}, ${lastName}, ${language}, ***, ***, ${coinanimation})...`,
|
||||
)
|
||||
logger.info(`updateUserInfos(${firstName}, ${lastName}, ${language}, ***, ***)...`)
|
||||
const userEntity = getUser(context)
|
||||
|
||||
if (firstName) {
|
||||
@ -655,15 +633,6 @@ export class UserResolver {
|
||||
await queryRunner.startTransaction('READ UNCOMMITTED')
|
||||
|
||||
try {
|
||||
if (coinanimation !== null && coinanimation !== undefined) {
|
||||
queryRunner.manager
|
||||
.getCustomRepository(UserSettingRepository)
|
||||
.setOrUpdate(userEntity.id, Setting.COIN_ANIMATION, coinanimation.toString())
|
||||
.catch((error) => {
|
||||
throw new Error('error saving coinanimation: ' + error)
|
||||
})
|
||||
}
|
||||
|
||||
await queryRunner.manager.save(userEntity).catch((error) => {
|
||||
throw new Error('error saving user: ' + error)
|
||||
})
|
||||
|
||||
@ -31,7 +31,6 @@ export const updateUserInfos = gql`
|
||||
$password: String
|
||||
$passwordNew: String
|
||||
$locale: String
|
||||
$coinanimation: Boolean
|
||||
) {
|
||||
updateUserInfos(
|
||||
firstName: $firstName
|
||||
@ -39,7 +38,6 @@ export const updateUserInfos = gql`
|
||||
password: $password
|
||||
passwordNew: $passwordNew
|
||||
language: $locale
|
||||
coinanimation: $coinanimation
|
||||
)
|
||||
}
|
||||
`
|
||||
|
||||
@ -8,7 +8,6 @@ export const login = gql`
|
||||
firstName
|
||||
lastName
|
||||
language
|
||||
coinanimation
|
||||
klickTipp {
|
||||
newsletterState
|
||||
}
|
||||
@ -26,7 +25,6 @@ export const verifyLogin = gql`
|
||||
firstName
|
||||
lastName
|
||||
language
|
||||
coinanimation
|
||||
klickTipp {
|
||||
newsletterState
|
||||
}
|
||||
|
||||
@ -12,7 +12,6 @@ log4js.configure(options)
|
||||
const apolloLogger = log4js.getLogger('apollo')
|
||||
const backendLogger = log4js.getLogger('backend')
|
||||
|
||||
apolloLogger.addContext('user', 'unknown')
|
||||
backendLogger.addContext('user', 'unknown')
|
||||
|
||||
export { apolloLogger, backendLogger }
|
||||
|
||||
@ -32,16 +32,16 @@ const logPlugin = {
|
||||
requestDidStart(requestContext: any) {
|
||||
const { logger } = requestContext
|
||||
const { query, mutation, variables } = requestContext.request
|
||||
logger.trace(`Request:
|
||||
logger.info(`Request:
|
||||
${mutation || query}variables: ${JSON.stringify(filterVariables(variables), null, 2)}`)
|
||||
return {
|
||||
willSendResponse(requestContext: any) {
|
||||
if (requestContext.context.user) logger.trace(`User ID: ${requestContext.context.user.id}`)
|
||||
if (requestContext.context.user) logger.info(`User ID: ${requestContext.context.user.id}`)
|
||||
if (requestContext.response.data)
|
||||
logger.trace(`Response-Data:
|
||||
logger.info(`Response-Data:
|
||||
${JSON.stringify(requestContext.response.data, null, 2)}`)
|
||||
if (requestContext.response.errors)
|
||||
logger.trace(`Response-Errors:
|
||||
logger.error(`Response-Errors:
|
||||
${JSON.stringify(requestContext.response.errors, null, 2)}`)
|
||||
return requestContext
|
||||
},
|
||||
|
||||
@ -1,33 +1,22 @@
|
||||
import { EntityRepository, Repository } from '@dbTools/typeorm'
|
||||
import { UserSetting } from '@entity/UserSetting'
|
||||
import { Setting } from '@enum/Setting'
|
||||
import { isStringBoolean } from '@/util/validate'
|
||||
|
||||
@EntityRepository(UserSetting)
|
||||
export class UserSettingRepository extends Repository<UserSetting> {
|
||||
async setOrUpdate(userId: number, key: Setting, value: string): Promise<UserSetting> {
|
||||
switch (key) {
|
||||
case Setting.COIN_ANIMATION:
|
||||
if (!isStringBoolean(value)) {
|
||||
throw new Error("coinanimation value isn't boolean")
|
||||
}
|
||||
break
|
||||
default:
|
||||
throw new Error("key isn't defined: " + key)
|
||||
}
|
||||
let entity = await this.findOne({ userId: userId, key: key })
|
||||
async setOrUpdate(userId: number, value: string): Promise<UserSetting> {
|
||||
let entity = await this.findOne({ userId: userId })
|
||||
|
||||
if (!entity) {
|
||||
entity = new UserSetting()
|
||||
entity.userId = userId
|
||||
entity.key = key
|
||||
}
|
||||
entity.value = value
|
||||
return this.save(entity)
|
||||
}
|
||||
|
||||
async readBoolean(userId: number, key: Setting): Promise<boolean> {
|
||||
const entity = await this.findOne({ userId: userId, key: key })
|
||||
async readBoolean(userId: number): Promise<boolean> {
|
||||
const entity = await this.findOne({ userId: userId })
|
||||
if (!entity || !isStringBoolean(entity.value)) {
|
||||
return true
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
"main": "src/index.ts",
|
||||
"repository": "https://github.com/gradido/gradido/database",
|
||||
"author": "Ulf Gebhardt",
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"build": "mkdir -p build/src/config/ && cp src/config/*.txt build/src/config/ && tsc --build",
|
||||
|
||||
@ -0,0 +1 @@
|
||||
<mxfile host="Electron" modified="2022-05-23T15:29:00.513Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/16.0.2 Chrome/96.0.4664.55 Electron/16.0.5 Safari/537.36" etag="IpEbe50ld79E_2HLyFXN" version="16.0.2" type="device"><diagram id="LWCFUfVkWozhiXBGj4Ze" name="Page-1">7VxbU9s6EP41eaTju5NHEug5D7TDlHZanhhhK45AtjKyQpL++rNy5PgiJ4Rgx4c2M8xgrVe2tN/u6vNKMLAn8eofjuazLyzEdGAZ4WpgXw0syzQNC35JyXojGXqjjSDiJFRKheCO/MZKaCjpgoQ4rSgKxqgg86owYEmCA1GRIc7Zsqo2ZbT61jmKsCa4CxDVpT9JKGZqFq5RyP/FJJqJ7YTVnRjlykqQzlDIliWRfT2wJ5wxsbmKVxNMpfFyu2z6fd5xdzswjhNxSIcoffphXUeTWCx/jtyft/OXr+GFQucF0YWa8MDyKDxvPIMXeJG8+kzZMpghLkARUA5JyOBqwjEShCVp3gHeXPRRUxbr3I4Cr7KnipiCwITLVHD2jCeMMg6ShCWgOZ4SSmuidI4CkkQgcIvWdzYHwQVM2R4vZ0TgO5DLVy3BDUHGXjCf0szcMxKGOAEZZ4skxNIaxnaEoAYj22lRc4sTODhmMRZ8DSqqg+UoaJVv26q5LBzF9pVsVnKSvBtSvhltn1zABxcKwTeg6Tqa3XEI7qyajIsZi1iC6HUhrZml0LlhmY0lVE9YiLWKTbQQrAokXhHxS3b/5KrWfenO1Uo9OWusK9aXg9tve5gLW/AA75m0rbIC4hEWe/RMuxlMjik48kt1IK1DY2uBNmGJ4ORxoYKohlsVlSYXLyHQhi8bw4ovm5buzFtZ2Zm9zpzZ0IxyUmf2D/dmsDFf/yo37ot4kM2iW9bqIAqcU0VB1vWSc7QuKcwZSURaevKtFBTeZTpuLVPW1qqavm0N9+nDxWYEhXdtp/IOh7M/Svb8QP62AbKvrOuZR0AKRG0u704pXl1KCtkuzNYxOH8yHLOM9QVIzNfgzlq3mBMwJub9+UCvLuBbfUR1D1b2jXea+ajMblcpsOm+ktir6q7KuZ3mdWcv9YI7NyR57p+BudUl8n9AwNx+18NjEmUlSZ50QXRPRcDeh6n34TjOB4DU7ZXjHENbO+Y4x3w71XD2rL7pzaHwe1avEa2tbpdhTJLelzPPqzGD3tezoWap7xwlKQqaKzDpksQUbaqSwBfyeJLWC2aEhjdozRZyzKlAwXPeGs8YJ79BHxV1TsSFihnbqGjcyZ7qmRynoHOb29esib6gVUXxBqUiHw2jFM1T8piNT3aMwWVJMmZCsLgSF20SFL+h3Ombrg6oae9BVL3tGw4ESiKYQUEVvdr7hg0OZDQ4UP11iEJ6SJDAYxkCqeZHLVDMkeZaonCtB7GGXFt3L1UQP7QKjiiJEmhSPJXdJJAkQPRSiWMShpvEvqmP32RqV04h+aYM5OyojiuiD2Nzx/ADNpzIxdaFsU6gbRZt+JHqXACNhuEjkrkPBodcYumUsJAIJNDjNlwO8r23fDnurrc3OuA+/3tXRsk3qUq4L1LMH6DTGe7W4fZ6h9vU4A5KX5IPFL4jz9h3gv3oQOw721rzjtla64ZlF0XBLUO+rxDkzj+MTOtDUON8mAdvuv1ZlC8kHGcERIVsOyywvjWzDbkyLRs1peW8Y/s465ur52X4HanY3BG1u2lXM+CdrcN6RbeyDofA9c/Id4B8AwM7LfKWXu0I5DkkHD4g0THkQq7Px+NdB6lF/DvDu4F1NeJteV3h7Wl4xzhmZ6TbRto0vb6h9jWoUQxc+RzW7YPtWD2Dbep5PGYh5kiwM23rCnVv2PfqrVfge6if/I0BPzoQ+u6yu14hB+inhMdn6tYJ5PBd3jPktl4cLyB/XJ8hbx1yt2+67uh0vZLgT7AR9jfi7vfN3R2du3P8hANxjvSOKnB9E3jvmHNknW+HmP7gDRsiXZ8f8g7dJen3iLx/BJItojbo63TfwfBsstvpD1ZX91k857WT1VV9Vx3X6fRodW7DUuK/xzApQ77XMr7qlTp4KJmn0oe6P4JWP0HkmQ0EqekI2rCzXWT9C/hHivmfvhPZApZm/S8HjIZPWqcBy86OE/qN3zfn0yCt1LK8N5/8agS/s1KWr285k2m2JkQppDWOd+J+xF/A5y4QgM0kUdntBE05tbpWZxBtzgRYfkuxuT0Hl6PTdFLTbAceaBb/MmGzjBX/eMK+/g8=</diagram></mxfile>
|
||||
|
After Width: | Height: | Size: 67 KiB |
@ -1,8 +1,10 @@
|
||||
# Federation
|
||||
|
||||
This document contains the concept and technical details for the *federation* of gradido communities. It base on the [ActivityPub specification](https://www.w3.org/TR/activitypub/ " ") and is extended for the gradido requirements.
|
||||
This document contains the concept and technical details for the *federation* of gradido communities. The first idea of federation was to base on the [ActivityPub specification](https://www.w3.org/TR/activitypub/ " ") and extend it for the gradido requirements.
|
||||
|
||||
## ActivityPub
|
||||
But meanwhile the usage of a DHT like HyperSwarm promises more coverage of the gradido requirements out of the box. More details about HyperSwarm can be found here [@hyperswarm/dht](https://github.com/hyperswarm/dht).
|
||||
|
||||
## ActivityPub (deprecated)
|
||||
|
||||
The activity pub defines a server-to-server federation protocol to share information between decentralized instances and will be the main komponent for the gradido community federation.
|
||||
|
||||
@ -25,8 +27,387 @@ The Variant A with an internal server contains the benefit to be as independent
|
||||
|
||||
The Varaint B with an external server contains the benefit to reduce the implementation efforts and the responsibility for an own ActivitPub-Server. But it will cause an additional dependency to a third party service provider and the growing hosting costs.
|
||||
|
||||
## HyperSwarm
|
||||
|
||||
The decision to switch from ActivityPub to HyperSwarm base on the arguments, that the *hyperswarm/dht* library will satify the most federation requirements out of the box. It is now to design the business requirements of the [gradido community communication](../BusinessRequirements/CommunityVerwaltung.md#UC-createCommunity) in a technical conception.
|
||||
|
||||
## ActivityStream
|
||||
The challenge for the decentralized communities of gradido will be *how to become a new community aquainted with an existing community* ?
|
||||
|
||||
An ActivityStream includes all definitions and terms needed for community activities and content flow around the gradido community network.
|
||||
To enable such a relationship between an existing community and a new community several stages has to run through:
|
||||
|
||||
1. Federation
|
||||
* join&connect
|
||||
* direct exchange
|
||||
2. Authentication
|
||||
3. Autorized Communication
|
||||
|
||||
### Overview
|
||||
|
||||
At first the following diagramm gives an overview of the three stages and shows the handshake between an existing community-A and a new created community-B including the data exchange for buildup such a federated, authenticated and autorized relationship.
|
||||
|
||||

|
||||
|
||||
### Prerequisits
|
||||
|
||||
Before starting in describing the details of the federation handshake, some prerequisits have to be defined.
|
||||
|
||||
#### Database
|
||||
|
||||
With the federation additional data tables/entities have to be created.
|
||||
|
||||
##### Community-Entity
|
||||
|
||||
Create the new *Community* table to store attributes of the own community. This table is used more like a frame for own community data in the future like the list of federated foreign communities, own users, own futher accounts like AUF- and Welfare-account and the profile data of the own community:
|
||||
|
||||
| Attributes | Type | Description |
|
||||
| ----------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| id | int | technical unique key of this entity |
|
||||
| uuid | string | unique key for a community, which will never changed as long as the community exists |
|
||||
| name | string | name of the community shown on UI e.g for selection of a community |
|
||||
| description | string | description of the community shown on UI to present more community details |
|
||||
| ... | | for the near future additional attributes like profile-info, trading-level, set-of-rights,... will follow with the next level of Multi-Community Readyness |
|
||||
|
||||
##### CommunityFederation-Entity
|
||||
|
||||
Create the new *CommunityFederation* table to store at this point of time only the attributes used by the federation handshake:
|
||||
|
||||
| Attributes | Type | Description |
|
||||
| ---------------- | --------- | ------------------------------------------------------------------------------------------------------ |
|
||||
| id | int | technical unique key of this entity |
|
||||
| uuid | string | unique key for a community, which will never changed as long as the community exists |
|
||||
| foreign | boolean | flag to mark the entry as a foreign or own community entry |
|
||||
| createdAt | timestamp | the timestamp the community entry was created |
|
||||
| privateKey | string | the private key of the community for asynchron encryption (only set for the own community) |
|
||||
| pubKey | string | the public key of the community for asynchron encryption |
|
||||
| pubKeyVerifiedAt | timestamp | the timestamp the pubkey of this foreign community is verified (for the own community its always null) |
|
||||
| authenticatedAt | timestamp | the timestamp of the last successfull authentication with this foreign community |
|
||||
| | | for the near future additional attributes will follow with the next level of Multi-Community Readyness |
|
||||
|
||||
##### CommunityApiVersion-Entity
|
||||
|
||||
Create the new *CommunityApiVersion* table to support several urls and apiversion of one community at once. It references the table *CommunityFederation* with the foreignkey *communityFederationID* (naming pattern foreignkea = `<referred entityname>ID`) for a 1:n relationship
|
||||
|
||||
| Attributes | Type | Description |
|
||||
| --------------------- | --------- | ------------------------------------------------------------------------------------------------------------------ |
|
||||
| id | int | technical unique key of this entity |
|
||||
| communityFederationID | int | the technical foreign key to the community entity |
|
||||
| url | string | the URL the community will provide its services, could be changed during lifetime of the community |
|
||||
| apiversion | string | the API version the community will provide its services, will increase with each release |
|
||||
| validFrom | timestamp | the timestamp as of the url and api are provided by the community |
|
||||
| verifiedAt | timestamp | the timestamp the url and apiversion of this foreign community is verified (for the own community its always null) |
|
||||
|
||||
#### Configuration
|
||||
|
||||
The preparation of a community infrastructure needs some application-outside configuration, which will be read during the start phase of the gradido components. The configuration will be defined in a file based manner like key-value-pairs as properties or in a structured way like xml or json files.
|
||||
|
||||
| Key | Value | Default-Value | Description |
|
||||
| ----------------------------------------------- | :------------------------------------ | --------------------- | ------------------------------------------------------------------------------------------------- |
|
||||
| stage.name | dev<br />stage1<br />stage2<br />prod | dev | defines the name of the stage this instance will serve |
|
||||
| stage.host | | | the name of the host or ip this instance will run |
|
||||
| stage.mode | test<br />prod | test | the running mode this instance will work |
|
||||
| federation.communityname | | Gradido-Akademie | the name of this community |
|
||||
| federation.apiversion | `<versionNr>` | current 1.7 | defines the current api version this instance will provide its services |
|
||||
| federation.apiversion.`<versionNr>.`url | | <br />gdd.gradido.net | <br />defines the url on which this instance of a community will provide its services |
|
||||
| federation.apiversion.`<versionNr>.`validFrom | | | defines the timestamp the apiversion is or will be valid |
|
||||
| federation.dhtnode.topic | | dht_gradido_topic | defines the name of the federation topic, which is used to join and connect as federation-channel |
|
||||
| federation.dhtnode.host | | | defines the host where the DHT-Node is hosted, if outside apollo |
|
||||
| federation.dhtnode.port | | | defines the port on which the DHT-node will provide its services, if outside apollo |
|
||||
|
||||
#### 1st Start of a community
|
||||
|
||||
The first time a new community infrastructure on a server is started, the start-phase has to check and prepair the own community database for federation. That means the application has to read the configuration and check against the database, if all current configured data is propagated in the database especially in the *CommunityXXX* entities.
|
||||
|
||||
* check if the*Community* table is empty or if an exisiting community entry is not equals the configured values, then update as follows:
|
||||
|
||||
* community.id = next sequence value
|
||||
* community.uuid = generated UUID (version 4)
|
||||
* community.name = Configuration.federation.communityname
|
||||
* community.description = null
|
||||
* prepare the *CommunityFederation* table
|
||||
|
||||
* communityFederation.id = next sequence value
|
||||
* communityFederation.uuid = community.uuid
|
||||
* communityFederation.foreign = FALSE
|
||||
* communityFederation.createdAt = NOW
|
||||
* communityFederation.privateKey = null
|
||||
* communityFederation.pubKey = null
|
||||
* communityFederation.pubKeyVerifiedAt = null
|
||||
* communityFederation.authenticatedAt = null
|
||||
* prepare the *CommunityApiVersion* table with all configured apiversions:
|
||||
|
||||
* communityApiVersion.id = next sequence value
|
||||
* communityApiVersion.communityFederationID = communityFederation.id
|
||||
* communityApiVersion.url = Configuration.federation.apiversion.`<versionNr>`.url
|
||||
* communityApiVersion.apiversion = Configuration.federation.apiversion
|
||||
* communityApiVersion.validFrom = Configuration.federation.apiversion.`<versionNr>`.validFrom
|
||||
* communityApiVersion.verifiedAt = null
|
||||
|
||||
### Stage1 - Federation
|
||||
|
||||
For the 1st stage the *hyperswarm dht library* will be used. It supports an easy way to connect a new community with other existing communities. As shown in the picture above the *hyperswarm dht library* will be part of the component *DHT-Node* separated from the *apollo server* component. The background for this separation is to keep off the federation activity from the business processes or to enable component specific scaling in the future. In consequence for the inter-component communication between *DHT-Node*, *apollo server* and other components like *database* the interface and security has to be defined during development on using technical standards.
|
||||
|
||||
For the first federation release the *DHT-Node* will be part of the *apollo server*, but internally designed and implemented as a logical saparated component.
|
||||
|
||||
#### Sequence join&connect
|
||||
|
||||
1. In the own database of community_A the entites *Community*, *CommunityFederation* and *CommunityApiVersion* are initialized
|
||||
2. When starting the *DHT-Node* of community_A it search per *apollo-ORM* for the own community entry and check on existing keypair *CommunityFederation.pubKey* and *CommunityFederation.privateKey* in the database. If they not exist, the *DHT-Node* generates the keypair *pubkey* and *privatekey* and writes them per *apollo-ORM* in the database
|
||||
3. For joining with the correct channel of *hyperswarm dht* a topic has to be used. The *DHT-Node* reads the configured value of the property *federation.dhtnode.topic*.
|
||||
4. with the *CommunityFederation.pubKey* and the *federation.dhtnode.topic* the *DHT-Node* joins the *hyperswarm dht* and listen for other *DHT-nodes* on the topic.
|
||||
5. As soon as a the *hyperswarm dht* notifies an additional node in the topic, the *DHT-node* reads the *pubKey* of this additional node and search it per *apollo-ORM* in the *CommunityFederation* table by filtering with *CommunityFederation.foreign* = TRUE
|
||||
6. if an entry with the C*ommunityFederation.pubKey* of the foreign node still exists and the *CommunityFederation.pubKeyVerifiedAt* is not NULL both the *DHT-node* and the foreign node had pass through the federation process before. Nevertheless the following steps and stages have to be processed for updating e.g the api versions or other meanwhile changed date.
|
||||
7. if an entry with the *CommunityFederation.pubKey* of the additional node can't be found, the *DHT-Node* starts with the next step *direct exchange* of the federation handshake anyway.
|
||||
|
||||
#### Sequence direct exchange
|
||||
|
||||
1. if the *CommunityFederation.pubKey* of the additional node does not exists in the *CommunityFederation* table the *DHT-node* starts a *direct exchange* with this foreign node to gets the data the first time, otherwise to update previous exchanged data.
|
||||
2. the *DHT-node* opens a direct connection per *hyperswarm* with the additional node and exchange respectively the *url* and *apiversion* between each other.
|
||||
1. to support the future feature that one community can provide several urls and apiversion at once the exchanged data should be in a format, which can represent structured information, like JSON (or simply CSV - feel free how to implement, but be aware about security aspects to avoid possible attacks during parsing the exchanged data and the used parsers for it)
|
||||
|
||||
```
|
||||
{
|
||||
"API":
|
||||
{
|
||||
"url" : "comB.com",
|
||||
"version" : "1.0",
|
||||
"validFrom" : "2022.01.01"
|
||||
}
|
||||
"API" :
|
||||
{
|
||||
"url" : "comB.com",
|
||||
"version" : "1.1",
|
||||
"validFrom" : "2022.04.15"
|
||||
}
|
||||
"API" :
|
||||
{
|
||||
"url" : "comB.de",
|
||||
"version" : "2.0",
|
||||
"validFrom" : "2022.06.01"
|
||||
}
|
||||
}
|
||||
```
|
||||
2. the *DHT-Node* writes per *apollo-ORM* the received and parsed data from the foreign node in the database
|
||||
|
||||
1. For the future an optimization step will be introduced here to avoid possible attacks of a foreign node by polute our database with mass of data.
|
||||
|
||||
1. before the *apollo-ORM* writes the data in the database, the *apollo-graphQL* invokes for all received urls and apiversions at the foreign node the request https.//`<url>/<apiversion>/getPubKey()`.
|
||||
2. Normally the foreign node will response in a very short time with its publicKey, because there will be nothing to en- or decrypt or other complex processing steps.
|
||||
3. if such a request runs in a timeout anyhow, the previous exchanged data with the foreign node will be almost certainly a fake and can be refused without storing in database. Break the further federation processing steps and stages and return back to stage1 join&connect.
|
||||
4. if the response is in time the received publicKey must be equals with the pubKey of the foreign node the *DHT-Node* gets from *hyperswarm dht* per topic during the join&connect stage before
|
||||
5. if both keys are the same, the writing of the exchanged data per *apollo-ORM* can go on.
|
||||
6. if both keys will not match the exchanged data during the direct connection will be almost certainly a fake and can be refused without storing in database. Break the further federation processing steps and stages and return back to stage1 join&connect.
|
||||
2. the *apollo-ORM* inserts / updates or deletes the received data as follow
|
||||
|
||||
* insert/update in the *CommunityFederation* table for this foreign node:
|
||||
|
||||
| Column | insert | update |
|
||||
| ------------------------------------ | -------------------- | :------------------ |
|
||||
| communityFederation.id | next sequence value | keep existing value |
|
||||
| communityFederation.uuid | null | keep existing value |
|
||||
| communityFederation.foreign | TRUE | keep existing value |
|
||||
| communityFederation.createdAt | NOW | keep existing value |
|
||||
| communityFederation.privateKey | null | keep existing value |
|
||||
| communityFederation.pubKey | exchangedData.pubKey | keep existing value |
|
||||
| communityFederation.pubKeyVerifiedAt | null | keep existing value |
|
||||
| communityFederation.authenticatedAt | null | keep existing value |
|
||||
* for each exchangedData API
|
||||
|
||||
if API not exists in database then insert in the *CommunityApiVersion* table:
|
||||
|
||||
| Column | insert |
|
||||
| ----------------------------------------- | --------------------------- |
|
||||
| communityApiVersion.id | next sequence value |
|
||||
| communityApiVersion.communityFederationID | communityFederation.id |
|
||||
| communityApiVersion.url | exchangedData.API.url |
|
||||
| communityApiVersion.apiversion | exchangedData.API.version |
|
||||
| communityApiVersion.validFrom | exchangedData.API.validFrom |
|
||||
| communityApiVersion.verifiedAt | null |
|
||||
|
||||
if API exists in database but was not part of the last data exchange, then delete it from the *CommunityApiVersion* table
|
||||
|
||||
if API exists in database and was part of the last data exchange, then update it in the *CommunityApiVersion* table
|
||||
|
||||
| Column | update |
|
||||
| ----------------------------------------- | --------------------------- |
|
||||
| communityApiVersion.id | keep existing value |
|
||||
| communityApiVersion.communityFederationID | keep existing value |
|
||||
| communityApiVersion.url | keep existing value |
|
||||
| communityApiVersion.apiversion | keep existing value |
|
||||
| communityApiVersion.validFrom | exchangedData.API.validFrom |
|
||||
| communityApiVersion.verifiedAt | keep existing value |
|
||||
*
|
||||
3. After all received data is stored successfully, the *DHT-Node* starts the *stage2 - Authentication* of the federation handshake
|
||||
|
||||
### Stage2 - Authentication
|
||||
|
||||
The 2nd stage of federation is called *authentication*, because during the 1st stage the *hyperswarm dht* only ensures the knowledge that one node is the owner of its keypairs *pubKey* and *privateKey*. The exchanged data between two nodes during the *direct exchange* on the *hyperswarm dht channel* must be verified, means ensure if the proclaimed *url(s)* and *apiversion(s)* of a node is the correct address to reach the same node outside the hyperswarm infrastructure.
|
||||
|
||||
As mentioned before the *DHT-node* invokes the *authentication* stage on *apollo server* *graphQL* with the previous stored data of the foreign node.
|
||||
|
||||
#### Sequence - view of existing Community
|
||||
|
||||
1. the authentication stage starts by reading for the *foreignNode* from the previous federation step all necessary data
|
||||
1. select with the *foreignNode.pubKey* from the tables *CommunityFederation* and *CommunityApiVersion* where *CommunityApiVersion.validFrom* <= NOW and *CommunityApiVersion.verifiedAt* = null
|
||||
2. the resultSet will be a list of data with the following attributes
|
||||
* foreignNode.pubKey
|
||||
* foreignNode.url
|
||||
* foreignNode.apiVersion
|
||||
2. read the own keypair and uuid by `select uuid, privateKey, pubKey from CommunityFederation cf where cf.foreign = FALSE`
|
||||
3. for each entry of the resultSet from step 1 do
|
||||
1. encryptedURL = encrypting the *foreignNode.url* and *foreignNode.apiVersion* with the *foreignNode.pubKey*
|
||||
2. signedAndEncryptedURL = sign the result of the encryption with the own *privateKey*
|
||||
3. invoke the request `https://<foreignNode.url>/<foreignNode.apiVersion>/openConnection(own.pubKey, signedAndEncryptedURL )`
|
||||
4. the foreign node will response immediately with an empty response OK, otherwise break the authentication stage with an error
|
||||
4. the foreign node will process the request on its side - see [description below](#Sequence - view of new Community) - and invokes a redirect request base on the previous exchanged data during stage1 - Federation. This could be more than one redirect request depending on the amount of supported urls and apiversions we propagate to the foreignNode before.
|
||||
1. if the other community will not react with an `openConnectionRedirect`-request, ther will be an error like missmatching data and the further federation processing will end and go back to join&connect.
|
||||
5. for each received request `https://<own.url>/<own.apiVersion>/openConnectionRedirect(onetimecode, foreignNode.url, encryptedRedirectURL )` do
|
||||
1. with the given parameter the following steps will be done
|
||||
1. search for the *foreignNode.pubKey* by `select cf.pubKey from CommunityApiVersion cav, CommunityFederation cf where cav.url = foreignNode.url and cav.communityFederationID = cf.id`
|
||||
2. decrypt with the `own.privateKey` the received `encryptedRedirectURL` parameter, which contains a full qualified url inc. apiversion and route
|
||||
3. verify signature of `encryptedRedirectURL` with the previous found *foreignNode.pubKey* from the own database
|
||||
4. if the decryption and signature verification are successful then encrypt the *own.uuid* with the *own.privateKey* to *encryptedOwnUUID*
|
||||
5. invoke the redirect request with https://`<redirect.URL>(onetimecode, encryptedOwnUUID)` and
|
||||
6. wait for the response with the `encryptedForeignUUID`
|
||||
7. decrypt the `encrpytedForeignUUID` with the *foreignNode.pubKey*
|
||||
8. write the encrypted *foreignNode.UUID* in the database by updating the CommunityFederation table per `update CommunityFederation cf set values (cf.uuid = foreignNode.UUID, cf.pubKeyVerifiedAt = NOW) where cf.pubKey = foreignNode.pubkey`
|
||||
|
||||
After all redirect requests are process, all relevant authentication data of the new community are well know here and stored in the database.
|
||||
|
||||
#### Sequence - view of new Community
|
||||
|
||||
This chapter contains the description of the Authentication Stage on the new community side as the request `openConnection(pubKey, signedAndEncryptedURL)`
|
||||
|
||||
As soon the *openConnection* request is invoked:
|
||||
|
||||
1. decrypted the 2nd `parameter.signedAndEncryptedURL` with the own *privatKey*
|
||||
2. with the 1st parameter *pubKey* search in the own database `select uuid, url, pubKey from CommunityFederation cf where cf.foreign = TRUE and cf.pubKey = parameter.pubKey`
|
||||
3. check if the decrypted `parameter.signedAndEncryptedURL` is equals the selected url from the previous selected CommunityFederationEntry
|
||||
1. if not then break the further processing of this request by only writing an error-log event. There will be no answer to the invoker community, because this community will only go on with a `openConnectionRedirect`-request from this community.
|
||||
2. if yes then verify the signature of `parameter.signedAndEncryptedURL` with the `cf.pubKey` read in step 2 before
|
||||
3.
|
||||
4.
|
||||
|
||||
### Stage3 - Autorized Business Communication
|
||||
|
||||
ongoing
|
||||
|
||||
# Review von Ulf
|
||||
|
||||
## Communication concept
|
||||
|
||||
The communication happens in 4 stages.
|
||||
|
||||
- Stage1: Federation
|
||||
- Stage2: Direct-Connection
|
||||
- Stage3: GraphQL-Verification
|
||||
- Stage4: GraphQL-Content
|
||||
|
||||
### Stage1 - Federation
|
||||
|
||||
Using the hyperswarm dht library we can find eachother easily and exchange a pubKey and data of which we know that the other side owns the private key of.
|
||||
|
||||
```
|
||||
ComA ---- announce ----> DHT
|
||||
ComB <--- listen ------- DHT
|
||||
```
|
||||
|
||||
Each peer will know the `pubKey` of the other participants. Furthermore a direct connection is possible.
|
||||
|
||||
```
|
||||
ComB ---- connect -----> ComA
|
||||
ComB ---- data --------> ComA
|
||||
```
|
||||
|
||||
### Stage2 - Direct-Connection
|
||||
|
||||
The hyperswarm dht library offers a secure channel based on the exchanged `pubKey` so we do not need to verify things.
|
||||
|
||||
The Idea is now to exchange the GraphQL Endpoints and their corresponding versions API versions in form of json
|
||||
|
||||
```
|
||||
{
|
||||
"API": {
|
||||
"1.0": "https://comB.com/api/1.0/",
|
||||
"1.1": "https://comB.com/api/1.1/",
|
||||
"2.4": "https://comB.de/api/2.4/"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Stage3 - GraphQL-Verification
|
||||
|
||||
The task of Stage3 is to verify that the collected data through the two Federation Stages are correct, since we did not verify yet that the proclaimed URL is actually the guy we talked to in the federation. Furthermore the sender must be verified to ensure the queried community does not reveal things to a third party not authorized.
|
||||
|
||||
```
|
||||
ComA ----- verify -----> ComB
|
||||
ComA <---- authorize --- ComB
|
||||
```
|
||||
|
||||
Assuming this Dataset on ComA after a federation (leaving out multiple API endpoints to simplify things):
|
||||
|
||||
```
|
||||
| PubKey | API-Endpoint | PubKey Verified On |
|
||||
|--------|---------------|--------------------|
|
||||
| PubA* | ComA.com/api/ | NULL |
|
||||
| PubB | ComB.com/api/ | NULL |
|
||||
| PubC | ComB.com/api/ | NULL |
|
||||
|
||||
* = self
|
||||
```
|
||||
|
||||
using the GraphQL Endpoint to query things:
|
||||
|
||||
```
|
||||
ComA ---- getPubKey ---> ComB.com
|
||||
ComA <--- PubB --------- ComB.com
|
||||
|
||||
ComA UPDATE database SET pubKeyVerifiedOn = now WHERE API-Endpoint=queryURL AND PubKey=QueryResult
|
||||
```
|
||||
|
||||
resulting in:
|
||||
|
||||
```
|
||||
| PubKey | API-Endpoint | PubKey Verified On |
|
||||
|--------|---------------|--------------------|
|
||||
| PubA* | ComA.com/api/ | 1.1.1970 |
|
||||
| PubB | ComB.com/api/ | NOW |
|
||||
| PubC | ComB.com/api/ | NULL |
|
||||
```
|
||||
|
||||
Furthermore we use the Header to transport a proof of who the caller is when calling and when answering:
|
||||
|
||||
```
|
||||
ComA ---- getPubKey, sign({pubA, crypt(timeToken,pubB)},privA) --> ComB.com
|
||||
ComB: is pubA known to me?
|
||||
ComB: is the signature correct?
|
||||
ComB: can I decrypt payload?
|
||||
ComB: is timeToken <= 10sec?
|
||||
ComA <----- PubB, sign({timeToken}, privB) ----------------------- ComB.com
|
||||
ComA: is timeToken correct?
|
||||
ComA: is signature correct?
|
||||
```
|
||||
|
||||
This process we call authentication and can result in several errors:
|
||||
|
||||
1. Your pubKey was not known to me
|
||||
2. Your signature is incorrect
|
||||
3. I cannot decrypt your payload
|
||||
4. Token Timeout (recoverable)
|
||||
5. Result token was incorrect
|
||||
6. Result signature was incorrect
|
||||
|
||||
```
|
||||
| PubKey | API-Endpoint | PubKey Verified On | AuthenticationLastSuccess |
|
||||
|--------|---------------|--------------------|----------------------------|
|
||||
| PubA* | ComA.com/api/ | 1.1.1970 | 1.1.1970 |
|
||||
| PubB | ComB.com/api/ | NOW | NOW |
|
||||
| PubC | ComB.com/api/ | NULL | NULL |
|
||||
```
|
||||
|
||||
The next process is the authorization. This happens on every call on the receiver site to determine which call is allowed for the other side.
|
||||
|
||||
```
|
||||
ComA ---- getPubKey, sign({pubA, crypt(timeToken,pubB)},privA) --> ComB.com
|
||||
ComB: did I verify pubA? SELECT PubKeyVerifiedOn FROm database WHERE PubKey = pubA
|
||||
ComB: is pubA allowed to query this?
|
||||
```
|
||||
|
||||
@ -0,0 +1,650 @@
|
||||
<mxfile host="65bd71144e">
|
||||
<diagram id="jqy9GLoHfEna4h-l2pXZ" name="Seite-1">
|
||||
<mxGraphModel dx="1302" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2336" pageHeight="1654" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="57" value="<div><span>&nbsp; &nbsp; &nbsp; &nbsp;new Community-B</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" parent="1" vertex="1">
|
||||
<mxGeometry x="1365" y="1340" width="920" height="294" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="153" value="&nbsp; Apollo-Server" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;gradientColor=#7ea6e0;gradientDirection=north;fontStyle=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="1375" y="1370" width="900" height="240" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="44" value="<div><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new infrastructure Community-B</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" parent="1" vertex="1">
|
||||
<mxGeometry x="1365" y="811" width="920" height="450" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="148" value="&nbsp; Apollo-Server" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;gradientColor=#7ea6e0;gradientDirection=north;fontStyle=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="1390" y="856" width="853.14" height="270" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="42" value="<div style="text-align: center"><span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;existing infrastructure Community-A</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#97d077;" parent="1" vertex="1">
|
||||
<mxGeometry x="75" y="841" width="490" height="480" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="147" value="&nbsp; Apollo-Server" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#006600;fontColor=#ffffff;strokeColor=#2D7600;align=left;gradientColor=#ffffff;fontStyle=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="85" y="881" width="470" height="310" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="144" value="<div><span>&nbsp; &nbsp; &nbsp; &nbsp;new infrastructure Community-B</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" parent="1" vertex="1">
|
||||
<mxGeometry x="1365" y="400" width="280" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="143" value="<div style="text-align: center"><span>&nbsp; &nbsp; existing Infrastructure Community-A</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#97d077;" parent="1" vertex="1">
|
||||
<mxGeometry x="285" y="320" width="280" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="39" value="<div><span>&nbsp; &nbsp; &nbsp; &nbsp;new infrastrucutre Community-B</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" parent="1" vertex="1">
|
||||
<mxGeometry x="1363.14" y="530" width="440" height="240" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="35" value="<div style="text-align: center"><span>&nbsp; &nbsp; &nbsp; &nbsp;existing Infrastructure Community-A</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#97d077;" parent="1" vertex="1">
|
||||
<mxGeometry x="123.14" y="530" width="440" height="240" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="2" value="<div style="text-align: center"><span>&nbsp; &nbsp; existing Infrastructure Community-A</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#97d077;" parent="1" vertex="1">
|
||||
<mxGeometry x="285" y="40" width="360" height="140" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="138" style="edgeStyle=none;html=1;fontSize=10;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="3" target="137" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="DHT-Node<br>- dht_gradido-topic<br><div style="text-align: left"><span><font color="#ff0000"><b>- keypair_A</b></font></span></div>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#008a00;fontColor=#ffffff;strokeColor=#005700;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="485" y="80" width="160" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="<div><span>&nbsp; &nbsp; &nbsp; &nbsp;new infrastructure Community-B</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" parent="1" vertex="1">
|
||||
<mxGeometry x="1285" y="180" width="320" height="160" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="141" style="edgeStyle=none;html=1;fontSize=12;fontColor=#000000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="5" target="140" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="dht-node<br><div style="text-align: left"><span>- dht_gradido_topic</span></div><div style="text-align: left"><span><font color="#ff0000">- keypair_B</font></span></div>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="1295" y="240" width="140" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="15" value="" style="endArrow=classic;html=1;fontSize=14;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="565" y="220" as="sourcePoint"/>
|
||||
<mxPoint x="1005" y="220" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="17" value="<b>&nbsp; join_AsServer</b>(dht_gradido_topic, <font color="#cc0000">keypair_A.pubKey</font>)&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="15" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.2216" relative="1" as="geometry">
|
||||
<mxPoint x="-36" y="-1" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="19" value="" style="endArrow=classic;html=1;fontSize=14;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1365" y="360" as="sourcePoint"/>
|
||||
<mxPoint x="565" y="360" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="20" value="<b>&nbsp; join_AsClient</b>(dht_gradido_topic, <font color="#cc0000">keypair_B.pubKey</font>)&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="19" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.4162" relative="1" as="geometry">
|
||||
<mxPoint x="126" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="23" value="" style="endArrow=none;html=1;fontSize=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" target="3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="565" y="1620" as="sourcePoint"/>
|
||||
<mxPoint x="995" y="330" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="24" value="" style="endArrow=none;html=1;fontSize=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" target="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1365" y="1620" as="sourcePoint"/>
|
||||
<mxPoint x="1095" y="40" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="25" value="dht-node<br>- dht_gradido-topic<br><div style="text-align: left"><span>- keypair_A</span></div><div style="text-align: left"><span><font color="#ff8000">* pubKey_B</font></span></div>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#008a00;fontColor=#ffffff;strokeColor=#005700;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="405" y="360" width="160" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="26" value="dht-node<br><div style="text-align: left"><span>- dht_gradido_topic</span></div><div style="text-align: left"><span>- keypair_B</span></div><div style="text-align: left"><span><font color="#ff8000">* pubKey_A</font></span></div>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="1365" y="430" width="140" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="27" value="" style="endArrow=classic;html=1;fontSize=14;entryX=0;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" parent="1" source="25" target="26" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="565" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="1365" y="460" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="28" value="<b>&nbsp; connect</b>( socket_B( <font color="#cc0000">keypair_A.pubKey</font>) )&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="27" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.2216" relative="1" as="geometry">
|
||||
<mxPoint x="-129" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="31" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;fontSize=14;" parent="1" edge="1">
|
||||
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||
<mxPoint x="563.14" y="560" as="sourcePoint"/>
|
||||
<mxPoint x="1363.14" y="560" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="32" value="&nbsp; SocketStream( exchange (<font color="#cc0000">url_A, apiVer_A</font>), exchange(<font color="#cc0000">url_B, apiVer_B</font>) )&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="31" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.215" y="-1" relative="1" as="geometry">
|
||||
<mxPoint x="46" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="33" value="dht-node<br>- dht_gradido-topic<br><div style="text-align: left"><span>- keypair_A</span></div>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#008a00;fontColor=#ffffff;strokeColor=#005700;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="403.14" y="560" width="160" height="57" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="34" value="dht-node<br><div style="text-align: left"><span>- dht_gradido_topic</span></div><div style="text-align: left"><span>- keypair_B</span></div>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="1363.14" y="560" width="140" height="57" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="46" value="" style="endArrow=classic;html=1;fontSize=14;entryX=0;entryY=0.25;entryDx=0;entryDy=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="48" target="51" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="545" y="931" as="sourcePoint"/>
|
||||
<mxPoint x="975" y="941" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="47" value="<b>&nbsp; request: </b>http://&lt;url_B&gt;/&lt;apiVer_B&gt;/<b>openConnection</b>( <b><font color="#ff0000">pubkey_A</font></b>, <font color="#ff0000"><b>encrypted and signed url_A</b></font>)&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="46" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.215" y="-1" relative="1" as="geometry">
|
||||
<mxPoint x="137" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="48" value="encrypt <font color="#000000">url_A</font>&nbsp;with <font color="#ff8000">pubkey_B</font> +<br>sign it with privatKey_A&nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="350" y="896" width="195" height="38.5" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="49" value="" style="endArrow=classic;html=1;fontSize=14;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="100" target="87" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="995" y="651" as="sourcePoint"/>
|
||||
<mxPoint x="1045" y="601" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="50" value="<b>&nbsp; request: </b>http://&lt;url_A&gt;/&lt;apiVer_A&gt;//<b>openConnectionRedirect</b>(<font color="#ff00ff"><b>onetimeCode</b></font>, url_B, encrypted and signed&nbsp;<font color="#cc0000"><b>redirect_URL</b></font>)&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="49" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.255" y="2" relative="1" as="geometry">
|
||||
<mxPoint x="97" y="-1" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="132" style="edgeStyle=none;html=1;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=none;endFill=0;dashed=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;" parent="1" source="51" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1365" y="926" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="51" value="decrypt <font color="#ff0000"><b>encoded_url_A</b></font>&nbsp; <br>with <font color="#000000">privatkey_B</font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1406.8600000000001" y="896" width="180" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="84" value="" style="edgeStyle=none;html=1;fontColor=#00FF00;startArrow=none;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="98" target="83" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="53" value="<span style="color: rgb(0 , 153 , 0)">url_A of&nbsp;</span><font color="#009900">pubkey_A</font><br>==&nbsp;<font color="#ff0000">url_A</font>?" style="rhombus;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1998.14" y="880.25" width="150" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="55" value="<div style="text-align: center"><span>&nbsp; &nbsp; &nbsp; &nbsp;existing infrastructure Community-A</span></div>" style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;fontStyle=1;fontSize=14;align=left;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#97d077;" parent="1" vertex="1">
|
||||
<mxGeometry x="45" y="1370" width="520" height="264" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="74" value="" style="edgeStyle=none;html=1;fontSize=14;fontColor=#FF8000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="64" target="65" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="155" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="65" target="154" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="64" value="decrypt encoded parameters&nbsp;with privatkey_B" style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1385" y="1411" width="280" height="28" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="80" value="" style="endArrow=none;dashed=1;html=1;strokeWidth=4;fontSize=14;fontColor=#FF8000;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="5" y="803" as="sourcePoint"/>
|
||||
<mxPoint x="2325" y="800" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="81" value="<font style="font-size: 24px;">Federation</font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=24;fontColor=#000000;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="5" y="40" width="120" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="82" value="<font style="font-size: 24px;">Authentication</font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=24;fontColor=#000000;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="5" y="812" width="140" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="83" value="<font color="#009900">url_A</font><font color="#00ff00">&nbsp;</font>==<br>&nbsp;&nbsp;<font color="#ff0000">unsigned url_A</font>?" style="rhombus;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1753.14" y="946" width="180" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="85" value="" style="endArrow=classic;html=1;fontSize=14;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="113" target="128" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="595" y="1101" as="sourcePoint"/>
|
||||
<mxPoint x="1377.1999999999998" y="913" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="86" value="<b>&nbsp; redirect: </b>http://&lt;<b>redirect_URL</b>&gt;( <font color="#ff00ff"><b>onetimeCode</b></font>,&nbsp;<font color="#ff0000"><b>encrypted&nbsp;uuid_A</b></font>)&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="85" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.215" y="-1" relative="1" as="geometry">
|
||||
<mxPoint as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="123" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="87" target="122" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="87" value="decrypt <font color="#ff0000"><b>redirect_URL</b></font>&nbsp;with <font color="#000000">privatekey_A</font>&nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="255" y="948.5" width="290" height="22.5" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="104" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=0.349;exitY=1.025;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="88" target="130" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points"/>
|
||||
<mxPoint x="2244.4199999999996" y="1071" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="88" value="decrypt <font color="#ff0000"><b>encoded_uuid_A</b></font>&nbsp; <br>with <font color="#00ff00" style="font-weight: bold">pubkey_A</font> of <font color="#ff00ff" style="font-weight: bold">oneTImeCode</font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1803.14" y="1021" width="226.28" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="90" value="found &amp; valid<br><font color="#ff00ff">oneTimeCode</font>?" style="rhombus;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1586.8600000000001" y="1016" width="180" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="91" value="" style="endArrow=classic;html=1;fontSize=14;fontColor=#FF8000;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="90" target="88" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1366.8600000000001" y="1076" as="sourcePoint"/>
|
||||
<mxPoint x="1416.8600000000001" y="1026" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="95" value="" style="endArrow=classic;html=1;fontSize=14;entryX=1;entryY=0.75;entryDx=0;entryDy=0;" parent="1" target="48" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1365" y="925" as="sourcePoint"/>
|
||||
<mxPoint x="565" y="891" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="96" value="<b>&nbsp; response:</b>&nbsp;OK" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="95" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.255" y="2" relative="1" as="geometry">
|
||||
<mxPoint x="52" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="98" value="verify&nbsp;<font color="#ff0000">signed_url_A</font>&nbsp; <br>with <font color="#009900">pubkey_A</font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1773.14" y="896" width="140" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="99" value="" style="edgeStyle=none;html=1;fontColor=#00FF00;endArrow=classic;endFill=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="53" target="98" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1573.14" y="911" as="sourcePoint"/>
|
||||
<mxPoint x="1808.14" y="911" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="100" value="encrypt redirect_URL (inc. apiVersion)&nbsp;&nbsp;<br>with <font color="#009900">publickey_A</font> + sign with <font color="#009900">privatKey_B</font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1406.8600000000001" y="951" width="276.28" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="101" value="" style="endArrow=classic;html=1;fontSize=14;fontColor=#FF8000;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=0;endFill=1;" parent="1" source="83" target="100" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1713.14" y="981" as="sourcePoint"/>
|
||||
<mxPoint x="1364.5800000000002" y="980" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="107" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontColor=#000000;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="130" target="106" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points"/>
|
||||
<mxPoint x="1898.14" y="1126" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="134" value="2." style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#FF0000;" parent="107" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.9248" relative="1" as="geometry">
|
||||
<mxPoint x="-14" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="106" value="encrypt <font color="#000000"><b>uuid_B</b></font>&nbsp;with <b>privatkey_B</b>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1406.8600000000001" y="1081" width="226.28" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="108" value="" style="endArrow=classic;html=1;fontSize=14;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="106" target="110" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1373.56" y="1012.2" as="sourcePoint"/>
|
||||
<mxPoint x="575" y="1013" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="109" value="<b>&nbsp; response:<font color="#ff0000"> </font></b><b><font color="#ff0000">encoded_uuid_B</font></b>&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="108" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.255" y="2" relative="1" as="geometry">
|
||||
<mxPoint x="72" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="110" value="decrypt <font color="#ff0000"><b>encoded_uuid_B</b></font>&nbsp;&nbsp;<br>with <font color="#ff0000"><b>pubkey_B</b></font> &nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="365" y="1066" width="180" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="112" value="" style="endArrow=classic;html=1;fontSize=14;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="110" target="135" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="575" y="1150.2" as="sourcePoint"/>
|
||||
<mxPoint x="530" y="1151" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="113" value="<span style="color: rgb(255 , 255 , 255) ; font-size: 14px ; text-align: left">encrypt&nbsp;</span><font color="#000000" style="font-size: 14px ; text-align: left">uuid_A</font><span style="color: rgb(255 , 255 , 255) ; font-size: 14px ; text-align: left">&nbsp;with </span><span style="font-size: 14px ; text-align: left"><font color="#000000">privatKey_A</font></span><span style="color: rgb(255 , 255 , 255) ; font-size: 14px ; text-align: left">&nbsp;</span>" style="rounded=0;whiteSpace=wrap;html=1;fontColor=#ffffff;fillColor=#60a917;strokeColor=#2D7600;" parent="1" vertex="1">
|
||||
<mxGeometry x="325" y="1023.5" width="220" height="25" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="115" value="" style="endArrow=none;dashed=1;html=1;strokeWidth=4;fontSize=14;fontColor=#FF8000;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="5" y="1333" as="sourcePoint"/>
|
||||
<mxPoint x="2325" y="1330" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="120" value="search <font color="#ff0000"><b>pubKey_A</b></font>&nbsp;in <br>local Community-List" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1613.14" y="896" width="140" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="121" value="" style="endArrow=classic;html=1;fontSize=14;fontColor=#FF8000;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;endFill=1;" parent="1" source="51" target="120" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1586.8600000000004" y="921" as="sourcePoint"/>
|
||||
<mxPoint x="1853.14" y="921" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="122" value="search with&nbsp;<font color="#000000">url_B</font>&nbsp;for the&nbsp;<font color="#ff0000"><b>pubkey_B</b></font>&nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="95" y="940" width="140" height="38.5" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="127" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontColor=#000000;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=0.128;exitY=0.98;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="126" target="113" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="292" y="1036"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="126" value="verify sign of&nbsp;<b style="color: rgb(255 , 0 , 0)">redirect_URL</b>&nbsp;with <font color="#ff0000"><b>pubKey_B</b></font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="255" y="978.5" width="290" height="25" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="129" style="edgeStyle=none;html=1;entryX=0.061;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;fontColor=#000000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="128" target="90" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="128" value="search&nbsp;<span style="color: rgb(255 , 0 , 255) ; font-weight: 700">oneTImeCode</span>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1406.8600000000001" y="1026" width="146.28" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="130" value="overwrite&nbsp;<font color="#ff00ff" style="font-weight: bold">oneTImeCode </font>with&nbsp;decrypted&nbsp;<font color="#ff0000"><b>uuid_A</b></font>&nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1803.14" y="1081" width="160" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="135" value="insert&nbsp;<font color="#ff0000"><b>uuid_B&nbsp;</b></font>in entry with <font color="#ff0000"><b>pubkey_B</b></font> &nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="365" y="1131" width="180" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="137" value="<div style="color: rgb(0, 0, 0); font-size: 10px; font-weight: 700; text-align: left;">- uuid_A</div><div style="color: rgb(0, 0, 0); font-size: 10px; font-weight: 700; text-align: left;">- url_A<br style="font-size: 10px;"></div><div style="color: rgb(0, 0, 0); font-size: 10px; font-weight: 700; text-align: left;">- apiVer_A</div><div style="color: rgb(0, 0, 0); font-size: 10px; font-weight: 700; text-align: left;"><font color="#cc0000" style="font-size: 10px;">- privatkey_A<br style="font-size: 10px;"></font></div><div style="color: rgb(0, 0, 0); font-size: 10px; font-weight: 700; text-align: left;"><font color="#cc0000" style="font-size: 10px;">- publickey_A</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;fontColor=#FF0000;gradientColor=#006600;gradientDirection=north;fontSize=10;" parent="1" vertex="1">
|
||||
<mxGeometry x="305" y="75" width="100" height="90" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="139" value="<div style="font-size: 10px; font-weight: 700;"><font color="#000000">- uuid_A</font></div><div style="font-size: 10px; font-weight: 700;"><font color="#000000">- url_A<br style="font-size: 10px"></font></div><div style="font-size: 10px; font-weight: 700;"><font color="#000000">- apiVer_A</font></div><div style="font-size: 10px; font-weight: 700;"><font style="font-size: 10px" color="#000000">- privatkey_A<br style="font-size: 10px"></font></div><div style="font-size: 10px; font-weight: 700;"><font style="font-size: 10px" color="#000000">- publickey_A</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;fontColor=#FF0000;gradientColor=#006600;gradientDirection=north;fontSize=10;align=left;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="133.14" y="610" width="250" height="130" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="37" value="<font color="#ff8000" style="font-size: 12px;">&nbsp;* url_B / pubKey_B / apiVer_B<br style="font-size: 12px;"><br style="font-size: 12px;"></font>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;arcSize=30;gradientColor=#006600;gradientDirection=north;" parent="1" vertex="1">
|
||||
<mxGeometry x="213.14" y="685" width="170" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="140" value="<div style="color: rgb(0 , 0 , 0) ; font-size: 10px ; font-weight: 700 ; text-align: left">- uuid_B</div><div style="color: rgb(0 , 0 , 0) ; font-size: 10px ; font-weight: 700 ; text-align: left">- url_B<br style="font-size: 10px"></div><div style="color: rgb(0 , 0 , 0) ; font-size: 10px ; font-weight: 700 ; text-align: left">- apiVer_B</div><div style="color: rgb(0 , 0 , 0) ; font-size: 10px ; font-weight: 700 ; text-align: left"><font color="#cc0000" style="font-size: 10px">- privatkey_B<br style="font-size: 10px"></font></div><div style="color: rgb(0 , 0 , 0) ; font-size: 10px ; font-weight: 700 ; text-align: left"><font color="#cc0000" style="font-size: 10px">- publickey_B</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;gradientColor=#7ea6e0;gradientDirection=north;fontSize=10;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1485" y="235" width="100" height="90" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="142" value="<div style="font-size: 10px ; font-weight: 700"><font color="#000000">- uuid_B</font></div><div style="font-size: 10px ; font-weight: 700"><font color="#000000">- url_B<br style="font-size: 10px"></font></div><div style="font-size: 10px ; font-weight: 700"><font color="#000000">- apiVer_B</font></div><div style="font-size: 10px ; font-weight: 700"><font style="font-size: 10px" color="#000000">- privatkey_B<br style="font-size: 10px"></font></div><div style="font-size: 10px ; font-weight: 700"><font style="font-size: 10px" color="#000000">- publickey_B</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;gradientColor=#7ea6e0;gradientDirection=north;fontSize=10;align=left;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1543.14" y="610" width="250" height="130" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="40" value="<font color="#ff8000" style="font-size: 12px">&nbsp;* url_A / pubKey_A / apiVer_A<br style="font-size: 12px"><br style="font-size: 12px"></font>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;align=left;arcSize=20;" parent="1" vertex="1">
|
||||
<mxGeometry x="1623.14" y="693" width="170" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="145" value="<div style="font-size: 10px; font-weight: 700;"><font color="#000000">- uuid_A</font></div><div style="font-size: 10px; font-weight: 700;"><font color="#000000">- url_A<br style="font-size: 10px"></font></div><div style="font-size: 10px; font-weight: 700;"><font color="#000000">- apiVer_A</font></div><div style="font-size: 10px; font-weight: 700;"><font style="font-size: 10px" color="#000000">- privatkey_A<br style="font-size: 10px"></font></div><div style="font-size: 10px; font-weight: 700;"><font style="font-size: 10px" color="#000000">- publickey_A</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;fontColor=#FF0000;gradientColor=#006600;gradientDirection=north;fontSize=10;align=left;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="105" y="1201" width="400" height="110" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="146" value="<div style="font-size: 10px ; font-weight: 700"><font color="#000000">- uuid_B</font></div><div style="font-size: 10px ; font-weight: 700"><font color="#000000">- url_B<br style="font-size: 10px"></font></div><div style="font-size: 10px ; font-weight: 700"><font color="#000000">- apiVer_B</font></div><div style="font-size: 10px ; font-weight: 700"><font style="font-size: 10px" color="#000000">- privatkey_B<br style="font-size: 10px"></font></div><div style="font-size: 10px ; font-weight: 700"><font style="font-size: 10px" color="#000000">- publickey_B</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;gradientColor=#7ea6e0;gradientDirection=north;fontSize=10;align=left;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1803.14" y="1136" width="440" height="110" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="43" value="1: * url_B / <font color="#ff0000"><b>pubkey_B</b></font> / apiVer_B<br>2: * url_B /&nbsp;<font color="#ff0000"><b>pubkey_B</b></font>&nbsp;/ apiVer_B <font color="#ff0000"><b>/ uuid-B</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;arcSize=22;gradientColor=#006600;gradientDirection=north;" parent="1" vertex="1">
|
||||
<mxGeometry x="185" y="1251" width="270" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="136" style="edgeStyle=none;html=1;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="135" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="320" y="1251" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="320" y="1156"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="125" style="edgeStyle=none;html=1;entryX=0.045;entryY=0.98;entryDx=0;entryDy=0;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;entryPerimeter=0;" parent="1" target="126" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="268" y="1251" as="sourcePoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="124" style="edgeStyle=none;html=1;entryX=0.1;entryY=-0.04;entryDx=0;entryDy=0;entryPerimeter=0;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" target="43" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="212" y="981" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="149" value="<font color="#000000">1:*</font><font color="#00ff00"> <b>url_A / pubkey_A</b></font> / apiVer_A<br><font color="#000000">2:*</font><font color="#00ff00">&nbsp;<b>url_A / pubkey_A</b></font>&nbsp;/ apiVer_A /&nbsp;<b><font color="#ff00ff">oneTimeCode<br></font></b><font color="#000000">3:*</font><font color="#00ff00">&nbsp;<b>url_A / pubkey_A</b></font>&nbsp;/ apiVer_A <b><font color="#00ff00">/ </font><font color="#ff0000">uuid_A</font></b><b><font color="#ff00ff"><br></font></b>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=14;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;align=left;arcSize=28;" parent="1" vertex="1">
|
||||
<mxGeometry x="1913.14" y="1171" width="320" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="131" style="edgeStyle=none;html=1;fontColor=#000000;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="1" source="130" target="149" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="2183.14" y="1236" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="1993.14" y="1101"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="133" value="1." style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#FF0000;" parent="131" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.4043" y="-2" relative="1" as="geometry">
|
||||
<mxPoint as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="67" value="" style="endArrow=classic;html=1;fontSize=14;fontColor=#FF8000;entryX=0.75;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;startArrow=none;" parent="1" source="120" target="149" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1353.14" y="886" as="sourcePoint"/>
|
||||
<mxPoint x="2082.64" y="816" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="1683.14" y="866"/>
|
||||
<mxPoint x="2153.14" y="866"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="119" style="edgeStyle=none;html=1;fontColor=#000000;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="149" target="53" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1893.14" y="831" as="sourcePoint"/>
|
||||
<mxPoint x="2073.14" y="946" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="150" value="<div style="font-size: 10px; font-weight: 700;"><font color="#000000">- uuid_A</font></div><div style="font-size: 10px; font-weight: 700;"><font color="#000000">- url_A<br style="font-size: 10px"></font></div><div style="font-size: 10px; font-weight: 700;"><font color="#000000">- apiVer_A</font></div><div style="font-size: 10px; font-weight: 700;"><font style="font-size: 10px" color="#000000">- privatkey_A<br style="font-size: 10px"></font></div><div style="font-size: 10px; font-weight: 700;"><font style="font-size: 10px" color="#000000">- publickey_A</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;fontColor=#FF0000;gradientColor=#006600;gradientDirection=north;fontSize=10;align=left;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="95" y="1520" width="400" height="104" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="56" value="&nbsp;* url_B / <font color="#ff0000"><b>pubkey_B</b></font> / uuid_B <font color="#ff8000"><b>/ name_B, etc.</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=14;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;arcSize=20;gradientColor=#006600;gradientDirection=north;" parent="1" vertex="1">
|
||||
<mxGeometry x="185" y="1580" width="300" height="34" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="151" value="&nbsp; Apollo-Server" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#006600;fontColor=#ffffff;strokeColor=#2D7600;align=left;gradientColor=#ffffff;fontStyle=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="55" y="1400" width="500" height="110" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="61" value="encrypt with <b style="font-size: 12px"><font color="#ff0000" style="font-size: 12px">pubkey_B&nbsp;</font></b>+ sign with <font style="font-size: 12px" color="#000000"><b style="font-size: 12px">privatekey_A</b></font><b style="font-size: 12px">:<br style="font-size: 12px">- <font color="#000000">uuid_A</font>,&nbsp;</b><b style="font-size: 12px">uuid_B,</b>&nbsp;payload : name_A, description_A, etc." style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="215" y="1410" width="330" height="28" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="59" value="" style="endArrow=classic;html=1;fontSize=14;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="61" target="64" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="925" y="1564" as="sourcePoint"/>
|
||||
<mxPoint x="975" y="1514" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="60" value="<b>&nbsp; request: </b>http://&lt;url_B&gt;/&lt;apiVer_B&gt;/familiarizeCommunity( encrypted+signed( uuid_A, uuid_B, payload) )&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="59" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.215" y="-1" relative="1" as="geometry">
|
||||
<mxPoint x="83" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="152" value="<div style="font-size: 10px ; font-weight: 700"><font color="#000000">- uuid_B</font></div><div style="font-size: 10px ; font-weight: 700"><font color="#000000">- url_B<br style="font-size: 10px"></font></div><div style="font-size: 10px ; font-weight: 700"><font color="#000000">- apiVer_B</font></div><div style="font-size: 10px ; font-weight: 700"><font style="font-size: 10px" color="#000000">- privatkey_B<br style="font-size: 10px"></font></div><div style="font-size: 10px ; font-weight: 700"><font style="font-size: 10px" color="#000000">- publickey_B</font></div>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;rounded=1;gradientColor=#7ea6e0;gradientDirection=north;fontSize=10;align=left;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1815" y="1496" width="450" height="110" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="160" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="58" target="159" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="2080" y="1462"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="58" value="&nbsp;* url_A / <font color="#ff0000"><b>pubkey_A</b></font> / apiVer_A / uuid_A <font color="#ff8000">/ <b>name_A, etc.</b></font>" style="rounded=1;whiteSpace=wrap;html=1;fontSize=14;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;align=left;arcSize=26;" parent="1" vertex="1">
|
||||
<mxGeometry x="1895" y="1564.5" width="370" height="23" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="156" style="edgeStyle=none;html=1;entryX=0.77;entryY=0.022;entryDx=0;entryDy=0;entryPerimeter=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="154" target="58" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="154" value="search entry with uuid_A" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="2101" y="1411" width="158.14" height="28" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="65" value="matching <br>uui_B&nbsp;?" style="rhombus;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1963.14" y="1400" width="120" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="157" value="" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=none;endFill=1;" parent="1" source="64" target="65" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1575" y="1430" as="sourcePoint"/>
|
||||
<mxPoint x="1733.1400000000003" y="1430" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="162" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="159" target="161" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="159" value="verify sign of parameters<br>with <font color="#ff0000"><b>pubkey_A</b></font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1835.35" y="1443" width="161.86" height="38" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="164" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="161" target="166" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="1743" y="1531"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="161" value="matching <br>uui_A ?" style="rhombus;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1683.14" y="1438" width="120" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="163" value="encrypt with <b style="font-size: 12px"><font color="#ff0000" style="font-size: 12px">pubkey_A&nbsp;</font></b>+ sign with <font style="font-size: 12px" color="#000000"><b style="font-size: 12px">privatekey_B</b></font><b style="font-size: 12px">:<br style="font-size: 12px"></b>- payload : name_B, description_B, etc." style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1385" y="1459" width="280" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="170" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="165" target="169" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="165" value="decrypt encoded parameters&nbsp;with privatkey_A<br>verify sign with<span style="color: rgb(0 , 0 , 0)"> </span><font color="#ff0000"><b>pubkey_B</b></font><span style="color: rgb(0 , 0 , 0)"><br></span>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="295" y="1464" width="250" height="29" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="62" value="" style="endArrow=classic;html=1;fontSize=14;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="163" target="165" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="995" y="1224" as="sourcePoint"/>
|
||||
<mxPoint x="1045" y="1174" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="63" value="<b>&nbsp; response:</b>&nbsp;encrypted + signed ( payload_B )&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="62" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.255" y="2" relative="1" as="geometry">
|
||||
<mxPoint x="52" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="167" style="edgeStyle=none;html=1;entryX=0;entryY=0;entryDx=0;entryDy=75;entryPerimeter=0;fontSize=12;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="166" target="152" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="1605" y="1571"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="168" style="edgeStyle=none;html=1;entryX=0.25;entryY=1;entryDx=0;entryDy=0;fontSize=12;fontColor=#FF0000;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="166" target="163" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="1455" y="1530"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="166" value="write payload in entry with <b style="font-size: 12px"><font color="#ff0000" style="font-size: 12px">pubkey_A</font></b><b style="font-size: 12px">:<br style="font-size: 12px"></b>- payload : name_A, description_A, etc." style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1495" y="1511" width="220" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="171" style="edgeStyle=none;html=1;entryX=0.25;entryY=0;entryDx=0;entryDy=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="169" target="56" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="169" value="write payload in entry with <b style="font-size: 12px"><font color="#ff0000" style="font-size: 12px">pubkey_B</font></b><b style="font-size: 12px">:<br style="font-size: 12px"></b>- payload : name_B, description_B, etc." style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#60a917;strokeColor=#2D7600;align=left;fontColor=#ffffff;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="1463" width="220" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="180" value="&nbsp; Apollo-Server" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#006600;fontColor=#ffffff;strokeColor=#2D7600;align=left;gradientColor=#ffffff;fontStyle=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="403.14" y="640" width="140" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="181" value="&nbsp; Apollo-Server" style="rounded=0;whiteSpace=wrap;html=1;fontSize=14;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;gradientColor=#7ea6e0;gradientDirection=north;fontStyle=1;verticalAlign=top;" parent="1" vertex="1">
|
||||
<mxGeometry x="1373.14" y="640" width="130" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="183" value="ask for pub<font color="#000000" style="font-size: 12px">key_A</font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1393.14" y="720" width="101.86" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="182" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="142" target="191" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="184" value="read&nbsp;<b style="font-size: 12px;">pubkey_A</b>&nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="430.93" y="720" width="90" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="185" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;exitX=1;exitY=1;exitDx=0;exitDy=-15;exitPerimeter=0;" parent="1" source="139" target="184" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="186" value="<font style="font-size: 24px">Autorized Communication</font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=24;fontColor=#000000;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="5" y="1340" width="440" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="189" value="ask for&nbsp;<b style="font-size: 12px">pubkey_B</b>&nbsp;" style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="430.93" y="679" width="108.14" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="187" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontSize=12;fontColor=#FFFFFF;startArrow=none;startFill=0;endArrow=classic;endFill=1;" parent="1" source="33" target="189" edge="1">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="188" value="<font color="#000000">url_B</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=12;fontColor=#FFFFFF;labelBackgroundColor=default;labelBorderColor=default;" parent="187" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.423" relative="1" as="geometry">
|
||||
<mxPoint x="1" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="174" value="" style="endArrow=classic;html=1;fontSize=14;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" parent="1" source="191" target="189" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1363.14" y="710" as="sourcePoint"/>
|
||||
<mxPoint x="563.14" y="710" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="175" value="<b>&nbsp; response:</b>&nbsp;pubkey_B" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="174" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.255" y="2" relative="1" as="geometry">
|
||||
<mxPoint x="52" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="172" value="" style="endArrow=classic;html=1;fontSize=14;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="189" target="191" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="563.14" y="690" as="sourcePoint"/>
|
||||
<mxPoint x="1363.14" y="690" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="173" value="<b>&nbsp; request: </b>http://&lt;<b>url_B</b>&gt;/&lt;<b>apiVer_B</b>&gt;/<b>getPubKey</b>()&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="172" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.215" y="-1" relative="1" as="geometry">
|
||||
<mxPoint x="76" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="190" style="edgeStyle=none;html=1;entryX=0.936;entryY=0;entryDx=0;entryDy=0;fontSize=12;fontColor=#000000;startArrow=none;startFill=0;endArrow=classic;endFill=1;entryPerimeter=0;exitX=0.89;exitY=1.004;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="34" target="183" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1488" y="620" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="192" value="url_A" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=12;fontColor=#000000;labelBorderColor=default;" parent="190" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.766" relative="1" as="geometry">
|
||||
<mxPoint as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="191" value="read pub<font color="#000000" style="font-size: 12px">key_B</font>" style="rounded=0;whiteSpace=wrap;html=1;fontSize=12;fillColor=#dae8fc;strokeColor=#6c8ebf;align=left;" parent="1" vertex="1">
|
||||
<mxGeometry x="1379.85" y="679" width="85.15" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="178" value="" style="endArrow=none;html=1;fontSize=14;startArrow=classic;startFill=1;endFill=0;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="184" target="183" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="563.14" y="730" as="sourcePoint"/>
|
||||
<mxPoint x="1363.14" y="730" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="179" value="<b>&nbsp; request: </b>http://&lt;<b>url_A</b>&gt;/&lt;<b>apiVer_A</b>&gt;/<b>getPubKey</b>()&nbsp;&nbsp;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="178" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.215" y="-1" relative="1" as="geometry">
|
||||
<mxPoint x="76" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="176" value="" style="endArrow=none;html=1;fontSize=14;startArrow=classic;startFill=1;endFill=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" parent="1" source="183" target="184" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1363.14" y="750" as="sourcePoint"/>
|
||||
<mxPoint x="563.14" y="750" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="177" value="<b>&nbsp; response:</b>&nbsp;pubkey_A" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=14;" parent="176" vertex="1" connectable="0">
|
||||
<mxGeometry x="0.255" y="2" relative="1" as="geometry">
|
||||
<mxPoint x="52" y="-3" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="41" value="" style="endArrow=classic;html=1;fontSize=14;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="183" target="40" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1773.14" y="510" as="sourcePoint"/>
|
||||
<mxPoint x="1823.14" y="460" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="36" value="" style="endArrow=classic;html=1;fontSize=14;exitX=0;exitY=0.5;exitDx=0;exitDy=0;startArrow=none;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="189" target="37" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="623.14" y="693" as="sourcePoint"/>
|
||||
<mxPoint x="243.14" y="652" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="193" value="" style="endArrow=none;dashed=1;html=1;strokeWidth=4;fontSize=14;fontColor=#FF8000;dashPattern=1 4;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="5" y="524" as="sourcePoint"/>
|
||||
<mxPoint x="2325" y="524" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="194" value="<font style="font-size: 18px">direct exchange</font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=18;fontColor=#000000;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="5" y="536" width="110" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="195" value="" style="endArrow=none;dashed=1;html=1;strokeWidth=4;fontSize=14;fontColor=#FF8000;dashPattern=1 4;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="5" y="180" as="sourcePoint"/>
|
||||
<mxPoint x="2325" y="180" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="196" value="<font style="font-size: 18px">join&amp;connect</font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=18;fontColor=#000000;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="5" y="192" width="140" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
|
After Width: | Height: | Size: 653 KiB |
BIN
docu/Style/Images/Bild_1_1920.jpg
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
docu/Style/Images/Bild_1_2400.jpg
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
docu/Style/Images/Bild_2_1920.jpg
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
docu/Style/Images/Bild_2_2400.jpg
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
docu/Style/Images/Bild_3_1920.jpg
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
docu/Style/Images/Bild_3_2400.jpg
Normal file
|
After Width: | Height: | Size: 180 KiB |
327
docu/graphics/brainstorm-gradido.drawio
Normal file
@ -0,0 +1,327 @@
|
||||
<mxfile host="65bd71144e">
|
||||
<diagram id="RL0nU6kSSy2ttf3N9WEb" name="Seite-1">
|
||||
<mxGraphModel dx="2348" dy="1231" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2336" pageHeight="1654" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="102" style="edgeStyle=none;html=1;fontSize=34;endArrow=none;endFill=0;" edge="1" parent="1" source="2" target="98">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="2" value="Community" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=17;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="720" y="320" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="99" style="edgeStyle=none;html=1;fontSize=34;endArrow=none;endFill=0;" edge="1" parent="1" source="3" target="98">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="User" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=17;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="800" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="100" style="edgeStyle=none;html=1;fontSize=34;endArrow=none;endFill=0;" edge="1" parent="1" source="4" target="98">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="Rollen &amp; Rechte" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=17;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="920" y="920" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="28" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="5" target="23">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="103" style="edgeStyle=none;html=1;fontSize=34;endArrow=none;endFill=0;" edge="1" parent="1" source="5" target="98">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="Konto" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=17;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1200" y="358.29" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="101" style="edgeStyle=none;html=1;fontSize=34;endArrow=none;endFill=0;" edge="1" parent="1" source="6" target="98">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="Contributions" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#d79b00;fontSize=17;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="640" y="720" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="8" style="edgeStyle=none;html=1;fontSize=15;endArrow=none;endFill=0;" edge="1" parent="1" source="7" target="5">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1642.6305768491611" y="320.00417540776294" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="96" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="7" target="92">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="7" value="Transaktionen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1560" y="320" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="10" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="9" target="2">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="9" value="Federation" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="460" y="270" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="19" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="11" target="3">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="11" value="Register" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1720" y="850" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="12" value="Login" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1720" y="890" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="18" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="13" target="14">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="13" value="Profile" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1720" y="930" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="14" value="Passwort" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1880" y="930" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="15" value="Email" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1880" y="970" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="16" value="Alias" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1880" y="1010" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="17" value="Sonstiges" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1880" y="1050" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="20" value="Umzug" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1720" y="970" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="21" value="DSGVO" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1720" y="1010" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="22" value="Löschen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1720" y="1050" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="30" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="23" target="29">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="23" value="Anlegen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="480" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="24" value="Anzeigen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="520" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="25" value="Kontoauszug" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="640" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="26" value="Umzug" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="560" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="27" value="Löschen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="600" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="29" value="Standard" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1520" y="480" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="31" value="AUF" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1520" y="520" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="32" value="Gemeinwohl" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1520" y="560" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="34" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="36" target="7">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="33" value="senden" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1750" y="380" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="85" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="35" target="83">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="35" value="empfangen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1750" y="420" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="36" value="schöpfen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1750" y="340" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="44" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="37" target="4">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="46" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="37" target="39">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="37" value="Rolle" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1080" y="1000" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="45" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="38" target="4">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="38" value="Recht" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="820" y="1030" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="39" value="User" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1220" y="1060" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="47" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="40" target="41">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="40" value="Admin" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1220" y="1100" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="41" value="SuperUser" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1500" y="1140" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="42" value="Support" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1220" y="1140" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="43" value="AUF-Admin" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1500" y="1180" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="48" value="Gemeinwohl-Admin" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1500" y="1220" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="49" value="Contribution-Admin" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1500" y="1260" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="50" value="Federation-Admin" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1500" y="1300" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="51" value="Backup-Admin" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1500" y="1340" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="57" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="52" target="42">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="52" value="Helpdesk" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="1180" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="53" value="Transaction" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="1220" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="54" value="Contribution" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="1260" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="55" value="Community" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="1300" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="56" value="User" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e6d0de;gradientColor=#d5739d;strokeColor=#996185;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1360" y="1340" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="64" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="58" target="6">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="58" value="anlegen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#d79b00;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="830" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="59" value="löschen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#d79b00;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="870" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="60" value="bearbeiten" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#d79b00;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="910" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="61" value="kategorisieren" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#d79b00;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="950" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="62" value="auswerten" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#d79b00;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="990" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="63" value="bestätigen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#d79b00;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="1030" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="72" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="65" target="66">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="65" value="Verwaltung" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="460" y="310" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="66" value="Community intern" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="310" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="67" value="Community extern" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="350" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="68" value="User" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="390" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="69" value="Contribution" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="430" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="70" value="Rollen&amp;Rechte" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="470" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="71" value="Konten" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="510" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="73" value="Backup-Provider" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="460" y="350" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="78" style="edgeStyle=none;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="74" target="73">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="74" value="Community<br>intern" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="460" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="75" value="User" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="500" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="76" value="Contribution" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="540" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="77" value="Konto" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="580" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="82" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="79" target="33">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="79" value="online" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1920" y="380" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="80" value="per Link" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1920" y="420" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="81" value="per QR-Code" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1920" y="460" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="83" value="online" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1750" y="490" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="84" value="redeem" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1750" y="530" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="86" value="Auswertung<span style="color: rgba(0 , 0 , 0 , 0) ; font-family: monospace ; font-size: 0px ; font-weight: 400">%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Verwaltung%22%20style%3D%22ellipse%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfillColor%3D%23d5e8d4%3BgradientColor%3D%2397d077%3BstrokeColor%3D%2382b366%3BfontSize%3D14%3BfontStyle%3D1%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221000%22%20y%3D%22300%22%20width%3D%22120%22%20height%3D%2240%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E</span>" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="460" y="390" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="88" value="Community<br>extern" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="500" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="89" value="User" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="540" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="90" value="Contribution" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="580" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="91" value="Konto" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="620" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="92" value="Blockchain" style="ellipse;whiteSpace=wrap;html=1;fillColor=#f5f5f5;gradientColor=#b3b3b3;strokeColor=#666666;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1560" y="140" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="93" value="senden" style="ellipse;whiteSpace=wrap;html=1;fillColor=#f5f5f5;gradientColor=#b3b3b3;strokeColor=#666666;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1760" y="200" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="94" value="empfangen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#f5f5f5;gradientColor=#b3b3b3;strokeColor=#666666;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1760" y="240" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="97" style="edgeStyle=none;html=1;fontSize=14;endArrow=none;endFill=0;" edge="1" parent="1" source="95" target="92">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="95" value="schöpfen" style="ellipse;whiteSpace=wrap;html=1;fillColor=#f5f5f5;gradientColor=#b3b3b3;strokeColor=#666666;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1760" y="160" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="98" value="G R A D I D O" style="ellipse;whiteSpace=wrap;html=1;fillColor=#ffcd28;gradientColor=#ffa500;strokeColor=#BD8800;fontSize=34;fontStyle=1;gradientDirection=radial;" vertex="1" parent="1">
|
||||
<mxGeometry x="880" y="480" width="320" height="320" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="105" style="edgeStyle=none;html=1;fontSize=34;endArrow=none;endFill=0;" edge="1" parent="1" source="104" target="25">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="104" value="Kassenbuch" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;gradientColor=#7ea6e0;strokeColor=#6c8ebf;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1520" y="690" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="107" style="edgeStyle=none;html=1;fontSize=34;endArrow=none;endFill=0;" edge="1" parent="1" source="106" target="92">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="106" value="Kassenbuch" style="ellipse;whiteSpace=wrap;html=1;fillColor=#f5f5f5;gradientColor=#b3b3b3;strokeColor=#666666;fontSize=14;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="1420" y="230" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
BIN
docu/other/Contribution/contribution-mockup-konzept.odt
Normal file
BIN
docu/other/Contribution/contribution-mockup-konzept.pdf
Normal file
@ -45,7 +45,6 @@ module.exports = {
|
||||
extensions: ['.js', '.vue'],
|
||||
// TODO: remove ignores
|
||||
ignores: [
|
||||
'/site.thx./',
|
||||
'/form./',
|
||||
'/time./',
|
||||
'/decay.types./',
|
||||
@ -55,7 +54,6 @@ module.exports = {
|
||||
'settings.password.set',
|
||||
'settings.password.set-password.text',
|
||||
'settings.password.subtitle',
|
||||
'site.login.signin',
|
||||
],
|
||||
enableFix: false,
|
||||
},
|
||||
|
||||
@ -99,5 +99,6 @@
|
||||
"not ie <= 10"
|
||||
],
|
||||
"author": "Gradido-Akademie - https://www.gradido.net/",
|
||||
"license": "Apache-2.0",
|
||||
"description": "Gradido, the Natural Economy of Life, is a way to worldwide prosperity and peace in harmony with nature. - Gradido, die Natürliche Ökonomie des lebens, ist ein Weg zu weltweitem Wohlstand und Frieden in Harmonie mit der Natur."
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 791 KiB After Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 504 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 353 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 350 KiB |
@ -17,10 +17,17 @@ body {
|
||||
|
||||
/* Navbar */
|
||||
a,
|
||||
.navbar-light .navbar-nav .nav-link {
|
||||
.navbar-light,
|
||||
.navbar-nav,
|
||||
.nav-link {
|
||||
color: #047006;
|
||||
}
|
||||
|
||||
a:hover,
|
||||
.nav-link:hover {
|
||||
color: #383838 !important;
|
||||
}
|
||||
|
||||
.navbar-light .navbar-nav .nav-link.active {
|
||||
color: rgb(35 121 188 / 90%);
|
||||
}
|
||||
@ -36,31 +43,58 @@ a,
|
||||
/* Button */
|
||||
.btn {
|
||||
border-radius: 25px;
|
||||
padding-right: 50px;
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
.btn-gradido {
|
||||
background-image: linear-gradient(146deg, rgb(220 167 44) 50%, rgb(197 141 56 / 100%) 100%);
|
||||
background-size: auto;
|
||||
background-position: 0% 0%;
|
||||
background-repeat: repeat;
|
||||
border-style: none;
|
||||
box-shadow: 10px 10px 50px 10px rgb(56 56 56 / 31%);
|
||||
display: inline-block;
|
||||
padding: 0.6em 3em;
|
||||
letter-spacing: 0.05em;
|
||||
color: #fff;
|
||||
transition: all 0.5s ease;
|
||||
background: rgb(249 205 105);
|
||||
background: linear-gradient(135deg, rgb(249 205 105 / 100%) 2%, rgb(197 141 56 / 100%) 55%);
|
||||
box-shadow: rgb(0 0 0 / 40%) 0 30px 90px;
|
||||
border-radius: 26px;
|
||||
padding-right: 50px;
|
||||
padding-left: 50px;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
.btn-gradido:hover {
|
||||
color: #212529;
|
||||
color: #fff;
|
||||
box-shadow: 0 5px 10px rgb(0 0 0 / 20%);
|
||||
}
|
||||
|
||||
.btn-gradido:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.btn-gradido-disable {
|
||||
padding: 0.6em 3em;
|
||||
letter-spacing: 0.05em;
|
||||
color: #fff;
|
||||
transition: all 0.5s ease;
|
||||
background: rgb(97 97 97);
|
||||
background: linear-gradient(135deg, rgb(180 180 180 / 100%) 46%, rgb(180 180 180 / 100%) 99%);
|
||||
box-shadow: rgb(0 0 0 / 40%) 0 30px 90px;
|
||||
border-radius: 26px;
|
||||
padding-right: 50px;
|
||||
padding-left: 50px;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
.btn-gradido-disable:hover {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-outline-gradido {
|
||||
color: rgb(140 121 88);
|
||||
border: 1px solid #f5b805;
|
||||
box-shadow: 10px 10px 50px 10px rgb(56 56 56 / 31%);
|
||||
}
|
||||
|
||||
.btn-outline-gradido:hover {
|
||||
box-shadow: 10px 10px 50px 10px rgb(56 56 56 / 0%);
|
||||
}
|
||||
|
||||
.form-control,
|
||||
|
||||
@ -1,10 +1,9 @@
|
||||
<template>
|
||||
<div>
|
||||
<b-carousel :interval="3000">
|
||||
<b-carousel :interval="13000">
|
||||
<b-carousel-slide img-src="/img/template/Foto_01_2400_small.jpg"></b-carousel-slide>
|
||||
<b-carousel-slide img-src="/img/template/Foto_02_2400_small.jpg"></b-carousel-slide>
|
||||
<b-carousel-slide img-src="/img/template/Foto_03_2400_small.jpg"></b-carousel-slide>
|
||||
<b-carousel-slide img-src="/img/template/Foto_04_2400_small.jpg"></b-carousel-slide>
|
||||
</b-carousel>
|
||||
</div>
|
||||
</template>
|
||||
@ -25,5 +24,10 @@ export default {
|
||||
.carousel-inner {
|
||||
height: 100%;
|
||||
border-radius: 0% 49% 49% 0% / 0% 51% 49% 0%;
|
||||
-webkit-border-radius: 0% 49% 49% 0% / 0% 51% 49% 0%;
|
||||
backface-visibility: hidden;
|
||||
-webkit-backface-visibility: hidden;
|
||||
transform: translate3d(0, 0, 0);
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
}
|
||||
</style>
|
||||
61
frontend/src/components/Auth/AuthFooter.vue
Normal file
@ -0,0 +1,61 @@
|
||||
<template>
|
||||
<footer class="footer">
|
||||
<b-row class="mt-lg-7 mt-md-6 mt-4">
|
||||
<b-col class="col-12 col-md-12 col-lg-6">
|
||||
<div
|
||||
class="d-flex justify-content-center justify-content-md-center justify-content-lg-start ml-3"
|
||||
>
|
||||
<b-nav class="nav-footer">
|
||||
<b-nav-item :href="`https://gradido.net/${$i18n.locale}/impressum/`" target="_blank">
|
||||
{{ $t('footer.imprint') }}
|
||||
</b-nav-item>
|
||||
<b-nav-item :href="`https://gradido.net/${$i18n.locale}/datenschutz/`" target="_blank">
|
||||
{{ $t('footer.privacy_policy') }}
|
||||
</b-nav-item>
|
||||
</b-nav>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col class="col-12 col-md-12 col-lg-6 mt-4 mb-4 mt-lg-0 mb-lg-0">
|
||||
<div class="text-center ml-3 ml-lg-0 text-lg-right pt-1">
|
||||
{{ $t('followUs') }}
|
||||
<b-link href="https://www.facebook.com/groups/Gradido/" target="_blank">
|
||||
<b-icon-facebook class="ml-3 mr-3 c-grey" font-scale="1"></b-icon-facebook>
|
||||
</b-link>
|
||||
<b-link href="https://twitter.com/gradido" target="_blank">
|
||||
<b-icon-twitter class="mr-3 c-grey" font-scale="1"></b-icon-twitter>
|
||||
</b-link>
|
||||
<b-link href="https://www.youtube.com/c/GradidoNet" target="_blank">
|
||||
<b-icon-youtube class="mr-3 c-grey" font-scale="1"></b-icon-youtube>
|
||||
</b-link>
|
||||
|
||||
<b-link href="https://t.me/Gradido" target="_blank">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="16"
|
||||
height="16"
|
||||
fill="currentColor"
|
||||
class="bi bi-telegram c-grey"
|
||||
viewBox="0 0 16 16"
|
||||
>
|
||||
<path
|
||||
d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.287 5.906c-.778.324-2.334.994-4.666 2.01-.378.15-.577.298-.595.442-.03.243.275.339.69.47l.175.055c.408.133.958.288 1.243.294.26.006.549-.1.868-.32 2.179-1.471 3.304-2.214 3.374-2.23.05-.012.12-.026.166.016.047.041.042.12.037.141-.03.129-1.227 1.241-1.846 1.817-.193.18-.33.307-.358.336a8.154 8.154 0 0 1-.188.186c-.38.366-.664.64.015 1.088.327.216.589.393.85.571.284.194.568.387.936.629.093.06.183.125.27.187.331.236.63.448.997.414.214-.02.435-.22.547-.82.265-1.417.786-4.486.906-5.751a1.426 1.426 0 0 0-.013-.315.337.337 0 0 0-.114-.217.526.526 0 0 0-.31-.093c-.3.005-.763.166-2.984 1.09z"
|
||||
/>
|
||||
</svg>
|
||||
</b-link>
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</footer>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'AuthFooter',
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.bi-telegram {
|
||||
margin-top: -5px;
|
||||
}
|
||||
</style>
|
||||
@ -9,36 +9,36 @@
|
||||
{{ $t('auth.left.newCurrency') }}
|
||||
</div>
|
||||
<img
|
||||
src="img/template/Blaetter.png"
|
||||
src="/img/template/Blaetter.png"
|
||||
class="sheet-img position-absolute d-block d-lg-none zindex1000"
|
||||
/>
|
||||
<b-img
|
||||
id="img0"
|
||||
class="position-absolute zindex1000"
|
||||
src="img/template/logo-header.png"
|
||||
src="/img/template/logo-header.png"
|
||||
alt="start background image"
|
||||
></b-img>
|
||||
<b-img
|
||||
fluid
|
||||
id="img1"
|
||||
class="position-absolute h-100 w-100 overflow-hidden zindex100"
|
||||
src="img/template/gold_03.png"
|
||||
src="/img/template/gold_03.png"
|
||||
alt="start background image"
|
||||
></b-img>
|
||||
<b-img
|
||||
id="img2"
|
||||
class="position-absolute zindex100"
|
||||
src="img/template/gradido_background_header.png"
|
||||
src="/img/template/gradido_background_header.png"
|
||||
alt="start background image"
|
||||
></b-img>
|
||||
<b-img
|
||||
id="img3"
|
||||
class="position-relative zindex10"
|
||||
src="img/template/Foto_01.jpg"
|
||||
src="/img/template/Foto_01.jpg"
|
||||
alt="start background image"
|
||||
></b-img>
|
||||
<div class="mobil-start-box-text position-fixed w-100 text-center zindex1000">
|
||||
<b-button variant="gradido" to="/register" @click="$emit('is-mobile-start', false)">
|
||||
<b-button variant="gradido" to="/register" @click="$emit('set-mobile-start', false)">
|
||||
{{ $t('signup') }}
|
||||
</b-button>
|
||||
<div class="mt-3 h3 text-white">
|
||||
@ -46,7 +46,7 @@
|
||||
<b-link
|
||||
to="/login"
|
||||
class="text-gradido gradido-global-color-blue"
|
||||
@click="$emit('is-mobile-start', false)"
|
||||
@click="$emit('set-mobile-start', false)"
|
||||
>
|
||||
{{ $t('auth.left.hereLogin') }}
|
||||
</b-link>
|
||||
@ -58,6 +58,9 @@
|
||||
<script>
|
||||
export default {
|
||||
name: 'AuthMobileStart',
|
||||
props: {
|
||||
mobileStart: { type: Boolean, default: false },
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
/>
|
||||
<b-img
|
||||
class="imgLogoBack mt--3 ml--3"
|
||||
src="img/template/gradido_background_header.png"
|
||||
src="/img/template/gradido_background_header.png"
|
||||
width="230"
|
||||
alt="start background image"
|
||||
></b-img>
|
||||
@ -37,8 +37,8 @@ export default {
|
||||
name: 'AuthNavbar',
|
||||
data() {
|
||||
return {
|
||||
logo: 'img/brand/green.png',
|
||||
sheet: 'img/template/Blaetter.png',
|
||||
logo: '/img/brand/green.png',
|
||||
sheet: '/img/template/Blaetter.png',
|
||||
}
|
||||
},
|
||||
}
|
||||
@ -12,6 +12,6 @@
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'NavbarSmall',
|
||||
name: 'AuthNavbarSmall',
|
||||
}
|
||||
</script>
|
||||
@ -1,53 +0,0 @@
|
||||
<template>
|
||||
<footer class="footer bg-transparent">
|
||||
<b-row class="mt-lg-7 mt-md-6 mt-4">
|
||||
<b-col class="col-12 col-md-12 col-lg-6">
|
||||
<div
|
||||
class="d-flex justify-content-center justify-content-md-center justify-content-lg-start ml-3"
|
||||
>
|
||||
<b-nav class="nav-footer">
|
||||
<b-nav-item :href="`https://gradido.net/${$i18n.locale}/impressum/`" target="_blank">
|
||||
{{ $t('footer.imprint') }}
|
||||
</b-nav-item>
|
||||
<b-nav-item :href="`https://gradido.net/${$i18n.locale}/datenschutz/`" target="_blank">
|
||||
{{ $t('footer.privacy_policy') }}
|
||||
</b-nav-item>
|
||||
</b-nav>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col class="col-12 col-md-12 col-lg-6 mt-4 mb-4 mt-lg-0 mb-lg-0">
|
||||
<div class="text-center ml-3 ml-lg-0 text-lg-right">
|
||||
{{ $t('followUs') }}
|
||||
<b-icon-facebook class="ml-3 mr-3" font-scale="1"></b-icon-facebook>
|
||||
<b-icon-twitter class="mr-3" font-scale="1"></b-icon-twitter>
|
||||
<b-icon-youtube class="mr-3" font-scale="1"></b-icon-youtube>
|
||||
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="16"
|
||||
height="16"
|
||||
fill="currentColor"
|
||||
class="bi bi-telegram"
|
||||
viewBox="0 0 16 16"
|
||||
>
|
||||
<path
|
||||
d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.287 5.906c-.778.324-2.334.994-4.666 2.01-.378.15-.577.298-.595.442-.03.243.275.339.69.47l.175.055c.408.133.958.288 1.243.294.26.006.549-.1.868-.32 2.179-1.471 3.304-2.214 3.374-2.23.05-.012.12-.026.166.016.047.041.042.12.037.141-.03.129-1.227 1.241-1.846 1.817-.193.18-.33.307-.358.336a8.154 8.154 0 0 1-.188.186c-.38.366-.664.64.015 1.088.327.216.589.393.85.571.284.194.568.387.936.629.093.06.183.125.27.187.331.236.63.448.997.414.214-.02.435-.22.547-.82.265-1.417.786-4.486.906-5.751a1.426 1.426 0 0 0-.013-.315.337.337 0 0 0-.114-.217.526.526 0 0 0-.31-.093c-.3.005-.763.166-2.984 1.09z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</footer>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'AuthFooter',
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.bi-telegram {
|
||||
margin-top: -5px;
|
||||
}
|
||||
</style>
|
||||
@ -4,8 +4,8 @@ import Message from './Message'
|
||||
const localVue = global.localVue
|
||||
|
||||
const propsData = {
|
||||
headline: 'site.thx.title',
|
||||
subtitle: 'site.thx.email',
|
||||
headline: 'Headline text',
|
||||
subtitle: 'Subtitle text',
|
||||
buttonText: 'login',
|
||||
linkTo: '/login',
|
||||
}
|
||||
@ -32,8 +32,8 @@ describe('Message', () => {
|
||||
|
||||
describe('with button', () => {
|
||||
it('renders title, subtitle, and button text', () => {
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.email')
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('Headline text')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('Subtitle text')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('login')
|
||||
})
|
||||
|
||||
@ -51,8 +51,8 @@ describe('Message', () => {
|
||||
})
|
||||
|
||||
it('renders title, subtitle, and button text', () => {
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.email')
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('Headline text')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('Subtitle text')
|
||||
})
|
||||
|
||||
it('button is not shown', () => {
|
||||
|
||||
@ -1,127 +0,0 @@
|
||||
import { mount } from '@vue/test-utils'
|
||||
import UserCoinAnimation from './UserCoinAnimation'
|
||||
import { updateUserInfos } from '@/graphql/mutations'
|
||||
|
||||
import { toastErrorSpy, toastSuccessSpy } from '@test/testSetup'
|
||||
|
||||
const localVue = global.localVue
|
||||
|
||||
const mockAPIcall = jest.fn()
|
||||
|
||||
const storeCommitMock = jest.fn()
|
||||
|
||||
describe('UserCard_CoinAnimation', () => {
|
||||
let wrapper
|
||||
|
||||
const mocks = {
|
||||
$t: jest.fn((t) => t),
|
||||
$store: {
|
||||
state: {
|
||||
language: 'de',
|
||||
coinanimation: true,
|
||||
},
|
||||
commit: storeCommitMock,
|
||||
},
|
||||
$apollo: {
|
||||
mutate: mockAPIcall,
|
||||
},
|
||||
}
|
||||
|
||||
const Wrapper = () => {
|
||||
return mount(UserCoinAnimation, { localVue, mocks })
|
||||
}
|
||||
|
||||
describe('mount', () => {
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks()
|
||||
wrapper = Wrapper()
|
||||
})
|
||||
|
||||
it('renders the component', () => {
|
||||
expect(wrapper.find('div#formusercoinanimation').exists()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('has an edit BFormCheckbox switch', () => {
|
||||
expect(wrapper.find('.Test-BFormCheckbox').exists()).toBeTruthy()
|
||||
})
|
||||
|
||||
describe('enable with success', () => {
|
||||
beforeEach(async () => {
|
||||
await wrapper.setData({ CoinAnimationStatus: false })
|
||||
mockAPIcall.mockResolvedValue({
|
||||
data: {
|
||||
updateUserInfos: {
|
||||
validValues: 1,
|
||||
},
|
||||
},
|
||||
})
|
||||
await wrapper.find('input').setChecked()
|
||||
})
|
||||
|
||||
it('calls the updateUserInfos mutation', () => {
|
||||
expect(mockAPIcall).toBeCalledWith({
|
||||
mutation: updateUserInfos,
|
||||
variables: {
|
||||
coinanimation: true,
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it('updates the store', () => {
|
||||
expect(storeCommitMock).toBeCalledWith('coinanimation', true)
|
||||
})
|
||||
|
||||
it('toasts a success message', () => {
|
||||
expect(toastSuccessSpy).toBeCalledWith('settings.coinanimation.True')
|
||||
})
|
||||
})
|
||||
|
||||
describe('disable with success', () => {
|
||||
beforeEach(async () => {
|
||||
await wrapper.setData({ CoinAnimationStatus: true })
|
||||
mockAPIcall.mockResolvedValue({
|
||||
data: {
|
||||
updateUserInfos: {
|
||||
validValues: 1,
|
||||
},
|
||||
},
|
||||
})
|
||||
await wrapper.find('input').setChecked(false)
|
||||
})
|
||||
|
||||
it('calls the subscribe mutation', () => {
|
||||
expect(mockAPIcall).toBeCalledWith({
|
||||
mutation: updateUserInfos,
|
||||
variables: {
|
||||
coinanimation: false,
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it('updates the store', () => {
|
||||
expect(storeCommitMock).toBeCalledWith('coinanimation', false)
|
||||
})
|
||||
|
||||
it('toasts a success message', () => {
|
||||
expect(toastSuccessSpy).toBeCalledWith('settings.coinanimation.False')
|
||||
})
|
||||
})
|
||||
|
||||
describe('disable with server error', () => {
|
||||
beforeEach(() => {
|
||||
mockAPIcall.mockRejectedValue({
|
||||
message: 'Ouch',
|
||||
})
|
||||
wrapper.find('input').trigger('change')
|
||||
})
|
||||
|
||||
it('resets the CoinAnimationStatus', () => {
|
||||
expect(wrapper.vm.CoinAnimationStatus).toBeTruthy()
|
||||
})
|
||||
|
||||
it('toasts an error message', () => {
|
||||
expect(toastErrorSpy).toBeCalledWith('Ouch')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
@ -1,65 +0,0 @@
|
||||
<template>
|
||||
<b-card
|
||||
id="formusercoinanimation"
|
||||
class="bg-transparent gradido-custom-background gradido-no-border-radius"
|
||||
>
|
||||
<div>
|
||||
<b-row class="mb-3">
|
||||
<b-col class="mb-2 col-12">
|
||||
<small>
|
||||
<b>{{ $t('settings.coinanimation.coinanimation') }}</b>
|
||||
</small>
|
||||
</b-col>
|
||||
<b-col class="col-12">
|
||||
<b-form-checkbox
|
||||
class="Test-BFormCheckbox"
|
||||
v-model="CoinAnimationStatus"
|
||||
name="check-button"
|
||||
switch
|
||||
@change="onSubmit"
|
||||
>
|
||||
{{
|
||||
CoinAnimationStatus
|
||||
? $t('settings.coinanimation.True')
|
||||
: $t('settings.coinanimation.False')
|
||||
}}
|
||||
</b-form-checkbox>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
</b-card>
|
||||
</template>
|
||||
<script>
|
||||
import { updateUserInfos } from '@/graphql/mutations'
|
||||
export default {
|
||||
name: 'UserCoinAnimation',
|
||||
data() {
|
||||
return {
|
||||
CoinAnimationStatus: this.$store.state.coinanimation,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async onSubmit() {
|
||||
this.$apollo
|
||||
.mutate({
|
||||
mutation: updateUserInfos,
|
||||
variables: {
|
||||
coinanimation: this.CoinAnimationStatus,
|
||||
},
|
||||
})
|
||||
.then(() => {
|
||||
this.$store.commit('coinanimation', this.CoinAnimationStatus)
|
||||
this.toastSuccess(
|
||||
this.CoinAnimationStatus
|
||||
? this.$t('settings.coinanimation.True')
|
||||
: this.$t('settings.coinanimation.False'),
|
||||
)
|
||||
})
|
||||
.catch((error) => {
|
||||
this.CoinAnimationStatus = this.$store.state.coinanimation
|
||||
this.toastError(error.message)
|
||||
})
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -189,7 +189,7 @@ describe('UserCard_FormUserPasswort', () => {
|
||||
})
|
||||
|
||||
it('toasts a success message', () => {
|
||||
expect(toastSuccessSpy).toBeCalledWith('site.thx.reset')
|
||||
expect(toastSuccessSpy).toBeCalledWith('message.reset')
|
||||
})
|
||||
|
||||
it('cancels the edit process', () => {
|
||||
|
||||
@ -89,7 +89,7 @@ export default {
|
||||
},
|
||||
})
|
||||
.then(() => {
|
||||
this.toastSuccess(this.$t('site.thx.reset'))
|
||||
this.toastSuccess(this.$t('message.reset'))
|
||||
this.cancelEdit()
|
||||
})
|
||||
.catch((error) => {
|
||||
|
||||
@ -31,7 +31,6 @@ export const updateUserInfos = gql`
|
||||
$password: String
|
||||
$passwordNew: String
|
||||
$locale: String
|
||||
$coinanimation: Boolean
|
||||
) {
|
||||
updateUserInfos(
|
||||
firstName: $firstName
|
||||
@ -39,7 +38,6 @@ export const updateUserInfos = gql`
|
||||
password: $password
|
||||
passwordNew: $passwordNew
|
||||
language: $locale
|
||||
coinanimation: $coinanimation
|
||||
)
|
||||
}
|
||||
`
|
||||
|
||||
@ -7,7 +7,6 @@ export const login = gql`
|
||||
firstName
|
||||
lastName
|
||||
language
|
||||
coinanimation
|
||||
klickTipp {
|
||||
newsletterState
|
||||
}
|
||||
@ -25,7 +24,6 @@ export const verifyLogin = gql`
|
||||
firstName
|
||||
lastName
|
||||
language
|
||||
coinanimation
|
||||
klickTipp {
|
||||
newsletterState
|
||||
}
|
||||
|
||||
@ -43,6 +43,10 @@ describe('AuthLayout', () => {
|
||||
it('has Component AuthMobileStart', () => {
|
||||
expect(wrapper.findComponent({ name: 'AuthMobileStart' }).exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('has Component AuthNavbarSmall', () => {
|
||||
expect(wrapper.findComponent({ name: 'AuthNavbarSmall' }).exists()).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Desktop Version Start', () => {
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
<template>
|
||||
<div class="auth-template">
|
||||
<mobile-start
|
||||
<auth-mobile-start
|
||||
v-if="mobileStart"
|
||||
class="d-inline d-lg-none zindex10000"
|
||||
@is-mobile-start="setMobileStart"
|
||||
@set-mobile-start="setMobileStart"
|
||||
/>
|
||||
<div class="h-100 align-middle">
|
||||
<navbar class="zindex10" />
|
||||
<auth-navbar class="zindex10" />
|
||||
|
||||
<div class="left-content-box position-fixed d-none d-lg-block">
|
||||
<div class="bg-img-box position-absolute w-100">
|
||||
<carousel class="carousel" />
|
||||
<auth-carousel class="carousel" />
|
||||
</div>
|
||||
<div class="bg-txt-box position-relative d-none d-lg-block text-center align-self-center">
|
||||
<div class="h0 text-white">{{ $t('auth.left.gratitude') }}</div>
|
||||
@ -24,7 +24,7 @@
|
||||
<div class="right-content-box ml-3 ml-sm-4 mr-3 mr-sm-4">
|
||||
<b-row class="d-none d-md-block d-lg-none">
|
||||
<b-col class="mb--4 d-flex justify-content-end">
|
||||
<navbar-small />
|
||||
<auth-navbar-small />
|
||||
</b-col>
|
||||
</b-row>
|
||||
<b-row class="mt-5 pl-2 pl-md-0 pl-lg-0">
|
||||
@ -34,7 +34,7 @@
|
||||
<div class="mb-0">{{ $t('1000thanks') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="3" class="text-right d-none d-sm-none d-md-inline">
|
||||
<b-avatar src="img/brand/gradido_coin●.png" size="6rem"></b-avatar>
|
||||
<b-avatar src="/img/brand/gradido_coin●.png" size="6rem"></b-avatar>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<b-card no-body ref="pageFontSize" class="border-0 mt-4 gradido-custom-background">
|
||||
@ -44,7 +44,7 @@
|
||||
</b-col>
|
||||
<b-col cols="2" class="text-right">
|
||||
<div id="popover-target-1" class="pointer">
|
||||
<b-img src="img/svg/type.svg" width="19" class="svgType"></b-img>
|
||||
<b-img src="/img/svg/type.svg" width="19" class="svgType"></b-img>
|
||||
</div>
|
||||
<b-popover
|
||||
target="popover-target-1"
|
||||
@ -64,20 +64,20 @@
|
||||
</b-row>
|
||||
<b-row class="d-inline d-sm-inline d-md-none d-lg-none mb-3">
|
||||
<b-col class="text-center">
|
||||
<b-avatar src="img/brand/gradido_coin●.png" size="6rem"></b-avatar>
|
||||
<b-avatar src="/img/brand/gradido_coin●.png" size="6rem"></b-avatar>
|
||||
<b-row>
|
||||
<b-col class="zindex1000 d-flex justify-content-center">
|
||||
<navbar-small />
|
||||
<auth-navbar-small />
|
||||
</b-col>
|
||||
</b-row>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<b-card-body class="">
|
||||
<router-view></router-view>
|
||||
<router-view @set-mobile-start="setMobileStart"></router-view>
|
||||
</b-card-body>
|
||||
</b-card>
|
||||
</div>
|
||||
<auth-footer v-if="!$route.meta.hideFooter" class="pr-5"></auth-footer>
|
||||
<auth-footer v-if="!$route.meta.hideFooter" class="pr-5 mb-5"></auth-footer>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<!-- <auth-layout-gdd />-->
|
||||
@ -86,21 +86,21 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import MobileStart from '@/components/Auth/MobileStart.vue'
|
||||
import Navbar from '@/components/Auth/Navbar.vue'
|
||||
import NavbarSmall from '@/components/Auth/NavbarSmall.vue'
|
||||
import Carousel from '@/components/Auth/Carousel.vue'
|
||||
import AuthMobileStart from '@/components/Auth/AuthMobileStart.vue'
|
||||
import AuthNavbar from '@/components/Auth/AuthNavbar.vue'
|
||||
import AuthNavbarSmall from '@/components/Auth/AuthNavbarSmall.vue'
|
||||
import AuthCarousel from '@/components/Auth/AuthCarousel.vue'
|
||||
import LanguageSwitch from '@/components/LanguageSwitch2'
|
||||
import AuthFooter from '@/components/Auth/Footer.vue'
|
||||
import AuthFooter from '@/components/Auth/AuthFooter.vue'
|
||||
import CONFIG from '@/config'
|
||||
|
||||
export default {
|
||||
name: 'AuthLayout',
|
||||
components: {
|
||||
MobileStart,
|
||||
Navbar,
|
||||
NavbarSmall,
|
||||
Carousel,
|
||||
AuthMobileStart,
|
||||
AuthNavbar,
|
||||
AuthNavbarSmall,
|
||||
AuthCarousel,
|
||||
LanguageSwitch,
|
||||
AuthFooter,
|
||||
},
|
||||
|
||||
@ -172,6 +172,16 @@
|
||||
"minus": "−",
|
||||
"pipe": "|"
|
||||
},
|
||||
"message": {
|
||||
"activateEmail": "Dein Konto wurde noch nicht aktiviert. Bitte überprüfe deine E-Mail und klicke den Aktivierungslink oder fordere einen neuen Aktivierungslink über die Password Reset Seite an.",
|
||||
"checkEmail": "Deine E-Mail wurde erfolgreich verifiziert. Du kannst dich jetzt anmelden.",
|
||||
"email": "Wir haben dir eine E-Mail gesendet.",
|
||||
"errorTitle": "Achtung!",
|
||||
"register": "Du bist jetzt registriert, bitte überprüfe deine Emails und klicke auf den Aktivierungslink.",
|
||||
"reset": "Dein Passwort wurde geändert.",
|
||||
"title": "Danke!",
|
||||
"unsetPassword": "Dein Passwort wurde noch nicht gesetzt. Bitte setze es neu."
|
||||
},
|
||||
"navigation": {
|
||||
"admin_area": "Adminbereich",
|
||||
"logout": "Abmelden",
|
||||
@ -186,11 +196,6 @@
|
||||
"send_gdd": "GDD versenden",
|
||||
"send_per_link": "GDD versenden per Link",
|
||||
"settings": {
|
||||
"coinanimation": {
|
||||
"coinanimation": "Münzanimation",
|
||||
"False": "Münzanimation ausgeschaltet",
|
||||
"True": "Münzanimation eingeschaltet"
|
||||
},
|
||||
"language": {
|
||||
"changeLanguage": "Sprache ändern",
|
||||
"de": "Deutsch",
|
||||
@ -229,8 +234,7 @@
|
||||
"heading": "Bitte gib deine E-Mail an mit der du bei Gradido angemeldet bist."
|
||||
},
|
||||
"login": {
|
||||
"heading": "Melde dich mit deinen Zugangsdaten an. Bewahre sie stets sicher auf!",
|
||||
"saveLogin": "Anmeldung speichern"
|
||||
"heading": "Melde dich mit deinen Zugangsdaten an. Bewahre sie stets sicher auf!"
|
||||
},
|
||||
"resetPassword": {
|
||||
"heading": "Trage bitte dein Passwort ein und wiederhole es."
|
||||
@ -245,18 +249,6 @@
|
||||
"one_number": "Zahl erforderlich.",
|
||||
"special-char": "Sonderzeichen erforderlich (z.B. _ oder ä)",
|
||||
"uppercase": "Großbuchstabe erforderlich."
|
||||
},
|
||||
"thx": {
|
||||
"activateEmail": "Dein Konto wurde noch nicht aktiviert. Bitte überprüfe deine E-Mail und klicke den Aktivierungslink oder fordere einen neuen Aktivierungslink über die Password Reset Seite.",
|
||||
"checkEmail": "Deine E-Mail wurde erfolgreich verifiziert. Du kannst dich jetzt anmelden.",
|
||||
"email": "Wir haben dir eine E-Mail gesendet.",
|
||||
"emailActivated": "Danke dass Du deine E-Mail bestätigt hast.",
|
||||
"errorTitle": "Achtung!",
|
||||
"register": "Du bist jetzt registriert, bitte überprüfe deine Emails und klicke auf den Aktivierungslink.",
|
||||
"reset": "Dein Passwort wurde geändert.",
|
||||
"resetPassword": "Den Code den Du genutzt hast ist zu alt bitte fordere ein neuen über die Passwort Reset Seite an.",
|
||||
"title": "Danke!",
|
||||
"unsetPassword": "Dein Passwort wurde noch nicht gesetzt. Bitte setze es neu."
|
||||
}
|
||||
},
|
||||
"success": "Erfolg",
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
"hereLogin": "Log in here",
|
||||
"learnMore": "Learn more …",
|
||||
"newCurrency": "The new currency",
|
||||
"oneAnotherNature": "FOR ONE ANOTHER, FOR ALL, FOR NATURE"
|
||||
"oneAnotherNature": "FOR EACH OTHER, FOR ALL, FOR NATURE"
|
||||
},
|
||||
"navbar": {
|
||||
"aboutGradido": "About Gradido"
|
||||
@ -172,6 +172,16 @@
|
||||
"minus": "−",
|
||||
"pipe": "|"
|
||||
},
|
||||
"message": {
|
||||
"activateEmail": "Your account has not been activated yet. Please check your emails and click the activation link or order a new activation link over the password reset page.",
|
||||
"checkEmail": "Your email has been successfully verified. You can sign in now.",
|
||||
"email": "We have sent you an email.",
|
||||
"errorTitle": "Attention!",
|
||||
"register": "You are registered now, please check your emails and click the activation link.",
|
||||
"reset": "Your password has been changed.",
|
||||
"title": "Thank you!",
|
||||
"unsetPassword": "Your password has not been set yet. Please set it again."
|
||||
},
|
||||
"navigation": {
|
||||
"admin_area": "Admin Area",
|
||||
"logout": "Logout",
|
||||
@ -186,11 +196,6 @@
|
||||
"send_gdd": "GDD send",
|
||||
"send_per_link": "GDD send via link",
|
||||
"settings": {
|
||||
"coinanimation": {
|
||||
"coinanimation": "Coin animation",
|
||||
"False": "Coin animation disabled",
|
||||
"True": "Coin animation enabled"
|
||||
},
|
||||
"language": {
|
||||
"changeLanguage": "Change language",
|
||||
"de": "Deutsch",
|
||||
@ -229,8 +234,7 @@
|
||||
"heading": "Please enter the email address by which you're registered here."
|
||||
},
|
||||
"login": {
|
||||
"heading": "Log in with your access data. Keep them safe!",
|
||||
"saveLogin": "Save login"
|
||||
"heading": "Log in with your access data. Keep them safe!"
|
||||
},
|
||||
"resetPassword": {
|
||||
"heading": "Please enter your password and repeat it."
|
||||
@ -245,18 +249,6 @@
|
||||
"one_number": "One number required.",
|
||||
"special-char": "One special character required (e.g. _ or ä)",
|
||||
"uppercase": "One uppercase letter required."
|
||||
},
|
||||
"thx": {
|
||||
"activateEmail": "Your account has not been activated yet. Please check your emails and click the activation link or order a new activation link over the password reset page.",
|
||||
"checkEmail": "Your email has been successfully verified. You can sign in now.",
|
||||
"email": "We have sent you an email.",
|
||||
"emailActivated": "Thank you your email has been activated.",
|
||||
"errorTitle": "Attention!",
|
||||
"register": "You are registered now, please check your emails and click the activation link.",
|
||||
"reset": "Your password has been changed.",
|
||||
"resetPassword": "The code you used was to old please order a new on over the password reset page.",
|
||||
"title": "Thank you!",
|
||||
"unsetPassword": "Your password has not been set yet. Please set it again."
|
||||
}
|
||||
},
|
||||
"success": "Success",
|
||||
|
||||
@ -111,7 +111,7 @@ describe('ForgotPassword', () => {
|
||||
|
||||
it('shows error title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle')
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.errorTitle')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('error.email-already-sent')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('login')
|
||||
})
|
||||
@ -121,6 +121,8 @@ describe('ForgotPassword', () => {
|
||||
})
|
||||
|
||||
it.skip('click redirects to "/login"', async () => {
|
||||
// wrapper.find('.test-message-button').trigger('click')
|
||||
// await wrapper.vm.$nextTick()
|
||||
expect(mockRouterPush).toBeCalledWith('/login')
|
||||
})
|
||||
|
||||
@ -144,14 +146,18 @@ describe('ForgotPassword', () => {
|
||||
|
||||
it('shows success title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.email')
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('message.email')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('login')
|
||||
})
|
||||
|
||||
it('button link redirects to "/login"', () => {
|
||||
expect(wrapper.find('.test-message-button').attributes('href')).toBe('/login')
|
||||
})
|
||||
|
||||
it.skip('click redirects to "/login"', () => {
|
||||
// expect(mockRouterPush).toBeCalledWith('/login')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -26,8 +26,8 @@
|
||||
</b-container>
|
||||
<b-container v-else>
|
||||
<message
|
||||
:headline="success ? $t('site.thx.title') : $t('site.thx.errorTitle')"
|
||||
:subtitle="success ? $t('site.thx.email') : $t('error.email-already-sent')"
|
||||
:headline="success ? $t('message.title') : $t('message.errorTitle')"
|
||||
:subtitle="success ? $t('message.email') : $t('error.email-already-sent')"
|
||||
:buttonText="$t('login')"
|
||||
linkTo="/login"
|
||||
/>
|
||||
|
||||
@ -198,8 +198,8 @@ describe('Login', () => {
|
||||
|
||||
it('shows error title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.activateEmail')
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.errorTitle')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('message.activateEmail')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('settings.password.reset')
|
||||
})
|
||||
|
||||
@ -226,8 +226,8 @@ describe('Login', () => {
|
||||
|
||||
it('shows error title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.errorTitle')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.unsetPassword')
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.errorTitle')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('message.unsetPassword')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('settings.password.reset')
|
||||
})
|
||||
|
||||
|
||||
@ -16,17 +16,6 @@
|
||||
</b-col>
|
||||
</b-row>
|
||||
<b-row>
|
||||
<b-col class="d-flex justify-content-start">
|
||||
<b-form-checkbox
|
||||
class="mt-3"
|
||||
v-model="status"
|
||||
name="checkbox-1"
|
||||
value="saved"
|
||||
unchecked-value="not_saved"
|
||||
>
|
||||
{{ $t('site.login.saveLogin') }}
|
||||
</b-form-checkbox>
|
||||
</b-col>
|
||||
<b-col class="d-flex justify-content-end">
|
||||
<router-link to="/forgot-password" class="mt-3">
|
||||
{{ $t('settings.password.forgot_pwd') }}
|
||||
@ -41,7 +30,7 @@
|
||||
</b-container>
|
||||
<b-container v-else>
|
||||
<message
|
||||
:headline="$t('site.thx.errorTitle')"
|
||||
:headline="$t('message.errorTitle')"
|
||||
:subtitle="errorSubtitle"
|
||||
:buttonText="$t('settings.password.reset')"
|
||||
:linkTo="errorLinkTo"
|
||||
@ -70,7 +59,6 @@ export default {
|
||||
password: '',
|
||||
},
|
||||
passwordVisible: false,
|
||||
status: false,
|
||||
showPageMessage: false,
|
||||
errorReason: null,
|
||||
errorSubtitle: '',
|
||||
@ -107,12 +95,12 @@ export default {
|
||||
.catch((error) => {
|
||||
if (error.message.includes('User email not validated')) {
|
||||
this.showPageMessage = true
|
||||
this.errorSubtitle = this.$t('site.thx.activateEmail')
|
||||
this.errorSubtitle = this.$t('message.activateEmail')
|
||||
this.errorLinkTo = '/forgot-password'
|
||||
this.toastError(this.$t('error.no-account'))
|
||||
} else if (error.message.includes('User has no password set yet')) {
|
||||
this.showPageMessage = true
|
||||
this.errorSubtitle = this.$t('site.thx.unsetPassword')
|
||||
this.errorSubtitle = this.$t('message.unsetPassword')
|
||||
this.errorLinkTo = '/reset-password/login'
|
||||
this.toastError(this.$t('error.no-account'))
|
||||
} else if (error.message.includes('No user with this credentials')) {
|
||||
|
||||
@ -38,9 +38,5 @@ describe('Profile', () => {
|
||||
it('has a user change newsletter form', () => {
|
||||
expect(wrapper.findComponent({ name: 'UserNewsletter' }).exists()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('has a user change coin animation form', () => {
|
||||
expect(wrapper.findComponent({ name: 'UserCoinAnimation' }).exists()).toBeTruthy()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -8,8 +8,6 @@
|
||||
<user-language />
|
||||
<hr />
|
||||
<user-newsletter />
|
||||
<hr />
|
||||
<user-coin-animation />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
@ -18,7 +16,6 @@ import UserData from '@/components/UserSettings/UserData.vue'
|
||||
import UserPassword from '@/components/UserSettings/UserPassword.vue'
|
||||
import UserLanguage from '@/components/UserSettings/UserLanguage.vue'
|
||||
import UserNewsletter from '@/components/UserSettings/UserNewsletter.vue'
|
||||
import UserCoinAnimation from '@/components/UserSettings/UserCoinAnimation.vue'
|
||||
|
||||
export default {
|
||||
name: 'Profile',
|
||||
@ -28,7 +25,6 @@ export default {
|
||||
UserPassword,
|
||||
UserLanguage,
|
||||
UserNewsletter,
|
||||
UserCoinAnimation,
|
||||
},
|
||||
props: {
|
||||
balance: { type: Number, default: 0 },
|
||||
|
||||
@ -68,15 +68,6 @@ describe('Register', () => {
|
||||
expect(wrapper.find('#Email-input-field').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('has Language selected field', () => {
|
||||
expect(wrapper.find('.selectedLanguage').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('selects Language value en', async () => {
|
||||
wrapper.find('.selectedLanguage').findAll('option').at(1).setSelected()
|
||||
expect(wrapper.find('.selectedLanguage').element.value).toBe('en')
|
||||
})
|
||||
|
||||
it('has 1 checkbox input fields', () => {
|
||||
expect(wrapper.find('#registerCheckbox').exists()).toBe(true)
|
||||
})
|
||||
@ -114,7 +105,6 @@ describe('Register', () => {
|
||||
beforeEach(() => {
|
||||
wrapper.find('#registerFirstname').setValue('Max')
|
||||
wrapper.find('#registerLastname').setValue('Mustermann')
|
||||
wrapper.find('.language-switch-select').findAll('option').at(1).setSelected()
|
||||
})
|
||||
it('has disabled submit button when missing input checked box', () => {
|
||||
wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net')
|
||||
@ -132,7 +122,6 @@ describe('Register', () => {
|
||||
wrapper.find('#registerFirstname').setValue('Max')
|
||||
wrapper.find('#registerLastname').setValue('Mustermann')
|
||||
wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net')
|
||||
wrapper.find('.language-switch-select').findAll('option').at(1).setSelected()
|
||||
wrapper.find('#registerCheckbox').setChecked()
|
||||
})
|
||||
|
||||
@ -213,8 +202,8 @@ describe('Register', () => {
|
||||
|
||||
it('shows success title, subtitle', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('site.thx.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('site.thx.register')
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('message.register')
|
||||
})
|
||||
|
||||
it('button is not present', () => {
|
||||
@ -241,7 +230,6 @@ describe('Register', () => {
|
||||
wrapper.find('#registerFirstname').setValue('Max')
|
||||
wrapper.find('#registerLastname').setValue('Mustermann')
|
||||
wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net')
|
||||
wrapper.find('.language-switch-select').findAll('option').at(1).setSelected()
|
||||
wrapper.find('#registerCheckbox').setChecked()
|
||||
await wrapper.find('form').trigger('submit')
|
||||
await flushPromises()
|
||||
|
||||
@ -61,11 +61,7 @@
|
||||
</b-col>
|
||||
</b-row>
|
||||
<b-row>
|
||||
<b-col sm="12" md="6"><input-email v-model="form.email"></input-email></b-col>
|
||||
<b-col sm="12" md="6">
|
||||
<label>{{ $t('language') }}</label>
|
||||
<language-switch-select @update-language="updateLanguage" />
|
||||
</b-col>
|
||||
<b-col><input-email v-model="form.email"></input-email></b-col>
|
||||
</b-row>
|
||||
|
||||
<b-row class="mt-4 mb-4">
|
||||
@ -84,7 +80,7 @@
|
||||
<b-button
|
||||
type="submit"
|
||||
:disabled="disabled"
|
||||
:variant="disabled ? 'outline-gradido' : 'gradido'"
|
||||
:variant="disabled ? 'gradido-disable' : 'gradido'"
|
||||
>
|
||||
{{ $t('signup') }}
|
||||
</b-button>
|
||||
@ -94,7 +90,7 @@
|
||||
</validation-observer>
|
||||
</b-container>
|
||||
<b-container v-else>
|
||||
<message :headline="$t('site.thx.title')" :subtitle="$t('site.thx.register')" />
|
||||
<message :headline="$t('message.title')" :subtitle="$t('message.register')" />
|
||||
</b-container>
|
||||
</div>
|
||||
</template>
|
||||
@ -103,13 +99,11 @@
|
||||
import { createUser } from '@/graphql/mutations'
|
||||
import CONFIG from '@/config'
|
||||
import InputEmail from '@/components/Inputs/InputEmail.vue'
|
||||
import LanguageSwitchSelect from '@/components/LanguageSwitchSelect.vue'
|
||||
import Message from '@/components/Message/Message'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
InputEmail,
|
||||
LanguageSwitchSelect,
|
||||
Message,
|
||||
},
|
||||
name: 'Register',
|
||||
@ -121,7 +115,6 @@ export default {
|
||||
email: '',
|
||||
agree: false,
|
||||
},
|
||||
language: '',
|
||||
showPageMessage: false,
|
||||
submitted: false,
|
||||
publisherId: this.$store.state.publisherId,
|
||||
@ -130,10 +123,6 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
updateLanguage(e) {
|
||||
this.language = e
|
||||
this.$store.commit('language', this.language)
|
||||
},
|
||||
getValidationState({ dirty, validated, valid = null }) {
|
||||
return dirty || validated ? valid : null
|
||||
},
|
||||
@ -148,7 +137,7 @@ export default {
|
||||
email: this.form.email,
|
||||
firstName: this.form.firstname,
|
||||
lastName: this.form.lastname,
|
||||
language: this.language,
|
||||
language: this.$store.state.language,
|
||||
publisherId: this.$store.state.publisherId,
|
||||
redeemCode: this.redeemCode,
|
||||
},
|
||||
@ -183,7 +172,7 @@ export default {
|
||||
return this.form.email !== ''
|
||||
},
|
||||
disabled() {
|
||||
return !(this.namesFilled && this.emailFilled && this.form.agree && !!this.language)
|
||||
return !(this.namesFilled && this.emailFilled && this.form.agree)
|
||||
},
|
||||
enterData() {
|
||||
return !this.showPageMessage
|
||||
|
||||
@ -79,16 +79,6 @@ describe('ResetPassword', () => {
|
||||
expect(wrapper.find('div.resetpwd-form').exists()).toBeTruthy()
|
||||
})
|
||||
|
||||
describe('links', () => {
|
||||
it('has a link "Back"', async () => {
|
||||
expect(wrapper.findAllComponents(RouterLinkStub).at(0).text()).toEqual('back')
|
||||
})
|
||||
|
||||
it('links to /login when clicking "Back"', async () => {
|
||||
expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/login')
|
||||
})
|
||||
})
|
||||
|
||||
describe('reset password form', () => {
|
||||
it('has a register form', async () => {
|
||||
expect(wrapper.find('form').exists()).toBeTruthy()
|
||||
@ -128,14 +118,32 @@ describe('ResetPassword', () => {
|
||||
await flushPromises()
|
||||
})
|
||||
|
||||
it('shows error title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.errorTitle')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe(
|
||||
'...email was sent more than 23 hours and 10 minutes ago',
|
||||
)
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('settings.password.reset')
|
||||
})
|
||||
|
||||
it('button link directs to "/forgot-password/resetPassword"', () => {
|
||||
expect(wrapper.find('.test-message-button').attributes('href')).toBe(
|
||||
'/forgot-password/resetPassword',
|
||||
)
|
||||
})
|
||||
|
||||
it('toasts an error message', () => {
|
||||
expect(toastErrorSpy).toHaveBeenCalledWith(
|
||||
'...email was sent more than 23 hours and 10 minutes ago',
|
||||
)
|
||||
})
|
||||
|
||||
it('router pushes to /forgot-password/resetPassword', () => {
|
||||
expect(routerPushMock).toHaveBeenCalledWith('/forgot-password/resetPassword')
|
||||
it.skip('click redirects to "/forgot-password/resetPassword"', () => {
|
||||
// wrapper.find('.test-message-button').trigger('click')
|
||||
// await flushPromises()
|
||||
// await wrapper.vm.$nextTick()
|
||||
// expect(routerPushMock).toHaveBeenCalledWith('/forgot-password/resetPassword')
|
||||
})
|
||||
})
|
||||
|
||||
@ -147,9 +155,26 @@ describe('ResetPassword', () => {
|
||||
await flushPromises()
|
||||
})
|
||||
|
||||
it('shows error title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.errorTitle')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('Error')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('settings.password.reset')
|
||||
})
|
||||
|
||||
it('button link directs to "/forgot-password/resetPassword"', () => {
|
||||
expect(wrapper.find('.test-message-button').attributes('href')).toBe(
|
||||
'/forgot-password/resetPassword',
|
||||
)
|
||||
})
|
||||
|
||||
it('toasts an error message', () => {
|
||||
expect(toastErrorSpy).toHaveBeenCalledWith('Error')
|
||||
})
|
||||
|
||||
it.skip('click redirects to "/forgot-password/resetPassword"', () => {
|
||||
// expect(routerPushMock).toHaveBeenCalledWith('/forgot-password/resetPassword')
|
||||
})
|
||||
})
|
||||
|
||||
describe('server response with success on /checkEmail', () => {
|
||||
@ -178,30 +203,19 @@ describe('ResetPassword', () => {
|
||||
)
|
||||
})
|
||||
|
||||
it('redirects to "/thx/checkEmail"', () => {
|
||||
expect(routerPushMock).toHaveBeenCalledWith('/thx/checkEmail')
|
||||
it('shows message title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('message.checkEmail')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('login')
|
||||
})
|
||||
|
||||
describe('with param code', () => {
|
||||
beforeEach(async () => {
|
||||
mocks.$route.params.code = 'the-most-secret-code-ever'
|
||||
apolloMutationMock.mockResolvedValue({
|
||||
data: {
|
||||
resetPassword: 'success',
|
||||
},
|
||||
})
|
||||
wrapper = Wrapper()
|
||||
await wrapper.findAll('input').at(0).setValue('Aa123456_')
|
||||
await wrapper.findAll('input').at(1).setValue('Aa123456_')
|
||||
await wrapper.find('form').trigger('submit')
|
||||
await flushPromises()
|
||||
})
|
||||
it('button link directs to "/login"', () => {
|
||||
expect(wrapper.find('.test-message-button').attributes('href')).toBe('/login')
|
||||
})
|
||||
|
||||
it('redirects to "/thx/checkEmail/the-most-secret-code-ever"', () => {
|
||||
expect(routerPushMock).toHaveBeenCalledWith(
|
||||
'/thx/checkEmail/the-most-secret-code-ever',
|
||||
)
|
||||
})
|
||||
it.skip('click redirects to "/login"', () => {
|
||||
// expect(routerPushMock).toHaveBeenCalledWith('/login')
|
||||
})
|
||||
})
|
||||
|
||||
@ -220,8 +234,19 @@ describe('ResetPassword', () => {
|
||||
await flushPromises()
|
||||
})
|
||||
|
||||
it('redirects to "/thx/resetPassword"', () => {
|
||||
expect(routerPushMock).toHaveBeenCalledWith('/thx/resetPassword')
|
||||
it('shows message title, subtitle, login button', () => {
|
||||
expect(wrapper.vm.showPageMessage).toBe(true)
|
||||
expect(wrapper.find('.test-message-headline').text()).toBe('message.title')
|
||||
expect(wrapper.find('.test-message-subtitle').text()).toBe('message.reset')
|
||||
expect(wrapper.find('.test-message-button').text()).toBe('login')
|
||||
})
|
||||
|
||||
it('button link directs to "/login"', () => {
|
||||
expect(wrapper.find('.test-message-button').attributes('href')).toBe('/login')
|
||||
})
|
||||
|
||||
it.skip('click redirects to "/login"', () => {
|
||||
// expect(routerPushMock).toHaveBeenCalledWith('/login')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -1,30 +1,33 @@
|
||||
<template>
|
||||
<div class="resetpwd-form">
|
||||
<div v-if="enterData" class="resetpwd-form">
|
||||
<div class="pb-5">{{ $t('site.resetPassword.heading') }}</div>
|
||||
<validation-observer ref="observer" v-slot="{ handleSubmit }">
|
||||
<b-form role="form" @submit.prevent="handleSubmit(onSubmit)">
|
||||
<input-password-confirmation v-model="form" />
|
||||
<div class="text-center">
|
||||
<b-button type="submit" variant="primary" class="mt-4">
|
||||
<b-button type="submit" variant="gradido" class="mt-4">
|
||||
<!-- eslint-disable-next-line @intlify/vue-i18n/no-dynamic-keys-->
|
||||
{{ $t(displaySetup.button) }}
|
||||
</b-button>
|
||||
</div>
|
||||
</b-form>
|
||||
</validation-observer>
|
||||
|
||||
<b-row v-if="displaySetup.linkTo">
|
||||
<b-col class="text-center py-lg-4">
|
||||
<router-link :to="displaySetup.linkTo" class="mt-3">{{ $t('back') }}</router-link>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
<div v-else>
|
||||
<message
|
||||
:headline="messageHeadline"
|
||||
:subtitle="messageSubtitle"
|
||||
:buttonText="messageButtonText"
|
||||
:linkTo="messageButtonLinktTo"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import InputPasswordConfirmation from '@/components/Inputs/InputPasswordConfirmation'
|
||||
import { setPassword } from '@/graphql/mutations'
|
||||
import { queryOptIn } from '@/graphql/queries'
|
||||
import InputPasswordConfirmation from '@/components/Inputs/InputPasswordConfirmation'
|
||||
import Message from '@/components/Message/Message'
|
||||
|
||||
const textFields = {
|
||||
reset: {
|
||||
@ -39,16 +42,13 @@ const textFields = {
|
||||
button: 'settings.password.set',
|
||||
linkTo: '/login',
|
||||
},
|
||||
login: {
|
||||
headline: 'site.thx.errorTitle',
|
||||
subtitle: 'site.thx.activateEmail',
|
||||
},
|
||||
}
|
||||
|
||||
export default {
|
||||
name: 'ResetPassword',
|
||||
components: {
|
||||
InputPasswordConfirmation,
|
||||
Message,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@ -57,8 +57,17 @@ export default {
|
||||
passwordRepeat: '',
|
||||
},
|
||||
displaySetup: {},
|
||||
showPageMessage: false,
|
||||
messageHeadline: null,
|
||||
messageSubtitle: null,
|
||||
messageButtonText: null,
|
||||
messageButtonLinktTo: null,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.$emit('set-mobile-start', false)
|
||||
this.setDisplaySetup()
|
||||
},
|
||||
methods: {
|
||||
async onSubmit() {
|
||||
this.$apollo
|
||||
@ -71,24 +80,33 @@ export default {
|
||||
})
|
||||
.then(() => {
|
||||
this.form.password = ''
|
||||
if (this.$route.path.includes('checkEmail')) {
|
||||
if (this.$route.params.code) {
|
||||
this.$router.push('/thx/checkEmail/' + this.$route.params.code)
|
||||
} else {
|
||||
this.$router.push('/thx/checkEmail')
|
||||
}
|
||||
} else {
|
||||
this.$router.push('/thx/resetPassword')
|
||||
}
|
||||
this.form.passwordRepeat = ''
|
||||
|
||||
this.showPageMessage = true
|
||||
this.messageHeadline = this.$t('message.title')
|
||||
this.messageSubtitle = this.$route.path.includes('checkEmail')
|
||||
? this.$t('message.checkEmail')
|
||||
: this.$t('message.reset')
|
||||
this.messageButtonText = this.$t('login')
|
||||
this.messageButtonLinktTo = '/login'
|
||||
})
|
||||
.catch((error) => {
|
||||
this.toastError(error.message)
|
||||
let errorMessage
|
||||
if (
|
||||
error.message.match(
|
||||
/email was sent more than ([0-9]+ hours)?( and )?([0-9]+ minutes)? ago/,
|
||||
)
|
||||
)
|
||||
this.$router.push('/forgot-password/resetPassword')
|
||||
) {
|
||||
errorMessage = error.message
|
||||
} else {
|
||||
errorMessage = error.message
|
||||
}
|
||||
this.showPageMessage = true
|
||||
this.messageHeadline = this.$t('message.errorTitle')
|
||||
this.messageSubtitle = errorMessage
|
||||
this.messageButtonText = this.$t('settings.password.reset')
|
||||
this.messageButtonLinktTo = '/forgot-password/resetPassword'
|
||||
this.toastError(errorMessage)
|
||||
})
|
||||
},
|
||||
checkOptInCode() {
|
||||
@ -115,8 +133,10 @@ export default {
|
||||
}
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.setDisplaySetup()
|
||||
computed: {
|
||||
enterData() {
|
||||
return !this.showPageMessage
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -1,101 +0,0 @@
|
||||
import { mount } from '@vue/test-utils'
|
||||
import Thx from './thx'
|
||||
|
||||
const localVue = global.localVue
|
||||
|
||||
const createMockObject = (comingFrom) => {
|
||||
return {
|
||||
$t: jest.fn((t) => t),
|
||||
$route: {
|
||||
params: {
|
||||
comingFrom,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
describe('Thx', () => {
|
||||
let wrapper
|
||||
|
||||
const Wrapper = (mocks) => {
|
||||
return mount(Thx, { localVue, mocks })
|
||||
}
|
||||
|
||||
describe('mount', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper(createMockObject('forgotPassword'))
|
||||
})
|
||||
|
||||
it('renders the thx page', () => {
|
||||
expect(wrapper.find('div.header').exists()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('renders the title', () => {
|
||||
expect(wrapper.find('p.h1').text()).toBe('site.thx.title')
|
||||
})
|
||||
})
|
||||
|
||||
describe('coming from /forgot-password', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper(createMockObject('forgotPassword'))
|
||||
})
|
||||
|
||||
it('renders the thanks text', () => {
|
||||
expect(wrapper.find('p.h4').text()).toBe('site.thx.email')
|
||||
})
|
||||
|
||||
it('renders the thanks redirect button', () => {
|
||||
expect(wrapper.find('a.btn').text()).toBe('login')
|
||||
})
|
||||
|
||||
it('links the redirect button to /login', () => {
|
||||
expect(wrapper.find('a.btn').attributes('href')).toBe('/login')
|
||||
})
|
||||
})
|
||||
|
||||
describe('coming from /reset-password', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper(createMockObject('resetPassword'))
|
||||
})
|
||||
|
||||
it('renders the thanks text', () => {
|
||||
expect(wrapper.find('p.h4').text()).toBe('site.thx.reset')
|
||||
})
|
||||
|
||||
it('renders the thanks redirect button', () => {
|
||||
expect(wrapper.find('a.btn').text()).toBe('login')
|
||||
})
|
||||
|
||||
it('links the redirect button to /login', () => {
|
||||
expect(wrapper.find('a.btn').attributes('href')).toBe('/login')
|
||||
})
|
||||
})
|
||||
|
||||
describe('coming from /register', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper(createMockObject('register'))
|
||||
})
|
||||
|
||||
it('renders the thanks text', () => {
|
||||
expect(wrapper.find('p.h4').text()).toBe('site.thx.register')
|
||||
})
|
||||
})
|
||||
|
||||
describe('coming from /login', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper(createMockObject('login'))
|
||||
})
|
||||
|
||||
it('renders the thanks text', () => {
|
||||
expect(wrapper.find('p.h4').text()).toBe('site.thx.activateEmail')
|
||||
})
|
||||
|
||||
it('renders the thanks redirect button', () => {
|
||||
expect(wrapper.find('a.btn').text()).toBe('settings.password.reset')
|
||||
})
|
||||
|
||||
it('links the redirect button to /forgot-password', () => {
|
||||
expect(wrapper.find('a.btn').attributes('href')).toBe('/forgot-password')
|
||||
})
|
||||
})
|
||||
})
|
||||
@ -1,76 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<!-- Header -->
|
||||
<div class="header py-7 py-lg-8 pt-lg-9">
|
||||
<b-container>
|
||||
<div class="header-body text-center mb-7">
|
||||
<!-- eslint-disable-next-line @intlify/vue-i18n/no-dynamic-keys-->
|
||||
<p class="h1">{{ $t(displaySetup.headline) }}</p>
|
||||
<!-- eslint-disable-next-line @intlify/vue-i18n/no-dynamic-keys-->
|
||||
<p class="h4">{{ $t(displaySetup.subtitle) }}</p>
|
||||
<hr />
|
||||
<b-button v-if="$route.params.code" :to="`/login/${$route.params.code}`">
|
||||
<!-- eslint-disable-next-line @intlify/vue-i18n/no-dynamic-keys-->
|
||||
{{ $t(displaySetup.button) }}
|
||||
</b-button>
|
||||
<b-button v-else-if="displaySetup.linkTo" :to="displaySetup.linkTo">
|
||||
<!-- eslint-disable-next-line @intlify/vue-i18n/no-dynamic-keys-->
|
||||
{{ $t(displaySetup.button) }}
|
||||
</b-button>
|
||||
</div>
|
||||
</b-container>
|
||||
</div>
|
||||
<!-- Page content -->
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
const textFields = {
|
||||
forgotPassword: {
|
||||
headline: 'site.thx.title',
|
||||
subtitle: 'site.thx.email',
|
||||
button: 'login',
|
||||
linkTo: '/login',
|
||||
},
|
||||
resetPassword: {
|
||||
headline: 'site.thx.title',
|
||||
subtitle: 'site.thx.reset',
|
||||
button: 'login',
|
||||
linkTo: '/login',
|
||||
},
|
||||
register: {
|
||||
headline: 'site.thx.title',
|
||||
subtitle: 'site.thx.register',
|
||||
button: 'signin',
|
||||
// linkTo: '/login',
|
||||
},
|
||||
checkEmail: {
|
||||
headline: 'site.thx.title',
|
||||
subtitle: 'site.thx.checkEmail',
|
||||
button: 'login',
|
||||
linkTo: '/login',
|
||||
},
|
||||
login: {
|
||||
headline: 'site.thx.errorTitle',
|
||||
subtitle: 'site.thx.activateEmail',
|
||||
button: 'settings.password.reset',
|
||||
linkTo: '/forgot-password',
|
||||
},
|
||||
}
|
||||
|
||||
export default {
|
||||
name: 'Thx',
|
||||
data() {
|
||||
return {
|
||||
displaySetup: {},
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
setDisplaySetup(from) {
|
||||
this.displaySetup = textFields[this.$route.params.comingFrom]
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.setDisplaySetup()
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -49,8 +49,8 @@ describe('router', () => {
|
||||
expect(routes.find((r) => r.path === '/').redirect()).toEqual({ path: '/login' })
|
||||
})
|
||||
|
||||
it('has seventeen routes defined', () => {
|
||||
expect(routes).toHaveLength(17)
|
||||
it('has sixteen routes defined', () => {
|
||||
expect(routes).toHaveLength(16)
|
||||
})
|
||||
|
||||
describe('overview', () => {
|
||||
@ -111,31 +111,6 @@ describe('router', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('thx', () => {
|
||||
const thx = routes.find((r) => r.path === '/thx/:comingFrom/:code?')
|
||||
|
||||
it('loads the "Thx" page', async () => {
|
||||
const component = await thx.component()
|
||||
expect(component.default.name).toBe('Thx')
|
||||
})
|
||||
|
||||
describe('beforeEnter', () => {
|
||||
const beforeEnter = thx.beforeEnter
|
||||
const next = jest.fn()
|
||||
|
||||
it('redirects to login when not coming from a valid page', () => {
|
||||
beforeEnter({}, { path: '' }, next)
|
||||
expect(next).toBeCalledWith({ path: '/login' })
|
||||
})
|
||||
|
||||
it('enters the page when coming from a valid page', () => {
|
||||
jest.resetAllMocks()
|
||||
beforeEnter({}, { path: '/forgot-password' }, next)
|
||||
expect(next).toBeCalledWith()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('forgot password', () => {
|
||||
it('loads the "ForgotPassword" page', async () => {
|
||||
const component = await routes.find((r) => r.path === '/forgot-password').component()
|
||||
|
||||
@ -46,18 +46,6 @@ const routes = [
|
||||
path: '/register/:code?',
|
||||
component: () => import('@/pages/Register.vue'),
|
||||
},
|
||||
{
|
||||
path: '/thx/:comingFrom/:code?',
|
||||
component: () => import('@/pages/thx.vue'),
|
||||
beforeEnter: (to, from, next) => {
|
||||
const validFrom = ['forgot-password', 'reset-password', 'register', 'login', 'checkEmail']
|
||||
if (!validFrom.includes(from.path.split('/')[1])) {
|
||||
next({ path: '/login' })
|
||||
} else {
|
||||
next()
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
path: '/forgot-password',
|
||||
component: () => import('@/pages/ForgotPassword.vue'),
|
||||
|
||||
@ -38,9 +38,6 @@ export const mutations = {
|
||||
isAdmin: (state, isAdmin) => {
|
||||
state.isAdmin = !!isAdmin
|
||||
},
|
||||
coinanimation: (state, coinanimation) => {
|
||||
state.coinanimation = coinanimation
|
||||
},
|
||||
hasElopage: (state, hasElopage) => {
|
||||
state.hasElopage = hasElopage
|
||||
},
|
||||
@ -53,7 +50,6 @@ export const actions = {
|
||||
// commit('username', data.username)
|
||||
commit('firstName', data.firstName)
|
||||
commit('lastName', data.lastName)
|
||||
commit('coinanimation', data.coinanimation)
|
||||
commit('newsletterState', data.klickTipp.newsletterState)
|
||||
commit('hasElopage', data.hasElopage)
|
||||
commit('publisherId', data.publisherId)
|
||||
@ -65,7 +61,6 @@ export const actions = {
|
||||
// commit('username', '')
|
||||
commit('firstName', '')
|
||||
commit('lastName', '')
|
||||
commit('coinanimation', true)
|
||||
commit('newsletterState', null)
|
||||
commit('hasElopage', false)
|
||||
commit('publisherId', null)
|
||||
@ -91,7 +86,6 @@ try {
|
||||
// username: '',
|
||||
token: null,
|
||||
isAdmin: false,
|
||||
coinanimation: true,
|
||||
newsletterState: null,
|
||||
hasElopage: false,
|
||||
publisherId: null,
|
||||
|
||||
@ -20,7 +20,6 @@ const {
|
||||
token,
|
||||
firstName,
|
||||
lastName,
|
||||
coinanimation,
|
||||
newsletterState,
|
||||
publisherId,
|
||||
isAdmin,
|
||||
@ -78,14 +77,6 @@ describe('Vuex store', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('coinanimation', () => {
|
||||
it('sets the state of coinanimation', () => {
|
||||
const state = { coinanimation: true }
|
||||
coinanimation(state, false)
|
||||
expect(state.coinanimation).toEqual(false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('newsletterState', () => {
|
||||
it('sets the state of newsletterState', () => {
|
||||
const state = { newsletterState: null }
|
||||
@ -134,7 +125,6 @@ describe('Vuex store', () => {
|
||||
language: 'de',
|
||||
firstName: 'Peter',
|
||||
lastName: 'Lustig',
|
||||
coinanimation: false,
|
||||
klickTipp: {
|
||||
newsletterState: true,
|
||||
},
|
||||
@ -145,7 +135,7 @@ describe('Vuex store', () => {
|
||||
|
||||
it('calls nine commits', () => {
|
||||
login({ commit, state }, commitedData)
|
||||
expect(commit).toHaveBeenCalledTimes(9)
|
||||
expect(commit).toHaveBeenCalledTimes(8)
|
||||
})
|
||||
|
||||
it('commits email', () => {
|
||||
@ -168,29 +158,24 @@ describe('Vuex store', () => {
|
||||
expect(commit).toHaveBeenNthCalledWith(4, 'lastName', 'Lustig')
|
||||
})
|
||||
|
||||
it('commits coinanimation', () => {
|
||||
login({ commit, state }, commitedData)
|
||||
expect(commit).toHaveBeenNthCalledWith(5, 'coinanimation', false)
|
||||
})
|
||||
|
||||
it('commits newsletterState', () => {
|
||||
login({ commit, state }, commitedData)
|
||||
expect(commit).toHaveBeenNthCalledWith(6, 'newsletterState', true)
|
||||
expect(commit).toHaveBeenNthCalledWith(5, 'newsletterState', true)
|
||||
})
|
||||
|
||||
it('commits hasElopage', () => {
|
||||
login({ commit, state }, commitedData)
|
||||
expect(commit).toHaveBeenNthCalledWith(7, 'hasElopage', false)
|
||||
expect(commit).toHaveBeenNthCalledWith(6, 'hasElopage', false)
|
||||
})
|
||||
|
||||
it('commits publisherId', () => {
|
||||
login({ commit, state }, commitedData)
|
||||
expect(commit).toHaveBeenNthCalledWith(8, 'publisherId', 1234)
|
||||
expect(commit).toHaveBeenNthCalledWith(7, 'publisherId', 1234)
|
||||
})
|
||||
|
||||
it('commits isAdmin', () => {
|
||||
login({ commit, state }, commitedData)
|
||||
expect(commit).toHaveBeenNthCalledWith(9, 'isAdmin', true)
|
||||
expect(commit).toHaveBeenNthCalledWith(8, 'isAdmin', true)
|
||||
})
|
||||
})
|
||||
|
||||
@ -200,7 +185,7 @@ describe('Vuex store', () => {
|
||||
|
||||
it('calls nine commits', () => {
|
||||
logout({ commit, state })
|
||||
expect(commit).toHaveBeenCalledTimes(9)
|
||||
expect(commit).toHaveBeenCalledTimes(8)
|
||||
})
|
||||
|
||||
it('commits token', () => {
|
||||
@ -223,29 +208,24 @@ describe('Vuex store', () => {
|
||||
expect(commit).toHaveBeenNthCalledWith(4, 'lastName', '')
|
||||
})
|
||||
|
||||
it('commits coinanimation', () => {
|
||||
logout({ commit, state })
|
||||
expect(commit).toHaveBeenNthCalledWith(5, 'coinanimation', true)
|
||||
})
|
||||
|
||||
it('commits newsletterState', () => {
|
||||
logout({ commit, state })
|
||||
expect(commit).toHaveBeenNthCalledWith(6, 'newsletterState', null)
|
||||
expect(commit).toHaveBeenNthCalledWith(5, 'newsletterState', null)
|
||||
})
|
||||
|
||||
it('commits hasElopage', () => {
|
||||
logout({ commit, state })
|
||||
expect(commit).toHaveBeenNthCalledWith(7, 'hasElopage', false)
|
||||
expect(commit).toHaveBeenNthCalledWith(6, 'hasElopage', false)
|
||||
})
|
||||
|
||||
it('commits publisherId', () => {
|
||||
logout({ commit, state })
|
||||
expect(commit).toHaveBeenNthCalledWith(8, 'publisherId', null)
|
||||
expect(commit).toHaveBeenNthCalledWith(7, 'publisherId', null)
|
||||
})
|
||||
|
||||
it('commits isAdmin', () => {
|
||||
logout({ commit, state })
|
||||
expect(commit).toHaveBeenNthCalledWith(9, 'isAdmin', false)
|
||||
expect(commit).toHaveBeenNthCalledWith(8, 'isAdmin', false)
|
||||
})
|
||||
|
||||
// how to get this working?
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
"main": "index.js",
|
||||
"repository": "git@github.com:gradido/gradido.git",
|
||||
"author": "Ulf Gebhardt <ulf.gebhardt@webcraft-media.de>",
|
||||
"license": "MIT",
|
||||
"license": "Apache-2.0",
|
||||
"scripts": {
|
||||
"release": "scripts/release.sh"
|
||||
},
|
||||
|
||||