diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e4d7b71fd3..1852336e71 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -24,3 +24,11 @@ updates: commit-message: prefix: chore include: scope +- package-ecosystem: npm + directory: "/site" + schedule: + interval: monthly + open-pull-requests-limit: 10 + commit-message: + prefix: chore + include: scope diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 29a78165c0..27e3b503e6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -3,9 +3,13 @@ name: "Code scanning - action" on: push: branches: [master, ] + paths-ignore: + - 'site/**' pull_request: # The branches below must be a subset of the branches above branches: [master] + paths-ignore: + - 'site/**' schedule: - cron: '0 12 * * 2' diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 04a3019464..ad85adab0d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -47,4 +47,4 @@ jobs: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} BRANCH: gh-pages FOLDER: site/__sapper__/export - CLEAN: true + CLEAN: true \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 50a483505c..b86d756754 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,7 @@ env: GITHUB_TOKEN: ${{ secrets.CR_PAT }} REGISTRY: ghcr.io NODE_VERSION: '12' - GO_VERSION: '1.14' + GO_VERSION: '1.15' jobs: @@ -126,30 +126,6 @@ jobs: repository: ${{ github.repository }} tag_with_ref: true tag_with_sha: true - - container-vulnerability-scan: - runs-on: ubuntu-18.04 - needs: container-prod - steps: - - name: Source checkout - uses: actions/checkout@v2 - - name: Generate Short SHA Container Tag - id: vars - run: echo "::set-output name=sha_short::SHA-$(git rev-parse --short HEAD)" - - name: Check outputs - run: echo ${{ steps.vars.outputs.sha_short }} - - name: Docker Login - run: docker login $REGISTRY -u $GITHUB_ACTOR -p $GITHUB_TOKEN - - uses: anchore/scan-action@master - with: - image-reference: "${{ env.REGISTRY }}/${{ github.repository }}:${{ steps.vars.outputs.sha_short }}" - dockerfile-path: "./build/docker/Dockerfile" - fail-build: false - acs-report-enable: true - - name: Upload Anchore Scan Report - uses: github/codeql-action/upload-sarif@v1 - with: - sarif_file: results.sarif release: runs-on: ubuntu-18.04 @@ -191,4 +167,4 @@ jobs: if: env.CAOS_NEXT_VERSION != '' - name: Docker Push Latest run: docker push $REGISTRY/$GITHUB_REPOSITORY:latest - if: env.CAOS_NEXT_VERSION != '' + if: env.CAOS_NEXT_VERSION != '' \ No newline at end of file diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml new file mode 100644 index 0000000000..a2590ac451 --- /dev/null +++ b/.github/workflows/spellcheck.yml @@ -0,0 +1,19 @@ +name: Spellcheck + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + spellcheck: + name: Typo CI (GitHub Action) + runs-on: ubuntu-latest + timeout-minutes: 4 + if: "!contains(github.event.head_commit.message, '[ci skip]')" + steps: + - name: TypoCheck + uses: typoci/spellcheck-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.typo-ci.yml b/.typo-ci.yml new file mode 100644 index 0000000000..87864246f5 --- /dev/null +++ b/.typo-ci.yml @@ -0,0 +1,40 @@ +# What language dictionaries should it use? Currently Typo CI supports: +# de +# en +# en_GB +# es +# fr +# it +# pt +# pt_BR +dictionaries: + - en + - en_GB + - de + +# Any files/folders we should ignore? +excluded_files: + - ".codecov/*" + - ".github/*" + - "build/*" + - "k8s/*" + - "*.min.css" + - "*.css.map" + - "*.min.js" + - "*.js.map" + - "package-lock.json" + - "package.json" + - ".releaserc.js" + - ".typo-ci.yml" + - ".gitignore" + - "go.mod" + - "go.sum" + +# Any typos we should ignore? +excluded_words: + - typoci + - idps + - ZITADEL's + +# Would you like filenames to also be spellchecked? +spellcheck_filenames: false \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..9dec141324 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# How to contribute to ZITADEL + +## **Did you find a bug?** + +## **Did you find a security flaw?** + +* Please read [Security Policy](SECURITY.md). + +## **Do you want to contribute to the ZITADEL documentation?** + +* Please read [Contributing to the ZITADEL Documentation](site/CONTRIBUTING.md). \ No newline at end of file diff --git a/README.md b/README.md index 513f0779fe..0ee9e3f1eb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Zitadel Logo +Zitadel Logo [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Release](https://github.com/caos/zitadel/workflows/Release/badge.svg)](https://github.com/caos/zitadel/actions) @@ -7,48 +7,49 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/caos/zitadel)](https://goreportcard.com/report/github.com/caos/zitadel) [![codecov](https://codecov.io/gh/caos/zitadel/branch/master/graph/badge.svg)](https://codecov.io/gh/caos/zitadel) -> This project is in a alpha state. The application will continue breaking until version 1.0.0 is released +> This project is in a beta state and API might still change a bit ## What Is It -`ZITADEL` is a Cloud Native Identity and Access Management solution. All server side components are written in `Go` and the management interface, called `Console`, is written in `Angular`. +**ZITADEL** is a "Cloud Native Identity and Access Management" solution. All server side components are written in [**Go**](https://golang.org/) and the management interface, called **Console**, is written in [**Angular**](https://angular.io/). -We optimized `ZITADEL` for the usage as `service provider IAM`. By `service provider` we think of companies who build services for e.g SaaS cases. Often these companies would like to use an IAM where they can register their application and grant other people or companies the right to self manage a set of roles within that application. +We optimized **ZITADEL** for the usage as "service provider" IAM. By "service provider" we think of companies who build services for e.g SaaS cases. Often these companies would like to use an IAM where they can register their application and grant other people or companies the right to self manage a set of roles within that application. ## How Does It Work -We built `ZITADEL` around the idea that the IAM should be easy to deploy and scale. That's why we tried to reduce external systems as much as possible. -For example, `ZITADEL` is eventsourced but it does not rely on a pub/sub system to function. Instead we built all the functionality right into one binary. -`ZITADEL` only needs `Kubernetes` for orchestration and `CockroachDB` as storage. +We built **ZITADEL** around the idea that the IAM should be easy to deploy and scale. That's why we tried to reduce external systems as much as possible. +For example, **ZITADEL** is event sourced but it does not rely on a pub/sub system to function. Instead we built all the functionality right into one binary. +**ZITADEL** only needs [**Kubernetes**](https://kubernetes.io/) for orchestration and [**CockroachDB**](https://www.cockroachlabs.com/) as storage. ## Why Another IAM -In the past we already built a closed sourced IAM and tested multiple others. With most of them we had some issues, either technology, feature, pricing or transparency related in nature. For example we find the idea that security related features like `MFA` should not be hidden behind a paywall or a feature price. -One feature that we often missed, was a solid `audit trail` of all IAM resources. Most systems we saw so far either rely on simple log files or use a short retention for this. +In the past we already built a closed sourced IAM and tested multiple others. With most of them we had some issues, either technology, feature, pricing or transparency related in nature. For example we find the idea that security related features like **MFA** should not be hidden behind a paywall or a feature price. +One feature that we often missed, was a solid **audit trail** of all IAM resources. Most systems we saw so far either rely on simple log files or use a short retention for this. ## How To Use It ### Use our free tier -Stay tuned, we will publish how you can register an organisation in our cloud offering `zitadel.ch` soon. -Yes we have a free tier! +We provide a shared-cloud ZITADEL system where people can register there own organisation. +Until end of 2020 we operator under a **early access** model where everything is free. +Go check it out under [zitadel.ch](https://zitadel.ch) ### Run your own IAM -Stay tuned, we will soon publish a guide how you can deploy a `hyperconverged` system with our automation tooling called `ORBOS`. -With [ORBOS](https://github.com/caos/orbos/) you will be able to run `ZITADEL` on `GCE` or `StaticProvider` within 20 minutes. To achieve this, [ORBOS](https://github.com/caos/orbos/) will bootstrap and maintain a `Kubernetes` cluster, essential platform components (logging, metrics, ingress, ...), a secure `CockroachDB` cluster and `ZITADEL` itself. +Stay tuned, we will soon publish a guide how you can deploy a **hyperconverged** system with our automation tooling called [**ORBOS**](https://github.com/caos/orbos/). +With [**ORBOS**](https://github.com/caos/orbos/) you will be able to run [**Kubernetes**](https://kubernetes.io/) on **GCE** or **StaticProvider** within 20 minutes. To achieve this, [[**ORBOS**](https://github.com/caos/orbos/) will bootstrap and maintain a [**Kubernetes**](https://kubernetes.io/) cluster, essential platform components (logging, metrics, ingress, ...), a secure [**CockroachDB**](https://www.cockroachlabs.com/) cluster and **ZITADEL** itself. -The combination of the tools [ORBOS](https://github.com/caos/orbos/) and `ZITADEL` is what makes the operation easy and scalable. - -See our progress [here](https://github.com/caos/orbos/pull/256) +The combination of the tools [**ORBOS**](https://github.com/caos/orbos/) and **ZITADEL** is what makes the operation easy and scalable. ## Give me some docs -This is work in progess but will change soon. +Have a look at our constantly evolving docs page [docs.zitadel.ch](https://docs.zitadel.ch). ## How To Contribute -TBA +Details need to be announced, but feel free to contribute already. As long as you are okay with accepting to contribute under this projects OSS [License](##License) you are fine. + +We already have documentation specific [guidelines](./site/CONTRIBUTING.md). ## Security @@ -59,3 +60,4 @@ See the policy [here](./SECURITY.md) See the exact licensing terms [here](./LICENSE) Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + diff --git a/build/build.md b/build/build.md deleted file mode 100644 index 746b342451..0000000000 --- a/build/build.md +++ /dev/null @@ -1,5 +0,0 @@ -# Build - -## Console - -## Docker diff --git a/cmd/zitadel/setup.yaml b/cmd/zitadel/setup.yaml index 2750b1f45a..45b954926d 100644 --- a/cmd/zitadel/setup.yaml +++ b/cmd/zitadel/setup.yaml @@ -23,52 +23,75 @@ Eventstore: MaxCacheSizeInByte: 10485760 #10mb SetUp: - GlobalOrg: 'Global' - IAMProject: 'Zitadel' - DefaultLoginPolicy: - AllowUsernamePassword: true - AllowRegister: true - AllowExternalIdp: true - Orgs: - - Name: 'Global' - Domain: 'global.caos.ch' - Default: true - OrgIamPolicy: true - Users: - - FirstName: 'Global Org' - LastName: 'Administrator' - UserName: 'zitadel-global-org-admin@caos.ch' - Email: 'zitadel-global-org-admin@caos.ch' - Password: 'Password1!' - Owners: - - 'zitadel-global-org-admin@caos.ch' - - Name: 'CAOS AG' - Domain: 'caos.ch' - Users: - - FirstName: 'Zitadel' - LastName: 'Administrator' - UserName: 'zitadel-admin' - Email: 'zitadel-admin@caos.ch' - Password: 'Password1!' - Owners: - - 'zitadel-admin@caos.ch' - Projects: - - Name: 'Zitadel' - OIDCApps: - - Name: 'Management-API' - - Name: 'Auth-API' - - Name: 'Admin-API' - - Name: 'Zitadel Console' - RedirectUris: - - '$ZITADEL_CONSOLE/auth/callback' - PostLogoutRedirectUris: - - '$ZITADEL_CONSOLE/signedout' - ResponseTypes: - - $ZITADEL_CONSOLE_RESPONSE_TYPE - GrantTypes: - - $ZITADEL_CONSOLE_GRANT_TYPE - ApplicationType: 'USER_AGENT' - AuthMethodType: 'NONE' - DevMode: $ZITADEL_CONSOLE_DEV_MODE - Owners: - - 'zitadel-admin@caos.ch' \ No newline at end of file + Step1: + GlobalOrg: 'Global' + IAMProject: 'Zitadel' + DefaultLoginPolicy: + AllowUsernamePassword: true + AllowRegister: true + AllowExternalIdp: true + Orgs: + - Name: 'Global' + Domain: 'global.caos.ch' + Default: true + OrgIamPolicy: true + Users: + - FirstName: 'Global Org' + LastName: 'Administrator' + UserName: 'zitadel-global-org-admin@caos.ch' + Email: 'zitadel-global-org-admin@caos.ch' + Password: 'Password1!' + Owners: + - 'zitadel-global-org-admin@caos.ch' + - Name: 'CAOS AG' + Domain: 'caos.ch' + Users: + - FirstName: 'Zitadel' + LastName: 'Administrator' + UserName: 'zitadel-admin' + Email: 'zitadel-admin@caos.ch' + Password: 'Password1!' + Owners: + - 'zitadel-admin@caos.ch' + Projects: + - Name: 'Zitadel' + OIDCApps: + - Name: 'Management-API' + - Name: 'Auth-API' + - Name: 'Admin-API' + - Name: 'Zitadel Console' + RedirectUris: + - '$ZITADEL_CONSOLE/auth/callback' + PostLogoutRedirectUris: + - '$ZITADEL_CONSOLE/signedout' + ResponseTypes: + - $ZITADEL_CONSOLE_RESPONSE_TYPE + GrantTypes: + - $ZITADEL_CONSOLE_GRANT_TYPE + ApplicationType: 'USER_AGENT' + AuthMethodType: 'NONE' + DevMode: $ZITADEL_CONSOLE_DEV_MODE + Owners: + - 'zitadel-admin@caos.ch' + Step2: + DefaultPasswordComplexityPolicy: + MinLength: 8 + HasLowercase: true + HasUppercase: true + HasSymbol: true + HasNumber: true + Step3: + DefaultPasswordAgePolicy: + MaxAgeDays: 0 + ExpireWarnDays: 0 + Step4: + DefaultPasswordLockoutPolicy: + MaxAttempts: 5 + ShowLockOutFailures: false + Step5: + DefaultOrgIAMPolicy: + UserLoginMustBeDomain: true + Step6: + DefaultLabelPolicy: + PrimaryColor: '#222324' + SecondaryColor: '#ffffff' diff --git a/cmd/zitadel/system-defaults.yaml b/cmd/zitadel/system-defaults.yaml index 9b94f71bc4..4a406784b7 100644 --- a/cmd/zitadel/system-defaults.yaml +++ b/cmd/zitadel/system-defaults.yaml @@ -52,28 +52,10 @@ SystemDefaults: EncryptionKeyID: $ZITADEL_OTP_VERIFICATION_KEY VerificationLifetimes: PasswordCheck: 240h #10d + ExternalLoginCheck: 240h #10d MfaInitSkip: 720h #30d MfaSoftwareCheck: 18h MfaHardwareCheck: 12h - DefaultPolicies: - Age: - Description: Standard age policy - MaxAgeDays: 365 - ExpireWarnDays: 10 - Complexity: - Description: Standard complexity policy - MinLength: 8 - HasLowercase: true - HasUppercase: false - HasNumber: true - HasSymbol: true - Lockout: - Description: Standard lockout policy - MaxAttempts: 5 - ShowLockOutFailures: true - OrgIam: - Description: Standard org policy - UserLoginMustBeDomain: true IamID: 'IAM' DomainVerification: VerificationKey: diff --git a/console/angular.json b/console/angular.json index fdce5a5161..624c368700 100644 --- a/console/angular.json +++ b/console/angular.json @@ -26,7 +26,7 @@ "assets": [ "src/favicon.ico", "src/assets", - "src/manifest.webmanifest", + "src/manifest.webmanifest" ], "styles": [ "src/styles.scss" @@ -34,8 +34,9 @@ "scripts": [], "allowedCommonJsDependencies": [ "@angular/common/locales/de", - "src/app/proto/generated/*.js", - "src/app/proto/generated/**/*.js" + "src/app/proto/generated/**", + "file-saver", + "qrcode" ] }, "configurations": { diff --git a/console/package-lock.json b/console/package-lock.json index 7530d0deed..6c29770829 100644 --- a/console/package-lock.json +++ b/console/package-lock.json @@ -5,109 +5,338 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.8.tgz", - "integrity": "sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA==", + "version": "0.1001.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1001.7.tgz", + "integrity": "sha512-uFYIvMdewU44GbIyRfsUHNMLkx+C0kokpnj7eH5NbJfbyFpCfd3ijBHh+voPdPsDRWs9lLgjbxfHpswSPj4D8w==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.8", - "rxjs": "6.5.5" + "@angular-devkit/core": "10.1.7", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, "@angular-devkit/build-angular": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1000.8.tgz", - "integrity": "sha512-wwDN2oadQvYPL7lDmvGsoWQjW++0ZnxWk1QVlABGhBSIs8Uxs26Hjd5YNUSsvJavBkqb1UZIOilqzb4dig5MIA==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1002.0.tgz", + "integrity": "sha512-cPkdp1GceokGHc79Wg0hACMqqmnJ4W3H9kY4c9qp1Xz18b3vk1aq09JNawOpfUN09S9vBCnn4glg22lRyqmJNA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1000.8", - "@angular-devkit/build-optimizer": "0.1000.8", - "@angular-devkit/build-webpack": "0.1000.8", - "@angular-devkit/core": "10.0.8", - "@babel/core": "7.9.6", - "@babel/generator": "7.9.6", - "@babel/plugin-transform-runtime": "7.9.6", - "@babel/preset-env": "7.9.6", - "@babel/runtime": "7.9.6", - "@babel/template": "7.8.6", - "@jsdevtools/coverage-istanbul-loader": "3.0.3", - "@ngtools/webpack": "10.0.8", - "ajv": "6.12.3", - "autoprefixer": "9.8.0", + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/build-optimizer": "0.1002.0", + "@angular-devkit/build-webpack": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "@babel/core": "7.11.1", + "@babel/generator": "7.11.0", + "@babel/plugin-transform-runtime": "7.11.0", + "@babel/preset-env": "7.11.0", + "@babel/runtime": "7.11.2", + "@babel/template": "7.10.4", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "10.2.0", + "autoprefixer": "9.8.6", "babel-loader": "8.1.0", "browserslist": "^4.9.1", - "cacache": "15.0.3", + "cacache": "15.0.5", "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.0", "copy-webpack-plugin": "6.0.3", "core-js": "3.6.4", - "css-loader": "3.5.3", + "css-loader": "4.2.2", "cssnano": "4.1.10", "file-loader": "6.0.0", "find-cache-dir": "3.3.1", "glob": "7.1.6", - "jest-worker": "26.0.0", + "jest-worker": "26.3.0", "karma-source-map-support": "1.4.0", - "less-loader": "6.1.0", - "license-webpack-plugin": "2.2.0", + "less-loader": "6.2.0", + "license-webpack-plugin": "2.3.0", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "0.9.0", + "mini-css-extract-plugin": "0.10.0", "minimatch": "3.0.4", - "open": "7.0.4", - "parse5": "4.0.0", + "open": "7.2.0", + "parse5": "6.0.1", + "parse5-htmlparser2-tree-adapter": "6.0.1", "pnp-webpack-plugin": "1.6.4", - "postcss": "7.0.31", + "postcss": "7.0.32", "postcss-import": "12.0.1", "postcss-loader": "3.0.0", "raw-loader": "4.0.1", - "regenerator-runtime": "0.13.5", - "resolve-url-loader": "3.1.1", + "regenerator-runtime": "0.13.7", + "resolve-url-loader": "3.1.2", "rimraf": "3.0.2", - "rollup": "2.10.9", - "rxjs": "6.5.5", - "sass": "1.26.5", - "sass-loader": "8.0.2", + "rollup": "2.26.5", + "rxjs": "6.6.2", + "sass": "1.26.10", + "sass-loader": "10.0.1", "semver": "7.3.2", "source-map": "0.7.3", - "source-map-loader": "1.0.0", + "source-map-loader": "1.0.2", "source-map-support": "0.5.19", "speed-measure-webpack-plugin": "1.3.3", "style-loader": "1.2.1", - "stylus": "0.54.7", + "stylus": "0.54.8", "stylus-loader": "3.0.2", - "terser": "4.7.0", - "terser-webpack-plugin": "3.0.1", + "terser": "5.3.0", + "terser-webpack-plugin": "4.1.0", "tree-kill": "1.2.2", - "webpack": "4.43.0", + "webpack": "4.44.1", "webpack-dev-middleware": "3.7.2", "webpack-dev-server": "3.11.0", "webpack-merge": "4.2.2", "webpack-sources": "1.4.3", "webpack-subresource-integrity": "1.4.1", - "worker-plugin": "4.0.3" + "worker-plugin": "5.0.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", + "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" + } + }, + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -116,46 +345,21 @@ "uri-js": "^4.2.2" } }, - "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.30", - "postcss-value-parser": "^4.1.0" + "ms": "2.1.2" } }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "postcss": { - "version": "7.0.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz", - "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -166,9 +370,9 @@ } }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -186,32 +390,24 @@ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, "@angular-devkit/build-optimizer": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.8.tgz", - "integrity": "sha512-esODHuTGEEMx1SmLUq03VAMly8gZUd1vRuvZeKS5HqKwDg8ZzcI7/25BuuUSlyST+6BEdjo2gnmagQnG0VBdQw==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1002.0.tgz", + "integrity": "sha512-ACnm9doPMbRtSy1UZN5ir7smeLMx0g0oW7jX3jyPepeQKZ+9U1Bn09t10NLZQH+Z509jWZgvNJH/aOh85P6euw==", "dev": true, "requires": { "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "2.0.0", + "tslib": "2.0.1", + "typescript": "4.0.2", "webpack-sources": "1.4.3" }, "dependencies": { @@ -222,58 +418,57 @@ "dev": true }, "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "dev": true + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1000.8.tgz", - "integrity": "sha512-y/U+dV5N8W7KECncGSKQWoUH/DFNZCseczyl6LAd8bc0fMr8Z0TAIe8OXj+5CSRRdejWfRIxGtNWM+L2kTCU8A==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1002.0.tgz", + "integrity": "sha512-TLBBQ6ANOLKXOPxpCOnxAtoknwHA7XhsLuueN06w5qqF+QNNbWUMPoieKFGs2TnotfCgbiq6x57IDEZTyT6V0w==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1000.8", - "@angular-devkit/core": "10.0.8", - "rxjs": "6.5.5" + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" }, "dependencies": { - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "@angular-devkit/architect": { + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", + "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" + } + }, + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" } }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } - } - }, - "@angular-devkit/core": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", - "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.5.5", - "source-map": "0.7.3" - }, - "dependencies": { "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -283,9 +478,9 @@ } }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -298,37 +493,116 @@ "dev": true }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, - "@angular-devkit/schematics": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.8.tgz", - "integrity": "sha512-p2PjvrExuzOe/azyOEcBeIgwZIk4D6VeLkJf/KVjhXOVu13pjIXHX7/qWl+IYnbtj3NZGHqXM5Cr8nxsJNIMpw==", + "@angular-devkit/core": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.1.7.tgz", + "integrity": "sha512-RRyDkN2FByA+nlnRx/MzUMK1FXwj7+SsrzJcvZfWx4yA5rfKmJiJryXQEzL44GL1aoaXSuvOYu3H72wxZADN8Q==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.8", - "ora": "4.0.4", - "rxjs": "6.5.5" + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" }, "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.0.tgz", + "integrity": "sha512-TQI5NnE6iM3ChF5gZQ9qb+lZgMWa7aLoF5ksOyT3zrmOuICiQYJhA6SsjV95q7J4M55qYymwBib8KTqU/xuQww==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.2.0", + "ora": "5.0.0", + "rxjs": "6.6.2" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } @@ -351,33 +625,68 @@ } }, "@angular/cli": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.8.tgz", - "integrity": "sha512-unTteffLepsFw7qQulHOLLyLqCpQMOaZo0WO4x6cQGcW2mc0WgwnwBW2JDYMx1U2434t/Q13LqYMPNYWyCGsog==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.0.tgz", + "integrity": "sha512-YBzwkFBmG6CdUJk8onsPXxHX/ByU5MERBQgYhLC873e2nZlXMUu+Ttq2Wai6apyskGvsXKxZNPOQSFZTGKXzXg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1000.8", - "@angular-devkit/core": "10.0.8", - "@angular-devkit/schematics": "10.0.8", - "@schematics/angular": "10.0.8", - "@schematics/update": "0.1000.8", + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "@schematics/angular": "10.2.0", + "@schematics/update": "0.1002.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.1.1", "ini": "1.3.5", - "inquirer": "7.1.0", + "inquirer": "7.3.3", "npm-package-arg": "8.0.1", "npm-pick-manifest": "6.1.0", - "open": "7.0.4", + "open": "7.2.0", "pacote": "9.5.12", "read-package-tree": "5.3.1", "rimraf": "3.0.2", "semver": "7.3.2", "symbol-observable": "1.2.0", - "universal-analytics": "0.4.20", - "uuid": "8.1.0" + "universal-analytics": "0.4.23", + "uuid": "8.3.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", + "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" + } + }, + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -402,16 +711,37 @@ "glob": "^7.1.3" } }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "uuid": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", - "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", "dev": true } } @@ -647,9 +977,9 @@ } }, "@angular/language-service": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.1.0.tgz", - "integrity": "sha512-+36OfWzn+JgHeKDxWPS4+rEUQnmwqvm7U9ciqZiaa0V49j9+MJOtM5Ax5WXQhYHFBxuG9zQIowAsm7UYxvWiDg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.2.0.tgz", + "integrity": "sha512-p2yJ8QhJPrNAoeGJ2abX22rNMDyQAmGsMV0GUCpGfmrJ4wDLPW+hy7tbL44qGn2B4KY5lvj30yIxjxL8HtBCVw==", "dev": true }, "@angular/material": { @@ -702,15 +1032,10 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "dev": true }, "@babel/core": { "version": "7.9.6", @@ -793,27 +1118,153 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", + "@babel/compat-data": "^7.12.1", + "@babel/helper-validator-option": "^7.12.1", "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", "semver": "^5.5.0" } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + } + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" } }, "@babel/helper-define-map": { @@ -828,12 +1279,25 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { @@ -989,46 +1453,25 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } } } @@ -1089,18 +1532,18 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" }, "dependencies": { "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1125,10 +1568,16 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -1232,40 +1681,70 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -1273,9 +1752,9 @@ } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -1283,20 +1762,20 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -1304,23 +1783,33 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -1333,6 +1822,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1342,6 +1840,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1351,6 +1858,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", @@ -1397,56 +1913,78 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -1454,52 +1992,166 @@ "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + } + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", @@ -1507,18 +2159,18 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -1526,168 +2178,912 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-runtime": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz", - "integrity": "sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", + "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -1695,100 +3091,129 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz", - "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", "dev": true, "requires": { - "@babel/compat-data": "^7.9.6", - "@babel/helper-compilation-targets": "^7.9.6", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-numeric-separator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.9.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.9.5", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.9.5", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.9.0", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.9.6", - "@babel/plugin-transform-modules-commonjs": "^7.9.6", - "@babel/plugin-transform-modules-systemjs": "^7.9.6", - "@babel/plugin-transform-modules-umd": "^7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.9.5", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.7", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.4", - "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.9.6", - "browserslist": "^4.11.1", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/preset-modules": { @@ -1805,9 +3230,9 @@ } }, "@babel/runtime": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", - "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -1907,65 +3332,73 @@ "dev": true }, "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", - "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", "dev": true, "requires": { "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.1", - "loader-utils": "^1.4.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", "merge-source-map": "^1.1.0", - "schema-utils": "^2.6.4" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "schema-utils": "^2.7.0" } }, "@ngtools/webpack": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.8.tgz", - "integrity": "sha512-Qv4v7O4VGeWuXjRThd/mdC2I4cJOgQ7kDrVN7vkDB2EW5xtRB+/4hghvFeO3bD11FLuFvCxBMb0HbwyKoVQgEQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.2.0.tgz", + "integrity": "sha512-W4SSFNQhIiC8JRhIn3c4mb1+fsFKiHp+THVMAUNo+wRZEt/rgzsCdnqv0EmQJJojZhnilUIyB/wVYJu2+S/Bxg==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.8", - "enhanced-resolve": "4.1.1", - "rxjs": "6.5.5", + "@angular-devkit/core": "10.2.0", + "enhanced-resolve": "4.3.0", "webpack-sources": "1.4.3" }, "dependencies": { + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } @@ -2084,36 +3517,109 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@schematics/angular": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.8.tgz", - "integrity": "sha512-KNO61UGtiKMQSG+NbusqLtwLbxId0y+xpXJt9PKFwi+vaViOO+YzOPREfiFCuQ7q6X8SmNlrMj6sZ34E2YN1pQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.0.tgz", + "integrity": "sha512-rJRTTTL8CMMFb3ebCvAVHKHxuNzRqy/HtbXhJ82l5Xo/jXcm74eV2Q0RBUrNo1yBKWFIR+FIwiXLJaGcC/R9Pw==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.8", - "@angular-devkit/schematics": "10.0.8" + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "jsonc-parser": "2.3.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@schematics/update": { - "version": "0.1000.8", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.8.tgz", - "integrity": "sha512-xHuj6ME3PNTsVUrpftd98LF3WHPM0NU25GcT/n0E/j0/52yDTiaPS3wUnYSK8ZSv4Et4hcyGx7f/LEXAoOKJXw==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.0.tgz", + "integrity": "sha512-g2bfJSAj3x/YL0GNhnHsDSQmO6DoxSnLxoFLqNN5+ukxK5jq7OZNDwMJGxZ3X6RcSMWKEkIKL/wlq9yhj2T/kw==", "dev": true, "requires": { - "@angular-devkit/core": "10.0.8", - "@angular-devkit/schematics": "10.0.8", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "npm-package-arg": "^8.0.0", "pacote": "9.5.12", - "rxjs": "6.5.5", "semver": "7.3.2", "semver-intersect": "1.4.0" }, "dependencies": { + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -2125,10 +3631,16 @@ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } @@ -2188,9 +3700,9 @@ "integrity": "sha512-FRwj40euE2bYkG+0X5w2nEA8yAzgJRcEa7RBd0Gsdkb9/tPM2pctVVAvnOUTbcXo2VmIHPo0Ae94Gl9vRHfKzg==" }, "@types/jasmine": { - "version": "3.5.14", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.14.tgz", - "integrity": "sha512-Fkgk536sHPqcOtd+Ow+WiUNuk0TSo/BntKkF8wSvcd6M2FvPjeXcUE6Oz/bwDZiUZEaXLslAgw00Q94Pnx6T4w==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.0.tgz", + "integrity": "sha512-CPT4r0a63e5wpNj5ejMnconM7a+0Hdx6/APsyw8AQOHk0/Mxp3xYrym1ZabWJiYuQkgKB3MonYoN04mxtvAvRA==", "dev": true }, "@types/jasminewd2": { @@ -2203,9 +3715,9 @@ } }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, "@types/long": { @@ -2226,9 +3738,9 @@ "dev": true }, "@types/node": { - "version": "14.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", - "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==" + "version": "14.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.3.tgz", + "integrity": "sha512-33/L34xS7HVUx23e0wOT2V1qPF1IrHgQccdJVm9uXGTB9vFBrrzBtkQymT8VskeKOxjz55MSqMv0xuLq+u98WQ==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -2486,9 +3998,9 @@ } }, "abab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", - "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "abbrev": { @@ -2507,56 +4019,19 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", "dev": true, "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - } + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" } }, "adm-zip": { @@ -2638,9 +4113,9 @@ } }, "angularx-qrcode": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/angularx-qrcode/-/angularx-qrcode-10.0.10.tgz", - "integrity": "sha512-e6cgh5QL6hma4FfEy4WMlmdIIg21d69UsyVGOQ0nValy0jeWWu2WhNmlXZbDM2AcVOecOW4ODJDTKUlpQpS43w==", + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/angularx-qrcode/-/angularx-qrcode-10.0.11.tgz", + "integrity": "sha512-sbtqdqAboEFNoyxgG4FQYPZDzwX9TlICT2mLpsC/Se3OuT+HntW56q8E/i1BL1fJhx7zt0JJR7bc7LfofUeAlQ==", "requires": { "qrcode": "1.4.2", "tslib": "^2.0.0" @@ -2880,12 +4355,30 @@ } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { @@ -3482,22 +4975,22 @@ "dev": true }, "cacache": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", - "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", "dev": true, "requires": { + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", + "lru-cache": "^6.0.0", "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", - "move-file": "^2.0.0", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", @@ -3512,6 +5005,15 @@ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -3758,9 +5260,9 @@ }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } @@ -3820,15 +5322,15 @@ } }, "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", - "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", "dev": true }, "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, "cliui": { @@ -3847,17 +5349,6 @@ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, "clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -3884,9 +5375,9 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codelyzer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.0.tgz", - "integrity": "sha512-edJIQCIcxD9DhVSyBEdJ38AbLikm515Wl91t5RDGNT88uA6uQdTm4phTWfn9JhzAI8kXNUcfYyAE90lJElpGtA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", + "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==", "dev": true, "requires": { "@angular/compiler": "9.0.0", @@ -3960,13 +5451,13 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -3983,9 +5474,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -4296,52 +5787,6 @@ "webpack-sources": "^1.4.3" }, "dependencies": { - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "p-limit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", @@ -4350,15 +5795,6 @@ "requires": { "p-try": "^2.0.0" } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } } } }, @@ -4537,56 +5973,35 @@ } }, "css-loader": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz", - "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.2.tgz", + "integrity": "sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg==", "dev": true, "requires": { - "camelcase": "^5.3.1", + "camelcase": "^6.0.0", "cssesc": "^3.0.0", "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.27", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-local-by-default": "^3.0.3", "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.3", - "schema-utils": "^2.6.6", - "semver": "^6.3.0" + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^7.3.2" }, "dependencies": { "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", "dev": true }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -4619,14 +6034,13 @@ "dev": true }, "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" + "fastparse": "^1.1.2" } }, "css-tree": { @@ -4640,9 +6054,9 @@ } }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, "cssauron": { @@ -5231,9 +6645,9 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -5465,9 +6879,9 @@ } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -5623,12 +7037,20 @@ "dev": true }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -6177,15 +7599,6 @@ "path-exists": "^4.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -6195,15 +7608,6 @@ "semver": "^6.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7327,21 +8731,21 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", - "rxjs": "^6.5.3", + "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" @@ -7354,19 +8758,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7672,6 +9075,12 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -8006,20 +9415,12 @@ "dev": true }, "jasmine-spec-reporter": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", - "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-6.0.0.tgz", + "integrity": "sha512-MvTOVoMxDZAftQYBApIlSfKnGMzi9cj351nXeqtnZTuXffPlbONN31+Es7F+Ke4okUeQ2xISukt4U1npfzLVrQ==", "dev": true, "requires": { "colors": "1.4.0" - }, - "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - } } }, "jasminewd2": { @@ -8029,11 +9430,12 @@ "dev": true }, "jest-worker": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", - "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", + "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, @@ -8128,6 +9530,12 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz", + "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==", + "dev": true + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -8200,9 +9608,9 @@ } }, "karma": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.1.tgz", - "integrity": "sha512-+/AO2fWL7kC3aWTx/lHjtKXfOqh0O+KLtTy4BLQ/b/eciHR4VTHHdPhdrn9sDBQskgDieaBZ+sAKzlldc4GW/Q==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", + "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", "dev": true, "requires": { "body-parser": "^1.19.0", @@ -8224,9 +9632,9 @@ "range-parser": "^1.2.1", "rimraf": "^3.0.2", "socket.io": "^2.3.0", - "source-map": "^0.7.3", + "source-map": "^0.6.1", "tmp": "0.2.1", - "ua-parser-js": "0.7.21", + "ua-parser-js": "0.7.22", "yargs": "^15.3.1" }, "dependencies": { @@ -8346,12 +9754,6 @@ "glob": "^7.1.3" } }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -8487,6 +9889,12 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, "known-css-properties": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz", @@ -8518,23 +9926,23 @@ }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, "less-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.1.0.tgz", - "integrity": "sha512-/jLzOwLyqJ7Kt3xg5sHHkXtOyShWwFj410K9Si9WO+/h8rmYxxkSR0A3/hFEntWudE20zZnWMtpMYnLzqTVdUA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.2.0.tgz", + "integrity": "sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg==", "dev": true, "requires": { "clone": "^2.1.2", - "less": "^3.11.1", + "less": "^3.11.3", "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6" + "schema-utils": "^2.7.0" } }, "leven": { @@ -8553,9 +9961,9 @@ } }, "license-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-XPsdL/0brSHf+7dXIlRqotnCQ58RX2au6otkOg4U3dm8uH+Ka/fW4iukEs95uXm+qKe/SBs+s1Ll/aQddKG+tg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", @@ -8718,12 +10126,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } } } @@ -9109,9 +10517,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz", + "integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -9295,9 +10703,9 @@ } }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "move-concurrently": { "version": "1.0.1", @@ -9313,23 +10721,6 @@ "run-queue": "^1.0.3" } }, - "move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", - "dev": true, - "requires": { - "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9382,9 +10773,9 @@ } }, "native-request": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", - "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", + "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", "dev": true, "optional": true }, @@ -9457,9 +10848,9 @@ } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, "node-libs-browser": { @@ -9530,23 +10921,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } } } }, @@ -9716,9 +11090,9 @@ }, "dependencies": { "hosted-git-info": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", - "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9895,13 +11269,62 @@ "dev": true }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "object-keys": { @@ -9910,12 +11333,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -10007,9 +11424,9 @@ } }, "open": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", - "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", + "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -10039,16 +11456,16 @@ "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" }, "ora": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", - "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", "dev": true, "requires": { - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", + "cli-spinners": "^2.4.0", "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", + "log-symbols": "^4.0.0", "mute-stream": "0.0.8", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" @@ -10061,19 +11478,18 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10101,67 +11517,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -10531,6 +11886,23 @@ "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "optional": true }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -10722,9 +12094,9 @@ } }, "postcss-calc": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", - "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "dev": true, "requires": { "postcss": "^7.0.27", @@ -10846,9 +12218,9 @@ } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -11412,9 +12784,9 @@ "dev": true }, "prettier": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz", - "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", "dev": true }, "process": { @@ -12280,9 +13652,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "regenerator-transform": { @@ -12305,9 +13677,9 @@ } }, "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, "regexp.prototype.flags": { @@ -12321,9 +13693,9 @@ } }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { "regenerate": "^1.4.0", @@ -12529,12 +13901,12 @@ "dev": true }, "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", + "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", "dev": true, "requires": { - "adjust-sourcemap-loader": "2.0.0", + "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", "compose-function": "3.0.3", "convert-source-map": "1.7.0", @@ -12689,9 +14061,9 @@ } }, "rollup": { - "version": "2.10.9", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.9.tgz", - "integrity": "sha512-dY/EbjiWC17ZCUSyk14hkxATAMAShkMsD43XmZGWjLrgFj15M3Dw2kEkA9ns64BiLFm9PKN6vTQw8neHwK74eg==", + "version": "2.26.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.5.tgz", + "integrity": "sha512-rCyFG3ZtQdnn9YwfuAVH0l/Om34BdO5lwCA0W6Hq+bNB21dVEBbCRxhaHOmu1G7OBFDWytbzAC104u7rxHwGjA==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -12753,51 +14125,31 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", - "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", + "version": "1.26.10", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", + "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.1.tgz", + "integrity": "sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" + "klona": "^2.0.3", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^2.7.0", + "semver": "^7.3.2" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -12828,9 +14180,9 @@ }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -12871,12 +14223,12 @@ } }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "dev": true, "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { @@ -13081,15 +14433,6 @@ "safe-buffer": "^5.0.1" } }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -13546,25 +14889,25 @@ "dev": true }, "source-map-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.0.tgz", - "integrity": "sha512-ZayyQCSCrQazN50aCvuS84lJT4xc1ZAcykH5blHaBdVveSwjiFK8UGMPvao0ho54DTb0Jf7m57uRRG/YYUZ2Fg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.2.tgz", + "integrity": "sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw==", "dev": true, "requires": { "data-urls": "^2.0.0", - "iconv-lite": "^0.5.1", + "iconv-lite": "^0.6.2", "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6", - "source-map": "^0.6.0" + "schema-utils": "^2.7.0", + "source-map": "^0.6.1" }, "dependencies": { "iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } } } @@ -13650,12 +14993,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } } } @@ -13675,12 +15018,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } } } @@ -13901,12 +15244,12 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "fs-extra": { @@ -14049,9 +15392,9 @@ } }, "stylelint": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.1.tgz", - "integrity": "sha512-qzqazcyRxrSRdmFuO0/SZOJ+LyCxYy0pwcvaOBBnl8/2VfHSMrtNIE+AnyJoyq6uKb+mt+hlgmVrvVi6G6XHfQ==", + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.2.tgz", + "integrity": "sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==", "dev": true, "requires": { "@stylelint/postcss-css-in-js": "^0.37.2", @@ -14146,12 +15489,12 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "has-flag": { @@ -14251,18 +15594,18 @@ } }, "stylus": { - "version": "0.54.7", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", - "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", "dev": true, "requires": { "css-parse": "~2.0.0", "debug": "~3.1.0", - "glob": "^7.1.3", - "mkdirp": "~0.5.x", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.0.0", + "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { @@ -14275,6 +15618,12 @@ "ms": "2.0.0" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -14478,9 +15827,9 @@ } }, "terser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", - "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.0.tgz", + "integrity": "sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg==", "dev": true, "requires": { "commander": "^2.20.0", @@ -14489,29 +15838,29 @@ } }, "terser-webpack-plugin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", - "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA==", "dev": true, "requires": { - "cacache": "^15.0.3", + "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^26.0.0", - "p-limit": "^2.3.0", + "jest-worker": "^26.3.0", + "p-limit": "^3.0.2", "schema-utils": "^2.6.6", - "serialize-javascript": "^3.0.0", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^4.6.13", + "terser": "^5.0.0", "webpack-sources": "^1.4.3" }, "dependencies": { - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { - "randombytes": "^2.1.0" + "p-try": "^2.0.0" } } } @@ -14744,17 +16093,17 @@ "dev": true }, "ts-protoc-gen": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.12.0.tgz", - "integrity": "sha512-V7jnICJxKqalBrnJSMTW5tB9sGi48gOC325bfcM7TDNUItVOlaMM//rQmuo49ybipk/SyJTnWXgtJnhHCevNJw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.13.0.tgz", + "integrity": "sha512-j18X4rkDBbG/ZHUJy88WFeZP6mStGow5uREaohowlHXTu3/N7WcpyPhb7Vh6wN38ERmc/AkT9gqT98+vtlRhJA==", "requires": { "google-protobuf": "^3.6.1" } }, "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" }, "tslint": { "version": "6.1.3", @@ -14867,9 +16216,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", "dev": true }, "unherit": { @@ -15035,16 +16384,63 @@ } }, "universal-analytics": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", - "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", "dev": true, "requires": { - "debug": "^3.0.0", - "request": "^2.88.0", + "debug": "^4.1.1", + "request": "^2.88.2", "uuid": "^3.0.0" }, "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -15167,18 +16563,18 @@ "dev": true }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } } @@ -15216,9 +16612,9 @@ "dev": true }, "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" }, "v8-compile-cache": { "version": "2.1.1", @@ -15334,9 +16730,9 @@ }, "dependencies": { "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "optional": true, "requires": { @@ -15347,13 +16743,13 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "optional": true, "requires": { @@ -15638,9 +17034,9 @@ "dev": true }, "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", - "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -15651,7 +17047,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", + "enhanced-resolve": "^4.3.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", @@ -15664,7 +17060,7 @@ "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.1", + "watchpack": "^1.7.4", "webpack-sources": "^1.4.1" }, "dependencies": { @@ -15861,6 +17257,17 @@ "safe-buffer": "~5.1.0" } }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, "terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -16103,12 +17510,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "emoji-regex": { @@ -16429,9 +17836,9 @@ "dev": true }, "whatwg-url": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.1.tgz", - "integrity": "sha512-ZmVCr6nfBeaMxEHALLEGy0LszYjpJqf6PVNQUQ1qd9Et+q7Jpygd4rGGDXgHjD8e99yLFseD69msHDM4YwPZ4A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -16482,9 +17889,9 @@ } }, "worker-plugin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz", - "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", + "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", "dev": true, "requires": { "loader-utils": "^1.1.0" @@ -16644,9 +18051,9 @@ "dev": true }, "zone.js": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.1.tgz", - "integrity": "sha512-KcZawpmVgS+3U2rzKTM6fLKaCX1QDv3//NxiSOOsqpQY/r5hl+xpYikPwY93Sp7CAB+J5mZJpb/YubxEYLGK5g==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.2.tgz", + "integrity": "sha512-JUpNKmWIovqRZlqkX6pFdBVlOU42n5Mt1n2yEaJdy+msBant/l2L1hTG6BFxCzM+KV3SX4XQOcwbhnwsPAeUTA==", "requires": { "tslib": "^2.0.0" } diff --git a/console/package.json b/console/package.json index 8a015515fe..b00859b0de 100644 --- a/console/package.json +++ b/console/package.json @@ -27,7 +27,7 @@ "@types/file-saver": "^2.0.1", "@types/uuid": "^8.3.0", "@types/google-protobuf": "^3.7.3", - "angularx-qrcode": "^10.0.10", + "angularx-qrcode": "^10.0.11", "angular-oauth2-oidc": "^10.0.3", "cors": "^2.8.5", "file-saver": "^2.0.2", @@ -35,34 +35,34 @@ "google-protobuf": "^3.13.0", "grpc": "^1.24.3", "grpc-web": "^1.2.1", - "moment": "^2.27.0", + "moment": "^2.29.1", "ngx-moment": "^5.0.0", "ngx-quicklink": "^0.2.4", "rxjs": "~6.6.3", - "ts-protoc-gen": "^0.12.0", - "tslib": "^2.0.1", - "uuid": "^8.3.0", - "zone.js": "~0.11.1" + "ts-protoc-gen": "^0.13.0", + "tslib": "^2.0.3", + "uuid": "^8.3.1", + "zone.js": "~0.11.2" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.1000.8", - "@angular/cli": "~10.0.7", + "@angular-devkit/build-angular": "~0.1002.0", + "@angular/cli": "~10.2.0", "@angular/compiler-cli": "~10.0.11", - "@types/jasmine": "~3.5.13", - "@angular/language-service": "~10.1.0", + "@types/jasmine": "~3.6.0", + "@angular/language-service": "~10.2.0", "@types/jasminewd2": "~2.0.3", - "@types/node": "^14.6.4", - "codelyzer": "^6.0.0", + "@types/node": "^14.14.3", + "codelyzer": "^6.0.1", "jasmine-core": "~3.6.0", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~5.2.1", + "jasmine-spec-reporter": "~6.0.0", + "karma": "~5.2.3", "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.1", "karma-jasmine-html-reporter": "^1.5.0", - "prettier": "^2.1.1", + "prettier": "^2.1.2", "protractor": "~7.0.0", - "stylelint": "^13.7.1", + "stylelint": "^13.7.2", "stylelint-config-standard": "^20.0.0", "stylelint-scss": "^3.18.0", "ts-node": "~9.0.0", diff --git a/console/src/app/animations.ts b/console/src/app/animations.ts index ccbfadf2c6..acb2ef4e95 100644 --- a/console/src/app/animations.ts +++ b/console/src/app/animations.ts @@ -77,6 +77,38 @@ export const navAnimations: Array = [ ]), ]; + +export const enterAnimations: Array = [ + trigger('appearfade', [ + transition(':enter', [ + style({ + transform: 'scale(.9) translateY(-10%)', + opacity: 0, + }), + animate( + '100ms ease-in-out', + style({ + transform: 'scale(1) translateY(0%)', + opacity: 1, + }), + ), + ]), + transition(':leave', [ + style({ + transform: 'scale(1) translateY(0%)', + opacity: 1, + }), + animate( + '100ms ease-in-out', + style({ + transform: 'scale(.9) translateY(-10%)', + opacity: 0, + }), + ), + ]), + ]), +]; + export const routeAnimations: AnimationTriggerMetadata = trigger('routeAnimations', [ transition('HomePage => AddPage', [ style({ transform: 'translateX(100%)', opacity: 0.5 }), diff --git a/console/src/app/app-routing.module.ts b/console/src/app/app-routing.module.ts index 57d980f1de..4c562966f2 100644 --- a/console/src/app/app-routing.module.ts +++ b/console/src/app/app-routing.module.ts @@ -65,6 +65,14 @@ const routes: Routes = [ roles: ['org.read'], }, }, + { + path: 'grants', + loadChildren: () => import('./pages/grants/grants.module').then(m => m.GrantsModule), + canActivate: [AuthGuard, RoleGuard], + data: { + roles: ['user.grant.read'], + }, + }, { path: 'grant-create', canActivate: [AuthGuard], @@ -87,6 +95,24 @@ const routes: Routes = [ roles: ['user.grant.write'], }, }, + { + path: 'user/:userid', + loadChildren: () => import('src/app/pages/user-grant-create/user-grant-create.module') + .then(m => m.UserGrantCreateModule), + canActivate: [RoleGuard], + data: { + roles: ['user.grant.write'], + }, + }, + { + path: '', + loadChildren: () => import('src/app/pages/user-grant-create/user-grant-create.module') + .then(m => m.UserGrantCreateModule), + canActivate: [RoleGuard], + data: { + roles: ['user.grant.write'], + }, + }, ], }, { diff --git a/console/src/app/app.component.html b/console/src/app/app.component.html index be75b56295..f189c3ffec 100644 --- a/console/src/app/app.component.html +++ b/console/src/app/app.component.html @@ -1,5 +1,5 @@ - + - - - + +
+ + +
+ + + + + + - + \ No newline at end of file diff --git a/console/src/app/modules/idp-create/idp-create.component.scss b/console/src/app/modules/idp-create/idp-create.component.scss index 677989d7d5..9b44629fe5 100644 --- a/console/src/app/modules/idp-create/idp-create.component.scss +++ b/console/src/app/modules/idp-create/idp-create.component.scss @@ -25,7 +25,6 @@ .add-line-btn { margin-bottom: 1rem; - border-radius: .5rem; } } @@ -38,7 +37,7 @@ flex-basis: 100%; margin: 0 .5rem; margin-bottom: 1rem; - color: #8795a1; + color: var(--grey); } .formfield { @@ -55,7 +54,6 @@ margin-top: 3rem; display: block; padding: .5rem 4rem; - border-radius: .5rem; @media only screen and (max-width: 450px) { margin-top: 1rem; diff --git a/console/src/app/modules/idp-create/idp-create.component.ts b/console/src/app/modules/idp-create/idp-create.component.ts index ee7350137a..223aee16ce 100644 --- a/console/src/app/modules/idp-create/idp-create.component.ts +++ b/console/src/app/modules/idp-create/idp-create.component.ts @@ -7,18 +7,18 @@ import { ActivatedRoute, Params, Router } from '@angular/router'; import { Subscription } from 'rxjs'; import { take } from 'rxjs/operators'; import { - OidcIdpConfigCreate as AdminOidcIdpConfigCreate, - OIDCMappingField as authMappingFields, + OidcIdpConfigCreate as AdminOidcIdpConfigCreate, + OIDCMappingField as authMappingFields, } from 'src/app/proto/generated/admin_pb'; import { AdminService } from 'src/app/services/admin.service'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; -import { PolicyComponentServiceType } from '../policies/policy-component-types.enum'; import { - OidcIdpConfigCreate as MgmtOidcIdpConfigCreate, - OIDCMappingField as mgmtMappingFields, + OidcIdpConfigCreate as MgmtOidcIdpConfigCreate, + OIDCMappingField as mgmtMappingFields, } from '../../proto/generated/management_pb'; +import { PolicyComponentServiceType } from '../policies/policy-component-types.enum'; @Component({ selector: 'app-idp-create', @@ -37,7 +37,7 @@ export class IdpCreateComponent implements OnInit, OnDestroy { public formGroup!: FormGroup; public createSteps: number = 1; public currentCreateStep: number = 1; - + public loading: boolean = false; constructor( private router: Router, private route: ActivatedRoute, @@ -47,7 +47,6 @@ export class IdpCreateComponent implements OnInit, OnDestroy { ) { this.formGroup = new FormGroup({ name: new FormControl('', [Validators.required]), - logoSrc: new FormControl('', []), clientId: new FormControl('', [Validators.required]), clientSecret: new FormControl('', [Validators.required]), issuer: new FormControl('', [Validators.required]), @@ -68,8 +67,8 @@ export class IdpCreateComponent implements OnInit, OnDestroy { case PolicyComponentServiceType.ADMIN: this.service = this.injector.get(AdminService as Type); this.mappingFields = [ - authMappingFields.OIDCMAPPINGFIELD_PREFERRED_USERNAME, - authMappingFields.OIDCMAPPINGFIELD_EMAIL]; + authMappingFields.OIDCMAPPINGFIELD_PREFERRED_USERNAME, + authMappingFields.OIDCMAPPINGFIELD_EMAIL]; break; } }); @@ -91,25 +90,30 @@ export class IdpCreateComponent implements OnInit, OnDestroy { let req: AdminOidcIdpConfigCreate | MgmtOidcIdpConfigCreate; switch (this.serviceType) { - case PolicyComponentServiceType.MGMT: - req = new MgmtOidcIdpConfigCreate(); - break; - case PolicyComponentServiceType.ADMIN: - req = new AdminOidcIdpConfigCreate(); - break; + case PolicyComponentServiceType.MGMT: + req = new MgmtOidcIdpConfigCreate(); + break; + case PolicyComponentServiceType.ADMIN: + req = new AdminOidcIdpConfigCreate(); + break; } req.setName(this.name?.value); req.setClientId(this.clientId?.value); req.setClientSecret(this.clientSecret?.value); req.setIssuer(this.issuer?.value); - req.setLogoSrc(this.logoSrc?.value); req.setScopesList(this.scopesList?.value); req.setIdpDisplayNameMapping(this.idpDisplayNameMapping?.value); req.setUsernameMapping(this.usernameMapping?.value); - + this.loading = true; this.service.CreateOidcIdp(req).then((idp) => { - this.router.navigate(['idp', idp.getId()]); + setTimeout(() => { + this.loading = false; + this.router.navigate([ + this.serviceType === PolicyComponentServiceType.MGMT ? 'org' : + this.serviceType === PolicyComponentServiceType.ADMIN ? 'iam' : '', + 'idp', idp.getId()]); + }, 2000); }).catch(error => { this.toast.showError(error); }); @@ -147,10 +151,6 @@ export class IdpCreateComponent implements OnInit, OnDestroy { return this.formGroup.get('name'); } - public get logoSrc(): AbstractControl | null { - return this.formGroup.get('logoSrc'); - } - public get clientId(): AbstractControl | null { return this.formGroup.get('clientId'); } @@ -163,7 +163,7 @@ export class IdpCreateComponent implements OnInit, OnDestroy { return this.formGroup.get('issuer'); } public get scopesList(): AbstractControl | null { - return this.formGroup.get('scopesList'); + return this.formGroup.get('scopesList'); } public get idpDisplayNameMapping(): AbstractControl | null { @@ -171,7 +171,7 @@ export class IdpCreateComponent implements OnInit, OnDestroy { } public get usernameMapping(): AbstractControl | null { - return this.formGroup.get('usernameMapping'); + return this.formGroup.get('usernameMapping'); } } diff --git a/console/src/app/modules/idp-create/idp-create.module.ts b/console/src/app/modules/idp-create/idp-create.module.ts index c952ec4741..43028c9be6 100644 --- a/console/src/app/modules/idp-create/idp-create.module.ts +++ b/console/src/app/modules/idp-create/idp-create.module.ts @@ -6,12 +6,13 @@ import { MatChipsModule } from '@angular/material/chips'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSelectModule } from '@angular/material/select'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { IdpCreateRoutingModule } from './idp-create-routing.module'; import { IdpCreateComponent } from './idp-create.component'; -import {MatSelectModule} from '@angular/material/select'; @NgModule({ declarations: [IdpCreateComponent], @@ -28,6 +29,7 @@ import {MatSelectModule} from '@angular/material/select'; MatChipsModule, MatTooltipModule, TranslateModule, + MatProgressBarModule, ], }) export class IdpCreateModule { } diff --git a/console/src/app/modules/idp-table/idp-table.component.html b/console/src/app/modules/idp-table/idp-table.component.html index f579dba7ec..510c8f4522 100644 --- a/console/src/app/modules/idp-table/idp-table.component.html +++ b/console/src/app/modules/idp-table/idp-table.component.html @@ -1,19 +1,19 @@ + [emitRefreshOnPreviousRoutes]="['/iam/idp/create']" [timestamp]="idpResult?.viewTimestamp" [selection]="selection"> - + add{{ 'ACTIONS.NEW' | translate }} @@ -24,14 +24,14 @@ + [indeterminate]="selection.hasValue() && !isAllSelected()" + [disabled]="serviceType==PolicyComponentServiceType.MGMT"> - ipp logo {{idp?.name}}
{{idp.name.charAt(0)}} @@ -43,12 +43,12 @@ {{ 'IDP.NAME' | translate }} - {{idp?.name}} + {{idp?.name}} {{ 'IDP.CONFIG' | translate }} - +
{{elem.key}}: {{elem.value}} @@ -58,28 +58,47 @@ {{ 'IDP.STATE' | translate }} - {{ 'IDP.STATES.'+idp.state | translate }} + + {{ 'IDP.STATES.'+idp.state | translate }} {{ 'IDP.CREATIONDATE' | translate }} - + {{idp.creationDate | timestampToDate | localizedDate: 'dd. MMM, HH:mm' }} {{ 'IDP.CHANGEDATE' | translate }} - + {{idp.changeDate | timestampToDate | localizedDate: 'dd. MMM, HH:mm' }} - - - + + {{ 'IDP.TYPE' | translate }} + + {{'IDP.TYPES.'+idp.providerType | translate }} + + + + + + + + + + + -
+ \ No newline at end of file diff --git a/console/src/app/modules/idp-table/idp-table.component.scss b/console/src/app/modules/idp-table/idp-table.component.scss index c3bf36ea61..4c7626bcc0 100644 --- a/console/src/app/modules/idp-table/idp-table.component.scss +++ b/console/src/app/modules/idp-table/idp-table.component.scss @@ -1,11 +1,10 @@ .table-wrapper { overflow: auto; + width: 100%; .table, .paginator { - width: 100%; - td, th { padding: 0 1rem; @@ -19,23 +18,29 @@ padding-right: 0; } } - - .data-row { - cursor: pointer; - - &:hover { - background-color: #ffffff05; - } - } } } +td { + outline: none; +} + tr { outline: none; -} -.add-button { - border-radius: .5rem; + &.disabled * { + opacity: .8; + } + + button { + visibility: hidden; + } + + &:hover { + button { + visibility: visible; + } + } } .avatar { @@ -57,14 +62,22 @@ tr { .flex-row { display: flex; justify-content: space-between; + padding: 2px 0; + width: 250px; .key { - margin-right: 1rem; - font-size: 14px; + margin-right: .5rem; + font-size: 12px; + flex: 1 0 50%; + overflow: hidden; + text-overflow: ellipsis; } .value { - font-size: 14px; + font-size: 12px; + flex: 1 0 50%; + overflow: hidden; + text-overflow: ellipsis; } &:first-child { diff --git a/console/src/app/modules/idp-table/idp-table.component.ts b/console/src/app/modules/idp-table/idp-table.component.ts index 2ba42419fa..d75f49b8b2 100644 --- a/console/src/app/modules/idp-table/idp-table.component.ts +++ b/console/src/app/modules/idp-table/idp-table.component.ts @@ -1,17 +1,19 @@ import { SelectionModel } from '@angular/cdk/collections'; import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; import { RouterLink } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { IdpSearchResponse as AdminIdpSearchResponse, IdpView as AdminIdpView } from 'src/app/proto/generated/admin_pb'; -import { IdpView as MgmtIdpView } from 'src/app/proto/generated/management_pb'; +import { IdpProviderType, IdpView as MgmtIdpView } from 'src/app/proto/generated/management_pb'; import { AdminService } from 'src/app/services/admin.service'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; import { PolicyComponentServiceType } from '../policies/policy-component-types.enum'; +import { WarnDialogComponent } from '../warn-dialog/warn-dialog.component'; @Component({ selector: 'app-idp-table', @@ -31,12 +33,13 @@ export class IdpTableComponent implements OnInit { private loadingSubject: BehaviorSubject = new BehaviorSubject(false); public loading$: Observable = this.loadingSubject.asObservable(); public PolicyComponentServiceType: any = PolicyComponentServiceType; + public IdpProviderType: any = IdpProviderType; @Input() public displayedColumns: string[] = ['select', 'name', 'config', 'creationDate', 'changeDate', 'state']; @Output() public changedSelection: EventEmitter> = new EventEmitter(); - constructor(public translate: TranslateService, private toast: ToastService) { + constructor(public translate: TranslateService, private toast: ToastService, private dialog: MatDialog) { this.selection.changed.subscribe(() => { this.changedSelection.emit(this.selection.selected); }); @@ -44,6 +47,13 @@ export class IdpTableComponent implements OnInit { ngOnInit(): void { this.getData(10, 0); + if (this.serviceType === PolicyComponentServiceType.MGMT) { + this.displayedColumns = ['select', 'name', 'config', 'creationDate', 'changeDate', 'state', 'type']; + } + + if (!this.disabled) { + this.displayedColumns.push('actions'); + } } public isAllSelected(): boolean { @@ -64,47 +74,79 @@ export class IdpTableComponent implements OnInit { } public deactivateSelectedIdps(): void { + this.selection.clear(); Promise.all(this.selection.selected.map(value => { return this.service.DeactivateIdpConfig(value.id); })).then(() => { - this.toast.showInfo('USER.TOAST.SELECTEDDEACTIVATED', true); - this.getData(10, 0); + this.toast.showInfo('IDP.TOAST.SELECTEDDEACTIVATED', true); + this.refreshPage(); }); } public reactivateSelectedIdps(): void { + this.selection.clear(); Promise.all(this.selection.selected.map(value => { return this.service.ReactivateIdpConfig(value.id); })).then(() => { - this.toast.showInfo('USER.TOAST.SELECTEDREACTIVATED', true); - this.getData(10, 0); + this.toast.showInfo('IDP.TOAST.SELECTEDREACTIVATED', true); + this.refreshPage(); }); } public removeSelectedIdps(): void { - Promise.all(this.selection.selected.map(value => { - return this.service.RemoveIdpConfig(value.id); - })).then(() => { - this.toast.showInfo('USER.TOAST.SELECTEDDEACTIVATED', true); - this.getData(10, 0); + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.DELETE', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'IDP.DELETE_SELECTION_TITLE', + descriptionKey: 'IDP.DELETE_SELECTION_DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (resp) { + this.selection.clear(); + + Promise.all(this.selection.selected.map(value => { + return this.service.RemoveIdpConfig(value.id); + })).then(() => { + this.toast.showInfo('IDP.TOAST.SELECTEDDEACTIVATED', true); + this.refreshPage(); + }); + } + }); + } + + public removeIdp(idp: AdminIdpView.AsObject | MgmtIdpView.AsObject): void { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.DELETE', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'IDP.DELETE_TITLE', + descriptionKey: 'IDP.DELETE_DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (resp) { + this.service.RemoveIdpConfig(idp.id).then(() => { + this.toast.showInfo('IDP.TOAST.REMOVED', true); + setTimeout(() => { + this.refreshPage(); + }, 1000); + }); + } }); } private async getData(limit: number, offset: number): Promise { this.loadingSubject.next(true); - // let query: AdminIdpSearchQuery | MgmtIdpSearchQuery; - // if (this.service instanceof AdminService) { - // query = new AdminIdpSearchQuery(); - // query.setKey(AdminIdpSearchKey.) - // } else if (this.service instanceof ManagementService) { - // return ['/org', 'idp', 'create']; - // } - this.service.SearchIdps(limit, offset).then(resp => { this.idpResult = resp.toObject(); this.dataSource.data = this.idpResult.resultList; - console.log(this.idpResult.resultList); this.loadingSubject.next(false); }).catch(error => { this.toast.showError(error); @@ -123,4 +165,21 @@ export class IdpTableComponent implements OnInit { return ['/org', 'idp', 'create']; } } + + public routerLinkForRow(row: MgmtIdpView.AsObject | AdminIdpView.AsObject): any { + if (row.id) { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + switch ((row as MgmtIdpView.AsObject).providerType) { + case IdpProviderType.IDPPROVIDERTYPE_SYSTEM: + return ['/iam', 'idp', row.id]; + case IdpProviderType.IDPPROVIDERTYPE_ORG: + return ['/org', 'idp', row.id]; + } + break; + case PolicyComponentServiceType.ADMIN: + return ['/iam', 'idp', row.id]; + } + } + } } diff --git a/console/src/app/modules/idp-table/idp-table.module.ts b/console/src/app/modules/idp-table/idp-table.module.ts index 2d0ba9d25d..a7002dbf21 100644 --- a/console/src/app/modules/idp-table/idp-table.module.ts +++ b/console/src/app/modules/idp-table/idp-table.module.ts @@ -11,8 +11,9 @@ import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; +import { TruncatePipeModule } from 'src/app/pipes/truncate-pipe/truncate-pipe.module'; import { IdpTableComponent } from './idp-table.component'; @@ -34,6 +35,7 @@ import { IdpTableComponent } from './idp-table.component'; RouterModule, RefreshTableModule, HasRoleModule, + TruncatePipeModule, ], exports: [ IdpTableComponent, diff --git a/console/src/app/modules/idp/idp.component.html b/console/src/app/modules/idp/idp.component.html index f9a94e0697..987cd1b9e0 100644 --- a/console/src/app/modules/idp/idp.component.html +++ b/console/src/app/modules/idp/idp.component.html @@ -1,91 +1,99 @@ -
-
- -
- - {{ 'IDP.ID' | translate }} - - - - {{ 'IDP.NAME' | translate }} - - - + [description]="'IDP.DETAIL.DESCRIPTION' | translate"> +
+ + +
+ + {{ 'IDP.ID' | translate }} + + + + {{ 'IDP.NAME' | translate }} + + + + {{ 'IDP.STYLE' | translate }} + + + {{ 'IDP.STYLEFIELD.'+field | translate }} + + + +
+
+ +
+
+ + + +

{{'IDP.DETAIL.OIDC.TITLE' | translate}}

+

{{'IDP.DETAIL.OIDC.DESCRIPTION' | translate}}

+ +
+ +
+ + {{ 'IDP.ISSUER' | translate }} + + + + {{ 'IDP.CLIENTID' | translate }} + + + + Update Client Secret + + + {{ 'IDP.CLIENTSECRET' | translate }} + + + + {{ 'IDP.SCOPESLIST' | translate }} + + + {{scope}} cancel + + + + + + + {{ 'IDP.IDPDISPLAYNAMMAPPING' | translate }} + + + {{ 'IDP.MAPPINGFIELD.'+field | translate }} + + + + + {{ 'IDP.USERNAMEMAPPING' | translate }} + + + {{ 'IDP.MAPPINGFIELD.'+field | translate }} + + + +
+
+ +
+ +
+
+
- - - -

{{'IDP.DETAIL.OIDC.TITLE' | translate}}

- -
- -
- - {{ 'IDP.ISSUER' | translate }} - - -
-
- - {{ 'IDP.CLIENTID' | translate }} - - -
-
- - Update Client Secret - - - {{ 'IDP.CLIENTSECRET' | translate }} - - -
-
- - {{ 'IDP.SCOPESLIST' | translate }} - - - {{scope}} cancel - - - - -
-
- - {{ 'IDP.IDPDISPLAYNAMMAPPING' | translate }} - - - {{ 'IDP.MAPPINTFIELD.'+field | translate }} - - - - - {{ 'IDP.USERNAMEMAPPING' | translate }} - - - {{ 'IDP.MAPPINTFIELD.'+field | translate }} - - - -
-
- - -
-
- - + \ No newline at end of file diff --git a/console/src/app/modules/idp/idp.component.scss b/console/src/app/modules/idp/idp.component.scss index 642e7535c2..f176cdc6d2 100644 --- a/console/src/app/modules/idp/idp.component.scss +++ b/console/src/app/modules/idp/idp.component.scss @@ -9,6 +9,7 @@ .content { display: flex; + flex-direction: row; margin: 0 -.5rem; flex-wrap: wrap; @@ -16,27 +17,35 @@ flex-basis: 100%; margin: 0 .5rem; margin-bottom: 1rem; - color: #8795a1; + color: var(--grey); } .formfield { - flex: 1 0 auto; + flex: 1 1 auto; margin: 0 .5rem; + &.fullwidth { + flex-basis: 100%; + } + @media only screen and (max-width: 450px) { flex-basis: 100%; } } } -.continue-button { - margin-bottom: 4rem; - display: block; - padding: .5rem 4rem; - border-radius: .5rem; +.btn-wrapper { + display: flex; + justify-content: flex-end; - @media only screen and (max-width: 450px) { - margin-top: 1rem; - margin-bottom: 2rem; + .continue-button { + margin-bottom: 4rem; + display: block; + padding: .5rem 4rem; + + @media only screen and (max-width: 450px) { + margin-top: 1rem; + margin-bottom: 2rem; + } } } diff --git a/console/src/app/modules/idp/idp.component.ts b/console/src/app/modules/idp/idp.component.ts index 5921896f9a..64d550ebe7 100644 --- a/console/src/app/modules/idp/idp.component.ts +++ b/console/src/app/modules/idp/idp.component.ts @@ -1,20 +1,22 @@ import { COMMA, ENTER, SPACE } from '@angular/cdk/keycodes'; import { Location } from '@angular/common'; -import {Component, Injector, Input, OnDestroy, OnInit, Type} from '@angular/core'; +import { Component, Injector, OnDestroy, OnInit, Type } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms'; import { MatChipInputEvent } from '@angular/material/chips'; import { ActivatedRoute, Params } from '@angular/router'; import { Subscription } from 'rxjs'; import { switchMap, take } from 'rxjs/operators'; import { - OIDCMappingField as authMappingFields, - OidcIdpConfigUpdate as AdminOidcIdpConfigUpdate, - IdpUpdate as AdminIdpConfigUpdate, + IdpStylingType as adminIdpStylingType, + IdpUpdate as AdminIdpConfigUpdate, + OidcIdpConfigUpdate as AdminOidcIdpConfigUpdate, + OIDCMappingField as adminMappingFields, } from 'src/app/proto/generated/admin_pb'; import { - OIDCMappingField as mgmtMappingFields, - OidcIdpConfigUpdate as MgmtOidcIdpConfigUpdate, - IdpUpdate as MgmtIdpConfigUpdate, + IdpStylingType as mgmtIdpStylingType, + IdpUpdate as MgmtIdpConfigUpdate, + OidcIdpConfigUpdate as MgmtOidcIdpConfigUpdate, + OIDCMappingField as mgmtMappingFields, } from 'src/app/proto/generated/management_pb'; import { AdminService } from 'src/app/services/admin.service'; import { ManagementService } from 'src/app/services/mgmt.service'; @@ -28,7 +30,9 @@ import { PolicyComponentServiceType } from '../policies/policy-component-types.e styleUrls: ['./idp.component.scss'], }) export class IdpComponent implements OnInit, OnDestroy { - public mappingFields: mgmtMappingFields[] | authMappingFields[] = []; + public mappingFields: mgmtMappingFields[] | adminMappingFields[] = []; + public styleFields: mgmtIdpStylingType[] | adminIdpStylingType[] = []; + public showIdSecretSection: boolean = false; public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT; private service!: ManagementService | AdminService; @@ -41,7 +45,6 @@ export class IdpComponent implements OnInit, OnDestroy { public oidcConfigForm!: FormGroup; constructor( - // private router: Router, private toast: ToastService, private injector: Injector, private route: ActivatedRoute, @@ -50,33 +53,38 @@ export class IdpComponent implements OnInit, OnDestroy { this.idpForm = new FormGroup({ id: new FormControl({ disabled: true, value: '' }, [Validators.required]), name: new FormControl('', [Validators.required]), - logoSrc: new FormControl({ disabled: true, value: '' }, [Validators.required]), + stylingType: new FormControl('', [Validators.required]), }); this.oidcConfigForm = new FormGroup({ - clientId: new FormControl('', [Validators.required]), - clientSecret: new FormControl(''), - issuer: new FormControl('', [Validators.required]), - scopesList: new FormControl([], []), - idpDisplayNameMapping: new FormControl(0), - usernameMapping: new FormControl(0), + clientId: new FormControl('', [Validators.required]), + clientSecret: new FormControl(''), + issuer: new FormControl('', [Validators.required]), + scopesList: new FormControl([], []), + idpDisplayNameMapping: new FormControl(0), + usernameMapping: new FormControl(0), }); this.route.data.pipe(switchMap(data => { - console.log(data.serviceType); this.serviceType = data.serviceType; switch (this.serviceType) { case PolicyComponentServiceType.MGMT: this.service = this.injector.get(ManagementService as Type); this.mappingFields = [ - mgmtMappingFields.OIDCMAPPINGFIELD_PREFERRED_USERNAME, - mgmtMappingFields.OIDCMAPPINGFIELD_EMAIL]; + mgmtMappingFields.OIDCMAPPINGFIELD_PREFERRED_USERNAME, + mgmtMappingFields.OIDCMAPPINGFIELD_EMAIL]; + this.styleFields = [ + mgmtIdpStylingType.IDPSTYLINGTYPE_UNSPECIFIED, + mgmtIdpStylingType.IDPSTYLINGTYPE_GOOGLE]; break; case PolicyComponentServiceType.ADMIN: this.service = this.injector.get(AdminService as Type); this.mappingFields = [ - authMappingFields.OIDCMAPPINGFIELD_PREFERRED_USERNAME, - authMappingFields.OIDCMAPPINGFIELD_EMAIL]; + adminMappingFields.OIDCMAPPINGFIELD_PREFERRED_USERNAME, + adminMappingFields.OIDCMAPPINGFIELD_EMAIL]; + this.styleFields = [ + adminIdpStylingType.IDPSTYLINGTYPE_UNSPECIFIED, + adminIdpStylingType.IDPSTYLINGTYPE_GOOGLE]; break; } @@ -85,11 +93,11 @@ export class IdpComponent implements OnInit, OnDestroy { const { id } = params; if (id) { this.service.IdpByID(id).then(idp => { - const idpObject = idp.toObject(); - this.idpForm.patchValue(idpObject); - if (idpObject.oidcConfig) { - this.oidcConfigForm.patchValue(idpObject.oidcConfig); - } + const idpObject = idp.toObject(); + this.idpForm.patchValue(idpObject); + if (idpObject.oidcConfig) { + this.oidcConfigForm.patchValue(idpObject.oidcConfig); + } }); } }); @@ -121,10 +129,10 @@ export class IdpComponent implements OnInit, OnDestroy { req.setId(this.id?.value); req.setName(this.name?.value); - req.setLogoSrc(this.logoSrc?.value); + req.setStylingType(this.stylingType?.value); this.service.UpdateIdp(req).then((idp) => { - this.toast.showInfo('IDP.TOAST.SAVED', true); + this.toast.showInfo('IDP.TOAST.SAVED', true); // this.router.navigate(['idp', ]); }).catch(error => { this.toast.showError(error); @@ -132,31 +140,31 @@ export class IdpComponent implements OnInit, OnDestroy { } public updateOidcConfig(): void { - let req: AdminOidcIdpConfigUpdate | MgmtOidcIdpConfigUpdate; + let req: AdminOidcIdpConfigUpdate | MgmtOidcIdpConfigUpdate; - switch (this.serviceType) { - case PolicyComponentServiceType.MGMT: - req = new MgmtOidcIdpConfigUpdate(); - break; - case PolicyComponentServiceType.ADMIN: - req = new AdminOidcIdpConfigUpdate(); - break; - } + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + req = new MgmtOidcIdpConfigUpdate(); + break; + case PolicyComponentServiceType.ADMIN: + req = new AdminOidcIdpConfigUpdate(); + break; + } - req.setIdpId(this.id?.value); - req.setClientId(this.clientId?.value); - req.setClientSecret(this.clientSecret?.value); - req.setIssuer(this.issuer?.value); - req.setScopesList(this.scopesList?.value); - req.setUsernameMapping(this.usernameMapping?.value); - req.setIdpDisplayNameMapping(this.idpDisplayNameMapping?.value); + req.setIdpId(this.id?.value); + req.setClientId(this.clientId?.value); + req.setClientSecret(this.clientSecret?.value); + req.setIssuer(this.issuer?.value); + req.setScopesList(this.scopesList?.value); + req.setUsernameMapping(this.usernameMapping?.value); + req.setIdpDisplayNameMapping(this.idpDisplayNameMapping?.value); - this.service.UpdateOidcIdpConfig(req).then((oidcConfig) => { - this.toast.showInfo('IDP.TOAST.SAVED', true); - // this.router.navigate(['idp', ]); - }).catch(error => { - this.toast.showError(error); - }); + this.service.UpdateOidcIdpConfig(req).then((oidcConfig) => { + this.toast.showInfo('IDP.TOAST.SAVED', true); + // this.router.navigate(['idp', ]); + }).catch(error => { + this.toast.showError(error); + }); } public close(): void { @@ -190,12 +198,10 @@ export class IdpComponent implements OnInit, OnDestroy { public get backroutes(): string[] { switch (this.serviceType) { case PolicyComponentServiceType.MGMT: - return ['/org', 'policy', 'login']; + return ['/org', 'policy', 'login']; case PolicyComponentServiceType.ADMIN: - return ['/iam', 'policy', 'login']; - break; + return ['/iam', 'policy', 'login']; } - return []; } public get id(): AbstractControl | null { @@ -206,8 +212,8 @@ export class IdpComponent implements OnInit, OnDestroy { return this.idpForm.get('name'); } - public get logoSrc(): AbstractControl | null { - return this.idpForm.get('logoSrc'); + public get stylingType(): AbstractControl | null { + return this.idpForm.get('stylingType'); } public get clientId(): AbstractControl | null { @@ -227,10 +233,10 @@ export class IdpComponent implements OnInit, OnDestroy { } public get idpDisplayNameMapping(): AbstractControl | null { - return this.oidcConfigForm.get('idpDisplayNameMapping'); + return this.oidcConfigForm.get('idpDisplayNameMapping'); } public get usernameMapping(): AbstractControl | null { - return this.oidcConfigForm.get('usernameMapping'); + return this.oidcConfigForm.get('usernameMapping'); } } diff --git a/console/src/app/modules/members-table/members-table.component.html b/console/src/app/modules/members-table/members-table.component.html new file mode 100644 index 0000000000..cd85a13f20 --- /dev/null +++ b/console/src/app/modules/members-table/members-table.component.html @@ -0,0 +1,98 @@ + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+
+
+
{{ 'PROJECT.MEMBER.USERID' | translate }} + {{member.userId}} {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} + {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} + {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} + {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} + {{member.email}} + + + {{ 'ROLESLABEL' | translate }} + + {{ 'ROLESLABEL' | translate }} + + + {{ role }} + + + +
+
+ + +
\ No newline at end of file diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.scss b/console/src/app/modules/members-table/members-table.component.scss similarity index 58% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.scss rename to console/src/app/modules/members-table/members-table.component.scss index b9ea8393fd..91ac8176b6 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.scss +++ b/console/src/app/modules/members-table/members-table.component.scss @@ -1,9 +1,14 @@ +.icon-button { + margin-right: .5rem; +} .table-wrapper { - overflow: auto; + overflow-x: auto; .table, .paginator { + width: 100%; + td, th { padding: .5rem; @@ -22,20 +27,31 @@ width: 40px; } - .data-row { - &:hover { - background-color: #ffffff05; - } - } - .selection { width: 50px; max-width: 50px; } + } - .role { - display: inline-block; - margin: .25rem; + tr { + button { + visibility: hidden; + } + + &:hover { + button { + visibility: visible; + } + } + } + + .sa-icon { + display: block; + width: 32px; + margin: 0 .5rem; + + i { + margin: auto; } } } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.spec.ts b/console/src/app/modules/members-table/members-table.component.spec.ts similarity index 68% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.spec.ts rename to console/src/app/modules/members-table/members-table.component.spec.ts index ebe06195e3..7c2daf9de5 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.spec.ts +++ b/console/src/app/modules/members-table/members-table.component.spec.ts @@ -4,15 +4,15 @@ import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ProjectGrantMembersComponent } from './project-grant-members.component'; +import { MembersTableComponent } from './members-table.component'; -describe('ProjectMembersComponent', () => { - let component: ProjectGrantMembersComponent; - let fixture: ComponentFixture; +describe('MembersTableComponent', () => { + let component: MembersTableComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ProjectGrantMembersComponent], + declarations: [MembersTableComponent], imports: [ NoopAnimationsModule, MatPaginatorModule, @@ -23,7 +23,7 @@ describe('ProjectMembersComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(ProjectGrantMembersComponent); + fixture = TestBed.createComponent(MembersTableComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/console/src/app/modules/members-table/members-table.component.ts b/console/src/app/modules/members-table/members-table.component.ts new file mode 100644 index 0000000000..1e70dd3a0f --- /dev/null +++ b/console/src/app/modules/members-table/members-table.component.ts @@ -0,0 +1,83 @@ +import { SelectionModel } from '@angular/cdk/collections'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; +import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { MatSelectChange } from '@angular/material/select'; +import { MatTable } from '@angular/material/table'; +import { Observable, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { IamMembersDataSource } from 'src/app/pages/iam/iam-members/iam-members-datasource'; +import { OrgMembersDataSource } from 'src/app/pages/orgs/org-members/org-members-datasource'; +import { IamMemberView } from 'src/app/proto/generated/admin_pb'; +import { OrgMemberView, ProjectMemberView } from 'src/app/proto/generated/management_pb'; + +import { ProjectMembersDataSource } from '../project-members/project-members-datasource'; + +type View = OrgMemberView.AsObject | ProjectMemberView.AsObject | IamMemberView.AsObject; +type MemberDatasource = OrgMembersDataSource | ProjectMembersDataSource | IamMembersDataSource; + +@Component({ + selector: 'app-members-table', + templateUrl: './members-table.component.html', + styleUrls: ['./members-table.component.scss'], +}) +export class MembersTableComponent implements OnInit, OnDestroy { + public INITIALPAGESIZE: number = 25; + @Input() public canDelete: boolean = false; + @Input() public canWrite: boolean = false; + @ViewChild(MatPaginator) public paginator!: MatPaginator; + @ViewChild(MatTable) public table!: MatTable; + @Input() public dataSource!: MemberDatasource; + public selection: SelectionModel = new SelectionModel(true, []); + @Input() public memberRoleOptions: string[] = []; + @Input() public factoryLoadFunc!: Function; + @Input() public refreshTrigger!: Observable; + @Output() public updateRoles: EventEmitter<{ member: View, change: MatSelectChange; }> = new EventEmitter(); + @Output() public changedSelection: EventEmitter = new EventEmitter(); + @Output() public deleteMember: EventEmitter = new EventEmitter(); + + private destroyed: Subject = new Subject(); + + /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ + public displayedColumns: string[] = ['select', 'userId', 'firstname', 'lastname', 'username', 'email', 'roles']; + + constructor() { + this.selection.changed.pipe(takeUntil(this.destroyed)).subscribe(_ => { + this.changedSelection.emit(this.selection.selected); + }); + } + + public ngOnInit(): void { + this.refreshTrigger.pipe(takeUntil(this.destroyed)).subscribe(() => { + this.changePage(this.paginator); + }); + + if (this.canDelete) { + this.displayedColumns.push('actions'); + } + } + + public ngOnDestroy(): void { + this.destroyed.next(); + } + + public isAllSelected(): boolean { + const numSelected = this.selection.selected.length; + const numRows = this.dataSource.membersSubject.value.length; + return numSelected === numRows; + } + + public masterToggle(): void { + this.isAllSelected() ? + this.selection.clear() : + this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); + } + + public changePage(event?: PageEvent | MatPaginator): any { + this.selection.clear(); + return this.factoryLoadFunc(event ?? this.paginator); + } + + public triggerDeleteMember(member: any): void { + this.deleteMember.emit(member); + } +} diff --git a/console/src/app/modules/members-table/members-table.module.ts b/console/src/app/modules/members-table/members-table.module.ts new file mode 100644 index 0000000000..8af969284d --- /dev/null +++ b/console/src/app/modules/members-table/members-table.module.ts @@ -0,0 +1,45 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { RouterModule } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { AvatarModule } from '../avatar/avatar.module'; +import { RefreshTableModule } from '../refresh-table/refresh-table.module'; +import { MembersTableComponent } from './members-table.component'; + +@NgModule({ + declarations: [ + MembersTableComponent, + ], + imports: [ + CommonModule, + MatFormFieldModule, + MatSelectModule, + MatCheckboxModule, + MatIconModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatTooltipModule, + FormsModule, + TranslateModule, + RefreshTableModule, + RouterModule, + AvatarModule, + MatButtonModule, + ], + exports: [ + MembersTableComponent, + ], +}) +export class MembersTableModule { } diff --git a/console/src/app/modules/meta-layout/meta-layout.component.scss b/console/src/app/modules/meta-layout/meta-layout.component.scss index f485742e46..261731a654 100644 --- a/console/src/app/modules/meta-layout/meta-layout.component.scss +++ b/console/src/app/modules/meta-layout/meta-layout.component.scss @@ -2,7 +2,7 @@ display: flex; height: 100%; overflow-x: hidden; - transition: all .2s ease-in-out; + transition: all .3s cubic-bezier(.645, .045, .355, 1); .main-content { display: relative; diff --git a/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss b/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss index e8cafc26a5..e72abd1180 100644 --- a/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss +++ b/console/src/app/modules/password-complexity-view/password-complexity-view.component.scss @@ -1,6 +1,7 @@ .validation-col { - display: flex wrap; + display: flex; + flex-wrap: wrap; padding: 1rem 0; width: 100%; @@ -16,7 +17,7 @@ span { font-size: 14px; - color: #8795a1; + color: var(--grey); } .sp-wrapper { diff --git a/console/src/app/modules/policies/label-policy/label-policy-routing.module.ts b/console/src/app/modules/policies/label-policy/label-policy-routing.module.ts new file mode 100644 index 0000000000..457099b895 --- /dev/null +++ b/console/src/app/modules/policies/label-policy/label-policy-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { LabelPolicyComponent } from './label-policy.component'; + +const routes: Routes = [ + { + path: '', + component: LabelPolicyComponent, + data: { + animation: 'DetailPage', + }, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class LabelPolicyRoutingModule { } diff --git a/console/src/app/modules/policies/label-policy/label-policy.component.html b/console/src/app/modules/policies/label-policy/label-policy.component.html new file mode 100644 index 0000000000..5e5a9bb257 --- /dev/null +++ b/console/src/app/modules/policies/label-policy/label-policy.component.html @@ -0,0 +1,20 @@ + + +
+ + {{'POLICY.LABEL.PRIMARYCOLOR' | translate}} + + + + + {{'POLICY.LABEL.SECONDARYCOLOR' | translate}} + + +
+ +
+ +
+
\ No newline at end of file diff --git a/console/src/app/modules/policies/label-policy/label-policy.component.scss b/console/src/app/modules/policies/label-policy/label-policy.component.scss new file mode 100644 index 0000000000..92da6b0de7 --- /dev/null +++ b/console/src/app/modules/policies/label-policy/label-policy.component.scss @@ -0,0 +1,24 @@ +.content { + padding-top: 1rem; + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 0 -.5rem; + + .form-field { + flex: 1; + margin: 0 .5rem; + } +} + +.btn-container { + display: flex; + justify-content: flex-end; + width: 100%; + + button { + margin-top: 3rem; + display: block; + padding: .5rem 4rem; + } +} diff --git a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.spec.ts b/console/src/app/modules/policies/label-policy/label-policy.component.spec.ts similarity index 54% rename from console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.spec.ts rename to console/src/app/modules/policies/label-policy/label-policy.component.spec.ts index c174486a81..d93217a85a 100644 --- a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.spec.ts +++ b/console/src/app/modules/policies/label-policy/label-policy.component.spec.ts @@ -1,20 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { IamPolicyGridComponent } from './iam-policy-grid.component'; +import { LabelPolicyComponent } from './label-policy.component'; -describe('IamPolicyGridComponent', () => { - let component: IamPolicyGridComponent; - let fixture: ComponentFixture; +describe('LabelPolicyComponent', () => { + let component: LabelPolicyComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [IamPolicyGridComponent], + declarations: [LabelPolicyComponent], }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(IamPolicyGridComponent); + fixture = TestBed.createComponent(LabelPolicyComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/console/src/app/modules/policies/label-policy/label-policy.component.ts b/console/src/app/modules/policies/label-policy/label-policy.component.ts new file mode 100644 index 0000000000..f5852a429d --- /dev/null +++ b/console/src/app/modules/policies/label-policy/label-policy.component.ts @@ -0,0 +1,54 @@ +import { Component, OnDestroy } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { DefaultLabelPolicyUpdate, DefaultLabelPolicyView } from 'src/app/proto/generated/admin_pb'; +import { AdminService } from 'src/app/services/admin.service'; +import { ToastService } from 'src/app/services/toast.service'; + +import { PolicyComponentServiceType } from '../policy-component-types.enum'; + + +@Component({ + selector: 'app-label-policy', + templateUrl: './label-policy.component.html', + styleUrls: ['./label-policy.component.scss'], +}) +export class LabelPolicyComponent implements OnDestroy { + public labelData!: DefaultLabelPolicyView.AsObject; + + private sub: Subscription = new Subscription(); + + public PolicyComponentServiceType: any = PolicyComponentServiceType; + constructor( + private route: ActivatedRoute, + private toast: ToastService, + private adminService: AdminService, + ) { + this.route.params.subscribe(() => { + this.getData().then(data => { + if (data) { + this.labelData = data.toObject(); + } + }); + }); + } + + public ngOnDestroy(): void { + this.sub.unsubscribe(); + } + + private async getData(): Promise { + return this.adminService.GetDefaultLabelPolicy(); + } + + public savePolicy(): void { + const req = new DefaultLabelPolicyUpdate(); + req.setPrimaryColor(this.labelData.primaryColor); + req.setSecondaryColor(this.labelData.secondaryColor); + this.adminService.UpdateDefaultLabelPolicy(req).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + } +} diff --git a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.module.ts b/console/src/app/modules/policies/label-policy/label-policy.module.ts similarity index 78% rename from console/src/app/modules/policies/password-iam-policy/password-iam-policy.module.ts rename to console/src/app/modules/policies/label-policy/label-policy.module.ts index 1bf5b378e9..173b7ff6fe 100644 --- a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.module.ts +++ b/console/src/app/modules/policies/label-policy/label-policy.module.ts @@ -11,13 +11,13 @@ import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; -import { PasswordIamPolicyRoutingModule } from './password-iam-policy-routing.module'; -import { PasswordIamPolicyComponent } from './password-iam-policy.component'; +import { LabelPolicyRoutingModule } from './label-policy-routing.module'; +import { LabelPolicyComponent } from './label-policy.component'; @NgModule({ - declarations: [PasswordIamPolicyComponent], + declarations: [LabelPolicyComponent], imports: [ - PasswordIamPolicyRoutingModule, + LabelPolicyRoutingModule, CommonModule, FormsModule, MatInputModule, @@ -31,4 +31,4 @@ import { PasswordIamPolicyComponent } from './password-iam-policy.component'; DetailLayoutModule, ], }) -export class PasswordIamPolicyModule { } +export class LabelPolicyModule { } diff --git a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.html b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.html index 719b94e646..0e500ef85b 100644 --- a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.html +++ b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.html @@ -6,7 +6,7 @@
{{ 'IDP.TYPE' | translate }} - + {{ 'IDP.TYPES.'+type | translate}} diff --git a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss index deaa9f79e8..90e113d36a 100644 --- a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss +++ b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.scss @@ -3,7 +3,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -18,8 +18,4 @@ .ok-button { margin-left: .5rem; } - - button { - border-radius: .5rem; - } } diff --git a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.ts b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.ts index 107a69d908..c0dafc96a1 100644 --- a/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.ts +++ b/console/src/app/modules/policies/login-policy/add-idp-dialog/add-idp-dialog.component.ts @@ -61,7 +61,9 @@ export class AddIdpDialogComponent { query.setKey(IdpSearchKey.IDPSEARCHKEY_PROVIDER_TYPE); query.setMethod(SearchMethod.SEARCHMETHOD_EQUALS); query.setValue(this.idpType.toString()); - this.mgmtService.SearchIdps().then(idps => { + console.log(this.idpType); + console.log(query.toObject()); + this.mgmtService.SearchIdps(undefined, undefined, [query]).then(idps => { this.availableIdps = idps.toObject().resultList; }); } else if (this.serviceType === PolicyComponentServiceType.ADMIN) { diff --git a/console/src/app/modules/policies/login-policy/login-policy.component.html b/console/src/app/modules/policies/login-policy/login-policy.component.html index bbea94cdda..bd789dd9c7 100644 --- a/console/src/app/modules/policies/login-policy/login-policy.component.html +++ b/console/src/app/modules/policies/login-policy/login-policy.component.html @@ -1,60 +1,76 @@ - - - + +

{{'POLICY.DEFAULTLABEL' | translate}}

+ +
+ +
+ + + + + + + +
- {{'ORG.POLICY.DATA.ALLOWUSERNAMEPASSWORD' | translate}} - - + {{'POLICY.DATA.ALLOWUSERNAMEPASSWORD' | translate}} +

{{'POLICY.DATA.ALLOWUSERNAMEPASSWORD_DESC' | translate}}

- {{'ORG.POLICY.DATA.ALLOWREGISTER' | translate}} - - + + {{'POLICY.DATA.ALLOWREGISTER' | translate}} +

{{'POLICY.DATA.ALLOWREGISTER_DESC' | translate}}

- {{'ORG.POLICY.DATA.ALLOWEXTERNALIDP' | translate}} - - + {{'POLICY.DATA.ALLOWEXTERNALIDP' | translate}} +

{{'POLICY.DATA.ALLOWEXTERNALIDP_DESC' | translate}}

-

{{'LOGINPOLICY.IDPS' | translate}}

+

{{'LOGINPOLICY.IDPS' | translate}}

-
- remove_circle - {{idp.name}} +
+ + {{idp.name}} {{ 'IDP.TYPE' | translate }}: {{ 'IDP.TYPES.'+idp.type | translate }} {{ 'IDP.ID' | translate }}: {{idp.idpConfigId}}
-
+
add
-
- -
- + - +

{{ 'IDP.LIST.TITLE' | translate }}

+

{{ 'IDP.LIST.DESCRIPTION' | translate }}

+ [disabled]="([serviceType == PolicyComponentServiceType.ADMIN ? 'iam.idp.write' : serviceType == PolicyComponentServiceType.MGMT ? 'org.idp.write' : ''] | hasRole | async) == false"> -
- + \ No newline at end of file diff --git a/console/src/app/modules/policies/login-policy/login-policy.component.scss b/console/src/app/modules/policies/login-policy/login-policy.component.scss index fb97207973..ccfc996243 100644 --- a/console/src/app/modules/policies/login-policy/login-policy.component.scss +++ b/console/src/app/modules/policies/login-policy/login-policy.component.scss @@ -1,46 +1,36 @@ +.default { + color: #5282c1; + margin-top: 0; +} -button { - border-radius: .5rem; +.spinner-wr { + margin: .5rem 0; } .content { padding-top: 1rem; - display: flex; - flex-direction: column; - width: 100%; .row { - display: flex; - align-items: center; - padding: .5rem 0; - - .left-desc { - color: #8795a1; - font-size: .9rem; + .toggle { + margin: .3rem 0; } - .fill-space { - flex: 1; - } - - .length-wrapper { - display: flex; - align-items: center; + p { + margin-top: .5rem; + font-size: 14px; + color: var(--grey); } } } -.btn-container { - display: flex; - justify-content: flex-end; - width: 100%; +.save-button { + margin-top: 3rem; + display: block; + padding: .5rem 4rem; +} - button { - margin-top: 3rem; - display: block; - padding: .5rem 4rem; - border-radius: .5rem; - } +.idp-table-card { + width: 100%; } .subheader { @@ -58,10 +48,16 @@ button { justify-content: center; margin: .5rem; padding: 10px; - border: 1px solid #8795a1; + border: 1px solid var(--grey); border-radius: .5rem; cursor: pointer; position: relative; + min-height: 70px; + min-width: 150px; + + .name { + font-weight: 700; + } span { padding: 2px; @@ -69,6 +65,7 @@ button { .meta { font-size: 12px; + color: var(--grey); } .rm { @@ -77,10 +74,16 @@ button { left: 0; transform: translateX(-50%) translateY(-50%); cursor: pointer; + + &[disabled] { + display: none; + } } - &:hover { - background-color: #ffffff10; + &:not(.disabled) { + &:hover { + background-color: #ffffff10; + } } img { diff --git a/console/src/app/modules/policies/login-policy/login-policy.component.ts b/console/src/app/modules/policies/login-policy/login-policy.component.ts index ffe5a6aec1..119a251433 100644 --- a/console/src/app/modules/policies/login-policy/login-policy.component.ts +++ b/console/src/app/modules/policies/login-policy/login-policy.component.ts @@ -1,7 +1,6 @@ import { Component, Injector, OnDestroy, Type } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Empty } from 'google-protobuf/google/protobuf/empty_pb'; +import { ActivatedRoute } from '@angular/router'; import { Subscription } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { @@ -11,11 +10,11 @@ import { IdpView as AdminIdpView, } from 'src/app/proto/generated/admin_pb'; import { - IdpProviderType, - IdpProviderView as MgmtIdpProviderView, - IdpView as MgmtIdpView, - LoginPolicy, - LoginPolicyView, OrgDomainView, + IdpProviderType, + IdpProviderView as MgmtIdpProviderView, + IdpView as MgmtIdpView, + LoginPolicy, + LoginPolicyView, } from 'src/app/proto/generated/management_pb'; import { AdminService } from 'src/app/services/admin.service'; import { ManagementService } from 'src/app/services/mgmt.service'; @@ -34,18 +33,19 @@ export class LoginPolicyComponent implements OnDestroy { private sub: Subscription = new Subscription(); public service!: ManagementService | AdminService; - PolicyComponentServiceType: any = PolicyComponentServiceType; + public PolicyComponentServiceType: any = PolicyComponentServiceType; public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT; public idps: MgmtIdpProviderView.AsObject[] | AdminIdpProviderView.AsObject[] = []; + + public loading: boolean = false; + public disabled: boolean = true; constructor( private route: ActivatedRoute, - private router: Router, private toast: ToastService, private dialog: MatDialog, private injector: Injector, ) { this.sub = this.route.data.pipe(switchMap(data => { - console.log(data.serviceType); this.serviceType = data.serviceType; switch (this.serviceType) { case PolicyComponentServiceType.MGMT: @@ -58,15 +58,20 @@ export class LoginPolicyComponent implements OnDestroy { return this.route.params; })).subscribe(() => { - this.getData().then(data => { - if (data) { - this.loginData = data.toObject(); - } - }); - this.getIdps().then(idps => { - console.log(idps); - this.idps = idps; - }); + this.fetchData(); + }); + } + + private fetchData(): void { + this.getData().then(data => { + if (data) { + this.loginData = data.toObject(); + this.loading = false; + this.disabled = ((this.loginData as LoginPolicyView.AsObject)?.pb_default) ?? false; + } + }); + this.getIdps().then(idps => { + this.idps = idps; }); } @@ -107,7 +112,11 @@ export class LoginPolicyComponent implements OnDestroy { mgmtreq.setAllowExternalIdp(this.loginData.allowExternalIdp); mgmtreq.setAllowRegister(this.loginData.allowRegister); mgmtreq.setAllowUsernamePassword(this.loginData.allowUsernamePassword); - return (this.service as ManagementService).UpdateLoginPolicy(mgmtreq); + if ((this.loginData as LoginPolicyView.AsObject).pb_default) { + return (this.service as ManagementService).CreateLoginPolicy(mgmtreq); + } else { + return (this.service as ManagementService).UpdateLoginPolicy(mgmtreq); + } case PolicyComponentServiceType.ADMIN: const adminreq = new DefaultLoginPolicy(); adminreq.setAllowExternalIdp(this.loginData.allowExternalIdp); @@ -119,25 +128,27 @@ export class LoginPolicyComponent implements OnDestroy { public savePolicy(): void { this.updateData().then(() => { - switch (this.serviceType) { - case PolicyComponentServiceType.MGMT: - this.router.navigate(['org']); - break; - case PolicyComponentServiceType.ADMIN: - this.router.navigate(['iam']); - break; - } + this.toast.showInfo('POLICY.LOGIN_POLICY.SAVED', true); + this.loading = true; + setTimeout(() => { + this.fetchData(); + }, 2000); }).catch(error => { this.toast.showError(error); }); } - public deletePolicy(): Promise { - switch (this.serviceType) { - case PolicyComponentServiceType.MGMT: - return (this.service as ManagementService).RemoveLoginPolicy(); - case PolicyComponentServiceType.ADMIN: - return (this.service as AdminService).GetDefaultLoginPolicy(); + public removePolicy(): void { + if (this.serviceType === PolicyComponentServiceType.MGMT) { + (this.service as ManagementService).RemoveLoginPolicy().then(() => { + this.toast.showInfo('POLICY.TOAST.RESETSUCCESS', true); + this.loading = true; + setTimeout(() => { + this.fetchData(); + }, 2000); + }).catch(error => { + this.toast.showError(error); + }); } } @@ -151,7 +162,14 @@ export class LoginPolicyComponent implements OnDestroy { dialogRef.afterClosed().subscribe(resp => { if (resp && resp.idp && resp.type) { - this.addIdp(resp.idp, resp.type); + this.addIdp(resp.idp, resp.type).then(() => { + this.loading = true; + setTimeout(() => { + this.fetchData(); + }, 2000); + }).catch(error => { + this.toast.showError(error); + }); } }); } @@ -169,23 +187,29 @@ export class LoginPolicyComponent implements OnDestroy { public removeIdp(idp: AdminIdpProviderView.AsObject | MgmtIdpProviderView.AsObject): void { switch (this.serviceType) { case PolicyComponentServiceType.MGMT: - (this.service as ManagementService).RemoveIdpProviderFromLoginPolicy(idp.idpConfigId); + (this.service as ManagementService).RemoveIdpProviderFromLoginPolicy(idp.idpConfigId).then(() => { + const index = this.idps.findIndex(temp => temp === idp); + if (index > -1) { + this.idps.splice(index, 1); + } + }); break; case PolicyComponentServiceType.ADMIN: - (this.service as AdminService).RemoveIdpProviderFromDefaultLoginPolicy(idp.idpConfigId); + (this.service as AdminService).RemoveIdpProviderFromDefaultLoginPolicy(idp.idpConfigId).then(() => { + const index = this.idps.findIndex(temp => temp === idp); + if (index > -1) { + this.idps.splice(index, 1); + } + }); break; } } - public get backroutes(): string[] { - switch (this.serviceType) { - case PolicyComponentServiceType.MGMT: - return ['/org']; - case PolicyComponentServiceType.ADMIN: - return ['/iam']; - break; + public get isDefault(): boolean { + if (this.loginData && this.serviceType === PolicyComponentServiceType.MGMT) { + return (this.loginData as LoginPolicyView.AsObject).pb_default; + } else { + return false; + } } - return []; - } - } diff --git a/console/src/app/modules/policies/login-policy/login-policy.module.ts b/console/src/app/modules/policies/login-policy/login-policy.module.ts index 4e671bc531..1d7498d395 100644 --- a/console/src/app/modules/policies/login-policy/login-policy.module.ts +++ b/console/src/app/modules/policies/login-policy/login-policy.module.ts @@ -2,21 +2,22 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; -import { CardModule } from 'src/app/modules/card/card.module'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; +import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; +import { CardModule } from 'src/app/modules/card/card.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { IdpTableModule } from 'src/app/modules/idp-table/idp-table.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { AddIdpDialogModule } from './add-idp-dialog/add-idp-dialog.module'; import { LoginPolicyRoutingModule } from './login-policy-routing.module'; import { LoginPolicyComponent } from './login-policy.component'; -import { IdpTableModule } from 'src/app/modules/idp-table/idp-table.module'; -import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; @NgModule({ declarations: [LoginPolicyComponent], @@ -37,6 +38,7 @@ import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; DetailLayoutModule, AddIdpDialogModule, IdpTableModule, + MatProgressSpinnerModule, ], }) export class LoginPolicyModule { } diff --git a/console/src/app/modules/policies/org-iam-policy/org-iam-policy-routing.module.ts b/console/src/app/modules/policies/org-iam-policy/org-iam-policy-routing.module.ts new file mode 100644 index 0000000000..f27987683c --- /dev/null +++ b/console/src/app/modules/policies/org-iam-policy/org-iam-policy-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { OrgIamPolicyComponent } from './org-iam-policy.component'; + +const routes: Routes = [ + { + path: '', + component: OrgIamPolicyComponent, + data: { + animation: 'DetailPage', + }, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class OrgIamPolicyRoutingModule { } diff --git a/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.html b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.html new file mode 100644 index 0000000000..6a8e9754b0 --- /dev/null +++ b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.html @@ -0,0 +1,26 @@ + +

{{'POLICY.DEFAULTLABEL' | translate}}

+ + + + + +
+
+ {{'POLICY.DATA.USERLOGINMUSTBEDOMAIN' | translate}} + + + +
+
+ +
+ +
+
\ No newline at end of file diff --git a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.scss b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.scss similarity index 82% rename from console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.scss rename to console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.scss index 3884c0cd5c..53d79e16f9 100644 --- a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.scss +++ b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.scss @@ -1,6 +1,6 @@ - -button { - border-radius: .5rem; +.default { + color: #5282c1; + margin-top: 0; } .content { @@ -12,10 +12,9 @@ button { .row { display: flex; align-items: center; - padding: .5rem 0; + padding: .3rem 0; .left-desc { - color: #8795a1; font-size: .9rem; } @@ -39,6 +38,5 @@ button { margin-top: 3rem; display: block; padding: .5rem 4rem; - border-radius: .5rem; } } diff --git a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.spec.ts b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.spec.ts similarity index 52% rename from console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.spec.ts rename to console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.spec.ts index 455f9fe36e..d19b9463fa 100644 --- a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.spec.ts +++ b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.spec.ts @@ -1,20 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { PasswordIamPolicyComponent } from './password-iam-policy.component'; +import { OrgIamPolicyComponent } from './org-iam-policy.component'; -describe('PasswordIamPolicyComponent', () => { - let component: PasswordIamPolicyComponent; - let fixture: ComponentFixture; +describe('OrgIamPolicyComponent', () => { + let component: OrgIamPolicyComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [PasswordIamPolicyComponent], + declarations: [OrgIamPolicyComponent], }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(PasswordIamPolicyComponent); + fixture = TestBed.createComponent(OrgIamPolicyComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.ts b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.ts new file mode 100644 index 0000000000..ba6d15b398 --- /dev/null +++ b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.component.ts @@ -0,0 +1,136 @@ +import { Component, Injector, Input, OnDestroy, Type } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { OrgIamPolicyView as AdminOrgIamPolicyView } from 'src/app/proto/generated/admin_pb'; +import { Org } from 'src/app/proto/generated/auth_pb'; +import { OrgIamPolicyView as MgmtOrgIamPolicyView } from 'src/app/proto/generated/management_pb'; +import { AdminService } from 'src/app/services/admin.service'; +import { ManagementService } from 'src/app/services/mgmt.service'; +import { StorageService } from 'src/app/services/storage.service'; +import { ToastService } from 'src/app/services/toast.service'; + +import { PolicyComponentServiceType } from '../policy-component-types.enum'; + +@Component({ + selector: 'app-org-iam-policy', + templateUrl: './org-iam-policy.component.html', + styleUrls: ['./org-iam-policy.component.scss'], +}) +export class OrgIamPolicyComponent implements OnDestroy { + @Input() service!: AdminService; + private managementService!: ManagementService; + public serviceType!: PolicyComponentServiceType; + + public iamData!: AdminOrgIamPolicyView.AsObject | MgmtOrgIamPolicyView.AsObject; + + private sub: Subscription = new Subscription(); + private org!: Org.AsObject; + + public PolicyComponentServiceType: any = PolicyComponentServiceType; + + constructor( + private route: ActivatedRoute, + private toast: ToastService, + private sessionStorage: StorageService, + private injector: Injector, + private adminService: AdminService, + ) { + const temporg = this.sessionStorage.getItem('organization') as Org.AsObject; + if (temporg) { + this.org = temporg; + } + this.sub = this.route.data.pipe(switchMap(data => { + this.serviceType = data.serviceType; + if (this.serviceType === PolicyComponentServiceType.MGMT) { + this.managementService = this.injector.get(ManagementService as Type); + } + return this.route.params; + })).subscribe(_ => { + this.fetchData(); + }); + } + + public ngOnDestroy(): void { + this.sub.unsubscribe(); + } + + public fetchData(): void { + this.getData().then(data => { + if (data) { + this.iamData = data.toObject(); + } + }); + } + + private async getData(): Promise { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + return this.managementService.GetMyOrgIamPolicy(); + case PolicyComponentServiceType.ADMIN: + if (this.org?.id) { + return this.adminService.GetOrgIamPolicy(this.org.id); + } + break; + } + } + + public savePolicy(): void { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + if ((this.iamData as MgmtOrgIamPolicyView.AsObject).pb_default) { + this.adminService.CreateOrgIamPolicy( + this.org.id, + this.iamData.userLoginMustBeDomain, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + break; + } else { + this.adminService.UpdateOrgIamPolicy( + this.org.id, + this.iamData.userLoginMustBeDomain, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + break; + } + case PolicyComponentServiceType.ADMIN: + // update Default org iam policy? + this.adminService.UpdateOrgIamPolicy( + this.org.id, + this.iamData.userLoginMustBeDomain, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + break; + } + } + + public removePolicy(): void { + if (this.serviceType === PolicyComponentServiceType.MGMT) { + this.adminService.RemoveOrgIamPolicy(this.org.id).then(() => { + this.toast.showInfo('POLICY.TOAST.RESETSUCCESS', true); + setTimeout(() => { + this.fetchData(); + }, 1000); + }).catch(error => { + this.toast.showError(error); + }); + } + } + + public get isDefault(): boolean { + if (this.iamData && this.serviceType === PolicyComponentServiceType.MGMT) { + return (this.iamData as MgmtOrgIamPolicyView.AsObject).pb_default; + } else { + return false; + } + } +} diff --git a/console/src/app/modules/policies/org-iam-policy/org-iam-policy.module.ts b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.module.ts new file mode 100644 index 0000000000..a4d4508e86 --- /dev/null +++ b/console/src/app/modules/policies/org-iam-policy/org-iam-policy.module.ts @@ -0,0 +1,34 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TranslateModule } from '@ngx-translate/core'; +import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; +import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; + +import { OrgIamPolicyRoutingModule } from './org-iam-policy-routing.module'; +import { OrgIamPolicyComponent } from './org-iam-policy.component'; + +@NgModule({ + declarations: [OrgIamPolicyComponent], + imports: [ + OrgIamPolicyRoutingModule, + CommonModule, + FormsModule, + MatInputModule, + MatFormFieldModule, + MatButtonModule, + MatSlideToggleModule, + MatIconModule, + HasRoleModule, + MatTooltipModule, + TranslateModule, + DetailLayoutModule, + ], +}) +export class OrgIamPolicyModule { } diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts b/console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts index 3e39b87b4f..1fc2b16fe6 100644 --- a/console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy-routing.module.ts @@ -1,7 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { PolicyComponentAction } from '../policy-component-action.enum'; import { PasswordAgePolicyComponent } from './password-age-policy.component'; const routes: Routes = [ @@ -10,15 +9,6 @@ const routes: Routes = [ component: PasswordAgePolicyComponent, data: { animation: 'DetailPage', - action: PolicyComponentAction.MODIFY, - }, - }, - { - path: 'create', - component: PasswordAgePolicyComponent, - data: { - animation: 'DetailPage', - action: PolicyComponentAction.CREATE, }, }, ]; diff --git a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.html b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.html index 0c30ebe6b3..53cd17171b 100644 --- a/console/src/app/modules/policies/password-age-policy/password-age-policy.component.html +++ b/console/src/app/modules/policies/password-age-policy/password-age-policy.component.html @@ -1,19 +1,15 @@ - - -
- - {{ 'ORG.POLICY.DATA.DESCRIPTION' | translate }} - -
- {{'ORG.POLICY.DATA.EXPIREWARNDAYS' | translate}} + {{'POLICY.DATA.EXPIREWARNDAYS' | translate}}
- {{'ORG.POLICY.DATA.MAXAGEDAYS' | translate}} + {{'POLICY.DATA.MAXAGEDAYS' | translate}}
- - {{ 'ORG.POLICY.DATA.DESCRIPTION' | translate }} - -
- {{'ORG.POLICY.DATA.MINLENGTH' | translate}} + {{'POLICY.DATA.MINLENGTH' | translate}}
- {{'ORG.POLICY.DATA.HASNUMBER' | translate}} + {{'POLICY.DATA.HASNUMBER' | translate}}
- {{'ORG.POLICY.DATA.HASSYMBOL' | translate}} + {{'POLICY.DATA.HASSYMBOL' | translate}}
- {{'ORG.POLICY.DATA.HASLOWERCASE' | translate}} + {{'POLICY.DATA.HASLOWERCASE' | translate}}
- {{'ORG.POLICY.DATA.HASUPPERCASE' | translate}} + {{'POLICY.DATA.HASUPPERCASE' | translate}} @@ -54,7 +57,7 @@
-
\ No newline at end of file diff --git a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss index 3884c0cd5c..aad97ba68c 100644 --- a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss +++ b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.scss @@ -1,6 +1,10 @@ +.default { + color: #5282c1; + margin-top: 0; +} -button { - border-radius: .5rem; +.spinner-wr { + margin: .5rem 0; } .content { @@ -12,10 +16,9 @@ button { .row { display: flex; align-items: center; - padding: .5rem 0; + padding: .3rem 0; .left-desc { - color: #8795a1; font-size: .9rem; } @@ -26,6 +29,7 @@ button { .length-wrapper { display: flex; align-items: center; + margin-right: -.6rem; } } } @@ -39,6 +43,5 @@ button { margin-top: 3rem; display: block; padding: .5rem 4rem; - border-radius: .5rem; } } diff --git a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.ts b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.ts index 4cc5c6c47d..0a578f8a11 100644 --- a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.ts +++ b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.component.ts @@ -1,17 +1,14 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { Component, Injector, OnDestroy, Type } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { Subscription } from 'rxjs'; import { switchMap } from 'rxjs/operators'; -import { - OrgIamPolicy, - PasswordAgePolicy, - PasswordComplexityPolicy, - PasswordLockoutPolicy, -} from 'src/app/proto/generated/management_pb'; +import { DefaultPasswordComplexityPolicy } from 'src/app/proto/generated/admin_pb'; +import { PasswordComplexityPolicyView } from 'src/app/proto/generated/management_pb'; +import { AdminService } from 'src/app/services/admin.service'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; -import { PolicyComponentAction } from '../policy-component-action.enum'; +import { PolicyComponentServiceType } from '../policy-component-types.enum'; @Component({ selector: 'app-password-policy', @@ -19,36 +16,45 @@ import { PolicyComponentAction } from '../policy-component-action.enum'; styleUrls: ['./password-complexity-policy.component.scss'], }) export class PasswordComplexityPolicyComponent implements OnDestroy { - public title: string = ''; - public desc: string = ''; + public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT; + public service!: ManagementService | AdminService; - componentAction: PolicyComponentAction = PolicyComponentAction.CREATE; - - public PolicyComponentAction: any = PolicyComponentAction; - - public complexityData!: PasswordComplexityPolicy.AsObject; + public complexityData!: PasswordComplexityPolicyView.AsObject | DefaultPasswordComplexityPolicy.AsObject; private sub: Subscription = new Subscription(); + public PolicyComponentServiceType: any = PolicyComponentServiceType; + public loading: boolean = false; constructor( private route: ActivatedRoute, - private mgmtService: ManagementService, - private router: Router, private toast: ToastService, + private injector: Injector, ) { this.sub = this.route.data.pipe(switchMap(data => { - this.componentAction = data.action; - return this.route.params; - })).subscribe(params => { - this.title = 'ORG.POLICY.PWD_COMPLEXITY.TITLECREATE'; - this.desc = 'ORG.POLICY.PWD_COMPLEXITY.DESCRIPTIONCREATE'; + this.serviceType = data.serviceType; - if (this.componentAction === PolicyComponentAction.MODIFY) { - this.getData(params).then(data => { - if (data) { - this.complexityData = data.toObject() as PasswordComplexityPolicy.AsObject; - } - }); + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + this.service = this.injector.get(ManagementService as Type); + break; + case PolicyComponentServiceType.ADMIN: + this.service = this.injector.get(AdminService as Type); + break; + } + + return this.route.params; + })).subscribe(() => { + this.fetchData(); + }); + } + + public fetchData(): void { + this.loading = true; + + this.getData().then(data => { + if (data) { + this.complexityData = data.toObject(); + this.loading = false; } }); } @@ -57,19 +63,27 @@ export class PasswordComplexityPolicyComponent implements OnDestroy { this.sub.unsubscribe(); } - private async getData(params: any): - Promise { - this.title = 'ORG.POLICY.PWD_COMPLEXITY.TITLE'; - this.desc = 'ORG.POLICY.PWD_COMPLEXITY.DESCRIPTION'; - return this.mgmtService.GetPasswordComplexityPolicy(); + private async getData(): + Promise { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + return (this.service as ManagementService).GetPasswordComplexityPolicy(); + case PolicyComponentServiceType.ADMIN: + return (this.service as AdminService).GetDefaultPasswordComplexityPolicy(); + } } - public deletePolicy(): void { - this.mgmtService.DeletePasswordComplexityPolicy(this.complexityData.id).then(() => { - this.toast.showInfo('Successfully deleted'); - }).catch(error => { - this.toast.showError(error); - }); + public removePolicy(): void { + if (this.service instanceof ManagementService) { + this.service.removePasswordComplexityPolicy().then(() => { + this.toast.showInfo('POLICY.TOAST.RESETSUCCESS', true); + setTimeout(() => { + this.fetchData(); + }, 1000); + }).catch(error => { + this.toast.showError(error); + }); + } } public incrementLength(): void { @@ -85,35 +99,56 @@ export class PasswordComplexityPolicyComponent implements OnDestroy { } public savePolicy(): void { - if (this.componentAction === PolicyComponentAction.CREATE) { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + if ((this.complexityData as PasswordComplexityPolicyView.AsObject).pb_default) { + (this.service as ManagementService).CreatePasswordComplexityPolicy( - this.mgmtService.CreatePasswordComplexityPolicy( - this.complexityData.description, - this.complexityData.hasLowercase, - this.complexityData.hasUppercase, - this.complexityData.hasNumber, - this.complexityData.hasSymbol, - this.complexityData.minLength, - ).then(() => { - this.router.navigate(['org']); - }).catch(error => { - this.toast.showError(error); - }); + this.complexityData.hasLowercase, + this.complexityData.hasUppercase, + this.complexityData.hasNumber, + this.complexityData.hasSymbol, + this.complexityData.minLength, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + } else { + (this.service as ManagementService).UpdatePasswordComplexityPolicy( + this.complexityData.hasLowercase, + this.complexityData.hasUppercase, + this.complexityData.hasNumber, + this.complexityData.hasSymbol, + this.complexityData.minLength, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + } + break; + case PolicyComponentServiceType.ADMIN: + (this.service as AdminService).UpdateDefaultPasswordComplexityPolicy( + this.complexityData.hasLowercase, + this.complexityData.hasUppercase, + this.complexityData.hasNumber, + this.complexityData.hasSymbol, + this.complexityData.minLength, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + break; + } + } - } else if (this.componentAction === PolicyComponentAction.MODIFY) { - - this.mgmtService.UpdatePasswordComplexityPolicy( - this.complexityData.description, - this.complexityData.hasLowercase, - this.complexityData.hasUppercase, - this.complexityData.hasNumber, - this.complexityData.hasSymbol, - this.complexityData.minLength, - ).then(() => { - this.router.navigate(['org']); - }).catch(error => { - this.toast.showError(error); - }); + public get isDefault(): boolean { + if (this.complexityData && this.serviceType === PolicyComponentServiceType.MGMT) { + return (this.complexityData as PasswordComplexityPolicyView.AsObject).pb_default; + } else { + return false; } } } diff --git a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.module.ts b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.module.ts index 82da4dd1f2..beb0593aa1 100644 --- a/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.module.ts +++ b/console/src/app/modules/policies/password-complexity-policy/password-complexity-policy.module.ts @@ -5,6 +5,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; @@ -29,6 +30,7 @@ import { PasswordComplexityPolicyComponent } from './password-complexity-policy. MatTooltipModule, TranslateModule, DetailLayoutModule, + MatProgressSpinnerModule, ], }) export class PasswordComplexityPolicyModule { } diff --git a/console/src/app/modules/policies/password-iam-policy/password-iam-policy-routing.module.ts b/console/src/app/modules/policies/password-iam-policy/password-iam-policy-routing.module.ts deleted file mode 100644 index c0c86d4d2d..0000000000 --- a/console/src/app/modules/policies/password-iam-policy/password-iam-policy-routing.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { PolicyComponentAction } from '../policy-component-action.enum'; -import { PasswordIamPolicyComponent } from './password-iam-policy.component'; - -const routes: Routes = [ - { - path: '', - component: PasswordIamPolicyComponent, - data: { - animation: 'DetailPage', - action: PolicyComponentAction.MODIFY, - }, - }, - { - path: 'create', - component: PasswordIamPolicyComponent, - data: { - animation: 'DetailPage', - action: PolicyComponentAction.CREATE, - }, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class PasswordIamPolicyRoutingModule { } diff --git a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.html b/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.html deleted file mode 100644 index 5ef10571fc..0000000000 --- a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.html +++ /dev/null @@ -1,28 +0,0 @@ - - - -
- - {{ 'ORG.POLICY.DATA.DESCRIPTION' | translate }} - - -
- {{'ORG.POLICY.DATA.USERLOGINMUSTBEDOMAIN' | translate}} - - - -
-
- -
- -
-
\ No newline at end of file diff --git a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.ts b/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.ts deleted file mode 100644 index cf8eb91648..0000000000 --- a/console/src/app/modules/policies/password-iam-policy/password-iam-policy.component.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Subscription } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; -import { - OrgIamPolicy, - PasswordAgePolicy, - PasswordComplexityPolicy, - PasswordLockoutPolicy, -} from 'src/app/proto/generated/management_pb'; -import { AdminService } from 'src/app/services/admin.service'; -import { ManagementService } from 'src/app/services/mgmt.service'; -import { StorageService } from 'src/app/services/storage.service'; -import { ToastService } from 'src/app/services/toast.service'; - -import { PolicyComponentAction } from '../policy-component-action.enum'; - -@Component({ - selector: 'app-password-iam-policy', - templateUrl: './password-iam-policy.component.html', - styleUrls: ['./password-iam-policy.component.scss'], -}) -export class PasswordIamPolicyComponent implements OnDestroy { - public title: string = ''; - public desc: string = ''; - - componentAction: PolicyComponentAction = PolicyComponentAction.CREATE; - - public PolicyComponentAction: any = PolicyComponentAction; - - public iamData!: OrgIamPolicy.AsObject; - - private sub: Subscription = new Subscription(); - - constructor( - private route: ActivatedRoute, - private mgmtService: ManagementService, - private adminService: AdminService, - private router: Router, - private toast: ToastService, - private sessionStorage: StorageService, - ) { - this.sub = this.route.data.pipe(switchMap(data => { - this.componentAction = data.action; - console.log(data.action); - return this.route.params; - })).subscribe(params => { - this.title = 'ORG.POLICY.IAM_POLICY.TITLECREATE'; - this.desc = 'ORG.POLICY.IAM_POLICY.DESCRIPTIONCREATE'; - - if (this.componentAction === PolicyComponentAction.MODIFY) { - this.getData(params).then(data => { - if (data) { - this.iamData = data.toObject() as OrgIamPolicy.AsObject; - } - }); - } - }); - } - - public ngOnDestroy(): void { - this.sub.unsubscribe(); - } - - private async getData(params: any): - Promise { - - this.title = 'ORG.POLICY.IAM_POLICY.TITLECREATE'; - this.desc = 'ORG.POLICY.IAM_POLICY.DESCRIPTIONCREATE'; - return this.mgmtService.GetMyOrgIamPolicy(); - } - - public savePolicy(): void { - if (this.componentAction === PolicyComponentAction.CREATE) { - const orgId = this.sessionStorage.getItem('organization'); - if (orgId) { - this.adminService.CreateOrgIamPolicy( - orgId, - this.iamData.description, - this.iamData.userLoginMustBeDomain, - ).then(() => { - this.router.navigate(['org']); - }).catch(error => { - this.toast.showError(error); - }); - } - } else if (this.componentAction === PolicyComponentAction.MODIFY) { - const orgId = this.sessionStorage.getItem('organization'); - if (orgId) { - this.adminService.UpdateOrgIamPolicy( - orgId, - this.iamData.description, - this.iamData.userLoginMustBeDomain, - ).then(() => { - this.router.navigate(['org']); - }).catch(error => { - this.toast.showError(error); - }); - } - } - } -} diff --git a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy-routing.module.ts b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy-routing.module.ts index 61e1cfdec2..1572a12262 100644 --- a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy-routing.module.ts +++ b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy-routing.module.ts @@ -1,7 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { PolicyComponentAction } from '../policy-component-action.enum'; import { PasswordLockoutPolicyComponent } from './password-lockout-policy.component'; const routes: Routes = [ @@ -10,15 +9,6 @@ const routes: Routes = [ component: PasswordLockoutPolicyComponent, data: { animation: 'DetailPage', - action: PolicyComponentAction.MODIFY, - }, - }, - { - path: 'create', - component: PasswordLockoutPolicyComponent, - data: { - animation: 'DetailPage', - action: PolicyComponentAction.CREATE, }, }, ]; diff --git a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.html b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.html index af366cf470..56adc76f93 100644 --- a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.html +++ b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.html @@ -1,19 +1,17 @@ - - -
- - {{ 'ORG.POLICY.DATA.DESCRIPTION' | translate }} - -
- {{'ORG.POLICY.DATA.MAXATTEMPTS' | translate}} + {{'POLICY.DATA.MAXATTEMPTS' | translate}}
- {{'ORG.POLICY.DATA.SHOWLOCKOUTFAILURES' | translate}} + {{'POLICY.DATA.SHOWLOCKOUTFAILURES' | translate}} - +
diff --git a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss index 3884c0cd5c..53d79e16f9 100644 --- a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss +++ b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.scss @@ -1,6 +1,6 @@ - -button { - border-radius: .5rem; +.default { + color: #5282c1; + margin-top: 0; } .content { @@ -12,10 +12,9 @@ button { .row { display: flex; align-items: center; - padding: .5rem 0; + padding: .3rem 0; .left-desc { - color: #8795a1; font-size: .9rem; } @@ -39,6 +38,5 @@ button { margin-top: 3rem; display: block; padding: .5rem 4rem; - border-radius: .5rem; } } diff --git a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.ts b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.ts index 61a63833e4..a01cb8eda6 100644 --- a/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.ts +++ b/console/src/app/modules/policies/password-lockout-policy/password-lockout-policy.component.ts @@ -1,18 +1,15 @@ -import { Component, OnDestroy } from '@angular/core'; +import { Component, Injector, Input, OnDestroy, Type } from '@angular/core'; import { FormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { Subscription } from 'rxjs'; import { switchMap } from 'rxjs/operators'; -import { - OrgIamPolicy, - PasswordAgePolicy, - PasswordComplexityPolicy, - PasswordLockoutPolicy, -} from 'src/app/proto/generated/management_pb'; +import { DefaultPasswordLockoutPolicyView } from 'src/app/proto/generated/admin_pb'; +import { PasswordLockoutPolicyView } from 'src/app/proto/generated/management_pb'; +import { AdminService } from 'src/app/services/admin.service'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; -import { PolicyComponentAction } from '../policy-component-action.enum'; +import { PolicyComponentServiceType } from '../policy-component-types.enum'; @Component({ selector: 'app-password-lockout-policy', @@ -20,37 +17,35 @@ import { PolicyComponentAction } from '../policy-component-action.enum'; styleUrls: ['./password-lockout-policy.component.scss'], }) export class PasswordLockoutPolicyComponent implements OnDestroy { - public title: string = ''; - public desc: string = ''; + @Input() public service!: ManagementService | AdminService; + public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT; - componentAction: PolicyComponentAction = PolicyComponentAction.CREATE; - - public PolicyComponentAction: any = PolicyComponentAction; public lockoutForm!: FormGroup; - public lockoutData!: PasswordLockoutPolicy.AsObject; + public lockoutData!: PasswordLockoutPolicyView.AsObject; private sub: Subscription = new Subscription(); + public PolicyComponentServiceType: any = PolicyComponentServiceType; constructor( private route: ActivatedRoute, - private mgmtService: ManagementService, - private router: Router, private toast: ToastService, + private injector: Injector, ) { this.sub = this.route.data.pipe(switchMap(data => { - this.componentAction = data.action; - return this.route.params; - })).subscribe(params => { - this.title = 'ORG.POLICY.PWD_LOCKOUT.TITLECREATE'; - this.desc = 'ORG.POLICY.PWD_LOCKOUT.DESCRIPTIONCREATE'; + this.serviceType = data.serviceType; - if (this.componentAction === PolicyComponentAction.MODIFY) { - this.getData(params).then(data => { - if (data) { - this.lockoutData = data.toObject() as PasswordLockoutPolicy.AsObject; - } - }); + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + this.service = this.injector.get(ManagementService as Type); + break; + case PolicyComponentServiceType.ADMIN: + this.service = this.injector.get(AdminService as Type); + break; } + + return this.route.params; + })).subscribe(() => { + this.fetchData(); }); } @@ -58,20 +53,32 @@ export class PasswordLockoutPolicyComponent implements OnDestroy { this.sub.unsubscribe(); } - private async getData(params: any): - Promise { - - this.title = 'ORG.POLICY.PWD_LOCKOUT.TITLE'; - this.desc = 'ORG.POLICY.PWD_LOCKOUT.DESCRIPTION'; - return this.mgmtService.GetPasswordLockoutPolicy(); + private fetchData(): void { + this.getData().then(data => { + if (data) { + this.lockoutData = data.toObject() as PasswordLockoutPolicyView.AsObject; + } + }); } - public deletePolicy(): void { - this.mgmtService.DeletePasswordLockoutPolicy(this.lockoutData.id).then(() => { - this.toast.showInfo('Successfully deleted'); - }).catch(error => { - this.toast.showError(error); - }); + private getData(): Promise { + switch (this.serviceType) { + case PolicyComponentServiceType.MGMT: + return (this.service as ManagementService).GetPasswordLockoutPolicy(); + case PolicyComponentServiceType.ADMIN: + return (this.service as AdminService).GetDefaultPasswordLockoutPolicy(); + } + } + + public removePolicy(): void { + if (this.service instanceof ManagementService) { + this.service.RemovePasswordLockoutPolicy().then(() => { + this.toast.showInfo('POLICY.TOAST.RESETSUCCESS', true); + this.fetchData(); + }).catch(error => { + this.toast.showError(error); + }); + } } public incrementMaxAttempts(): void { @@ -87,27 +94,44 @@ export class PasswordLockoutPolicyComponent implements OnDestroy { } public savePolicy(): void { - if (this.componentAction === PolicyComponentAction.CREATE) { - this.mgmtService.CreatePasswordLockoutPolicy( - this.lockoutData.description, + let promise: Promise; + if (this.service instanceof AdminService) { + promise = this.service.UpdateDefaultPasswordLockoutPolicy( this.lockoutData.maxAttempts, - this.lockoutData.showLockOutFailures, + this.lockoutData.showLockoutFailure, ).then(() => { - this.router.navigate(['org']); + this.toast.showInfo('POLICY.TOAST.SET', true); }).catch(error => { this.toast.showError(error); }); - } else if (this.componentAction === PolicyComponentAction.MODIFY) { + } else { + if ((this.lockoutData as PasswordLockoutPolicyView.AsObject).pb_default) { + promise = this.service.CreatePasswordLockoutPolicy( + this.lockoutData.maxAttempts, + this.lockoutData.showLockoutFailure, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + } else { + promise = this.service.UpdatePasswordLockoutPolicy( + this.lockoutData.maxAttempts, + this.lockoutData.showLockoutFailure, + ).then(() => { + this.toast.showInfo('POLICY.TOAST.SET', true); + }).catch(error => { + this.toast.showError(error); + }); + } + } + } - this.mgmtService.UpdatePasswordLockoutPolicy( - this.lockoutData.description, - this.lockoutData.maxAttempts, - this.lockoutData.showLockOutFailures, - ).then(() => { - this.router.navigate(['org']); - }).catch(error => { - this.toast.showError(error); - }); + public get isDefault(): boolean { + if (this.lockoutData && this.serviceType === PolicyComponentServiceType.MGMT) { + return (this.lockoutData as PasswordLockoutPolicyView.AsObject).pb_default; + } else { + return false; } } } diff --git a/console/src/app/modules/policies/policy-component-action.enum.ts b/console/src/app/modules/policies/policy-component-action.enum.ts deleted file mode 100644 index 9e5b4835c1..0000000000 --- a/console/src/app/modules/policies/policy-component-action.enum.ts +++ /dev/null @@ -1,5 +0,0 @@ - -export enum PolicyComponentAction { - CREATE = 'create', - MODIFY = 'modify', -} diff --git a/console/src/app/modules/policies/policy-component-types.enum.ts b/console/src/app/modules/policies/policy-component-types.enum.ts index dc8a2b5670..c976011e60 100644 --- a/console/src/app/modules/policies/policy-component-types.enum.ts +++ b/console/src/app/modules/policies/policy-component-types.enum.ts @@ -4,6 +4,7 @@ export enum PolicyComponentType { COMPLEXITY = 'complexity', IAM = 'iam', LOGIN = 'login', + LABEL = 'label', } export enum PolicyComponentServiceType { MGMT = 'mgmt', diff --git a/console/src/app/modules/policy-grid/policy-grid.component.html b/console/src/app/modules/policy-grid/policy-grid.component.html new file mode 100644 index 0000000000..28e17b988a --- /dev/null +++ b/console/src/app/modules/policy-grid/policy-grid.component.html @@ -0,0 +1,109 @@ +

{{'POLICY.TITLE' | translate}}

+ +

{{'POLICY.DESCRIPTION' | translate}}

+ +
+ +
+
+ +
+
+ {{'POLICY.PWD_COMPLEXITY.TITLE' | translate}} + +
+ +

+ {{'POLICY.PWD_COMPLEXITY.DESCRIPTION' | translate}}

+ + +
+ +
+
+
+ + +
+
+ +
+
+ {{'POLICY.IAM_POLICY.TITLE' | translate}} + +
+ +

+ {{'POLICY.IAM_POLICY.DESCRIPTION' | translate}}

+ + +
+ + + +
+
+
+ + +
+
+ +
+
+ {{'POLICY.LOGIN_POLICY.TITLE' | translate}} + +
+ + +

+ {{'POLICY.LOGIN_POLICY.DESCRIPTION' | translate}}

+
+ + +
+ + + +
+
+
+ + + +
+
+ +
+
+ {{'POLICY.LABEL.TITLE' | translate}} + +
+ +

+ {{'POLICY.LABEL.DESCRIPTION' | translate}}

+ + +
+ + + +
+
+
+
+
\ No newline at end of file diff --git a/console/src/app/pages/orgs/policy-grid/policy-grid.component.scss b/console/src/app/modules/policy-grid/policy-grid.component.scss similarity index 84% rename from console/src/app/pages/orgs/policy-grid/policy-grid.component.scss rename to console/src/app/modules/policy-grid/policy-grid.component.scss index 39a8f5e65b..ed25548eca 100644 --- a/console/src/app/pages/orgs/policy-grid/policy-grid.component.scss +++ b/console/src/app/modules/policy-grid/policy-grid.component.scss @@ -3,17 +3,17 @@ h1 { } .top-desc { - color: #8795a1; + color: var(--grey); } .row-lyt { display: flex; flex-wrap: wrap; - margin: 0 -1rem; + margin: 0 -.5rem; .p-item { - flex-basis: 300px; - margin: 1rem; + flex-basis: 290px; + margin: .5rem; display: flex; flex-direction: column; min-height: 200px; @@ -38,6 +38,7 @@ h1 { font-size: 2.5rem; height: 2.5rem; line-height: 2.5rem; + color: white; } } @@ -46,7 +47,7 @@ h1 { align-items: center; span { - font-size: 1.2rem; + font-size: 1.1rem; } .icon { @@ -56,8 +57,8 @@ h1 { } .desc { - font-size: .9rem; - color: #8795a1; + font-size: 14px; + color: var(--grey); } .fill-space { @@ -70,7 +71,6 @@ h1 { button { margin-right: 1rem; - border-radius: .5rem; } } } diff --git a/console/src/app/pages/orgs/policy-grid/policy-grid.component.spec.ts b/console/src/app/modules/policy-grid/policy-grid.component.spec.ts similarity index 100% rename from console/src/app/pages/orgs/policy-grid/policy-grid.component.spec.ts rename to console/src/app/modules/policy-grid/policy-grid.component.spec.ts diff --git a/console/src/app/modules/policy-grid/policy-grid.component.ts b/console/src/app/modules/policy-grid/policy-grid.component.ts new file mode 100644 index 0000000000..f5d0d3efba --- /dev/null +++ b/console/src/app/modules/policy-grid/policy-grid.component.ts @@ -0,0 +1,19 @@ +import { Component, Input } from '@angular/core'; +import { PolicyComponentType } from 'src/app/modules/policies/policy-component-types.enum'; + +export enum PolicyGridType { + ORG, + IAM, +} + +@Component({ + selector: 'app-policy-grid', + templateUrl: './policy-grid.component.html', + styleUrls: ['./policy-grid.component.scss'], +}) +export class PolicyGridComponent { + @Input() public type!: PolicyGridType; + public PolicyComponentType: any = PolicyComponentType; + public PolicyGridType: any = PolicyGridType; + constructor() { } +} diff --git a/console/src/app/modules/policy-grid/policy-grid.module.ts b/console/src/app/modules/policy-grid/policy-grid.module.ts new file mode 100644 index 0000000000..6dd7f7d3a5 --- /dev/null +++ b/console/src/app/modules/policy-grid/policy-grid.module.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { RouterModule } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; + +import { PolicyGridComponent } from './policy-grid.component'; + +@NgModule({ + declarations: [PolicyGridComponent], + imports: [ + CommonModule, + HasRolePipeModule, + HasRoleModule, + TranslateModule, + RouterModule, + MatButtonModule, + MatIconModule, + ], + exports: [ + PolicyGridComponent, + ], +}) +export class PolicyGridModule { } diff --git a/console/src/app/modules/project-members/project-members.component.html b/console/src/app/modules/project-members/project-members.component.html index 742237293a..7d845b04fb 100644 --- a/console/src/app/modules/project-members/project-members.component.html +++ b/console/src/app/modules/project-members/project-members.component.html @@ -1,96 +1,26 @@ - - + - - + add{{ 'ACTIONS.NEW' | translate }} - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.USERID' | translate }} - {{member.userId}} {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'ROLESLABEL' | translate }} - - {{ 'ROLESLABEL' | translate }} - - - {{ role }} - - - -
- - - -
-
-
\ No newline at end of file + +
+ \ No newline at end of file diff --git a/console/src/app/modules/project-members/project-members.component.scss b/console/src/app/modules/project-members/project-members.component.scss index c879898913..b6256fca23 100644 --- a/console/src/app/modules/project-members/project-members.component.scss +++ b/console/src/app/modules/project-members/project-members.component.scss @@ -1,50 +1,7 @@ -.icon-button { +.del-button { margin-right: .5rem; } -.add-button { - border-radius: .5rem; -} - -.table-wrapper { - overflow-x: auto; - - .table, - .paginator { - width: 100%; - - td, - th { - padding: .5rem; - - &:first-child { - padding-left: 0; - padding-right: 1rem; - } - - &:last-child { - padding-right: 0; - } - } - - .action { - width: 40px; - } - - .data-row { - &:hover { - background-color: #ffffff05; - } - } - - .selection { - width: 50px; - max-width: 50px; - } - } -} - -.pointer { - outline: none; - cursor: pointer; +:root { + width: 100%; } diff --git a/console/src/app/modules/project-members/project-members.component.ts b/console/src/app/modules/project-members/project-members.component.ts index 47f985ffef..5cde0de798 100644 --- a/console/src/app/modules/project-members/project-members.component.ts +++ b/console/src/app/modules/project-members/project-members.component.ts @@ -1,12 +1,18 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { Component, ViewChild } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; -import { MatTable } from '@angular/material/table'; import { ActivatedRoute } from '@angular/router'; import { take } from 'rxjs/operators'; -import { ProjectGrantView, ProjectMember, ProjectType, ProjectView, UserView } from 'src/app/proto/generated/management_pb'; +import { + ProjectGrantMemberView, + ProjectGrantView, + ProjectMember, + ProjectMemberView, + ProjectType, + ProjectView, + UserView, +} from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -23,18 +29,14 @@ export class ProjectMembersComponent { public INITIALPAGESIZE: number = 25; public project!: ProjectView.AsObject | ProjectGrantView.AsObject; public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED; - public disabled: boolean = false; public grantId: string = ''; public projectName: string = ''; - @ViewChild(MatPaginator) public paginator!: MatPaginator; - @ViewChild(MatTable) public table!: MatTable; public dataSource!: ProjectMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); public memberRoleOptions: string[] = []; - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'userId', 'firstname', 'lastname', 'username', 'email', 'roles']; - + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; constructor( private mgmtService: ManagementService, private dialog: MatDialog, @@ -53,6 +55,16 @@ export class ProjectMembersComponent { this.projectName = this.project.name; this.dataSource = new ProjectMembersDataSource(this.mgmtService); this.dataSource.loadMembers(this.project.projectId, this.projectType, 0, this.INITIALPAGESIZE); + + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + this.project.projectId, + this.projectType, + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + this.grantId, + ); + }; }); } else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) { this.mgmtService.GetGrantedProjectByID(params.projectid, params.grantid).then(project => { @@ -65,6 +77,16 @@ export class ProjectMembersComponent { this.INITIALPAGESIZE, this.grantId, ); + + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + this.project.projectId, + this.projectType, + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + this.grantId, + ); + }; }); } }); @@ -88,7 +110,7 @@ export class ProjectMembersComponent { } public removeProjectMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { + Promise.all(this.selection.map(member => { if (this.projectType === ProjectType.PROJECTTYPE_OWNED) { return this.mgmtService.RemoveProjectMember(this.project.projectId, member.userId).then(() => { this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true); @@ -105,21 +127,32 @@ export class ProjectMembersComponent { } })).then(() => { setTimeout(() => { - this.changePage(); + this.changePage.emit(); }, 1000); }); } - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } - - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); + public removeProjectMember(member: ProjectMemberView.AsObject | ProjectGrantMemberView.AsObject): void { + if (this.projectType === ProjectType.PROJECTTYPE_OWNED) { + this.mgmtService.RemoveProjectMember(this.project.projectId, member.userId).then(() => { + setTimeout(() => { + this.changePage.emit(); + }, 1000); + this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true); + }).catch(error => { + this.toast.showError(error); + }); + } else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) { + this.mgmtService.RemoveProjectGrantMember(this.project.projectId, this.grantId, + member.userId).then(() => { + setTimeout(() => { + this.changePage.emit(); + }, 1000); + this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true); + }).catch(error => { + this.toast.showError(error); + }); + } } public openAddMember(): void { @@ -146,7 +179,7 @@ export class ProjectMembersComponent { } })).then(() => { setTimeout(() => { - this.changePage(); + this.changePage.emit(); }, 1000); this.toast.showInfo('PROJECT.TOAST.MEMBERSADDED', true); }).catch(error => { @@ -160,7 +193,7 @@ export class ProjectMembersComponent { updateRoles(member: ProjectMember.AsObject, selectionChange: MatSelectChange): void { if (this.projectType === ProjectType.PROJECTTYPE_OWNED) { this.mgmtService.ChangeProjectMember(this.project.projectId, member.userId, selectionChange.value) - .then((newmember: ProjectMember) => { + .then((_: ProjectMember) => { this.toast.showInfo('PROJECT.TOAST.MEMBERCHANGED', true); }).catch(error => { this.toast.showError(error); @@ -168,21 +201,11 @@ export class ProjectMembersComponent { } else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) { this.mgmtService.ChangeProjectGrantMember(this.project.projectId, this.grantId, member.userId, selectionChange.value) - .then((newmember: ProjectMember) => { + .then((_: ProjectMember) => { this.toast.showInfo('PROJECT.TOAST.MEMBERCHANGED', true); }).catch(error => { this.toast.showError(error); }); } } - - public changePage(event?: PageEvent): void { - this.dataSource.loadMembers( - this.project.projectId, - this.projectType, - event?.pageIndex ?? this.paginator.pageIndex, - event?.pageSize ?? this.paginator.pageSize, - this.grantId, - ); - } } diff --git a/console/src/app/modules/project-members/project-members.module.ts b/console/src/app/modules/project-members/project-members.module.ts index d845809721..51a0e0b0e6 100644 --- a/console/src/app/modules/project-members/project-members.module.ts +++ b/console/src/app/modules/project-members/project-members.module.ts @@ -1,25 +1,16 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; -import { RefreshTableModule } from '../refresh-table/refresh-table.module'; +import { MemberCreateDialogModule } from '../add-member-dialog/member-create-dialog.module'; import { ProjectMembersRoutingModule } from './project-members-routing.module'; import { ProjectMembersComponent } from './project-members.component'; @@ -28,26 +19,16 @@ import { ProjectMembersComponent } from './project-members.component'; imports: [ ProjectMembersRoutingModule, CommonModule, - MatAutocompleteModule, HasRoleModule, - MatChipsModule, MatButtonModule, - MatFormFieldModule, - MatSelectModule, - MatCheckboxModule, MatIconModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, MatTooltipModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, TranslateModule, - HasRolePipeModule, - RefreshTableModule, DetailLayoutModule, MatDialogModule, + MembersTableModule, + HasRolePipeModule, + MemberCreateDialogModule, ], }) export class ProjectMembersModule { } diff --git a/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss b/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss index c34bf09039..0cc56d5e92 100644 --- a/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss +++ b/console/src/app/modules/project-roles/project-role-detail/project-role-detail.component.scss @@ -3,7 +3,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -19,8 +19,4 @@ .ok-button { margin-left: .5rem; } - - button { - border-radius: .5rem; - } } diff --git a/console/src/app/modules/project-roles/project-roles.component.html b/console/src/app/modules/project-roles/project-roles.component.html index 8fed3f14b4..2bcc9074f8 100644 --- a/console/src/app/modules/project-roles/project-roles.component.html +++ b/console/src/app/modules/project-roles/project-roles.component.html @@ -1,5 +1,5 @@ -
- \ No newline at end of file +
+ +
\ No newline at end of file diff --git a/console/src/app/modules/refresh-table/refresh-table.component.scss b/console/src/app/modules/refresh-table/refresh-table.component.scss index e15f27cf1d..7988eb57f1 100644 --- a/console/src/app/modules/refresh-table/refresh-table.component.scss +++ b/console/src/app/modules/refresh-table/refresh-table.component.scss @@ -9,7 +9,7 @@ .desc { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .count { @@ -20,6 +20,7 @@ .spinner { margin-top: 2px; margin-bottom: 1px; + margin-right: 1rem; } .fill-space { @@ -30,3 +31,8 @@ margin-right: .5rem; } } + +// .table-wrapper { +// width: 100%; +// overflow-x: auto; +// } diff --git a/console/src/app/modules/refresh-table/refresh-table.component.ts b/console/src/app/modules/refresh-table/refresh-table.component.ts index 02618c9c18..10078ab2e5 100644 --- a/console/src/app/modules/refresh-table/refresh-table.component.ts +++ b/console/src/app/modules/refresh-table/refresh-table.component.ts @@ -33,7 +33,7 @@ export class RefreshTableComponent implements OnInit { @Input() public dataSize: number = 0; @Input() public emitRefreshAfterTimeoutInMs: number = 0; @Input() public loading: boolean = false; - @Input() public emitRefreshOnPreviousRoute: string = ''; + @Input() public emitRefreshOnPreviousRoutes: string[] = []; @Output() public refreshed: EventEmitter = new EventEmitter(); constructor(private refreshService: RefreshService) { } @@ -45,7 +45,8 @@ export class RefreshTableComponent implements OnInit { }, this.emitRefreshAfterTimeoutInMs); } - if (this.emitRefreshOnPreviousRoute && this.refreshService.previousUrls.includes(this.emitRefreshOnPreviousRoute)) { + if (this.emitRefreshOnPreviousRoutes.length && this.refreshService.previousUrls + .some(url => this.emitRefreshOnPreviousRoutes.includes(url))) { setTimeout(() => { console.log('refresh now'); this.emitRefresh(); diff --git a/console/src/app/modules/refresh-table/refresh-table.module.ts b/console/src/app/modules/refresh-table/refresh-table.module.ts index 8b0e64b995..90ad165ca2 100644 --- a/console/src/app/modules/refresh-table/refresh-table.module.ts +++ b/console/src/app/modules/refresh-table/refresh-table.module.ts @@ -6,13 +6,12 @@ import { MatIconModule } from '@angular/material/icon'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { RefreshTableComponent } from './refresh-table.component'; - @NgModule({ declarations: [RefreshTableComponent], imports: [ diff --git a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts index e61b0c15c3..6847950379 100644 --- a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts +++ b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.component.ts @@ -1,10 +1,10 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { MatAutocomplete, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatChipInputEvent } from '@angular/material/chips'; -import { forkJoin, from } from 'rxjs'; -import { debounceTime, switchMap, tap } from 'rxjs/operators'; +import { forkJoin, from, Subject } from 'rxjs'; +import { debounceTime, switchMap, takeUntil, tap } from 'rxjs/operators'; import { ProjectGrantSearchResponse, ProjectGrantView, @@ -27,7 +27,7 @@ export enum ProjectAutocompleteType { templateUrl: './search-project-autocomplete.component.html', styleUrls: ['./search-project-autocomplete.component.scss'], }) -export class SearchProjectAutocompleteComponent { +export class SearchProjectAutocompleteComponent implements OnDestroy { public selectable: boolean = true; public removable: boolean = true; public addOnBlur: boolean = true; @@ -47,9 +47,12 @@ export class SearchProjectAutocompleteComponent { | ProjectView.AsObject | ProjectView.AsObject[] > = new EventEmitter(); + + private unsubscribed$: Subject = new Subject(); constructor(private mgmtService: ManagementService) { this.myControl.valueChanges .pipe( + takeUntil(this.unsubscribed$), debounceTime(200), tap(() => this.isLoading = true), switchMap(value => { @@ -93,6 +96,10 @@ export class SearchProjectAutocompleteComponent { }); } + public ngOnDestroy(): void { + this.unsubscribed$.next(); + } + public displayFn(project?: any): string | undefined { return (project && project.projectName) ? `${project.projectName}` : (project && project.name) ? `${project.name}` : undefined; diff --git a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts index 0a563812ed..202651628a 100644 --- a/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts +++ b/console/src/app/modules/search-project-autocomplete/search-project-autocomplete.module.ts @@ -8,12 +8,15 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { TranslateModule } from '@ngx-translate/core'; import { SearchProjectAutocompleteComponent } from './search-project-autocomplete.component'; @NgModule({ - declarations: [SearchProjectAutocompleteComponent], + declarations: [ + SearchProjectAutocompleteComponent, + ], imports: [ CommonModule, MatAutocompleteModule, @@ -26,6 +29,7 @@ import { SearchProjectAutocompleteComponent } from './search-project-autocomplet MatProgressSpinnerModule, FormsModule, TranslateModule, + MatSelectModule, ], exports: [ SearchProjectAutocompleteComponent, diff --git a/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts b/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts index 3bcde33236..f97568a0aa 100644 --- a/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts +++ b/console/src/app/modules/search-roles-autocomplete/search-roles-autocomplete.component.ts @@ -1,10 +1,10 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { MatAutocomplete, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatChipInputEvent } from '@angular/material/chips'; -import { from } from 'rxjs'; -import { debounceTime, switchMap, tap } from 'rxjs/operators'; +import { from, Subject } from 'rxjs'; +import { debounceTime, switchMap, takeUntil, tap } from 'rxjs/operators'; import { ProjectRole, ProjectRoleSearchKey, @@ -12,7 +12,6 @@ import { SearchMethod, } from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; -import { ToastService } from 'src/app/services/toast.service'; @Component({ @@ -20,7 +19,7 @@ import { ToastService } from 'src/app/services/toast.service'; templateUrl: './search-roles-autocomplete.component.html', styleUrls: ['./search-roles-autocomplete.component.scss'], }) -export class SearchRolesAutocompleteComponent { +export class SearchRolesAutocompleteComponent implements OnDestroy { public selectable: boolean = true; public removable: boolean = true; public addOnBlur: boolean = true; @@ -35,9 +34,12 @@ export class SearchRolesAutocompleteComponent { @Input() public projectId: string = ''; @Input() public singleOutput: boolean = false; @Output() public selectionChanged: EventEmitter = new EventEmitter(); - constructor(private mgmtService: ManagementService, private toast: ToastService) { + + private unsubscribed$: Subject = new Subject(); + constructor(private mgmtService: ManagementService) { this.myControl.valueChanges .pipe( + takeUntil(this.unsubscribed$), debounceTime(200), tap(() => this.isLoading = true), switchMap(value => { @@ -55,6 +57,10 @@ export class SearchRolesAutocompleteComponent { }); } + public ngOnDestroy(): void { + this.unsubscribed$.next(); + } + public displayFn(project?: ProjectRole.AsObject): string | undefined { return project ? `${project.displayName}` : undefined; } diff --git a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html index cf68feb058..75154b1b82 100644 --- a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html +++ b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.html @@ -1,5 +1,5 @@
- + Organizations User Loginname {{user.preferredLoginName}} + + + {{'USER.TARGET.SELF'| translate}} + {{'USER.TARGET.CLICKHERE' | translate}} + -
+
Global User Loginname + + {{(target == UserTarget.SELF ? 'USER.TARGET.SELF' : 'USER.TARGET.EXTERNAL') | translate}} + {{'USER.TARGET.CLICKHERE' | translate}} +
-
+
{{'USER.SEARCH.FOUND' | translate}}:
+
+ + + +
+ +
+
+
+ {{user.preferredLoginName}} -
- -

{{(target == UserTarget.SELF ? 'USER.TARGET.SELF' : 'USER.TARGET.EXTERNAL') | translate}} - {{'USER.TARGET.CLICKHERE' | translate}} -

\ No newline at end of file diff --git a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss index bbf315323d..753bfe830a 100644 --- a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss +++ b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.scss @@ -3,11 +3,6 @@ } .target-desc { - color: #8795a1; - font-size: .8rem; - margin: 0; - margin-bottom: 1rem; - a { color: #4072b4; @@ -37,12 +32,35 @@ font-size: .8rem; } -.found-user-row { - display: flex; - align-items: center; +.found { + margin: .5rem 0; + background: #4072b410; + border-radius: .5rem; + padding: .5rem; + + .found-user-row { + padding: .5rem 0; + display: flex; + align-items: center; + min-height: 56px; + + button { + visibility: hidden; + } + + &:hover { + button { + visibility: visible; + } + } + } + + .found-label { + font-size: .9rem; + color: var(--grey); + } } -.found-label { - font-size: .9rem; - color: #8795a1; +.circle { + margin-right: .5rem; } diff --git a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.ts b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.ts index f6e9f553a0..d4809db3e4 100644 --- a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.ts +++ b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.component.ts @@ -1,5 +1,15 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { + AfterContentChecked, + ChangeDetectorRef, + Component, + ElementRef, + EventEmitter, + Input, + OnInit, + Output, + ViewChild, +} from '@angular/core'; import { FormControl } from '@angular/forms'; import { MatAutocomplete, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatChipInputEvent } from '@angular/material/chips'; @@ -19,7 +29,7 @@ export enum UserTarget { templateUrl: './search-user-autocomplete.component.html', styleUrls: ['./search-user-autocomplete.component.scss'], }) -export class SearchUserAutocompleteComponent { +export class SearchUserAutocompleteComponent implements OnInit, AfterContentChecked { public selectable: boolean = true; public removable: boolean = true; public addOnBlur: boolean = true; @@ -32,7 +42,7 @@ export class SearchUserAutocompleteComponent { @Input() public users: Array = []; public filteredUsers: Array = []; public isLoading: boolean = false; - public target: UserTarget = UserTarget.SELF; + @Input() public target: UserTarget = UserTarget.SELF; public hint: string = ''; public UserTarget: any = UserTarget; @ViewChild('usernameInput') public usernameInput!: ElementRef; @@ -41,8 +51,19 @@ export class SearchUserAutocompleteComponent { @Input() public singleOutput: boolean = false; private unsubscribed$: Subject = new Subject(); - constructor(private userService: ManagementService, private toast: ToastService) { - this.getFilteredResults(); + constructor(private userService: ManagementService, private toast: ToastService, private cdref: ChangeDetectorRef) { } + + public ngOnInit(): void { + if (this.target === UserTarget.EXTERNAL) { + this.filteredUsers = []; + this.unsubscribed$.next(); // clear old subscription + } else if (this.target === UserTarget.SELF) { + this.getFilteredResults(); // new subscription + } + } + + public ngAfterContentChecked(): void { + this.cdref.detectChanges(); } private getFilteredResults(): void { @@ -118,8 +139,12 @@ export class SearchUserAutocompleteComponent { } else { this.users = [this.filteredUsers[index]]; } - this.selectionChanged.emit(this.users); + if (this.singleOutput) { + this.selectionChanged.emit(this.users[0]); + } else { + this.selectionChanged.emit(this.users); + } this.usernameInput.nativeElement.value = ''; this.myControl.setValue(null); } @@ -139,8 +164,13 @@ export class SearchUserAutocompleteComponent { public getGlobalUser(): void { this.userService.GetUserByLoginNameGlobal(this.globalLoginNameControl.value).then(user => { - this.users = [user.toObject()]; - this.selectionChanged.emit(this.users); + if (this.singleOutput) { + this.users = [user.toObject()]; + this.selectionChanged.emit(this.users[0]); + } else { + this.users.push(user.toObject()); + this.selectionChanged.emit(this.users); + } }).catch(error => { this.toast.showError(error); }); diff --git a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts index 7a30876e94..cfe7443f73 100644 --- a/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts +++ b/console/src/app/modules/search-user-autocomplete/search-user-autocomplete.module.ts @@ -8,8 +8,10 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; import { TranslateModule } from '@ngx-translate/core'; +import { AvatarModule } from '../avatar/avatar.module'; import { SearchUserAutocompleteComponent } from './search-user-autocomplete.component'; @@ -27,6 +29,8 @@ import { SearchUserAutocompleteComponent } from './search-user-autocomplete.comp MatProgressSpinnerModule, FormsModule, TranslateModule, + MatSelectModule, + AvatarModule, ], exports: [SearchUserAutocompleteComponent], }) diff --git a/console/src/app/modules/user-grants/user-grants-datasource.ts b/console/src/app/modules/user-grants/user-grants-datasource.ts index 002568f572..787c51e258 100644 --- a/console/src/app/modules/user-grants/user-grants-datasource.ts +++ b/console/src/app/modules/user-grants/user-grants-datasource.ts @@ -13,7 +13,7 @@ import { import { ManagementService } from 'src/app/services/mgmt.service'; export enum UserGrantContext { - // AUTHUSER = 'authuser', + NONE = 'none', USER = 'user', OWNED_PROJECT = 'owned', GRANTED_PROJECT = 'granted', @@ -42,14 +42,13 @@ export class UserGrantsDataSource extends DataSource { }, queries?: UserGrantSearchQuery[], ): void { - const offset = pageIndex * pageSize; - switch (context) { case UserGrantContext.USER: if (data && data.userId) { this.loadingSubject.next(true); const userfilter = new UserGrantSearchQuery(); userfilter.setKey(UserGrantSearchKey.USERGRANTSEARCHKEY_USER_ID); + userfilter.setMethod(SearchMethod.SEARCHMETHOD_EQUALS); userfilter.setValue(data.userId); if (queries) { queries.push(userfilter); @@ -57,7 +56,7 @@ export class UserGrantsDataSource extends DataSource { queries = [userfilter]; } - const promise = this.userService.SearchUserGrants(10, 0, queries); + const promise = this.userService.SearchUserGrants(pageSize, pageSize * pageIndex, queries); this.loadResponse(promise); } break; @@ -66,6 +65,7 @@ export class UserGrantsDataSource extends DataSource { this.loadingSubject.next(true); const projectfilter = new UserGrantSearchQuery(); projectfilter.setKey(UserGrantSearchKey.USERGRANTSEARCHKEY_PROJECT_ID); + projectfilter.setMethod(SearchMethod.SEARCHMETHOD_EQUALS); projectfilter.setValue(data.projectId); if (queries) { queries.push(projectfilter); @@ -73,7 +73,7 @@ export class UserGrantsDataSource extends DataSource { queries = [projectfilter]; } - const promise1 = this.userService.SearchUserGrants(10, 0, queries); + const promise1 = this.userService.SearchUserGrants(pageSize, pageSize * pageIndex, queries); this.loadResponse(promise1); } break; @@ -97,10 +97,15 @@ export class UserGrantsDataSource extends DataSource { queries = [projectfilter, grantquery]; } - const promise2 = this.userService.SearchUserGrants(10, 0, queries); + const promise2 = this.userService.SearchUserGrants(pageSize, pageSize * pageIndex, queries); this.loadResponse(promise2); } break; + default: + this.loadingSubject.next(true); + const promise3 = this.userService.SearchUserGrants(pageSize, pageSize * pageIndex, []); + this.loadResponse(promise3); + break; } } diff --git a/console/src/app/modules/user-grants/user-grants.component.html b/console/src/app/modules/user-grants/user-grants.component.html index 15c0e1bf73..c8a0721d92 100644 --- a/console/src/app/modules/user-grants/user-grants.component.html +++ b/console/src/app/modules/user-grants/user-grants.component.html @@ -1,12 +1,12 @@ - + add{{ 'GRANTS.ADD_BTN' | translate }} @@ -14,75 +14,81 @@ - - - - - - - +
- - - + {{ 'PROJECT.GRANT.USER' | translate }} + {{grant?.displayName}} {{ 'PROJECT.GRANT.GRANTEDORGDOMAIN' | translate }} + {{grant.orgName}} {{ 'PROJECT.GRANT.PROJECTNAME' | translate }} + {{grant.projectName}} {{ 'PROJECT.GRANT.CREATIONDATE' | translate }} + {{grant.creationDate | timestampToDate | localizedDate: 'dd. MMM, HH:mm' }} {{ 'PROJECT.GRANT.CHANGEDATE' | translate }} + {{grant.changeDate | timestampToDate | localizedDate: 'dd. MMM, HH:mm' }} {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} - - {{'PROJECT.GRANT.NOROLES' | translate}} - {{ (role.length>8)? (role | slice:0:8)+'..':(role) }} + + +
+ {{ role }} + +
+
- - - {{ (role.length>6)? (role | slice:0:6)+'..':(role) }} - - + + *ngIf="loadedProjectId && loadedProjectId === grant.projectId"> {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} - {{role.key}} @@ -91,10 +97,13 @@ - - + + {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} - {{role}} @@ -106,11 +115,11 @@
-
diff --git a/console/src/app/modules/user-grants/user-grants.component.scss b/console/src/app/modules/user-grants/user-grants.component.scss index ce7533823b..6587614d4b 100644 --- a/console/src/app/modules/user-grants/user-grants.component.scss +++ b/console/src/app/modules/user-grants/user-grants.component.scss @@ -1,8 +1,3 @@ - -.add-button { - border-radius: .5rem; -} - .table-wrapper { overflow: auto; @@ -30,20 +25,38 @@ width: 50px; max-width: 50px; } + } +} - .role { - display: inline-block; - margin: .25rem; +.no-roles { + font-size: 13px; + color: var(--grey); +} + +.flex-row { + display: flex; + flex-direction: column; + max-width: 400px; + + .role { + display: block; + margin: .25rem; + font-size: 14px; + text-overflow: ellipsis; + overflow: hidden; + } + + button { + margin: .5rem 0; + max-width: 120px; + + i { + font-size: 1.2rem; + margin-bottom: 5px; } } } -.pointer { - outline: none; - cursor: pointer; -} - -.no-roles { - font-size: 14px; - color: #8795a1; +.fill-space { + flex: 1; } diff --git a/console/src/app/modules/user-grants/user-grants.component.ts b/console/src/app/modules/user-grants/user-grants.component.ts index a01e0a7d57..a2b67d2be1 100644 --- a/console/src/app/modules/user-grants/user-grants.component.ts +++ b/console/src/app/modules/user-grants/user-grants.component.ts @@ -4,14 +4,7 @@ import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; import { MatTable } from '@angular/material/table'; import { tap } from 'rxjs/operators'; -import { - ProjectRoleView, - SearchMethod, - UserGrant, - UserGrantSearchKey, - UserGrantSearchQuery, - UserGrantView, -} from 'src/app/proto/generated/management_pb'; +import { ProjectRoleView, UserGrant, UserGrantView } from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -23,8 +16,9 @@ import { UserGrantContext, UserGrantsDataSource } from './user-grants-datasource styleUrls: ['./user-grants.component.scss'], }) export class UserGrantsComponent implements OnInit, AfterViewInit { - @Input() context: UserGrantContext = UserGrantContext.USER; - @Input() refreshOnPreviousRoute: string = ''; + public INITIAL_PAGE_SIZE: number = 50; + @Input() context: UserGrantContext = UserGrantContext.NONE; + @Input() refreshOnPreviousRoutes: string[] = []; public grants: UserGrantView.AsObject[] = []; public dataSource!: UserGrantsDataSource; @@ -32,8 +26,8 @@ export class UserGrantsComponent implements OnInit, AfterViewInit { @ViewChild(MatPaginator) public paginator!: MatPaginator; @ViewChild(MatTable) public table!: MatTable; - @Input() allowCreate: boolean = false; - @Input() allowDelete: boolean = false; + @Input() disableWrite: boolean = false; + @Input() disableDelete: boolean = false; @Input() userId: string = ''; @Input() projectId: string = ''; @@ -80,15 +74,11 @@ export class UserGrantsComponent implements OnInit, AfterViewInit { this.routerLink = ['/grant-create', 'user', this.userId]; } break; - default: + case UserGrantContext.NONE: this.routerLink = ['/grant-create']; } - this.dataSource.loadGrants(this.context, 0, 25, { - projectId: this.projectId, - grantId: this.grantId, - userId: this.userId, - }); + this.loadGrantsPage(); } public ngAfterViewInit(): void { @@ -102,11 +92,12 @@ export class UserGrantsComponent implements OnInit, AfterViewInit { private loadGrantsPage(): void { this.dataSource.loadGrants( this.context, - this.paginator.pageIndex, - this.paginator.pageSize, + this.paginator?.pageIndex ?? 0, + this.paginator?.pageSize ?? this.INITIAL_PAGE_SIZE, { projectId: this.projectId, grantId: this.grantId, + userId: this.userId, }, ); } @@ -125,7 +116,7 @@ export class UserGrantsComponent implements OnInit, AfterViewInit { public getGrantRoleOptions(grantId: string, projectId: string): void { this.mgmtService.GetGrantedProjectByID(projectId, grantId).then(resp => { - this.loadedGrantId = projectId; + this.loadedGrantId = grantId; this.grantRoleOptions = resp.toObject().roleKeysList; }).catch(error => { this.toast.showError(error); @@ -140,33 +131,12 @@ export class UserGrantsComponent implements OnInit, AfterViewInit { } updateRoles(grant: UserGrant.AsObject, selectionChange: MatSelectChange): void { - switch (this.context) { - case UserGrantContext.OWNED_PROJECT: - if (grant.id && grant.projectId) { - this.userService.UpdateUserGrant(grant.id, grant.userId, selectionChange.value) - .then(() => { - this.toast.showInfo('GRANTS.TOAST.UPDATED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - break; - case UserGrantContext.GRANTED_PROJECT: - if (this.grantId && this.projectId) { - const projectQuery: UserGrantSearchQuery = new UserGrantSearchQuery(); - projectQuery.setKey(UserGrantSearchKey.USERGRANTSEARCHKEY_PROJECT_ID); - projectQuery.setMethod(SearchMethod.SEARCHMETHOD_EQUALS); - projectQuery.setValue(this.projectId); - this.userService.UpdateUserGrant( - grant.id, grant.userId, selectionChange.value) - .then(() => { - this.toast.showInfo('GRANTS.TOAST.UPDATED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - break; - } + this.userService.UpdateUserGrant(grant.id, grant.userId, selectionChange.value) + .then(() => { + this.toast.showInfo('GRANTS.TOAST.UPDATED', true); + }).catch(error => { + this.toast.showError(error); + }); } deleteGrantSelection(): void { diff --git a/console/src/app/modules/user-grants/user-grants.module.ts b/console/src/app/modules/user-grants/user-grants.module.ts index f1b7c656a6..56d2626121 100644 --- a/console/src/app/modules/user-grants/user-grants.module.ts +++ b/console/src/app/modules/user-grants/user-grants.module.ts @@ -13,9 +13,9 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { AvatarModule } from '../avatar/avatar.module'; import { RefreshTableModule } from '../refresh-table/refresh-table.module'; diff --git a/console/src/app/modules/warn-dialog/warn-dialog.component.html b/console/src/app/modules/warn-dialog/warn-dialog.component.html index c089810b7b..5674b88c9b 100644 --- a/console/src/app/modules/warn-dialog/warn-dialog.component.html +++ b/console/src/app/modules/warn-dialog/warn-dialog.component.html @@ -1,6 +1,6 @@ -{{data.titleKey | translate}} +{{data.titleKey | translate: data.titleParam}}
-

{{data.descriptionKey | translate}}

+

{{data.descriptionKey | translate: data.descriptionParam}}

- - - - add{{ 'ACTIONS.NEW' | translate }} - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'ROLESLABEL' | translate }} - - {{ 'ROLESLABEL' | translate }} - - - {{ role }} - - - -
- - - -
- - \ No newline at end of file + + + + + + add{{ 'ACTIONS.NEW' | translate }} + + + + +
\ No newline at end of file diff --git a/console/src/app/pages/iam/iam-members/iam-members.component.scss b/console/src/app/pages/iam/iam-members/iam-members.component.scss index 1535341168..b8780b1717 100644 --- a/console/src/app/pages/iam/iam-members/iam-members.component.scss +++ b/console/src/app/pages/iam/iam-members/iam-members.component.scss @@ -1,47 +1,7 @@ -.add-button { - border-radius: .5rem; +.wrapp { + width: 100% !important; } -.table-wrapper { - overflow: auto; - width: 100%; - - .table, - .paginator { - width: 100%; - - td, - th { - padding: .5rem; - - &:first-child { - padding-left: 0; - padding-right: 1rem; - } - - &:last-child { - padding-right: 0; - } - } - - .action { - width: 40px; - } - - .data-row { - &:hover { - background-color: #ffffff05; - } - } - - .selection { - width: 50px; - max-width: 50px; - } - } -} - -.pointer { - outline: none; - cursor: pointer; +.del-button { + margin-right: .5rem; } diff --git a/console/src/app/pages/iam/iam-members/iam-members.component.ts b/console/src/app/pages/iam/iam-members/iam-members.component.ts index 90bb70b99d..4ce1a5a511 100644 --- a/console/src/app/pages/iam/iam-members/iam-members.component.ts +++ b/console/src/app/pages/iam/iam-members/iam-members.component.ts @@ -1,10 +1,7 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { AfterViewInit, Component, ViewChild } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator } from '@angular/material/paginator'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; -import { MatTable } from '@angular/material/table'; -import { tap } from 'rxjs/operators'; import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component'; import { IamMember, IamMemberView } from 'src/app/proto/generated/admin_pb'; import { ProjectMember, ProjectType, UserView } from 'src/app/proto/generated/management_pb'; @@ -18,17 +15,15 @@ import { IamMembersDataSource } from './iam-members-datasource'; templateUrl: './iam-members.component.html', styleUrls: ['./iam-members.component.scss'], }) -export class IamMembersComponent implements AfterViewInit { +export class IamMembersComponent { + public INITIALPAGESIZE: number = 25; public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED; - public disabled: boolean = false; - @ViewChild(MatPaginator) public paginator!: MatPaginator; - @ViewChild(MatTable) public table!: MatTable; public dataSource!: IamMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); public memberRoleOptions: string[] = []; - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'roles']; + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; constructor(private adminService: AdminService, private dialog: MatDialog, @@ -37,21 +32,13 @@ export class IamMembersComponent implements AfterViewInit { this.dataSource = new IamMembersDataSource(this.adminService); this.dataSource.loadMembers(0, 25); this.getRoleOptions(); - } - public ngAfterViewInit(): void { - this.paginator.page - .pipe( - tap(() => this.loadMembersPage()), - ) - .subscribe(); - } - - private loadMembersPage(): void { - this.dataSource.loadMembers( - this.paginator.pageIndex, - this.paginator.pageSize, - ); + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + ); + }; } public getRoleOptions(): void { @@ -71,11 +58,12 @@ export class IamMembersComponent implements AfterViewInit { }); } - - public removeProjectMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { + public removeMemberSelection(): void { + console.log(this.selection); + Promise.all(this.selection.map(member => { return this.adminService.RemoveIamMember(member.userId).then(() => { this.toast.showInfo('IAM.TOAST.MEMBERREMOVED', true); + this.changePage.emit(); }).catch(error => { this.toast.showError(error); }); @@ -86,25 +74,13 @@ export class IamMembersComponent implements AfterViewInit { this.adminService.RemoveIamMember(member.userId).then(() => { this.toast.showInfo('IAM.TOAST.MEMBERREMOVED', true); setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }).catch(error => { this.toast.showError(error); }); } - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } - - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); - } - public openAddMember(): void { const dialogRef = this.dialog.open(MemberCreateDialogComponent, { data: { @@ -124,7 +100,7 @@ export class IamMembersComponent implements AfterViewInit { })).then(() => { this.toast.showInfo('IAM.TOAST.MEMBERADDED', true); setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }).catch(error => { this.toast.showError(error); @@ -133,9 +109,4 @@ export class IamMembersComponent implements AfterViewInit { } }); } - - public refreshPage(): void { - this.selection.clear(); - this.dataSource.loadMembers(this.paginator.pageIndex, this.paginator.pageSize); - } } diff --git a/console/src/app/pages/iam/iam-members/iam-members.module.ts b/console/src/app/pages/iam/iam-members/iam-members.module.ts index 73c4623957..56a3a924a7 100644 --- a/console/src/app/pages/iam/iam-members/iam-members.module.ts +++ b/console/src/app/pages/iam/iam-members/iam-members.module.ts @@ -1,23 +1,14 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; +import { MemberCreateDialogModule } from 'src/app/modules/add-member-dialog/member-create-dialog.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; -import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { IamMembersRoutingModule } from './iam-members-routing.module'; import { IamMembersComponent } from './iam-members.component'; @@ -29,24 +20,14 @@ import { IamMembersComponent } from './iam-members.component'; IamMembersRoutingModule, DetailLayoutModule, CommonModule, - MatAutocompleteModule, - MatChipsModule, HasRoleModule, MatButtonModule, - MatCheckboxModule, MatIconModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, MatTooltipModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, TranslateModule, - MatFormFieldModule, - MatSelectModule, + MembersTableModule, HasRolePipeModule, - RefreshTableModule, + MemberCreateDialogModule, ], }) export class IamMembersModule { } diff --git a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.html b/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.html deleted file mode 100644 index 9c9bd23daf..0000000000 --- a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.html +++ /dev/null @@ -1,30 +0,0 @@ -

{{'ORG.POLICY.TITLE' | translate}}

- -

{{'ORG.POLICY.DESCRIPTION' | translate}}

- -
- -
-
- -
-
- {{'ORG.POLICY.LOGIN_POLICY.TITLE' | translate}} - -
- -

- {{'ORG.POLICY.LOGIN_POLICY.DESCRIPTION' | translate}}

- - -
- - - -
-
-
-
\ No newline at end of file diff --git a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.scss b/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.scss deleted file mode 100644 index 39a8f5e65b..0000000000 --- a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.scss +++ /dev/null @@ -1,76 +0,0 @@ -h1 { - font-size: 1.2rem; -} - -.top-desc { - color: #8795a1; -} - -.row-lyt { - display: flex; - flex-wrap: wrap; - margin: 0 -1rem; - - .p-item { - flex-basis: 300px; - margin: 1rem; - display: flex; - flex-direction: column; - min-height: 200px; - padding: 1rem; - - @media only screen and (max-width: 450px) { - flex-basis: 100%; - } - - .avatar { - height: 60px; - width: 60px; - border-radius: 50%; - background: linear-gradient(40deg, rgb(129, 85, 185) 30%, #8983f7); - display: flex; - align-items: center; - justify-content: center; - margin-bottom: .5rem; - - .icon, - i { - font-size: 2.5rem; - height: 2.5rem; - line-height: 2.5rem; - } - } - - .title { - display: flex; - align-items: center; - - span { - font-size: 1.2rem; - } - - .icon { - margin-left: 1rem; - margin-right: 1rem; - } - } - - .desc { - font-size: .9rem; - color: #8795a1; - } - - .fill-space { - flex: 1; - } - - .btn-wrapper { - display: flex; - } - - button { - margin-right: 1rem; - border-radius: .5rem; - } - } -} diff --git a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.ts b/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.ts deleted file mode 100644 index 299495bc93..0000000000 --- a/console/src/app/pages/iam/iam-policy-grid/iam-policy-grid.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component } from '@angular/core'; -import { PolicyComponentType } from 'src/app/modules/policies/policy-component-types.enum'; -import { DefaultLoginPolicy } from 'src/app/proto/generated/admin_pb'; -import { PolicyState } from 'src/app/proto/generated/management_pb'; -import { AdminService } from 'src/app/services/admin.service'; - -@Component({ - selector: 'app-iam-policy-grid', - templateUrl: './iam-policy-grid.component.html', - styleUrls: ['./iam-policy-grid.component.scss'], -}) -export class IamPolicyGridComponent { - public loginPolicy!: DefaultLoginPolicy.AsObject; - - public PolicyState: any = PolicyState; - public PolicyComponentType: any = PolicyComponentType; - - constructor( - private adminService: AdminService, - ) { - this.getData(); - } - - private getData(): void { - this.adminService.GetDefaultLoginPolicy().then(data => this.loginPolicy = data.toObject()); - } -} diff --git a/console/src/app/pages/iam/iam-routing.module.ts b/console/src/app/pages/iam/iam-routing.module.ts index 2607459d1b..838152a854 100644 --- a/console/src/app/pages/iam/iam-routing.module.ts +++ b/console/src/app/pages/iam/iam-routing.module.ts @@ -24,30 +24,80 @@ const routes: Routes = [ }, }, { - path: 'idp/create', - loadChildren: () => import('src/app/modules/idp-create/idp-create.module').then(m => m.IdpCreateModule), - canActivate: [AuthGuard, RoleGuard], - data: { - roles: ['iam.idp.write'], - serviceType: PolicyComponentServiceType.ADMIN, - }, + path: 'idp', + children: [ + { + path: 'create', + loadChildren: () => import('src/app/modules/idp-create/idp-create.module').then(m => m.IdpCreateModule), + canActivate: [AuthGuard, RoleGuard], + data: { + roles: ['iam.idp.write'], + serviceType: PolicyComponentServiceType.ADMIN, + }, + }, + { + path: ':id', + loadChildren: () => import('src/app/modules/idp/idp.module').then(m => m.IdpModule), + canActivate: [AuthGuard, RoleGuard], + data: { + roles: ['iam.idp.read'], + serviceType: PolicyComponentServiceType.ADMIN, + }, + }, + ], }, { - path: 'idp/:id', - loadChildren: () => import('src/app/modules/idp/idp.module').then(m => m.IdpModule), - canActivate: [AuthGuard, RoleGuard], - data: { - roles: ['iam.idp.read'], - serviceType: PolicyComponentServiceType.ADMIN, - }, - }, - { - path: `policy/${PolicyComponentType.LOGIN}`, - data: { - serviceType: PolicyComponentServiceType.ADMIN, - }, - loadChildren: () => import('src/app/modules/policies/login-policy/login-policy.module') - .then(m => m.LoginPolicyModule), + path: 'policy', + children: [ + { + path: PolicyComponentType.AGE, + data: { + serviceType: PolicyComponentServiceType.ADMIN, + }, + loadChildren: () => import('src/app/modules/policies/password-age-policy/password-age-policy.module') + .then(m => m.PasswordAgePolicyModule), + }, + { + path: PolicyComponentType.LOCKOUT, + data: { + serviceType: PolicyComponentServiceType.ADMIN, + }, + loadChildren: () => import('src/app/modules/policies/password-lockout-policy/password-lockout-policy.module') + .then(m => m.PasswordLockoutPolicyModule), + }, + { + path: PolicyComponentType.COMPLEXITY, + data: { + serviceType: PolicyComponentServiceType.ADMIN, + }, + loadChildren: () => import('src/app/modules/policies/password-complexity-policy/password-complexity-policy.module') + .then(m => m.PasswordComplexityPolicyModule), + }, + { + path: PolicyComponentType.IAM, + data: { + serviceType: PolicyComponentServiceType.ADMIN, + }, + loadChildren: () => import('src/app/modules/policies/org-iam-policy/org-iam-policy.module') + .then(m => m.OrgIamPolicyModule), + }, + { + path: PolicyComponentType.LOGIN, + data: { + serviceType: PolicyComponentServiceType.ADMIN, + }, + loadChildren: () => import('src/app/modules/policies/login-policy/login-policy.module') + .then(m => m.LoginPolicyModule), + }, + { + path: PolicyComponentType.LABEL, + data: { + serviceType: PolicyComponentServiceType.ADMIN, + }, + loadChildren: () => import('src/app/modules/policies/label-policy/label-policy.module') + .then(m => m.LabelPolicyModule), + }, + ], }, ]; diff --git a/console/src/app/pages/iam/iam-views/iam-views.component.html b/console/src/app/pages/iam/iam-views/iam-views.component.html index 8a45da0af9..074e7be296 100644 --- a/console/src/app/pages/iam/iam-views/iam-views.component.html +++ b/console/src/app/pages/iam/iam-views/iam-views.component.html @@ -2,22 +2,20 @@ - +
- + - + - + @@ -27,8 +25,8 @@ - - + + - +
{{ 'IAM.VIEWS.VIEWNAME' | translate }} {{ 'IAM.VIEWS.VIEWNAME' | translate }} {{view.viewName}} {{ 'IAM.VIEWS.DATABASE' | translate }} {{ 'IAM.VIEWS.DATABASE' | translate }} {{view.database}} {{ 'IAM.VIEWS.SEQUENCE' | translate }} - {{view?.processedSequence}} - {{view.processedSequence}} {{ 'IAM.VIEWS.ACTIONS' | translate }}
diff --git a/console/src/app/pages/iam/iam-views/iam-views.component.scss b/console/src/app/pages/iam/iam-views/iam-views.component.scss index 5a2bc04204..fed66762df 100644 --- a/console/src/app/pages/iam/iam-views/iam-views.component.scss +++ b/console/src/app/pages/iam/iam-views/iam-views.component.scss @@ -27,6 +27,18 @@ } } +tr { + button { + visibility: hidden; + } + + &:hover { + button { + visibility: visible; + } + } +} + .pointer { outline: none; cursor: pointer; diff --git a/console/src/app/pages/iam/iam-views/iam-views.component.ts b/console/src/app/pages/iam/iam-views/iam-views.component.ts index cf87295f90..343649a372 100644 --- a/console/src/app/pages/iam/iam-views/iam-views.component.ts +++ b/console/src/app/pages/iam/iam-views/iam-views.component.ts @@ -1,10 +1,14 @@ import { AfterViewInit, Component, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { BehaviorSubject, from, Observable, of } from 'rxjs'; import { catchError, finalize, map } from 'rxjs/operators'; +import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { View } from 'src/app/proto/generated/admin_pb'; import { AdminService } from 'src/app/services/admin.service'; +import { ToastService } from 'src/app/services/toast.service'; @Component({ selector: 'app-iam-views', @@ -12,6 +16,8 @@ import { AdminService } from 'src/app/services/admin.service'; styleUrls: ['./iam-views.component.scss'], }) export class IamViewsComponent implements AfterViewInit { + @ViewChild(MatSort) sort!: MatSort; + @ViewChild(MatPaginator) public paginator!: MatPaginator; public dataSource!: MatTableDataSource; @@ -19,7 +25,7 @@ export class IamViewsComponent implements AfterViewInit { private loadingSubject: BehaviorSubject = new BehaviorSubject(false); public loading$: Observable = this.loadingSubject.asObservable(); - constructor(private adminService: AdminService) { + constructor(private adminService: AdminService, private dialog: MatDialog, private toast: ToastService) { this.loadViews(); } @@ -38,10 +44,30 @@ export class IamViewsComponent implements AfterViewInit { ).subscribe(views => { this.dataSource = new MatTableDataSource(views); this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; }); } public cancelView(viewname: string, db: string): void { - this.adminService.ClearView(viewname, db); + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.CLEAR', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'IAM.VIEWS.DIALOG.VIEW_CLEAR_TITLE', + descriptionKey: 'IAM.VIEWS.DIALOG.VIEW_CLEAR_DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (resp) { + this.adminService.ClearView(viewname, db).then(() => { + this.toast.showInfo('IAM.VIEWS.CLEARED', true); + this.loadViews(); + }).catch(error => { + this.toast.showError(error); + }); + } + }); } } diff --git a/console/src/app/pages/iam/iam.component.html b/console/src/app/pages/iam/iam.component.html index f818e62401..db85ded387 100644 --- a/console/src/app/pages/iam/iam.component.html +++ b/console/src/app/pages/iam/iam.component.html @@ -3,7 +3,7 @@

{{'IAM.DETAIL.TITLE' | translate}}

{{'IAM.DETAIL.DESCRIPTION' | translate}}

- + @@ -22,4 +22,4 @@ (showDetailClicked)="showDetail()" (refreshClicked)="loadMembers()" [disabled]="false">
- + \ No newline at end of file diff --git a/console/src/app/pages/iam/iam.component.scss b/console/src/app/pages/iam/iam.component.scss index 000376cdba..8b74ff1ee6 100644 --- a/console/src/app/pages/iam/iam.component.scss +++ b/console/src/app/pages/iam/iam.component.scss @@ -3,7 +3,7 @@ } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/iam/iam.component.ts b/console/src/app/pages/iam/iam.component.ts index 5a7e26bbe4..55d248c5d0 100644 --- a/console/src/app/pages/iam/iam.component.ts +++ b/console/src/app/pages/iam/iam.component.ts @@ -5,6 +5,7 @@ import { BehaviorSubject, from, Observable, of } from 'rxjs'; import { catchError, finalize, map } from 'rxjs/operators'; import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component'; import { PolicyComponentServiceType } from 'src/app/modules/policies/policy-component-types.enum'; +import { PolicyGridType } from 'src/app/modules/policy-grid/policy-grid.component'; import { OrgMemberView, UserView } from 'src/app/proto/generated/management_pb'; import { AdminService } from 'src/app/services/admin.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -22,6 +23,8 @@ export class IamComponent { public membersSubject: BehaviorSubject = new BehaviorSubject([]); + public PolicyGridType: any = PolicyGridType; + constructor(public adminService: AdminService, private dialog: MatDialog, private toast: ToastService, private router: Router) { this.loadMembers(); diff --git a/console/src/app/pages/iam/iam.module.ts b/console/src/app/pages/iam/iam.module.ts index 5beadda514..cc644d34a3 100644 --- a/console/src/app/pages/iam/iam.module.ts +++ b/console/src/app/pages/iam/iam.module.ts @@ -20,20 +20,20 @@ import { CardModule } from 'src/app/modules/card/card.module'; import { ChangesModule } from 'src/app/modules/changes/changes.module'; import { ContributorsModule } from 'src/app/modules/contributors/contributors.module'; import { MetaLayoutModule } from 'src/app/modules/meta-layout/meta-layout.module'; +import { PolicyGridModule } from 'src/app/modules/policy-grid/policy-grid.module'; import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; import { SharedModule } from 'src/app/modules/shared/shared.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { FailedEventsComponent } from './failed-events/failed-events.component'; -import { IamPolicyGridComponent } from './iam-policy-grid/iam-policy-grid.component'; import { IamRoutingModule } from './iam-routing.module'; import { IamViewsComponent } from './iam-views/iam-views.component'; import { IamComponent } from './iam.component'; @NgModule({ - declarations: [IamComponent, IamViewsComponent, FailedEventsComponent, IamPolicyGridComponent], + declarations: [IamComponent, IamViewsComponent, FailedEventsComponent], imports: [ CommonModule, IamRoutingModule, @@ -63,6 +63,8 @@ import { IamComponent } from './iam.component'; SharedModule, RefreshTableModule, HasRolePipeModule, + MatSortModule, + PolicyGridModule, ], }) export class IamModule { } diff --git a/console/src/app/pages/orgs/org-create/org-create.component.scss b/console/src/app/pages/orgs/org-create/org-create.component.scss index 1365af7071..4d425341b9 100644 --- a/console/src/app/pages/orgs/org-create/org-create.component.scss +++ b/console/src/app/pages/orgs/org-create/org-create.component.scss @@ -39,7 +39,7 @@ h1 { } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; margin: 1rem 0; } @@ -70,7 +70,7 @@ h1 { width: 100%; display: block; font-size: .9rem; - color: #8795a1; + color: var(--grey); } } @@ -85,7 +85,6 @@ h1 { margin-top: 3rem; display: block; padding: .5rem 4rem; - border-radius: .5rem; } } @@ -98,7 +97,7 @@ h1 { .section { padding: .5rem; flex-basis: 100%; - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -138,7 +137,6 @@ h1 { .small-button { display: block; - border-radius: .5rem; } .fill-space { @@ -148,7 +146,6 @@ h1 { .big-button { display: block; padding: .5rem 4rem; - border-radius: .5rem; } } diff --git a/console/src/app/pages/orgs/org-create/org-create.component.ts b/console/src/app/pages/orgs/org-create/org-create.component.ts index ace1c86866..d487201638 100644 --- a/console/src/app/pages/orgs/org-create/org-create.component.ts +++ b/console/src/app/pages/orgs/org-create/org-create.component.ts @@ -7,7 +7,7 @@ import { Router } from '@angular/router'; import { take } from 'rxjs/operators'; import { lowerCaseValidator, numberValidator, symbolValidator, upperCaseValidator } from 'src/app/pages/validators'; import { CreateHumanRequest, CreateOrgRequest, Gender, OrgSetUpResponse } from 'src/app/proto/generated/admin_pb'; -import { PasswordComplexityPolicy } from 'src/app/proto/generated/auth_pb'; +import { PasswordComplexityPolicy as MgmtPasswordComplexityPolicy } from 'src/app/proto/generated/management_pb'; import { AdminService } from 'src/app/services/admin.service'; import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; import { ManagementService } from 'src/app/services/mgmt.service'; @@ -57,7 +57,7 @@ export class OrgCreateComponent { public genders: Gender[] = [Gender.GENDER_FEMALE, Gender.GENDER_MALE, Gender.GENDER_UNSPECIFIED]; public languages: string[] = ['de', 'en']; - public policy!: PasswordComplexityPolicy.AsObject; + public policy!: MgmtPasswordComplexityPolicy.AsObject; public usePassword: boolean = false; public forSelf: boolean = true; diff --git a/console/src/app/pages/orgs/org-create/org-create.module.ts b/console/src/app/pages/orgs/org-create/org-create.module.ts index d000e4e5fc..27fbb008c3 100644 --- a/console/src/app/pages/orgs/org-create/org-create.module.ts +++ b/console/src/app/pages/orgs/org-create/org-create.module.ts @@ -11,7 +11,7 @@ import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { PasswordComplexityViewModule } from 'src/app/modules/password-complexity-view/password-complexity-view.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { OrgCreateRoutingModule } from './org-create-routing.module'; import { OrgCreateComponent } from './org-create.component'; diff --git a/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss b/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss index 91a03f5bc2..132f28cfd4 100644 --- a/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss +++ b/console/src/app/pages/orgs/org-detail/add-domain-dialog/add-domain-dialog.component.scss @@ -4,7 +4,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -19,8 +19,4 @@ .ok-button { margin-left: .5rem; } - - button { - border-radius: .5rem; - } } diff --git a/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.html b/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.html index beb03f476d..3c71b746fc 100644 --- a/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.html +++ b/console/src/app/pages/orgs/org-detail/domain-verification/domain-verification.component.html @@ -1,47 +1,59 @@ -{{domain.domain}} {{'ORG.PAGES.ORGDOMAIN_TITLE' | translate}} +{{'ORG.PAGES.ORGDOMAIN.TITLE' | translate}} {{domain.domain}}
-

{{ 'ORG.PAGES.ORGDOMAIN_VERIFICATION' | translate }}

+

{{ 'ORG.PAGES.ORGDOMAIN.VERIFICATION' | translate }}

-

{{ 'ORG.PAGES.ORGDOMAIN_VERIFICATION_VALIDATION_DESC' | translate }}

+

{{ 'ORG.PAGES.ORGDOMAIN.VERIFICATION_VALIDATION_DESC' | translate }}

-

- {{'ORG.PAGES.ORGDOMAIN_VERIFICATION_VALIDATION_ONGOING' | translate: domain }}

+

+ {{'ORG.PAGES.ORGDOMAIN.VERIFICATION_VALIDATION_ONGOING' | translate: domain }} + {{'ORG.PAGES.ORGDOMAIN.VERIFICATION_VALIDATION_ONGOING_TYPE' | translate}} + {{'ORG.PAGES.ORGDOMAIN.TYPES.'+ domain.validationType | translate}}

- + +
-

{{ 'ORG.PAGES.ORGDOMAIN_VERIFICATION_NEWTOKEN_TITLE' | translate }}

-

{{ 'ORG.PAGES.ORGDOMAIN_VERIFICATION_NEWTOKEN_DESC' | translate }}

+ +

{{ 'ORG.PAGES.ORGDOMAIN.VERIFICATION_NEWTOKEN_TITLE' | translate }}

+

{{ 'ORG.PAGES.ORGDOMAIN.VERIFICATION_NEWTOKEN_DESC' | translate }}

-
- - -
-
-

HTTP TOKEN

-

{{http?.url}}.txt

- -
- +
+ +
-
+
+

HTTP TOKEN

+

{{http?.url}}.txt

-
-

DNS TOKEN

-
-

{{dns?.token}}

- +
+ + +
-

{{dns?.url}}

-
+ +
+

DNS TOKEN

+
+

{{dns?.token}}

+ + +
+

{{dns?.url}}

+
+
+
-

{{'ORG.PAGES.ORGDOMAIN_VERIFICATION' | translate}}

- - +
@@ -58,4 +59,4 @@
- + \ No newline at end of file diff --git a/console/src/app/pages/orgs/org-detail/org-detail.component.scss b/console/src/app/pages/orgs/org-detail/org-detail.component.scss index 79b45464f0..9a12b3b917 100644 --- a/console/src/app/pages/orgs/org-detail/org-detail.component.scss +++ b/console/src/app/pages/orgs/org-detail/org-detail.component.scss @@ -3,7 +3,7 @@ } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } @@ -41,17 +41,22 @@ } .verify-btn { - border-radius: .5rem; font-size: 13px; } .fill-space { flex: 1; } -} -.add-button { - border-radius: .5rem; + .rem-button { + visibility: hidden; + } + + &:hover { + .rem-button { + visibility: visible; + } + } } .new-desc { diff --git a/console/src/app/pages/orgs/org-detail/org-detail.component.ts b/console/src/app/pages/orgs/org-detail/org-detail.component.ts index 7983c2370e..46d8df084d 100644 --- a/console/src/app/pages/orgs/org-detail/org-detail.component.ts +++ b/console/src/app/pages/orgs/org-detail/org-detail.component.ts @@ -10,6 +10,7 @@ import { catchError, finalize, map } from 'rxjs/operators'; import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component'; import { ChangeType } from 'src/app/modules/changes/changes.component'; import { PolicyComponentServiceType } from 'src/app/modules/policies/policy-component-types.enum'; +import { PolicyGridType } from 'src/app/modules/policy-grid/policy-grid.component'; import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { Org, @@ -54,6 +55,7 @@ export class OrgDetailComponent implements OnInit, OnDestroy { public totalMemberResult: number = 0; public membersSubject: BehaviorSubject = new BehaviorSubject([]); + public PolicyGridType: any = PolicyGridType; constructor( private dialog: MatDialog, @@ -132,6 +134,8 @@ export class OrgDetailComponent implements OnInit, OnDestroy { newDomainView.setVerified(newDomain.getVerified()); this.domains.push(newDomainView.toObject()); + + this.verifyDomain(newDomainView.toObject()); this.toast.showInfo('ORG.TOAST.DOMAINADDED', true); }); } @@ -202,6 +206,7 @@ export class OrgDetailComponent implements OnInit, OnDestroy { data: { domain: domain, }, + width: '500px', }); } diff --git a/console/src/app/pages/orgs/org-grid/org-grid.component.html b/console/src/app/pages/orgs/org-grid/org-grid.component.html deleted file mode 100644 index d736852fb0..0000000000 --- a/console/src/app/pages/orgs/org-grid/org-grid.component.html +++ /dev/null @@ -1,62 +0,0 @@ -
-

{{ 'ORG.PAGES.LIST' | translate }}

-

{{'ORG.PAGES.LISTDESCRIPTION' | translate}}

- -
-
-
- -
- -
-

{{'PROJECT.PAGES.PINNED' | translate}}

- -
-
- {{org.id}} - - {{ org.name }} - No Name - -
-
-
- -
-
-
-

{{'PROJECT.PAGES.ALL' | translate}}

- -
-
- {{org.id}} - - {{ org.name }} - No Name - -
-
-
- -
- - -
- add - Add new organization -
-
-
-
\ No newline at end of file diff --git a/console/src/app/pages/orgs/org-grid/org-grid.component.scss b/console/src/app/pages/orgs/org-grid/org-grid.component.scss deleted file mode 100644 index 34c18e2eca..0000000000 --- a/console/src/app/pages/orgs/org-grid/org-grid.component.scss +++ /dev/null @@ -1,251 +0,0 @@ -h1 { - margin-top: 0; -} - -.top-desc { - color: #8795a1; -} - -.view-toggle { - width: 100%; - display: flex; - justify-content: flex-end; - padding-bottom: .5rem; - border-bottom: 1px solid #2d2e30; - - .anim-list { - display: flex; - justify-content: flex-end; - align-items: center; - } - - button { - &.left-button { - margin-right: 1rem; - } - } -} - -.container { - display: flex; - flex-wrap: wrap; - margin: 0 -1rem; - box-sizing: border-box; - - .item { - position: relative; - z-index: 100; - margin: 1rem; - flex-basis: 230px; - display: flex; - text-decoration: none; - overflow: hidden; - cursor: pointer; - padding-top: 0; - padding-right: 0; - padding-bottom: 0; - padding-left: 1rem; - border-radius: .5rem; - box-sizing: border-box; - min-height: 130px; - - * { - box-sizing: border-box; - } - - &.active { - border: 2px solid #38649d; - } - - .selection-icon { - opacity: 0; - position: absolute; - top: -12px; - left: -12px; - } - - img { - height: 50px; - width: 50px; - margin: 1rem; - } - - .text-part { - position: relative; - flex: 1; - display: flex; - flex-direction: column; - // justify-content: center; - min-height: 70px; - padding: .5rem 0; - - .top { - font-size: .8rem; - margin-bottom: 0; - margin-top: .5rem; - } - - .name { - margin-top: 1rem; - font-size: 1.2rem; - margin-bottom: .5rem; - } - - .description { - font-size: .8rem; - margin-top: .5rem; - } - - .created { - font-size: .8rem; - } - - .organization { - display: flex; - align-items: center; - margin-top: 1rem; - - .org_avatar { - height: 25px; - width: 25px; - border-radius: 50%; - margin: 0; - margin-right: 1rem; - } - } - - .fill-space { - flex: 1; - } - - .icons { - margin-top: 1rem; - transition: all .3s; - display: flex; - align-items: center; - - .current { - height: 10px; - font-size: 14px; - width: 10px; - border-radius: 50%; - background-color: rgb(144, 212, 210); - display: flex; - margin: .5rem 0; - align-items: center; - box-sizing: border-box; - - span { - margin-left: 1.5rem; - text-transform: uppercase; - color: rgb(144, 212, 210); - } - } - - .icon { - opacity: 0; - margin-right: 3px; - font-size: 1.3rem; - height: 1.4rem; - color: #8795a1; - } - } - } - - .edit-button { - opacity: 0; - user-select: none; - position: absolute; - bottom: 0; - right: 0; - margin: 0; - margin-bottom: .25rem; - color: #8795a1; - - &:hover { - opacity: 1; - color: white; - } - - &.selected { - opacity: 1; - } - } - - &:hover { - .edit-button { - opacity: 1; - } - - .text-part { - .icons { - .icon { - opacity: 1; - } - } - } - } - - &.selected { - .text-part { - .icons { - opacity: 1; - } - } - - .edit-button { - opacity: 1; - } - } - - @media only screen and (max-width: 450px) { - flex-basis: 100%; - } - } - - .add-org-button { - z-index: 100; - flex-basis: 230px; - cursor: pointer; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - min-height: 130px; - border-radius: .5rem; - margin: 1rem; - box-sizing: border-box; - - .icon { - display: flex; - justify-content: center; - align-self: center; - margin-bottom: 1rem; - height: 2.5rem; - line-height: 2.5rem; - font-size: 2.5rem; - } - - &:hover { - background-color: #ffffff25; - - .icon, - span { - &.disabled { - color: gray; - } - } - } - - @media only screen and (max-width: 450px) { - flex-basis: 100%; - } - } -} - -.n-items { - padding: 0 1rem; - font-size: .8rem; - color: #8795a1; - flex-basis: 100%; -} diff --git a/console/src/app/pages/orgs/org-grid/org-grid.component.ts b/console/src/app/pages/orgs/org-grid/org-grid.component.ts deleted file mode 100644 index caa44bc419..0000000000 --- a/console/src/app/pages/orgs/org-grid/org-grid.component.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { Component } from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable, of } from 'rxjs'; -import { switchMap, take } from 'rxjs/operators'; -import { Org } from 'src/app/proto/generated/auth_pb'; -import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; -import { ToastService } from 'src/app/services/toast.service'; - -@Component({ - selector: 'app-org-grid', - templateUrl: './org-grid.component.html', - styleUrls: ['./org-grid.component.scss'], -}) -export class OrgGridComponent { - public activeOrg!: Org.AsObject; - public orgList: Org.AsObject[] = []; - - public selection: SelectionModel = new SelectionModel(true, []); - public selectedIndex: number = -1; - public loading: boolean = false; - - public notPinned: Array = []; - - constructor( - private userService: GrpcAuthService, - private toast: ToastService, - private router: Router, - ) { - this.loading = true; - this.getData(10, 0); - - this.userService.GetActiveOrg().then(org => this.activeOrg = org); - - this.selection.changed.subscribe(selection => { - this.setPrefixedItem('pinned-orgs', JSON.stringify( - this.selection.selected.map(item => item.id), - )).pipe(take(1)).subscribe(() => { - selection.added.forEach(element => { - const index = this.notPinned.findIndex(item => item.id === element.id); - this.notPinned.splice(index, 1); - }); - - this.notPinned.push(...selection.removed); - }); - }); - } - - public reorganizeItems(): void { - this.getPrefixedItem('pinned-orgs').pipe(take(1)).subscribe(storageEntry => { - if (storageEntry) { - const array: string[] = JSON.parse(storageEntry); - const toSelect: Org.AsObject[] = this.orgList.filter((item, index) => { - if (array.includes(item.id)) { - // this.notPinned.splice(index, 1); - return true; - } - }); - this.selection.select(...toSelect); - - const toNotPinned: Org.AsObject[] = this.orgList.filter((item, index) => { - if (!array.includes(item.id)) { - return true; - } - }); - this.notPinned = toNotPinned; - } - }); - } - - private getPrefixedItem(key: string): Observable { - return this.userService.user.pipe( - take(1), - switchMap(user => { - return of(localStorage.getItem(`${user.id}:${key}`)); - }), - ); - } - - private setPrefixedItem(key: string, value: any): Observable { - return this.userService.user.pipe( - take(1), - switchMap(user => { - return of(localStorage.setItem(`${user.id}:${key}`, value)); - }), - ); - } - - private getData(limit: number, offset: number): void { - this.userService.SearchMyProjectOrgs(limit, offset).then(res => { - this.orgList = res.toObject().resultList; - - this.notPinned = Object.assign([], this.orgList); - this.reorganizeItems(); - this.loading = false; - }).catch(error => { - this.toast.showError(error); - this.loading = false; - }); - } - - public selectOrg(item: Org.AsObject, event?: any): void { - if (event && !event.target.classList.contains('mat-icon')) { - this.userService.setActiveOrg(item); - this.routeToOrg(item); - } - } - - public routeToOrg(item: Org.AsObject): void { - this.router.navigate(['/orgs', item.id]); - } -} diff --git a/console/src/app/pages/orgs/org-list/org-list-routing.module.ts b/console/src/app/pages/orgs/org-list/org-list-routing.module.ts new file mode 100644 index 0000000000..31f0b98707 --- /dev/null +++ b/console/src/app/pages/orgs/org-list/org-list-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { OrgListComponent } from './org-list.component'; + +const routes: Routes = [ + { + path: '', + component: OrgListComponent, + }, + +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class OrgListRoutingModule { } diff --git a/console/src/app/pages/orgs/org-list/org-list.component.html b/console/src/app/pages/orgs/org-list/org-list.component.html new file mode 100644 index 0000000000..1d67ebddf1 --- /dev/null +++ b/console/src/app/pages/orgs/org-list/org-list.component.html @@ -0,0 +1,55 @@ +
+

{{ 'ORG.PAGES.LIST' | translate }}

+

{{'ORG.PAGES.LISTDESCRIPTION' | translate}}

+ + + + + {{'ORG.PAGES.FILTER' | translate}} + + + + + + + + + + + + + + + + + + + + + + +
+ {{'ORG.PAGES.ACTIVE' | translate}} + + + + {{ 'ORG.PAGES.ID' | translate }} {{org.id}} + {{ 'ORG.PAGES.NAME' | translate }} + + {{org.name}}
+ + +
+
+ + + + \ No newline at end of file diff --git a/console/src/app/pages/orgs/org-list/org-list.component.scss b/console/src/app/pages/orgs/org-list/org-list.component.scss new file mode 100644 index 0000000000..e3d50b0123 --- /dev/null +++ b/console/src/app/pages/orgs/org-list/org-list.component.scss @@ -0,0 +1,53 @@ +h1 { + margin-top: 0; +} + +.top-desc { + color: var(--grey); +} + +.table, +.paginator { + width: 100%; + + td, + th { + padding: 0 1rem; + + &:first-child { + padding-left: 0; + padding-right: 1rem; + } + + &:last-child { + padding-right: 0; + } + } + + .selection { + width: 50px; + max-width: 50px; + } +} + +.pointer { + outline: none; + cursor: pointer; +} + +.filter { + margin-left: 1rem; +} + +th { + .search-button { + visibility: hidden; + } + + &:hover, + &.search-active { + .search-button { + visibility: visible; + } + } +} diff --git a/console/src/app/pages/orgs/org-grid/org-grid.component.spec.ts b/console/src/app/pages/orgs/org-list/org-list.component.spec.ts similarity index 57% rename from console/src/app/pages/orgs/org-grid/org-grid.component.spec.ts rename to console/src/app/pages/orgs/org-list/org-list.component.spec.ts index ae133bdf84..9cec585122 100644 --- a/console/src/app/pages/orgs/org-grid/org-grid.component.spec.ts +++ b/console/src/app/pages/orgs/org-list/org-list.component.spec.ts @@ -1,20 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { OrgGridComponent } from './org-grid.component'; +import { OrgListComponent } from './org-list.component'; -describe('OrgGridComponent', () => { - let component: OrgGridComponent; - let fixture: ComponentFixture; +describe('OrgListComponent', () => { + let component: OrgListComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [OrgGridComponent], + declarations: [OrgListComponent], }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(OrgGridComponent); + fixture = TestBed.createComponent(OrgListComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/console/src/app/pages/orgs/org-list/org-list.component.ts b/console/src/app/pages/orgs/org-list/org-list.component.ts new file mode 100644 index 0000000000..a5db909cc1 --- /dev/null +++ b/console/src/app/pages/orgs/org-list/org-list.component.ts @@ -0,0 +1,107 @@ +import { AfterViewInit, Component, ViewChild } from '@angular/core'; +import { MatInput } from '@angular/material/input'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { Router } from '@angular/router'; +import { BehaviorSubject, from, Observable, of } from 'rxjs'; +import { catchError, finalize, map } from 'rxjs/operators'; +import { enterAnimations } from 'src/app/animations'; +import { MyProjectOrgSearchKey, MyProjectOrgSearchQuery, Org, SearchMethod } from 'src/app/proto/generated/auth_pb'; +import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; + +@Component({ + selector: 'app-org-list', + templateUrl: './org-list.component.html', + styleUrls: ['./org-list.component.scss'], + animations: [ + enterAnimations, + ], +}) +export class OrgListComponent implements AfterViewInit { + public orgSearchKey: MyProjectOrgSearchKey | undefined = undefined; + + @ViewChild(MatPaginator) public paginator!: MatPaginator; + @ViewChild(MatSort) sort!: MatSort; + @ViewChild('input') public filter!: MatInput; + + public dataSource!: MatTableDataSource; + public displayedColumns: string[] = ['select', 'id', 'name']; + private loadingSubject: BehaviorSubject = new BehaviorSubject(false); + public loading$: Observable = this.loadingSubject.asObservable(); + public activeOrg!: Org.AsObject; + public MyProjectOrgSearchKey: any = MyProjectOrgSearchKey; + + constructor( + private authService: GrpcAuthService, + private router: Router, + ) { + this.loadOrgs(10, 0); + + this.authService.GetActiveOrg().then(org => this.activeOrg = org); + } + + public ngAfterViewInit(): void { + this.loadOrgs(10, 0); + } + + public loadOrgs(limit: number, offset: number, filter?: string): void { + this.loadingSubject.next(true); + let query; + if (filter) { + query = new MyProjectOrgSearchQuery(); + query.setMethod(SearchMethod.SEARCHMETHOD_CONTAINS_IGNORE_CASE); + query.setKey(MyProjectOrgSearchKey.MYPROJECTORGSEARCHKEY_ORG_NAME); + query.setValue(filter); + } + + from(this.authService.SearchMyProjectOrgs(limit, offset, query ? [query] : undefined)).pipe( + map(resp => { + return resp.toObject().resultList; + }), + catchError(() => of([])), + finalize(() => this.loadingSubject.next(false)), + ).subscribe(views => { + this.dataSource = new MatTableDataSource(views); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + }); + } + + public selectOrg(item: Org.AsObject, event?: any): void { + this.authService.setActiveOrg(item); + } + + public refresh(): void { + this.loadOrgs(this.paginator.length, this.paginator.pageSize * this.paginator.pageIndex); + } + + public setFilter(key: MyProjectOrgSearchKey): void { + setTimeout(() => { + if (this.filter) { + (this.filter as any).nativeElement.focus(); + } + }, 100); + + if (this.orgSearchKey !== key) { + this.orgSearchKey = key; + } else { + this.orgSearchKey = undefined; + this.refresh(); + } + } + + public applyFilter(event: Event): void { + const filterValue = (event.target as HTMLInputElement).value; + this.loadOrgs( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + filterValue.trim().toLowerCase(), + ); + } + + public setAndNavigateToOrg(org: Org.AsObject): void { + this.authService.setActiveOrg(org); + this.router.navigate(['/org']); + } +} diff --git a/console/src/app/pages/orgs/org-list/org-list.module.ts b/console/src/app/pages/orgs/org-list/org-list.module.ts new file mode 100644 index 0000000000..b7fa9f12ba --- /dev/null +++ b/console/src/app/pages/orgs/org-list/org-list.module.ts @@ -0,0 +1,42 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { TranslateModule } from '@ngx-translate/core'; +import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; + +import { OrgListRoutingModule } from './org-list-routing.module'; +import { OrgListComponent } from './org-list.component'; + +@NgModule({ + declarations: [OrgListComponent], + imports: [ + CommonModule, + OrgListRoutingModule, + MatTableModule, + TranslateModule, + RefreshTableModule, + TimestampToDatePipeModule, + LocalizedDatePipeModule, + MatPaginatorModule, + MatSortModule, + MatIconModule, + MatButtonModule, + MatTooltipModule, + MatRadioModule, + MatFormFieldModule, + MatInputModule, + FormsModule, + ], +}) +export class OrgListModule { } diff --git a/console/src/app/pages/orgs/org-members/org-members.component.html b/console/src/app/pages/orgs/org-members/org-members.component.html index 87f1d1e8af..8086cfafa8 100644 --- a/console/src/app/pages/orgs/org-members/org-members.component.html +++ b/console/src/app/pages/orgs/org-members/org-members.component.html @@ -1,84 +1,21 @@ - - + + - - + + add{{ 'ACTIONS.NEW' | translate }} - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'ROLESLABEL' | translate }} - - {{ 'ROLESLABEL' | translate }} - - - {{ role }} - - - -
- - - -
-
+
\ No newline at end of file diff --git a/console/src/app/pages/orgs/org-members/org-members.component.scss b/console/src/app/pages/orgs/org-members/org-members.component.scss index b6cb54e69f..e0962f6770 100644 --- a/console/src/app/pages/orgs/org-members/org-members.component.scss +++ b/console/src/app/pages/orgs/org-members/org-members.component.scss @@ -1,47 +1,3 @@ -.table-wrapper { - width: 100%; - overflow: auto; - - .table, - .paginator { - width: 100%; - - td, - th { - padding: .5rem; - - &:first-child { - padding-left: 0; - padding-right: 1rem; - } - - &:last-child { - padding-right: 0; - } - } - - .action { - width: 40px; - } - - .data-row { - &:hover { - background-color: #ffffff05; - } - } - - .selection { - width: 50px; - max-width: 50px; - } - } -} - -.add-button { - border-radius: .5rem; -} - -.pointer { - outline: none; - cursor: pointer; +.del-button { + margin-right: .5rem; } diff --git a/console/src/app/pages/orgs/org-members/org-members.component.ts b/console/src/app/pages/orgs/org-members/org-members.component.ts index 0aa9a0d486..37e9e01a42 100644 --- a/console/src/app/pages/orgs/org-members/org-members.component.ts +++ b/console/src/app/pages/orgs/org-members/org-members.component.ts @@ -1,11 +1,9 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { AfterViewInit, Component, ViewChild } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator } from '@angular/material/paginator'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; -import { tap } from 'rxjs/operators'; import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component'; -import { Org, OrgMemberView, ProjectType, UserView } from 'src/app/proto/generated/management_pb'; +import { Org, OrgMemberView, UserView } from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -16,18 +14,16 @@ import { OrgMembersDataSource } from './org-members-datasource'; templateUrl: './org-members.component.html', styleUrls: ['./org-members.component.scss'], }) -export class OrgMembersComponent implements AfterViewInit { +export class OrgMembersComponent { + public INITIALPAGESIZE: number = 25; public org!: Org.AsObject; - public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED; - public disabled: boolean = false; - @ViewChild(MatPaginator) public paginator!: MatPaginator; + public disableWrite: boolean = false; public dataSource!: OrgMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); public memberRoleOptions: string[] = []; - - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'roles']; + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; constructor( private mgmtService: ManagementService, @@ -37,18 +33,17 @@ export class OrgMembersComponent implements AfterViewInit { this.mgmtService.GetMyOrg().then(org => { this.org = org.toObject(); this.dataSource = new OrgMembersDataSource(this.mgmtService); - this.dataSource.loadMembers(0, 25); + this.dataSource.loadMembers(0, this.INITIALPAGESIZE); }); this.getRoleOptions(); - } - public ngAfterViewInit(): void { - this.paginator.page - .pipe( - tap(() => this.loadMembersPage()), - ) - .subscribe(); + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadMembers( + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + ); + }; } public getRoleOptions(): void { @@ -68,15 +63,8 @@ export class OrgMembersComponent implements AfterViewInit { }); } - private loadMembersPage(): void { - this.dataSource.loadMembers( - this.paginator.pageIndex, - this.paginator.pageSize, - ); - } - public removeOrgMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { + Promise.all(this.selection.map(member => { return this.mgmtService.RemoveMyOrgMember(member.userId).then(() => { this.toast.showInfo('ORG.TOAST.MEMBERREMOVED', true); }).catch(error => { @@ -84,21 +72,21 @@ export class OrgMembersComponent implements AfterViewInit { }); })).then(() => { setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }); } - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } + public removeOrgMember(member: OrgMemberView.AsObject): void { + this.mgmtService.RemoveMyOrgMember(member.userId).then(() => { + this.toast.showInfo('ORG.TOAST.MEMBERREMOVED', true); - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); + setTimeout(() => { + this.changePage.emit(); + }, 1000); + }).catch(error => { + this.toast.showError(error); + }); } public openAddMember(): void { @@ -120,7 +108,7 @@ export class OrgMembersComponent implements AfterViewInit { })).then(() => { this.toast.showInfo('ORG.TOAST.MEMBERADDED', true); setTimeout(() => { - this.refreshPage(); + this.changePage.emit(); }, 1000); }).catch(error => { this.toast.showError(error); @@ -129,9 +117,4 @@ export class OrgMembersComponent implements AfterViewInit { } }); } - - public refreshPage(): void { - this.selection.clear(); - this.dataSource.loadMembers(this.paginator.pageIndex, this.paginator.pageSize); - } } diff --git a/console/src/app/pages/orgs/org-members/org-members.module.ts b/console/src/app/pages/orgs/org-members/org-members.module.ts index 7c15a73c32..139ae23a14 100644 --- a/console/src/app/pages/orgs/org-members/org-members.module.ts +++ b/console/src/app/pages/orgs/org-members/org-members.module.ts @@ -1,23 +1,16 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule } from '@angular/material/chips'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; +import { MemberCreateDialogModule } from 'src/app/modules/add-member-dialog/member-create-dialog.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { OrgMembersRoutingModule } from './org-members-routing.module'; import { OrgMembersComponent } from './org-members.component'; @@ -28,25 +21,17 @@ import { OrgMembersComponent } from './org-members.component'; imports: [ OrgMembersRoutingModule, CommonModule, - MatAutocompleteModule, MatChipsModule, MatButtonModule, HasRoleModule, - MatCheckboxModule, MatIconModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, MatTooltipModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, TranslateModule, DetailLayoutModule, - MatFormFieldModule, - MatSelectModule, - HasRolePipeModule, RefreshTableModule, + MembersTableModule, + HasRolePipeModule, + MemberCreateDialogModule, ], }) export class OrgMembersModule { } diff --git a/console/src/app/pages/orgs/orgs-routing.module.ts b/console/src/app/pages/orgs/orgs-routing.module.ts index ddef73aa89..0484c2676d 100644 --- a/console/src/app/pages/orgs/orgs-routing.module.ts +++ b/console/src/app/pages/orgs/orgs-routing.module.ts @@ -5,7 +5,6 @@ import { PolicyComponentServiceType, PolicyComponentType } from 'src/app/modules import { OrgCreateComponent } from './org-create/org-create.component'; import { OrgDetailComponent } from './org-detail/org-detail.component'; -import { OrgGridComponent } from './org-grid/org-grid.component'; const routes: Routes = [ { @@ -26,6 +25,7 @@ const routes: Routes = [ canActivate: [RoleGuard], data: { roles: ['org.idp.write'], + serviceType: PolicyComponentServiceType.MGMT, }, }, { @@ -34,34 +34,45 @@ const routes: Routes = [ canActivate: [RoleGuard], data: { roles: ['iam.idp.read'], - serviceType: PolicyComponentServiceType.ADMIN, + serviceType: PolicyComponentServiceType.MGMT, }, }, ], }, - { path: 'policy', children: [ { path: PolicyComponentType.AGE, + data: { + serviceType: PolicyComponentServiceType.MGMT, + }, loadChildren: () => import('src/app/modules/policies/password-age-policy/password-age-policy.module') .then(m => m.PasswordAgePolicyModule), }, { path: PolicyComponentType.LOCKOUT, + data: { + serviceType: PolicyComponentServiceType.MGMT, + }, loadChildren: () => import('src/app/modules/policies/password-lockout-policy/password-lockout-policy.module') .then(m => m.PasswordLockoutPolicyModule), }, { path: PolicyComponentType.COMPLEXITY, + data: { + serviceType: PolicyComponentServiceType.MGMT, + }, loadChildren: () => import('src/app/modules/policies/password-complexity-policy/password-complexity-policy.module') .then(m => m.PasswordComplexityPolicyModule), }, { path: PolicyComponentType.IAM, - loadChildren: () => import('src/app/modules/policies/password-iam-policy/password-iam-policy.module') - .then(m => m.PasswordIamPolicyModule), + data: { + serviceType: PolicyComponentServiceType.MGMT, + }, + loadChildren: () => import('src/app/modules/policies/org-iam-policy/org-iam-policy.module') + .then(m => m.OrgIamPolicyModule), }, { path: PolicyComponentType.LOGIN, @@ -83,7 +94,7 @@ const routes: Routes = [ }, { path: 'overview', - component: OrgGridComponent, + loadChildren: () => import('./org-list/org-list.module').then(m => m.OrgListModule), }, ]; diff --git a/console/src/app/pages/orgs/orgs.module.ts b/console/src/app/pages/orgs/orgs.module.ts index bce4e20ab2..afe782f78a 100644 --- a/console/src/app/pages/orgs/orgs.module.ts +++ b/console/src/app/pages/orgs/orgs.module.ts @@ -17,20 +17,19 @@ import { MemberCreateDialogModule } from 'src/app/modules/add-member-dialog/memb import { CardModule } from 'src/app/modules/card/card.module'; import { ContributorsModule } from 'src/app/modules/contributors/contributors.module'; import { MetaLayoutModule } from 'src/app/modules/meta-layout/meta-layout.module'; +import { PolicyGridModule } from 'src/app/modules/policy-grid/policy-grid.module'; import { SharedModule } from 'src/app/modules/shared/shared.module'; import { WarnDialogModule } from 'src/app/modules/warn-dialog/warn-dialog.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { ChangesModule } from '../../modules/changes/changes.module'; import { AddDomainDialogModule } from './org-detail/add-domain-dialog/add-domain-dialog.module'; import { DomainVerificationComponent } from './org-detail/domain-verification/domain-verification.component'; import { OrgDetailComponent } from './org-detail/org-detail.component'; -import { OrgGridComponent } from './org-grid/org-grid.component'; import { OrgsRoutingModule } from './orgs-routing.module'; -import { PolicyGridComponent } from './policy-grid/policy-grid.component'; @NgModule({ - declarations: [OrgDetailComponent, OrgGridComponent, PolicyGridComponent, DomainVerificationComponent], + declarations: [OrgDetailComponent, DomainVerificationComponent], imports: [ CommonModule, HasRolePipeModule, @@ -48,7 +47,6 @@ import { PolicyGridComponent } from './policy-grid/policy-grid.component'; MetaLayoutModule, MatTabsModule, MatTooltipModule, - MatDialogModule, WarnDialogModule, MemberCreateDialogModule, MatMenuModule, @@ -58,6 +56,7 @@ import { PolicyGridComponent } from './policy-grid/policy-grid.component'; SharedModule, ContributorsModule, CopyToClipboardModule, + PolicyGridModule, ], }) export class OrgsModule { } diff --git a/console/src/app/pages/orgs/policy-grid/policy-grid.component.html b/console/src/app/pages/orgs/policy-grid/policy-grid.component.html deleted file mode 100644 index 4a404001c5..0000000000 --- a/console/src/app/pages/orgs/policy-grid/policy-grid.component.html +++ /dev/null @@ -1,93 +0,0 @@ -

{{'ORG.POLICY.TITLE' | translate}}

- -

{{'ORG.POLICY.DESCRIPTION' | translate}}

- -
-
-
- -
-
- {{'ORG.POLICY.PWD_COMPLEXITY.TITLE' | translate}} - -
- -

- {{ complexityPolicy.description }}

- -

- {{'ORG.POLICY.PWD_COMPLEXITY.DESCRIPTION' | translate}}

-
- - -
- - -
-
- - -
-
- -
-
- {{'ORG.POLICY.IAM_POLICY.TITLE' | translate}} - -
- -

- {{ iamPolicy.description }}

- -

- {{'ORG.POLICY.IAM_POLICY.DESCRIPTION' | translate}}

-
- - -
- - - - -
-
-
- - -
-
- -
-
- {{'ORG.POLICY.LOGIN_POLICY.TITLE' | translate}} - -
- - - -

- {{'ORG.POLICY.LOGIN_POLICY.DESCRIPTION' | translate}}

-
- - -
- - - - -
-
-
-
diff --git a/console/src/app/pages/orgs/policy-grid/policy-grid.component.ts b/console/src/app/pages/orgs/policy-grid/policy-grid.component.ts deleted file mode 100644 index b209e89a03..0000000000 --- a/console/src/app/pages/orgs/policy-grid/policy-grid.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Component } from '@angular/core'; -import { PolicyComponentType } from 'src/app/modules/policies/policy-component-types.enum'; -import { LoginPolicy, OrgIamPolicy, PasswordComplexityPolicy, PolicyState } from 'src/app/proto/generated/management_pb'; -import { ManagementService } from 'src/app/services/mgmt.service'; - -@Component({ - selector: 'app-policy-grid', - templateUrl: './policy-grid.component.html', - styleUrls: ['./policy-grid.component.scss'], -}) -export class PolicyGridComponent { - public complexityPolicy!: PasswordComplexityPolicy.AsObject; - public iamPolicy!: OrgIamPolicy.AsObject; - public loginPolicy!: LoginPolicy.AsObject; - - public PolicyState: any = PolicyState; - public PolicyComponentType: any = PolicyComponentType; - - constructor( - private mgmtService: ManagementService, - ) { - this.getData(); - } - - private getData(): void { - this.mgmtService.GetPasswordComplexityPolicy().then(data => this.complexityPolicy = data.toObject()); - this.mgmtService.GetMyOrgIamPolicy().then(data => this.iamPolicy = data.toObject()); - this.mgmtService.GetLoginPolicy().then(data => { - this.loginPolicy = data.toObject(); - }); - } -} diff --git a/console/src/app/pages/projects/apps/app-create/app-create.component.scss b/console/src/app/pages/projects/apps/app-create/app-create.component.scss index a365fadb1d..bff6716fc7 100644 --- a/console/src/app/pages/projects/apps/app-create/app-create.component.scss +++ b/console/src/app/pages/projects/apps/app-create/app-create.component.scss @@ -5,7 +5,7 @@ h1 { p.desc { font-size: 14px; - color: #8795a1; + color: var(--grey); } .proswitch { @@ -57,12 +57,12 @@ p.desc { .step-title { font-size: 1.2rem; - color: #8795a1; + color: var(--grey); } .step-description { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .error { @@ -102,7 +102,7 @@ p.desc { .right { margin-bottom: .5rem; font-size: 14px; - color: #8795a1; + color: var(--grey); } } @@ -142,7 +142,6 @@ p.desc { margin-top: 3rem; display: block; padding: .5rem 4rem; - border-radius: .5rem; float: right; } } diff --git a/console/src/app/pages/projects/apps/app-detail/app-detail.component.html b/console/src/app/pages/projects/apps/app-detail/app-detail.component.html index dc7575441f..5570add6e3 100644 --- a/console/src/app/pages/projects/apps/app-detail/app-detail.component.html +++ b/console/src/app/pages/projects/apps/app-detail/app-detail.component.html @@ -12,7 +12,7 @@ {{errorMessage}} -
+
-
-
@@ -96,11 +95,36 @@ +
+ +

{{'APP.OIDC.TOKENSECTIONTITLE' | translate}}

+ + + {{ 'APP.OIDC.TOKENTYPE' | translate }} + + + {{ 'APP.OIDC.TOKENTYPE'+type | translate }} + + + + + + {{'APP.OIDC.ACCESSTOKENROLEASSERTION' | translate}} +

{{'APP.OIDC.ACCESSTOKENROLEASSERTION_DESCRIPTION' | translate}}

+ + {{'APP.OIDC.IDTOKENROLEASSERTION' | translate}} +

{{'APP.OIDC.IDTOKENROLEASSERTION_DESCRIPTION' | translate}}

+ +
+ +

{{'APP.OIDC.REDIRECTSECTIONTITLE' | translate}}

+ {{ 'APP.OIDC.DEVMODE' | translate }} -

{{'APP.OIDC.DEVMODEDESC' | translate}}

+

{{'APP.OIDC.DEVMODEDESC' | translate}}

{{'APP.OIDC.REDIRECTDESCRIPTIONNATIVE' | translate}}

@@ -110,7 +134,7 @@ {{ 'APP.OIDC.REDIRECT' | translate }} - + {{ 'APP.OIDC.POSTLOGOUTREDIRECT' | translate }} - +
-
diff --git a/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss b/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss index 5665936da3..3cf6017101 100644 --- a/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss +++ b/console/src/app/pages/projects/apps/app-detail/app-detail.component.scss @@ -19,7 +19,7 @@ width: 100%; display: block; font-size: .9rem; - color: #8795a1; + color: var(--grey); } .zitadel-warning { @@ -33,12 +33,6 @@ font-size: 14px; } -.card-actions { - button { - border-radius: .5rem; - } -} - .compliance .problem { font-size: 14px; } @@ -66,6 +60,21 @@ } } + .section-title { + margin-bottom: 1.5rem; + } + + .full-width { + flex-basis: 100%; + margin-left: .5rem; + margin-right: .5rem; + } + + .desc { + color: var(--grey); + font-size: 14px; + } + .devmode { flex: 1 1 100%; margin: 1rem .5rem; @@ -73,7 +82,7 @@ .step-description { font-size: .9rem; - color: #8795a1; + color: var(--grey); flex-basis: 100%; margin: 0 .5rem 1rem .5rem; } @@ -87,16 +96,21 @@ .docs-line { flex-basis: 100%; font-size: 14px; - color: #8795a1; + color: var(--grey); margin-top: 0; } .toggle { + outline: none; align-self: flex-start; margin-bottom: 1rem; margin-right: 1rem; border-radius: .5rem; + * { + outline: none; + } + i { margin-right: 1rem; } @@ -109,7 +123,6 @@ margin: 0 -.5rem; .submit-button { - border-radius: .5rem; margin: 0 .5rem; } } @@ -117,3 +130,10 @@ .chip[color='green'] { background-color: #56a392 !important; } + +.divider { + flex-basis: 100%; + margin: 1.5rem .5rem; + height: 1px; + background-color: var(--grey); +} diff --git a/console/src/app/pages/projects/apps/app-detail/app-detail.component.ts b/console/src/app/pages/projects/apps/app-detail/app-detail.component.ts index a8cf22ce6f..56537a1b2f 100644 --- a/console/src/app/pages/projects/apps/app-detail/app-detail.component.ts +++ b/console/src/app/pages/projects/apps/app-detail/app-detail.component.ts @@ -1,13 +1,14 @@ import { COMMA, ENTER, SPACE } from '@angular/cdk/keycodes'; import { Location } from '@angular/common'; import { Component, OnDestroy, OnInit } from '@angular/core'; -import { AbstractControl, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { MatButtonToggleChange } from '@angular/material/button-toggle'; import { MatChipInputEvent } from '@angular/material/chips'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { Subscription } from 'rxjs'; +import { take } from 'rxjs/operators'; import { Application, AppState, @@ -16,8 +17,10 @@ import { OIDCConfig, OIDCGrantType, OIDCResponseType, + OIDCTokenType, ZitadelDocs, } from 'src/app/proto/generated/management_pb'; +import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -34,6 +37,7 @@ enum RedirectType { styleUrls: ['./app-detail.component.scss'], }) export class AppDetailComponent implements OnInit, OnDestroy { + public canWrite: boolean = false; public errorMessage: string = ''; public removable: boolean = true; public addOnBlur: boolean = true; @@ -64,6 +68,11 @@ export class AppDetailComponent implements OnInit, OnDestroy { OIDCAuthMethodType.OIDCAUTHMETHODTYPE_NONE, ]; + public oidcTokenTypes: OIDCTokenType[] = [ + OIDCTokenType.OIDCTOKENTYPE_BEARER, + OIDCTokenType.OIDCTOKENTYPE_JWT, + ]; + public AppState: any = AppState; public appNameForm!: FormGroup; public appForm!: FormGroup; @@ -77,9 +86,10 @@ export class AppDetailComponent implements OnInit, OnDestroy { public OIDCApplicationType: any = OIDCApplicationType; public OIDCAuthMethodType: any = OIDCAuthMethodType; + public OIDCTokenType: any = OIDCTokenType; - public redirectControl: FormControl = new FormControl(''); - public postRedirectControl: FormControl = new FormControl(''); + public redirectControl: FormControl = new FormControl({ value: '', disabled: true }); + public postRedirectControl: FormControl = new FormControl({ value: '', disabled: true }); constructor( @@ -90,18 +100,22 @@ export class AppDetailComponent implements OnInit, OnDestroy { private _location: Location, private dialog: MatDialog, private mgmtService: ManagementService, + private authService: GrpcAuthService, ) { this.appNameForm = this.fb.group({ - state: ['', []], - name: ['', [Validators.required]], + state: [{ value: '', disabled: true }, []], + name: [{ value: '', disabled: true }, [Validators.required]], }); this.appForm = this.fb.group({ - devMode: [false, []], + devMode: [{ value: false, disabled: true }, []], clientId: [{ value: '', disabled: true }], - responseTypesList: [], - grantTypesList: [], - applicationType: [], - authMethodType: [], + responseTypesList: [{ value: [], disabled: true }], + grantTypesList: [{ value: [], disabled: true }], + applicationType: [{ value: '', disabled: true }], + authMethodType: [{ value: '', disabled: true }], + accessTokenType: [{ value: '', disabled: true }], + accessTokenRoleAssertion: [{ value: false, disabled: true }], + idTokenRoleAssertion: [{ value: false, disabled: true }], }); } @@ -118,36 +132,35 @@ export class AppDetailComponent implements OnInit, OnDestroy { this.mgmtService.GetIam().then(iam => { this.isZitadel = iam.toObject().iamProjectId === this.projectId; }); + this.authService.isAllowed(['project.app.write$', 'project.app.write:' + id]).pipe(take(1)).subscribe((allowed) => { + this.canWrite = allowed; + this.mgmtService.GetApplicationById(projectid, id).then(app => { + this.app = app.toObject(); + this.appNameForm.patchValue(this.app); + if (allowed) { + this.appNameForm.enable(); + this.appForm.enable(); + this.redirectControl.enable(); + this.postRedirectControl.enable(); + } - this.mgmtService.GetApplicationById(projectid, id).then(app => { - this.app = app.toObject(); - this.appNameForm.patchValue(this.app); - - if (this.app.state !== AppState.APPSTATE_ACTIVE) { - this.appNameForm.controls['name'].disable(); - this.appForm.disable(); - } else { - this.appNameForm.controls['name'].enable(); - this.appForm.enable(); - } - if (this.app.oidcConfig?.redirectUrisList) { - this.redirectUrisList = this.app.oidcConfig.redirectUrisList; - - // this.redirectControl = new FormControl('', [nativeValidator as ValidatorFn]); - } - if (this.app.oidcConfig?.postLogoutRedirectUrisList) { - this.postLogoutRedirectUrisList = this.app.oidcConfig.postLogoutRedirectUrisList; - // this.postRedirectControl = new FormControl('', [nativeValidator as ValidatorFn]); - } - if (this.app.oidcConfig) { - this.appForm.patchValue(this.app.oidcConfig); - } - }).catch(error => { - console.error(error); - this.toast.showError(error); - this.errorMessage = error.message; + if (this.app.oidcConfig?.redirectUrisList) { + this.redirectUrisList = this.app.oidcConfig.redirectUrisList; + } + if (this.app.oidcConfig?.postLogoutRedirectUrisList) { + this.postLogoutRedirectUrisList = this.app.oidcConfig.postLogoutRedirectUrisList; + } + if (this.app.oidcConfig) { + this.appForm.patchValue(this.app.oidcConfig); + } + }).catch(error => { + console.error(error); + this.toast.showError(error); + this.errorMessage = error.message; + }); }); + this.docs = (await this.mgmtService.GetZitadelDocs()).toObject(); } @@ -160,20 +173,11 @@ export class AppDetailComponent implements OnInit, OnDestroy { }); } else if (event.value === AppState.APPSTATE_INACTIVE) { this.mgmtService.DeactivateApplication(this.projectId, this.app.id).then(() => { - this.toast.showInfo('APP.TOAST.REACTIVATED', true); + this.toast.showInfo('APP.TOAST.DEACTIVATED', true); }).catch((error: any) => { this.toast.showError(error); }); } - - if (event.value !== AppState.APPSTATE_ACTIVE) { - this.appNameForm.controls['name'].disable(); - this.appForm.disable(); - } else { - this.appNameForm.controls['name'].enable(); - this.appForm.enable(); - this.clientId?.disable(); - } } public add(event: MatChipInputEvent, target: RedirectType): void { @@ -212,6 +216,22 @@ export class AppDetailComponent implements OnInit, OnDestroy { } } + public saveApp(): void { + if (this.appNameForm.valid) { + this.app.name = this.name?.value; + + this.mgmtService + .UpdateApplication(this.projectId, this.app.id, this.name?.value) + .then(() => { + this.toast.showInfo('APP.TOAST.OIDCUPDATED', true); + }) + .catch(error => { + this.toast.showError(error); + }); + } + } + + public saveOIDCApp(): void { if (this.appNameForm.valid) { this.app.name = this.name?.value; @@ -226,6 +246,9 @@ export class AppDetailComponent implements OnInit, OnDestroy { this.app.oidcConfig.redirectUrisList = this.redirectUrisList; this.app.oidcConfig.postLogoutRedirectUrisList = this.postLogoutRedirectUrisList; this.app.oidcConfig.devMode = this.devMode?.value; + this.app.oidcConfig.accessTokenType = this.accessTokenType?.value; + this.app.oidcConfig.accessTokenRoleAssertion = this.accessTokenRoleAssertion?.value; + this.app.oidcConfig.idTokenRoleAssertion = this.idTokenRoleAssertion?.value; this.mgmtService .UpdateOIDCAppConfig(this.projectId, this.app.id, this.app.oidcConfig) @@ -286,4 +309,16 @@ export class AppDetailComponent implements OnInit, OnDestroy { public get devMode(): AbstractControl | null { return this.appForm.get('devMode'); } + + public get accessTokenType(): AbstractControl | null { + return this.appForm.get('accessTokenType'); + } + + public get idTokenRoleAssertion(): AbstractControl | null { + return this.appForm.get('idTokenRoleAssertion'); + } + + public get accessTokenRoleAssertion(): AbstractControl | null { + return this.appForm.get('accessTokenRoleAssertion'); + } } diff --git a/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss b/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss index 5484eab9c5..87f3b764d0 100644 --- a/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss +++ b/console/src/app/pages/projects/apps/app-secret-dialog/app-secret-dialog.component.scss @@ -3,7 +3,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -18,10 +18,6 @@ .ok-button { margin-left: .5rem; } - - button { - border-radius: .5rem; - } } .flex { diff --git a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html index 3154c27a66..58afb475fa 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html +++ b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.html @@ -18,9 +18,9 @@ + [disableWrite]="(['user.grant.write$','user.grant.write:'+grantId] | hasRole | async) == false" + [disableDelete]="(['user.grant.delete$','user.grant.delete:'+grantId] | hasRole | async) == false" + refreshOnPreviousRoutes="['/grant-create/project/{{projectId}}/grant/{{grantId}}']">
@@ -40,7 +40,7 @@ [membersSubject]="membersSubject" title="{{ 'PROJECT.MEMBER.TITLE' | translate }}" description="{{ 'PROJECT.MEMBER.TITLEDESC' | translate }}" (addClicked)="openAddMember()" (showDetailClicked)="showDetail()" (refreshClicked)="loadMembers()" - [disabled]="(['project.grant.member.write', 'project.grant.member.write:'+ project.projectId]| hasRole | async) == false"> + [disabled]="(['project.grant.member.write$', 'project.grant.member.write:'+ project.projectId]| hasRole | async) == false"> diff --git a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss index 4d595baba2..a44156df05 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss +++ b/console/src/app/pages/projects/granted-projects/granted-project-detail/granted-project-detail.component.scss @@ -23,7 +23,7 @@ .desc { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .zitadel-warning { @@ -37,7 +37,7 @@ width: 100%; display: block; font-size: .9rem; - color: #8795a1; + color: var(--grey); } .side { diff --git a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss index ff826ddb63..6c769d450d 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss +++ b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-grid/granted-project-grid.component.scss @@ -48,9 +48,10 @@ border-radius: .5rem; box-sizing: border-box; min-height: 166px; + transition: box-shadow .1s ease-in; &.inactive { - color: #8795a1; + color: var(--grey); } img { @@ -70,7 +71,7 @@ font-size: .8rem; margin-bottom: 0; margin-top: .5rem; - color: #8795a1; + color: var(--grey); } .name { @@ -85,7 +86,7 @@ .created { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .organization { @@ -119,7 +120,7 @@ right: 0; margin: 0; margin-bottom: .25rem; - color: #8795a1; + color: var(--grey); &.selected { opacity: 1; @@ -127,70 +128,17 @@ } &:hover { + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); + .edit-button { opacity: 1; } - - .text-part { - .icons { - opacity: 1; - } - } } &.selected { - .text-part { - .icons { - opacity: 1; - } - } - .edit-button { opacity: 1; } - - .icon { - opacity: 1; - } - } - - @media only screen and (max-width: 450px) { - flex-basis: 100%; - } - } - - .add-project-button { - z-index: 100; - flex-basis: 250px; - cursor: pointer; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - min-height: 166px; - border-radius: .5rem; - margin: 1rem; - box-sizing: border-box; - - .icon { - display: flex; - justify-content: center; - align-self: center; - margin-bottom: 1rem; - height: 2.5rem; - line-height: 2.5rem; - font-size: 2.5rem; - } - - &:hover { - background-color: #ffffff25; - - .icon, - span { - &.disabled { - color: gray; - } - } } @media only screen and (max-width: 450px) { @@ -203,5 +151,5 @@ flex-basis: 100%; padding: 0 1rem; font-size: .8rem; - color: #8795a1; + color: var(--grey); } diff --git a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.html b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.html index 2d30526f8f..92e8f886da 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.html +++ b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.html @@ -63,7 +63,7 @@ - diff --git a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.scss b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.scss index 069b21ce12..a9b1a25369 100644 --- a/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.scss +++ b/console/src/app/pages/projects/granted-projects/granted-project-list/granted-project-list.component.scss @@ -6,7 +6,6 @@ .icon-button { display: block; - border-radius: .5rem; } } @@ -33,14 +32,6 @@ } } - .data-row { - cursor: pointer; - - &:hover { - background-color: #ffffff05; - } - } - .selection { width: 50px; max-width: 50px; diff --git a/console/src/app/pages/projects/granted-projects/granted-projects.component.scss b/console/src/app/pages/projects/granted-projects/granted-projects.component.scss index 1cd29b44cb..6ba509e9b9 100644 --- a/console/src/app/pages/projects/granted-projects/granted-projects.component.scss +++ b/console/src/app/pages/projects/granted-projects/granted-projects.component.scss @@ -3,7 +3,7 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/projects/granted-projects/granted-projects.module.ts b/console/src/app/pages/projects/granted-projects/granted-projects.module.ts index b3f3034853..ffd9727d37 100644 --- a/console/src/app/pages/projects/granted-projects/granted-projects.module.ts +++ b/console/src/app/pages/projects/granted-projects/granted-projects.module.ts @@ -25,9 +25,9 @@ import { ProjectRolesModule } from 'src/app/modules/project-roles/project-roles. import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; import { SharedModule } from 'src/app/modules/shared/shared.module'; import { UserGrantsModule } from 'src/app/modules/user-grants/user-grants.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { GrantedProjectDetailComponent } from './granted-project-detail/granted-project-detail.component'; import { GrantedProjectGridComponent } from './granted-project-list/granted-project-grid/granted-project-grid.component'; diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss index ac0eee012d..7db458a3c4 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/application-grid/application-grid.component.scss @@ -52,7 +52,7 @@ border: 1px solid $accent-color; font-weight: 800; background-color: $primary-dark; - transition: background-color .2s ease-in-out; + transition: background-color box-shadow .3s ease-in; background-image: linear-gradient(transparent 11px, rgba($accent-color, .5) 12px, transparent 12px), linear-gradient(90deg, transparent 11px, rgba($accent-color, .5) 12px, transparent 12px); @@ -60,6 +60,7 @@ &:hover { background-color: rgba($accent-color, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); } &.add { diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/applications/applications.component.html b/console/src/app/pages/projects/owned-projects/owned-project-detail/applications/applications.component.html index ccdc523fee..9012cba3ad 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/applications/applications.component.html +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/applications/applications.component.html @@ -1,8 +1,8 @@ - + add{{ 'ACTIONS.NEW' | translate }} @@ -31,7 +31,7 @@ - +
@@ -68,8 +68,9 @@ [appHasRole]="['project.grant.read:' + project.projectId, 'project.grant.read']"> - @@ -78,8 +79,16 @@ +

{{'PROJECT.ROLE.OPTIONS' | translate}}

+ + {{'PROJECT.ROLE.ASSERTION' | translate}} +

{{'PROJECT.ROLE.ASSERTION_DESCRIPTION' | translate}}

+ + {{'PROJECT.ROLE.CHECK' | translate}} +

{{'PROJECT.ROLE.CHECK_DESCRIPTION' | translate}}

+
@@ -89,9 +98,9 @@ + [refreshOnPreviousRoutes]="['/grant-create/project/'+projectId]" + [disableWrite]="((['user.grant.write$', 'user.grant.write:'+projectId] | hasRole) | async) == false" + [disableDelete]="((['user.grant.delete$','user.grant.delete:'+projectId] | hasRole) | async) == false">
@@ -113,7 +122,7 @@ [membersSubject]="membersSubject" title="{{ 'PROJECT.MEMBER.TITLE' | translate }}" description="{{ 'PROJECT.MEMBER.TITLEDESC' | translate }}" (addClicked)="openAddMember()" (showDetailClicked)="showDetail()" (refreshClicked)="loadMembers()" - [disabled]="(['project.member.write', 'project.member.write:'+ project.projectId]| hasRole | async) == false"> + [disabled]="(['project.member.write$', 'project.member.write:'+ project.projectId]| hasRole | async) == false"> diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss index f67ffcee15..2ab632c081 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.scss @@ -9,10 +9,6 @@ flex: 1; } - .state-button { - border-radius: .5rem; - } - a { display: block; } @@ -35,7 +31,7 @@ .desc { font-size: .9rem; - color: #8795a1; + color: var(--grey); } .zitadel-warning { @@ -80,3 +76,15 @@ flex-direction: column; } } + +.desc { + color: var(--grey); + font-size: 14px; + margin-bottom: 1.5rem; +} + +.divider { + height: 1px; + background-color: var(--grey); + margin-bottom: 1.5rem; +} diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.ts b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.ts index 52d10c9bc0..617896a5b5 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.ts +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.component.ts @@ -191,7 +191,8 @@ export class OwnedProjectDetailComponent implements OnInit, OnDestroy { } public saveProject(): void { - this.mgmtService.UpdateProject(this.project.projectId, this.project.name).then(() => { + console.log(this.project); + this.mgmtService.UpdateProject(this.project.projectId, this.project).then(() => { this.toast.showInfo('PROJECT.TOAST.UPDATED', true); }).catch(error => { this.toast.showError(error); diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.module.ts b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.module.ts index db09e0c6b9..930c81c7f6 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.module.ts +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/owned-project-detail.module.ts @@ -24,9 +24,9 @@ import { ProjectRolesModule } from 'src/app/modules/project-roles/project-roles. import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; import { UserGrantsModule } from 'src/app/modules/user-grants/user-grants.module'; import { WarnDialogModule } from 'src/app/modules/warn-dialog/warn-dialog.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { ApplicationGridComponent } from './application-grid/application-grid.component'; import { ApplicationsComponent } from './applications/applications.component'; diff --git a/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html b/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html index 34075312dd..4e29faeb68 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html +++ b/console/src/app/pages/projects/owned-projects/owned-project-detail/project-grants/project-grants.component.html @@ -1,6 +1,6 @@ + [emitRefreshOnPreviousRoutes]="refreshOnPreviousRoutes" (refreshed)="getRoleOptions(projectId)">
- + diff --git a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss index 8b9c70c6ae..6d30cb404f 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.scss @@ -48,9 +48,10 @@ border-radius: .5rem; box-sizing: border-box; min-height: 166px; + transition: box-shadow .1s ease-in; &.inactive { - color: #8795a1; + color: var(--grey); } img { @@ -70,7 +71,7 @@ font-size: .8rem; margin-bottom: 0; margin-top: .5rem; - color: #8795a1; + color: var(--grey); } .name { @@ -85,7 +86,7 @@ .created { font-size: .8rem; - color: #8795a1; + color: var(--grey); } .organization { @@ -111,6 +112,20 @@ } } + .delete-button { + opacity: 0; + user-select: none; + position: absolute; + bottom: 0; + right: 30px; + margin: 0; + margin-bottom: .25rem; + + &:not(:hover) { + color: #8795a1; + } + } + .edit-button { opacity: 0; user-select: none; @@ -119,7 +134,7 @@ right: 0; margin: 0; margin-bottom: .25rem; - color: #8795a1; + color: var(--grey); &.selected { opacity: 1; @@ -127,24 +142,16 @@ } &:hover { + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); + + .delete-button, .edit-button { opacity: 1; } - - .text-part { - .icons { - opacity: 1; - } - } } &.selected { - .text-part { - .icons { - opacity: 1; - } - } - + .delete-button, .edit-button { opacity: 1; } @@ -171,6 +178,7 @@ border-radius: .5rem; margin: 1rem; box-sizing: border-box; + transition: box-shadow .1s ease-in; .icon { display: flex; @@ -183,7 +191,7 @@ } &:hover { - background-color: #ffffff25; + box-shadow: 0 5px 10px rgba(0, 0, 0, .12); .icon, span { @@ -202,6 +210,6 @@ .n-items { padding: 0 1rem; font-size: .8rem; - color: #8795a1; + color: var(--grey); flex-basis: 100%; } diff --git a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.ts b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.ts index f1756c3185..0b0755587e 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.ts +++ b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-grid/owned-project-grid.component.ts @@ -1,11 +1,14 @@ import { animate, animateChild, keyframes, query, stagger, style, transition, trigger } from '@angular/animations'; import { SelectionModel } from '@angular/cdk/collections'; import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { Router } from '@angular/router'; +import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { Org } from 'src/app/proto/generated/auth_pb'; import { ProjectState, ProjectType, ProjectView } from 'src/app/proto/generated/management_pb'; -import { AuthenticationService } from 'src/app/services/authentication.service'; +import { ManagementService } from 'src/app/services/mgmt.service'; import { StorageKey, StorageService } from 'src/app/services/storage.service'; +import { ToastService } from 'src/app/services/toast.service'; @Component({ selector: 'app-owned-project-grid', @@ -48,8 +51,14 @@ export class OwnedProjectGridComponent implements OnChanges { public showNewProject: boolean = false; public ProjectState: any = ProjectState; public ProjectType: any = ProjectType; - - constructor(private router: Router, private authService: AuthenticationService, private storage: StorageService) { + @Input() public zitadelProjectId: string = ''; + constructor( + private router: Router, + private dialog: MatDialog, + private storage: StorageService, + private mgmtService: ManagementService, + private toast: ToastService, + ) { this.selection.changed.subscribe(selection => { this.setPrefixedItem('pinned-projects', JSON.stringify( this.selection.selected.map(item => item.projectId), @@ -123,4 +132,30 @@ export class OwnedProjectGridComponent implements OnChanges { public closeGridView(): void { this.changedView.emit(true); } + + public deleteProject(item: ProjectView.AsObject): void { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.DELETE', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'PROJECT.PAGES.DIALOG.DELETE.TITLE', + descriptionKey: 'PROJECT.PAGES.DIALOG.DELETE.DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (resp && item.projectId !== this.zitadelProjectId) { + this.mgmtService.RemoveProject(item.projectId).then(() => { + this.toast.showInfo('PROJECT.TOAST.DELETED', true); + const index = this.items.findIndex(iter => iter.projectId === item.projectId); + if (index > -1) { + this.items.splice(index, 1); + } + }).catch(error => { + this.toast.showError(error); + }); + } + }); + } } diff --git a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.html b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.html index 2c39ced120..649ecaf830 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.html +++ b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.html @@ -1,5 +1,6 @@ - +
@@ -12,7 +13,7 @@ [selection]="selection" [loading]="loading$ | async"> - + add{{ 'ACTIONS.NEW' | translate }} @@ -61,8 +62,18 @@ + + + + + + + - diff --git a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss index 5752bf3738..f78e21b880 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.scss @@ -3,7 +3,7 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } @@ -41,14 +41,6 @@ h1 { } } - .data-row { - cursor: pointer; - - &:hover { - background-color: #ffffff05; - } - } - .selection { width: 50px; max-width: 50px; diff --git a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.ts b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.ts index 96c9588497..8b52d2bb71 100644 --- a/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.ts +++ b/console/src/app/pages/projects/owned-projects/owned-project-list/owned-project-list.component.ts @@ -1,12 +1,14 @@ import { animate, animateChild, query, stagger, style, transition, trigger } from '@angular/animations'; import { SelectionModel } from '@angular/cdk/collections'; import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { Timestamp } from 'google-protobuf/google/protobuf/timestamp_pb'; import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { ProjectView } from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; @@ -45,7 +47,7 @@ export class OwnedProjectListComponent implements OnInit, OnDestroy { @ViewChild(MatPaginator) public paginator!: MatPaginator; public ownedProjectList: ProjectView.AsObject[] = []; - public displayedColumns: string[] = ['select', 'name', 'state', 'creationDate', 'changeDate']; + public displayedColumns: string[] = ['select', 'name', 'state', 'creationDate', 'changeDate', 'actions']; public selection: SelectionModel = new SelectionModel(true, []); private loadingSubject: BehaviorSubject = new BehaviorSubject(false); @@ -54,11 +56,18 @@ export class OwnedProjectListComponent implements OnInit, OnDestroy { public grid: boolean = true; private subscription?: Subscription; + public zitadelProjectId: string = ''; + constructor(private router: Router, public translate: TranslateService, private mgmtService: ManagementService, private toast: ToastService, - ) { } + private dialog: MatDialog, + ) { + this.mgmtService.GetIam().then(iam => { + this.zitadelProjectId = iam.toObject().iamProjectId; + }); + } public ngOnInit(): void { this.getData(10, 0); @@ -140,4 +149,29 @@ export class OwnedProjectListComponent implements OnInit, OnDestroy { this.selection.clear(); this.getData(this.paginator.pageSize, this.paginator.pageIndex * this.paginator.pageSize); } + + public deleteProject(item: ProjectView.AsObject): void { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.DELETE', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'PROJECT.PAGES.DIALOG.DELETE.TITLE', + descriptionKey: 'PROJECT.PAGES.DIALOG.DELETE.DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (this.zitadelProjectId && resp && item.projectId !== this.zitadelProjectId) { + this.mgmtService.RemoveProject(item.projectId).then(() => { + this.toast.showInfo('PROJECT.TOAST.DELETED', true); + setTimeout(() => { + this.refreshPage(); + }, 1000); + }).catch(error => { + this.toast.showError(error); + }); + } + }); + } } diff --git a/console/src/app/pages/projects/owned-projects/owned-projects.component.scss b/console/src/app/pages/projects/owned-projects/owned-projects.component.scss index 1cd29b44cb..6ba509e9b9 100644 --- a/console/src/app/pages/projects/owned-projects/owned-projects.component.scss +++ b/console/src/app/pages/projects/owned-projects/owned-projects.component.scss @@ -3,7 +3,7 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/projects/owned-projects/owned-projects.component.ts b/console/src/app/pages/projects/owned-projects/owned-projects.component.ts index e17472f071..acf63d2350 100644 --- a/console/src/app/pages/projects/owned-projects/owned-projects.component.ts +++ b/console/src/app/pages/projects/owned-projects/owned-projects.component.ts @@ -5,6 +5,4 @@ import { Component } from '@angular/core'; templateUrl: './owned-projects.component.html', styleUrls: ['./owned-projects.component.scss'], }) -export class OwnedProjectsComponent { - constructor() { } -} +export class OwnedProjectsComponent { } diff --git a/console/src/app/pages/projects/owned-projects/owned-projects.module.ts b/console/src/app/pages/projects/owned-projects/owned-projects.module.ts index 3638809112..63fc30ca76 100644 --- a/console/src/app/pages/projects/owned-projects/owned-projects.module.ts +++ b/console/src/app/pages/projects/owned-projects/owned-projects.module.ts @@ -20,9 +20,10 @@ import { CardModule } from 'src/app/modules/card/card.module'; import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; import { SharedModule } from 'src/app/modules/shared/shared.module'; import { UserGrantsModule } from 'src/app/modules/user-grants/user-grants.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { WarnDialogModule } from 'src/app/modules/warn-dialog/warn-dialog.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { OwnedProjectGridComponent } from './owned-project-list/owned-project-grid/owned-project-grid.component'; import { OwnedProjectListComponent } from './owned-project-list/owned-project-list.component'; @@ -51,6 +52,7 @@ import { OwnedProjectsComponent } from './owned-projects.component'; MatInputModule, MatChipsModule, MatIconModule, + WarnDialogModule, MatButtonModule, MatProgressSpinnerModule, MatProgressBarModule, diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail-datasource.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail-datasource.ts deleted file mode 100644 index 6958d8758a..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail-datasource.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { DataSource } from '@angular/cdk/collections'; -import { BehaviorSubject, from, Observable, of } from 'rxjs'; -import { catchError, finalize, map } from 'rxjs/operators'; -import { ProjectMemberView } from 'src/app/proto/generated/management_pb'; -import { ManagementService } from 'src/app/services/mgmt.service'; - -/** - * Data source for the ProjectMembers view. This class should - * encapsulate all logic for fetching and manipulating the displayed data - * (including sorting, pagination, and filtering). - */ -export class ProjectGrantDetailDataSource extends DataSource { - public totalResult: number = 0; - public membersSubject: BehaviorSubject - = new BehaviorSubject([]); - private loadingSubject: BehaviorSubject = new BehaviorSubject(false); - public loading$: Observable = this.loadingSubject.asObservable(); - - constructor(private mgmtService: ManagementService) { - super(); - } - - public loadMembers(projectId: string, grantId: string, - pageIndex: number, pageSize: number, sortDirection?: string): void { - const offset = pageIndex * pageSize; - - this.loadingSubject.next(true); - - from(this.mgmtService.SearchProjectGrantMembers(projectId, grantId, pageSize, offset)).pipe( - map(resp => { - this.totalResult = resp.toObject().totalResult; - return resp.toObject().resultList; - }), - catchError(() => of([])), - finalize(() => this.loadingSubject.next(false)), - ).subscribe(members => { - this.membersSubject.next(members); - }); - } - - - /** - * Connect this data source to the table. The table will only update when - * the returned stream emits new items. - * @returns A stream of the items to be rendered. - */ - public connect(): Observable { - return this.membersSubject.asObservable(); - }; - - /** - * Called when the table is being destroyed. Use this function, to clean up - * any open connections or free any held resources that were set up during connect. - */ - public disconnect(): void { - this.membersSubject.complete(); - this.loadingSubject.complete(); - } -} diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html index 8a61f1ed0b..c9872fb86e 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.html @@ -18,10 +18,9 @@
@@ -29,7 +28,7 @@ {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} - + {{role.key}} @@ -40,7 +39,19 @@

{{ 'PROJECT.GRANT.DETAIL.MEMBERTITLE' | translate }}

{{ 'PROJECT.GRANT.DETAIL.MEMBERDESC' | translate }}

- - + + + + add{{ 'ACTIONS.NEW' | translate }} + + \ No newline at end of file diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss index 7af6c271d3..5c15ed70e3 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.scss @@ -1,4 +1,8 @@ +.del-button { + margin-right: .5rem; +} + .master-row { display: flex; flex-wrap: wrap; @@ -21,7 +25,7 @@ } .first { - color: #8795a1; + color: var(--grey); } } } @@ -29,10 +33,6 @@ .fill-space { flex: 1; } - - .state-button { - border-radius: .5rem; - } } .formfield { @@ -41,5 +41,5 @@ .divider { height: 1px; - background-color: #ffffff20; + background-color: #8795a140; } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts index 16c159df66..40da52c844 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.component.ts @@ -1,8 +1,12 @@ -import { Component } from '@angular/core'; +import { Component, EventEmitter } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { PageEvent } from '@angular/material/paginator'; import { MatSelectChange } from '@angular/material/select'; import { ActivatedRoute } from '@angular/router'; import { ProjectGrant, + ProjectGrantMember, + ProjectGrantMemberView, ProjectGrantState, ProjectGrantView, ProjectRoleView, @@ -11,12 +15,20 @@ import { import { ManagementService } from 'src/app/services/mgmt.service'; import { ToastService } from 'src/app/services/toast.service'; +import { + ProjectGrantMembersCreateDialogComponent, + ProjectGrantMembersCreateDialogExportType, +} from './project-grant-members-create-dialog/project-grant-members-create-dialog.component'; +import { ProjectGrantMembersDataSource } from './project-grant-members-datasource'; + @Component({ selector: 'app-project-grant-detail', templateUrl: './project-grant-detail.component.html', styleUrls: ['./project-grant-detail.component.scss'], }) export class ProjectGrantDetailComponent { + public INITIALPAGESIZE: number = 25; + public grant!: ProjectGrantView.AsObject; public projectid: string = ''; public grantid: string = ''; @@ -27,18 +39,37 @@ export class ProjectGrantDetailComponent { public isZitadel: boolean = false; ProjectGrantState: any = ProjectGrantState; - public memberRoleOptions: ProjectRoleView.AsObject[] = []; + public projectRoleOptions: ProjectRoleView.AsObject[] = []; + public memberRoleOptions: Array = []; + public changePageFactory!: Function; + public changePage: EventEmitter = new EventEmitter(); + public selection: Array = []; + public dataSource!: ProjectGrantMembersDataSource; constructor( private mgmtService: ManagementService, private route: ActivatedRoute, private toast: ToastService, + private dialog: MatDialog, ) { this.route.params.subscribe(params => { this.projectid = params.projectid; this.grantid = params.grantid; + this.dataSource = new ProjectGrantMembersDataSource(this.mgmtService); + this.dataSource.loadGrantMembers(params.projectid, params.grantid, 0, this.INITIALPAGESIZE); + this.getRoleOptions(params.projectid); + this.getMemberRoleOptions(); + + this.changePageFactory = (event?: PageEvent) => { + return this.dataSource.loadGrantMembers( + params.projectid, + params.grantid, + event?.pageIndex ?? 0, + event?.pageSize ?? this.INITIALPAGESIZE, + ); + }; this.mgmtService.ProjectGrantByID(this.grantid, this.projectid).then((grant) => { this.grant = grant.toObject(); @@ -66,7 +97,15 @@ export class ProjectGrantDetailComponent { public getRoleOptions(projectId: string): void { this.mgmtService.SearchProjectRoles(projectId, 100, 0).then(resp => { - this.memberRoleOptions = resp.toObject().resultList; + this.projectRoleOptions = resp.toObject().resultList; + }); + } + + public getMemberRoleOptions(): void { + this.mgmtService.GetProjectGrantMemberRoles().then(resp => { + this.memberRoleOptions = resp.toObject().rolesList; + }).catch(error => { + this.toast.showError(error); }); } @@ -78,4 +117,57 @@ export class ProjectGrantDetailComponent { this.toast.showError(error); }); } + + public removeProjectMemberSelection(): void { + Promise.all(this.selection.map(member => { + return this.mgmtService.RemoveProjectGrantMember(this.grant.projectId, this.grant.id, member.userId).then(() => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERREMOVED', true); + setTimeout(() => { + this.changePage.emit(); + }, 1000); + }).catch(error => { + this.toast.showError(error); + }); + })); + } + + public async openAddMember(): Promise { + const keysList = (await this.mgmtService.GetProjectGrantMemberRoles()).toObject(); + + const dialogRef = this.dialog.open(ProjectGrantMembersCreateDialogComponent, { + data: { + roleKeysList: keysList.rolesList, + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe((dataToAdd: ProjectGrantMembersCreateDialogExportType) => { + if (dataToAdd) { + Promise.all(dataToAdd.userIds.map((userid: string) => { + return this.mgmtService.AddProjectGrantMember( + this.grant.projectId, + this.grant.id, + userid, + dataToAdd.rolesKeyList, + ); + })).then(() => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERADDED', true); + setTimeout(() => { + this.changePage.emit(); + }, 3000); + }).catch(error => { + this.toast.showError(error); + }); + } + }); + } + + updateMemberRoles(member: ProjectGrantMember.AsObject, selectionChange: MatSelectChange): void { + this.mgmtService.ChangeProjectGrantMember(this.grant.projectId, this.grant.id, member.userId, selectionChange.value) + .then((_: ProjectGrantMember) => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERCHANGED', true); + }).catch(error => { + this.toast.showError(error); + }); + } } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts index 41477fff34..5ec566c2c6 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-detail.module.ts @@ -5,6 +5,7 @@ import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule } from '@angular/material/chips'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatPaginatorModule } from '@angular/material/paginator'; @@ -15,19 +16,21 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { MembersTableModule } from 'src/app/modules/members-table/members-table.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { ProjectGrantDetailRoutingModule } from './project-grant-detail-routing.module'; import { ProjectGrantDetailComponent } from './project-grant-detail.component'; -import { ProjectGrantMembersModule } from './project-grant-members/project-grant-members.module'; - +import { + ProjectGrantMembersCreateDialogModule, +} from './project-grant-members-create-dialog/project-grant-members-create-dialog.module'; @NgModule({ declarations: [ProjectGrantDetailComponent], imports: [ CommonModule, ProjectGrantDetailRoutingModule, - ProjectGrantMembersModule, + ProjectGrantMembersCreateDialogModule, MatAutocompleteModule, HasRoleModule, MatChipsModule, @@ -45,6 +48,8 @@ import { ProjectGrantMembersModule } from './project-grant-members/project-grant MatSelectModule, DetailLayoutModule, HasRolePipeModule, + MembersTableModule, + MatDialogModule, ], }) export class ProjectGrantDetailModule { } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.html diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss similarity index 76% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss index ad7115290c..53919d7751 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.scss @@ -9,8 +9,4 @@ .ok-button { margin-left: .5rem; } - - button { - border-radius: .5rem; - } } diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.spec.ts diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.component.ts diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts similarity index 100% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-create-dialog/project-grant-members-create-dialog.module.ts diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-datasource.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-datasource.ts similarity index 97% rename from console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-datasource.ts rename to console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-datasource.ts index 7cbb4d6d7d..27d0c9f603 100644 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members-datasource.ts +++ b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-datasource.ts @@ -32,6 +32,7 @@ export class ProjectGrantMembersDataSource extends DataSource { const response = resp.toObject(); + console.log(response.resultList); this.totalResult = response.totalResult; if (response.viewTimestamp) { this.viewTimestamp = response.viewTimestamp; diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.html b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.html deleted file mode 100644 index 6d8705b2bb..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - add{{ 'ACTIONS.NEW' | translate }} - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - {{ 'PROJECT.MEMBER.FIRSTNAME' | translate }} - {{member.firstName}} {{ 'PROJECT.MEMBER.LASTNAME' | translate }} - {{member.lastName}} {{ 'PROJECT.MEMBER.USERNAME' | translate }} - {{member.userName}} {{ 'PROJECT.MEMBER.EMAIL' | translate }} - {{member.email}} - {{ 'PROJECT.MEMBER.ROLES' | translate }} - - {{ 'PROJECT.MEMBER.ROLES' | translate }} - - - {{ role }} - - - -
- - - -
-
\ No newline at end of file diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.ts deleted file mode 100644 index 87628db083..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.component.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { SelectionModel } from '@angular/cdk/collections'; -import { AfterViewInit, Component, Input, OnInit, ViewChild } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSelectChange } from '@angular/material/select'; -import { MatTable } from '@angular/material/table'; -import { tap } from 'rxjs/operators'; -import { ProjectMember, ProjectType } from 'src/app/proto/generated/management_pb'; -import { ManagementService } from 'src/app/services/mgmt.service'; -import { ToastService } from 'src/app/services/toast.service'; - -import { - ProjectGrantMembersCreateDialogComponent, - ProjectGrantMembersCreateDialogExportType, -} from './project-grant-members-create-dialog/project-grant-members-create-dialog.component'; -import { ProjectGrantMembersDataSource } from './project-grant-members-datasource'; - -@Component({ - selector: 'app-project-grant-members', - templateUrl: './project-grant-members.component.html', - styleUrls: ['./project-grant-members.component.scss'], -}) -export class ProjectGrantMembersComponent implements AfterViewInit, OnInit { - @Input() public projectId!: string; - @Input() public grantId!: string; - - @Input() public type: ProjectType = ProjectType.PROJECTTYPE_GRANTED; - - @ViewChild(MatPaginator) public paginator!: MatPaginator; - @ViewChild(MatTable) public table!: MatTable; - public dataSource!: ProjectGrantMembersDataSource; - public selection: SelectionModel = new SelectionModel(true, []); - - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'roles']; - - public ProjectType: any = ProjectType; - public memberRoleOptions: string[] = []; - - constructor( - private mgmtService: ManagementService, - private dialog: MatDialog, - private toast: ToastService, - ) { - this.dataSource = new ProjectGrantMembersDataSource(this.mgmtService); - this.getRoleOptions(); - } - - public ngOnInit(): void { - this.dataSource.loadGrantMembers(this.projectId, this.grantId, 0, 25); - } - - public ngAfterViewInit(): void { - this.paginator.page - .pipe( - tap(() => this.loadMembersPage()), - ) - .subscribe(); - } - - public getRoleOptions(): void { - if (this.type === ProjectType.PROJECTTYPE_GRANTED) { - this.mgmtService.GetProjectGrantMemberRoles().then(resp => { - this.memberRoleOptions = resp.toObject().rolesList; - }).catch(error => { - this.toast.showError(error); - }); - } else if (this.type === ProjectType.PROJECTTYPE_OWNED) { - this.mgmtService.GetProjectMemberRoles().then(resp => { - this.memberRoleOptions = resp.toObject().rolesList; - }).catch(error => { - this.toast.showError(error); - }); - } - } - - private loadMembersPage(): void { - this.dataSource.loadGrantMembers( - this.projectId, - this.grantId, - this.paginator.pageIndex, - this.paginator.pageSize, - ); - } - - public removeProjectMemberSelection(): void { - Promise.all(this.selection.selected.map(member => { - return this.mgmtService.RemoveProjectGrantMember(this.projectId, this.grantId, member.userId).then(() => { - this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERREMOVED', true); - }).catch(error => { - this.toast.showError(error); - }); - })); - } - - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.membersSubject.value.length; - return numSelected === numRows; - } - - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.membersSubject.value.forEach(row => this.selection.select(row)); - } - - public async openAddMember(): Promise { - const keysList = (await this.mgmtService.GetProjectGrantMemberRoles()).toObject(); - - const dialogRef = this.dialog.open(ProjectGrantMembersCreateDialogComponent, { - data: { - roleKeysList: keysList.rolesList, - }, - width: '400px', - }); - - dialogRef.afterClosed().subscribe((dataToAdd: ProjectGrantMembersCreateDialogExportType) => { - if (dataToAdd) { - Promise.all(dataToAdd.userIds.map((userid: string) => { - return this.mgmtService.AddProjectGrantMember( - this.projectId, - this.grantId, - userid, - dataToAdd.rolesKeyList, - ); - })).then(() => { - this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERADDED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - }); - } - - updateRoles(member: ProjectMember.AsObject, selectionChange: MatSelectChange): void { - this.mgmtService.ChangeProjectGrantMember(this.projectId, this.grantId, member.userId, selectionChange.value) - .then((newmember: ProjectMember) => { - this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTMEMBERCHANGED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - - public refreshPage(): void { - this.selection.clear(); - this.dataSource.loadGrantMembers(this.projectId, this.grantId, this.paginator.pageIndex, this.paginator.pageSize); - } -} diff --git a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.module.ts b/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.module.ts deleted file mode 100644 index 22e186130d..0000000000 --- a/console/src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members/project-grant-members.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { RouterModule } from '@angular/router'; -import { TranslateModule } from '@ngx-translate/core'; -import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; -import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; -import { SearchUserAutocompleteModule } from 'src/app/modules/search-user-autocomplete/search-user-autocomplete.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; - -import { - ProjectGrantMembersCreateDialogModule, -} from './project-grant-members-create-dialog/project-grant-members-create-dialog.module'; -import { ProjectGrantMembersComponent } from './project-grant-members.component'; - -@NgModule({ - declarations: [ProjectGrantMembersComponent], - imports: [ - CommonModule, - HasRoleModule, - RouterModule, - MatButtonModule, - MatCheckboxModule, - MatIconModule, - MatInputModule, - MatFormFieldModule, - MatSelectModule, - MatTableModule, - SearchUserAutocompleteModule, - ProjectGrantMembersCreateDialogModule, - MatPaginatorModule, - MatSortModule, - MatTooltipModule, - MatDialogModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - FormsModule, - TranslateModule, - RefreshTableModule, - HasRolePipeModule, - ], - exports: [ - ProjectGrantMembersComponent, - ], -}) -export class ProjectGrantMembersModule { } diff --git a/console/src/app/pages/projects/project-grant-create/project-grant-create.component.scss b/console/src/app/pages/projects/project-grant-create/project-grant-create.component.scss index 5b5ba1db07..9ff19a7094 100644 --- a/console/src/app/pages/projects/project-grant-create/project-grant-create.component.scss +++ b/console/src/app/pages/projects/project-grant-create/project-grant-create.component.scss @@ -32,7 +32,6 @@ .domain-button { margin-right: 1rem; margin-bottom: 1rem; - border-radius: .5rem; } .btn-container { @@ -43,12 +42,10 @@ .small-button { display: block; - border-radius: .5rem; } .big-button { display: block; padding: .5rem 4rem; - border-radius: .5rem; } } diff --git a/console/src/app/pages/projects/project-grant-create/project-grant-create.module.ts b/console/src/app/pages/projects/project-grant-create/project-grant-create.module.ts index 1622a3beb9..70dff25a40 100644 --- a/console/src/app/pages/projects/project-grant-create/project-grant-create.module.ts +++ b/console/src/app/pages/projects/project-grant-create/project-grant-create.module.ts @@ -13,7 +13,7 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { CardModule } from 'src/app/modules/card/card.module'; import { ProjectRolesModule } from 'src/app/modules/project-roles/project-roles.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { ProjectGrantCreateRoutingModule } from './project-grant-create-routing.module'; import { ProjectGrantCreateComponent } from './project-grant-create.component'; diff --git a/console/src/app/pages/projects/project-role-create/project-role-create.component.scss b/console/src/app/pages/projects/project-role-create/project-role-create.component.scss index e1025a41e0..937d7c4b5d 100644 --- a/console/src/app/pages/projects/project-role-create/project-role-create.component.scss +++ b/console/src/app/pages/projects/project-role-create/project-role-create.component.scss @@ -50,7 +50,6 @@ margin-top: 3rem; display: block; padding: .5rem 4rem; - border-radius: .5rem; @media only screen and (max-width: 450px) { margin-top: 1rem; diff --git a/console/src/app/pages/signedout/signedout.component.scss b/console/src/app/pages/signedout/signedout.component.scss index f94201e561..1577de9c7f 100644 --- a/console/src/app/pages/signedout/signedout.component.scss +++ b/console/src/app/pages/signedout/signedout.component.scss @@ -15,7 +15,7 @@ } p { - color: #8795a1; + color: var(--grey); text-align: center; font-size: 1rem; margin: 0; @@ -28,7 +28,6 @@ } button { - border-radius: .5rem; display: block; padding: .5rem 4rem; } diff --git a/console/src/app/pages/user-grant-create/user-grant-create.component.html b/console/src/app/pages/user-grant-create/user-grant-create.component.html index 6af6fe1231..927483012b 100644 --- a/console/src/app/pages/user-grant-create/user-grant-create.component.html +++ b/console/src/app/pages/user-grant-create/user-grant-create.component.html @@ -16,33 +16,36 @@ {{'PROJECT.GRANT.CREATE.ORG_DESCRIPTION_DESC' | translate}}

- + +

{{'PROJECT.GRANT.CREATE.SEL_USER' | translate}}

+ + + +
+ +

{{'PROJECT.GRANT.CREATE.SEL_PROJECT' | translate}}

- - -

{{'PROJECT.GRANT.CREATE.SEL_USER' | translate}}

- - - -

{{'PROJECT.GRANT.CREATE.SEL_ROLES' | translate}}

- + - + {{ 'PROJECT.GRANT.ROLENAMESLIST' | translate }} @@ -56,9 +59,8 @@
- diff --git a/console/src/app/pages/user-grant-create/user-grant-create.component.scss b/console/src/app/pages/user-grant-create/user-grant-create.component.scss index 102a272966..0de500de0e 100644 --- a/console/src/app/pages/user-grant-create/user-grant-create.component.scss +++ b/console/src/app/pages/user-grant-create/user-grant-create.component.scss @@ -24,7 +24,7 @@ } .desc { - color: #8795a1; + color: var(--grey); } } @@ -57,12 +57,20 @@ .small-button { display: block; - border-radius: .5rem; } .big-button { display: block; padding: .5rem 4rem; - border-radius: .5rem; + } +} + +.sa-icon { + display: block; + width: 32px; + margin: 0 .5rem; + + i { + margin: auto; } } diff --git a/console/src/app/pages/user-grant-create/user-grant-create.component.ts b/console/src/app/pages/user-grant-create/user-grant-create.component.ts index ab69bf9900..4bc8b2a03a 100644 --- a/console/src/app/pages/user-grant-create/user-grant-create.component.ts +++ b/console/src/app/pages/user-grant-create/user-grant-create.component.ts @@ -2,6 +2,7 @@ import { Location } from '@angular/common'; import { Component, OnDestroy } from '@angular/core'; import { ActivatedRoute, Params } from '@angular/router'; import { Subscription } from 'rxjs'; +import { UserTarget } from 'src/app/modules/search-user-autocomplete/search-user-autocomplete.component'; import { UserGrantContext } from 'src/app/modules/user-grants/user-grants-datasource'; import { Org } from 'src/app/proto/generated/auth_pb'; import { ProjectGrantView, ProjectRole, ProjectView, UserGrant, UserView } from 'src/app/proto/generated/management_pb'; @@ -19,7 +20,10 @@ export class UserGrantCreateComponent implements OnDestroy { public org!: Org.AsObject; public userId: string = ''; + public projectId: string = ''; + public project!: ProjectGrantView.AsObject | ProjectView.AsObject; + public grantId: string = ''; public rolesList: string[] = []; @@ -33,6 +37,12 @@ export class UserGrantCreateComponent implements OnDestroy { public UserGrantContext: any = UserGrantContext; public grantRolesKeyList: string[] = []; + + public user!: UserView.AsObject; + public UserTarget: any = UserTarget; + + public ProjectGrantView: any = ProjectGrantView; + public ProjectView: any = ProjectView; constructor( private userService: ManagementService, private toast: ToastService, @@ -42,8 +52,8 @@ export class UserGrantCreateComponent implements OnDestroy { private mgmtService: ManagementService, ) { this.subscription = this.route.params.subscribe((params: Params) => { - const { context, projectid, grantid, userid } = params; - this.context = context; + const { projectid, grantid, userid } = params; + this.context = UserGrantContext.NONE; this.projectId = projectid; this.grantId = grantid; @@ -58,6 +68,14 @@ export class UserGrantCreateComponent implements OnDestroy { }).catch((error: any) => { this.toast.showError(error); }); + } else if (this.userId) { + this.context = UserGrantContext.USER; + this.mgmtService.GetUserByID(this.userId).then(resp => { + this.user = resp.toObject(); + console.log(this.user); + }).catch((error: any) => { + this.toast.showError(error); + }); } }); @@ -97,12 +115,52 @@ export class UserGrantCreateComponent implements OnDestroy { this.toast.showError(error); }); break; + case UserGrantContext.USER: + let grantId; + + if ((this.project as ProjectGrantView.AsObject)?.id) { + grantId = (this.project as ProjectGrantView.AsObject).id; + } + + this.userService.CreateUserGrant( + this.userId, + this.rolesList, + this.project.projectId, + grantId, + ).then((data: UserGrant) => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTUSERGRANTADDED', true); + this.close(); + }).catch((error: any) => { + this.toast.showError(error); + }); + break; + case UserGrantContext.NONE: + let tempGrantId; + + if ((this.project as ProjectGrantView.AsObject)?.id) { + tempGrantId = (this.project as ProjectGrantView.AsObject).id; + } + + this.userService.CreateUserGrant( + this.userId, + this.rolesList, + this.project.projectId, + tempGrantId, + ).then((data: UserGrant) => { + this.toast.showInfo('PROJECT.GRANT.TOAST.PROJECTGRANTUSERGRANTADDED', true); + this.close(); + }).catch((error: any) => { + this.toast.showError(error); + }); + break; } } public selectProject(project: ProjectView.AsObject | ProjectGrantView.AsObject | any): void { + this.project = project; this.projectId = project.projectId; + this.grantRolesKeyList = project.roleKeysList ?? []; } public selectUser(user: UserView.AsObject): void { diff --git a/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss b/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss index e4ce52c669..94457d525a 100644 --- a/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss +++ b/console/src/app/pages/users/user-create-machine/user-create-machine.component.scss @@ -15,14 +15,15 @@ .content { width: 100%; - display: flex wrap; + display: flex; + flex-wrap: wrap; flex-direction: row; margin: 0 -.5rem; .section { padding: .5rem; flex-basis: 100%; - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/users/user-create/user-create.component.scss b/console/src/app/pages/users/user-create/user-create.component.scss index e4ce52c669..94457d525a 100644 --- a/console/src/app/pages/users/user-create/user-create.component.scss +++ b/console/src/app/pages/users/user-create/user-create.component.scss @@ -15,14 +15,15 @@ .content { width: 100%; - display: flex wrap; + display: flex; + flex-wrap: wrap; flex-direction: row; margin: 0 -.5rem; .section { padding: .5rem; flex-basis: 100%; - color: #8795a1; + color: var(--grey); font-size: .9rem; } diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html index 86416617c9..ad79e7d455 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.html @@ -1,8 +1,15 @@
-

{{ 'USER.TITLE' | translate }}

-

{{'USER.DESCRIPTION' | translate}}

+
+
+

{{ 'USER.TITLE' | translate }}

+

{{'USER.DESCRIPTION' | translate}}

+
+
+ +
+
{{ 'USER.PAGES.NOUSER' | translate }} @@ -20,130 +27,41 @@
-
- - - - - - - - -
+ + + + - + description="{{ 'USER.EXTERNALIDP.DESC' | translate }}"> + -
-
- {{ 'USER.PROFILE.PASSWORD' | translate }} - - ********* - -
- -
- {{ 'USER.EMAIL' | translate }} - - -
- {{user?.human?.email}} - - check_circle_outline - - - highlight_off - - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - -
- -
- -
-
- - - {{ 'USER.EMAIL' | translate }} - - - - - -
- -
- {{ 'USER.PHONE' | translate }} - - -
- {{user?.human?.phone}} - - check_circle_outline - - - highlight_off - - {{'USER.LOGINMETHODS.ENTERCODE' | translate}} - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - -
- -
- -
-
- - - - {{ 'USER.PHONE' | translate }} - - - - - - -
-
+
+ + + + +
- Preferred Loginname: + {{'USER.PREFERRED_LOGINNAME' | translate}} {{user.preferredLoginName}}
@@ -153,4 +71,4 @@
- + \ No newline at end of file diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss index b3ac0b0c95..990b793c7f 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.scss @@ -1,10 +1,21 @@ -.h1 { - margin-top: 0; -} - -.sub { - color: #8795a1; +.header-row { + display: flex; + justify-content: space-between; + align-items: center; margin-bottom: 2rem; + flex-wrap: wrap; + + .h1 { + margin-top: 0; + } + + .sub { + color: var(--grey); + } + + .theme { + min-width: 250px; + } } .login-name-row { @@ -42,63 +53,6 @@ } } -.method-col { - display: flex; - flex-direction: column; - margin: -.5rem; - - .method-row { - display: flex; - align-items: center; - justify-content: space-evenly; - padding: .5rem; - border-bottom: 1px solid #ffffff20; - flex-wrap: wrap; - - .label, - .name { - margin-right: 1rem; - } - - .actions { - flex: 1; - display: flex; - justify-content: flex-end; - align-items: center; - } - - .label { - flex: 1; - font-size: .9rem; - color: #8795a1; - } - - .icon { - margin-right: .5rem; - } - - .submit-button { - border-radius: .5rem; - } - - .verify { - text-decoration: none; - font-size: .8rem; - color: #8795a1; - border-radius: .5rem; - cursor: pointer; - word-wrap: none; - white-space: nowrap; - margin-right: 1rem; - - &:hover { - color: white; - text-decoration: underline; - } - } - } -} - .col { display: flex; flex-wrap: wrap; @@ -109,14 +63,6 @@ flex: 1; margin: .5rem; } - - .theme-card { - max-width: 300px; - - @media only screen and (max-width: 450px) { - max-width: none; - } - } } .side { diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts index 9ef70b16e4..3523f17476 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-detail.component.ts @@ -1,14 +1,12 @@ import { Component, OnDestroy } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; import { TranslateService } from '@ngx-translate/core'; import { Subscription } from 'rxjs'; import { ChangeType } from 'src/app/modules/changes/changes.component'; +import { UserGrantContext } from 'src/app/modules/user-grants/user-grants-datasource'; import { Gender, UserAddress, UserEmail, UserPhone, UserProfile, UserView } from 'src/app/proto/generated/auth_pb'; import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; import { ToastService } from 'src/app/services/toast.service'; -import { CodeDialogComponent } from './code-dialog/code-dialog.component'; - @Component({ selector: 'app-auth-user-detail', templateUrl: './auth-user-detail.component.html', @@ -22,9 +20,6 @@ export class AuthUserDetailComponent implements OnDestroy { private subscription: Subscription = new Subscription(); - public emailEditState: boolean = false; - public phoneEditState: boolean = false; - public loading: boolean = false; public copied: string = ''; @@ -32,11 +27,12 @@ export class AuthUserDetailComponent implements OnDestroy { public ChangeType: any = ChangeType; public userLoginMustBeDomain: boolean = false; + public USERGRANTCONTEXT: UserGrantContext = UserGrantContext.USER; + constructor( public translate: TranslateService, private toast: ToastService, public userService: GrpcAuthService, - private dialog: MatDialog, ) { this.loading = true; this.userService.GetMyUser().then(user => { @@ -79,50 +75,31 @@ export class AuthUserDetailComponent implements OnDestroy { } } - public saveEmail(): void { - this.emailEditState = false; - - if (this.user.human) { - this.userService - .SaveMyUserEmail(this.user.human.email).then((data: UserEmail) => { - this.toast.showInfo('USER.TOAST.EMAILSAVED', true); - if (this.user.human) { - this.user.human.email = data.toObject().email; - } - this.emailEditState = false; - }).catch(error => { - this.toast.showError(error); - this.emailEditState = false; - }); - } + public saveEmail(email: string): void { + this.userService + .SaveMyUserEmail(email).then((data: UserEmail) => { + this.toast.showInfo('USER.TOAST.EMAILSAVED', true); + if (this.user.human) { + this.user.human.email = data.toObject().email; + } + }).catch(error => { + this.toast.showError(error); + }); } - public enterCode(): void { - if (this.user.human) { - const dialogRef = this.dialog.open(CodeDialogComponent, { - data: { - number: this.user.human.phone, - }, - width: '400px', - }); - - dialogRef.afterClosed().subscribe(code => { - if (code) { - this.userService.VerifyMyUserPhone(code).then(() => { - this.toast.showInfo('USER.TOAST.PHONESAVED', true); - }).catch(error => { - this.toast.showError(error); - }); - } - }); - } + public enteredPhoneCode(code: string): void { + this.userService.VerifyMyUserPhone(code).then(() => { + this.toast.showInfo('USER.TOAST.PHONESAVED', true); + }).catch(error => { + this.toast.showError(error); + }); } public changedLanguage(language: string): void { this.translate.use(language); } - public resendVerification(): void { + public resendEmailVerification(): void { this.userService.ResendEmailVerification().then(() => { this.toast.showInfo('USER.TOAST.EMAILSAVED', true); }).catch(error => { @@ -139,32 +116,26 @@ export class AuthUserDetailComponent implements OnDestroy { } public deletePhone(): void { - if (this.user.human) { - this.userService.RemoveMyUserPhone().then(() => { - this.toast.showInfo('USER.TOAST.PHONEREMOVED', true); - if (this.user.human) { - this.user.human.phone = ''; - } - this.phoneEditState = false; - }).catch(error => { - this.toast.showError(error); - }); - } + this.userService.RemoveMyUserPhone().then(() => { + this.toast.showInfo('USER.TOAST.PHONEREMOVED', true); + if (this.user.human) { + this.user.human.phone = ''; + } + }).catch(error => { + this.toast.showError(error); + }); } - public savePhone(): void { - this.phoneEditState = false; + public savePhone(phone: string): void { if (this.user.human) { this.userService - .SaveMyUserPhone(this.user.human.phone).then((data: UserPhone) => { + .SaveMyUserPhone(phone).then((data: UserPhone) => { this.toast.showInfo('USER.TOAST.PHONESAVED', true); if (this.user.human) { this.user.human.phone = data.toObject().phone; } - this.phoneEditState = false; }).catch(error => { this.toast.showError(error); - this.phoneEditState = false; }); } } diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.html b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.html index f84c139a62..9f2b0c7ecd 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.html +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.html @@ -27,7 +27,7 @@
- +
diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.scss b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.scss index 23d52737ed..711b44e18e 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.scss +++ b/console/src/app/pages/users/user-detail/auth-user-detail/auth-user-mfa/auth-user-mfa.component.scss @@ -4,7 +4,6 @@ margin: -.5rem; .button { - border-radius: .5rem; margin: .5rem; margin-top: 1rem; diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss index 515ec220ba..4c41f9dc3c 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss +++ b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card.scss @@ -3,12 +3,12 @@ @mixin theme-card($theme) { /* stylelint-disable */ $primary: map-get($theme, primary); - $primary-dark: mat-color($primary, A800); + $primary-dark: mat-color($primary, A900); /* stylelint-enable */ .theme-conent, .crescent { background-color: $primary-dark; - transition: background-color .4s cubic-bezier(.645, .045, .355, 1); + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); // cubic-bezier(.645, .045, .355, 1); } } diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.html b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.html index 95041c53bb..350dc49ff5 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.html +++ b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.html @@ -1,17 +1,13 @@
-
-
-
-

Choose a style

-

Pop or subtle. Day or night.
- Customize your interface -

diff --git a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss index 72a4884113..2e57d35d5f 100644 --- a/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss +++ b/console/src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-setting.component.scss @@ -1,5 +1,5 @@ -$dark-background: #2d2e30; -$light-background: #fafafa; +$dark-background: #212224; +$light-background: rgb(220, 220, 220); :root { transition: none; @@ -16,12 +16,12 @@ $light-background: #fafafa; } .circle { + z-index: 1; position: relative; border-radius: 100%; - width: 6rem; - height: 6rem; + width: 60px; + height: 60px; background: linear-gradient(40deg, #ff0080, #ff8c00 70%); - margin: auto; box-shadow: 0 30px 60px rgba(0, 0, 0, .12); } @@ -29,32 +29,21 @@ $light-background: #fafafa; position: absolute; border-radius: 100%; right: 0; - width: 4rem; - height: 4rem; + width: 40px; + height: 40px; background: $light-background; transform: scale(0); transform-origin: top right; - transition: transform .4s cubic-bezier(.645, .045, .355, 1); + transition: transform .2s cubic-bezier(.645, .045, .355, 1); } p { font-size: 90%; } -.heading { - font-size: 100%; - font-weight: bolder; - margin: 2rem 0 .2rem 0; -} - -.desc { - font-size: 14px; - color: #8795a1; -} - label, .toggle { - height: 2.8rem; + height: 45px; border-radius: 100px; } @@ -63,7 +52,6 @@ label { background-color: rgba(0, 0, 0, .1); border-radius: 100px; position: relative; - margin: 1rem 0 1rem 0; cursor: pointer; } @@ -78,33 +66,37 @@ label { font-weight: bolder; width: 65%; margin-left: 17.5%; - margin-top: .5%; position: absolute; display: flex; justify-content: space-between; + align-items: center; user-select: none; + height: 60px; + transform: translateY(-7.5px); } [type="checkbox"] { display: none; } -[type="checkbox"]:checked + .theme-app .toggle { - transform: translateX(100%); - background-color: $dark-background; -} +[type="checkbox"]:checked { + .toggle { + transform: translateX(100%); + background-color: $dark-background; + } -[type="checkbox"]:checked + .theme-app .dark { - opacity: 1; -} + .light { + opacity: .5; + } -[type="checkbox"]:checked + .theme-app .light { - opacity: .5; -} + .dark { + opacity: 1; + } -[type="checkbox"]:checked + .theme-app { - background-color: inherit; - color: inherit; + .theme-app { + background-color: inherit; + color: inherit; + } } [type="checkbox"]:checked + .theme-app .crescent { @@ -119,3 +111,8 @@ label { [type="checkbox"]:checked + .theme-app .main-circle { background: linear-gradient(40deg, #8983f7, #a3dafb 70%); } + +[type="checkbox"]:checked + .app .toggle { + transform: translateX(100%); + background-color: #34323d; +} diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.html b/console/src/app/pages/users/user-detail/contact/contact.component.html new file mode 100644 index 0000000000..c4f1be7f08 --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.html @@ -0,0 +1,97 @@ +
+
+ {{ 'USER.PROFILE.PASSWORD' | translate }} + + ********* + +
+ +
+ {{ 'USER.EMAIL' | translate }} + + +
+ {{human?.email}} + + check_circle_outline + + + highlight_off + + {{'USER.LOGINMETHODS.RESENDCODE' | translate}} + +
+ +
+ +
+
+ + + {{ 'USER.EMAIL' | translate }} + + + + + +
+ +
+ {{ 'USER.PHONE' | translate }} + + +
+ {{human?.phone}} + + check_circle_outline + + + highlight_off + + {{'USER.LOGINMETHODS.ENTERCODE' | translate}} + {{'USER.LOGINMETHODS.RESENDCODE' | translate}} + +
+ +
+ +
+
+ + + + {{ 'USER.PHONE' | translate }} + + + + + + +
+
\ No newline at end of file diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.scss b/console/src/app/pages/users/user-detail/contact/contact.component.scss new file mode 100644 index 0000000000..2abb6befc7 --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.scss @@ -0,0 +1,51 @@ +.method-col { + display: flex; + flex-direction: column; + margin: -.5rem; + + .method-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: .5rem; + border-bottom: 1px solid #ffffff20; + flex-wrap: wrap; + + .actions { + flex: 1; + display: flex; + justify-content: flex-end; + align-items: center; + flex-direction: column; + min-width: 150px; + } + + .label { + font-size: .9rem; + max-width: 100px; + color: var(--grey); + } + + .icon { + margin: .5rem; + } + + .verify { + text-decoration: none; + font-size: .8rem; + color: var(--grey); + border-radius: .5rem; + cursor: pointer; + word-wrap: none; + white-space: nowrap; + + &:hover { + text-decoration: underline; + } + } + } +} + +.overflow { + overflow: auto; +} diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.spec.ts b/console/src/app/pages/users/user-detail/contact/contact.component.spec.ts new file mode 100644 index 0000000000..508fa261e4 --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ContactComponent } from './contact.component'; + +describe('ContactComponent', () => { + let component: ContactComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ContactComponent], + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ContactComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/console/src/app/pages/users/user-detail/contact/contact.component.ts b/console/src/app/pages/users/user-detail/contact/contact.component.ts new file mode 100644 index 0000000000..d9961df4da --- /dev/null +++ b/console/src/app/pages/users/user-detail/contact/contact.component.ts @@ -0,0 +1,70 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { HumanView as AuthHumanView } from 'src/app/proto/generated/auth_pb'; +import { HumanView as MgmtHumanView } from 'src/app/proto/generated/management_pb'; + +import { CodeDialogComponent } from '../auth-user-detail/code-dialog/code-dialog.component'; + +@Component({ + selector: 'app-contact', + templateUrl: './contact.component.html', + styleUrls: ['./contact.component.scss'], +}) +export class ContactComponent implements OnInit { + @Input() disablePhoneCode: boolean = false; + @Input() canWrite: boolean = false; + @Input() human!: AuthHumanView.AsObject | MgmtHumanView.AsObject; + @Output() savedPhone: EventEmitter = new EventEmitter(); + @Output() savedEmail: EventEmitter = new EventEmitter(); + @Output() resendEmailVerification: EventEmitter = new EventEmitter(); + @Output() resendPhoneVerification: EventEmitter = new EventEmitter(); + @Output() enteredPhoneCode: EventEmitter = new EventEmitter(); + @Output() deletedPhone: EventEmitter = new EventEmitter(); + + public emailEditState: boolean = false; + public phoneEditState: boolean = false; + constructor(private dialog: MatDialog) { } + + ngOnInit(): void { + } + + savePhone(): void { + this.phoneEditState = false; + this.savedPhone.emit(this.human.phone); + } + + emitDeletePhone(): void { + this.phoneEditState = false; + this.deletedPhone.emit(); + } + + saveEmail(): void { + this.emailEditState = false; + this.savedEmail.emit(this.human.email); + } + + emitEmailVerification(): void { + this.resendEmailVerification.emit(); + } + + emitPhoneVerification(): void { + this.resendPhoneVerification.emit(); + } + + public enterCode(): void { + if (this.human) { + const dialogRef = this.dialog.open(CodeDialogComponent, { + data: { + number: this.human.phone, + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(code => { + if (code) { + this.enteredPhoneCode.emit(code); + } + }); + } + } +} diff --git a/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.html b/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.html index 71b02e2c66..acfbd1e1e2 100644 --- a/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.html +++ b/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.html @@ -23,7 +23,6 @@
- +
\ No newline at end of file diff --git a/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.scss b/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.scss index 1e3c555a16..4c5f5bbfab 100644 --- a/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.scss +++ b/console/src/app/pages/users/user-detail/detail-form-machine/detail-form-machine.component.scss @@ -14,8 +14,4 @@ .btn-container { display: flex; justify-content: flex-end; - - .submit-button { - border-radius: .5rem; - } } diff --git a/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts b/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts index 7675855aa0..c4266a740c 100644 --- a/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts +++ b/console/src/app/pages/users/user-detail/detail-form/detail-form.component.ts @@ -31,7 +31,7 @@ export class DetailFormComponent implements OnDestroy, OnChanges { firstName: [{ value: '', disabled: this.disabled }, Validators.required], lastName: [{ value: '', disabled: this.disabled }, Validators.required], nickName: [{ value: '', disabled: this.disabled }], - gender: [{ value: 0 }, { disabled: this.disabled }], + gender: [{ value: 0, disabled: this.disabled }], preferredLanguage: [{ value: '', disabled: this.disabled }], }); } @@ -44,7 +44,7 @@ export class DetailFormComponent implements OnDestroy, OnChanges { firstName: [{ value: '', disabled: this.disabled }, Validators.required], lastName: [{ value: '', disabled: this.disabled }, Validators.required], nickName: [{ value: '', disabled: this.disabled }], - gender: [{ value: 0 }, { disabled: this.disabled }], + gender: [{ value: 0, disabled: this.disabled }], preferredLanguage: [{ value: '', disabled: this.disabled }], }); diff --git a/console/src/app/pages/users/user-detail/external-idps/external-idps.component.html b/console/src/app/pages/users/user-detail/external-idps/external-idps.component.html index 1cdd1cec88..1194cee981 100644 --- a/console/src/app/pages/users/user-detail/external-idps/external-idps.component.html +++ b/console/src/app/pages/users/user-detail/external-idps/external-idps.component.html @@ -1,49 +1,59 @@ + [timestamp]="externalIdpResult?.viewTimestamp" [selection]="selection"> -
- - - + + - +
- + + + - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - + + + + -
+ - - - + + + - - {{ 'USER.EXTERNALIDP.IDPCONFIGID' | translate }} {{idp?.idpConfigId}} {{ 'USER.EXTERNALIDP.IDPCONFIGID' | translate }} {{idp?.idpConfigId}} {{ 'USER.EXTERNALIDP.IDPNAME' | translate }} {{idp?.idpName}} {{ 'USER.EXTERNALIDP.IDPNAME' | translate }} {{idp?.idpName}} {{ 'USER.EXTERNALIDP.USERDISPLAYNAME' | translate }} {{idp?.externalUserDisplayName}} {{ 'USER.EXTERNALIDP.USERDISPLAYNAME' | translate }} {{idp?.externalUserDisplayName}} {{ 'USER.EXTERNALIDP.EXTERNALUSERID' | translate }} {{idp?.externalUserId}} {{ 'USER.EXTERNALIDP.EXTERNALUSERID' | translate }} {{idp?.externalUserId}}
+ +
- - +
+ +
+ +
\ No newline at end of file diff --git a/console/src/app/pages/users/user-detail/external-idps/external-idps.component.scss b/console/src/app/pages/users/user-detail/external-idps/external-idps.component.scss index 0731649888..bade0aa759 100644 --- a/console/src/app/pages/users/user-detail/external-idps/external-idps.component.scss +++ b/console/src/app/pages/users/user-detail/external-idps/external-idps.component.scss @@ -19,21 +19,9 @@ padding-right: 0; } } - - .data-row { - cursor: pointer; - - &:hover { - background-color: #ffffff05; - } - } } } tr { outline: none; } - -.add-button { - border-radius: .5rem; -} diff --git a/console/src/app/pages/users/user-detail/external-idps/external-idps.component.ts b/console/src/app/pages/users/user-detail/external-idps/external-idps.component.ts index d64e1cd029..b79d3c9918 100644 --- a/console/src/app/pages/users/user-detail/external-idps/external-idps.component.ts +++ b/console/src/app/pages/users/user-detail/external-idps/external-idps.component.ts @@ -1,75 +1,118 @@ -import {Component, Input, OnInit, ViewChild} from '@angular/core'; -import {MatPaginator, PageEvent} from '@angular/material/paginator'; -import {MatTableDataSource} from '@angular/material/table'; +import { SelectionModel } from '@angular/cdk/collections'; +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { MatTableDataSource } from '@angular/material/table'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; + +import { ExternalIDPView as AuthExternalIDPView } from '../../../../proto/generated/auth_pb'; import { - ExternalIDPSearchResponse, - ExternalIDPView as MgmtExternalIDPView, - IdpView as MgmtIdpView, + ExternalIDPSearchResponse, + ExternalIDPView as MgmtExternalIDPView, } from '../../../../proto/generated/management_pb'; -import { - ExternalIDPView as AuthExternalIDPView, -} from '../../../../proto/generated/auth_pb'; -import {BehaviorSubject, Observable} from 'rxjs'; -import {ManagementService} from '../../../../services/mgmt.service'; -import {ToastService} from '../../../../services/toast.service'; -import {SelectionModel} from '@angular/cdk/collections'; -import {GrpcAuthService} from '../../../../services/grpc-auth.service'; +import { GrpcAuthService } from '../../../../services/grpc-auth.service'; +import { ManagementService } from '../../../../services/mgmt.service'; +import { ToastService } from '../../../../services/toast.service'; @Component({ - selector: 'app-external-idps', - templateUrl: './external-idps.component.html', - styleUrls: ['./external-idps.component.scss'], + selector: 'app-external-idps', + templateUrl: './external-idps.component.html', + styleUrls: ['./external-idps.component.scss'], }) export class ExternalIdpsComponent implements OnInit { - @Input() service!: GrpcAuthService | ManagementService; - @Input() userId!: string; - @ViewChild(MatPaginator) public paginator!: MatPaginator; - public externalIdpResult!: ExternalIDPSearchResponse.AsObject; - public dataSource: MatTableDataSource - = new MatTableDataSource(); - public selection: SelectionModel - = new SelectionModel(true, []); - private loadingSubject: BehaviorSubject = new BehaviorSubject(false); - public loading$: Observable = this.loadingSubject.asObservable(); - @Input() public displayedColumns: string[] = [ 'idpConfigId', 'idpName', 'externalUserId', 'externalUserDisplayName']; + @Input() service!: GrpcAuthService | ManagementService; + @Input() userId!: string; + @ViewChild(MatPaginator) public paginator!: MatPaginator; + public externalIdpResult!: ExternalIDPSearchResponse.AsObject; + public dataSource: MatTableDataSource + = new MatTableDataSource(); + public selection: SelectionModel + = new SelectionModel(true, []); + private loadingSubject: BehaviorSubject = new BehaviorSubject(false); + public loading$: Observable = this.loadingSubject.asObservable(); + @Input() public displayedColumns: string[] = ['idpConfigId', 'idpName', 'externalUserId', 'externalUserDisplayName', 'actions']; - constructor(private toast: ToastService) { } + constructor(private toast: ToastService, private dialog: MatDialog) { } - ngOnInit(): void { - this.getData(10, 0); - } + ngOnInit(): void { + this.getData(10, 0); + } - public isAllSelected(): boolean { - const numSelected = this.selection.selected.length; - const numRows = this.dataSource.data.length; - return numSelected === numRows; - } + public isAllSelected(): boolean { + const numSelected = this.selection.selected.length; + const numRows = this.dataSource.data.length; + return numSelected === numRows; + } - public masterToggle(): void { - this.isAllSelected() ? - this.selection.clear() : - this.dataSource.data.forEach(row => this.selection.select(row)); - } + public masterToggle(): void { + this.isAllSelected() ? + this.selection.clear() : + this.dataSource.data.forEach(row => this.selection.select(row)); + } - public changePage(event: PageEvent): void { - this.getData(event.pageSize, event.pageIndex * event.pageSize); - } + public changePage(event: PageEvent): void { + this.getData(event.pageSize, event.pageIndex * event.pageSize); + } - private async getData(limit: number, offset: number): Promise { - this.loadingSubject.next(true); + private async getData(limit: number, offset: number): Promise { + this.loadingSubject.next(true); - this.service.SearchExternalIdps(this.userId, limit, offset).then(resp => { - this.externalIdpResult = resp.toObject(); - this.dataSource.data = this.externalIdpResult.resultList; - console.log(this.externalIdpResult.resultList); - this.loadingSubject.next(false); - }).catch((error: any) => { - this.toast.showError(error); - this.loadingSubject.next(false); - }); - } + let promise; + if (this.service instanceof ManagementService) { + promise = (this.service as ManagementService).SearchUserExternalIDPs(limit, offset, this.userId); + } else if (this.service instanceof GrpcAuthService) { + promise = (this.service as GrpcAuthService).SearchMyExternalIdps(limit, offset); + } - public refreshPage(): void { - this.getData(this.paginator.pageSize, this.paginator.pageIndex * this.paginator.pageSize); - } + if (promise) { + promise.then(resp => { + this.externalIdpResult = resp.toObject(); + this.dataSource.data = this.externalIdpResult.resultList; + this.loadingSubject.next(false); + }).catch((error: any) => { + this.toast.showError(error); + this.loadingSubject.next(false); + }); + } + } + + public refreshPage(): void { + this.getData(this.paginator.pageSize, this.paginator.pageIndex * this.paginator.pageSize); + } + + public removeExternalIdp(idp: AuthExternalIDPView.AsObject | MgmtExternalIDPView.AsObject): void { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.REMOVE', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'USER.EXTERNALIDP.DIALOG.DELETE_TITLE', + descriptionKey: 'USER.EXTERNALIDP.DIALOG.DELETE_DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (resp) { + let promise; + if (this.service instanceof ManagementService) { + promise = (this.service as ManagementService) + .RemoveExternalIDP(idp.externalUserId, idp.idpConfigId, idp.userId); + } else if (this.service instanceof GrpcAuthService) { + promise = (this.service as GrpcAuthService) + .RemoveExternalIDP(idp.externalUserId, idp.idpConfigId); + } + + if (promise) { + promise.then(_ => { + setTimeout(() => { + this.refreshPage(); + }, 1000); + }).catch((error: any) => { + this.toast.showError(error); + }); + } + } + }); + } } diff --git a/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss b/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss index 91a03f5bc2..132f28cfd4 100644 --- a/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss +++ b/console/src/app/pages/users/user-detail/machine-keys/add-key-dialog/add-key-dialog.component.scss @@ -4,7 +4,7 @@ } .desc { - color: #8795a1; + color: var(--grey); font-size: .9rem; } @@ -19,8 +19,4 @@ .ok-button { margin-left: .5rem; } - - button { - border-radius: .5rem; - } } diff --git a/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.html b/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.html index 68f6d1b280..30ffa383ec 100644 --- a/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.html +++ b/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.html @@ -6,8 +6,8 @@ mat-icon-button *ngIf="selection.hasValue()"> - + add{{ 'ACTIONS.NEW' | translate }} @@ -54,7 +54,7 @@ - diff --git a/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.scss b/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.scss index 0731649888..bade0aa759 100644 --- a/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.scss +++ b/console/src/app/pages/users/user-detail/machine-keys/machine-keys.component.scss @@ -19,21 +19,9 @@ padding-right: 0; } } - - .data-row { - cursor: pointer; - - &:hover { - background-color: #ffffff05; - } - } } } tr { outline: none; } - -.add-button { - border-radius: .5rem; -} diff --git a/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss b/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss index b3912e2019..f1b397a45a 100644 --- a/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss +++ b/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.component.scss @@ -19,10 +19,6 @@ .ok-button { margin-left: .5rem; } - - button { - border-radius: .5rem; - } } .row { @@ -37,7 +33,7 @@ } .left { - color: #8795a1; + color: var(--grey); margin-right: 1rem; margin-top: 0; margin-bottom: .5rem; @@ -52,5 +48,4 @@ .download-button { margin-bottom: 1rem; - border-radius: .5rem; } diff --git a/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.module.ts b/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.module.ts index 5553cfc39b..9732121f65 100644 --- a/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.module.ts +++ b/console/src/app/pages/users/user-detail/machine-keys/show-key-dialog/show-key-dialog.module.ts @@ -2,8 +2,8 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { TranslateModule } from '@ngx-translate/core'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { ShowKeyDialogComponent } from './show-key-dialog.component'; diff --git a/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.html b/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.html index fd2bcf322c..38a6105208 100644 --- a/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.html +++ b/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.html @@ -4,7 +4,7 @@ - + add{{ 'ACTIONS.NEW' | translate }} @@ -57,7 +57,7 @@ - + diff --git a/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.scss b/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.scss index 348114fa84..6f3cf2fdc2 100644 --- a/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.scss +++ b/console/src/app/pages/users/user-detail/membership-detail/membership-detail.component.scss @@ -1,7 +1,3 @@ -.add-button { - border-radius: .5rem; -} - .refresh-table { width: 100%; } @@ -32,12 +28,6 @@ width: 40px; } - .data-row { - &:hover { - background-color: #ffffff05; - } - } - .selection { width: 50px; max-width: 50px; diff --git a/console/src/app/pages/users/user-detail/membership-detail/membership-detail.module.ts b/console/src/app/pages/users/user-detail/membership-detail/membership-detail.module.ts index 47d3b11c30..75af53284a 100644 --- a/console/src/app/pages/users/user-detail/membership-detail/membership-detail.module.ts +++ b/console/src/app/pages/users/user-detail/membership-detail/membership-detail.module.ts @@ -12,8 +12,8 @@ import { TranslateModule } from '@ngx-translate/core'; import { HasRoleModule } from 'src/app/directives/has-role/has-role.module'; import { DetailLayoutModule } from 'src/app/modules/detail-layout/detail-layout.module'; import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; -import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe.module'; -import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe.module'; +import { LocalizedDatePipeModule } from 'src/app/pipes/localized-date-pipe/localized-date-pipe.module'; +import { TimestampToDatePipeModule } from 'src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module'; import { MembershipDetailComponent } from './membership-detail.component'; diff --git a/console/src/app/pages/users/user-detail/memberships/memberships.component.html b/console/src/app/pages/users/user-detail/memberships/memberships.component.html index 31a3c666bb..095f4cca09 100644 --- a/console/src/app/pages/users/user-detail/memberships/memberships.component.html +++ b/console/src/app/pages/users/user-detail/memberships/memberships.component.html @@ -3,8 +3,7 @@
- + - - - + + + - + @@ -63,129 +67,34 @@ -
- -
- {{ 'USER.EMAIL' | translate }} - -
- {{user?.human?.email}} - - check_circle_outline - - - highlight_off - - - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - - -
- -
- -
-
- - - {{ 'USER.EMAIL' | translate }} - - - - - -
- -
- {{ 'USER.PHONE' | translate }} - - -
- {{user?.human?.phone}} - - check_circle_outline - - - highlight_off - - - {{'USER.LOGINMETHODS.RESENDCODE' | translate}} - - -
- -
- -
-
- - - - {{ 'USER.PHONE' | translate }} - - - - - - - -
-
+ + + - + [disableWrite]="((['user.grant.write$'] | hasRole) | async) == false" + [disableDelete]="((['user.grant.delete$'] | hasRole) | async) == false"> +
- Preferred Loginname: + {{'USER.PREFERRED_LOGINNAME' | translate}} {{user.preferredLoginName}}
@@ -196,4 +105,4 @@
- + \ No newline at end of file diff --git a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss index 0606ca3fa2..d256173680 100644 --- a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss +++ b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.scss @@ -19,84 +19,7 @@ } .state-button { - border-radius: .5rem; - } -} - -.card-actions { - button { - border-radius: .5rem; - } -} - -.method-col { - display: flex; - flex-direction: column; - margin: -.5rem; - - .method-row { - display: flex; - align-items: center; - justify-content: space-evenly; - padding: .5rem; - border-bottom: 1px solid #ffffff20; - flex-wrap: wrap; - - .label, - .name { - padding-right: 1rem; - } - - .actions { - flex: 1; - display: flex; - justify-content: flex-end; - align-items: center; - - .notify-change-pwd { - border-radius: .5rem; - } - } - - .label { - flex: 1; - font-size: .9rem; - color: #818a8a; - } - - .icon { - margin-right: .5rem; - } - - .submit-button { - border-radius: .5rem; - } - - .verify { - text-decoration: none; - font-size: .8rem; - color: #8795a1; - border-radius: .5rem; - cursor: pointer; - word-wrap: none; - white-space: nowrap; - margin-right: 1rem; - - &:hover { - color: white; - text-decoration: underline; - } - } - - @media only screen and (max-width: 700px) { - flex-direction: column; - align-items: center; - - .label, - .name { - padding-right: 0; - } - } + margin-left: .5rem; } } diff --git a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts index 1b7ff8db4b..70fdb0fe5a 100644 --- a/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts +++ b/console/src/app/pages/users/user-detail/user-detail/user-detail.component.ts @@ -1,22 +1,25 @@ -import {Location} from '@angular/common'; -import {Component, OnDestroy, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; -import {TranslateService} from '@ngx-translate/core'; -import {Subscription} from 'rxjs'; -import {ChangeType} from 'src/app/modules/changes/changes.component'; +import { Location } from '@angular/common'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; +import { Subscription } from 'rxjs'; +import { ChangeType } from 'src/app/modules/changes/changes.component'; +import { UserGrantContext } from 'src/app/modules/user-grants/user-grants-datasource'; +import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { - Gender, - MachineResponse, - MachineView, - NotificationType, - UserEmail, - UserPhone, - UserProfile, - UserState, - UserView, + Gender, + MachineResponse, + MachineView, + NotificationType, + UserEmail, + UserPhone, + UserProfile, + UserState, + UserView, } from 'src/app/proto/generated/management_pb'; -import {ManagementService} from 'src/app/services/mgmt.service'; -import {ToastService} from 'src/app/services/toast.service'; +import { ManagementService } from 'src/app/services/mgmt.service'; +import { ToastService } from 'src/app/services/toast.service'; @Component({ selector: 'app-user-detail', @@ -29,22 +32,21 @@ export class UserDetailComponent implements OnInit, OnDestroy { public languages: string[] = ['de', 'en']; private subscription: Subscription = new Subscription(); - public emailEditState: boolean = false; - public phoneEditState: boolean = false; public ChangeType: any = ChangeType; public loading: boolean = false; public UserState: any = UserState; public copied: string = ''; + public USERGRANTCONTEXT: UserGrantContext = UserGrantContext.USER; constructor( public translate: TranslateService, private route: ActivatedRoute, private toast: ToastService, - private mgmtUserService: ManagementService, + public mgmtUserService: ManagementService, private _location: Location, - public mgmtService: ManagementService, + private dialog: MatDialog, ) { } public ngOnInit(): void { @@ -125,7 +127,7 @@ export class UserDetailComponent implements OnInit, OnDestroy { } } - public resendVerification(): void { + public resendEmailVerification(): void { this.mgmtUserService.ResendEmailVerification(this.user.id).then(() => { this.toast.showInfo('USER.TOAST.EMAILVERIFICATIONSENT', true); }).catch(error => { @@ -134,6 +136,7 @@ export class UserDetailComponent implements OnInit, OnDestroy { } public resendPhoneVerification(): void { + console.log('resend phone ver', this.user.id); this.mgmtUserService.ResendPhoneVerification(this.user.id).then(() => { this.toast.showInfo('USER.TOAST.PHONEVERIFICATIONSENT', true); }).catch(error => { @@ -147,37 +150,32 @@ export class UserDetailComponent implements OnInit, OnDestroy { if (this.user.human) { this.user.human.phone = ''; } - this.phoneEditState = false; }).catch(error => { this.toast.showError(error); }); } - public saveEmail(): void { - this.emailEditState = false; - if (this.user && this.user.human?.email) { - this.mgmtUserService - .SaveUserEmail(this.user.id, this.user.human.email).then((data: UserEmail) => { - this.toast.showInfo('USER.TOAST.EMAILSENT', true); - if (this.user.human) { - this.user.human.email = data.toObject().email; - } - }).catch(error => { - this.toast.showError(error); - }); + public saveEmail(email: string): void { + if (this.user.id && email) { + this.mgmtUserService.SaveUserEmail(this.user.id, email).then((data: UserEmail) => { + this.toast.showInfo('USER.TOAST.EMAILSENT', true); + if (this.user.human) { + this.user.human.email = data.toObject().email; + } + }).catch(error => { + this.toast.showError(error); + }); } } - public savePhone(): void { - this.phoneEditState = false; - if (this.user && this.user.human?.phone) { + public savePhone(phone: string): void { + if (this.user.id && phone) { this.mgmtUserService - .SaveUserPhone(this.user.id, this.user.human.phone).then((data: UserPhone) => { + .SaveUserPhone(this.user.id, phone).then((data: UserPhone) => { this.toast.showInfo('USER.TOAST.PHONESAVED', true); if (this.user.human) { this.user.human.phone = data.toObject().phone; } - this.phoneEditState = false; }).catch(error => { this.toast.showError(error); }); @@ -196,4 +194,27 @@ export class UserDetailComponent implements OnInit, OnDestroy { this.toast.showError(error); }); } + + public deleteUser(): void { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.DELETE', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'USER.DIALOG.DELETE_TITLE', + descriptionKey: 'USER.DIALOG.DELETE_DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (resp) { + this.mgmtUserService.DeleteUser(this.user.id).then(() => { + this.navigateBack(); + this.toast.showInfo('USER.TOAST.DELETED', true); + }).catch(error => { + this.toast.showError(error); + }); + } + }); + } } diff --git a/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.html b/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.html index f274b677c0..61c2b662c5 100644 --- a/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.html +++ b/console/src/app/pages/users/user-detail/user-detail/user-mfa/user-mfa.component.html @@ -18,7 +18,7 @@ - +
diff --git a/console/src/app/pages/users/user-list/user-list.component.html b/console/src/app/pages/users/user-list/user-list.component.html index af36116d5c..4565cf8af0 100644 --- a/console/src/app/pages/users/user-list/user-list.component.html +++ b/console/src/app/pages/users/user-list/user-list.component.html @@ -3,7 +3,7 @@

{{ 'USER.PAGES.LIST' | translate }}

{{ 'USER.PAGES.DESCRIPTION' | translate }}

- + @@ -12,8 +12,8 @@

{{ 'USER.PAGES.DESCRIPTIONMACHINE' | translate }}

+ [displayedColumns]="['select','name', 'username', 'description','state', 'actions']" + [disabled]="(['user.write$'] | hasRole | async) == false">
\ No newline at end of file diff --git a/console/src/app/pages/users/user-list/user-list.component.scss b/console/src/app/pages/users/user-list/user-list.component.scss index b0b77cc35b..7abeeb71a1 100644 --- a/console/src/app/pages/users/user-list/user-list.component.scss +++ b/console/src/app/pages/users/user-list/user-list.component.scss @@ -3,6 +3,6 @@ h1 { } .sub { - color: #8795a1; + color: var(--grey); margin-bottom: 2rem; } diff --git a/console/src/app/pages/users/user-list/user-list.module.ts b/console/src/app/pages/users/user-list/user-list.module.ts index 4e666e1887..f9f3159c0a 100644 --- a/console/src/app/pages/users/user-list/user-list.module.ts +++ b/console/src/app/pages/users/user-list/user-list.module.ts @@ -4,7 +4,9 @@ import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatTableModule } from '@angular/material/table'; @@ -15,7 +17,7 @@ import { AvatarModule } from 'src/app/modules/avatar/avatar.module'; import { CardModule } from 'src/app/modules/card/card.module'; import { RefreshTableModule } from 'src/app/modules/refresh-table/refresh-table.module'; import { SharedModule } from 'src/app/modules/shared/shared.module'; -import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe.module'; +import { HasRolePipeModule } from 'src/app/pipes/has-role-pipe/has-role-pipe.module'; import { UserListRoutingModule } from './user-list-routing.module'; import { UserListComponent } from './user-list.component'; @@ -46,6 +48,8 @@ import { UserTableComponent } from './user-table/user-table.component'; TranslateModule, SharedModule, RefreshTableModule, + MatFormFieldModule, + MatInputModule, ], exports: [ UserListComponent, diff --git a/console/src/app/pages/users/user-list/user-table/user-table.component.html b/console/src/app/pages/users/user-list/user-table/user-table.component.html index f5ca7e97a8..dfcead088c 100644 --- a/console/src/app/pages/users/user-list/user-table/user-table.component.html +++ b/console/src/app/pages/users/user-list/user-table/user-table.component.html @@ -1,17 +1,23 @@ + [emitRefreshOnPreviousRoutes]="refreshOnPreviousRoutes"> + + {{'USER.PAGES.FILTER' | translate}} + + + - - - + add{{ 'ACTIONS.NEW' | translate }} @@ -19,63 +25,126 @@
- - - - + + - - + + + + + + + - - + + - + - - + + - - + + + - + + + + + + - - +
- + - + - + + +
+ +
+
{{ 'USER.PROFILE.FIRSTNAME' | translate }} {{user[userType]?.firstName}} + {{ 'USER.PROFILE.FIRSTNAME' | translate }} + + + {{user[userType]?.firstName}} {{ 'USER.PROFILE.LASTNAME' | translate }} {{user[userType]?.lastName}} + {{ 'USER.PROFILE.LASTNAME' | translate }} + + + {{user[userType]?.lastName}} + {{ 'USER.PROFILE.DISPLAYNAME' | translate }} + + + {{user[userType]?.displayName}} {{ 'USER.MACHINE.NAME' | translate }} {{user[userType]?.name}} + {{ 'USER.MACHINE.NAME' | translate }} + + {{user[userType]?.name}} {{ 'USER.MACHINE.DESCRIPTION' | translate }} {{user[userType]?.description}} + {{user[userType]?.description}} {{ 'USER.PROFILE.USERNAME' | translate }} {{user.userName}} + {{ 'USER.PROFILE.USERNAME' | translate }} + + + {{user.userName}} {{ 'USER.EMAIL' | translate }} {{user[userType]?.email}} + {{ 'USER.EMAIL' | translate }} + + + {{user[userType]?.email}} {{ 'USER.DATA.STATE' | translate }} {{ 'USER.DATA.STATE'+user.state | translate }} + {{ 'USER.DATA.STATE'+user.state | translate }} + +
-
\ No newline at end of file + + + + + \ No newline at end of file diff --git a/console/src/app/pages/users/user-list/user-table/user-table.component.scss b/console/src/app/pages/users/user-list/user-table/user-table.component.scss index 0731649888..df6717dcd4 100644 --- a/console/src/app/pages/users/user-list/user-table/user-table.component.scss +++ b/console/src/app/pages/users/user-list/user-table/user-table.component.scss @@ -1,4 +1,3 @@ - .table-wrapper { overflow: auto; @@ -8,7 +7,8 @@ td, th { - padding: 0 1rem; + padding: .5rem; + outline: none; &:first-child { padding-left: 0; @@ -20,20 +20,48 @@ } } - .data-row { - cursor: pointer; - - &:hover { - background-color: #ffffff05; - } + .selection { + width: 50px; + max-width: 50px; } } } tr { - outline: none; + button { + visibility: hidden; + } + + &:hover { + button { + visibility: visible; + } + } } -.add-button { - border-radius: .5rem; +th { + .search-button { + visibility: hidden; + } + + &:hover, + &.search-active { + .search-button { + visibility: visible; + } + } +} + +.filtername { + margin: 0 1rem; +} + +.sa-icon { + display: block; + width: 32px; + margin: 0 .5rem; + + i { + margin: auto; + } } diff --git a/console/src/app/pages/users/user-list/user-table/user-table.component.ts b/console/src/app/pages/users/user-list/user-table/user-table.component.ts index 39e8f86086..6f4bd212c8 100644 --- a/console/src/app/pages/users/user-list/user-table/user-table.component.ts +++ b/console/src/app/pages/users/user-list/user-table/user-table.component.ts @@ -1,9 +1,13 @@ import { SelectionModel } from '@angular/cdk/collections'; import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatInput } from '@angular/material/input'; import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { MatTableDataSource } from '@angular/material/table'; import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject, Observable } from 'rxjs'; +import { enterAnimations } from 'src/app/animations'; +import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { UserView } from 'src/app/proto/generated/auth_pb'; import { SearchMethod, UserSearchKey, UserSearchQuery, UserSearchResponse } from 'src/app/proto/generated/management_pb'; import { ManagementService } from 'src/app/services/mgmt.service'; @@ -15,24 +19,34 @@ import { UserType } from '../user-list.component'; selector: 'app-user-table', templateUrl: './user-table.component.html', styleUrls: ['./user-table.component.scss'], + animations: [ + enterAnimations, + ], }) export class UserTableComponent implements OnInit { + public userSearchKey: UserSearchKey | undefined = undefined; public UserType: any = UserType; @Input() userType: UserType = UserType.HUMAN; - @Input() refreshOnPreviousRoute: string = ''; + @Input() refreshOnPreviousRoutes: string[] = []; @Input() disabled: boolean = false; @ViewChild(MatPaginator) public paginator!: MatPaginator; + @ViewChild('input') public filter!: MatInput; public dataSource: MatTableDataSource = new MatTableDataSource(); public selection: SelectionModel = new SelectionModel(true, []); public userResult!: UserSearchResponse.AsObject; private loadingSubject: BehaviorSubject = new BehaviorSubject(false); public loading$: Observable = this.loadingSubject.asObservable(); - @Input() public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'state']; + @Input() public displayedColumns: string[] = ['select', 'displayName', 'username', 'email', 'state', 'actions']; @Output() public changedSelection: EventEmitter> = new EventEmitter(); + UserSearchKey: any = UserSearchKey; - constructor(public translate: TranslateService, private userService: ManagementService, - private toast: ToastService) { + constructor( + public translate: TranslateService, + private userService: ManagementService, + private toast: ToastService, + private dialog: MatDialog, + ) { this.selection.changed.subscribe(() => { this.changedSelection.emit(this.selection.selected); }); @@ -77,14 +91,22 @@ export class UserTableComponent implements OnInit { }); } - private async getData(limit: number, offset: number, filterTypeValue: UserType): Promise { + private async getData(limit: number, offset: number, filterTypeValue: UserType, filterName?: string): Promise { this.loadingSubject.next(true); const query = new UserSearchQuery(); query.setKey(UserSearchKey.USERSEARCHKEY_TYPE); query.setMethod(SearchMethod.SEARCHMETHOD_EQUALS); query.setValue(filterTypeValue); - this.userService.SearchUsers(limit, offset, [query]).then(resp => { + let namequery; + if (filterName && this.userSearchKey !== undefined) { + namequery = new UserSearchQuery(); + namequery.setMethod(SearchMethod.SEARCHMETHOD_CONTAINS_IGNORE_CASE); + namequery.setKey(this.userSearchKey); + namequery.setValue(filterName.toLowerCase()); + } + + this.userService.SearchUsers(limit, offset, namequery ? [query, namequery] : [query]).then(resp => { this.userResult = resp.toObject(); this.dataSource.data = this.userResult.resultList; this.loadingSubject.next(false); @@ -97,4 +119,55 @@ export class UserTableComponent implements OnInit { public refreshPage(): void { this.getData(this.paginator.pageSize, this.paginator.pageIndex * this.paginator.pageSize, this.userType); } + + public applyFilter(event: Event): void { + const filterValue = (event.target as HTMLInputElement).value; + + this.getData( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + this.userType, + filterValue, + ); + } + + public setFilter(key: UserSearchKey): void { + setTimeout(() => { + if (this.filter) { + (this.filter as any).nativeElement.focus(); + } + }, 100); + + if (this.userSearchKey !== key) { + this.userSearchKey = key; + } else { + this.userSearchKey = undefined; + this.refreshPage(); + } + } + + public deleteUser(user: UserView.AsObject): void { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.DELETE', + cancelKey: 'ACTIONS.CANCEL', + titleKey: 'USER.DIALOG.DELETE_TITLE', + descriptionKey: 'USER.DIALOG.DELETE_DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().subscribe(resp => { + if (resp) { + this.userService.DeleteUser(user.id).then(() => { + setTimeout(() => { + this.refreshPage(); + }, 1000); + this.toast.showInfo('USER.TOAST.DELETED', true); + }).catch(error => { + this.toast.showError(error); + }); + } + }); + } } diff --git a/console/src/app/pipes/has-role-pipe.module.ts b/console/src/app/pipes/has-role-pipe/has-role-pipe.module.ts similarity index 100% rename from console/src/app/pipes/has-role-pipe.module.ts rename to console/src/app/pipes/has-role-pipe/has-role-pipe.module.ts diff --git a/console/src/app/pipes/has-role.pipe.ts b/console/src/app/pipes/has-role-pipe/has-role.pipe.ts similarity index 83% rename from console/src/app/pipes/has-role.pipe.ts rename to console/src/app/pipes/has-role-pipe/has-role.pipe.ts index c0b97846c5..9213f31b2b 100644 --- a/console/src/app/pipes/has-role.pipe.ts +++ b/console/src/app/pipes/has-role-pipe/has-role.pipe.ts @@ -1,7 +1,6 @@ import { Pipe, PipeTransform } from '@angular/core'; import { Observable } from 'rxjs'; - -import { GrpcAuthService } from '../services/grpc-auth.service'; +import { GrpcAuthService } from 'src/app/services/grpc-auth.service'; @Pipe({ name: 'hasRole', diff --git a/console/src/app/pipes/localized-date-pipe.module.ts b/console/src/app/pipes/localized-date-pipe/localized-date-pipe.module.ts similarity index 100% rename from console/src/app/pipes/localized-date-pipe.module.ts rename to console/src/app/pipes/localized-date-pipe/localized-date-pipe.module.ts diff --git a/console/src/app/pipes/localized-date.pipe.ts b/console/src/app/pipes/localized-date-pipe/localized-date.pipe.ts similarity index 100% rename from console/src/app/pipes/localized-date.pipe.ts rename to console/src/app/pipes/localized-date-pipe/localized-date.pipe.ts diff --git a/console/src/app/pipes/regexp-pipe.module.ts b/console/src/app/pipes/regexp-pipe/regexp-pipe.module.ts similarity index 100% rename from console/src/app/pipes/regexp-pipe.module.ts rename to console/src/app/pipes/regexp-pipe/regexp-pipe.module.ts diff --git a/console/src/app/pipes/regexp.pipe.ts b/console/src/app/pipes/regexp-pipe/regexp.pipe.ts similarity index 100% rename from console/src/app/pipes/regexp.pipe.ts rename to console/src/app/pipes/regexp-pipe/regexp.pipe.ts diff --git a/console/src/app/pipes/timestamp-to-date-pipe.module.ts b/console/src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module.ts similarity index 100% rename from console/src/app/pipes/timestamp-to-date-pipe.module.ts rename to console/src/app/pipes/timestamp-to-date-pipe/timestamp-to-date-pipe.module.ts diff --git a/console/src/app/pipes/timestamp-to-date.pipe.ts b/console/src/app/pipes/timestamp-to-date-pipe/timestamp-to-date.pipe.ts similarity index 100% rename from console/src/app/pipes/timestamp-to-date.pipe.ts rename to console/src/app/pipes/timestamp-to-date-pipe/timestamp-to-date.pipe.ts diff --git a/console/src/app/pipes/truncate-pipe/truncate-pipe.module.ts b/console/src/app/pipes/truncate-pipe/truncate-pipe.module.ts new file mode 100644 index 0000000000..def50ab771 --- /dev/null +++ b/console/src/app/pipes/truncate-pipe/truncate-pipe.module.ts @@ -0,0 +1,17 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { TruncatePipePipe } from './truncate-pipe.pipe'; + + + +@NgModule({ + declarations: [TruncatePipePipe], + imports: [ + CommonModule, + ], + exports: [ + TruncatePipePipe, + ], +}) +export class TruncatePipeModule { } diff --git a/console/src/app/pipes/truncate-pipe/truncate-pipe.pipe.ts b/console/src/app/pipes/truncate-pipe/truncate-pipe.pipe.ts new file mode 100644 index 0000000000..9a5fa16d2f --- /dev/null +++ b/console/src/app/pipes/truncate-pipe/truncate-pipe.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'truncate', +}) +export class TruncatePipePipe implements PipeTransform { + transform(value: string, ...args: unknown[]): unknown { + const limit = args.length > 0 ? parseInt(args[0] as string, 10) : 20; + const trail = args.length > 1 ? args[1] : '...'; + return value.length > limit ? value.substring(0, limit) + trail : value; + } + +} diff --git a/console/src/app/services/admin.service.ts b/console/src/app/services/admin.service.ts index d4b2925107..adad72a275 100644 --- a/console/src/app/services/admin.service.ts +++ b/console/src/app/services/admin.service.ts @@ -7,8 +7,19 @@ import { CreateHumanRequest, CreateOrgRequest, CreateUserRequest, + DefaultLabelPolicy, + DefaultLabelPolicyUpdate, + DefaultLabelPolicyView, DefaultLoginPolicy, DefaultLoginPolicyView, + DefaultPasswordAgePolicyRequest, + DefaultPasswordAgePolicyView, + DefaultPasswordComplexityPolicy, + DefaultPasswordComplexityPolicyRequest, + DefaultPasswordComplexityPolicyView, + DefaultPasswordLockoutPolicy, + DefaultPasswordLockoutPolicyRequest, + DefaultPasswordLockoutPolicyView, FailedEventID, FailedEvents, IamMember, @@ -31,14 +42,15 @@ import { OrgIamPolicy, OrgIamPolicyID, OrgIamPolicyRequest, + OrgIamPolicyView, OrgSetUpRequest, OrgSetUpResponse, RemoveIamMemberRequest, ViewID, Views, } from '../proto/generated/admin_pb'; +import { IdpUpdate } from '../proto/generated/management_pb'; import { GrpcService } from './grpc.service'; -import {IdpUpdate} from '../proto/generated/management_pb'; @Injectable({ providedIn: 'root', @@ -46,7 +58,7 @@ import {IdpUpdate} from '../proto/generated/management_pb'; export class AdminService { constructor(private readonly grpcService: GrpcService) { } - public async SetUpOrg( + public SetUpOrg( createOrgRequest: CreateOrgRequest, humanRequest: CreateHumanRequest, ): Promise { @@ -61,29 +73,29 @@ export class AdminService { return this.grpcService.admin.setUpOrg(req); } - public async GetIamMemberRoles(): Promise { + public GetIamMemberRoles(): Promise { const req = new Empty(); return this.grpcService.admin.getIamMemberRoles(req); } - public async GetViews(): Promise { + public GetViews(): Promise { const req = new Empty(); return this.grpcService.admin.getViews(req); } - public async GetFailedEvents(): Promise { + public GetFailedEvents(): Promise { const req = new Empty(); return this.grpcService.admin.getFailedEvents(req); } - public async ClearView(viewname: string, db: string): Promise { + public ClearView(viewname: string, db: string): Promise { const req: ViewID = new ViewID(); req.setDatabase(db); req.setViewName(viewname); return this.grpcService.admin.clearView(req); } - public async RemoveFailedEvent(viewname: string, db: string, sequence: number): Promise { + public RemoveFailedEvent(viewname: string, db: string, sequence: number): Promise { const req: FailedEventID = new FailedEventID(); req.setDatabase(db); req.setViewName(viewname); @@ -91,29 +103,148 @@ export class AdminService { return this.grpcService.admin.removeFailedEvent(req); } - public async GetDefaultLoginPolicy( + /* Policies */ + + /* complexity */ + + public GetDefaultPasswordComplexityPolicy(): Promise { + const req = new Empty(); + return this.grpcService.admin.getDefaultPasswordComplexityPolicy(req); + } + + public UpdateDefaultPasswordComplexityPolicy( + hasLowerCase: boolean, + hasUpperCase: boolean, + hasNumber: boolean, + hasSymbol: boolean, + minLength: number, + ): Promise { + const req = new DefaultPasswordComplexityPolicyRequest(); + req.setHasLowercase(hasLowerCase); + req.setHasUppercase(hasUpperCase); + req.setHasNumber(hasNumber); + req.setHasSymbol(hasSymbol); + req.setMinLength(minLength); + return this.grpcService.admin.updateDefaultPasswordComplexityPolicy(req); + } + + /* age */ + + public GetDefaultPasswordAgePolicy(): Promise { + const req = new Empty(); + + return this.grpcService.admin.getDefaultPasswordAgePolicy(req); + } + + public UpdateDefaultPasswordAgePolicy( + maxAgeDays: number, + expireWarnDays: number, + ): Promise { + const req = new DefaultPasswordAgePolicyRequest(); + req.setMaxAgeDays(maxAgeDays); + req.setExpireWarnDays(expireWarnDays); + + return this.grpcService.admin.updateDefaultPasswordAgePolicy(req); + } + + /* lockout */ + + public GetDefaultPasswordLockoutPolicy(): Promise { + const req = new Empty(); + return this.grpcService.admin.getDefaultPasswordLockoutPolicy(req); + } + + public UpdateDefaultPasswordLockoutPolicy( + maxAttempts: number, + showLockoutFailures: boolean, + ): Promise { + const req = new DefaultPasswordLockoutPolicyRequest(); + req.setMaxAttempts(maxAttempts); + req.setShowLockoutFailure(showLockoutFailures); + + return this.grpcService.admin.updateDefaultPasswordLockoutPolicy(req); + } + + /* label */ + + public GetDefaultLabelPolicy(): Promise { + const req = new Empty(); + return this.grpcService.admin.getDefaultLabelPolicy(req); + } + + public UpdateDefaultLabelPolicy(req: DefaultLabelPolicyUpdate): Promise { + return this.grpcService.admin.updateDefaultLabelPolicy(req); + } + + /* login */ + + public GetDefaultLoginPolicy( ): Promise { const req = new Empty(); return this.grpcService.admin.getDefaultLoginPolicy(req); } - public async UpdateDefaultLoginPolicy(req: DefaultLoginPolicy): Promise { + public UpdateDefaultLoginPolicy(req: DefaultLoginPolicy): Promise { return this.grpcService.admin.updateDefaultLoginPolicy(req); } - public async AddIdpProviderToDefaultLoginPolicy(configId: string): Promise { + /* org iam */ + + public GetOrgIamPolicy(orgId: string): Promise { + const req = new OrgIamPolicyID(); + req.setOrgId(orgId); + return this.grpcService.admin.getOrgIamPolicy(req); + } + + public CreateOrgIamPolicy( + orgId: string, + userLoginMustBeDomain: boolean): Promise { + const req = new OrgIamPolicyRequest(); + req.setOrgId(orgId); + req.setUserLoginMustBeDomain(userLoginMustBeDomain); + + return this.grpcService.admin.createOrgIamPolicy(req); + } + + public UpdateOrgIamPolicy( + orgId: string, + userLoginMustBeDomain: boolean): Promise { + const req = new OrgIamPolicyRequest(); + req.setOrgId(orgId); + req.setUserLoginMustBeDomain(userLoginMustBeDomain); + return this.grpcService.admin.updateOrgIamPolicy(req); + } + + public RemoveOrgIamPolicy( + orgId: string, + ): Promise { + const req = new OrgIamPolicyID(); + req.setOrgId(orgId); + return this.grpcService.admin.removeOrgIamPolicy(req); + } + + /* admin iam */ + + public GetDefaultOrgIamPolicy(): Promise { + const req = new Empty(); + return this.grpcService.admin.getDefaultOrgIamPolicy(req); + } + + /* policies end */ + + public AddIdpProviderToDefaultLoginPolicy(configId: string): Promise { const req = new IdpProviderID(); req.setIdpConfigId(configId); return this.grpcService.admin.addIdpProviderToDefaultLoginPolicy(req); } - public async RemoveIdpProviderFromDefaultLoginPolicy(configId: string): Promise { + public RemoveIdpProviderFromDefaultLoginPolicy(configId: string): Promise { const req = new IdpProviderID(); req.setIdpConfigId(configId); return this.grpcService.admin.removeIdpProviderFromDefaultLoginPolicy(req); } - public async GetDefaultLoginPolicyIdpProviders(limit?: number, offset?: number): Promise { + public GetDefaultLoginPolicyIdpProviders(limit?: number, offset?: number): Promise { const req = new IdpProviderSearchRequest(); if (limit) { req.setLimit(limit); @@ -124,7 +255,7 @@ export class AdminService { return this.grpcService.admin.getDefaultLoginPolicyIdpProviders(req); } - public async SearchIdps( + public SearchIdps( limit?: number, offset?: number, queryList?: IdpSearchQuery[], @@ -142,7 +273,7 @@ export class AdminService { return this.grpcService.admin.searchIdps(req); } - public async IdpByID( + public IdpByID( id: string, ): Promise { const req = new IdpID(); @@ -150,25 +281,25 @@ export class AdminService { return this.grpcService.admin.idpByID(req); } - public async UpdateIdp( - req: IdpUpdate, + public UpdateIdp( + req: IdpUpdate, ): Promise { - return this.grpcService.admin.updateIdpConfig(req); + return this.grpcService.admin.updateIdpConfig(req); } - public async CreateOidcIdp( + public CreateOidcIdp( req: OidcIdpConfigCreate, ): Promise { return this.grpcService.admin.createOidcIdp(req); } - public async UpdateOidcIdpConfig( + public UpdateOidcIdpConfig( req: OidcIdpConfigUpdate, ): Promise { return this.grpcService.admin.updateOidcIdpConfig(req); } - public async RemoveIdpConfig( + public RemoveIdpConfig( id: string, ): Promise { const req = new IdpID; @@ -176,7 +307,7 @@ export class AdminService { return this.grpcService.admin.removeIdpConfig(req); } - public async DeactivateIdpConfig( + public DeactivateIdpConfig( id: string, ): Promise { const req = new IdpID; @@ -184,7 +315,7 @@ export class AdminService { return this.grpcService.admin.deactivateIdpConfig(req); } - public async ReactivateIdpConfig( + public ReactivateIdpConfig( id: string, ): Promise { const req = new IdpID; @@ -192,7 +323,7 @@ export class AdminService { return this.grpcService.admin.reactivateIdpConfig(req); } - public async SearchIamMembers( + public SearchIamMembers( limit: number, offset: number, queryList?: IamMemberSearchQuery[], @@ -206,7 +337,7 @@ export class AdminService { return this.grpcService.admin.searchIamMembers(req); } - public async RemoveIamMember( + public RemoveIamMember( userId: string, ): Promise { const req = new RemoveIamMemberRequest(); @@ -215,7 +346,7 @@ export class AdminService { return this.grpcService.admin.removeIamMember(req); } - public async AddIamMember( + public AddIamMember( userId: string, rolesList: string[], ): Promise { @@ -226,7 +357,7 @@ export class AdminService { return this.grpcService.admin.addIamMember(req); } - public async ChangeIamMember( + public ChangeIamMember( userId: string, rolesList: string[], ): Promise { @@ -236,42 +367,4 @@ export class AdminService { return this.grpcService.admin.changeIamMember(req); } - - public async GetOrgIamPolicy(orgId: string): Promise { - const req = new OrgIamPolicyID(); - req.setOrgId(orgId); - - return this.grpcService.admin.getOrgIamPolicy(req); - } - - public async CreateOrgIamPolicy( - orgId: string, - description: string, - userLoginMustBeDomain: boolean): Promise { - const req = new OrgIamPolicyRequest(); - req.setOrgId(orgId); - req.setDescription(description); - req.setUserLoginMustBeDomain(userLoginMustBeDomain); - - return this.grpcService.admin.createOrgIamPolicy(req); - } - - public async UpdateOrgIamPolicy( - orgId: string, - description: string, - userLoginMustBeDomain: boolean): Promise { - const req = new OrgIamPolicyRequest(); - req.setOrgId(orgId); - req.setDescription(description); - req.setUserLoginMustBeDomain(userLoginMustBeDomain); - return this.grpcService.admin.updateOrgIamPolicy(req); - } - - public async deleteOrgIamPolicy( - orgId: string, - ): Promise { - const req = new OrgIamPolicyID(); - req.setOrgId(orgId); - return this.grpcService.admin.deleteOrgIamPolicy(req); - } } diff --git a/console/src/app/services/grpc-auth.service.ts b/console/src/app/services/grpc-auth.service.ts index 0dba997c2a..3b471e14ce 100644 --- a/console/src/app/services/grpc-auth.service.ts +++ b/console/src/app/services/grpc-auth.service.ts @@ -7,6 +7,7 @@ import { catchError, filter, finalize, first, map, mergeMap, switchMap, take, ti import { Changes, ChangesRequest, + ExternalIDPRemoveRequest, ExternalIDPSearchRequest, ExternalIDPSearchResponse, Gender, @@ -44,6 +45,8 @@ export class GrpcAuthService { private _activeOrgChanged: Subject = new Subject(); public user!: Observable; private zitadelPermissions: BehaviorSubject = new BehaviorSubject(['user.resourceowner']); + public readonly fetchedZitadelPermissions: BehaviorSubject = new BehaviorSubject(false as boolean); + private cachedOrgs: Org.AsObject[] = []; constructor( @@ -125,6 +128,12 @@ export class GrpcAuthService { first(), switchMap(() => from(this.GetMyzitadelPermissions())), map(rolesResp => rolesResp.toObject().permissionsList), + catchError(_ => { + return of([]); + }), + finalize(() => { + this.fetchedZitadelPermissions.next(true); + }), ).subscribe(roles => { this.zitadelPermissions.next(roles); }); @@ -136,9 +145,7 @@ export class GrpcAuthService { */ public isAllowed(roles: string[] | RegExp[]): Observable { if (roles && roles.length > 0) { - return this.zitadelPermissions.pipe(switchMap(zroles => { - return of(this.hasRoles(zroles, roles)); - })); + return this.zitadelPermissions.pipe(switchMap(zroles => of(this.hasRoles(zroles, roles)))); } else { return of(false); } @@ -157,29 +164,29 @@ export class GrpcAuthService { }) > -1; } - public async GetMyUserProfile(): Promise { + public GetMyUserProfile(): Promise { return this.grpcService.auth.getMyUserProfile(new Empty()); } - public async GetMyPasswordComplexityPolicy(): Promise { + public GetMyPasswordComplexityPolicy(): Promise { return this.grpcService.auth.getMyPasswordComplexityPolicy( new Empty(), ); } - public async GetMyUser(): Promise { + public GetMyUser(): Promise { return this.grpcService.auth.getMyUser( new Empty(), ); } - public async GetMyMfas(): Promise { + public GetMyMfas(): Promise { return this.grpcService.auth.getMyMfas( new Empty(), ); } - public async SearchMyProjectOrgs( + public SearchMyProjectOrgs( limit: number, offset: number, queryList?: MyProjectOrgSearchQuery[], @@ -194,7 +201,7 @@ export class GrpcAuthService { return this.grpcService.auth.searchMyProjectOrgs(req); } - public async SaveMyUserProfile( + public SaveMyUserProfile( firstName?: string, lastName?: string, nickName?: string, @@ -220,108 +227,120 @@ export class GrpcAuthService { return this.grpcService.auth.updateMyUserProfile(req); } - public async getMyUserSessions(): Promise { + public get zitadelPermissionsChanged(): Observable { + return this.zitadelPermissions; + } + + public getMyUserSessions(): Promise { return this.grpcService.auth.getMyUserSessions( new Empty(), ); } - public async GetMyUserEmail(): Promise { + public GetMyUserEmail(): Promise { return this.grpcService.auth.getMyUserEmail( new Empty(), ); } - public async SaveMyUserEmail(email: string): Promise { + public SaveMyUserEmail(email: string): Promise { const req = new UpdateUserEmailRequest(); req.setEmail(email); return this.grpcService.auth.changeMyUserEmail(req); } - public async RemoveMyUserPhone(): Promise { + public RemoveMyUserPhone(): Promise { return this.grpcService.auth.removeMyUserPhone( new Empty(), ); } - public async GetMyzitadelPermissions(): Promise { + public GetMyzitadelPermissions(): Promise { return this.grpcService.auth.getMyZitadelPermissions( new Empty(), ); } - public async GetMyUserPhone(): Promise { + public GetMyUserPhone(): Promise { return this.grpcService.auth.getMyUserPhone( new Empty(), ); } - public async SaveMyUserPhone(phone: string): Promise { + public SaveMyUserPhone(phone: string): Promise { const req = new UpdateUserPhoneRequest(); req.setPhone(phone); return this.grpcService.auth.changeMyUserPhone(req); } - public async GetMyUserAddress(): Promise { + public GetMyUserAddress(): Promise { return this.grpcService.auth.getMyUserAddress( new Empty(), ); } - public async ResendEmailVerification(): Promise { + public ResendEmailVerification(): Promise { const req = new Empty(); return this.grpcService.auth.resendMyEmailVerificationMail(req); } - public async ResendPhoneVerification(): Promise { + public ResendPhoneVerification(): Promise { const req = new Empty(); return this.grpcService.auth.resendMyPhoneVerificationCode(req); } - public async ChangeMyPassword(oldPassword: string, newPassword: string): Promise { + public ChangeMyPassword(oldPassword: string, newPassword: string): Promise { const req = new PasswordChange(); req.setOldPassword(oldPassword); req.setNewPassword(newPassword); return this.grpcService.auth.changeMyPassword(req); } - public async SearchExternalIdps( - userId: string, - limit: number, - offset: number, - asc?: boolean, - ): Promise { - const req = new ExternalIDPSearchRequest(); - req.setLimit(limit); - req.setOffset(offset); - return this.grpcService.auth.searchMyExternalIDPs(req); + public RemoveExternalIDP( + externalUserId: string, + idpConfigId: string, + ): Promise { + const req = new ExternalIDPRemoveRequest(); + req.setExternalUserId(externalUserId); + req.setIdpConfigId(idpConfigId); + return this.grpcService.auth.removeMyExternalIDP(req); } - public async AddMfaOTP(): Promise { + public SearchMyExternalIdps( + limit: number, + offset: number, + ): Promise { + const req = new ExternalIDPSearchRequest(); + req.setLimit(limit); + req.setOffset(offset); + return this.grpcService.auth.searchMyExternalIDPs(req); + } + + public AddMfaOTP(): Promise { return this.grpcService.auth.addMfaOTP( new Empty(), ); } - public async RemoveMfaOTP(): Promise { + public RemoveMfaOTP(): Promise { return this.grpcService.auth.removeMfaOTP( new Empty(), ); } - public async VerifyMfaOTP(code: string): Promise { + public VerifyMfaOTP(code: string): Promise { const req = new VerifyMfaOtp(); req.setCode(code); return this.grpcService.auth.verifyMfaOTP(req); } - public async VerifyMyUserPhone(code: string): Promise { + public VerifyMyUserPhone(code: string): Promise { const req = new VerifyUserPhoneRequest(); req.setCode(code); return this.grpcService.auth.verifyMyUserPhone(req); } - public async SaveMyUserAddress(address: UserAddress.AsObject): Promise { + public SaveMyUserAddress(address: UserAddress.AsObject): Promise { const req = new UpdateUserAddressRequest(); req.setStreetAddress(address.streetAddress); req.setPostalCode(address.postalCode); @@ -331,7 +350,7 @@ export class GrpcAuthService { return this.grpcService.auth.updateMyUserAddress(req); } - public async GetMyUserChanges(limit: number, sequenceoffset: number): Promise { + public GetMyUserChanges(limit: number, sequenceoffset: number): Promise { const req = new ChangesRequest(); req.setLimit(limit); req.setSequenceOffset(sequenceoffset); diff --git a/console/src/app/services/grpc.service.ts b/console/src/app/services/grpc.service.ts index 73a4c5e52e..055c583b23 100644 --- a/console/src/app/services/grpc.service.ts +++ b/console/src/app/services/grpc.service.ts @@ -1,6 +1,7 @@ import { PlatformLocation } from '@angular/common'; import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { AuthConfig } from 'angular-oauth2-oidc'; import { AdminServicePromiseClient } from '../proto/generated/admin_grpc_web_pb'; @@ -8,6 +9,7 @@ import { AuthServicePromiseClient } from '../proto/generated/auth_grpc_web_pb'; import { ManagementServicePromiseClient } from '../proto/generated/management_grpc_web_pb'; import { AuthenticationService } from './authentication.service'; import { AuthInterceptor } from './interceptors/auth.interceptor'; +import { I18nInterceptor } from './interceptors/i18n.interceptor'; import { OrgInterceptor } from './interceptors/org.interceptor'; import { StorageService } from './storage.service'; @@ -24,6 +26,8 @@ export class GrpcService { private platformLocation: PlatformLocation, private authenticationService: AuthenticationService, private storageService: StorageService, + private dialog: MatDialog, + // private toast: ToastService, ) { } public async loadAppEnvironment(): Promise { @@ -31,9 +35,10 @@ export class GrpcService { .toPromise().then((data: any) => { if (data && data.authServiceUrl && data.mgmtServiceUrl && data.issuer) { const interceptors = { - 'unaryInterceptors': [ - new AuthInterceptor(this.authenticationService, this.storageService), + unaryInterceptors: [ new OrgInterceptor(this.storageService), + new AuthInterceptor(this.authenticationService, this.storageService, this.dialog), + new I18nInterceptor(), ], }; diff --git a/console/src/app/services/interceptors/auth.interceptor.ts b/console/src/app/services/interceptors/auth.interceptor.ts index 09acb771c7..f609398421 100644 --- a/console/src/app/services/interceptors/auth.interceptor.ts +++ b/console/src/app/services/interceptors/auth.interceptor.ts @@ -1,40 +1,57 @@ -import { Injectable } from '@angular/core'; -import { Request, UnaryInterceptor, UnaryResponse } from 'grpc-web'; -import { filter, first } from 'rxjs/operators'; - -import { AuthenticationService } from '../authentication.service'; -import { StorageService } from '../storage.service'; - - -const authorizationKey = 'Authorization'; -const bearerPrefix = 'Bearer'; -const accessTokenStorageKey = 'access_token'; -@Injectable({ providedIn: 'root' }) -export class AuthInterceptor implements UnaryInterceptor { - constructor(private authenticationService: AuthenticationService, private storageService: StorageService) { } - - public async intercept(request: Request, invoker: any): Promise> { - await this.authenticationService.authenticationChanged.pipe( - filter((authed) => !!authed), - first(), - ).toPromise(); - - const metadata = request.getMetadata(); - const accessToken = this.storageService.getItem(accessTokenStorageKey); - metadata[authorizationKey] = `${bearerPrefix} ${accessToken}`; - - return invoker(request).then((response: any) => { - // const message = response.getResponseMessage(); - const respMetadata = response.getMetadata(); - - // TODO: intercept unauthenticated an authenticate - - // const status = respMetadata['grpc-status']; - // console.log(respMetadata, status); - // if (status?.code === 16) { - // this.authenticationService.authenticate(); - // } - return response; - }); - } -} +import { Injectable } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Request, UnaryInterceptor, UnaryResponse } from 'grpc-web'; +import { filter, first, take } from 'rxjs/operators'; +import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; + +import { AuthenticationService } from '../authentication.service'; +import { StorageService } from '../storage.service'; + + +const authorizationKey = 'Authorization'; +const bearerPrefix = 'Bearer'; +const accessTokenStorageKey = 'access_token'; +@Injectable({ providedIn: 'root' }) +/** + * Set the authentication token + */ +export class AuthInterceptor implements UnaryInterceptor { + constructor( + private authenticationService: AuthenticationService, + private storageService: StorageService, + private dialog: MatDialog, + ) { } + + public async intercept(request: Request, invoker: any): Promise> { + await this.authenticationService.authenticationChanged.pipe( + filter((authed) => !!authed), + first(), + ).toPromise(); + + const metadata = request.getMetadata(); + const accessToken = this.storageService.getItem(accessTokenStorageKey); + metadata[authorizationKey] = `${bearerPrefix} ${accessToken}`; + + return invoker(request).then((response: any) => { + return response; + }).catch((error: any) => { + if (error.code === 16) { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.LOGIN', + titleKey: 'ERRORS.TOKENINVALID.TITLE', + descriptionKey: 'ERRORS.TOKENINVALID.DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().pipe(take(1)).subscribe(resp => { + if (resp) { + this.authenticationService.authenticate(undefined, true, true); + } + }); + } + return Promise.reject(error); + }); + } +} diff --git a/console/src/app/services/interceptors/i18n.interceptor.ts b/console/src/app/services/interceptors/i18n.interceptor.ts new file mode 100644 index 0000000000..024e2e52d2 --- /dev/null +++ b/console/src/app/services/interceptors/i18n.interceptor.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { Request, UnaryInterceptor, UnaryResponse } from 'grpc-web'; + + +const i18nHeader = 'Accept-Language'; +@Injectable({ providedIn: 'root' }) +/** + * Set the navigator language as header to all grpc requests + */ +export class I18nInterceptor implements UnaryInterceptor { + constructor() { } + + public async intercept(request: Request, invoker: any): Promise> { + const metadata = request.getMetadata(); + + const navLang = navigator.language; + if (navLang) { + metadata[i18nHeader] = navLang; + } + + return invoker(request).then((response: any) => { + return response; + }).catch((error: any) => { + return Promise.reject(error); + }); + } +} diff --git a/console/src/app/services/interceptors/org.interceptor.ts b/console/src/app/services/interceptors/org.interceptor.ts index bcd8522c52..f488132b3e 100644 --- a/console/src/app/services/interceptors/org.interceptor.ts +++ b/console/src/app/services/interceptors/org.interceptor.ts @@ -5,7 +5,8 @@ import { Org } from 'src/app/proto/generated/auth_pb'; import { StorageService } from '../storage.service'; -const orgKey = 'x-zitadel-orgid'; +const ORG_HEADER_KEY = 'x-zitadel-orgid'; +const ORG_STORAGE_KEY = 'organization'; @Injectable({ providedIn: 'root' }) export class OrgInterceptor implements UnaryInterceptor { constructor(private readonly storageService: StorageService) { } @@ -13,14 +14,19 @@ export class OrgInterceptor implements UnaryInt public intercept(request: Request, invoker: any): Promise> { const metadata = request.getMetadata(); - const org: Org.AsObject | null = (this.storageService.getItem('organization')); + const org: Org.AsObject | null = (this.storageService.getItem(ORG_STORAGE_KEY)); if (org) { - metadata[orgKey] = `${org.id}`; + metadata[ORG_HEADER_KEY] = `${org.id}`; } return invoker(request).then((response: any) => { return response; + }).catch((error: any) => { + if (error.code === 7 && error.message.startsWith('Organisation doesn\'t exist')) { + this.storageService.removeItem(ORG_STORAGE_KEY); + } + return Promise.reject(error); }); } } diff --git a/console/src/app/services/mgmt.service.ts b/console/src/app/services/mgmt.service.ts index 3f72ae3c08..ab6debbfe8 100644 --- a/console/src/app/services/mgmt.service.ts +++ b/console/src/app/services/mgmt.service.ts @@ -3,154 +3,154 @@ import { Empty } from 'google-protobuf/google/protobuf/empty_pb'; import { Timestamp } from 'google-protobuf/google/protobuf/timestamp_pb'; import { - AddMachineKeyRequest, - AddMachineKeyResponse, - AddOrgDomainRequest, - AddOrgMemberRequest, - Application, - ApplicationID, - ApplicationSearchQuery, - ApplicationSearchRequest, - ApplicationSearchResponse, - ApplicationUpdate, - ApplicationView, - ChangeOrgMemberRequest, - ChangeRequest, - Changes, - CreateHumanRequest, - CreateMachineRequest, - CreateUserRequest, - Domain, ExternalIDPSearchRequest, ExternalIDPSearchResponse, - Gender, - GrantedProjectSearchRequest, - Iam, - Idp, - IdpID, - IdpUpdate, - IdpProviderAdd, - IdpProviderID, - IdpProviderSearchRequest, - IdpProviderSearchResponse, - IdpProviderType, - IdpSearchQuery, - IdpSearchRequest, - IdpSearchResponse, - IdpView, - LoginName, - LoginPolicy, - LoginPolicyView, - MachineKeyIDRequest, - MachineKeySearchRequest, - MachineKeySearchResponse, - MachineKeyType, - MachineResponse, - MultiFactors, - NotificationType, - OIDCApplicationCreate, - OIDCConfig, - OIDCConfigUpdate, - OidcIdpConfig, - OidcIdpConfigCreate, - OidcIdpConfigUpdate, - Org, - OrgCreateRequest, - OrgDomain, - OrgDomainSearchQuery, - OrgDomainSearchRequest, - OrgDomainSearchResponse, - OrgDomainValidationRequest, - OrgDomainValidationResponse, - OrgDomainValidationType, - OrgIamPolicy, - OrgMember, - OrgMemberRoles, - OrgMemberSearchRequest, - OrgMemberSearchResponse, - OrgView, - PasswordAgePolicy, - PasswordAgePolicyCreate, - PasswordAgePolicyID, - PasswordAgePolicyUpdate, - PasswordComplexityPolicy, - PasswordComplexityPolicyCreate, - PasswordComplexityPolicyID, - PasswordComplexityPolicyUpdate, - PasswordLockoutPolicy, - PasswordLockoutPolicyCreate, - PasswordLockoutPolicyID, - PasswordLockoutPolicyUpdate, - PasswordRequest, - PrimaryOrgDomainRequest, - Project, - ProjectCreateRequest, - ProjectGrant, - ProjectGrantCreate, - ProjectGrantID, - ProjectGrantMember, - ProjectGrantMemberAdd, - ProjectGrantMemberChange, - ProjectGrantMemberRemove, - ProjectGrantMemberRoles, - ProjectGrantMemberSearchQuery, - ProjectGrantMemberSearchRequest, - ProjectGrantSearchRequest, - ProjectGrantSearchResponse, - ProjectGrantUpdate, - ProjectGrantView, - ProjectID, - ProjectMember, - ProjectMemberAdd, - ProjectMemberChange, - ProjectMemberRemove, - ProjectMemberRoles, - ProjectMemberSearchQuery, - ProjectMemberSearchRequest, - ProjectMemberSearchResponse, - ProjectRole, - ProjectRoleAdd, - ProjectRoleAddBulk, - ProjectRoleChange, - ProjectRoleRemove, - ProjectRoleSearchQuery, - ProjectRoleSearchRequest, - ProjectRoleSearchResponse, - ProjectSearchQuery, - ProjectSearchRequest, - ProjectSearchResponse, - ProjectUpdateRequest, - ProjectView, - RemoveOrgDomainRequest, - RemoveOrgMemberRequest, - SetPasswordNotificationRequest, - UpdateMachineRequest, - UpdateUserAddressRequest, - UpdateUserEmailRequest, - UpdateUserPhoneRequest, - UpdateUserProfileRequest, - UserAddress, - UserEmail, - UserGrant, - UserGrantCreate, - UserGrantID, - UserGrantRemoveBulk, - UserGrantSearchQuery, - UserGrantSearchRequest, - UserGrantSearchResponse, - UserGrantUpdate, - UserGrantView, - UserID, - UserMembershipSearchQuery, - UserMembershipSearchRequest, - UserMembershipSearchResponse, - UserPhone, - UserProfile, - UserResponse, - UserSearchQuery, - UserSearchRequest, - UserSearchResponse, - UserView, - ValidateOrgDomainRequest, - ZitadelDocs, + AddMachineKeyRequest, + AddMachineKeyResponse, + AddOrgDomainRequest, + AddOrgMemberRequest, + Application, + ApplicationID, + ApplicationSearchQuery, + ApplicationSearchRequest, + ApplicationSearchResponse, + ApplicationUpdate, + ApplicationView, + ChangeOrgMemberRequest, + ChangeRequest, + Changes, + CreateHumanRequest, + CreateMachineRequest, + CreateUserRequest, + Domain, + ExternalIDPRemoveRequest, + ExternalIDPSearchRequest, + ExternalIDPSearchResponse, + Gender, + GrantedProjectSearchRequest, + Iam, + Idp, + IdpID, + IdpProviderAdd, + IdpProviderID, + IdpProviderSearchRequest, + IdpProviderSearchResponse, + IdpProviderType, + IdpSearchQuery, + IdpSearchRequest, + IdpSearchResponse, + IdpUpdate, + IdpView, + LoginName, + LoginPolicy, + LoginPolicyRequest, + LoginPolicyView, + MachineKeyIDRequest, + MachineKeySearchRequest, + MachineKeySearchResponse, + MachineKeyType, + MachineResponse, + MultiFactors, + NotificationType, + OIDCApplicationCreate, + OIDCConfig, + OIDCConfigUpdate, + OidcIdpConfig, + OidcIdpConfigCreate, + OidcIdpConfigUpdate, + Org, + OrgCreateRequest, + OrgDomain, + OrgDomainSearchQuery, + OrgDomainSearchRequest, + OrgDomainSearchResponse, + OrgDomainValidationRequest, + OrgDomainValidationResponse, + OrgDomainValidationType, + OrgIamPolicyView, + OrgMember, + OrgMemberRoles, + OrgMemberSearchRequest, + OrgMemberSearchResponse, + OrgView, + PasswordAgePolicy, + PasswordAgePolicyRequest, + PasswordAgePolicyView, + PasswordComplexityPolicy, + PasswordComplexityPolicyRequest, + PasswordComplexityPolicyView, + PasswordLockoutPolicy, + PasswordLockoutPolicyRequest, + PasswordRequest, + PrimaryOrgDomainRequest, + Project, + ProjectCreateRequest, + ProjectGrant, + ProjectGrantCreate, + ProjectGrantID, + ProjectGrantMember, + ProjectGrantMemberAdd, + ProjectGrantMemberChange, + ProjectGrantMemberRemove, + ProjectGrantMemberRoles, + ProjectGrantMemberSearchQuery, + ProjectGrantMemberSearchRequest, + ProjectGrantSearchRequest, + ProjectGrantSearchResponse, + ProjectGrantUpdate, + ProjectGrantView, + ProjectID, + ProjectMember, + ProjectMemberAdd, + ProjectMemberChange, + ProjectMemberRemove, + ProjectMemberRoles, + ProjectMemberSearchQuery, + ProjectMemberSearchRequest, + ProjectMemberSearchResponse, + ProjectRole, + ProjectRoleAdd, + ProjectRoleAddBulk, + ProjectRoleChange, + ProjectRoleRemove, + ProjectRoleSearchQuery, + ProjectRoleSearchRequest, + ProjectRoleSearchResponse, + ProjectSearchQuery, + ProjectSearchRequest, + ProjectSearchResponse, + ProjectUpdateRequest, + ProjectView, + RemoveOrgDomainRequest, + RemoveOrgMemberRequest, + SetPasswordNotificationRequest, + UpdateMachineRequest, + UpdateUserAddressRequest, + UpdateUserEmailRequest, + UpdateUserPhoneRequest, + UpdateUserProfileRequest, + UserAddress, + UserEmail, + UserGrant, + UserGrantCreate, + UserGrantID, + UserGrantRemoveBulk, + UserGrantSearchQuery, + UserGrantSearchRequest, + UserGrantSearchResponse, + UserGrantUpdate, + UserGrantView, + UserID, + UserMembershipSearchQuery, + UserMembershipSearchRequest, + UserMembershipSearchResponse, + UserPhone, + UserProfile, + UserResponse, + UserSearchQuery, + UserSearchRequest, + UserSearchResponse, + UserView, + ValidateOrgDomainRequest, + ZitadelDocs, } from '../proto/generated/management_pb'; import { GrpcService } from './grpc.service'; @@ -162,7 +162,7 @@ export type ResponseMapper = (resp: TResp) => TMappedResp; export class ManagementService { constructor(private readonly grpcService: GrpcService) { } - public async SearchIdps( + public SearchIdps( limit?: number, offset?: number, queryList?: IdpSearchQuery[], @@ -180,33 +180,37 @@ export class ManagementService { return this.grpcService.mgmt.searchIdps(req); } - public async GetLoginPolicy(): Promise { + public GetLoginPolicy(): Promise { const req = new Empty(); return this.grpcService.mgmt.getLoginPolicy(req); } - public async UpdateLoginPolicy(req: LoginPolicy): Promise { + public UpdateLoginPolicy(req: LoginPolicyRequest): Promise { return this.grpcService.mgmt.updateLoginPolicy(req); } - public async RemoveLoginPolicy(): Promise { + public CreateLoginPolicy(req: LoginPolicyRequest): Promise { + return this.grpcService.mgmt.createLoginPolicy(req); + } + + public RemoveLoginPolicy(): Promise { return this.grpcService.mgmt.removeLoginPolicy(new Empty()); } - public async addIdpProviderToLoginPolicy(configId: string, idpType: IdpProviderType): Promise { + public addIdpProviderToLoginPolicy(configId: string, idpType: IdpProviderType): Promise { const req = new IdpProviderAdd(); req.setIdpProviderType(idpType); req.setIdpConfigId(configId); return this.grpcService.mgmt.addIdpProviderToLoginPolicy(req); } - public async RemoveIdpProviderFromLoginPolicy(configId: string): Promise { + public RemoveIdpProviderFromLoginPolicy(configId: string): Promise { const req = new IdpProviderID(); req.setIdpConfigId(configId); return this.grpcService.mgmt.removeIdpProviderFromLoginPolicy(req); } - public async GetLoginPolicyIdpProviders(limit?: number, offset?: number): Promise { + public GetLoginPolicyIdpProviders(limit?: number, offset?: number): Promise { const req = new IdpProviderSearchRequest(); if (limit) { req.setLimit(limit); @@ -217,7 +221,7 @@ export class ManagementService { return this.grpcService.mgmt.getLoginPolicyIdpProviders(req); } - public async IdpByID( + public IdpByID( id: string, ): Promise { const req = new IdpID(); @@ -225,25 +229,25 @@ export class ManagementService { return this.grpcService.mgmt.idpByID(req); } - public async UpdateIdp( - req: IdpUpdate, + public UpdateIdp( + req: IdpUpdate, ): Promise { - return this.grpcService.mgmt.updateIdpConfig(req); + return this.grpcService.mgmt.updateIdpConfig(req); } - public async CreateOidcIdp( + public CreateOidcIdp( req: OidcIdpConfigCreate, ): Promise { return this.grpcService.mgmt.createOidcIdp(req); } - public async UpdateOidcIdpConfig( + public UpdateOidcIdpConfig( req: OidcIdpConfigUpdate, ): Promise { return this.grpcService.mgmt.updateOidcIdpConfig(req); } - public async RemoveIdpConfig( + public RemoveIdpConfig( id: string, ): Promise { const req = new IdpID; @@ -251,7 +255,7 @@ export class ManagementService { return this.grpcService.mgmt.removeIdpConfig(req); } - public async DeactivateIdpConfig( + public DeactivateIdpConfig( id: string, ): Promise { const req = new IdpID; @@ -259,7 +263,7 @@ export class ManagementService { return this.grpcService.mgmt.deactivateIdpConfig(req); } - public async ReactivateIdpConfig( + public ReactivateIdpConfig( id: string, ): Promise { const req = new IdpID; @@ -267,7 +271,7 @@ export class ManagementService { return this.grpcService.mgmt.reactivateIdpConfig(req); } - public async CreateUserHuman(username: string, user: CreateHumanRequest): Promise { + public CreateUserHuman(username: string, user: CreateHumanRequest): Promise { const req = new CreateUserRequest(); req.setUserName(username); @@ -276,7 +280,7 @@ export class ManagementService { return this.grpcService.mgmt.createUser(req); } - public async CreateUserMachine(username: string, user: CreateMachineRequest): Promise { + public CreateUserMachine(username: string, user: CreateMachineRequest): Promise { const req = new CreateUserRequest(); req.setUserName(username); @@ -285,7 +289,7 @@ export class ManagementService { return this.grpcService.mgmt.createUser(req); } - public async UpdateUserMachine( + public UpdateUserMachine( id: string, description?: string, ): Promise { @@ -297,7 +301,7 @@ export class ManagementService { return this.grpcService.mgmt.updateUserMachine(req); } - public async AddMachineKey( + public AddMachineKey( userId: string, type: MachineKeyType, date?: Timestamp, @@ -311,7 +315,7 @@ export class ManagementService { return this.grpcService.mgmt.addMachineKey(req); } - public async DeleteMachineKey( + public DeleteMachineKey( keyId: string, userId: string, ): Promise { @@ -322,7 +326,7 @@ export class ManagementService { return this.grpcService.mgmt.deleteMachineKey(req); } - public async SearchMachineKeys( + public SearchMachineKeys( userId: string, limit: number, offset: number, @@ -338,46 +342,58 @@ export class ManagementService { return this.grpcService.mgmt.searchMachineKeys(req); } - public async SearchExternalIdps( - userId: string, - limit: number, - offset: number, - asc?: boolean, - ): Promise { - const req = new ExternalIDPSearchRequest(); - req.setUserId(userId); - req.setLimit(limit); - req.setOffset(offset); - return this.grpcService.mgmt.searchUserExternalIDPs(req); + public RemoveExternalIDP( + externalUserId: string, + idpConfigId: string, + userId: string, + ): Promise { + const req = new ExternalIDPRemoveRequest(); + req.setUserId(userId); + req.setExternalUserId(externalUserId); + req.setIdpConfigId(idpConfigId); + return this.grpcService.mgmt.removeExternalIDP(req); } - public async GetIam(): Promise { + + public SearchUserExternalIDPs( + limit: number, + offset: number, + userId: string, + ): Promise { + const req = new ExternalIDPSearchRequest(); + req.setUserId(userId); + req.setLimit(limit); + req.setOffset(offset); + return this.grpcService.mgmt.searchUserExternalIDPs(req); + } + + public GetIam(): Promise { const req = new Empty(); return this.grpcService.mgmt.getIam(req); } - public async GetDefaultPasswordComplexityPolicy(): Promise { + public GetDefaultPasswordComplexityPolicy(): Promise { const req = new Empty(); return this.grpcService.mgmt.getDefaultPasswordComplexityPolicy(req); } - public async GetMyOrg(): Promise { + public GetMyOrg(): Promise { const req = new Empty(); return this.grpcService.mgmt.getMyOrg(req); } - public async AddMyOrgDomain(domain: string): Promise { + public AddMyOrgDomain(domain: string): Promise { const req: AddOrgDomainRequest = new AddOrgDomainRequest(); req.setDomain(domain); return this.grpcService.mgmt.addMyOrgDomain(req); } - public async RemoveMyOrgDomain(domain: string): Promise { + public RemoveMyOrgDomain(domain: string): Promise { const req: RemoveOrgDomainRequest = new AddOrgDomainRequest(); req.setDomain(domain); return this.grpcService.mgmt.removeMyOrgDomain(req); } - public async SearchMyOrgDomains(offset: number, limit: number, queryList?: OrgDomainSearchQuery[]): + public SearchMyOrgDomains(offset: number, limit: number, queryList?: OrgDomainSearchQuery[]): Promise { const req: OrgDomainSearchRequest = new OrgDomainSearchRequest(); req.setLimit(limit); @@ -389,13 +405,13 @@ export class ManagementService { return this.grpcService.mgmt.searchMyOrgDomains(req); } - public async setMyPrimaryOrgDomain(domain: string): Promise { + public setMyPrimaryOrgDomain(domain: string): Promise { const req: PrimaryOrgDomainRequest = new PrimaryOrgDomainRequest(); req.setDomain(domain); return this.grpcService.mgmt.setMyPrimaryOrgDomain(req); } - public async GenerateMyOrgDomainValidation(domain: string, type: OrgDomainValidationType): + public GenerateMyOrgDomainValidation(domain: string, type: OrgDomainValidationType): Promise { const req: OrgDomainValidationRequest = new OrgDomainValidationRequest(); req.setDomain(domain); @@ -404,7 +420,7 @@ export class ManagementService { return this.grpcService.mgmt.generateMyOrgDomainValidation(req); } - public async ValidateMyOrgDomain(domain: string): + public ValidateMyOrgDomain(domain: string): Promise { const req: ValidateOrgDomainRequest = new ValidateOrgDomainRequest(); req.setDomain(domain); @@ -412,26 +428,26 @@ export class ManagementService { return this.grpcService.mgmt.validateMyOrgDomain(req); } - public async SearchMyOrgMembers(limit: number, offset: number): Promise { + public SearchMyOrgMembers(limit: number, offset: number): Promise { const req = new OrgMemberSearchRequest(); req.setLimit(limit); req.setOffset(offset); return this.grpcService.mgmt.searchMyOrgMembers(req); } - public async getOrgByDomainGlobal(domain: string): Promise { + public getOrgByDomainGlobal(domain: string): Promise { const req = new Domain(); req.setDomain(domain); return this.grpcService.mgmt.getOrgByDomainGlobal(req); } - public async CreateOrg(name: string): Promise { + public CreateOrg(name: string): Promise { const req = new OrgCreateRequest(); req.setName(name); return this.grpcService.mgmt.createOrg(req); } - public async AddMyOrgMember(userId: string, rolesList: string[]): Promise { + public AddMyOrgMember(userId: string, rolesList: string[]): Promise { const req = new AddOrgMemberRequest(); req.setUserId(userId); if (rolesList) { @@ -440,7 +456,7 @@ export class ManagementService { return this.grpcService.mgmt.addMyOrgMember(req); } - public async ChangeMyOrgMember(userId: string, rolesList: string[]): Promise { + public ChangeMyOrgMember(userId: string, rolesList: string[]): Promise { const req = new ChangeOrgMemberRequest(); req.setUserId(userId); req.setRolesList(rolesList); @@ -448,23 +464,23 @@ export class ManagementService { } - public async RemoveMyOrgMember(userId: string): Promise { + public RemoveMyOrgMember(userId: string): Promise { const req = new RemoveOrgMemberRequest(); req.setUserId(userId); return this.grpcService.mgmt.removeMyOrgMember(req); } - public async DeactivateMyOrg(): Promise { + public DeactivateMyOrg(): Promise { const req = new Empty(); return this.grpcService.mgmt.deactivateMyOrg(req); } - public async ReactivateMyOrg(): Promise { + public ReactivateMyOrg(): Promise { const req = new Empty(); return this.grpcService.mgmt.reactivateMyOrg(req); } - public async CreateProjectGrant( + public CreateProjectGrant( orgId: string, projectId: string, roleKeysList: string[], @@ -476,70 +492,63 @@ export class ManagementService { return this.grpcService.mgmt.createProjectGrant(req); } - public async GetOrgMemberRoles(): Promise { + public GetOrgMemberRoles(): Promise { const req = new Empty(); return this.grpcService.mgmt.getOrgMemberRoles(req); } // Policy - public async GetMyOrgIamPolicy(): Promise { + public GetMyOrgIamPolicy(): Promise { const req = new Empty(); return this.grpcService.mgmt.getMyOrgIamPolicy(req); } - public async GetPasswordAgePolicy(): Promise { + public GetPasswordAgePolicy(): Promise { const req = new Empty(); return this.grpcService.mgmt.getPasswordAgePolicy(req); } - public async CreatePasswordAgePolicy( - description: string, + public CreatePasswordAgePolicy( maxAgeDays: number, expireWarnDays: number, ): Promise { - const req = new PasswordAgePolicyCreate(); - req.setDescription(description); + const req = new PasswordAgePolicyRequest(); req.setMaxAgeDays(maxAgeDays); req.setExpireWarnDays(expireWarnDays); return this.grpcService.mgmt.createPasswordAgePolicy(req); } - public async DeletePasswordAgePolicy(id: string): Promise { - const req = new PasswordAgePolicyID(); - req.setId(id); - return this.grpcService.mgmt.deletePasswordAgePolicy(req); + public RemovePasswordAgePolicy(): Promise { + const req = new Empty(); + return this.grpcService.mgmt.removePasswordAgePolicy(req); } - public async UpdatePasswordAgePolicy( - description: string, + public UpdatePasswordAgePolicy( maxAgeDays: number, expireWarnDays: number, ): Promise { - const req = new PasswordAgePolicyUpdate(); - req.setDescription(description); + const req = new PasswordAgePolicyRequest(); req.setMaxAgeDays(maxAgeDays); req.setExpireWarnDays(expireWarnDays); return this.grpcService.mgmt.updatePasswordAgePolicy(req); } - public async GetPasswordComplexityPolicy(): Promise { + public GetPasswordComplexityPolicy(): Promise { const req = new Empty(); return this.grpcService.mgmt.getPasswordComplexityPolicy(req); } - public async CreatePasswordComplexityPolicy( - description: string, + public CreatePasswordComplexityPolicy( hasLowerCase: boolean, hasUpperCase: boolean, hasNumber: boolean, hasSymbol: boolean, minLength: number, ): Promise { - const req = new PasswordComplexityPolicyCreate(); - req.setDescription(description); + const req = new PasswordComplexityPolicyRequest(); req.setHasLowercase(hasLowerCase); req.setHasUppercase(hasUpperCase); req.setHasNumber(hasNumber); @@ -548,22 +557,19 @@ export class ManagementService { return this.grpcService.mgmt.createPasswordComplexityPolicy(req); } - public async DeletePasswordComplexityPolicy(id: string): Promise { - const req = new PasswordComplexityPolicyID(); - req.setId(id); - return this.grpcService.mgmt.deletePasswordComplexityPolicy(req); + public removePasswordComplexityPolicy(): Promise { + const req = new Empty(); + return this.grpcService.mgmt.removePasswordComplexityPolicy(req); } - public async UpdatePasswordComplexityPolicy( - description: string, + public UpdatePasswordComplexityPolicy( hasLowerCase: boolean, hasUpperCase: boolean, hasNumber: boolean, hasSymbol: boolean, minLength: number, ): Promise { - const req = new PasswordComplexityPolicyUpdate(); - req.setDescription(description); + const req = new PasswordComplexityPolicy(); req.setHasLowercase(hasLowerCase); req.setHasUppercase(hasUpperCase); req.setHasNumber(hasNumber); @@ -572,63 +578,63 @@ export class ManagementService { return this.grpcService.mgmt.updatePasswordComplexityPolicy(req); } - public async GetPasswordLockoutPolicy(): Promise { + public GetPasswordLockoutPolicy(): Promise { const req = new Empty(); return this.grpcService.mgmt.getPasswordLockoutPolicy(req); } - public async CreatePasswordLockoutPolicy( - description: string, + public CreatePasswordLockoutPolicy( maxAttempts: number, showLockoutFailures: boolean, ): Promise { - const req = new PasswordLockoutPolicyCreate(); - req.setDescription(description); + const req = new PasswordLockoutPolicyRequest(); req.setMaxAttempts(maxAttempts); - req.setShowLockOutFailures(showLockoutFailures); + req.setShowLockoutFailure(showLockoutFailures); return this.grpcService.mgmt.createPasswordLockoutPolicy(req); } - public async DeletePasswordLockoutPolicy(id: string): Promise { - const req = new PasswordLockoutPolicyID(); - req.setId(id); - - return this.grpcService.mgmt.deletePasswordLockoutPolicy(req); + public RemovePasswordLockoutPolicy(): Promise { + const req = new Empty(); + return this.grpcService.mgmt.removePasswordLockoutPolicy(req); } - public async UpdatePasswordLockoutPolicy( - description: string, + public UpdatePasswordLockoutPolicy( maxAttempts: number, showLockoutFailures: boolean, ): Promise { - const req = new PasswordLockoutPolicyUpdate(); - req.setDescription(description); + const req = new PasswordLockoutPolicy(); req.setMaxAttempts(maxAttempts); - req.setShowLockOutFailures(showLockoutFailures); + req.setShowLockoutFailure(showLockoutFailures); return this.grpcService.mgmt.updatePasswordLockoutPolicy(req); } public getLocalizedComplexityPolicyPatternErrorString(policy: PasswordComplexityPolicy.AsObject): string { if (policy.hasNumber && policy.hasSymbol) { - return 'ORG.POLICY.PWD_COMPLEXITY.SYMBOLANDNUMBERERROR'; + return 'POLICY.PWD_COMPLEXITY.SYMBOLANDNUMBERERROR'; } else if (policy.hasNumber) { - return 'ORG.POLICY.PWD_COMPLEXITY.NUMBERERROR'; + return 'POLICY.PWD_COMPLEXITY.NUMBERERROR'; } else if (policy.hasSymbol) { - return 'ORG.POLICY.PWD_COMPLEXITY.SYMBOLERROR'; + return 'POLICY.PWD_COMPLEXITY.SYMBOLERROR'; } else { - return 'ORG.POLICY.PWD_COMPLEXITY.PATTERNERROR'; + return 'POLICY.PWD_COMPLEXITY.PATTERNERROR'; } } - public async GetUserByID(id: string): Promise { + public GetUserByID(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.getUserByID(req); } - public async SearchProjectMembers( + public DeleteUser(id: string): Promise { + const req = new UserID(); + req.setId(id); + return this.grpcService.mgmt.deleteUser(req); + } + + public SearchProjectMembers( projectId: string, limit: number, offset: number, @@ -644,7 +650,7 @@ export class ManagementService { return this.grpcService.mgmt.searchProjectMembers(req); } - public async SearchUserMemberships(userId: string, + public SearchUserMemberships(userId: string, limit: number, offset: number, queryList?: UserMembershipSearchQuery[]): Promise { const req = new UserMembershipSearchRequest(); req.setLimit(limit); @@ -656,19 +662,19 @@ export class ManagementService { return this.grpcService.mgmt.searchUserMemberships(req); } - public async GetUserProfile(id: string): Promise { + public GetUserProfile(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.getUserProfile(req); } - public async getUserMfas(id: string): Promise { + public getUserMfas(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.getUserMfas(req); } - public async SaveUserProfile( + public SaveUserProfile( id: string, firstName?: string, lastName?: string, @@ -696,45 +702,45 @@ export class ManagementService { return this.grpcService.mgmt.updateUserProfile(req); } - public async GetUserEmail(id: string): Promise { + public GetUserEmail(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.getUserEmail(req); } - public async SaveUserEmail(id: string, email: string): Promise { + public SaveUserEmail(id: string, email: string): Promise { const req = new UpdateUserEmailRequest(); req.setId(id); req.setEmail(email); return this.grpcService.mgmt.changeUserEmail(req); } - public async GetUserPhone(id: string): Promise { + public GetUserPhone(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.getUserPhone(req); } - public async SaveUserPhone(id: string, phone: string): Promise { + public SaveUserPhone(id: string, phone: string): Promise { const req = new UpdateUserPhoneRequest(); req.setId(id); req.setPhone(phone); return this.grpcService.mgmt.changeUserPhone(req); } - public async RemoveUserPhone(id: string): Promise { + public RemoveUserPhone(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.removeUserPhone(req); } - public async DeactivateUser(id: string): Promise { + public DeactivateUser(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.deactivateUser(req); } - public async CreateUserGrant( + public CreateUserGrant( userId: string, roleNamesList: string[], projectId?: string, @@ -749,13 +755,13 @@ export class ManagementService { return this.grpcService.mgmt.createUserGrant(req); } - public async ReactivateUser(id: string): Promise { + public ReactivateUser(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.reactivateUser(req); } - public async AddRole(id: string, key: string, displayName: string, group: string): Promise { + public AddRole(id: string, key: string, displayName: string, group: string): Promise { const req = new ProjectRoleAdd(); req.setId(id); req.setKey(key); @@ -766,39 +772,39 @@ export class ManagementService { return this.grpcService.mgmt.addProjectRole(req); } - public async GetUserAddress(id: string): Promise { + public GetUserAddress(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.getUserAddress(req); } - public async ResendEmailVerification(id: string): Promise { + public ResendEmailVerification(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.resendEmailVerificationMail(req); } - public async ResendPhoneVerification(id: string): Promise { + public ResendPhoneVerification(id: string): Promise { const req = new UserID(); req.setId(id); return this.grpcService.mgmt.resendPhoneVerificationCode(req); } - public async SetInitialPassword(id: string, password: string): Promise { + public SetInitialPassword(id: string, password: string): Promise { const req = new PasswordRequest(); req.setId(id); req.setPassword(password); return this.grpcService.mgmt.setInitialPassword(req); } - public async SendSetPasswordNotification(id: string, type: NotificationType): Promise { + public SendSetPasswordNotification(id: string, type: NotificationType): Promise { const req = new SetPasswordNotificationRequest(); req.setId(id); req.setType(type); return this.grpcService.mgmt.sendSetPasswordNotification(req); } - public async SaveUserAddress(address: UserAddress.AsObject): Promise { + public SaveUserAddress(address: UserAddress.AsObject): Promise { const req = new UpdateUserAddressRequest(); req.setId(address.id); req.setStreetAddress(address.streetAddress); @@ -809,7 +815,7 @@ export class ManagementService { return this.grpcService.mgmt.updateUserAddress(req); } - public async SearchUsers(limit: number, offset: number, queryList?: UserSearchQuery[]): Promise { + public SearchUsers(limit: number, offset: number, queryList?: UserSearchQuery[]): Promise { const req = new UserSearchRequest(); req.setLimit(limit); req.setOffset(offset); @@ -819,7 +825,7 @@ export class ManagementService { return this.grpcService.mgmt.searchUsers(req); } - public async GetUserByLoginNameGlobal(loginname: string): Promise { + public GetUserByLoginNameGlobal(loginname: string): Promise { const req = new LoginName(); req.setLoginName(loginname); return this.grpcService.mgmt.getUserByLoginNameGlobal(req); @@ -827,7 +833,7 @@ export class ManagementService { // USER GRANTS - public async SearchUserGrants( + public SearchUserGrants( limit: number, offset: number, queryList?: UserGrantSearchQuery[], @@ -842,7 +848,7 @@ export class ManagementService { } - public async UserGrantByID( + public UserGrantByID( id: string, userId: string, ): Promise { @@ -853,7 +859,7 @@ export class ManagementService { return this.grpcService.mgmt.userGrantByID(req); } - public async UpdateUserGrant( + public UpdateUserGrant( id: string, userId: string, roleKeysList: string[], @@ -866,7 +872,7 @@ export class ManagementService { return this.grpcService.mgmt.updateUserGrant(req); } - public async RemoveUserGrant( + public RemoveUserGrant( id: string, userId: string, ): Promise { @@ -877,7 +883,7 @@ export class ManagementService { return this.grpcService.mgmt.removeUserGrant(req); } - public async BulkRemoveUserGrant( + public BulkRemoveUserGrant( idsList: string[], ): Promise { const req = new UserGrantRemoveBulk(); @@ -888,7 +894,7 @@ export class ManagementService { // - public async ApplicationChanges(id: string, limit: number, offset: number): Promise { + public ApplicationChanges(id: string, limit: number, offset: number): Promise { const req = new ChangeRequest(); req.setId(id); req.setLimit(limit); @@ -896,7 +902,7 @@ export class ManagementService { return this.grpcService.mgmt.applicationChanges(req); } - public async OrgChanges(id: string, limit: number, offset: number): Promise { + public OrgChanges(id: string, limit: number, offset: number): Promise { const req = new ChangeRequest(); req.setId(id); req.setLimit(limit); @@ -904,7 +910,7 @@ export class ManagementService { return this.grpcService.mgmt.orgChanges(req); } - public async ProjectChanges(id: string, limit: number, offset: number): Promise { + public ProjectChanges(id: string, limit: number, offset: number): Promise { const req = new ChangeRequest(); req.setId(id); req.setLimit(limit); @@ -912,7 +918,7 @@ export class ManagementService { return this.grpcService.mgmt.projectChanges(req); } - public async UserChanges(id: string, limit: number, sequenceoffset: number): Promise { + public UserChanges(id: string, limit: number, sequenceoffset: number): Promise { const req = new ChangeRequest(); req.setId(id); req.setLimit(limit); @@ -922,7 +928,7 @@ export class ManagementService { // project - public async SearchProjects( + public SearchProjects( limit: number, offset: number, queryList?: ProjectSearchQuery[]): Promise { const req = new ProjectSearchRequest(); req.setLimit(limit); @@ -933,7 +939,7 @@ export class ManagementService { return this.grpcService.mgmt.searchProjects(req); } - public async SearchGrantedProjects( + public SearchGrantedProjects( limit: number, offset: number, queryList?: ProjectSearchQuery[]): Promise { const req = new GrantedProjectSearchRequest(); req.setLimit(limit); @@ -945,38 +951,40 @@ export class ManagementService { } - public async GetZitadelDocs(): Promise { + public GetZitadelDocs(): Promise { const req = new Empty(); return this.grpcService.mgmt.getZitadelDocs(req); } - public async GetProjectById(projectId: string): Promise { + public GetProjectById(projectId: string): Promise { const req = new ProjectID(); req.setId(projectId); return this.grpcService.mgmt.projectByID(req); } - public async GetGrantedProjectByID(projectId: string, id: string): Promise { + public GetGrantedProjectByID(projectId: string, id: string): Promise { const req = new ProjectGrantID(); req.setId(id); req.setProjectId(projectId); return this.grpcService.mgmt.getGrantedProjectByID(req); } - public async CreateProject(project: ProjectCreateRequest.AsObject): Promise { + public CreateProject(project: ProjectCreateRequest.AsObject): Promise { const req = new ProjectCreateRequest(); req.setName(project.name); return this.grpcService.mgmt.createProject(req); } - public async UpdateProject(id: string, name: string): Promise { + public UpdateProject(id: string, projectView: ProjectView.AsObject): Promise { const req = new ProjectUpdateRequest(); - req.setName(name); req.setId(id); + req.setName(projectView.name); + req.setProjectRoleAssertion(projectView.projectRoleAssertion); + req.setProjectRoleCheck(projectView.projectRoleCheck); return this.grpcService.mgmt.updateProject(req); } - public async UpdateProjectGrant(id: string, projectId: string, rolesList: string[]): Promise { + public UpdateProjectGrant(id: string, projectId: string, rolesList: string[]): Promise { const req = new ProjectGrantUpdate(); req.setRoleKeysList(rolesList); req.setId(id); @@ -984,26 +992,26 @@ export class ManagementService { return this.grpcService.mgmt.updateProjectGrant(req); } - public async RemoveProjectGrant(id: string, projectId: string): Promise { + public RemoveProjectGrant(id: string, projectId: string): Promise { const req = new ProjectGrantID(); req.setId(id); req.setProjectId(projectId); return this.grpcService.mgmt.removeProjectGrant(req); } - public async DeactivateProject(projectId: string): Promise { + public DeactivateProject(projectId: string): Promise { const req = new ProjectID(); req.setId(projectId); return this.grpcService.mgmt.deactivateProject(req); } - public async ReactivateProject(projectId: string): Promise { + public ReactivateProject(projectId: string): Promise { const req = new ProjectID(); req.setId(projectId); return this.grpcService.mgmt.reactivateProject(req); } - public async SearchProjectGrants(projectId: string, limit: number, offset: number): Promise { + public SearchProjectGrants(projectId: string, limit: number, offset: number): Promise { const req = new ProjectGrantSearchRequest(); req.setProjectId(projectId); req.setLimit(limit); @@ -1011,12 +1019,12 @@ export class ManagementService { return this.grpcService.mgmt.searchProjectGrants(req); } - public async GetProjectGrantMemberRoles(): Promise { + public GetProjectGrantMemberRoles(): Promise { const req = new Empty(); return this.grpcService.mgmt.getProjectGrantMemberRoles(req); } - public async AddProjectMember(id: string, userId: string, rolesList: string[]): Promise { + public AddProjectMember(id: string, userId: string, rolesList: string[]): Promise { const req = new ProjectMemberAdd(); req.setId(id); req.setUserId(userId); @@ -1024,7 +1032,7 @@ export class ManagementService { return this.grpcService.mgmt.addProjectMember(req); } - public async ChangeProjectMember(id: string, userId: string, rolesList: string[]): Promise { + public ChangeProjectMember(id: string, userId: string, rolesList: string[]): Promise { const req = new ProjectMemberChange(); req.setId(id); req.setUserId(userId); @@ -1032,7 +1040,7 @@ export class ManagementService { return this.grpcService.mgmt.changeProjectMember(req); } - public async AddProjectGrantMember( + public AddProjectGrantMember( projectId: string, grantId: string, userId: string, @@ -1046,7 +1054,7 @@ export class ManagementService { return this.grpcService.mgmt.addProjectGrantMember(req); } - public async ChangeProjectGrantMember( + public ChangeProjectGrantMember( projectId: string, grantId: string, userId: string, @@ -1060,7 +1068,7 @@ export class ManagementService { return this.grpcService.mgmt.changeProjectGrantMember(req); } - public async SearchProjectGrantMembers( + public SearchProjectGrantMembers( projectId: string, grantId: string, limit: number, @@ -1078,7 +1086,7 @@ export class ManagementService { return this.grpcService.mgmt.searchProjectGrantMembers(req); } - public async RemoveProjectGrantMember( + public RemoveProjectGrantMember( projectId: string, grantId: string, userId: string, @@ -1090,7 +1098,7 @@ export class ManagementService { return this.grpcService.mgmt.removeProjectGrantMember(req); } - public async ReactivateApplication(projectId: string, appId: string): Promise { + public ReactivateApplication(projectId: string, appId: string): Promise { const req = new ApplicationID(); req.setId(appId); req.setProjectId(projectId); @@ -1098,7 +1106,7 @@ export class ManagementService { return this.grpcService.mgmt.reactivateApplication(req); } - public async DeactivateApplication(projectId: string, appId: string): Promise { + public DeactivateApplication(projectId: string, appId: string): Promise { const req = new ApplicationID(); req.setId(appId); req.setProjectId(projectId); @@ -1106,14 +1114,14 @@ export class ManagementService { return this.grpcService.mgmt.deactivateApplication(req); } - public async RegenerateOIDCClientSecret(id: string, projectId: string): Promise { + public RegenerateOIDCClientSecret(id: string, projectId: string): Promise { const req = new ApplicationID(); req.setId(id); req.setProjectId(projectId); return this.grpcService.mgmt.regenerateOIDCClientSecret(req); } - public async SearchProjectRoles( + public SearchProjectRoles( projectId: string, limit: number, offset: number, @@ -1129,7 +1137,7 @@ export class ManagementService { return this.grpcService.mgmt.searchProjectRoles(req); } - public async AddProjectRole(role: ProjectRoleAdd.AsObject): Promise { + public AddProjectRole(role: ProjectRoleAdd.AsObject): Promise { const req = new ProjectRoleAdd(); req.setId(role.id); if (role.displayName) { @@ -1140,7 +1148,7 @@ export class ManagementService { return this.grpcService.mgmt.addProjectRole(req); } - public async BulkAddProjectRole( + public BulkAddProjectRole( id: string, rolesList: ProjectRoleAdd[], ): Promise { @@ -1150,7 +1158,7 @@ export class ManagementService { return this.grpcService.mgmt.bulkAddProjectRole(req); } - public async RemoveProjectRole(projectId: string, key: string): Promise { + public RemoveProjectRole(projectId: string, key: string): Promise { const req = new ProjectRoleRemove(); req.setId(projectId); req.setKey(key); @@ -1158,7 +1166,7 @@ export class ManagementService { } - public async ChangeProjectRole(projectId: string, key: string, displayName: string, group: string): + public ChangeProjectRole(projectId: string, key: string, displayName: string, group: string): Promise { const req = new ProjectRoleChange(); req.setId(projectId); @@ -1169,14 +1177,14 @@ export class ManagementService { } - public async RemoveProjectMember(id: string, userId: string): Promise { + public RemoveProjectMember(id: string, userId: string): Promise { const req = new ProjectMemberRemove(); req.setId(id); req.setUserId(userId); return this.grpcService.mgmt.removeProjectMember(req); } - public async SearchApplications( + public SearchApplications( projectId: string, limit: number, offset: number, @@ -1191,47 +1199,47 @@ export class ManagementService { return this.grpcService.mgmt.searchApplications(req); } - public async GetApplicationById(projectId: string, applicationId: string): Promise { + public GetApplicationById(projectId: string, applicationId: string): Promise { const req = new ApplicationID(); req.setProjectId(projectId); req.setId(applicationId); return this.grpcService.mgmt.applicationByID(req); } - public async GetProjectMemberRoles(): Promise { + public GetProjectMemberRoles(): Promise { const req = new Empty(); return this.grpcService.mgmt.getProjectMemberRoles(req); } - public async ProjectGrantByID(id: string, projectId: string): Promise { + public ProjectGrantByID(id: string, projectId: string): Promise { const req = new ProjectGrantID(); req.setId(id); req.setProjectId(projectId); return this.grpcService.mgmt.projectGrantByID(req); } - public async RemoveProject(id: string): Promise { + public RemoveProject(id: string): Promise { const req = new ProjectID(); req.setId(id); return this.grpcService.mgmt.removeProject(req); } - public async DeactivateProjectGrant(id: string, projectId: string): Promise { + public DeactivateProjectGrant(id: string, projectId: string): Promise { const req = new ProjectGrantID(); req.setId(id); req.setProjectId(projectId); return this.grpcService.mgmt.deactivateProjectGrant(req); } - public async ReactivateProjectGrant(id: string, projectId: string): Promise { + public ReactivateProjectGrant(id: string, projectId: string): Promise { const req = new ProjectGrantID(); req.setId(id); req.setProjectId(projectId); return this.grpcService.mgmt.reactivateProjectGrant(req); } - public async CreateOIDCApp(app: OIDCApplicationCreate.AsObject): Promise { + public CreateOIDCApp(app: OIDCApplicationCreate.AsObject): Promise { const req = new OIDCApplicationCreate(); req.setProjectId(app.projectId); req.setName(app.name); @@ -1245,7 +1253,7 @@ export class ManagementService { return this.grpcService.mgmt.createOIDCApplication(req); } - public async UpdateApplication(projectId: string, appId: string, name: string): Promise { + public UpdateApplication(projectId: string, appId: string, name: string): Promise { const req = new ApplicationUpdate(); req.setId(appId); req.setName(name); @@ -1253,7 +1261,7 @@ export class ManagementService { return this.grpcService.mgmt.updateApplication(req); } - public async UpdateOIDCAppConfig(projectId: string, + public UpdateOIDCAppConfig(projectId: string, appId: string, oidcConfig: OIDCConfig.AsObject): Promise { const req = new OIDCConfigUpdate(); req.setProjectId(projectId); @@ -1265,6 +1273,9 @@ export class ManagementService { req.setGrantTypesList(oidcConfig.grantTypesList); req.setApplicationType(oidcConfig.applicationType); req.setDevMode(oidcConfig.devMode); + req.setAccessTokenType(oidcConfig.accessTokenType); + req.setAccessTokenRoleAssertion(oidcConfig.accessTokenRoleAssertion); + req.setIdTokenRoleAssertion(oidcConfig.idTokenRoleAssertion); return this.grpcService.mgmt.updateApplicationOIDCConfig(req); } } diff --git a/console/src/app/services/refresh.service.ts b/console/src/app/services/refresh.service.ts index 4ca1975dc8..429b0f8e62 100644 --- a/console/src/app/services/refresh.service.ts +++ b/console/src/app/services/refresh.service.ts @@ -11,7 +11,6 @@ export class RefreshService { router.events .pipe(filter(event => event instanceof NavigationEnd)) .subscribe((event: Event | any) => { - console.log('prev:', event.url); this.moveInto(event.url); }); } diff --git a/console/src/app/services/seo.service.ts b/console/src/app/services/seo.service.ts new file mode 100644 index 0000000000..f9abb99c6a --- /dev/null +++ b/console/src/app/services/seo.service.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { Meta } from '@angular/platform-browser'; + +import { environment } from '../../environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class SeoService { + constructor(private meta: Meta) { } + + public generateTags(config: any): void { + // default values + config = { + title: 'ZITADEL Console', + description: 'Managementplatform for ZITADEL', + image: 'https://www.zitadel.ch/zitadel-social-preview25.png', + slug: '', + ...config, + }; + + this.meta.updateTag({ property: 'og:type', content: 'website' }); + this.meta.updateTag({ property: 'og:site_name', content: 'ZITADEL Console' }); + this.meta.updateTag({ property: 'og:title', content: config.title }); + this.meta.updateTag({ property: 'description', content: config.description }); + this.meta.updateTag({ property: 'og:description', content: config.description }); + if (config.image) { + this.meta.updateTag({ property: 'og:image', content: config.image }); + } + this.meta.updateTag({ property: 'og:url', content: `https://${environment.production ? 'console.zitadel.ch' : 'console.zitadel.dev'}/${config.slug}` }); + + this.meta.updateTag({ property: 'twitter:card', content: 'summary' }); + this.meta.updateTag({ property: 'og:site', content: '@zitadel_ch' }); + this.meta.updateTag({ property: 'og:title', content: config.title }); + this.meta.updateTag({ property: 'og:image', content: 'https://www.zitadel.ch/zitadel-social-preview25.png' }); + this.meta.updateTag({ property: 'og:description', content: config.description }); + } +} diff --git a/console/src/app/services/storage.service.ts b/console/src/app/services/storage.service.ts index af207f76e0..25d60901d7 100644 --- a/console/src/app/services/storage.service.ts +++ b/console/src/app/services/storage.service.ts @@ -1,11 +1,11 @@ import { Injectable } from '@angular/core'; import { OAuthStorage } from 'angular-oauth2-oidc'; +const STORAGE_PREFIX = 'zitadel'; @Injectable({ providedIn: 'root', }) - export class StorageService implements OAuthStorage { private storage: Storage = window.sessionStorage; @@ -28,7 +28,7 @@ export class StorageService implements OAuthStorage { } public getPrefixedKey(key: string): string { - return `caos:${key}`; + return `${STORAGE_PREFIX}:${key}`; } } diff --git a/console/src/app/services/toast.service.ts b/console/src/app/services/toast.service.ts index f38da0ecff..050998d99b 100644 --- a/console/src/app/services/toast.service.ts +++ b/console/src/app/services/toast.service.ts @@ -1,21 +1,16 @@ import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { TranslateService } from '@ngx-translate/core'; import { Observable } from 'rxjs'; import { take } from 'rxjs/operators'; -import { WarnDialogComponent } from '../modules/warn-dialog/warn-dialog.component'; -import { AuthenticationService } from './authentication.service'; - @Injectable({ providedIn: 'root', }) export class ToastService { - constructor(private dialog: MatDialog, + constructor( private snackBar: MatSnackBar, private translate: TranslateService, - private authService: AuthenticationService, ) { } public showInfo(message: string, i18nkey: boolean = false): void { @@ -23,38 +18,28 @@ export class ToastService { this.translate .get(message) .subscribe(data => { - this.showMessage(data, 'close'); + this.translate.get('ACTIONS.CLOSE').pipe(take(1)).subscribe(value => { + this.showMessage(data, value); + }); }); } else { - this.showMessage(message, 'close'); + this.translate.get('ACTIONS.CLOSE').pipe(take(1)).subscribe(value => { + this.showMessage(message, value); + }); } } public showError(grpcError: any): void { const { message, code, metadata } = grpcError; - // TODO: remove check for code === 7 - if (code === 16 || (code === 7 && message === 'invalid token')) { - const dialogRef = this.dialog.open(WarnDialogComponent, { - data: { - confirmKey: 'ACTIONS.LOGIN', - titleKey: 'ERRORS.TOKENINVALID.TITLE', - descriptionKey: 'ERRORS.TOKENINVALID.DESCRIPTION', - }, - width: '400px', + if (code !== 16) { + this.translate.get('ACTIONS.CLOSE').pipe(take(1)).subscribe(value => { + this.showMessage(decodeURI(message), value); }); - - dialogRef.afterClosed().pipe(take(1)).subscribe(resp => { - if (resp) { - this.authService.authenticate(undefined, true, true); - } - }); - } else { - this.showMessage(decodeURI(message), 'close', { duration: 3000 }); } } - private showMessage(message: string, action: string, config?: MatSnackBarConfig): Observable { - const ref = this.snackBar.open(message, action, config); + private showMessage(message: string, action: string): Observable { + const ref = this.snackBar.open(message, action, { duration: 4000 }); return ref.onAction(); } diff --git a/console/src/assets/i18n/de.json b/console/src/assets/i18n/de.json index 392c9ab113..f0e3faa537 100644 --- a/console/src/assets/i18n/de.json +++ b/console/src/assets/i18n/de.json @@ -35,7 +35,9 @@ "LOGOUT": "Alle Benutzer abmelden", "NEWORG":"Neue Organisation", "IAMADMIN":"Du bist ein IAM-Administrator. Beachte, dass Du erhöhte Rechte besitzt.", - "SHOWORGS":"Alle Organisationen anzeigen" + "SHOWORGS":"Alle Organisationen anzeigen", + "GRANTSECTION":"Berechtigungssektion", + "GRANTS":"Berechtigungen" }, "ACTIONS": { "SAVE": "Speichern", @@ -50,6 +52,7 @@ "INFO": "Info", "OK": "OK", "VIEW": "Öffnen", + "SELECTIONDELETE":"Ausgewählte löschen", "DELETE": "Löschen", "REMOVE":"Entfernen", "VERIFY":"Verifizieren", @@ -59,7 +62,9 @@ "DEACTIVATE":"Deaktivieren", "REFRESH":"Aktualisieren", "LOGIN":"Einloggen", - "EDIT":"Bearbeiten" + "EDIT":"Bearbeiten", + "PIN":"Anpinnen", + "CONFIGURE":"Konfigurieren" }, "ERRORS": { "REQUIRED": "Bitte fülle alle benötigten Felder aus.", @@ -86,7 +91,24 @@ "COPIED":"In die Zwischenablage kopiert.", "NOUSER":"Kein Benutzer", "REACTIVATE":"Reaktivieren", - "DEACTIVATE":"Deaktivieren" + "DEACTIVATE":"Deaktivieren", + "FILTER":"Filter", + "DELETE":"Benutzer löschen" + }, + "DIALOG": { + "DELETE_TITLE":"User löschen", + "DELETE_DESCRIPTION":"Sie sind im Begriff einen Benutzer endgültig zu löschen. Wollen Sie dies wirklich tun?" + }, + "TABLE":{ + "DEACTIVATE":"Deaktivieren", + "ACTIVATE":"Aktivieren", + "FILTER": { + "1":"Nach Username filtern", + "2":"Nach Vornamen filtern", + "3":"Nach Nachnamen filtern", + "5":"Nach Display Namen filtern", + "6":"Nach Email filtern" + } }, "MFA": { "TABLETYPE":"Typ", @@ -120,7 +142,11 @@ "IDPCONFIGID": "Idp Konfig ID", "IDPNAME": "Idp Name", "USERDISPLAYNAME": "Externer Name", - "EXTERNALUSERID": "Externe Benutzer ID" + "EXTERNALUSERID": "Externe Benutzer ID", + "DIALOG": { + "REMOVE_TITLE":"Idp entfernen", + "REMOVE_DESCRIPTION":"Sie sind im Begriff einen Identity Provider zu entfernen. Wollen Sie dies wirklich tun?" + } }, "CREATE": { "TITLE": "Neuen Benutzer erstellen", @@ -199,6 +225,7 @@ }, "EMAIL": "E-Mail", "PHONE": "Telefonnummer", + "PREFERRED_LOGINNAME":"Bevorzugter Loginname", "LOGINMETHODS": { "TITLE": "Kontaktinformationen", "DESCRIPTION": "Die Kontaktinformationen werden benötigt, um Dir wichtige Informationen wie Verifikationsnachrichten und Links für das Zurücksetzen des Passworts per E-Mail zu senden.", @@ -270,7 +297,8 @@ "SELECTEDDEACTIVATED":"Selektierte Benutzer deaktiviert.", "SELECTEDKEYSDELETED":"Selektierte Schlüssel gelöscht.", "KEYADDED":"Schlüssel hinzugefügt!", - "MACHINEADDED":"Service User erstellt!" + "MACHINEADDED":"Service User erstellt!", + "DELETED":"Benutzer erfolgreich gelöscht!" }, "MEMBERSHIPS": { "TITLE":"ZITADEL Manager-Rollen", @@ -305,7 +333,12 @@ "SEQUENCE":"Sequenz", "TIMESTAMP":"Zeitstempel", "ACTIONS":"Aktionen", - "CLEAR":"Aufräumen" + "CLEAR":"Aufräumen", + "CLEARED":"View wurde erfolgreich zurückgesetzt!", + "DIALOG": { + "VIEW_CLEAR_TITLE": "View zurücksetzen?", + "VIEW_CLEAR_DESCRIPTION":"Sie sind im Begriff eine View zu löschen. Durch das Löschen einer View wird ein Prozess gestartet, bei dem Daten für Endbenutzer möglicherweise nicht oder verzügert verfügbar sind. Sind Sie sicher?" + } }, "FAILEDEVENTS": { "TITLE":"Gescheiterte Events", @@ -332,19 +365,31 @@ }, "ORG": { "PAGES": { + "NAME":"Name", + "ID":"ID", + "FILTER":"Filter", + "FILTERPLACEHOLDER":"Filtern Sie nach dem Namen", "LIST": "Organisationen", "LISTDESCRIPTION":"Wähle eine Organisation aus.", "ACTIVE":"Aktiv", "CREATE":"Organisation erstellen", "ORGDETAIL_TITLE":"Gebe den Namen und die Domain für die neue Organisation ein.", - "ORGDOMAIN_TITLE":"Verifikation der Domain der Organisation", - "ORGDOMAIN_VERIFICATION":"Überprüfe den Besitz Deiner Domain, indem Du eine Bestätigungsdatei herunterlädst und unter der angegebenen URL speicherst, oder indem Du sie mit einem DNS-Eintrag verifizierst.", - "ORGDOMAIN_VERIFICATION_SKIP":"Du kannst die Überprüfung vorerst überspringen und Deine Organisation erstellen. Um Deine Organisation jedoch verwenden zu können, muss dieser Schritt abgeschlossen sein.", "ORGDETAILUSER_TITLE":"Organisationsbesitzer hinzufügen", - "ORGDOMAIN_VERIFICATION_VALIDATION_DESC":"Die Tokens werden regelmässig überprüft, um sicherzustellen, dass Du weiterhin im Besitz der Domain bist.", - "ORGDOMAIN_VERIFICATION_NEWTOKEN_TITLE":"Neues Token anfordern", - "ORGDOMAIN_VERIFICATION_NEWTOKEN_DESC":"Wenn Du ein neues Token anfordern willst, klicke auf die gewünschte Methode. Wenn Du ein vorhandenes Token validieren möchtest, klicke auf \"Validieren\".", - "ORGDOMAIN_VERIFICATION_VALIDATION_ONGOING":"Ein Token zur Validierung wurde bereits angefragt. Klicke auf \"Validieren\", um dieses Token zu validieren.", + "ORGDOMAIN": { + "TITLE":"Verifikation der Domain der Organisation", + "VERIFICATION":"Überprüfe den Besitz Deiner Domain, indem Du eine Bestätigungsdatei herunterlädst und unter der angegebenen URL speicherst, oder indem Du sie mit einem DNS-Eintrag verifizierst.", + "VERIFICATION_SKIP":"Du kannst die Überprüfung vorerst überspringen und Deine Organisation erstellen. Um Deine Organisation jedoch verwenden zu können, muss dieser Schritt abgeschlossen sein.", + "VERIFICATION_VALIDATION_DESC":"Die Tokens werden regelmässig überprüft, um sicherzustellen, dass Du weiterhin im Besitz der Domain bist.", + "VERIFICATION_NEWTOKEN_TITLE":"Neues Token anfordern", + "VERIFICATION_NEWTOKEN_DESC":"Wenn Du ein neues Token anfordern willst, klicke auf die gewünschte Methode. Wenn Du ein vorhandenes Token validieren möchtest, klicke auf \"Verifizieren\".", + "VERIFICATION_VALIDATION_ONGOING":"Ein Token zur Validierung wurde bereits angefragt. Klicke auf \"Verifizieren\", um dieses Token zu validieren.", + "VERIFICATION_VALIDATION_ONGOING_TYPE":"Typ des Tokens:", + "REQUESTNEWTOKEN":"Neues Token anfordern", + "TYPES": { + "1":"HTTP", + "2":"DNS" + } + }, "DOWNLOAD_FILE":"Datei herunterladen", "SELECTORGTOOLTIP":"Diese Organisation auswählen", "PRIMARYDOMAIN":"Primäre Domain", @@ -374,63 +419,6 @@ "TITLE":"Manager der Organisation verwalten", "DESCRIPTION":"Definiere hier die Benutzer, die Operationen auf Deinen Organisationen vornehmen dürfen." }, - "POLICY": { - "TITLE":"Richtlinen entdecken", - "DESCRIPTION":"Vorgefertigte Richtlinien, die Dir Zeit sparen und die Sicherheit erhöhen.", - "PWD_COMPLEXITY": { - "TITLE":"Passwortkomplexität", - "DESCRIPTION":"Stellt sicher, dass alle festgelegten Passwörter einem bestimmten Muster entsprechen.", - "TITLECREATE":"Passwortkomplexitätsrichtlinie erstellen", - "DESCRIPTIONCREATE":"Stellt sicher, dass alle festgelegten Passwörter einem bestimmten Muster entsprechen.", - "SYMBOLANDNUMBERERROR":"Das Password muss ein Symbol/Satzzeichen und eine Ziffer beinhalten.", - "SYMBOLERROR":"Das Password muss ein Symbol/Satzzeichen beinhalten.", - "NUMBERERROR":"Das Password muss eine Ziffer beinhalten.", - "PATTERNERROR":"Das Passwort erfüllt nicht die vorgeschriebene Richtlinie." - }, - "PWD_AGE": { - "TITLE":"Gültigkeitsdauer für Passwörter", - "DESCRIPTION":"Du kannst eine Richtlinie für die maximale Gültigkeitsdauer von Passwörtern festlegen. Diese Richtlinie löst eine Warnung nach Ablauf einer festgelegten Gültigkeitsdauer aus.", - "TITLECREATE":"Richtlinie für Gültigkeitsdauer von Passwörtern festlegen", - "DESCRIPTIONCREATE":"Du kannst eine Richtlinie für die Gültigkeitsdauer von Passwörtern festlegen. Diese Richtlinie löst eine Warnung nach Ablauf einer festgelegten Gültigkeitsdauer aus." - }, - "PWD_LOCKOUT": { - "TITLE":"Passwortsperre", - "DESCRIPTION":"Standardmässig sind die Passwortwiederholungen bei Falscheingabe nicht begrenzt. Du musst diese Richtlinie installieren, wenn Du Wiederholungsversuche anzeigen, oder eine maximale Anzahl von wiederholten Passworteingaben festlegen möchtest.", - "TITLECREATE":"Richtline zur Passwortsperre festlegen", - "DESCRIPTIONCREATE":"Standardmässig sind die Passwortwiederholungen bei Falscheingabe nicht begrenzt. Du musst diese Richtlinie anwenden, wenn Du Wiederholungsversuche anzeigen, oder eine maximale Anzahl von wiederholten Passworteingaben festlegen möchtest." - }, - "IAM_POLICY": { - "TITLE":"Zugangseinstellungen IAM", - "DESCRIPTION":"Definiere die Zugangseistellungen für Benutzer.", - "TITLECREATE":"Zugangseinstellungen für IAM festlegen", - "DESCRIPTIONCREATE":"E-Mails als Benutzernamen sind nicht erlaubt, wenn die Eigenschaft \"UserLoginMustBeDomain\" gesetzt ist." - }, - "LOGIN_POLICY": { - "TITLE":"Login Richtlinien", - "DESCRIPTION":"Definiere die Loginmethoden für Benutzer", - "TITLECREATE":"Definiere die Loginmethoden für Benutzer", - "DESCRIPTIONCREATE":"Nutzer können Sich mit den verfügbaren Idps authentifizieren." - }, - "BTN_INSTALL":"Installieren", - "BTN_EDIT":"Modifizieren", - "DATA": { - "DESCRIPTION":"Beschreibung", - "MINLENGTH":"Mindestlänge", - "HASNUMBER": "erfordert Ziffer", - "HASSYMBOL": "erfordert Symbol/Satzzeichen", - "HASLOWERCASE": "erfordert Kleinbuchstaben", - "HASUPPERCASE": "erfordert Grossbuchstaben", - "SHOWLOCKOUTFAILURES":"Zeige Anzahl Anmeldeversuche", - "MAXATTEMPTS":"Maximale Anzahl an Versuchen", - "EXPIREWARNDAYS":"Ablauf Warnung nach Tagen", - "MAXAGEDAYS":"Maximale Gültigkeit in Tagen", - "USERLOGINMUSTBEDOMAIN":"Benutzer-Login muss eine Domain sein", - "ALLOWUSERNAMEPASSWORD":"Benutzername Password erlaubt", - "ALLOWEXTERNALIDP":"Externer IDP erlaubt", - "ALLOWREGISTER":"Registrieren erlaubt" - }, - "DELETE":"Richtlinie entfernen/zurücksetzen" - }, "TOAST": { "DEACTIVATED":"Organisation deaktiviert.", "REACTIVATED":"Organisation reaktiviert.", @@ -442,6 +430,72 @@ "SETPRIMARY":"Primäre Domain gesetzt." } }, + "POLICY": { + "TITLE":"Richtlinen entdecken", + "DESCRIPTION":"Vorgefertigte Richtlinien, die Dir Zeit sparen und die Sicherheit erhöhen.", + "PWD_COMPLEXITY": { + "TITLE":"Passwortkomplexität", + "DESCRIPTION":"Stellt sicher, dass alle festgelegten Passwörter einem bestimmten Muster entsprechen.", + "SYMBOLANDNUMBERERROR":"Das Password muss ein Symbol/Satzzeichen und eine Ziffer beinhalten.", + "SYMBOLERROR":"Das Password muss ein Symbol/Satzzeichen beinhalten.", + "NUMBERERROR":"Das Password muss eine Ziffer beinhalten.", + "PATTERNERROR":"Das Passwort erfüllt nicht die vorgeschriebene Richtlinie." + }, + "PWD_AGE": { + "TITLE":"Gültigkeitsdauer für Passwörter", + "DESCRIPTION":"Du kannst eine Richtlinie für die maximale Gültigkeitsdauer von Passwörtern festlegen. Diese Richtlinie löst eine Warnung nach Ablauf einer festgelegten Gültigkeitsdauer aus." + }, + "PWD_LOCKOUT": { + "TITLE":"Passwortsperre", + "DESCRIPTION":"Standardmässig sind die Passwortwiederholungen bei Falscheingabe nicht begrenzt. Du musst diese Richtlinie installieren, wenn Du Wiederholungsversuche anzeigen, oder eine maximale Anzahl von wiederholten Passworteingaben festlegen möchtest." + }, + "IAM_POLICY": { + "TITLE":"Zugangseinstellungen IAM", + "DESCRIPTION":"Definiere die Zugangseistellungen für Benutzer." + }, + "LOGIN_POLICY": { + "TITLE":"Login Richtlinien", + "DESCRIPTION":"Definiere die Loginmethoden für Benutzer", + "DESCRIPTIONCREATEADMIN":"Nutzer können sich mit den verfügbaren Idps authentifizieren.", + "DESCRIPTIONCREATEMGMT":"Nutzer können sich mit den verfügbaren Idps authentifizieren. Achtung: Es kann zwischen System- und organisationsspezifischen Providern gewählt werden.", + "SAVED":"Erfolgreich gespeichert." + }, + "LABEL": { + "TITLE":"Email Labelling Einstellungen", + "DESCRIPTION":"Definieren Sie das Erscheinungsbild Ihrer Benachrichtigungs-Mails", + "PRIMARYCOLOR":"Hintergrundfarbe", + "SECONDARYCOLOR":"Schriftfarbe", + "SAVED":"Erfolgreich gespeichert." + }, + "DEFAULTLABEL":"Die aktuelle Richtlinie entspricht der IAM-Standard Einstellung.", + "BTN_INSTALL":"Installieren", + "BTN_EDIT":"Modifizieren", + "DATA": { + "DESCRIPTION":"Beschreibung", + "MINLENGTH":"Mindestlänge", + "HASNUMBER": "erfordert Ziffer", + "HASSYMBOL": "erfordert Symbol/Satzzeichen", + "HASLOWERCASE": "erfordert Kleinbuchstaben", + "HASUPPERCASE": "erfordert Grossbuchstaben", + "SHOWLOCKOUTFAILURES":"Zeige Anzahl Anmeldeversuche", + "MAXATTEMPTS":"Maximale Anzahl an Versuchen", + "EXPIREWARNDAYS":"Ablauf Warnung nach Tagen", + "MAXAGEDAYS":"Maximale Gültigkeit in Tagen", + "USERLOGINMUSTBEDOMAIN":"Benutzer-Login muss eine Domain sein", + "ALLOWUSERNAMEPASSWORD":"Benutzername Password erlaubt", + "ALLOWEXTERNALIDP":"Externer IDP erlaubt", + "ALLOWREGISTER":"Registrieren erlaubt", + "ALLOWUSERNAMEPASSWORD_DESC":"Der konventionelle Login mit Benutzername und Passwort wird erlaubt.", + "ALLOWEXTERNALIDP_DESC":"Der Login wird für die darunter liegenden Identity Provider erlaubt.", + "ALLOWREGISTER_DESC":"Ist die Option gewählt, erscheint im Login ein zusätzlicher Schritt zum Registrieren eines Benutzers." + }, + "RESET":"Richtlinie zurücksetzen", + "CREATECUSTOM":"Benutzerdefinierte Richtlinie erstellen", + "TOAST":{ + "SET":"Richtline erfolgreich gesetzt!", + "RESETSUCCESS":"Richtline zurückgesetzt!" + } + }, "ORG_DETAIL": { "TITLE": "Organisation", "DESCRIPTION": "Hier kannst Du Deine Konfiguration der Organisation bearbeiten und Mitglieder verwalten.", @@ -460,6 +514,7 @@ "USERNAME": "Benutzername", "FIRSTNAME": "Vorname", "LASTNAME": "Nachname", + "LOGINNAME":"Loginname", "EMAIL": "E-Mail", "ROLES": "Rollen", "ADD": "Mitglied hinzufügen", @@ -601,7 +656,12 @@ "EDITDESCRIPTION": "Gebe die Daten für die zu ändernde Rolle ein.", "DELETE":"Rolle löschen", "CREATIONDATE":"Erstelldatum", - "SELECTGROUPTOOLTIP":"Wähle alle Rollen der Gruppe {{group}} aus." + "SELECTGROUPTOOLTIP":"Wähle alle Rollen der Gruppe {{group}} aus.", + "OPTIONS":"Optionen", + "ASSERTION":"Rollen bei Authentisierung mitschicken", + "ASSERTION_DESCRIPTION":"Rolleninformationen werden der Authentisierung per Token, UserInfo Endpoint oder anderen Methoden bereitgestellt, die in Applikationseinstellungen definiert sind.", + "CHECK":"Rollen bei Authentisierung prüfen", + "CHECK_DESCRIPTION":"Ist das Attribut gesetzt, kann ein Benutzer nur mit einem entsprechenden Rolle authentifiziert werden." }, "TABLE": { "TOTAL": "Einträge gesamt:", @@ -642,9 +702,10 @@ }, "DETAIL": { "TITLE":"Identitäts Provider", - "DESCRIPTION":"Konfiguration deines Identitäts Providers", + "DESCRIPTION":"Generelle Konfiguration deines Identitäts Providers", "OIDC": { - "TITLE": "OIDC Konfiguration" + "TITLE": "OIDC Konfiguration", + "DESCRIPTION":"Geben Sie die korrekte OIDC Konfiguration Ihres Identity Providers an!" } }, "TYPES": { @@ -656,16 +717,20 @@ "1":"aktiv", "2":"inaktiv" }, - "MAPPINTFIELD": { + "MAPPINGFIELD": { "1": "Preferred Username", "2": "Email" }, + "STYLE":"Style", + "STYLEFIELD": { + "0": "kein Styling", + "1": "Google" + }, "TYPE":"Typ", "ID": "ID", "NAME":"Name", "CONFIG":"Konfiguration", "STATE":"Status", - "LOGOSRC":"Logo Src", "ISSUER":"Issuer", "SCOPESLIST":"Scopes List", "CLIENTID":"Client ID", @@ -677,8 +742,18 @@ "DEACTIVATE":"Deaktivieren", "ACTIVATE":"Aktivieren", "DELETE":"Löschen", + "DELETE_TITLE":"Idp löschen", + "DELETE_DESCRIPTION":"Sie sind im Begriff einen Identity Provider zu löschen. Die daruch hervorgerufenen Änderungen sind unwiederruflich. Wollen Sie dies wirklich tun?", + "DELETE_SELECTION_TITLE":"Identity Providers löschen", + "DELETE_SELECTION_DESCRIPTION":"Sie sind im Begriff mehrere Identity Provider zu löschen. Die daruch hervorgerufenen Änderungen sind unwiederruflich. Wollen Sie dies wirklich tun?", "TOAST": { - "SAVED": "Erfolgreich gespeichert." + "SAVED": "Erfolgreich gespeichert.", + "REACTIVATED":"Idp reaktiviert.", + "DEACTIVATED":"Idp deaktiviert.", + "SELECTEDREACTIVATED":"Selektierte Idps reaktiviert.", + "SELECTEDDEACTIVATED":"Selektierte Idps deaktiviert.", + "SELECTEDKEYSDELETED":"Selektierte Idps gelöscht.", + "DELETED":"Idp erfolgreich gelöscht!" } }, "LOGINPOLICY": { @@ -714,6 +789,8 @@ "TYPE":"Anwendungstyp", "GRANT":"Berechtigungstypen", "OIDC": { + "TOKENSECTIONTITLE":"AuthToken Optionen", + "REDIRECTSECTIONTITLE":"Weiterleitungseinstellungen", "PROSWITCH":"Konfigurator überspringen", "NAMEANDTYPESECTION":"Name und Typ", "TITLEFIRST":"Gebe zuerst einen Namen ein.", @@ -754,9 +831,16 @@ "AUTHMETHOD0":"Basic", "AUTHMETHOD1":"Post", "AUTHMETHOD2":"None", + "TOKENTYPE":"Auth Token Typ", + "TOKENTYPE0": "Bearer Token", + "TOKENTYPE1": "JWT", "UNSECUREREDIRECT":"Ich hoffe, Du weisst, was Du tust.", "OVERVIEWSECTION":"Übersicht", - "OVERVIEWTITLE":"Deine Konfiguration ist bereit. Du kannst sie hier nochmals prüfen." + "OVERVIEWTITLE":"Deine Konfiguration ist bereit. Du kannst sie hier nochmals prüfen.", + "ACCESSTOKENROLEASSERTION":"Benutzerrollen dem Access Token hinzufügen", + "ACCESSTOKENROLEASSERTION_DESCRIPTION":"Bei Auswahl werden dem Access Token die Rollen des Authentifizierten Benutzers hinzugefügt.", + "IDTOKENROLEASSERTION":"Benutzerrollen dem Id Token hinzufügen", + "IDTOKENROLEASSERTION_DESCRIPTION":"Bei Auswahl werden dem Id Token die Rollen des Authentifizierten Benutzers hinzugefügt." }, "TOAST": { "REACTIVATED":"Anwendung reaktiviert.", @@ -788,6 +872,8 @@ }, "ROLESLABEL":"Rollen", "GRANTS": { + "TITLE":"Berechtigungen", + "DESC":"Hier kannst Du die Berechtigungen Deiner Organisation verwalten.", "DELETE":"Berechtigung löschen", "ADD":"Berechtigung erstellen", "ADD_BTN":"Neu", diff --git a/console/src/assets/i18n/en.json b/console/src/assets/i18n/en.json index 29f7e3ec18..75276cae37 100644 --- a/console/src/assets/i18n/en.json +++ b/console/src/assets/i18n/en.json @@ -35,7 +35,9 @@ "LOGOUT": "Logout All Users", "NEWORG":"New Organisation", "IAMADMIN":"You are an IAM Administrator. Note that you have extended permissions.", - "SHOWORGS":"Show All Organisations" + "SHOWORGS":"Show All Organisations", + "GRANTSECTION":"Authorization Section", + "GRANTS":"Authorizations" }, "ACTIONS": { "SAVE": "Save", @@ -50,6 +52,7 @@ "INFO": "Info", "OK": "OK", "VIEW": "Show", + "SELECTIONDELETE":"Delete selection", "DELETE": "Delete", "REMOVE":"Remove", "VERIFY":"Verify", @@ -59,7 +62,9 @@ "DEACTIVATE":"Deactivate", "REFRESH":"Refresh", "LOGIN":"Login", - "EDIT":"Edit" + "EDIT":"Edit", + "PIN":"Pin / Unpin", + "CONFIGURE":"Configure" }, "ERRORS": { "REQUIRED": "Some required fields are missing.", @@ -86,7 +91,24 @@ "COPIED":"Copied to clipboard.", "NOUSER":"No associated users.", "REACTIVATE":"Reactivate", - "DEACTIVATE":"Deactivate" + "DEACTIVATE":"Deactivate", + "FILTER":"Filter", + "DELETE":"Delete User" + }, + "DIALOG": { + "DELETE_TITLE":"Delete User", + "DELETE_DESCRIPTION":"You are about to permanently delete a user. Are you sure?" + }, + "TABLE":{ + "DEACTIVATE":"Deactivate", + "ACTIVATE":"Activate", + "FILTER": { + "1":"Filter for Username", + "2":"filter for Firstname", + "3":"filter for Lastname", + "5":"filter for DisplayName", + "6":"filter for email" + } }, "MFA": { "TABLETYPE":"Type", @@ -120,7 +142,11 @@ "IDPCONFIGID": "Idp Config ID", "IDPNAME": "Idp Name", "USERDISPLAYNAME": "External Name", - "EXTERNALUSERID": "External User ID" + "EXTERNALUSERID": "External User ID", + "DIALOG": { + "REMOVE_TITLE":"Remove IDP", + "REMOVE_DESCRIPTION":"You are about to delete an Identity Provider from a user. Do you really want to continue?" + } }, "CREATE": { "TITLE": "Create a New User", @@ -199,6 +225,7 @@ }, "EMAIL": "E-mail", "PHONE": "Phone Number", + "PREFERRED_LOGINNAME":"Preferred Loginname", "LOGINMETHODS": { "TITLE": "Contact Information", "DESCRIPTION": "The provided information is used to send important information, like password reset e-mails to you.", @@ -270,7 +297,8 @@ "SELECTEDDEACTIVATED":"Selected users deactivated.", "SELECTEDKEYSDELETED":"Selected keys deleted.", "KEYADDED":"Key added!", - "MACHINEADDED":"Service User created!" + "MACHINEADDED":"Service User created!", + "DELETED":"User deleted successfully!" }, "MEMBERSHIPS": { "TITLE":"ZITADEL Manager Roles", @@ -305,7 +333,12 @@ "SEQUENCE":"Sequence", "TIMESTAMP":"Timestamp", "ACTIONS":"Actions", - "CLEAR":"Clear" + "CLEAR":"Clear", + "CLEARED":"View was successfully cleared!", + "DIALOG": { + "VIEW_CLEAR_TITLE": "Clear View", + "VIEW_CLEAR_DESCRIPTION":"You are about to clear a view. Clearing a view creates a process during which data is possibly not available for endusers. Are you really sure?" + } }, "FAILEDEVENTS": { "TITLE":"Failed Events", @@ -332,19 +365,31 @@ }, "ORG": { "PAGES": { + "NAME":"Name", + "ID":"ID", + "FILTER":"Filter", + "FILTERPLACEHOLDER":"Filter for the name", "LIST": "Organisations", "LISTDESCRIPTION":"Choose an organisation.", "ACTIVE":"Active", "CREATE":"Create Organisation", "ORGDETAIL_TITLE":"Enter the name and domain of your new organisation.", - "ORGDOMAIN_TITLE":"Organisation Domain Ownership Verification", - "ORGDOMAIN_VERIFICATION":"Verify the ownership of your domain. You need to download a verification file and upload it at the provided URL listed below, or place a TXT Record DNS entry for the provided URL. To complete, click the button to verify.", - "ORGDOMAIN_VERIFICATION_SKIP":"You can skip verification for now and continue to create your organisation, but in order to use your organisation this step has to be completed!", "ORGDETAILUSER_TITLE":"Configure Organisation Owner", - "ORGDOMAIN_VERIFICATION_VALIDATION_DESC":"The tokens are checked regularly to ensure you are still owner of the domain.", - "ORGDOMAIN_VERIFICATION_NEWTOKEN_TITLE":"Request New Token", - "ORGDOMAIN_VERIFICATION_NEWTOKEN_DESC":"If you want to request a new token, select you preferred method. If you want to validate a persisting token, click the button above.", - "ORGDOMAIN_VERIFICATION_VALIDATION_ONGOING":"A verification token has already been requested. Click on the button to trigger a verification check.", + "ORGDOMAIN": { + "TITLE":"Organisation Domain Ownership Verification", + "VERIFICATION":"Verify the ownership of your domain. You need to download a verification file and upload it at the provided URL listed below, or place a TXT Record DNS entry for the provided URL. To complete, click the button to verify.", + "VERIFICATION_SKIP":"You can skip verification for now and continue to create your organisation, but in order to use your organisation this step has to be completed!", + "VERIFICATION_VALIDATION_DESC":"The tokens are checked regularly to ensure you are still owner of the domain.", + "VERIFICATION_NEWTOKEN_TITLE":"Request New Token", + "VERIFICATION_NEWTOKEN_DESC":"If you want to request a new token, select you preferred method. If you want to validate a persisting token, click the button above.", + "VERIFICATION_VALIDATION_ONGOING":"A verification token has already been requested. Click on the button to trigger a verification check.", + "VERIFICATION_VALIDATION_ONGOING_TYPE":"Type of the token:", + "REQUESTNEWTOKEN":"Request new Token", + "TYPES": { + "1":"HTTP", + "2":"DNS" + } + }, "DOWNLOAD_FILE":"Download File", "SELECTORGTOOLTIP":"Select this organisation.", "PRIMARYDOMAIN":"Primary Domain", @@ -374,63 +419,6 @@ "TITLE":"Organisation Managers", "DESCRIPTION":"Define the users who can change your organisations preferences." }, - "POLICY": { - "TITLE":"Explore Policies", - "DESCRIPTION":"Pre-packaged policies that enhance your security.", - "PWD_COMPLEXITY": { - "TITLE":"Password Complexity", - "DESCRIPTION":"Ensures that all set passwords correspond to a specific pattern", - "TITLECREATE":"Create Password Complexity Policy", - "DESCRIPTIONCREATE":"Ensures that all set passwords correspond to a specific pattern", - "SYMBOLANDNUMBERERROR":"The password must consist of a digit and a symbol/punctuation mark.", - "SYMBOLERROR":"The password must include a symbol/punctuation mark.", - "NUMBERERROR":"The password must include a digit.", - "PATTERNERROR":"The password does not meet the required pattern." - }, - "PWD_AGE": { - "TITLE":"Password Aging", - "DESCRIPTION":"You can set a policy for the aging of passwords. This policy emits a warning after the specific aging time has elapsed.", - "TITLECREATE":"Create Password Aging Policy", - "DESCRIPTIONCREATE":"You can set a policy for the aging of passwords. This policy emits a warning after the specific aging time has elapsed." - }, - "PWD_LOCKOUT": { - "TITLE":"Password Lockout", - "DESCRIPTION":"Password retries are infinite in default mode. You have to apply this policy if you want to show the number of retries, or set a maximum number of retries after which the account will be blocked.", - "TITLECREATE":"Create Password Lockout Policy", - "DESCRIPTIONCREATE":"Password retries are infinite in default mode. You have to apply this policy if you want to show the number of retries, or set a maximum number of retries after which the account will be blocked." - }, - "IAM_POLICY": { - "TITLE":"IAM Access Preferences", - "DESCRIPTION":"Define access properties of your users.", - "TITLECREATE":"Set IAM Access Preferences", - "DESCRIPTIONCREATE":"If the property \"UserLoginMustBeDomain\" is enabled an e-mail address cannot be used as a user name." - }, - "LOGIN_POLICY": { - "TITLE":"Login Policy", - "DESCRIPTION":"Define how Users can be authenticated", - "TITLECREATE":"Define how Users can be authenticated", - "DESCRIPTIONCREATE":"Users can choose from all of the available identity providers." - }, - "BTN_INSTALL":"Setup", - "BTN_EDIT":"Modify", - "DATA": { - "DESCRIPTION":"Description", - "MINLENGTH":"minimum length", - "HASNUMBER": "has number", - "HASSYMBOL": "has symbol", - "HASLOWERCASE": "has lowercase", - "HASUPPERCASE": "has uppercase", - "SHOWLOCKOUTFAILURES":"show lockout failures", - "MAXATTEMPTS":"Max Attempts", - "EXPIREWARNDAYS":"Expiration Warning after day", - "MAXAGEDAYS":"Max Age in days", - "USERLOGINMUSTBEDOMAIN":"User Login must be Domain", - "ALLOWUSERNAMEPASSWORD":"Username Password allowed", - "ALLOWEXTERNALIDP":"External IDP allowed", - "ALLOWREGISTER":"Register allowed" - }, - "DELETE":"Uninstall/Reset Policy" - }, "TOAST": { "DEACTIVATED":"Organisation deactivated.", "REACTIVATED":"Organisation reactivated.", @@ -442,6 +430,72 @@ "SETPRIMARY":"Primary domain set." } }, + "POLICY": { + "TITLE":"Explore Policies", + "DESCRIPTION":"Pre-packaged policies that enhance your security.", + "PWD_COMPLEXITY": { + "TITLE":"Password Complexity", + "DESCRIPTION":"Ensures that all set passwords correspond to a specific pattern", + "SYMBOLANDNUMBERERROR":"The password must consist of a digit and a symbol/punctuation mark.", + "SYMBOLERROR":"The password must include a symbol/punctuation mark.", + "NUMBERERROR":"The password must include a digit.", + "PATTERNERROR":"The password does not meet the required pattern." + }, + "PWD_AGE": { + "TITLE":"Password Aging", + "DESCRIPTION":"You can set a policy for the aging of passwords. This policy emits a warning after the specific aging time has elapsed." + }, + "PWD_LOCKOUT": { + "TITLE":"Password Lockout", + "DESCRIPTION":"Password retries are infinite in default mode. You have to apply this policy if you want to show the number of retries, or set a maximum number of retries after which the account will be blocked." + }, + "IAM_POLICY": { + "TITLE":"IAM Access Preferences", + "DESCRIPTION":"Define access properties of your users." + }, + "LOGIN_POLICY": { + "TITLE":"Login Policy", + "DESCRIPTION":"Define how Users can be authenticated", + "DESCRIPTIONCREATEADMIN":"Users can choose from the available identity providers below.", + "DESCRIPTIONCREATEMGMT":"Users can choose from the available identity providers below. Note: You can use System-set providers as well as providers set for your organisation only.", + "SAVED":"Saved successfully!" + }, + "LABEL": { + "TITLE":"Email Labelling Settings", + "DESCRIPTION":"Change the look of your emails.", + "PRIMARYCOLOR":"Background color", + "SECONDARYCOLOR":"Font color", + "SAVED":"Saved successfully" + }, + "DEFAULTLABEL":"The currently set guideline corresponds to the standard setting set by the IAM Administrator.", + "BTN_INSTALL":"Setup", + "BTN_EDIT":"Modify", + "DATA": { + "DESCRIPTION":"Description", + "MINLENGTH":"minimum length", + "HASNUMBER": "has number", + "HASSYMBOL": "has symbol", + "HASLOWERCASE": "has lowercase", + "HASUPPERCASE": "has uppercase", + "SHOWLOCKOUTFAILURES":"show lockout failures", + "MAXATTEMPTS":"Max Attempts", + "EXPIREWARNDAYS":"Expiration Warning after day", + "MAXAGEDAYS":"Max Age in days", + "USERLOGINMUSTBEDOMAIN":"User Login must be Domain", + "ALLOWUSERNAMEPASSWORD":"Username Password allowed", + "ALLOWEXTERNALIDP":"External IDP allowed", + "ALLOWREGISTER":"Register allowed", + "ALLOWUSERNAMEPASSWORD_DESC":"The conventional login with user name and password is allowed.", + "ALLOWEXTERNALIDP_DESC":"The login is allowed for the underlying identity providers", + "ALLOWREGISTER_DESC":"If the option is selected, an additional step for registering a user appears in the login." + }, + "RESET":"Reset Policy", + "CREATECUSTOM":"Create Custom Policy", + "TOAST":{ + "SET":"Policy set successfully!", + "RESETSUCCESS":"Policy reset successfully!" + } + }, "ORG_DETAIL": { "TITLE": "Organisation", "DESCRIPTION": "Here you can edit the configuration of your organisation and manage the members.", @@ -460,6 +514,7 @@ "USERNAME": "User Name", "FIRSTNAME": "First Name", "LASTNAME": "Last Name", + "LOGINNAME":"Login Name", "EMAIL": "E-mail", "ROLES": "Roles", "ADD": "Add Member", @@ -601,7 +656,12 @@ "EDITDESCRIPTION": "Enter the new data for the role.", "DELETE":"Delete Role", "CREATIONDATE":"Created", - "SELECTGROUPTOOLTIP":"Select all Roles of the group {{group}}." + "SELECTGROUPTOOLTIP":"Select all Roles of the group {{group}}.", + "OPTIONS":"Options", + "ASSERTION":"Assert Roles on Authentication.", + "ASSERTION_DESCRIPTION":"Roleinformation is sent as Token, Userinfo endpoint or other type, depending on your application settings.", + "CHECK":"Check roles on Authentication", + "CHECK_DESCRIPTION":"If set, users are only allowed to authenticate if any role is assigned to their account." }, "TABLE": { "TOTAL": "Entries total:", @@ -642,9 +702,10 @@ }, "DETAIL": { "TITLE":"Identity Provider", - "DESCRIPTION":"Configuration of your identity provider.", + "DESCRIPTION":"General Configuration of your identity provider.", "OIDC": { - "TITLE": "OIDC Configuration" + "TITLE": "OIDC Configuration", + "DESCRIPTION":"Provide the correct OIDC Configuration for your identity Provider below!" } }, "TYPES": { @@ -660,12 +721,16 @@ "1": "Preferred Username", "2": "Email" }, + "STYLE":"Style", + "STYLEFIELD": { + "0": "No Styling", + "1": "Google" + }, "TYPE":"Type", "ID": "ID", "NAME":"Name", "CONFIG":"Configuration", "STATE":"State", - "LOGOSRC":"Logo Src", "ISSUER":"Issuer", "SCOPESLIST":"Scopes List", "CLIENTID":"Client ID", @@ -677,8 +742,18 @@ "DEACTIVATE":"Deactivate", "ACTIVATE":"Activate", "DELETE":"Delete", + "DELETE_TITLE":"Delete Idp", + "DELETE_DESCRIPTION":"You are about to delete an identity provider. The resulting changes are irrevocable. Do you really want to do this?", + "DELETE_SELECTION_TITLE":"Delete Idp", + "DELETE_SELECTION_DESCRIPTION":"You are about to delete an identity provider. The resulting changes are irrevocable. Do you really want to do this?", "TOAST": { - "SAVED": "Successfully saved." + "SAVED": "Successfully saved.", + "REACTIVATED":"Idp reactivated.", + "DEACTIVATED":"Idp deactivated.", + "SELECTEDREACTIVATED":"Selected idps reactivated.", + "SELECTEDDEACTIVATED":"Selected idps deactivated.", + "SELECTEDKEYSDELETED":"Selected idps deleted.", + "DELETED":"Idp removed successfully!" } }, "LOGINPOLICY": { @@ -714,6 +789,8 @@ "TYPE":"Application Type", "GRANT":"Grant Types", "OIDC": { + "TOKENSECTIONTITLE":"AuthToken Options", + "REDIRECTSECTIONTITLE":"Redirect Settings", "PROSWITCH":"I'm a pro. Skip this wizard.", "NAMEANDTYPESECTION":"Name and Type", "TITLEFIRST":"Insert a name first.", @@ -754,9 +831,16 @@ "AUTHMETHOD0":"Basic", "AUTHMETHOD1":"Post", "AUTHMETHOD2":"None", + "TOKENTYPE":"Auth Token Type", + "TOKENTYPE0": "Bearer Token", + "TOKENTYPE1": "JWT", "UNSECUREREDIRECT":"I sure hope you know what you are doing.", "OVERVIEWSECTION":"Overview", - "OVERVIEWTITLE":"You are now done. Review your configuration." + "OVERVIEWTITLE":"You are now done. Review your configuration.", + "ACCESSTOKENROLEASSERTION":"Add user roles to the access token", + "ACCESSTOKENROLEASSERTION_DESCRIPTION":"If selected, the roles of the authenticated user are added to the access token.", + "IDTOKENROLEASSERTION":"Add user roles to the id token", + "IDTOKENROLEASSERTION_DESCRIPTION":"If selected, the roles of the authenticated user are added to the id token." }, "TOAST": { "REACTIVATED":"Application reactivated.", @@ -788,6 +872,8 @@ }, "ROLESLABEL":"Roles", "GRANTS": { + "TITLE":"Authorisations", + "DESC":"Here you can manage authorizations of your organization users.", "DELETE":"Delete Authorisation", "ADD":"Create Authorisation", "ADD_BTN":"New", diff --git a/console/src/assets/icons/android-chrome-192x192.png b/console/src/assets/icons/android-chrome-192x192.png index 43241d2fa5..f22bd442e6 100644 Binary files a/console/src/assets/icons/android-chrome-192x192.png and b/console/src/assets/icons/android-chrome-192x192.png differ diff --git a/console/src/assets/icons/apple-touch-icon.png b/console/src/assets/icons/apple-touch-icon.png index cc51648d93..4816102015 100644 Binary files a/console/src/assets/icons/apple-touch-icon.png and b/console/src/assets/icons/apple-touch-icon.png differ diff --git a/console/src/assets/icons/favicon-16x16.png b/console/src/assets/icons/favicon-16x16.png index 470dc2b05a..4f45702ca9 100644 Binary files a/console/src/assets/icons/favicon-16x16.png and b/console/src/assets/icons/favicon-16x16.png differ diff --git a/console/src/assets/icons/favicon-32x32.png b/console/src/assets/icons/favicon-32x32.png index 52826bab23..a598da05eb 100644 Binary files a/console/src/assets/icons/favicon-32x32.png and b/console/src/assets/icons/favicon-32x32.png differ diff --git a/console/src/assets/icons/favicon.ico b/console/src/assets/icons/favicon.ico deleted file mode 100644 index 1962ab7c8e..0000000000 Binary files a/console/src/assets/icons/favicon.ico and /dev/null differ diff --git a/console/src/assets/icons/mstile-150x150.png b/console/src/assets/icons/mstile-150x150.png index 1ac784f7f3..ab518480e6 100644 Binary files a/console/src/assets/icons/mstile-150x150.png and b/console/src/assets/icons/mstile-150x150.png differ diff --git a/console/src/assets/icons/safari-pinned-tab.svg b/console/src/assets/icons/safari-pinned-tab.svg deleted file mode 100644 index f18ee511b3..0000000000 --- a/console/src/assets/icons/safari-pinned-tab.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - -Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - - - diff --git a/console/src/assets/images/zitadel-social-preview25.png b/console/src/assets/images/zitadel-social-preview25.png new file mode 100644 index 0000000000..89b47ae455 Binary files /dev/null and b/console/src/assets/images/zitadel-social-preview25.png differ diff --git a/console/src/component-themes.scss b/console/src/component-themes.scss index 11c9c9a644..e7611f44dd 100644 --- a/console/src/component-themes.scss +++ b/console/src/component-themes.scss @@ -8,6 +8,7 @@ @import 'src/app/modules/meta-layout/meta'; @import 'src/app/pages/users/user-detail/auth-user-detail/theme-setting/theme-card'; @import 'src/app/pages/users/user-detail/memberships/memberships.component'; +@import 'src/app/app.component.scss'; @mixin component-themes($theme) { @include avatar-theme($theme); @@ -20,4 +21,5 @@ @include changes-theme($theme); @include meta-theme($theme); @include theme-card($theme); + @include textvar($theme); } diff --git a/console/src/favicon.ico b/console/src/favicon.ico index b488a5d341..6084cca103 100644 Binary files a/console/src/favicon.ico and b/console/src/favicon.ico differ diff --git a/console/src/favicon.png b/console/src/favicon.png new file mode 100644 index 0000000000..a598da05eb Binary files /dev/null and b/console/src/favicon.png differ diff --git a/console/src/index.html b/console/src/index.html index b8d881f9ff..b63d62074b 100644 --- a/console/src/index.html +++ b/console/src/index.html @@ -16,14 +16,18 @@ - - - - - - - + + + + + + + + + + + diff --git a/console/src/styles.scss b/console/src/styles.scss index fbea0a2f1e..f9d5c50877 100644 --- a/console/src/styles.scss +++ b/console/src/styles.scss @@ -17,6 +17,11 @@ src: url(assets/ailerons.otf) format('opentype'); } +:root { + --grey: #8795a1; + --table-row-back: #363738; +} + $caos-dark-brand: ( 50: #fff, 100: #dde6f3, @@ -152,7 +157,9 @@ $custom-typography: @include component-themes($dark-theme); @include angular-material-theme($dark-theme); -.mat-dialog-container { +.mat-dialog-container, +.mat-raised-button, +.mat-stroked-button { border-radius: .5rem !important; } @@ -160,13 +167,13 @@ $custom-typography: @include component-themes($light-theme); @include angular-material-theme($light-theme); - color: #202124; + --table-row-back: #eceef1; .sidenav, .main-container, .mat-dialog-container { background-color: #fafafa; - transition: background-color .4s ease-in-out; + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); } ::-webkit-scrollbar-track { @@ -193,11 +200,13 @@ $custom-typography: @include component-themes($dark-theme); @include angular-material-theme($dark-theme); + --table-row-back: #363738; + .sidenav, .main-container, .mat-dialog-container { background-color: #212224; - transition: background-color .4s ease-in-out; + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); } ::-webkit-scrollbar-track { diff --git a/console/src/styles/sidenav-list.scss b/console/src/styles/sidenav-list.scss index e47cbbc159..eb2f5b0f63 100644 --- a/console/src/styles/sidenav-list.scss +++ b/console/src/styles/sidenav-list.scss @@ -7,18 +7,9 @@ $primary-color: mat-color($primary, 500); $accent-color: mat-color($accent, 500); $primary-dark: mat-color($primary, A900); - $inverse-color: mat-color($primary, A600); $sec-dark: mat-color($primary, A800); /* stylelint-enable */ - .mat-menu-item { - &.show-all { - height: 2rem; - line-height: 2rem; - color: mat-color($primary, a700); - } - } - .nav-item { color: inherit; @@ -59,7 +50,7 @@ .root-header { box-shadow: 0 5px 10px rgba(0, 0, 0, .12); background-color: $primary-dark !important; - transition: background-color .4s ease-in-out; + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); } .admin-line { @@ -77,7 +68,7 @@ left: 0; border-bottom: 20px solid $primary-dark; border-right: 20px solid transparent; - transition: border-color .4s ease-in-out; + transition: border-color .3s cubic-bezier(.645, .045, .355, 1); } } } diff --git a/console/src/styles/table.scss b/console/src/styles/table.scss index b6f14c8b0b..3397770f57 100644 --- a/console/src/styles/table.scss +++ b/console/src/styles/table.scss @@ -5,12 +5,13 @@ $primary: map-get($theme, primary); $primary-dark: mat-color($primary, A900); $secondary-dark: mat-color($primary, A800); + $inv-color: mat-color($primary, A600); $foreground: map-get($theme, foreground); .mat-table, .mat-paginator { background-color: inherit !important; - transition: background-color .4s ease-in-out; + transition: background-color .3s cubic-bezier(.645, .045, .355, 1); } /* stylelint-enable */ @@ -19,7 +20,7 @@ border-radius: 1rem; color: mat-color($foreground, text); white-space: nowrap; - background-color: #8795a1; + background-color: var(--grey); padding: 3px 1rem; } @@ -28,4 +29,16 @@ padding-bottom: 0; } } + + tr { + &.highlight { + cursor: pointer; + + &:hover { + td { + background-color: var(--table-row-back); // rgba($inv-color, .05); + } + } + } + } } diff --git a/docs/local.md b/docs/local.md deleted file mode 100644 index 6d2f52477b..0000000000 --- a/docs/local.md +++ /dev/null @@ -1,35 +0,0 @@ - -## local development - -### start cockroach in docker - -```bash -docker rm -f zitadel-db && -rm -rf ${GOPATH}/src/github.com/caos/zitadel/cockroach-data && -docker run -d \ ---name=zitadel-db \ ---hostname=zitadel-db \ --p 26257:26257 -p 8080:8080 \ --v "${GOPATH}/src/github.com/caos/zitadel/cockroach-data/zitadel1:/cockroach/cockroach-data" \ -cockroachdb/cockroach:20.1.6 start-single-node --insecure -``` - -### local database migrations - -#### local migrate - -`go generate $GOPATH/src/github.com/caos/zitadel/migrations/cockroach/migrate_local.go` - -#### local cleanup - -`go generate $GOPATH/src/github.com/caos/zitadel/migrations/cockroach/clean_local.go` - - -### Connect to Cockroach - -`docker exec -it "zitadel-db" /cockroach/cockroach sql --insecure` - -#### Should show eventstore, management, admin, auth -`show databases;` - - \ No newline at end of file diff --git a/go.mod b/go.mod index c056b67ef1..5d96845c8a 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,9 @@ module github.com/caos/zitadel -go 1.14 +go 1.15 require ( + cloud.google.com/go v0.70.0 // indirect contrib.go.opencensus.io/exporter/stackdriver v0.13.4 github.com/BurntSushi/toml v0.3.1 github.com/DATA-DOG/go-sqlmock v1.5.0 @@ -12,24 +13,24 @@ require ( github.com/VictoriaMetrics/fastcache v1.5.7 github.com/ajstarks/svgo v0.0.0-20200725142600-7a3c8b57fecb github.com/allegro/bigcache v1.2.1 - github.com/aws/aws-sdk-go v1.35.0 // indirect + github.com/aws/aws-sdk-go v1.35.15 // indirect github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc github.com/caos/logging v0.0.2 - github.com/caos/oidc v0.10.0 + github.com/caos/oidc v0.12.3 github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/cockroachdb/cockroach-go/v2 v2.0.8 github.com/envoyproxy/protoc-gen-validate v0.4.1 github.com/ghodss/yaml v1.0.0 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/mock v1.4.4 - github.com/golang/protobuf v1.4.2 + github.com/golang/protobuf v1.4.3 github.com/golang/snappy v0.0.2 // indirect github.com/gorilla/csrf v1.7.0 github.com/gorilla/mux v1.8.0 github.com/gorilla/schema v1.2.0 github.com/gorilla/securecookie v1.1.1 github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 - github.com/grpc-ecosystem/grpc-gateway v1.15.0 + github.com/grpc-ecosystem/grpc-gateway v1.15.2 github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.11 // indirect github.com/inconshreveable/log15 v0.0.0-20200109203555-b30bc20e4fd1 // indirect @@ -40,7 +41,7 @@ require ( github.com/kevinburke/twilio-go v0.0.0-20200810163702-320748330fac github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.8.0 - github.com/mattn/go-colorable v0.1.7 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/reflectwalk v1.0.1 // indirect @@ -52,13 +53,16 @@ require ( github.com/stretchr/testify v1.6.1 github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 // indirect github.com/ttacon/libphonenumber v1.1.0 - go.opencensus.io v0.22.4 - golang.org/x/crypto v0.0.0-20200930160638-afb6bcd081ae - golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect + go.opencensus.io v0.22.5 + golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 + golang.org/x/net v0.0.0-20201027133719-8eef5233e2a1 // indirect + golang.org/x/sys v0.0.0-20201027140754-0fcbb8f4928c // indirect golang.org/x/text v0.3.3 - golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c - google.golang.org/genproto v0.0.0-20200930140634-01fc692af84b - google.golang.org/grpc v1.32.0 + golang.org/x/tools v0.0.0-20201026223136-e84cfc6dd5ca + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20201026171402-d4b8fe4fd877 + google.golang.org/grpc v1.33.1 google.golang.org/protobuf v1.25.0 gopkg.in/square/go-jose.v2 v2.5.1 + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect ) diff --git a/go.sum b/go.sum index a06bc54a05..2688351f23 100644 --- a/go.sum +++ b/go.sum @@ -17,17 +17,22 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.70.0 h1:ujhG1RejZYi+HYfJNlgBh3j/bVKD8DewM7AkJ5UPyBc= +cloud.google.com/go v0.70.0/go.mod h1:/UTKYRQTWjVnSe7nGvoSzxEFUELzSI/yAYd0JQT6cRo= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= @@ -37,12 +42,14 @@ cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= contrib.go.opencensus.io/exporter/stackdriver v0.13.4 h1:ksUxwH3OD5sxkjzEqGxNTl+Xjsmu3BnC/300MhSVTSc= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= @@ -53,6 +60,7 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= @@ -61,20 +69,20 @@ github.com/ajstarks/svgo v0.0.0-20200725142600-7a3c8b57fecb/go.mod h1:K08gAheRH3 github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.35.0 h1:Pxqn1MWNfBCNcX7jrXCCTfsKpg5ms2IMUMmmcGtYJuo= -github.com/aws/aws-sdk-go v1.35.0/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go v1.35.15 h1:JdQNM8hJe+9N9xP53S54NDmX8GCaZn8CCJ4LBHfom4U= +github.com/aws/aws-sdk-go v1.35.15/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/caos/logging v0.0.2 h1:ebg5C/HN0ludYR+WkvnFjwSExF4wvyiWPyWGcKMYsoo= github.com/caos/logging v0.0.2/go.mod h1:9LKiDE2ChuGv6CHYif/kiugrfEXu9AwDiFWSreX7Wp0= -github.com/caos/oidc v0.10.0 h1:/GKyQgKHvkc2jNCXzmdJs9hCXDYdArCMm3d5FXaiNWA= -github.com/caos/oidc v0.10.0/go.mod h1:RREtWSRzH/mXQXJkxB63mFDZ/RUNyzoU6czd6UJfvJI= -github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/caos/oidc v0.12.3 h1:bzUg5BdFwRK+Bi7vPHH0pZ3ni/0vMZTNtayRCFPbD4U= +github.com/caos/oidc v0.12.3/go.mod h1:R9UKITZmSo5vNhSLUYcTDH8pAaV2xwPASXg8wpEs2xQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -85,10 +93,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cockroach-go v2.0.1+incompatible h1:rkk9T7FViadPOz28xQ68o18jBSpyShru0mayVumxqYA= -github.com/cockroachdb/cockroach-go v2.0.1+incompatible/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= github.com/cockroachdb/cockroach-go/v2 v2.0.8 h1:50C/7ptrrfdxDccCjDU0xsdeBca+S0/AYW4Mo8RyzFE= github.com/cockroachdb/cockroach-go/v2 v2.0.8/go.mod h1:nkf7rUmgPdawp3EwRjXIumihI2AYg9usGNWbJ2hsJqI= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -105,7 +110,6 @@ github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xb github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.4.1 h1:7dLaJvASGRD7X49jSCSXXHwKPm0ZN9r9kJD+p+vS7dM= github.com/envoyproxy/protoc-gen-validate v0.4.1/go.mod h1:E+IEazqdaWv3FrnGtZIu3b9fPFMK8AzeTTrk9SfVwWs= @@ -124,14 +128,9 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= @@ -146,7 +145,6 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= @@ -160,37 +158,28 @@ github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw= github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -198,13 +187,12 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201009210932-67992a1a5a35/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/csrf v1.7.0 h1:mMPjV5/3Zd460xCavIkppUdvnl5fPXMpv2uz2Zyg7/Y= @@ -219,16 +207,15 @@ github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyC github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 h1:FlFbCRLd5Jr4iYXZufAvgWN6Ao0JrI5chLINnUXDDr0= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/grpc-gateway v1.15.0 h1:ntPNC9TD/6l2XDenJZe6T5lSMg95thpV9sGAqHX4WU8= -github.com/grpc-ecosystem/grpc-gateway v1.15.0/go.mod h1:vO11I9oWA+KsxmfFQPhLnnIb1VDE24M+pdxZFiuZcA8= +github.com/grpc-ecosystem/grpc-gateway v1.15.2 h1:HC+hWRWf+v5zTMPyoaYTKIJih+4sd4XRWmj0qlG87Co= +github.com/grpc-ecosystem/grpc-gateway v1.15.2/go.mod h1:vO11I9oWA+KsxmfFQPhLnnIb1VDE24M+pdxZFiuZcA8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/log15 v0.0.0-20200109203555-b30bc20e4fd1 h1:KUDFlmBg2buRWNzIcwLlKvfcnujcHQRQ1As1LoaCLAM= @@ -254,7 +241,6 @@ github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01C github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.3.0/go.mod h1:b0JqxHvPmljG+HQ5IsvQ0yqeSi4nGcDTVjFoiLDb0Ik= -github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o= github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= @@ -270,7 +256,6 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -278,7 +263,6 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kevinburke/go-types v0.0.0-20200309064045-f2d4aea18a7a h1:Z7+SSApKiwPjNic+NF9+j7h657Uyvdp/jA3iTKhpj4E= github.com/kevinburke/go-types v0.0.0-20200309064045-f2d4aea18a7a/go.mod h1:/Pk5i/SqYdYv1cie5wGwoZ4P6TpgMi+Yf58mtJSHdOw= @@ -291,17 +275,12 @@ github.com/kevinburke/twilio-go v0.0.0-20200810163702-320748330fac/go.mod h1:Fm9 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -315,8 +294,8 @@ github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lyft/protoc-gen-star v0.5.1/go.mod h1:9toiA3cC7z5uVbODF7kEQ91Xn7XNFkVUl+SrEe+ZORU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -330,7 +309,6 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJK github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -338,7 +316,6 @@ github.com/nicksnyder/go-i18n/v2 v2.1.1 h1:ATCOanRDlrfKVB4WHAdJnLEqZtDmKYsweqsOU github.com/nicksnyder/go-i18n/v2 v2.1.1/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -348,7 +325,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= @@ -356,32 +332,26 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea h1:jaXWVFZ98/ihXniiDzqNXQgMSgklX4kjfDWZTE3ZtdU= github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -397,10 +367,10 @@ github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -410,18 +380,14 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200930160638-afb6bcd081ae h1:duLSQW+DZ5MsXKX7kc4rXlq6/mmxz4G6ewJuBPlhRe0= -golang.org/x/crypto v0.0.0-20200930160638-afb6bcd081ae/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -443,7 +409,6 @@ golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367 h1:0IiAsCRByjO2QjX7ZPkw5oU9x+n1YqRL802rjC0c3Aw= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -453,7 +418,6 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -479,27 +443,24 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201027133719-8eef5233e2a1 h1:IEhJ99VWSYpHIxjlbu3DQyHegGPnQYAv0IaCX9KHyG0= +golang.org/x/net v0.0.0-20201027133719-8eef5233e2a1/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -508,18 +469,16 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -531,8 +490,8 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab h1:FvshnhkKW+LO3HWHodML8kuVX8rnJTxKm9dFPuI68UM= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -542,30 +501,26 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201027140754-0fcbb8f4928c h1:2+jF2APAgFgXJnYOQGDGGiRvvEo6OhqZGQf46n9xgEw= +golang.org/x/sys v0.0.0-20201027140754-0fcbb8f4928c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -577,7 +532,6 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -599,13 +553,11 @@ golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56 h1:DFtSed2q3HtNuVazwVDZ4nSRS/JrZEig0gz2BY4VNrg= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4 h1:kDtqNkeBrZb8B+atrj50B5XLHpzXXqcCdZPP/ApQ5NY= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -614,17 +566,15 @@ golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d h1:W07d4xkoAUSNOkOzdzXCdFGxT7o2rW4q8M34tB2i//k= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200930213115-e57f6d466a48 h1:/N7U6gDrclaaWCzrdxtKeyEcUx2goazt5PelznylQNM= -golang.org/x/tools v0.0.0-20200930213115-e57f6d466a48/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c h1:9BSeO6440XJVa2mxIcRAndAol4g4g2KflCVGcHx9Yu8= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201017001424-6003fad69a88/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201026223136-e84cfc6dd5ca h1:vL6Mv8VrSxz8azdgLrH/zO/Rd1Bzdk89ZfMVW39gD0Q= +golang.org/x/tools v0.0.0-20201026223136-e84cfc6dd5ca/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -639,27 +589,23 @@ google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0 h1:jz2KixHX7EcCPiQrySzPdnYT7DbINAypCqKZ1Z7GM40= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0 h1:J1Pl9P2lnmYFSJvgs70DKELqHNh8CNWXPbud4njEE2s= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0 h1:cG03eaksBzhfSIk7JRGctfp3lanklcOM/mTGvow7BbQ= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0 h1:jMF5hhVfMkTZwHW1SDpKq5CkgWLXOb31Foaca9Zr3oM= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.33.0 h1:+gL0XvACeMIvpwLZ5rQZzLn5cwOsgg8dIcfJ2SYfBVw= +google.golang.org/api v0.33.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -680,22 +626,21 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940 h1:MRHtG0U6SnaUb+s+LhNE1qt1FQ1wlhqr5E4usBKC0uA= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200930140634-01fc692af84b h1:GJQgk4o/yzqYEu9Y6V4gRCI54KRlkOE0xAZeEGUUJjw= -google.golang.org/genproto v0.0.0-20200930140634-01fc692af84b/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201026171402-d4b8fe4fd877 h1:d4k3uIU763E31Rk4UZPA47oOoBymMsDImV3U4mGhX9E= +google.golang.org/genproto v0.0.0-20201026171402-d4b8fe4fd877/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -705,32 +650,26 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0 h1:zWTV+LMdc3kaiJMSTOFz2UgSBgx8RNQoTGiZu3fR9S0= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1 h1:DGeFlSan2f+WEtCERJ4J9GJWk15TxUi8QGagfI87Xyc= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -740,23 +679,20 @@ gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/admin/repository/eventsourcing/eventstore/iam.go b/internal/admin/repository/eventsourcing/eventstore/iam.go index 54cfb4c5cd..4144e62fd7 100644 --- a/internal/admin/repository/eventsourcing/eventstore/iam.go +++ b/internal/admin/repository/eventsourcing/eventstore/iam.go @@ -2,6 +2,8 @@ package eventstore import ( "context" + "strings" + "github.com/caos/logging" admin_view "github.com/caos/zitadel/internal/admin/repository/eventsourcing/view" "github.com/caos/zitadel/internal/config/systemdefaults" @@ -11,7 +13,6 @@ import ( org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" usr_model "github.com/caos/zitadel/internal/user/model" usr_es "github.com/caos/zitadel/internal/user/repository/eventsourcing" - "strings" iam_model "github.com/caos/zitadel/internal/iam/model" iam_es "github.com/caos/zitadel/internal/iam/repository/eventsourcing" @@ -163,7 +164,7 @@ func (repo *IAMRepository) SearchIDPConfigs(ctx context.Context, request *iam_mo result := &iam_model.IDPConfigSearchResponse{ Offset: request.Offset, Limit: request.Limit, - TotalResult: uint64(count), + TotalResult: count, Result: iam_es_model.IdpConfigViewsToModel(idps), } if err == nil { @@ -173,6 +174,24 @@ func (repo *IAMRepository) SearchIDPConfigs(ctx context.Context, request *iam_mo return result, nil } +func (repo *IAMRepository) GetDefaultLabelPolicy(ctx context.Context) (*iam_model.LabelPolicyView, error) { + policy, err := repo.View.LabelPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.LabelPolicyViewToModel(policy), err +} + +func (repo *IAMRepository) AddDefaultLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddLabelPolicy(ctx, policy) +} + +func (repo *IAMRepository) ChangeDefaultLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangeLabelPolicy(ctx, policy) +} + func (repo *IAMRepository) GetDefaultLoginPolicy(ctx context.Context) (*iam_model.LoginPolicyView, error) { policy, err := repo.View.LoginPolicyByAggregateID(repo.SystemDefaults.IamID) if err != nil { @@ -242,3 +261,75 @@ func (repo *IAMRepository) RemoveIDPProviderFromLoginPolicy(ctx context.Context, } return es_sdk.PushAggregates(ctx, repo.Eventstore.PushAggregates, nil, aggregates...) } + +func (repo *IAMRepository) GetDefaultPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) { + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.PasswordComplexityViewToModel(policy), nil +} + +func (repo *IAMRepository) AddDefaultPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddPasswordComplexityPolicy(ctx, policy) +} + +func (repo *IAMRepository) ChangeDefaultPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangePasswordComplexityPolicy(ctx, policy) +} + +func (repo *IAMRepository) GetDefaultPasswordAgePolicy(ctx context.Context) (*iam_model.PasswordAgePolicyView, error) { + policy, err := repo.View.PasswordAgePolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.PasswordAgeViewToModel(policy), nil +} + +func (repo *IAMRepository) AddDefaultPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddPasswordAgePolicy(ctx, policy) +} + +func (repo *IAMRepository) ChangeDefaultPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangePasswordAgePolicy(ctx, policy) +} + +func (repo *IAMRepository) GetDefaultPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) { + policy, err := repo.View.PasswordLockoutPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.PasswordLockoutViewToModel(policy), nil +} + +func (repo *IAMRepository) AddDefaultPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddPasswordLockoutPolicy(ctx, policy) +} + +func (repo *IAMRepository) ChangeDefaultPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangePasswordLockoutPolicy(ctx, policy) +} + +func (repo *IAMRepository) GetOrgIAMPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) { + policy, err := repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.OrgIAMViewToModel(policy), nil +} + +func (repo *IAMRepository) AddDefaultOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddOrgIAMPolicy(ctx, policy) +} + +func (repo *IAMRepository) ChangeDefaultOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangeOrgIAMPolicy(ctx, policy) +} diff --git a/internal/admin/repository/eventsourcing/eventstore/org.go b/internal/admin/repository/eventsourcing/eventstore/org.go index 2d651001f6..a7d23cb368 100644 --- a/internal/admin/repository/eventsourcing/eventstore/org.go +++ b/internal/admin/repository/eventsourcing/eventstore/org.go @@ -2,6 +2,9 @@ package eventstore import ( "context" + "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_view "github.com/caos/zitadel/internal/iam/repository/view/model" "github.com/caos/logging" admin_model "github.com/caos/zitadel/internal/admin/model" @@ -10,11 +13,10 @@ import ( "github.com/caos/zitadel/internal/eventstore" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/sdk" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" org_model "github.com/caos/zitadel/internal/org/model" org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" "github.com/caos/zitadel/internal/org/repository/view/model" - policy_model "github.com/caos/zitadel/internal/policy/model" - policy_es "github.com/caos/zitadel/internal/policy/repository/eventsourcing" usr_es "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) @@ -23,10 +25,9 @@ const ( ) type OrgRepo struct { - Eventstore eventstore.Eventstore - OrgEventstore *org_es.OrgEventstore - UserEventstore *usr_es.UserEventstore - PolicyEventstore *policy_es.PolicyEventstore + Eventstore eventstore.Eventstore + OrgEventstore *org_es.OrgEventstore + UserEventstore *usr_es.UserEventstore View *admin_view.View @@ -35,11 +36,12 @@ type OrgRepo struct { } func (repo *OrgRepo) SetUpOrg(ctx context.Context, setUp *admin_model.SetupOrg) (*admin_model.SetupOrg, error) { - pwPolicy, err := repo.PolicyEventstore.GetPasswordComplexityPolicy(ctx, policy_model.DefaultPolicy) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) if err != nil { return nil, err } - orgPolicy, err := repo.OrgEventstore.GetOrgIAMPolicy(ctx, policy_model.DefaultPolicy) + pwPolicyView := iam_view.PasswordComplexityViewToModel(pwPolicy) + orgPolicy, err := repo.GetDefaultOrgIAMPolicy(ctx) if err != nil { return nil, err } @@ -54,7 +56,7 @@ func (repo *OrgRepo) SetUpOrg(ctx context.Context, setUp *admin_model.SetupOrg) if err != nil { return nil, err } - user, userAggregates, err := repo.UserEventstore.PrepareCreateUser(ctx, setUp.User, pwPolicy, orgPolicy, org.AggregateID) + user, userAggregates, err := repo.UserEventstore.PrepareCreateUser(ctx, setUp.User, pwPolicyView, orgPolicy, org.AggregateID) if err != nil { return nil, err } @@ -92,7 +94,7 @@ func (repo *OrgRepo) SearchOrgs(ctx context.Context, query *org_model.OrgSearchR result := &org_model.OrgSearchResult{ Offset: query.Offset, Limit: query.Limit, - TotalResult: uint64(count), + TotalResult: count, Result: model.OrgsToModel(orgs), } if err == nil { @@ -106,18 +108,34 @@ func (repo *OrgRepo) IsOrgUnique(ctx context.Context, name, domain string) (isUn return repo.OrgEventstore.IsOrgUnique(ctx, name, domain) } -func (repo *OrgRepo) GetOrgIamPolicyByID(ctx context.Context, id string) (*org_model.OrgIAMPolicy, error) { - return repo.OrgEventstore.GetOrgIAMPolicy(ctx, id) +func (repo *OrgRepo) GetOrgIAMPolicyByID(ctx context.Context, id string) (*iam_model.OrgIAMPolicyView, error) { + policy, err := repo.View.OrgIAMPolicyByAggregateID(id) + if errors.IsNotFound(err) { + return repo.GetDefaultOrgIAMPolicy(ctx) + } + if err != nil { + return nil, err + } + return iam_es_model.OrgIAMViewToModel(policy), err } -func (repo *OrgRepo) CreateOrgIamPolicy(ctx context.Context, policy *org_model.OrgIAMPolicy) (*org_model.OrgIAMPolicy, error) { +func (repo *OrgRepo) GetDefaultOrgIAMPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) { + policy, err := repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + return iam_es_model.OrgIAMViewToModel(policy), err +} + +func (repo *OrgRepo) CreateOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { return repo.OrgEventstore.AddOrgIAMPolicy(ctx, policy) } -func (repo *OrgRepo) ChangeOrgIamPolicy(ctx context.Context, policy *org_model.OrgIAMPolicy) (*org_model.OrgIAMPolicy, error) { +func (repo *OrgRepo) ChangeOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { return repo.OrgEventstore.ChangeOrgIAMPolicy(ctx, policy) } -func (repo *OrgRepo) RemoveOrgIamPolicy(ctx context.Context, id string) error { +func (repo *OrgRepo) RemoveOrgIAMPolicy(ctx context.Context, id string) error { return repo.OrgEventstore.RemoveOrgIAMPolicy(ctx, id) } diff --git a/internal/admin/repository/eventsourcing/eventstore/user.go b/internal/admin/repository/eventsourcing/eventstore/user.go index 6fd87412a0..b465ef091b 100644 --- a/internal/admin/repository/eventsourcing/eventstore/user.go +++ b/internal/admin/repository/eventsourcing/eventstore/user.go @@ -2,18 +2,22 @@ package eventstore import ( "context" + admin_view "github.com/caos/zitadel/internal/admin/repository/eventsourcing/view" + "github.com/caos/zitadel/internal/config/systemdefaults" + caos_errs "github.com/caos/zitadel/internal/errors" + iam_view "github.com/caos/zitadel/internal/iam/repository/view/model" "github.com/caos/zitadel/internal/api/authz" org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" - policy_event "github.com/caos/zitadel/internal/policy/repository/eventsourcing" usr_model "github.com/caos/zitadel/internal/user/model" usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) type UserRepo struct { - UserEvents *usr_event.UserEventstore - PolicyEvents *policy_event.PolicyEventstore - OrgEvents *org_event.OrgEventstore + UserEvents *usr_event.UserEventstore + OrgEvents *org_event.OrgEventstore + View *admin_view.View + SystemDefaults systemdefaults.SystemDefaults } func (repo *UserRepo) UserByID(ctx context.Context, id string) (project *usr_model.User, err error) { @@ -21,15 +25,23 @@ func (repo *UserRepo) UserByID(ctx context.Context, id string) (project *usr_mod } func (repo *UserRepo) CreateUser(ctx context.Context, user *usr_model.User) (*usr_model.User, error) { - pwPolicy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, authz.GetCtxData(ctx).OrgID) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if caos_errs.IsNotFound(err) { + pwPolicy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, authz.GetCtxData(ctx).OrgID) - if err != nil { - return nil, err + pwPolicyView := iam_view.PasswordComplexityViewToModel(pwPolicy) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if err != nil && caos_errs.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } } - return repo.UserEvents.CreateUser(ctx, user, pwPolicy, orgPolicy) + orgPolicyView := iam_view.OrgIAMViewToModel(orgPolicy) + return repo.UserEvents.CreateUser(ctx, user, pwPolicyView, orgPolicyView) } func (repo *UserRepo) RegisterUser(ctx context.Context, user *usr_model.User, resourceOwner string) (*usr_model.User, error) { @@ -37,13 +49,22 @@ func (repo *UserRepo) RegisterUser(ctx context.Context, user *usr_model.User, re if resourceOwner != "" { policyResourceOwner = resourceOwner } - pwPolicy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, policyResourceOwner) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(policyResourceOwner) + if caos_errs.IsNotFound(err) { + pwPolicy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, policyResourceOwner) + pwPolicyView := iam_view.PasswordComplexityViewToModel(pwPolicy) + + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(policyResourceOwner) + if caos_errs.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - return repo.UserEvents.RegisterUser(ctx, user, pwPolicy, orgPolicy, resourceOwner) + orgPolicyView := iam_view.OrgIAMViewToModel(orgPolicy) + return repo.UserEvents.RegisterUser(ctx, user, pwPolicyView, orgPolicyView, resourceOwner) } diff --git a/internal/admin/repository/eventsourcing/handler/handler.go b/internal/admin/repository/eventsourcing/handler/handler.go index 0507ac5962..31115d9878 100644 --- a/internal/admin/repository/eventsourcing/handler/handler.go +++ b/internal/admin/repository/eventsourcing/handler/handler.go @@ -1,9 +1,10 @@ package handler import ( + "time" + "github.com/caos/zitadel/internal/config/systemdefaults" iam_event "github.com/caos/zitadel/internal/iam/repository/eventsourcing" - "time" "github.com/caos/zitadel/internal/admin/repository/eventsourcing/view" "github.com/caos/zitadel/internal/config/types" @@ -35,11 +36,21 @@ type EventstoreRepos struct { func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, eventstore eventstore.Eventstore, repos EventstoreRepos, defaults systemdefaults.SystemDefaults) []query.Handler { return []query.Handler{ &Org{handler: handler{view, bulkLimit, configs.cycleDuration("Org"), errorCount}}, - &IamMember{handler: handler{view, bulkLimit, configs.cycleDuration("IamMember"), errorCount}, userEvents: repos.UserEvents}, + &IamMember{handler: handler{view, bulkLimit, configs.cycleDuration("IamMember"), errorCount}, + userEvents: repos.UserEvents}, &IDPConfig{handler: handler{view, bulkLimit, configs.cycleDuration("IDPConfig"), errorCount}}, + &LabelPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("LabelPolicy"), errorCount}}, &LoginPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("LoginPolicy"), errorCount}}, - &IDPProvider{handler: handler{view, bulkLimit, configs.cycleDuration("LoginPolicy"), errorCount}, systemDefaults: defaults, iamEvents: repos.IamEvents, orgEvents: repos.OrgEvents}, - &User{handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, eventstore: eventstore, orgEvents: repos.OrgEvents}, + &IDPProvider{handler: handler{view, bulkLimit, configs.cycleDuration("LoginPolicy"), errorCount}, + systemDefaults: defaults, iamEvents: repos.IamEvents, orgEvents: repos.OrgEvents}, + &User{handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, + eventstore: eventstore, orgEvents: repos.OrgEvents, iamEvents: repos.IamEvents, systemDefaults: defaults}, + &PasswordComplexityPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("PasswordComplexityPolicy"), errorCount}}, + &PasswordAgePolicy{handler: handler{view, bulkLimit, configs.cycleDuration("PasswordAgePolicy"), errorCount}}, + &PasswordLockoutPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("PasswordLockoutPolicy"), errorCount}}, + &OrgIAMPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("OrgIAMPolicy"), errorCount}}, + &ExternalIDP{handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, + orgEvents: repos.OrgEvents, iamEvents: repos.IamEvents, systemDefaults: defaults}, } } diff --git a/internal/admin/repository/eventsourcing/handler/iam_member.go b/internal/admin/repository/eventsourcing/handler/iam_member.go index f5c39d9b7a..906e9f6aa3 100644 --- a/internal/admin/repository/eventsourcing/handler/iam_member.go +++ b/internal/admin/repository/eventsourcing/handler/iam_member.go @@ -52,8 +52,11 @@ func (m *IamMember) processIamMember(event *models.Event) (err error) { member := new(iam_model.IAMMemberView) switch event.Type { case model.IAMMemberAdded: - member.AppendEvent(event) - m.fillData(member) + err = member.AppendEvent(event) + if err != nil { + return err + } + err = m.fillData(member) case model.IAMMemberChanged: err := member.SetData(event) if err != nil { @@ -63,7 +66,7 @@ func (m *IamMember) processIamMember(event *models.Event) (err error) { if err != nil { return err } - member.AppendEvent(event) + err = member.AppendEvent(event) case model.IAMMemberRemoved: err := member.SetData(event) if err != nil { @@ -101,6 +104,8 @@ func (m *IamMember) processUser(event *models.Event) (err error) { m.fillUserData(member, user) } return m.view.PutIAMMembers(members, event.Sequence) + case usr_es_model.UserRemoved: + return m.view.DeleteIAMMembersByUserID(event.AggregateID, event.Sequence) default: return m.view.ProcessedIAMMemberSequence(event.Sequence) } diff --git a/internal/admin/repository/eventsourcing/handler/idp_providers.go b/internal/admin/repository/eventsourcing/handler/idp_providers.go index c975a41d5a..0613ae7fa5 100644 --- a/internal/admin/repository/eventsourcing/handler/idp_providers.go +++ b/internal/admin/repository/eventsourcing/handler/idp_providers.go @@ -66,13 +66,17 @@ func (m *IDPProvider) processIdpProvider(event *models.Event) (err error) { } return m.view.DeleteIDPProvider(event.AggregateID, provider.IDPConfigID, event.Sequence) case model.IDPConfigChanged, org_es_model.IDPConfigChanged: - config := new(iam_model.IDPConfig) - config.AppendEvent(event) - providers, err := m.view.IDPProvidersByIdpConfigID(config.IDPConfigID) + esConfig := new(iam_view_model.IDPConfigView) + providerType := iam_model.IDPProviderTypeSystem + if event.AggregateID != m.systemDefaults.IamID { + providerType = iam_model.IDPProviderTypeOrg + } + esConfig.AppendEvent(providerType, event) + providers, err := m.view.IDPProvidersByIdpConfigID(esConfig.IDPConfigID) if err != nil { return err } - config, err = m.iamEvents.GetIDPConfig(context.Background(), provider.AggregateID, config.IDPConfigID) + config, err := m.iamEvents.GetIDPConfig(context.Background(), event.AggregateID, esConfig.IDPConfigID) if err != nil { return err } @@ -105,6 +109,7 @@ func (m *IDPProvider) fillData(provider *iam_view_model.IDPProviderView) (err er func (m *IDPProvider) fillConfigData(provider *iam_view_model.IDPProviderView, config *iam_model.IDPConfig) { provider.Name = config.Name + provider.StylingType = int32(config.StylingType) provider.IDPConfigType = int32(config.Type) provider.IDPState = int32(config.State) } diff --git a/internal/admin/repository/eventsourcing/handler/label_policy.go b/internal/admin/repository/eventsourcing/handler/label_policy.go new file mode 100644 index 0000000000..5226b5e3dd --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/label_policy.go @@ -0,0 +1,66 @@ +package handler + +import ( + "github.com/caos/logging" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" +) + +type LabelPolicy struct { + handler +} + +const ( + labelPolicyTable = "adminapi.label_policies" +) + +func (m *LabelPolicy) ViewModel() string { + return labelPolicyTable +} + +func (m *LabelPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestLabelPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *LabelPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.IAMAggregate: + err = m.processLabelPolicy(event) + } + return err +} + +func (m *LabelPolicy) processLabelPolicy(event *models.Event) (err error) { + policy := new(iam_model.LabelPolicyView) + switch event.Type { + case model.LabelPolicyAdded: + err = policy.AppendEvent(event) + case model.LabelPolicyChanged: + policy, err = m.view.LabelPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + default: + return m.view.ProcessedLabelPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutLabelPolicy(policy, policy.Sequence) +} + +func (m *LabelPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-Wj8sf", "id", event.AggregateID).WithError(err).Warn("something went wrong in label policy handler") + return spooler.HandleError(event, err, m.view.GetLatestLabelPolicyFailedEvent, m.view.ProcessedLabelPolicyFailedEvent, m.view.ProcessedLabelPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/admin/repository/eventsourcing/handler/org.go b/internal/admin/repository/eventsourcing/handler/org.go index d91eecae28..fafe94a74c 100644 --- a/internal/admin/repository/eventsourcing/handler/org.go +++ b/internal/admin/repository/eventsourcing/handler/org.go @@ -35,7 +35,10 @@ func (o *Org) Reduce(event *es_models.Event) error { switch event.Type { case model.OrgAdded: - org.AppendEvent(event) + err := org.AppendEvent(event) + if err != nil { + return err + } case model.OrgChanged: err := org.SetData(event) if err != nil { diff --git a/internal/admin/repository/eventsourcing/handler/org_iam_policy.go b/internal/admin/repository/eventsourcing/handler/org_iam_policy.go new file mode 100644 index 0000000000..cb49e33efb --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/org_iam_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type OrgIAMPolicy struct { + handler +} + +const ( + orgIAMPolicyTable = "adminapi.org_iam_policies" +) + +func (m *OrgIAMPolicy) ViewModel() string { + return orgIAMPolicyTable +} + +func (m *OrgIAMPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestOrgIAMPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *OrgIAMPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processOrgIAMPolicy(event) + } + return err +} + +func (m *OrgIAMPolicy) processOrgIAMPolicy(event *models.Event) (err error) { + policy := new(iam_model.OrgIAMPolicyView) + switch event.Type { + case iam_es_model.OrgIAMPolicyAdded, model.OrgIAMPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.OrgIAMPolicyChanged, model.OrgIAMPolicyChanged: + policy, err = m.view.OrgIAMPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.OrgIAMPolicyRemoved: + return m.view.DeleteOrgIAMPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedOrgIAMPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutOrgIAMPolicy(policy, policy.Sequence) +} + +func (m *OrgIAMPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-Wm8fs", "id", event.AggregateID).WithError(err).Warn("something went wrong in orgIAM policy handler") + return spooler.HandleError(event, err, m.view.GetLatestOrgIAMPolicyFailedEvent, m.view.ProcessedOrgIAMPolicyFailedEvent, m.view.ProcessedOrgIAMPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/admin/repository/eventsourcing/handler/password_age_policy.go b/internal/admin/repository/eventsourcing/handler/password_age_policy.go new file mode 100644 index 0000000000..bf56af86ef --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/password_age_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type PasswordAgePolicy struct { + handler +} + +const ( + passwordAgePolicyTable = "adminapi.password_age_policies" +) + +func (m *PasswordAgePolicy) ViewModel() string { + return passwordAgePolicyTable +} + +func (m *PasswordAgePolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestPasswordAgePolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *PasswordAgePolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processPasswordAgePolicy(event) + } + return err +} + +func (m *PasswordAgePolicy) processPasswordAgePolicy(event *models.Event) (err error) { + policy := new(iam_model.PasswordAgePolicyView) + switch event.Type { + case iam_es_model.PasswordAgePolicyAdded, model.PasswordAgePolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.PasswordAgePolicyChanged, model.PasswordAgePolicyChanged: + policy, err = m.view.PasswordAgePolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.PasswordAgePolicyRemoved: + return m.view.DeletePasswordAgePolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedPasswordAgePolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutPasswordAgePolicy(policy, policy.Sequence) +} + +func (m *PasswordAgePolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-nD8sie", "id", event.AggregateID).WithError(err).Warn("something went wrong in passwordAge policy handler") + return spooler.HandleError(event, err, m.view.GetLatestPasswordAgePolicyFailedEvent, m.view.ProcessedPasswordAgePolicyFailedEvent, m.view.ProcessedPasswordAgePolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/admin/repository/eventsourcing/handler/password_complexity_policy.go b/internal/admin/repository/eventsourcing/handler/password_complexity_policy.go new file mode 100644 index 0000000000..2eeb6cf759 --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/password_complexity_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type PasswordComplexityPolicy struct { + handler +} + +const ( + passwordComplexityPolicyTable = "adminapi.password_complexity_policies" +) + +func (m *PasswordComplexityPolicy) ViewModel() string { + return passwordComplexityPolicyTable +} + +func (m *PasswordComplexityPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestPasswordComplexityPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *PasswordComplexityPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processPasswordComplexityPolicy(event) + } + return err +} + +func (m *PasswordComplexityPolicy) processPasswordComplexityPolicy(event *models.Event) (err error) { + policy := new(iam_model.PasswordComplexityPolicyView) + switch event.Type { + case iam_es_model.PasswordComplexityPolicyAdded, model.PasswordComplexityPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.PasswordComplexityPolicyChanged, model.PasswordComplexityPolicyChanged: + policy, err = m.view.PasswordComplexityPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.PasswordComplexityPolicyRemoved: + return m.view.DeletePasswordComplexityPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedPasswordComplexityPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutPasswordComplexityPolicy(policy, policy.Sequence) +} + +func (m *PasswordComplexityPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-Wm8fs", "id", event.AggregateID).WithError(err).Warn("something went wrong in passwordComplexity policy handler") + return spooler.HandleError(event, err, m.view.GetLatestPasswordComplexityPolicyFailedEvent, m.view.ProcessedPasswordComplexityPolicyFailedEvent, m.view.ProcessedPasswordComplexityPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/admin/repository/eventsourcing/handler/password_lockout_policy.go b/internal/admin/repository/eventsourcing/handler/password_lockout_policy.go new file mode 100644 index 0000000000..bd71ab054d --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/password_lockout_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type PasswordLockoutPolicy struct { + handler +} + +const ( + passwordLockoutPolicyTable = "adminapi.password_lockout_policies" +) + +func (m *PasswordLockoutPolicy) ViewModel() string { + return passwordLockoutPolicyTable +} + +func (m *PasswordLockoutPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestPasswordLockoutPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *PasswordLockoutPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processPasswordLockoutPolicy(event) + } + return err +} + +func (m *PasswordLockoutPolicy) processPasswordLockoutPolicy(event *models.Event) (err error) { + policy := new(iam_model.PasswordLockoutPolicyView) + switch event.Type { + case iam_es_model.PasswordLockoutPolicyAdded, model.PasswordLockoutPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.PasswordLockoutPolicyChanged, model.PasswordLockoutPolicyChanged: + policy, err = m.view.PasswordLockoutPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.PasswordLockoutPolicyRemoved: + return m.view.DeletePasswordLockoutPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedPasswordLockoutPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutPasswordLockoutPolicy(policy, policy.Sequence) +} + +func (m *PasswordLockoutPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-nD8sie", "id", event.AggregateID).WithError(err).Warn("something went wrong in passwordLockout policy handler") + return spooler.HandleError(event, err, m.view.GetLatestPasswordLockoutPolicyFailedEvent, m.view.ProcessedPasswordLockoutPolicyFailedEvent, m.view.ProcessedPasswordLockoutPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/admin/repository/eventsourcing/handler/user.go b/internal/admin/repository/eventsourcing/handler/user.go index e60e18219d..8a4105d131 100644 --- a/internal/admin/repository/eventsourcing/handler/user.go +++ b/internal/admin/repository/eventsourcing/handler/user.go @@ -2,6 +2,8 @@ package handler import ( "context" + "github.com/caos/zitadel/internal/config/systemdefaults" + iam_es "github.com/caos/zitadel/internal/iam/repository/eventsourcing" "github.com/caos/logging" @@ -18,8 +20,10 @@ import ( type User struct { handler - eventstore eventstore.Eventstore - orgEvents *org_events.OrgEventstore + eventstore eventstore.Eventstore + orgEvents *org_events.OrgEventstore + iamEvents *iam_es.IAMEventstore + systemDefaults systemdefaults.SystemDefaults } const ( @@ -106,7 +110,7 @@ func (u *User) ProcessUser(event *models.Event) (err error) { } err = u.fillLoginNames(user) case es_model.UserRemoved: - err = u.view.DeleteUser(event.AggregateID, event.Sequence) + return u.view.DeleteUser(event.AggregateID, event.Sequence) default: return u.view.ProcessedUserSequence(event.Sequence) } @@ -136,9 +140,12 @@ func (u *User) fillLoginNamesOnOrgUsers(event *models.Event) error { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.systemDefaults.IamID) + if err != nil { + return err + } } users, err := u.view.UsersByOrgID(event.AggregateID) if err != nil { @@ -155,9 +162,12 @@ func (u *User) fillPreferredLoginNamesOnOrgUsers(event *models.Event) error { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.systemDefaults.IamID) + if err != nil { + return err + } } if !policy.UserLoginMustBeDomain { return nil @@ -177,9 +187,12 @@ func (u *User) fillLoginNames(user *view_model.UserView) (err error) { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), user.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.systemDefaults.IamID) + if err != nil { + return err + } } user.SetLoginNames(policy, org.Domains) user.PreferredLoginName = user.GenerateLoginName(org.GetPrimaryDomain().Domain, policy.UserLoginMustBeDomain) diff --git a/internal/admin/repository/eventsourcing/handler/user_external_idps.go b/internal/admin/repository/eventsourcing/handler/user_external_idps.go index 1d64fb5a9f..b9c74c1c89 100644 --- a/internal/admin/repository/eventsourcing/handler/user_external_idps.go +++ b/internal/admin/repository/eventsourcing/handler/user_external_idps.go @@ -6,6 +6,7 @@ import ( "github.com/caos/zitadel/internal/config/systemdefaults" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/iam/repository/eventsourcing" + iam_view_model "github.com/caos/zitadel/internal/iam/repository/view/model" org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" @@ -68,6 +69,8 @@ func (m *ExternalIDP) processUser(event *models.Event) (err error) { return err } return m.view.DeleteExternalIDP(externalIDP.ExternalUserID, externalIDP.IDPConfigID, event.Sequence) + case model.UserRemoved: + return m.view.DeleteExternalIDPsByUserID(event.AggregateID, event.Sequence) default: return m.view.ProcessedExternalIDPSequence(event.Sequence) } @@ -80,16 +83,21 @@ func (m *ExternalIDP) processUser(event *models.Event) (err error) { func (m *ExternalIDP) processIdpConfig(event *models.Event) (err error) { switch event.Type { case iam_es_model.IDPConfigChanged, org_es_model.IDPConfigChanged: + configView := new(iam_view_model.IDPConfigView) config := new(iam_model.IDPConfig) - config.AppendEvent(event) - exterinalIDPs, err := m.view.ExternalIDPsByIDPConfigID(config.IDPConfigID) + if event.Type == iam_es_model.IDPConfigChanged { + configView.AppendEvent(iam_model.IDPProviderTypeSystem, event) + } else { + configView.AppendEvent(iam_model.IDPProviderTypeOrg, event) + } + exterinalIDPs, err := m.view.ExternalIDPsByIDPConfigID(configView.IDPConfigID) if err != nil { return err } if event.AggregateType == iam_es_model.IAMAggregate { - config, err = m.iamEvents.GetIDPConfig(context.Background(), config.AggregateID, config.IDPConfigID) + config, err = m.iamEvents.GetIDPConfig(context.Background(), event.AggregateID, configView.IDPConfigID) } else { - config, err = m.orgEvents.GetIDPConfig(context.Background(), config.AggregateID, config.IDPConfigID) + config, err = m.orgEvents.GetIDPConfig(context.Background(), event.AggregateID, configView.IDPConfigID) } if err != nil { return err diff --git a/internal/admin/repository/eventsourcing/repository.go b/internal/admin/repository/eventsourcing/repository.go index 28eb20f654..a7b8a98f25 100644 --- a/internal/admin/repository/eventsourcing/repository.go +++ b/internal/admin/repository/eventsourcing/repository.go @@ -13,7 +13,6 @@ import ( es_spol "github.com/caos/zitadel/internal/eventstore/spooler" es_iam "github.com/caos/zitadel/internal/iam/repository/eventsourcing" es_org "github.com/caos/zitadel/internal/org/repository/eventsourcing" - es_policy "github.com/caos/zitadel/internal/policy/repository/eventsourcing" es_usr "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) @@ -30,6 +29,7 @@ type EsRepository struct { eventstore.OrgRepo eventstore.IAMRepository eventstore.AdministratorRepo + eventstore.UserRepo } func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, roles []string) (*EsRepository, error) { @@ -55,13 +55,6 @@ func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, r if err != nil { return nil, err } - policy, err := es_policy.StartPolicy(es_policy.PolicyConfig{ - Eventstore: es, - Cache: conf.Eventstore.Cache, - }, systemDefaults) - if err != nil { - return nil, err - } sqlClient, err := conf.View.Start() if err != nil { return nil, err @@ -76,13 +69,12 @@ func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, r return &EsRepository{ spooler: spool, OrgRepo: eventstore.OrgRepo{ - Eventstore: es, - OrgEventstore: org, - UserEventstore: user, - PolicyEventstore: policy, - View: view, - SearchLimit: conf.SearchLimit, - SystemDefaults: systemDefaults, + Eventstore: es, + OrgEventstore: org, + UserEventstore: user, + View: view, + SearchLimit: conf.SearchLimit, + SystemDefaults: systemDefaults, }, IAMRepository: eventstore.IAMRepository{ IAMEventstore: iam, @@ -96,6 +88,12 @@ func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, r AdministratorRepo: eventstore.AdministratorRepo{ View: view, }, + UserRepo: eventstore.UserRepo{ + UserEvents: user, + OrgEvents: org, + View: view, + SystemDefaults: systemDefaults, + }, }, nil } diff --git a/internal/admin/repository/eventsourcing/view/external_idps.go b/internal/admin/repository/eventsourcing/view/external_idps.go index 103f4f76ef..de919a589a 100644 --- a/internal/admin/repository/eventsourcing/view/external_idps.go +++ b/internal/admin/repository/eventsourcing/view/external_idps.go @@ -56,6 +56,14 @@ func (v *View) DeleteExternalIDP(externalUserID, idpConfigID string, eventSequen return v.ProcessedExternalIDPSequence(eventSequence) } +func (v *View) DeleteExternalIDPsByUserID(userID string, eventSequence uint64) error { + err := view.DeleteExternalIDPsByUserID(v.Db, externalIDPTable, userID) + if err != nil { + return err + } + return v.ProcessedExternalIDPSequence(eventSequence) +} + func (v *View) GetLatestExternalIDPSequence() (*global_view.CurrentSequence, error) { return v.latestSequence(externalIDPTable) } diff --git a/internal/admin/repository/eventsourcing/view/iam_member.go b/internal/admin/repository/eventsourcing/view/iam_member.go index 99aa58ce35..2e27aa4182 100644 --- a/internal/admin/repository/eventsourcing/view/iam_member.go +++ b/internal/admin/repository/eventsourcing/view/iam_member.go @@ -48,6 +48,14 @@ func (v *View) DeleteIAMMember(iamID, userID string, eventSequence uint64) error return v.ProcessedIAMMemberSequence(eventSequence) } +func (v *View) DeleteIAMMembersByUserID(userID string, eventSequence uint64) error { + err := view.DeleteIAMMembersByUserID(v.Db, iamMemberTable, userID) + if err != nil { + return err + } + return v.ProcessedIAMMemberSequence(eventSequence) +} + func (v *View) GetLatestIAMMemberSequence() (*global_view.CurrentSequence, error) { return v.latestSequence(iamMemberTable) } diff --git a/internal/admin/repository/eventsourcing/view/label_policies.go b/internal/admin/repository/eventsourcing/view/label_policies.go new file mode 100644 index 0000000000..113859894f --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/label_policies.go @@ -0,0 +1,39 @@ +package view + +import ( + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + labelPolicyTable = "adminapi.label_policies" +) + +func (v *View) LabelPolicyByAggregateID(aggregateID string) (*model.LabelPolicyView, error) { + return view.GetLabelPolicyByAggregateID(v.Db, labelPolicyTable, aggregateID) +} + +func (v *View) PutLabelPolicy(policy *model.LabelPolicyView, sequence uint64) error { + err := view.PutLabelPolicy(v.Db, labelPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedLabelPolicySequence(sequence) +} + +func (v *View) GetLatestLabelPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(labelPolicyTable) +} + +func (v *View) ProcessedLabelPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(labelPolicyTable, eventSequence) +} + +func (v *View) GetLatestLabelPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(labelPolicyTable, sequence) +} + +func (v *View) ProcessedLabelPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/eventsourcing/view/org_iam_policy.go b/internal/admin/repository/eventsourcing/view/org_iam_policy.go new file mode 100644 index 0000000000..57196f7eaf --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/org_iam_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + orgIAMPolicyTable = "adminapi.org_iam_policies" +) + +func (v *View) OrgIAMPolicyByAggregateID(aggregateID string) (*model.OrgIAMPolicyView, error) { + return view.GetOrgIAMPolicyByAggregateID(v.Db, orgIAMPolicyTable, aggregateID) +} + +func (v *View) PutOrgIAMPolicy(policy *model.OrgIAMPolicyView, sequence uint64) error { + err := view.PutOrgIAMPolicy(v.Db, orgIAMPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedOrgIAMPolicySequence(sequence) +} + +func (v *View) DeleteOrgIAMPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeleteOrgIAMPolicy(v.Db, orgIAMPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedOrgIAMPolicySequence(eventSequence) +} + +func (v *View) GetLatestOrgIAMPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(orgIAMPolicyTable) +} + +func (v *View) ProcessedOrgIAMPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(orgIAMPolicyTable, eventSequence) +} + +func (v *View) GetLatestOrgIAMPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(orgIAMPolicyTable, sequence) +} + +func (v *View) ProcessedOrgIAMPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/eventsourcing/view/password_age_policy.go b/internal/admin/repository/eventsourcing/view/password_age_policy.go new file mode 100644 index 0000000000..915f2cb50d --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/password_age_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + passwordAgePolicyTable = "adminapi.password_age_policies" +) + +func (v *View) PasswordAgePolicyByAggregateID(aggregateID string) (*model.PasswordAgePolicyView, error) { + return view.GetPasswordAgePolicyByAggregateID(v.Db, passwordAgePolicyTable, aggregateID) +} + +func (v *View) PutPasswordAgePolicy(policy *model.PasswordAgePolicyView, sequence uint64) error { + err := view.PutPasswordAgePolicy(v.Db, passwordAgePolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedPasswordAgePolicySequence(sequence) +} + +func (v *View) DeletePasswordAgePolicy(aggregateID string, eventSequence uint64) error { + err := view.DeletePasswordAgePolicy(v.Db, passwordAgePolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedPasswordAgePolicySequence(eventSequence) +} + +func (v *View) GetLatestPasswordAgePolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordAgePolicyTable) +} + +func (v *View) ProcessedPasswordAgePolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(passwordAgePolicyTable, eventSequence) +} + +func (v *View) GetLatestPasswordAgePolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(passwordAgePolicyTable, sequence) +} + +func (v *View) ProcessedPasswordAgePolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/eventsourcing/view/password_complexity_policy.go b/internal/admin/repository/eventsourcing/view/password_complexity_policy.go new file mode 100644 index 0000000000..554a32ca0d --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/password_complexity_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + passwordComplexityPolicyTable = "adminapi.password_complexity_policies" +) + +func (v *View) PasswordComplexityPolicyByAggregateID(aggregateID string) (*model.PasswordComplexityPolicyView, error) { + return view.GetPasswordComplexityPolicyByAggregateID(v.Db, passwordComplexityPolicyTable, aggregateID) +} + +func (v *View) PutPasswordComplexityPolicy(policy *model.PasswordComplexityPolicyView, sequence uint64) error { + err := view.PutPasswordComplexityPolicy(v.Db, passwordComplexityPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedPasswordComplexityPolicySequence(sequence) +} + +func (v *View) DeletePasswordComplexityPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeletePasswordComplexityPolicy(v.Db, passwordComplexityPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedPasswordComplexityPolicySequence(eventSequence) +} + +func (v *View) GetLatestPasswordComplexityPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordComplexityPolicyTable) +} + +func (v *View) ProcessedPasswordComplexityPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(passwordComplexityPolicyTable, eventSequence) +} + +func (v *View) GetLatestPasswordComplexityPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(passwordComplexityPolicyTable, sequence) +} + +func (v *View) ProcessedPasswordComplexityPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/eventsourcing/view/password_lockout_policy.go b/internal/admin/repository/eventsourcing/view/password_lockout_policy.go new file mode 100644 index 0000000000..4ee6d38623 --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/password_lockout_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + passwordLockoutPolicyTable = "adminapi.password_lockout_policies" +) + +func (v *View) PasswordLockoutPolicyByAggregateID(aggregateID string) (*model.PasswordLockoutPolicyView, error) { + return view.GetPasswordLockoutPolicyByAggregateID(v.Db, passwordLockoutPolicyTable, aggregateID) +} + +func (v *View) PutPasswordLockoutPolicy(policy *model.PasswordLockoutPolicyView, sequence uint64) error { + err := view.PutPasswordLockoutPolicy(v.Db, passwordLockoutPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedPasswordLockoutPolicySequence(sequence) +} + +func (v *View) DeletePasswordLockoutPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeletePasswordLockoutPolicy(v.Db, passwordLockoutPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedPasswordLockoutPolicySequence(eventSequence) +} + +func (v *View) GetLatestPasswordLockoutPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordLockoutPolicyTable) +} + +func (v *View) ProcessedPasswordLockoutPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(passwordLockoutPolicyTable, eventSequence) +} + +func (v *View) GetLatestPasswordLockoutPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(passwordLockoutPolicyTable, sequence) +} + +func (v *View) ProcessedPasswordLockoutPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/iam.go b/internal/admin/repository/iam.go index c01c2d0fd9..a91181f7fc 100644 --- a/internal/admin/repository/iam.go +++ b/internal/admin/repository/iam.go @@ -2,6 +2,7 @@ package repository import ( "context" + iam_model "github.com/caos/zitadel/internal/iam/model" ) @@ -28,4 +29,23 @@ type IAMRepository interface { SearchDefaultIDPProviders(ctx context.Context, request *iam_model.IDPProviderSearchRequest) (*iam_model.IDPProviderSearchResponse, error) AddIDPProviderToLoginPolicy(ctx context.Context, provider *iam_model.IDPProvider) (*iam_model.IDPProvider, error) RemoveIDPProviderFromLoginPolicy(ctx context.Context, provider *iam_model.IDPProvider) error + GetDefaultLabelPolicy(ctx context.Context) (*iam_model.LabelPolicyView, error) + AddDefaultLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) + ChangeDefaultLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) + + GetDefaultPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) + AddDefaultPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) + ChangeDefaultPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) + + GetDefaultPasswordAgePolicy(ctx context.Context) (*iam_model.PasswordAgePolicyView, error) + AddDefaultPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) + ChangeDefaultPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) + + GetDefaultPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) + AddDefaultPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) + ChangeDefaultPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) + + GetDefaultOrgIAMPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) + AddDefaultOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) + ChangeDefaultOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) } diff --git a/internal/admin/repository/org.go b/internal/admin/repository/org.go index 8849d2b03b..e41038dd1b 100644 --- a/internal/admin/repository/org.go +++ b/internal/admin/repository/org.go @@ -2,6 +2,7 @@ package repository import ( "context" + iam_model "github.com/caos/zitadel/internal/iam/model" admin_model "github.com/caos/zitadel/internal/admin/model" org_model "github.com/caos/zitadel/internal/org/model" @@ -13,8 +14,9 @@ type OrgRepository interface { OrgByID(ctx context.Context, id string) (*org_model.Org, error) SearchOrgs(ctx context.Context, query *org_model.OrgSearchRequest) (*org_model.OrgSearchResult, error) - GetOrgIamPolicyByID(ctx context.Context, id string) (*org_model.OrgIAMPolicy, error) - CreateOrgIamPolicy(ctx context.Context, policy *org_model.OrgIAMPolicy) (*org_model.OrgIAMPolicy, error) - ChangeOrgIamPolicy(ctx context.Context, policy *org_model.OrgIAMPolicy) (*org_model.OrgIAMPolicy, error) - RemoveOrgIamPolicy(ctx context.Context, id string) error + GetOrgIAMPolicyByID(ctx context.Context, id string) (*iam_model.OrgIAMPolicyView, error) + GetDefaultOrgIAMPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) + CreateOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) + ChangeOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) + RemoveOrgIAMPolicy(ctx context.Context, id string) error } diff --git a/internal/api/api.go b/internal/api/api.go index cfcb9727db..715d54d83f 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -77,10 +77,10 @@ func (a *API) healthHandler() http.Handler { if err != nil && !errors.IsNotFound(err) { return errors.ThrowPreconditionFailed(err, "API-dsgT2", "IAM SETUP CHECK FAILED") } - if iam == nil || !iam.SetUpStarted { + if iam == nil || iam.SetUpStarted < iam_model.StepCount-1 { return errors.ThrowPreconditionFailed(nil, "API-HBfs3", "IAM NOT SET UP") } - if !iam.SetUpDone { + if iam.SetUpDone < iam_model.StepCount-1 { return errors.ThrowPreconditionFailed(nil, "API-DASs2", "IAM SETUP RUNNING") } return nil @@ -103,20 +103,20 @@ func handleReadiness(checks []ValidationFunction) func(w http.ResponseWriter, r return func(w http.ResponseWriter, r *http.Request) { err := validate(r.Context(), checks) if err == nil { - http_util.MarshalJSON(w, "ok") + http_util.MarshalJSON(w, "ok", nil, http.StatusOK) return } - http_util.MarshalJSON(w, err) + http_util.MarshalJSON(w, nil, err, http.StatusPreconditionFailed) } } func (a *API) handleClientID(w http.ResponseWriter, r *http.Request) { id, err := a.health.VerifierClientID(r.Context(), "Zitadel Console") if err != nil { - http_util.MarshalJSON(w, err) + http_util.MarshalJSON(w, nil, err, http.StatusPreconditionFailed) return } - http_util.MarshalJSON(w, id) + http_util.MarshalJSON(w, id, nil, http.StatusOK) } type ValidationFunction func(ctx context.Context) error diff --git a/internal/api/authz/authorization.go b/internal/api/authz/authorization.go index 13b1a176b1..740bff3431 100644 --- a/internal/api/authz/authorization.go +++ b/internal/api/authz/authorization.go @@ -7,14 +7,18 @@ import ( "strings" "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/tracing" ) const ( authenticated = "authenticated" ) -func CheckUserAuthorization(ctx context.Context, req interface{}, token, orgID string, verifier *TokenVerifier, authConfig Config, requiredAuthOption Option, method string) (context.Context, error) { - ctx, err := VerifyTokenAndWriteCtxData(ctx, token, orgID, verifier, method) +func CheckUserAuthorization(ctx context.Context, req interface{}, token, orgID string, verifier *TokenVerifier, authConfig Config, requiredAuthOption Option, method string) (_ context.Context, err error) { + ctx, span := tracing.NewServerInterceptorSpan(ctx) + defer func() { span.EndWithError(err) }() + + ctx, err = VerifyTokenAndWriteCtxData(ctx, token, orgID, verifier, method) if err != nil { return nil, err } @@ -29,7 +33,9 @@ func CheckUserAuthorization(ctx context.Context, req interface{}, token, orgID s return nil, err } + ctx, userPermissionSpan := tracing.NewNamedSpan(ctx, "checkUserPermissions") err = checkUserPermissions(req, perms, requiredAuthOption) + userPermissionSpan.EndWithError(err) if err != nil { return nil, err } diff --git a/internal/api/authz/context.go b/internal/api/authz/context.go index 515b086323..576fe2c13a 100644 --- a/internal/api/authz/context.go +++ b/internal/api/authz/context.go @@ -6,6 +6,7 @@ import ( "github.com/caos/zitadel/internal/api/grpc" http_util "github.com/caos/zitadel/internal/api/http" "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/tracing" ) type key int @@ -36,6 +37,9 @@ type Grant struct { } func VerifyTokenAndWriteCtxData(ctx context.Context, token, orgID string, t *TokenVerifier, method string) (_ context.Context, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + if orgID != "" { err = t.ExistsOrg(ctx, orgID) if err != nil { diff --git a/internal/api/authz/permissions.go b/internal/api/authz/permissions.go index cb1bf2da0a..6147deeac9 100644 --- a/internal/api/authz/permissions.go +++ b/internal/api/authz/permissions.go @@ -4,9 +4,13 @@ import ( "context" "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/tracing" ) -func getUserMethodPermissions(ctx context.Context, t *TokenVerifier, requiredPerm string, authConfig Config) (context.Context, []string, error) { +func getUserMethodPermissions(ctx context.Context, t *TokenVerifier, requiredPerm string, authConfig Config) (_ context.Context, _ []string, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + ctxData := GetCtxData(ctx) if ctxData.IsZero() { return nil, nil, errors.ThrowUnauthenticated(nil, "AUTH-rKLWEH", "context missing") diff --git a/internal/api/authz/token.go b/internal/api/authz/token.go index 277ff7379b..a646cdb8ef 100644 --- a/internal/api/authz/token.go +++ b/internal/api/authz/token.go @@ -6,6 +6,7 @@ import ( "sync" caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/tracing" ) const ( @@ -62,7 +63,10 @@ func prefixFromMethod(method string) (string, bool) { return parts[1], true } -func (v *TokenVerifier) clientIDFromMethod(ctx context.Context, method string) (string, error) { +func (v *TokenVerifier) clientIDFromMethod(ctx context.Context, method string) (_ string, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + prefix, ok := prefixFromMethod(method) if !ok { return "", caos_errs.ThrowPermissionDenied(nil, "AUTHZ-GRD2Q", "Errors.Internal") @@ -71,7 +75,6 @@ func (v *TokenVerifier) clientIDFromMethod(ctx context.Context, method string) ( if !ok { return "", caos_errs.ThrowPermissionDenied(nil, "AUTHZ-G2qrh", "Errors.Internal") } - var err error c := app.(*client) if c.id != "" { return c.id, nil @@ -84,15 +87,22 @@ func (v *TokenVerifier) clientIDFromMethod(ctx context.Context, method string) ( return c.id, nil } -func (v *TokenVerifier) ResolveGrant(ctx context.Context) (*Grant, error) { +func (v *TokenVerifier) ResolveGrant(ctx context.Context) (_ *Grant, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() return v.authZRepo.ResolveGrants(ctx) } -func (v *TokenVerifier) ProjectIDAndOriginsByClientID(ctx context.Context, clientID string) (string, []string, error) { +func (v *TokenVerifier) ProjectIDAndOriginsByClientID(ctx context.Context, clientID string) (_ string, _ []string, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + return v.authZRepo.ProjectIDAndOriginsByClientID(ctx, clientID) } -func (v *TokenVerifier) ExistsOrg(ctx context.Context, orgID string) error { +func (v *TokenVerifier) ExistsOrg(ctx context.Context, orgID string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() return v.authZRepo.ExistsOrg(ctx, orgID) } @@ -102,6 +112,9 @@ func (v *TokenVerifier) CheckAuthMethod(method string) (Option, bool) { } func verifyAccessToken(ctx context.Context, token string, t *TokenVerifier, method string) (userID, clientID, agentID, prefLang string, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + parts := strings.Split(token, BearerPrefix) if len(parts) != 2 { return "", "", "", "", caos_errs.ThrowUnauthenticated(nil, "AUTH-7fs1e", "invalid auth header") diff --git a/internal/api/grpc/admin/idp_config_converter.go b/internal/api/grpc/admin/idp_config_converter.go index f387a0fa84..9539a05609 100644 --- a/internal/api/grpc/admin/idp_config_converter.go +++ b/internal/api/grpc/admin/idp_config_converter.go @@ -9,9 +9,9 @@ import ( func createOidcIdpToModel(idp *admin.OidcIdpConfigCreate) *iam_model.IDPConfig { return &iam_model.IDPConfig{ - Name: idp.Name, - LogoSrc: idp.LogoSrc, - Type: iam_model.IDPConfigTypeOIDC, + Name: idp.Name, + StylingType: idpConfigStylingTypeToModel(idp.StylingType), + Type: iam_model.IDPConfigTypeOIDC, OIDCConfig: &iam_model.OIDCIDPConfig{ ClientID: idp.ClientId, ClientSecretString: idp.ClientSecret, @@ -27,7 +27,7 @@ func updateIdpToModel(idp *admin.IdpUpdate) *iam_model.IDPConfig { return &iam_model.IDPConfig{ IDPConfigID: idp.Id, Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: idpConfigStylingTypeToModel(idp.StylingType), } } @@ -56,7 +56,7 @@ func idpFromModel(idp *iam_model.IDPConfig) *admin.Idp { ChangeDate: changeDate, Sequence: idp.Sequence, Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: idpConfigStylingTypeFromModel(idp.StylingType), State: idpConfigStateFromModel(idp.State), IdpConfig: idpConfigFromModel(idp), } @@ -75,7 +75,7 @@ func idpViewFromModel(idp *iam_model.IDPConfigView) *admin.IdpView { ChangeDate: changeDate, Sequence: idp.Sequence, Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: idpConfigStylingTypeFromModel(idp.StylingType), State: idpConfigStateFromModel(idp.State), IdpConfigView: idpConfigViewFromModel(idp), } @@ -206,3 +206,21 @@ func idpConfigsFromView(viewIdps []*iam_model.IDPConfigView) []*admin.IdpView { } return idps } + +func idpConfigStylingTypeFromModel(stylingType iam_model.IDPStylingType) admin.IdpStylingType { + switch stylingType { + case iam_model.IDPStylingTypeGoogle: + return admin.IdpStylingType_IDPSTYLINGTYPE_GOOGLE + default: + return admin.IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED + } +} + +func idpConfigStylingTypeToModel(stylingType admin.IdpStylingType) iam_model.IDPStylingType { + switch stylingType { + case admin.IdpStylingType_IDPSTYLINGTYPE_GOOGLE: + return iam_model.IDPStylingTypeGoogle + default: + return iam_model.IDPStylingTypeUnspecified + } +} diff --git a/internal/api/grpc/admin/label_policy.go b/internal/api/grpc/admin/label_policy.go new file mode 100644 index 0000000000..1d1befa260 --- /dev/null +++ b/internal/api/grpc/admin/label_policy.go @@ -0,0 +1,24 @@ +package admin + +import ( + "context" + + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetDefaultLabelPolicy(ctx context.Context, _ *empty.Empty) (*admin.DefaultLabelPolicyView, error) { + result, err := s.iam.GetDefaultLabelPolicy(ctx) + if err != nil { + return nil, err + } + return labelPolicyViewFromModel(result), nil +} + +func (s *Server) UpdateDefaultLabelPolicy(ctx context.Context, policy *admin.DefaultLabelPolicyUpdate) (*admin.DefaultLabelPolicy, error) { + result, err := s.iam.ChangeDefaultLabelPolicy(ctx, labelPolicyToModel(policy)) + if err != nil { + return nil, err + } + return labelPolicyFromModel(result), nil +} diff --git a/internal/api/grpc/admin/label_policy_converter.go b/internal/api/grpc/admin/label_policy_converter.go new file mode 100644 index 0000000000..a5e0f09745 --- /dev/null +++ b/internal/api/grpc/admin/label_policy_converter.go @@ -0,0 +1,45 @@ +package admin + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes" +) + +func labelPolicyToModel(policy *admin.DefaultLabelPolicyUpdate) *iam_model.LabelPolicy { + return &iam_model.LabelPolicy{ + PrimaryColor: policy.PrimaryColor, + SecondaryColor: policy.SecondaryColor, + } +} + +func labelPolicyFromModel(policy *iam_model.LabelPolicy) *admin.DefaultLabelPolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("ADMIN-QwQG9").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("ADMIN-mAgcI").OnError(err).Debug("date parse failed") + + return &admin.DefaultLabelPolicy{ + PrimaryColor: policy.PrimaryColor, + SecondaryColor: policy.SecondaryColor, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func labelPolicyViewFromModel(policy *iam_model.LabelPolicyView) *admin.DefaultLabelPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("ADMIN-zMnlF").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("ADMIN-Vhvfp").OnError(err).Debug("date parse failed") + + return &admin.DefaultLabelPolicyView{ + PrimaryColor: policy.PrimaryColor, + SecondaryColor: policy.SecondaryColor, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/admin/login_policy.go b/internal/api/grpc/admin/login_policy.go index e75ef530d7..e8de00b935 100644 --- a/internal/api/grpc/admin/login_policy.go +++ b/internal/api/grpc/admin/login_policy.go @@ -14,7 +14,7 @@ func (s *Server) GetDefaultLoginPolicy(ctx context.Context, _ *empty.Empty) (*ad return loginPolicyViewFromModel(result), nil } -func (s *Server) UpdateDefaultLoginPolicy(ctx context.Context, policy *admin.DefaultLoginPolicy) (*admin.DefaultLoginPolicy, error) { +func (s *Server) UpdateDefaultLoginPolicy(ctx context.Context, policy *admin.DefaultLoginPolicyRequest) (*admin.DefaultLoginPolicy, error) { result, err := s.iam.ChangeDefaultLoginPolicy(ctx, loginPolicyToModel(policy)) if err != nil { return nil, err diff --git a/internal/api/grpc/admin/login_policy_converter.go b/internal/api/grpc/admin/login_policy_converter.go index aba3ce1f07..1027cebefb 100644 --- a/internal/api/grpc/admin/login_policy_converter.go +++ b/internal/api/grpc/admin/login_policy_converter.go @@ -1,11 +1,13 @@ package admin import ( + "github.com/caos/logging" iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes" ) -func loginPolicyToModel(policy *admin.DefaultLoginPolicy) *iam_model.LoginPolicy { +func loginPolicyToModel(policy *admin.DefaultLoginPolicyRequest) *iam_model.LoginPolicy { return &iam_model.LoginPolicy{ AllowUsernamePassword: policy.AllowUsernamePassword, AllowExternalIdp: policy.AllowExternalIdp, @@ -14,18 +16,34 @@ func loginPolicyToModel(policy *admin.DefaultLoginPolicy) *iam_model.LoginPolicy } func loginPolicyFromModel(policy *iam_model.LoginPolicy) *admin.DefaultLoginPolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-3Fsm9").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-5Gsko").OnError(err).Debug("date parse failed") + return &admin.DefaultLoginPolicy{ AllowUsernamePassword: policy.AllowUsernamePassword, AllowExternalIdp: policy.AllowExternalIdp, AllowRegister: policy.AllowRegister, + CreationDate: creationDate, + ChangeDate: changeDate, } } func loginPolicyViewFromModel(policy *iam_model.LoginPolicyView) *admin.DefaultLoginPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-3Gk9s").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-6Jlos").OnError(err).Debug("date parse failed") + return &admin.DefaultLoginPolicyView{ AllowUsernamePassword: policy.AllowUsernamePassword, AllowExternalIdp: policy.AllowExternalIDP, AllowRegister: policy.AllowRegister, + CreationDate: creationDate, + ChangeDate: changeDate, } } diff --git a/internal/api/grpc/admin/org.go b/internal/api/grpc/admin/org.go index ce2ea1b2c8..936cec13a7 100644 --- a/internal/api/grpc/admin/org.go +++ b/internal/api/grpc/admin/org.go @@ -38,31 +38,47 @@ func (s *Server) SetUpOrg(ctx context.Context, orgSetUp *admin.OrgSetUpRequest) return setUpOrgResponseFromModel(setUp), err } -func (s *Server) GetOrgIamPolicy(ctx context.Context, in *admin.OrgIamPolicyID) (_ *admin.OrgIamPolicy, err error) { - policy, err := s.org.GetOrgIamPolicyByID(ctx, in.OrgId) +func (s *Server) GetDefaultOrgIamPolicy(ctx context.Context, _ *empty.Empty) (_ *admin.OrgIamPolicyView, err error) { + policy, err := s.iam.GetDefaultOrgIAMPolicy(ctx) if err != nil { return nil, err } - return orgIamPolicyFromModel(policy), err + return orgIAMPolicyViewFromModel(policy), err +} + +func (s *Server) UpdateDefaultOrgIamPolicy(ctx context.Context, in *admin.OrgIamPolicyRequest) (_ *admin.OrgIamPolicy, err error) { + policy, err := s.iam.ChangeDefaultOrgIAMPolicy(ctx, orgIAMPolicyRequestToModel(in)) + if err != nil { + return nil, err + } + return orgIAMPolicyFromModel(policy), err +} + +func (s *Server) GetOrgIamPolicy(ctx context.Context, in *admin.OrgIamPolicyID) (_ *admin.OrgIamPolicyView, err error) { + policy, err := s.org.GetOrgIAMPolicyByID(ctx, in.OrgId) + if err != nil { + return nil, err + } + return orgIAMPolicyViewFromModel(policy), err } func (s *Server) CreateOrgIamPolicy(ctx context.Context, in *admin.OrgIamPolicyRequest) (_ *admin.OrgIamPolicy, err error) { - policy, err := s.org.CreateOrgIamPolicy(ctx, orgIamPolicyRequestToModel(in)) + policy, err := s.org.CreateOrgIAMPolicy(ctx, orgIAMPolicyRequestToModel(in)) if err != nil { return nil, err } - return orgIamPolicyFromModel(policy), err + return orgIAMPolicyFromModel(policy), err } func (s *Server) UpdateOrgIamPolicy(ctx context.Context, in *admin.OrgIamPolicyRequest) (_ *admin.OrgIamPolicy, err error) { - policy, err := s.org.ChangeOrgIamPolicy(ctx, orgIamPolicyRequestToModel(in)) + policy, err := s.org.ChangeOrgIAMPolicy(ctx, orgIAMPolicyRequestToModel(in)) if err != nil { return nil, err } - return orgIamPolicyFromModel(policy), err + return orgIAMPolicyFromModel(policy), err } -func (s *Server) DeleteOrgIamPolicy(ctx context.Context, in *admin.OrgIamPolicyID) (_ *empty.Empty, err error) { - err = s.org.RemoveOrgIamPolicy(ctx, in.OrgId) +func (s *Server) RemoveOrgIamPolicy(ctx context.Context, in *admin.OrgIamPolicyID) (_ *empty.Empty, err error) { + err = s.org.RemoveOrgIAMPolicy(ctx, in.OrgId) return &empty.Empty{}, err } diff --git a/internal/api/grpc/admin/org_converter.go b/internal/api/grpc/admin/org_converter.go index 7b88bf1d1f..9d157227b9 100644 --- a/internal/api/grpc/admin/org_converter.go +++ b/internal/api/grpc/admin/org_converter.go @@ -2,6 +2,7 @@ package admin import ( "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/golang/protobuf/ptypes" admin_model "github.com/caos/zitadel/internal/admin/model" @@ -196,7 +197,7 @@ func orgQueryMethodToModel(method admin.OrgSearchMethod) model.SearchMethod { } } -func orgIamPolicyFromModel(policy *org_model.OrgIAMPolicy) *admin.OrgIamPolicy { +func orgIAMPolicyFromModel(policy *iam_model.OrgIAMPolicy) *admin.OrgIamPolicy { creationDate, err := ptypes.TimestampProto(policy.CreationDate) logging.Log("GRPC-ush36").OnError(err).Debug("unable to get timestamp from time") @@ -205,20 +206,32 @@ func orgIamPolicyFromModel(policy *org_model.OrgIAMPolicy) *admin.OrgIamPolicy { return &admin.OrgIamPolicy{ OrgId: policy.AggregateID, - Description: policy.Description, UserLoginMustBeDomain: policy.UserLoginMustBeDomain, - Default: policy.Default, CreationDate: creationDate, ChangeDate: changeDate, } } -func orgIamPolicyRequestToModel(policy *admin.OrgIamPolicyRequest) *org_model.OrgIAMPolicy { - return &org_model.OrgIAMPolicy{ +func orgIAMPolicyViewFromModel(policy *iam_model.OrgIAMPolicyView) *admin.OrgIamPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-ush36").OnError(err).Debug("unable to get timestamp from time") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-Ps9fW").OnError(err).Debug("unable to get timestamp from time") + + return &admin.OrgIamPolicyView{ + OrgId: policy.AggregateID, + UserLoginMustBeDomain: policy.UserLoginMustBeDomain, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func orgIAMPolicyRequestToModel(policy *admin.OrgIamPolicyRequest) *iam_model.OrgIAMPolicy { + return &iam_model.OrgIAMPolicy{ ObjectRoot: models.ObjectRoot{ AggregateID: policy.OrgId, }, - Description: policy.Description, UserLoginMustBeDomain: policy.UserLoginMustBeDomain, } } diff --git a/internal/api/grpc/admin/password_age_policy.go b/internal/api/grpc/admin/password_age_policy.go new file mode 100644 index 0000000000..1656b0f27a --- /dev/null +++ b/internal/api/grpc/admin/password_age_policy.go @@ -0,0 +1,23 @@ +package admin + +import ( + "context" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetDefaultPasswordAgePolicy(ctx context.Context, _ *empty.Empty) (*admin.DefaultPasswordAgePolicyView, error) { + result, err := s.iam.GetDefaultPasswordAgePolicy(ctx) + if err != nil { + return nil, err + } + return passwordAgePolicyViewFromModel(result), nil +} + +func (s *Server) UpdateDefaultPasswordAgePolicy(ctx context.Context, policy *admin.DefaultPasswordAgePolicyRequest) (*admin.DefaultPasswordAgePolicy, error) { + result, err := s.iam.ChangeDefaultPasswordAgePolicy(ctx, passwordAgePolicyToModel(policy)) + if err != nil { + return nil, err + } + return passwordAgePolicyFromModel(result), nil +} diff --git a/internal/api/grpc/admin/password_age_policy_converter.go b/internal/api/grpc/admin/password_age_policy_converter.go new file mode 100644 index 0000000000..44e413b25e --- /dev/null +++ b/internal/api/grpc/admin/password_age_policy_converter.go @@ -0,0 +1,45 @@ +package admin + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes" +) + +func passwordAgePolicyToModel(policy *admin.DefaultPasswordAgePolicyRequest) *iam_model.PasswordAgePolicy { + return &iam_model.PasswordAgePolicy{ + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + } +} + +func passwordAgePolicyFromModel(policy *iam_model.PasswordAgePolicy) *admin.DefaultPasswordAgePolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-mH9os").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-3tGs9").OnError(err).Debug("date parse failed") + + return &admin.DefaultPasswordAgePolicy{ + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func passwordAgePolicyViewFromModel(policy *iam_model.PasswordAgePolicyView) *admin.DefaultPasswordAgePolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-2Gs9o").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-8Hjss").OnError(err).Debug("date parse failed") + + return &admin.DefaultPasswordAgePolicyView{ + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/admin/password_complexity_policy.go b/internal/api/grpc/admin/password_complexity_policy.go new file mode 100644 index 0000000000..7b4bb8901e --- /dev/null +++ b/internal/api/grpc/admin/password_complexity_policy.go @@ -0,0 +1,23 @@ +package admin + +import ( + "context" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetDefaultPasswordComplexityPolicy(ctx context.Context, _ *empty.Empty) (*admin.DefaultPasswordComplexityPolicyView, error) { + result, err := s.iam.GetDefaultPasswordComplexityPolicy(ctx) + if err != nil { + return nil, err + } + return passwordComplexityPolicyViewFromModel(result), nil +} + +func (s *Server) UpdateDefaultPasswordComplexityPolicy(ctx context.Context, policy *admin.DefaultPasswordComplexityPolicyRequest) (*admin.DefaultPasswordComplexityPolicy, error) { + result, err := s.iam.ChangeDefaultPasswordComplexityPolicy(ctx, passwordComplexityPolicyToModel(policy)) + if err != nil { + return nil, err + } + return passwordComplexityPolicyFromModel(result), nil +} diff --git a/internal/api/grpc/admin/password_complexity_policy_converter.go b/internal/api/grpc/admin/password_complexity_policy_converter.go new file mode 100644 index 0000000000..7cf538af85 --- /dev/null +++ b/internal/api/grpc/admin/password_complexity_policy_converter.go @@ -0,0 +1,54 @@ +package admin + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes" +) + +func passwordComplexityPolicyToModel(policy *admin.DefaultPasswordComplexityPolicyRequest) *iam_model.PasswordComplexityPolicy { + return &iam_model.PasswordComplexityPolicy{ + MinLength: policy.MinLength, + HasUppercase: policy.HasUppercase, + HasLowercase: policy.HasLowercase, + HasNumber: policy.HasNumber, + HasSymbol: policy.HasSymbol, + } +} + +func passwordComplexityPolicyFromModel(policy *iam_model.PasswordComplexityPolicy) *admin.DefaultPasswordComplexityPolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-6Zhs9").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-bMso0").OnError(err).Debug("date parse failed") + + return &admin.DefaultPasswordComplexityPolicy{ + MinLength: policy.MinLength, + HasUppercase: policy.HasUppercase, + HasLowercase: policy.HasLowercase, + HasNumber: policy.HasNumber, + HasSymbol: policy.HasSymbol, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func passwordComplexityPolicyViewFromModel(policy *iam_model.PasswordComplexityPolicyView) *admin.DefaultPasswordComplexityPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-rTs9f").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-ks9Zt").OnError(err).Debug("date parse failed") + + return &admin.DefaultPasswordComplexityPolicyView{ + MinLength: policy.MinLength, + HasUppercase: policy.HasUppercase, + HasLowercase: policy.HasLowercase, + HasNumber: policy.HasNumber, + HasSymbol: policy.HasSymbol, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/admin/password_lockout_policy.go b/internal/api/grpc/admin/password_lockout_policy.go new file mode 100644 index 0000000000..6bffb269ea --- /dev/null +++ b/internal/api/grpc/admin/password_lockout_policy.go @@ -0,0 +1,23 @@ +package admin + +import ( + "context" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetDefaultPasswordLockoutPolicy(ctx context.Context, _ *empty.Empty) (*admin.DefaultPasswordLockoutPolicyView, error) { + result, err := s.iam.GetDefaultPasswordLockoutPolicy(ctx) + if err != nil { + return nil, err + } + return passwordLockoutPolicyViewFromModel(result), nil +} + +func (s *Server) UpdateDefaultPasswordLockoutPolicy(ctx context.Context, policy *admin.DefaultPasswordLockoutPolicyRequest) (*admin.DefaultPasswordLockoutPolicy, error) { + result, err := s.iam.ChangeDefaultPasswordLockoutPolicy(ctx, passwordLockoutPolicyToModel(policy)) + if err != nil { + return nil, err + } + return passwordLockoutPolicyFromModel(result), nil +} diff --git a/internal/api/grpc/admin/password_lockout_policy_converter.go b/internal/api/grpc/admin/password_lockout_policy_converter.go new file mode 100644 index 0000000000..ad0cb7fb97 --- /dev/null +++ b/internal/api/grpc/admin/password_lockout_policy_converter.go @@ -0,0 +1,45 @@ +package admin + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes" +) + +func passwordLockoutPolicyToModel(policy *admin.DefaultPasswordLockoutPolicyRequest) *iam_model.PasswordLockoutPolicy { + return &iam_model.PasswordLockoutPolicy{ + MaxAttempts: policy.MaxAttempts, + ShowLockOutFailures: policy.ShowLockoutFailure, + } +} + +func passwordLockoutPolicyFromModel(policy *iam_model.PasswordLockoutPolicy) *admin.DefaultPasswordLockoutPolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-4Gsm9f").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-3Gms9").OnError(err).Debug("date parse failed") + + return &admin.DefaultPasswordLockoutPolicy{ + MaxAttempts: policy.MaxAttempts, + ShowLockoutFailure: policy.ShowLockOutFailures, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func passwordLockoutPolicyViewFromModel(policy *iam_model.PasswordLockoutPolicyView) *admin.DefaultPasswordLockoutPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-7Hmlo").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-0oLgs").OnError(err).Debug("date parse failed") + + return &admin.DefaultPasswordLockoutPolicyView{ + MaxAttempts: policy.MaxAttempts, + ShowLockoutFailure: policy.ShowLockOutFailures, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/auth/policy_complexity_converter.go b/internal/api/grpc/auth/policy_complexity_converter.go index 60881e0de5..875f506872 100644 --- a/internal/api/grpc/auth/policy_complexity_converter.go +++ b/internal/api/grpc/auth/policy_complexity_converter.go @@ -2,13 +2,13 @@ package auth import ( "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/golang/protobuf/ptypes" - "github.com/caos/zitadel/internal/policy/model" "github.com/caos/zitadel/pkg/grpc/auth" ) -func passwordComplexityPolicyFromModel(policy *model.PasswordComplexityPolicy) *auth.PasswordComplexityPolicy { +func passwordComplexityPolicyFromModel(policy *iam_model.PasswordComplexityPolicyView) *auth.PasswordComplexityPolicy { creationDate, err := ptypes.TimestampProto(policy.CreationDate) logging.Log("GRPC-Lsi3d").OnError(err).Debug("unable to parse timestamp") @@ -19,7 +19,6 @@ func passwordComplexityPolicyFromModel(policy *model.PasswordComplexityPolicy) * Id: policy.AggregateID, CreationDate: creationDate, ChangeDate: changeDate, - Description: policy.Description, Sequence: policy.Sequence, MinLength: policy.MinLength, HasLowercase: policy.HasLowercase, diff --git a/internal/api/grpc/client/middleware/tracing.go b/internal/api/grpc/client/middleware/tracing.go index 42edbd14d2..e4e93b0e50 100644 --- a/internal/api/grpc/client/middleware/tracing.go +++ b/internal/api/grpc/client/middleware/tracing.go @@ -9,7 +9,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/stats" - "github.com/caos/zitadel/internal/api/http" + grpc_utils "github.com/caos/zitadel/internal/api/grpc" "github.com/caos/zitadel/internal/tracing" ) @@ -29,7 +29,7 @@ func TracingStatsClient(ignoredMethods ...GRPCMethod) grpc.DialOption { } func DefaultTracingStatsClient() grpc.DialOption { - return TracingStatsClient(http.Healthz, http.Readiness, http.Validation) + return TracingStatsClient(grpc_utils.Healthz, grpc_utils.Readiness, grpc_utils.Validation) } type tracingClientHandler struct { diff --git a/internal/api/grpc/errors/caos_errors.go b/internal/api/grpc/errors/caos_errors.go index 10f4fd3cff..53fd4367a9 100644 --- a/internal/api/grpc/errors/caos_errors.go +++ b/internal/api/grpc/errors/caos_errors.go @@ -30,6 +30,9 @@ func CaosToGRPCError(ctx context.Context, err error) error { } func ExtractCaosError(err error) (c codes.Code, msg, id string, ok bool) { + if err == nil { + return codes.OK, "", "", false + } switch caosErr := err.(type) { case *caos_errs.AlreadyExistsError: return codes.AlreadyExists, caosErr.GetMessage(), caosErr.GetID(), true diff --git a/internal/api/grpc/management/application_converter.go b/internal/api/grpc/management/application_converter.go index 8b063cd01d..07c4542107 100644 --- a/internal/api/grpc/management/application_converter.go +++ b/internal/api/grpc/management/application_converter.go @@ -44,34 +44,40 @@ func appConfigFromModel(app *proj_model.Application) management.AppConfig { func oidcConfigFromModel(config *proj_model.OIDCConfig) *management.OIDCConfig { return &management.OIDCConfig{ - RedirectUris: config.RedirectUris, - ResponseTypes: oidcResponseTypesFromModel(config.ResponseTypes), - GrantTypes: oidcGrantTypesFromModel(config.GrantTypes), - ApplicationType: oidcApplicationTypeFromModel(config.ApplicationType), - ClientId: config.ClientID, - ClientSecret: config.ClientSecretString, - AuthMethodType: oidcAuthMethodTypeFromModel(config.AuthMethodType), - PostLogoutRedirectUris: config.PostLogoutRedirectUris, - Version: oidcVersionFromModel(config.OIDCVersion), - NoneCompliant: config.Compliance.NoneCompliant, - ComplianceProblems: complianceProblemsToLocalizedMessages(config.Compliance.Problems), - DevMode: config.DevMode, + RedirectUris: config.RedirectUris, + ResponseTypes: oidcResponseTypesFromModel(config.ResponseTypes), + GrantTypes: oidcGrantTypesFromModel(config.GrantTypes), + ApplicationType: oidcApplicationTypeFromModel(config.ApplicationType), + ClientId: config.ClientID, + ClientSecret: config.ClientSecretString, + AuthMethodType: oidcAuthMethodTypeFromModel(config.AuthMethodType), + PostLogoutRedirectUris: config.PostLogoutRedirectUris, + Version: oidcVersionFromModel(config.OIDCVersion), + NoneCompliant: config.Compliance.NoneCompliant, + ComplianceProblems: complianceProblemsToLocalizedMessages(config.Compliance.Problems), + DevMode: config.DevMode, + AccessTokenType: oidcTokenTypeFromModel(config.AccessTokenType), + AccessTokenRoleAssertion: config.AccessTokenRoleAssertion, + IdTokenRoleAssertion: config.IDTokenRoleAssertion, } } func oidcConfigFromApplicationViewModel(app *proj_model.ApplicationView) *management.OIDCConfig { return &management.OIDCConfig{ - RedirectUris: app.OIDCRedirectUris, - ResponseTypes: oidcResponseTypesFromModel(app.OIDCResponseTypes), - GrantTypes: oidcGrantTypesFromModel(app.OIDCGrantTypes), - ApplicationType: oidcApplicationTypeFromModel(app.OIDCApplicationType), - ClientId: app.OIDCClientID, - AuthMethodType: oidcAuthMethodTypeFromModel(app.OIDCAuthMethodType), - PostLogoutRedirectUris: app.OIDCPostLogoutRedirectUris, - Version: oidcVersionFromModel(app.OIDCVersion), - NoneCompliant: app.NoneCompliant, - ComplianceProblems: complianceProblemsToLocalizedMessages(app.ComplianceProblems), - DevMode: app.DevMode, + RedirectUris: app.OIDCRedirectUris, + ResponseTypes: oidcResponseTypesFromModel(app.OIDCResponseTypes), + GrantTypes: oidcGrantTypesFromModel(app.OIDCGrantTypes), + ApplicationType: oidcApplicationTypeFromModel(app.OIDCApplicationType), + ClientId: app.OIDCClientID, + AuthMethodType: oidcAuthMethodTypeFromModel(app.OIDCAuthMethodType), + PostLogoutRedirectUris: app.OIDCPostLogoutRedirectUris, + Version: oidcVersionFromModel(app.OIDCVersion), + NoneCompliant: app.NoneCompliant, + ComplianceProblems: complianceProblemsToLocalizedMessages(app.ComplianceProblems), + DevMode: app.DevMode, + AccessTokenType: oidcTokenTypeFromModel(app.AccessTokenType), + AccessTokenRoleAssertion: app.AccessTokenRoleAssertion, + IdTokenRoleAssertion: app.IDTokenRoleAssertion, } } @@ -92,14 +98,17 @@ func oidcAppCreateToModel(app *management.OIDCApplicationCreate) *proj_model.App Name: app.Name, Type: proj_model.AppTypeOIDC, OIDCConfig: &proj_model.OIDCConfig{ - OIDCVersion: oidcVersionToModel(app.Version), - RedirectUris: app.RedirectUris, - ResponseTypes: oidcResponseTypesToModel(app.ResponseTypes), - GrantTypes: oidcGrantTypesToModel(app.GrantTypes), - ApplicationType: oidcApplicationTypeToModel(app.ApplicationType), - AuthMethodType: oidcAuthMethodTypeToModel(app.AuthMethodType), - PostLogoutRedirectUris: app.PostLogoutRedirectUris, - DevMode: app.DevMode, + OIDCVersion: oidcVersionToModel(app.Version), + RedirectUris: app.RedirectUris, + ResponseTypes: oidcResponseTypesToModel(app.ResponseTypes), + GrantTypes: oidcGrantTypesToModel(app.GrantTypes), + ApplicationType: oidcApplicationTypeToModel(app.ApplicationType), + AuthMethodType: oidcAuthMethodTypeToModel(app.AuthMethodType), + PostLogoutRedirectUris: app.PostLogoutRedirectUris, + DevMode: app.DevMode, + AccessTokenType: oidcTokenTypeToModel(app.AccessTokenType), + AccessTokenRoleAssertion: app.AccessTokenRoleAssertion, + IDTokenRoleAssertion: app.IdTokenRoleAssertion, }, } } @@ -119,14 +128,17 @@ func oidcConfigUpdateToModel(app *management.OIDCConfigUpdate) *proj_model.OIDCC ObjectRoot: models.ObjectRoot{ AggregateID: app.ProjectId, }, - AppID: app.ApplicationId, - RedirectUris: app.RedirectUris, - ResponseTypes: oidcResponseTypesToModel(app.ResponseTypes), - GrantTypes: oidcGrantTypesToModel(app.GrantTypes), - ApplicationType: oidcApplicationTypeToModel(app.ApplicationType), - AuthMethodType: oidcAuthMethodTypeToModel(app.AuthMethodType), - PostLogoutRedirectUris: app.PostLogoutRedirectUris, - DevMode: app.DevMode, + AppID: app.ApplicationId, + RedirectUris: app.RedirectUris, + ResponseTypes: oidcResponseTypesToModel(app.ResponseTypes), + GrantTypes: oidcGrantTypesToModel(app.GrantTypes), + ApplicationType: oidcApplicationTypeToModel(app.ApplicationType), + AuthMethodType: oidcAuthMethodTypeToModel(app.AuthMethodType), + PostLogoutRedirectUris: app.PostLogoutRedirectUris, + DevMode: app.DevMode, + AccessTokenType: oidcTokenTypeToModel(app.AccessTokenType), + AccessTokenRoleAssertion: app.AccessTokenRoleAssertion, + IDTokenRoleAssertion: app.IdTokenRoleAssertion, } } @@ -351,6 +363,28 @@ func oidcAuthMethodTypeFromModel(authType proj_model.OIDCAuthMethodType) managem } } +func oidcTokenTypeToModel(tokenType management.OIDCTokenType) proj_model.OIDCTokenType { + switch tokenType { + case management.OIDCTokenType_OIDCTokenType_Bearer: + return proj_model.OIDCTokenTypeBearer + case management.OIDCTokenType_OIDCTokenType_JWT: + return proj_model.OIDCTokenTypeJWT + default: + return proj_model.OIDCTokenTypeBearer + } +} + +func oidcTokenTypeFromModel(tokenType proj_model.OIDCTokenType) management.OIDCTokenType { + switch tokenType { + case proj_model.OIDCTokenTypeBearer: + return management.OIDCTokenType_OIDCTokenType_Bearer + case proj_model.OIDCTokenTypeJWT: + return management.OIDCTokenType_OIDCTokenType_JWT + default: + return management.OIDCTokenType_OIDCTokenType_Bearer + } +} + func oidcVersionFromModel(version proj_model.OIDCVersion) management.OIDCVersion { switch version { case proj_model.OIDCVersionV1: diff --git a/internal/api/grpc/management/iam_converter.go b/internal/api/grpc/management/iam_converter.go index 917894cc90..e8636ed43c 100644 --- a/internal/api/grpc/management/iam_converter.go +++ b/internal/api/grpc/management/iam_converter.go @@ -9,7 +9,19 @@ func iamFromModel(iam *iam_model.IAM) *management.Iam { return &management.Iam{ IamProjectId: iam.IAMProjectID, GlobalOrgId: iam.GlobalOrgID, - SetUpDone: iam.SetUpDone, - SetUpStarted: iam.SetUpStarted, + SetUpDone: iamSetupStepFromModel(iam.SetUpDone), + SetUpStarted: iamSetupStepFromModel(iam.SetUpStarted), + } +} + +func iamSetupStepFromModel(step iam_model.Step) management.IamSetupStep { + switch step { + case iam_model.Step1: + return management.IamSetupStep_iam_setup_step_1 + //TODO: label policy + // case iam_model.Step2: + // return management.IamSetupStep_iam_setup_step_2 + default: + return management.IamSetupStep_iam_setup_step_UNDEFINED } } diff --git a/internal/api/grpc/management/idp_config.go b/internal/api/grpc/management/idp_config.go index bc41f75843..dacc7cc2ff 100644 --- a/internal/api/grpc/management/idp_config.go +++ b/internal/api/grpc/management/idp_config.go @@ -61,7 +61,11 @@ func (s *Server) UpdateOidcIdpConfig(ctx context.Context, request *management.Oi } func (s *Server) SearchIdps(ctx context.Context, request *management.IdpSearchRequest) (*management.IdpSearchResponse, error) { - response, err := s.org.SearchIDPConfigs(ctx, idpConfigSearchRequestToModel(request)) + searchRequest, err := idpConfigSearchRequestToModel(request) + if err != nil { + return nil, err + } + response, err := s.org.SearchIDPConfigs(ctx, searchRequest) if err != nil { return nil, err } diff --git a/internal/api/grpc/management/idp_config_converter.go b/internal/api/grpc/management/idp_config_converter.go index db1297d76b..bb12a7da86 100644 --- a/internal/api/grpc/management/idp_config_converter.go +++ b/internal/api/grpc/management/idp_config_converter.go @@ -2,16 +2,18 @@ package management import ( "github.com/caos/logging" + caos_errors "github.com/caos/zitadel/internal/errors" iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/pkg/grpc/management" "github.com/golang/protobuf/ptypes" + "strconv" ) func createOidcIdpToModel(idp *management.OidcIdpConfigCreate) *iam_model.IDPConfig { return &iam_model.IDPConfig{ - Name: idp.Name, - LogoSrc: idp.LogoSrc, - Type: iam_model.IDPConfigTypeOIDC, + Name: idp.Name, + StylingType: idpConfigStylingTypeToModel(idp.StylingType), + Type: iam_model.IDPConfigTypeOIDC, OIDCConfig: &iam_model.OIDCIDPConfig{ ClientID: idp.ClientId, ClientSecretString: idp.ClientSecret, @@ -27,7 +29,7 @@ func updateIdpToModel(idp *management.IdpUpdate) *iam_model.IDPConfig { return &iam_model.IDPConfig{ IDPConfigID: idp.Id, Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: idpConfigStylingTypeToModel(idp.StylingType), } } @@ -56,7 +58,7 @@ func idpFromModel(idp *iam_model.IDPConfig) *management.Idp { ChangeDate: changeDate, Sequence: idp.Sequence, Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: idpConfigStylingTypeFromModel(idp.StylingType), State: idpConfigStateFromModel(idp.State), IdpConfig: idpConfigFromModel(idp), } @@ -76,7 +78,7 @@ func idpViewFromModel(idp *iam_model.IDPConfigView) *management.IdpView { Sequence: idp.Sequence, ProviderType: idpProviderTypeFromModel(idp.IDPProviderType), Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: idpConfigStylingTypeFromModel(idp.StylingType), State: idpConfigStateFromModel(idp.State), IdpConfigView: idpConfigViewFromModel(idp), } @@ -131,29 +133,47 @@ func idpConfigStateFromModel(state iam_model.IDPConfigState) management.IdpState } } -func idpConfigSearchRequestToModel(request *management.IdpSearchRequest) *iam_model.IDPConfigSearchRequest { - return &iam_model.IDPConfigSearchRequest{ - Limit: request.Limit, - Offset: request.Offset, - Queries: idpConfigSearchQueriesToModel(request.Queries), +func idpConfigSearchRequestToModel(request *management.IdpSearchRequest) (*iam_model.IDPConfigSearchRequest, error) { + convertedSearchRequest := &iam_model.IDPConfigSearchRequest{ + Limit: request.Limit, + Offset: request.Offset, } + convertedQueries, err := idpConfigSearchQueriesToModel(request.Queries) + if err != nil { + return nil, err + } + convertedSearchRequest.Queries = convertedQueries + return convertedSearchRequest, nil } -func idpConfigSearchQueriesToModel(queries []*management.IdpSearchQuery) []*iam_model.IDPConfigSearchQuery { +func idpConfigSearchQueriesToModel(queries []*management.IdpSearchQuery) ([]*iam_model.IDPConfigSearchQuery, error) { modelQueries := make([]*iam_model.IDPConfigSearchQuery, len(queries)) for i, query := range queries { - modelQueries[i] = idpConfigSearchQueryToModel(query) + converted, err := idpConfigSearchQueryToModel(query) + if err != nil { + return nil, err + } + modelQueries[i] = converted } - return modelQueries + return modelQueries, nil } -func idpConfigSearchQueryToModel(query *management.IdpSearchQuery) *iam_model.IDPConfigSearchQuery { - return &iam_model.IDPConfigSearchQuery{ +func idpConfigSearchQueryToModel(query *management.IdpSearchQuery) (*iam_model.IDPConfigSearchQuery, error) { + converted := &iam_model.IDPConfigSearchQuery{ Key: idpConfigSearchKeyToModel(query.Key), Method: searchMethodToModel(query.Method), Value: query.Value, } + if query.Key != management.IdpSearchKey_IDPSEARCHKEY_PROVIDER_TYPE { + return converted, nil + } + value, err := idpProviderTypeStringToModel(query.Value) + if err != nil { + return nil, err + } + converted.Value = value + return converted, nil } func idpConfigSearchKeyToModel(key management.IdpSearchKey) iam_model.IDPConfigSearchKey { @@ -211,3 +231,33 @@ func oidcMappingFieldToModel(field management.OIDCMappingField) iam_model.OIDCMa return iam_model.OIDCMappingFieldUnspecified } } + +func idpConfigStylingTypeFromModel(stylingType iam_model.IDPStylingType) management.IdpStylingType { + switch stylingType { + case iam_model.IDPStylingTypeGoogle: + return management.IdpStylingType_IDPSTYLINGTYPE_GOOGLE + default: + return management.IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED + } +} + +func idpConfigStylingTypeToModel(stylingType management.IdpStylingType) iam_model.IDPStylingType { + switch stylingType { + case management.IdpStylingType_IDPSTYLINGTYPE_GOOGLE: + return iam_model.IDPStylingTypeGoogle + default: + return iam_model.IDPStylingTypeUnspecified + } +} + +func idpProviderTypeStringToModel(providerType string) (iam_model.IDPProviderType, error) { + i, _ := strconv.ParseInt(providerType, 10, 32) + switch management.IdpProviderType(i) { + case management.IdpProviderType_IDPPROVIDERTYPE_SYSTEM: + return iam_model.IDPProviderTypeSystem, nil + case management.IdpProviderType_IDPPROVIDERTYPE_ORG: + return iam_model.IDPProviderTypeOrg, nil + default: + return 0, caos_errors.ThrowPreconditionFailed(nil, "MGMT-6is9f", "Errors.Org.IDP.InvalidSearchQuery") + } +} diff --git a/internal/api/grpc/management/login_policy.go b/internal/api/grpc/management/login_policy.go index 159580b469..f097805a16 100644 --- a/internal/api/grpc/management/login_policy.go +++ b/internal/api/grpc/management/login_policy.go @@ -14,16 +14,24 @@ func (s *Server) GetLoginPolicy(ctx context.Context, _ *empty.Empty) (*managemen return loginPolicyViewFromModel(result), nil } -func (s *Server) CreateLoginPolicy(ctx context.Context, policy *management.LoginPolicyAdd) (*management.LoginPolicy, error) { - result, err := s.org.AddLoginPolicy(ctx, loginPolicyAddToModel(policy)) +func (s *Server) GetDefaultLoginPolicy(ctx context.Context, _ *empty.Empty) (*management.LoginPolicyView, error) { + result, err := s.org.GetDefaultLoginPolicy(ctx) + if err != nil { + return nil, err + } + return loginPolicyViewFromModel(result), nil +} + +func (s *Server) CreateLoginPolicy(ctx context.Context, policy *management.LoginPolicyRequest) (*management.LoginPolicy, error) { + result, err := s.org.AddLoginPolicy(ctx, loginPolicyRequestToModel(policy)) if err != nil { return nil, err } return loginPolicyFromModel(result), nil } -func (s *Server) UpdateLoginPolicy(ctx context.Context, policy *management.LoginPolicy) (*management.LoginPolicy, error) { - result, err := s.org.ChangeLoginPolicy(ctx, loginPolicyToModel(policy)) +func (s *Server) UpdateLoginPolicy(ctx context.Context, policy *management.LoginPolicyRequest) (*management.LoginPolicy, error) { + result, err := s.org.ChangeLoginPolicy(ctx, loginPolicyRequestToModel(policy)) if err != nil { return nil, err } diff --git a/internal/api/grpc/management/login_policy_converter.go b/internal/api/grpc/management/login_policy_converter.go index 8bff228724..f11f2fd766 100644 --- a/internal/api/grpc/management/login_policy_converter.go +++ b/internal/api/grpc/management/login_policy_converter.go @@ -1,18 +1,13 @@ package management import ( + "github.com/caos/logging" iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes" ) -func loginPolicyAddToModel(policy *management.LoginPolicyAdd) *iam_model.LoginPolicy { - return &iam_model.LoginPolicy{ - AllowUsernamePassword: policy.AllowUsernamePassword, - AllowExternalIdp: policy.AllowExternalIdp, - AllowRegister: policy.AllowRegister, - } -} -func loginPolicyToModel(policy *management.LoginPolicy) *iam_model.LoginPolicy { +func loginPolicyRequestToModel(policy *management.LoginPolicyRequest) *iam_model.LoginPolicy { return &iam_model.LoginPolicy{ AllowUsernamePassword: policy.AllowUsernamePassword, AllowExternalIdp: policy.AllowExternalIdp, @@ -21,19 +16,35 @@ func loginPolicyToModel(policy *management.LoginPolicy) *iam_model.LoginPolicy { } func loginPolicyFromModel(policy *iam_model.LoginPolicy) *management.LoginPolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-2Fsm8").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-3Flo0").OnError(err).Debug("date parse failed") + return &management.LoginPolicy{ AllowUsernamePassword: policy.AllowUsernamePassword, AllowExternalIdp: policy.AllowExternalIdp, AllowRegister: policy.AllowRegister, + CreationDate: creationDate, + ChangeDate: changeDate, } } func loginPolicyViewFromModel(policy *iam_model.LoginPolicyView) *management.LoginPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-5Tsm8").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-8dJgs").OnError(err).Debug("date parse failed") + return &management.LoginPolicyView{ Default: policy.Default, AllowUsernamePassword: policy.AllowUsernamePassword, AllowExternalIdp: policy.AllowExternalIDP, AllowRegister: policy.AllowRegister, + CreationDate: creationDate, + ChangeDate: changeDate, } } diff --git a/internal/api/grpc/management/org.go b/internal/api/grpc/management/org.go index 83c049c3d5..f05578def8 100644 --- a/internal/api/grpc/management/org.go +++ b/internal/api/grpc/management/org.go @@ -98,10 +98,10 @@ func (s *Server) OrgChanges(ctx context.Context, changesRequest *management.Chan return orgChangesToResponse(response, changesRequest.GetSequenceOffset(), changesRequest.GetLimit()), nil } -func (s *Server) GetMyOrgIamPolicy(ctx context.Context, _ *empty.Empty) (_ *management.OrgIamPolicy, err error) { +func (s *Server) GetMyOrgIamPolicy(ctx context.Context, _ *empty.Empty) (_ *management.OrgIamPolicyView, err error) { policy, err := s.org.GetMyOrgIamPolicy(ctx) if err != nil { return nil, err } - return orgIamPolicyFromModel(policy), err + return orgIamPolicyViewFromModel(policy), err } diff --git a/internal/api/grpc/management/org_converter.go b/internal/api/grpc/management/org_converter.go index d9b903ba8c..97cbb6bf02 100644 --- a/internal/api/grpc/management/org_converter.go +++ b/internal/api/grpc/management/org_converter.go @@ -2,6 +2,7 @@ package management import ( "encoding/json" + iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/logging" "github.com/golang/protobuf/ptypes" @@ -227,10 +228,8 @@ func orgChangesToMgtAPI(changes *org_model.OrgChanges) (_ []*management.Change) return result } -func orgIamPolicyFromModel(policy *org_model.OrgIAMPolicy) *management.OrgIamPolicy { - return &management.OrgIamPolicy{ - OrgId: policy.AggregateID, - Description: policy.Description, +func orgIamPolicyViewFromModel(policy *iam_model.OrgIAMPolicyView) *management.OrgIamPolicyView { + return &management.OrgIamPolicyView{ UserLoginMustBeDomain: policy.UserLoginMustBeDomain, Default: policy.Default, } diff --git a/internal/api/grpc/management/password_age_policy.go b/internal/api/grpc/management/password_age_policy.go new file mode 100644 index 0000000000..20cae2d2c4 --- /dev/null +++ b/internal/api/grpc/management/password_age_policy.go @@ -0,0 +1,44 @@ +package management + +import ( + "context" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetPasswordAgePolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordAgePolicyView, error) { + result, err := s.org.GetPasswordAgePolicy(ctx) + if err != nil { + return nil, err + } + return passwordAgePolicyViewFromModel(result), nil +} + +func (s *Server) GetDefaultPasswordAgePolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordAgePolicyView, error) { + result, err := s.org.GetDefaultPasswordAgePolicy(ctx) + if err != nil { + return nil, err + } + return passwordAgePolicyViewFromModel(result), nil +} + +func (s *Server) CreatePasswordAgePolicy(ctx context.Context, policy *management.PasswordAgePolicyRequest) (*management.PasswordAgePolicy, error) { + result, err := s.org.AddPasswordAgePolicy(ctx, passwordAgePolicyRequestToModel(policy)) + if err != nil { + return nil, err + } + return passwordAgePolicyFromModel(result), nil +} + +func (s *Server) UpdatePasswordAgePolicy(ctx context.Context, policy *management.PasswordAgePolicyRequest) (*management.PasswordAgePolicy, error) { + result, err := s.org.ChangePasswordAgePolicy(ctx, passwordAgePolicyRequestToModel(policy)) + if err != nil { + return nil, err + } + return passwordAgePolicyFromModel(result), nil +} + +func (s *Server) RemovePasswordAgePolicy(ctx context.Context, _ *empty.Empty) (*empty.Empty, error) { + err := s.org.RemovePasswordAgePolicy(ctx) + return &empty.Empty{}, err +} diff --git a/internal/api/grpc/management/password_age_policy_converter.go b/internal/api/grpc/management/password_age_policy_converter.go new file mode 100644 index 0000000000..df655c5458 --- /dev/null +++ b/internal/api/grpc/management/password_age_policy_converter.go @@ -0,0 +1,46 @@ +package management + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes" +) + +func passwordAgePolicyRequestToModel(policy *management.PasswordAgePolicyRequest) *iam_model.PasswordAgePolicy { + return &iam_model.PasswordAgePolicy{ + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + } +} + +func passwordAgePolicyFromModel(policy *iam_model.PasswordAgePolicy) *management.PasswordAgePolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-bMd9o").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-jFs89").OnError(err).Debug("date parse failed") + + return &management.PasswordAgePolicy{ + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + CreationDate: changeDate, + ChangeDate: creationDate, + } +} + +func passwordAgePolicyViewFromModel(policy *iam_model.PasswordAgePolicyView) *management.PasswordAgePolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-4Bms9").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-6Hmlo").OnError(err).Debug("date parse failed") + + return &management.PasswordAgePolicyView{ + Default: policy.Default, + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + ChangeDate: changeDate, + CreationDate: creationDate, + } +} diff --git a/internal/api/grpc/management/password_complexity_policy.go b/internal/api/grpc/management/password_complexity_policy.go new file mode 100644 index 0000000000..87fa957351 --- /dev/null +++ b/internal/api/grpc/management/password_complexity_policy.go @@ -0,0 +1,44 @@ +package management + +import ( + "context" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetPasswordComplexityPolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordComplexityPolicyView, error) { + result, err := s.org.GetPasswordComplexityPolicy(ctx) + if err != nil { + return nil, err + } + return passwordComplexityPolicyViewFromModel(result), nil +} + +func (s *Server) GetDefaultPasswordComplexityPolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordComplexityPolicyView, error) { + result, err := s.org.GetDefaultPasswordComplexityPolicy(ctx) + if err != nil { + return nil, err + } + return passwordComplexityPolicyViewFromModel(result), nil +} + +func (s *Server) CreatePasswordComplexityPolicy(ctx context.Context, policy *management.PasswordComplexityPolicyRequest) (*management.PasswordComplexityPolicy, error) { + result, err := s.org.AddPasswordComplexityPolicy(ctx, passwordComplexityPolicyRequestToModel(policy)) + if err != nil { + return nil, err + } + return passwordComplexityPolicyFromModel(result), nil +} + +func (s *Server) UpdatePasswordComplexityPolicy(ctx context.Context, policy *management.PasswordComplexityPolicyRequest) (*management.PasswordComplexityPolicy, error) { + result, err := s.org.ChangePasswordComplexityPolicy(ctx, passwordComplexityPolicyRequestToModel(policy)) + if err != nil { + return nil, err + } + return passwordComplexityPolicyFromModel(result), nil +} + +func (s *Server) RemovePasswordComplexityPolicy(ctx context.Context, _ *empty.Empty) (*empty.Empty, error) { + err := s.org.RemovePasswordComplexityPolicy(ctx) + return &empty.Empty{}, err +} diff --git a/internal/api/grpc/management/password_complexity_policy_converter.go b/internal/api/grpc/management/password_complexity_policy_converter.go new file mode 100644 index 0000000000..9a674115d0 --- /dev/null +++ b/internal/api/grpc/management/password_complexity_policy_converter.go @@ -0,0 +1,55 @@ +package management + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes" +) + +func passwordComplexityPolicyRequestToModel(policy *management.PasswordComplexityPolicyRequest) *iam_model.PasswordComplexityPolicy { + return &iam_model.PasswordComplexityPolicy{ + MinLength: policy.MinLength, + HasLowercase: policy.HasLowercase, + HasUppercase: policy.HasUppercase, + HasSymbol: policy.HasSymbol, + HasNumber: policy.HasNumber, + } +} + +func passwordComplexityPolicyFromModel(policy *iam_model.PasswordComplexityPolicy) *management.PasswordComplexityPolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-5Gslo").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-Bmd9e").OnError(err).Debug("date parse failed") + + return &management.PasswordComplexityPolicy{ + MinLength: policy.MinLength, + HasLowercase: policy.HasLowercase, + HasUppercase: policy.HasUppercase, + HasSymbol: policy.HasSymbol, + HasNumber: policy.HasNumber, + CreationDate: changeDate, + ChangeDate: creationDate, + } +} + +func passwordComplexityPolicyViewFromModel(policy *iam_model.PasswordComplexityPolicyView) *management.PasswordComplexityPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-wmi8f").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-dmOp0").OnError(err).Debug("date parse failed") + + return &management.PasswordComplexityPolicyView{ + Default: policy.Default, + MinLength: policy.MinLength, + HasLowercase: policy.HasLowercase, + HasUppercase: policy.HasUppercase, + HasSymbol: policy.HasSymbol, + HasNumber: policy.HasNumber, + CreationDate: changeDate, + ChangeDate: creationDate, + } +} diff --git a/internal/api/grpc/management/password_lockout_policy.go b/internal/api/grpc/management/password_lockout_policy.go new file mode 100644 index 0000000000..9468454a86 --- /dev/null +++ b/internal/api/grpc/management/password_lockout_policy.go @@ -0,0 +1,44 @@ +package management + +import ( + "context" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetPasswordLockoutPolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordLockoutPolicyView, error) { + result, err := s.org.GetPasswordLockoutPolicy(ctx) + if err != nil { + return nil, err + } + return passwordLockoutPolicyViewFromModel(result), nil +} + +func (s *Server) GetDefaultPasswordLockoutPolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordLockoutPolicyView, error) { + result, err := s.org.GetDefaultPasswordLockoutPolicy(ctx) + if err != nil { + return nil, err + } + return passwordLockoutPolicyViewFromModel(result), nil +} + +func (s *Server) CreatePasswordLockoutPolicy(ctx context.Context, policy *management.PasswordLockoutPolicyRequest) (*management.PasswordLockoutPolicy, error) { + result, err := s.org.AddPasswordLockoutPolicy(ctx, passwordLockoutPolicyRequestToModel(policy)) + if err != nil { + return nil, err + } + return passwordLockoutPolicyFromModel(result), nil +} + +func (s *Server) UpdatePasswordLockoutPolicy(ctx context.Context, policy *management.PasswordLockoutPolicyRequest) (*management.PasswordLockoutPolicy, error) { + result, err := s.org.ChangePasswordLockoutPolicy(ctx, passwordLockoutPolicyRequestToModel(policy)) + if err != nil { + return nil, err + } + return passwordLockoutPolicyFromModel(result), nil +} + +func (s *Server) RemovePasswordLockoutPolicy(ctx context.Context, _ *empty.Empty) (*empty.Empty, error) { + err := s.org.RemovePasswordLockoutPolicy(ctx) + return &empty.Empty{}, err +} diff --git a/internal/api/grpc/management/password_lockout_policy_converter.go b/internal/api/grpc/management/password_lockout_policy_converter.go new file mode 100644 index 0000000000..3bbaf2f89f --- /dev/null +++ b/internal/api/grpc/management/password_lockout_policy_converter.go @@ -0,0 +1,46 @@ +package management + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes" +) + +func passwordLockoutPolicyRequestToModel(policy *management.PasswordLockoutPolicyRequest) *iam_model.PasswordLockoutPolicy { + return &iam_model.PasswordLockoutPolicy{ + MaxAttempts: policy.MaxAttempts, + ShowLockOutFailures: policy.ShowLockoutFailure, + } +} + +func passwordLockoutPolicyFromModel(policy *iam_model.PasswordLockoutPolicy) *management.PasswordLockoutPolicy { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-bMd9o").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-jFs89").OnError(err).Debug("date parse failed") + + return &management.PasswordLockoutPolicy{ + MaxAttempts: policy.MaxAttempts, + ShowLockoutFailure: policy.ShowLockOutFailures, + CreationDate: changeDate, + ChangeDate: creationDate, + } +} + +func passwordLockoutPolicyViewFromModel(policy *iam_model.PasswordLockoutPolicyView) *management.PasswordLockoutPolicyView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("GRPC-4Bms9").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("GRPC-6Hmlo").OnError(err).Debug("date parse failed") + + return &management.PasswordLockoutPolicyView{ + Default: policy.Default, + MaxAttempts: policy.MaxAttempts, + ShowLockoutFailure: policy.ShowLockOutFailures, + ChangeDate: changeDate, + CreationDate: creationDate, + } +} diff --git a/internal/api/grpc/management/policy.go b/internal/api/grpc/management/policy.go deleted file mode 100644 index b194dacd2e..0000000000 --- a/internal/api/grpc/management/policy.go +++ /dev/null @@ -1,112 +0,0 @@ -package management - -import ( - "context" - - "github.com/golang/protobuf/ptypes/empty" - - "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/pkg/grpc/management" -) - -func (s *Server) CreatePasswordComplexityPolicy(ctx context.Context, policy *management.PasswordComplexityPolicyCreate) (*management.PasswordComplexityPolicy, error) { - policyresp, err := s.policy.CreatePasswordComplexityPolicy(ctx, passwordComplexityPolicyCreateToModel(policy)) - if err != nil { - return nil, err - } - - return passwordComplexityPolicyFromModel(policyresp), nil -} - -func (s *Server) GetPasswordComplexityPolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordComplexityPolicy, error) { - policy, err := s.policy.GetPasswordComplexityPolicy(ctx) - if err != nil { - return nil, err - } - - return passwordComplexityPolicyFromModel(policy), nil -} - -func (s *Server) GetDefaultPasswordComplexityPolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordComplexityPolicy, error) { - policy, err := s.policy.GetDefaultPasswordComplexityPolicy(ctx) - if err != nil { - return nil, err - } - - return passwordComplexityPolicyFromModel(policy), nil -} - -func (s *Server) UpdatePasswordComplexityPolicy(ctx context.Context, policy *management.PasswordComplexityPolicyUpdate) (*management.PasswordComplexityPolicy, error) { - policyresp, err := s.policy.UpdatePasswordComplexityPolicy(ctx, passwordComplexityPolicyUpdateToModel(policy)) - if err != nil { - return nil, err - } - - return passwordComplexityPolicyFromModel(policyresp), nil -} - -func (s *Server) DeletePasswordComplexityPolicy(ctx context.Context, ID *management.PasswordComplexityPolicyID) (*empty.Empty, error) { - return nil, errors.ThrowUnimplemented(nil, "GRPC-skw3f", "Not implemented") -} - -func (s *Server) CreatePasswordAgePolicy(ctx context.Context, policy *management.PasswordAgePolicyCreate) (*management.PasswordAgePolicy, error) { - policyresp, err := s.policy.CreatePasswordAgePolicy(ctx, passwordAgePolicyCreateToModel(policy)) - if err != nil { - return nil, err - } - - return passwordAgePolicyFromModel(policyresp), nil -} - -func (s *Server) GetPasswordAgePolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordAgePolicy, error) { - policy, err := s.policy.GetPasswordAgePolicy(ctx) - if err != nil { - return nil, err - } - - return passwordAgePolicyFromModel(policy), nil -} - -func (s *Server) UpdatePasswordAgePolicy(ctx context.Context, policy *management.PasswordAgePolicyUpdate) (*management.PasswordAgePolicy, error) { - policyresp, err := s.policy.UpdatePasswordAgePolicy(ctx, passwordAgePolicyUpdateToModel(policy)) - if err != nil { - return nil, err - } - - return passwordAgePolicyFromModel(policyresp), nil -} - -func (s *Server) DeletePasswordAgePolicy(ctx context.Context, ID *management.PasswordAgePolicyID) (*empty.Empty, error) { - return nil, errors.ThrowUnimplemented(nil, "GRPC-plo67", "Not implemented") -} - -func (s *Server) CreatePasswordLockoutPolicy(ctx context.Context, policy *management.PasswordLockoutPolicyCreate) (*management.PasswordLockoutPolicy, error) { - policyresp, err := s.policy.CreatePasswordLockoutPolicy(ctx, passwordLockoutPolicyCreateToModel(policy)) - if err != nil { - return nil, err - } - - return passwordLockoutPolicyFromModel(policyresp), nil -} - -func (s *Server) GetPasswordLockoutPolicy(ctx context.Context, _ *empty.Empty) (*management.PasswordLockoutPolicy, error) { - policy, err := s.policy.GetPasswordLockoutPolicy(ctx) - if err != nil { - return nil, err - } - - return passwordLockoutPolicyFromModel(policy), nil -} - -func (s *Server) UpdatePasswordLockoutPolicy(ctx context.Context, policy *management.PasswordLockoutPolicyUpdate) (*management.PasswordLockoutPolicy, error) { - policyresp, err := s.policy.UpdatePasswordLockoutPolicy(ctx, passwordLockoutPolicyUpdateToModel(policy)) - if err != nil { - return nil, err - } - - return passwordLockoutPolicyFromModel(policyresp), nil -} - -func (s *Server) DeletePasswordLockoutPolicy(ctx context.Context, ID *management.PasswordLockoutPolicyID) (*empty.Empty, error) { - return nil, errors.ThrowUnimplemented(nil, "GRPC-GHkd9", "Not implemented") -} diff --git a/internal/api/grpc/management/policy_age_converter.go b/internal/api/grpc/management/policy_age_converter.go deleted file mode 100644 index 3ee08f07df..0000000000 --- a/internal/api/grpc/management/policy_age_converter.go +++ /dev/null @@ -1,68 +0,0 @@ -package management - -import ( - "github.com/caos/logging" - "github.com/golang/protobuf/ptypes" - - "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" - "github.com/caos/zitadel/pkg/grpc/management" -) - -func passwordAgePolicyFromModel(policy *model.PasswordAgePolicy) *management.PasswordAgePolicy { - creationDate, err := ptypes.TimestampProto(policy.CreationDate) - logging.Log("GRPC-6ILdB").OnError(err).Debug("unable to parse timestamp") - - changeDate, err := ptypes.TimestampProto(policy.ChangeDate) - logging.Log("GRPC-ngUzJ").OnError(err).Debug("unable to parse timestamp") - - return &management.PasswordAgePolicy{ - Id: policy.AggregateID, - CreationDate: creationDate, - ChangeDate: changeDate, - Sequence: policy.Sequence, - Description: policy.Description, - ExpireWarnDays: policy.ExpireWarnDays, - MaxAgeDays: policy.MaxAgeDays, - IsDefault: policy.AggregateID == "", - } -} - -func passwordAgePolicyToModel(policy *management.PasswordAgePolicy) *model.PasswordAgePolicy { - creationDate, err := ptypes.Timestamp(policy.CreationDate) - logging.Log("GRPC-2QSfU").OnError(err).Debug("unable to parse timestamp") - - changeDate, err := ptypes.Timestamp(policy.ChangeDate) - logging.Log("GRPC-LdU91").OnError(err).Debug("unable to parse timestamp") - - return &model.PasswordAgePolicy{ - ObjectRoot: models.ObjectRoot{ - AggregateID: policy.Id, - CreationDate: creationDate, - ChangeDate: changeDate, - Sequence: policy.Sequence, - }, - Description: policy.Description, - ExpireWarnDays: policy.ExpireWarnDays, - MaxAgeDays: policy.MaxAgeDays, - } -} - -func passwordAgePolicyCreateToModel(policy *management.PasswordAgePolicyCreate) *model.PasswordAgePolicy { - return &model.PasswordAgePolicy{ - Description: policy.Description, - ExpireWarnDays: policy.ExpireWarnDays, - MaxAgeDays: policy.MaxAgeDays, - } -} - -func passwordAgePolicyUpdateToModel(policy *management.PasswordAgePolicyUpdate) *model.PasswordAgePolicy { - return &model.PasswordAgePolicy{ - ObjectRoot: models.ObjectRoot{ - AggregateID: policy.Id, - }, - Description: policy.Description, - ExpireWarnDays: policy.ExpireWarnDays, - MaxAgeDays: policy.MaxAgeDays, - } -} diff --git a/internal/api/grpc/management/policy_complexity_converter.go b/internal/api/grpc/management/policy_complexity_converter.go deleted file mode 100644 index 60d7339a44..0000000000 --- a/internal/api/grpc/management/policy_complexity_converter.go +++ /dev/null @@ -1,81 +0,0 @@ -package management - -import ( - "github.com/caos/logging" - - "github.com/golang/protobuf/ptypes" - - "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" - "github.com/caos/zitadel/pkg/grpc/management" -) - -func passwordComplexityPolicyFromModel(policy *model.PasswordComplexityPolicy) *management.PasswordComplexityPolicy { - creationDate, err := ptypes.TimestampProto(policy.CreationDate) - logging.Log("GRPC-cQRHE").OnError(err).Debug("unable to parse timestamp") - - changeDate, err := ptypes.TimestampProto(policy.ChangeDate) - logging.Log("GRPC-PVA1c").OnError(err).Debug("unable to parse timestamp") - - return &management.PasswordComplexityPolicy{ - Id: policy.AggregateID, - CreationDate: creationDate, - ChangeDate: changeDate, - Description: policy.Description, - Sequence: policy.Sequence, - MinLength: policy.MinLength, - HasLowercase: policy.HasLowercase, - HasUppercase: policy.HasUppercase, - HasNumber: policy.HasNumber, - HasSymbol: policy.HasSymbol, - IsDefault: policy.AggregateID == "", - } -} - -func passwordComplexityPolicyToModel(policy *management.PasswordComplexityPolicy) *model.PasswordComplexityPolicy { - creationDate, err := ptypes.Timestamp(policy.CreationDate) - logging.Log("GRPC-asmEZ").OnError(err).Debug("unable to parse timestamp") - - changeDate, err := ptypes.Timestamp(policy.ChangeDate) - logging.Log("GRPC-MCE4o").OnError(err).Debug("unable to parse timestamp") - - return &model.PasswordComplexityPolicy{ - ObjectRoot: models.ObjectRoot{ - AggregateID: policy.Id, - CreationDate: creationDate, - ChangeDate: changeDate, - Sequence: policy.Sequence, - }, - Description: policy.Description, - MinLength: policy.MinLength, - HasLowercase: policy.HasLowercase, - HasUppercase: policy.HasUppercase, - HasNumber: policy.HasNumber, - HasSymbol: policy.HasSymbol, - } -} - -func passwordComplexityPolicyCreateToModel(policy *management.PasswordComplexityPolicyCreate) *model.PasswordComplexityPolicy { - return &model.PasswordComplexityPolicy{ - Description: policy.Description, - MinLength: policy.MinLength, - HasLowercase: policy.HasLowercase, - HasUppercase: policy.HasUppercase, - HasNumber: policy.HasNumber, - HasSymbol: policy.HasSymbol, - } -} - -func passwordComplexityPolicyUpdateToModel(policy *management.PasswordComplexityPolicyUpdate) *model.PasswordComplexityPolicy { - return &model.PasswordComplexityPolicy{ - ObjectRoot: models.ObjectRoot{ - AggregateID: policy.Id, - }, - Description: policy.Description, - MinLength: policy.MinLength, - HasLowercase: policy.HasLowercase, - HasUppercase: policy.HasUppercase, - HasNumber: policy.HasNumber, - HasSymbol: policy.HasSymbol, - } -} diff --git a/internal/api/grpc/management/policy_lockout_converter.go b/internal/api/grpc/management/policy_lockout_converter.go deleted file mode 100644 index 0c44ff1350..0000000000 --- a/internal/api/grpc/management/policy_lockout_converter.go +++ /dev/null @@ -1,70 +0,0 @@ -package management - -import ( - "github.com/caos/logging" - - "github.com/golang/protobuf/ptypes" - - "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" - "github.com/caos/zitadel/pkg/grpc/management" -) - -func passwordLockoutPolicyFromModel(policy *model.PasswordLockoutPolicy) *management.PasswordLockoutPolicy { - creationDate, err := ptypes.TimestampProto(policy.CreationDate) - logging.Log("GRPC-JRSbT").OnError(err).Debug("unable to parse timestamp") - - changeDate, err := ptypes.TimestampProto(policy.ChangeDate) - logging.Log("GRPC-1sizr").OnError(err).Debug("unable to parse timestamp") - - return &management.PasswordLockoutPolicy{ - Id: policy.AggregateID, - CreationDate: creationDate, - ChangeDate: changeDate, - Sequence: policy.Sequence, - Description: policy.Description, - MaxAttempts: policy.MaxAttempts, - ShowLockOutFailures: policy.ShowLockOutFailures, - IsDefault: policy.AggregateID == "", - } -} - -func passwordLockoutPolicyToModel(policy *management.PasswordLockoutPolicy) *model.PasswordLockoutPolicy { - creationDate, err := ptypes.Timestamp(policy.CreationDate) - logging.Log("GRPC-8a511").OnError(err).Debug("unable to parse timestamp") - - changeDate, err := ptypes.Timestamp(policy.ChangeDate) - logging.Log("GRPC-2rdGv").OnError(err).Debug("unable to parse timestamp") - - return &model.PasswordLockoutPolicy{ - ObjectRoot: models.ObjectRoot{ - AggregateID: policy.Id, - CreationDate: creationDate, - ChangeDate: changeDate, - Sequence: policy.Sequence, - }, - Description: policy.Description, - - MaxAttempts: policy.MaxAttempts, - ShowLockOutFailures: policy.ShowLockOutFailures, - } -} - -func passwordLockoutPolicyCreateToModel(policy *management.PasswordLockoutPolicyCreate) *model.PasswordLockoutPolicy { - return &model.PasswordLockoutPolicy{ - Description: policy.Description, - MaxAttempts: policy.MaxAttempts, - ShowLockOutFailures: policy.ShowLockOutFailures, - } -} - -func passwordLockoutPolicyUpdateToModel(policy *management.PasswordLockoutPolicyUpdate) *model.PasswordLockoutPolicy { - return &model.PasswordLockoutPolicy{ - ObjectRoot: models.ObjectRoot{ - AggregateID: policy.Id, - }, - Description: policy.Description, - MaxAttempts: policy.MaxAttempts, - ShowLockOutFailures: policy.ShowLockOutFailures, - } -} diff --git a/internal/api/grpc/management/project.go b/internal/api/grpc/management/project.go index 402447281d..ddee42ec1d 100644 --- a/internal/api/grpc/management/project.go +++ b/internal/api/grpc/management/project.go @@ -12,7 +12,7 @@ import ( ) func (s *Server) CreateProject(ctx context.Context, in *management.ProjectCreateRequest) (*management.Project, error) { - project, err := s.project.CreateProject(ctx, in.Name) + project, err := s.project.CreateProject(ctx, projectCreateToModel(in)) if err != nil { return nil, err } diff --git a/internal/api/grpc/management/project_converter.go b/internal/api/grpc/management/project_converter.go index 5531e57357..4bdbcdeaf6 100644 --- a/internal/api/grpc/management/project_converter.go +++ b/internal/api/grpc/management/project_converter.go @@ -22,12 +22,14 @@ func projectFromModel(project *proj_model.Project) *management.Project { logging.Log("GRPC-di7rw").OnError(err).Debug("unable to parse timestamp") return &management.Project{ - Id: project.AggregateID, - State: projectStateFromModel(project.State), - CreationDate: creationDate, - ChangeDate: changeDate, - Name: project.Name, - Sequence: project.Sequence, + Id: project.AggregateID, + State: projectStateFromModel(project.State), + CreationDate: creationDate, + ChangeDate: changeDate, + Name: project.Name, + Sequence: project.Sequence, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, } } @@ -60,13 +62,15 @@ func projectViewFromModel(project *proj_model.ProjectView) *management.ProjectVi logging.Log("GRPC-sope3").OnError(err).Debug("unable to parse timestamp") return &management.ProjectView{ - ProjectId: project.ProjectID, - State: projectStateFromModel(project.State), - CreationDate: creationDate, - ChangeDate: changeDate, - Name: project.Name, - Sequence: project.Sequence, - ResourceOwner: project.ResourceOwner, + ProjectId: project.ProjectID, + State: projectStateFromModel(project.State), + CreationDate: creationDate, + ChangeDate: changeDate, + Name: project.Name, + Sequence: project.Sequence, + ResourceOwner: project.ResourceOwner, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, } } @@ -117,12 +121,22 @@ func projectStateFromModel(state proj_model.ProjectState) management.ProjectStat } } +func projectCreateToModel(project *management.ProjectCreateRequest) *proj_model.Project { + return &proj_model.Project{ + Name: project.Name, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, + } +} + func projectUpdateToModel(project *management.ProjectUpdateRequest) *proj_model.Project { return &proj_model.Project{ ObjectRoot: models.ObjectRoot{ AggregateID: project.Id, }, - Name: project.Name, + Name: project.Name, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, } } diff --git a/internal/api/grpc/management/server.go b/internal/api/grpc/management/server.go index dcf2339c70..ec446f7732 100644 --- a/internal/api/grpc/management/server.go +++ b/internal/api/grpc/management/server.go @@ -19,7 +19,6 @@ var _ management.ManagementServiceServer = (*Server)(nil) type Server struct { project repository.ProjectRepository - policy repository.PolicyRepository org repository.OrgRepository user repository.UserRepository usergrant repository.UserGrantRepository @@ -35,7 +34,6 @@ type Config struct { func CreateServer(repo repository.Repository, sd systemdefaults.SystemDefaults) *Server { return &Server{ project: repo, - policy: repo, org: repo, user: repo, usergrant: repo, diff --git a/internal/api/grpc/management/user.go b/internal/api/grpc/management/user.go index acd1b0ef24..f1ba575832 100644 --- a/internal/api/grpc/management/user.go +++ b/internal/api/grpc/management/user.go @@ -3,7 +3,6 @@ package management import ( "context" "github.com/caos/zitadel/internal/api/authz" - "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/pkg/grpc/management" "github.com/golang/protobuf/ptypes/empty" ) @@ -91,7 +90,8 @@ func (s *Server) UnlockUser(ctx context.Context, in *management.UserID) (*manage } func (s *Server) DeleteUser(ctx context.Context, in *management.UserID) (*empty.Empty, error) { - return nil, errors.ThrowUnimplemented(nil, "GRPC-as4fg", "Not implemented") + err := s.user.RemoveUser(ctx, in.Id) + return &empty.Empty{}, err } func (s *Server) UpdateUserMachine(ctx context.Context, in *management.UpdateMachineRequest) (*management.MachineResponse, error) { diff --git a/internal/api/grpc/management/user_grant_converter.go b/internal/api/grpc/management/user_grant_converter.go index 2349bdde5e..2d4e860834 100644 --- a/internal/api/grpc/management/user_grant_converter.go +++ b/internal/api/grpc/management/user_grant_converter.go @@ -135,7 +135,7 @@ func userGrantViewFromModel(grant *grant_model.UserGrantView) *management.UserGr Email: grant.Email, ProjectName: grant.ProjectName, OrgName: grant.OrgName, - OrgDomain: grant.OrgDomain, + OrgDomain: grant.OrgPrimaryDomain, RoleKeys: grant.RoleKeys, UserId: grant.UserID, ProjectId: grant.ProjectID, diff --git a/internal/api/grpc/probes.go b/internal/api/grpc/probes.go new file mode 100644 index 0000000000..21106cf885 --- /dev/null +++ b/internal/api/grpc/probes.go @@ -0,0 +1,11 @@ +package grpc + +const ( + Healthz = "/Healthz" + Readiness = "/Ready" + Validation = "/Validate" +) + +var ( + Probes = []string{Healthz, Readiness, Validation} +) diff --git a/internal/api/grpc/server/middleware/auth_interceptor.go b/internal/api/grpc/server/middleware/auth_interceptor.go index edc609cc0d..48494b25bc 100644 --- a/internal/api/grpc/server/middleware/auth_interceptor.go +++ b/internal/api/grpc/server/middleware/auth_interceptor.go @@ -10,6 +10,7 @@ import ( "github.com/caos/zitadel/internal/api/authz" grpc_util "github.com/caos/zitadel/internal/api/grpc" "github.com/caos/zitadel/internal/api/http" + "github.com/caos/zitadel/internal/tracing" ) func AuthorizationInterceptor(verifier *authz.TokenVerifier, authConfig authz.Config) grpc.UnaryServerInterceptor { @@ -18,9 +19,13 @@ func AuthorizationInterceptor(verifier *authz.TokenVerifier, authConfig authz.Co } } -func authorize(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler, verifier *authz.TokenVerifier, authConfig authz.Config) (interface{}, error) { +func authorize(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler, verifier *authz.TokenVerifier, authConfig authz.Config) (_ interface{}, err error) { + ctx, span := tracing.NewServerInterceptorSpan(ctx) + defer func() { span.EndWithError(err) }() + authOpt, needsToken := verifier.CheckAuthMethod(info.FullMethod) if !needsToken { + span.End() return handler(ctx, req) } @@ -31,10 +36,10 @@ func authorize(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, orgID := grpc_util.GetHeader(ctx, http.ZitadelOrgID) - ctx, err := authz.CheckUserAuthorization(ctx, req, authToken, orgID, verifier, authConfig, authOpt, info.FullMethod) + ctx, err = authz.CheckUserAuthorization(ctx, req, authToken, orgID, verifier, authConfig, authOpt, info.FullMethod) if err != nil { return nil, err } - + span.End() return handler(ctx, req) } diff --git a/internal/api/grpc/server/middleware/tracing.go b/internal/api/grpc/server/middleware/tracing.go index d34de28a5a..f27f1b1940 100644 --- a/internal/api/grpc/server/middleware/tracing.go +++ b/internal/api/grpc/server/middleware/tracing.go @@ -9,7 +9,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/stats" - "github.com/caos/zitadel/internal/api/http" + grpc_utils "github.com/caos/zitadel/internal/api/grpc" "github.com/caos/zitadel/internal/tracing" ) @@ -30,7 +30,7 @@ func TracingStatsServer(ignoredMethods ...GRPCMethod) grpc.ServerOption { } func DefaultTracingStatsServer() grpc.ServerOption { - return TracingStatsServer(http.Healthz, http.Readiness, http.Validation) + return TracingStatsServer(grpc_utils.Healthz, grpc_utils.Readiness, grpc_utils.Validation) } type tracingServerHandler struct { diff --git a/internal/api/grpc/server/server.go b/internal/api/grpc/server/server.go index cb86958d16..acb6165c2d 100644 --- a/internal/api/grpc/server/server.go +++ b/internal/api/grpc/server/server.go @@ -27,7 +27,7 @@ type Server interface { func CreateServer(verifier *authz.TokenVerifier, authConfig authz.Config, lang language.Tag) *grpc.Server { return grpc.NewServer( - middleware.TracingStatsServer(http.Healthz, http.Readiness, http.Validation), + middleware.DefaultTracingStatsServer(), grpc.UnaryInterceptor( grpc_middleware.ChainUnaryServer( middleware.ErrorHandler(), diff --git a/internal/api/http/marshal.go b/internal/api/http/marshal.go index 10df5c8475..47ac18452f 100644 --- a/internal/api/http/marshal.go +++ b/internal/api/http/marshal.go @@ -7,7 +7,11 @@ import ( "github.com/caos/logging" ) -func MarshalJSON(w http.ResponseWriter, i interface{}) { +func MarshalJSON(w http.ResponseWriter, i interface{}, err error, statusCode int) { + if err != nil { + http.Error(w, err.Error(), statusCode) + return + } b, err := json.Marshal(i) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/internal/api/http/middleware/trace_interceptor.go b/internal/api/http/middleware/trace_interceptor.go index 6069d63d8d..9107589778 100644 --- a/internal/api/http/middleware/trace_interceptor.go +++ b/internal/api/http/middleware/trace_interceptor.go @@ -10,3 +10,9 @@ import ( func DefaultTraceHandler(handler http.Handler) http.Handler { return tracing.TraceHandler(handler, http_utils.Probes...) } + +func TraceHandler(ignoredMethods ...string) func(http.Handler) http.Handler { + return func(handler http.Handler) http.Handler { + return tracing.TraceHandler(handler, ignoredMethods...) + } +} diff --git a/internal/api/http/probes.go b/internal/api/http/probes.go index 5752ada51b..0290be12a2 100644 --- a/internal/api/http/probes.go +++ b/internal/api/http/probes.go @@ -1,9 +1,9 @@ package http const ( - Healthz = "/Healthz" - Readiness = "/Ready" - Validation = "/Validate" + Healthz = "/healthz" + Readiness = "/ready" + Validation = "/validate" ) var ( diff --git a/internal/api/oidc/auth_request.go b/internal/api/oidc/auth_request.go index b3c48dff19..07e2f497b0 100644 --- a/internal/api/oidc/auth_request.go +++ b/internal/api/oidc/auth_request.go @@ -3,6 +3,7 @@ package oidc import ( "context" "fmt" + "strings" "time" "github.com/caos/oidc/pkg/oidc" @@ -11,14 +12,26 @@ import ( "github.com/caos/zitadel/internal/api/http/middleware" "github.com/caos/zitadel/internal/errors" + proj_model "github.com/caos/zitadel/internal/project/model" + "github.com/caos/zitadel/internal/tracing" grant_model "github.com/caos/zitadel/internal/usergrant/model" ) -func (o *OPStorage) CreateAuthRequest(ctx context.Context, req *oidc.AuthRequest, userID string) (op.AuthRequest, error) { +func (o *OPStorage) CreateAuthRequest(ctx context.Context, req *oidc.AuthRequest, userID string) (_ op.AuthRequest, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() userAgentID, ok := middleware.UserAgentIDFromCtx(ctx) if !ok { return nil, errors.ThrowPreconditionFailed(nil, "OIDC-sd436", "no user agent id") } + app, err := o.repo.ApplicationByClientID(ctx, req.ClientID) + if err != nil { + return nil, errors.ThrowPreconditionFailed(nil, "OIDC-AEG4d", "Errors.Internal") + } + req.Scopes, err = o.assertProjectRoleScopes(app, req.Scopes) + if err != nil { + return nil, errors.ThrowPreconditionFailed(nil, "OIDC-Gqrfg", "Errors.Internal") + } authRequest := CreateAuthRequestToBusiness(ctx, req, userAgentID, userID) resp, err := o.repo.CreateAuthRequest(ctx, authRequest) if err != nil { @@ -27,7 +40,9 @@ func (o *OPStorage) CreateAuthRequest(ctx context.Context, req *oidc.AuthRequest return AuthRequestFromBusiness(resp) } -func (o *OPStorage) AuthRequestByID(ctx context.Context, id string) (op.AuthRequest, error) { +func (o *OPStorage) AuthRequestByID(ctx context.Context, id string) (_ op.AuthRequest, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() userAgentID, ok := middleware.UserAgentIDFromCtx(ctx) if !ok { return nil, errors.ThrowPreconditionFailed(nil, "OIDC-D3g21", "no user agent id") @@ -39,7 +54,9 @@ func (o *OPStorage) AuthRequestByID(ctx context.Context, id string) (op.AuthRequ return AuthRequestFromBusiness(resp) } -func (o *OPStorage) AuthRequestByCode(ctx context.Context, code string) (op.AuthRequest, error) { +func (o *OPStorage) AuthRequestByCode(ctx context.Context, code string) (_ op.AuthRequest, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() resp, err := o.repo.AuthRequestByCode(ctx, code) if err != nil { return nil, err @@ -47,7 +64,9 @@ func (o *OPStorage) AuthRequestByCode(ctx context.Context, code string) (op.Auth return AuthRequestFromBusiness(resp) } -func (o *OPStorage) SaveAuthCode(ctx context.Context, id, code string) error { +func (o *OPStorage) SaveAuthCode(ctx context.Context, id, code string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() userAgentID, ok := middleware.UserAgentIDFromCtx(ctx) if !ok { return errors.ThrowPreconditionFailed(nil, "OIDC-Dgus2", "no user agent id") @@ -55,11 +74,15 @@ func (o *OPStorage) SaveAuthCode(ctx context.Context, id, code string) error { return o.repo.SaveAuthCode(ctx, id, code, userAgentID) } -func (o *OPStorage) DeleteAuthRequest(ctx context.Context, id string) error { +func (o *OPStorage) DeleteAuthRequest(ctx context.Context, id string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() return o.repo.DeleteAuthRequest(ctx, id) } -func (o *OPStorage) CreateToken(ctx context.Context, req op.TokenRequest) (string, time.Time, error) { +func (o *OPStorage) CreateToken(ctx context.Context, req op.TokenRequest) (_ string, _ time.Time, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() var userAgentID, applicationID string authReq, ok := req.(*AuthRequest) if ok { @@ -70,7 +93,7 @@ func (o *OPStorage) CreateToken(ctx context.Context, req op.TokenRequest) (strin if err != nil { return "", time.Time{}, err } - return resp.ID, resp.Expiration, nil + return resp.TokenID, resp.Expiration, nil } func grantsToScopes(grants []*grant_model.UserGrantView) []string { @@ -83,7 +106,9 @@ func grantsToScopes(grants []*grant_model.UserGrantView) []string { return scopes } -func (o *OPStorage) TerminateSession(ctx context.Context, userID, clientID string) error { +func (o *OPStorage) TerminateSession(ctx context.Context, userID, clientID string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() userAgentID, ok := middleware.UserAgentIDFromCtx(ctx) if !ok { return errors.ThrowPreconditionFailed(nil, "OIDC-fso7F", "no user agent id") @@ -95,10 +120,31 @@ func (o *OPStorage) GetSigningKey(ctx context.Context, keyCh chan<- jose.Signing o.repo.GetSigningKey(ctx, keyCh, errCh, timer) } -func (o *OPStorage) GetKeySet(ctx context.Context) (*jose.JSONWebKeySet, error) { +func (o *OPStorage) GetKeySet(ctx context.Context) (_ *jose.JSONWebKeySet, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() return o.repo.GetKeySet(ctx) } func (o *OPStorage) SaveNewKeyPair(ctx context.Context) error { return o.repo.GenerateSigningKeyPair(ctx, o.signingKeyAlgorithm) } + +func (o *OPStorage) assertProjectRoleScopes(app *proj_model.ApplicationView, scopes []string) ([]string, error) { + if !app.ProjectRoleAssertion { + return scopes, nil + } + for _, scope := range scopes { + if strings.HasPrefix(scope, ScopeProjectRolePrefix) { + return scopes, nil + } + } + roles, err := o.repo.ProjectRolesByProjectID(app.ProjectID) + if err != nil { + return nil, err + } + for _, role := range roles { + scopes = append(scopes, ScopeProjectRolePrefix+role.Key) + } + return scopes, nil +} diff --git a/internal/api/oidc/client.go b/internal/api/oidc/client.go index 13131aaf1c..6c53bd0dd2 100644 --- a/internal/api/oidc/client.go +++ b/internal/api/oidc/client.go @@ -2,6 +2,7 @@ package oidc import ( "context" + "strings" "golang.org/x/text/language" "gopkg.in/square/go-jose.v2" @@ -14,7 +15,9 @@ import ( "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/errors" proj_model "github.com/caos/zitadel/internal/project/model" + "github.com/caos/zitadel/internal/tracing" user_model "github.com/caos/zitadel/internal/user/model" + grant_model "github.com/caos/zitadel/internal/usergrant/model" ) const ( @@ -24,10 +27,15 @@ const ( scopePhone = "phone" scopeAddress = "address" + ScopeProjectRolePrefix = "urn:zitadel:iam:org:project:role:" + ClaimProjectRoles = "urn:zitadel:iam:org:project:roles" + oidcCtx = "oidc" ) -func (o *OPStorage) GetClientByClientID(ctx context.Context, id string) (op.Client, error) { +func (o *OPStorage) GetClientByClientID(ctx context.Context, id string) (_ op.Client, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() client, err := o.repo.ApplicationByClientID(ctx, id) if err != nil { return nil, err @@ -35,10 +43,20 @@ func (o *OPStorage) GetClientByClientID(ctx context.Context, id string) (op.Clie if client.State != proj_model.AppStateActive { return nil, errors.ThrowPreconditionFailed(nil, "OIDC-sdaGg", "client is not active") } - return ClientFromBusiness(client, o.defaultLoginURL, o.defaultAccessTokenLifetime, o.defaultIdTokenLifetime) + projectRoles, err := o.repo.ProjectRolesByProjectID(client.ProjectID) + if err != nil { + return nil, err + } + allowedScopes := make([]string, len(projectRoles)) + for i, role := range projectRoles { + allowedScopes[i] = ScopeProjectRolePrefix + role.Key + } + return ClientFromBusiness(client, o.defaultLoginURL, o.defaultAccessTokenLifetime, o.defaultIdTokenLifetime, allowedScopes) } -func (o *OPStorage) GetKeyByIDAndUserID(ctx context.Context, keyID, userID string) (*jose.JSONWebKey, error) { +func (o *OPStorage) GetKeyByIDAndUserID(ctx context.Context, keyID, userID string) (_ *jose.JSONWebKey, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() key, err := o.repo.MachineKeyByID(ctx, keyID) if err != nil { return nil, err @@ -57,7 +75,9 @@ func (o *OPStorage) GetKeyByIDAndUserID(ctx context.Context, keyID, userID strin }, nil } -func (o *OPStorage) AuthorizeClientIDSecret(ctx context.Context, id string, secret string) error { +func (o *OPStorage) AuthorizeClientIDSecret(ctx context.Context, id string, secret string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() ctx = authz.SetCtxData(ctx, authz.CtxData{ UserID: oidcCtx, OrgID: oidcCtx, @@ -65,10 +85,12 @@ func (o *OPStorage) AuthorizeClientIDSecret(ctx context.Context, id string, secr return o.repo.AuthorizeOIDCApplication(ctx, id, secret) } -func (o *OPStorage) GetUserinfoFromToken(ctx context.Context, tokenID, origin string) (*oidc.Userinfo, error) { - token, err := o.repo.TokenByID(ctx, tokenID) +func (o *OPStorage) GetUserinfoFromToken(ctx context.Context, tokenID, subject, origin string) (_ oidc.UserInfo, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + token, err := o.repo.TokenByID(ctx, subject, tokenID) if err != nil { - return nil, err + return nil, errors.ThrowPermissionDenied(nil, "OIDC-Dsfb2", "token is not valid or has expired") } if token.ApplicationID != "" { app, err := o.repo.ApplicationByClientID(ctx, token.ApplicationID) @@ -79,65 +101,128 @@ func (o *OPStorage) GetUserinfoFromToken(ctx context.Context, tokenID, origin st return nil, errors.ThrowPermissionDenied(nil, "OIDC-da1f3", "origin is not allowed") } } - return o.GetUserinfoFromScopes(ctx, token.UserID, token.Scopes) + return o.GetUserinfoFromScopes(ctx, token.UserID, token.ApplicationID, token.Scopes) } -func (o *OPStorage) GetUserinfoFromScopes(ctx context.Context, userID string, scopes []string) (*oidc.Userinfo, error) { +func (o *OPStorage) GetUserinfoFromScopes(ctx context.Context, userID, applicationID string, scopes []string) (_ oidc.UserInfo, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() user, err := o.repo.UserByID(ctx, userID) if err != nil { return nil, err } - userInfo := new(oidc.Userinfo) + userInfo := oidc.NewUserInfo() + roles := make([]string, 0) for _, scope := range scopes { switch scope { - case scopeOpenID: - userInfo.Subject = user.ID - case scopeEmail: + case oidc.ScopeOpenID: + userInfo.SetSubject(user.ID) + case oidc.ScopeEmail: if user.HumanView == nil { continue } - userInfo.Email = user.Email - userInfo.EmailVerified = user.IsEmailVerified - case scopeProfile: - userInfo.PreferredUsername = user.PreferredLoginName - userInfo.UpdatedAt = user.ChangeDate + userInfo.SetEmail(user.Email, user.IsEmailVerified) + case oidc.ScopeProfile: + userInfo.SetPreferredUsername(user.PreferredLoginName) + userInfo.SetUpdatedAt(user.ChangeDate) if user.HumanView != nil { - userInfo.Name = user.DisplayName - userInfo.FamilyName = user.LastName - userInfo.GivenName = user.FirstName - userInfo.Nickname = user.NickName - userInfo.Gender = oidc.Gender(getGender(user.Gender)) - userInfo.Locale, err = language.Parse(user.PreferredLanguage) + userInfo.SetName(user.DisplayName) + userInfo.SetFamilyName(user.LastName) + userInfo.SetGivenName(user.FirstName) + userInfo.SetNickname(user.NickName) + userInfo.SetGender(oidc.Gender(getGender(user.Gender))) + locale, _ := language.Parse(user.PreferredLanguage) + userInfo.SetLocale(locale) } else { - userInfo.Name = user.MachineView.Name + userInfo.SetName(user.MachineView.Name) } - case scopePhone: + case oidc.ScopePhone: if user.HumanView == nil { continue } - userInfo.PhoneNumber = user.Phone - userInfo.PhoneNumberVerified = user.IsPhoneVerified - case scopeAddress: + userInfo.SetPhone(user.Phone, user.IsPhoneVerified) + case oidc.ScopeAddress: if user.HumanView == nil { continue } if user.StreetAddress == "" && user.Locality == "" && user.Region == "" && user.PostalCode == "" && user.Country == "" { continue } - userInfo.Address = &oidc.UserinfoAddress{ - StreetAddress: user.StreetAddress, - Locality: user.Locality, - Region: user.Region, - PostalCode: user.PostalCode, - Country: user.Country, - } + userInfo.SetAddress(oidc.NewUserInfoAddress(user.StreetAddress, user.Locality, user.Region, user.PostalCode, user.Country, "")) default: - userInfo.Authorizations = append(userInfo.Authorizations, scope) + if strings.HasPrefix(scope, ScopeProjectRolePrefix) { + roles = append(roles, strings.TrimPrefix(scope, ScopeProjectRolePrefix)) + } } } + + if len(roles) == 0 || applicationID == "" { + return userInfo, nil + } + projectRoles, err := o.assertRoles(ctx, userID, applicationID, roles) + if err != nil { + return nil, err + } + if len(projectRoles) > 0 { + userInfo.AppendClaims(ClaimProjectRoles, projectRoles) + } + return userInfo, nil } +func (o *OPStorage) GetPrivateClaimsFromScopes(ctx context.Context, userID, applicationID string, scopes []string) (claims map[string]interface{}, err error) { + roles := make([]string, 0) + for _, scope := range scopes { + if strings.HasPrefix(scope, ScopeProjectRolePrefix) { + roles = append(roles, strings.TrimPrefix(scope, ScopeProjectRolePrefix)) + } + } + if len(roles) == 0 || applicationID == "" { + return nil, nil + } + projectRoles, err := o.assertRoles(ctx, userID, applicationID, roles) + if err != nil { + return nil, err + } + if len(projectRoles) > 0 { + claims = map[string]interface{}{ClaimProjectRoles: projectRoles} + } + return claims, err +} + +func (o *OPStorage) assertRoles(ctx context.Context, userID, applicationID string, requestedRoles []string) (map[string]map[string]string, error) { + app, err := o.repo.ApplicationByClientID(ctx, applicationID) + if err != nil { + return nil, err + } + grants, err := o.repo.UserGrantsByProjectAndUserID(app.ProjectID, userID) + if err != nil { + return nil, err + } + projectRoles := make(map[string]map[string]string) + for _, requestedRole := range requestedRoles { + for _, grant := range grants { + checkGrantedRoles(projectRoles, grant, requestedRole) + } + } + return projectRoles, nil +} + +func checkGrantedRoles(roles map[string]map[string]string, grant *grant_model.UserGrantView, requestedRole string) { + for _, grantedRole := range grant.RoleKeys { + if requestedRole == grantedRole { + appendRole(roles, grantedRole, grant.ResourceOwner, grant.OrgPrimaryDomain) + } + } +} + +func appendRole(roles map[string]map[string]string, role, orgID, orgPrimaryDomain string) { + if roles[role] == nil { + roles[role] = make(map[string]string, 0) + } + roles[role][orgID] = orgPrimaryDomain +} + func getGender(gender user_model.Gender) string { switch gender { case user_model.GenderFemale: diff --git a/internal/api/oidc/client_converter.go b/internal/api/oidc/client_converter.go index b3b5dcfcfd..81df1cf84f 100644 --- a/internal/api/oidc/client_converter.go +++ b/internal/api/oidc/client_converter.go @@ -1,9 +1,9 @@ package oidc import ( - "github.com/caos/oidc/pkg/oidc" "time" + "github.com/caos/oidc/pkg/oidc" "github.com/caos/oidc/pkg/op" "github.com/caos/zitadel/internal/errors" @@ -15,13 +15,20 @@ type Client struct { defaultLoginURL string defaultAccessTokenLifetime time.Duration defaultIdTokenLifetime time.Duration + allowedScopes []string } -func ClientFromBusiness(app *model.ApplicationView, defaultLoginURL string, defaultAccessTokenLifetime, defaultIdTokenLifetime time.Duration) (op.Client, error) { +func ClientFromBusiness(app *model.ApplicationView, defaultLoginURL string, defaultAccessTokenLifetime, defaultIdTokenLifetime time.Duration, allowedScopes []string) (op.Client, error) { if !app.IsOIDC { return nil, errors.ThrowInvalidArgument(nil, "OIDC-d5bhD", "client is not a proper oidc application") } - return &Client{ApplicationView: app, defaultLoginURL: defaultLoginURL, defaultAccessTokenLifetime: defaultAccessTokenLifetime, defaultIdTokenLifetime: defaultIdTokenLifetime}, nil + return &Client{ + ApplicationView: app, + defaultLoginURL: defaultLoginURL, + defaultAccessTokenLifetime: defaultAccessTokenLifetime, + defaultIdTokenLifetime: defaultIdTokenLifetime, + allowedScopes: allowedScopes}, + nil } func (c *Client) ApplicationType() op.ApplicationType { @@ -56,6 +63,18 @@ func (c *Client) DevMode() bool { return c.ApplicationView.DevMode } +func (c *Client) AllowedScopes() []string { + return c.allowedScopes +} + +func (c *Client) AssertAdditionalIdTokenScopes() bool { + return c.IDTokenRoleAssertion +} + +func (c *Client) AssertAdditionalAccessTokenScopes() bool { + return c.AccessTokenRoleAssertion +} + func (c *Client) AccessTokenLifetime() time.Duration { return c.defaultAccessTokenLifetime //PLANNED: impl from real client } @@ -65,7 +84,18 @@ func (c *Client) IDTokenLifetime() time.Duration { } func (c *Client) AccessTokenType() op.AccessTokenType { - return op.AccessTokenTypeBearer //PLANNED: impl from real client + return accessTokenTypeToOIDC(c.ApplicationView.AccessTokenType) +} + +func accessTokenTypeToOIDC(tokenType model.OIDCTokenType) op.AccessTokenType { + switch tokenType { + case model.OIDCTokenTypeBearer: + return op.AccessTokenTypeBearer + case model.OIDCTokenTypeJWT: + return op.AccessTokenTypeJWT + default: + return op.AccessTokenTypeBearer + } } func authMethodToOIDC(authType model.OIDCAuthMethodType) op.AuthMethod { diff --git a/internal/api/oidc/op.go b/internal/api/oidc/op.go index 519999809b..6417b7c7cf 100644 --- a/internal/api/oidc/op.go +++ b/internal/api/oidc/op.go @@ -59,6 +59,7 @@ func NewProvider(ctx context.Context, config OPHandlerConfig, repo repository.Re config.OPConfig, newStorage(config.StorageConfig, repo), op.WithHttpInterceptors( + middleware.TraceHandler(), middleware.NoCacheInterceptor, cookieHandler, http_utils.CopyHeadersToContext, diff --git a/internal/auth/repository/auth_request.go b/internal/auth/repository/auth_request.go index 8779b7fb7c..c3301296a6 100644 --- a/internal/auth/repository/auth_request.go +++ b/internal/auth/repository/auth_request.go @@ -16,11 +16,13 @@ type AuthRequestRepository interface { SaveAuthCode(ctx context.Context, id, code, userAgentID string) error DeleteAuthRequest(ctx context.Context, id string) error CheckLoginName(ctx context.Context, id, loginName, userAgentID string) error - CheckExternalUserLogin(ctx context.Context, authReqID, userAgentID string, user *model.ExternalUser) error + CheckExternalUserLogin(ctx context.Context, authReqID, userAgentID string, user *model.ExternalUser, info *model.BrowserInfo) error SelectUser(ctx context.Context, id, userID, userAgentID string) error SelectExternalIDP(ctx context.Context, authReqID, idpConfigID, userAgentID string) error VerifyPassword(ctx context.Context, id, userID, password, userAgentID string, info *model.BrowserInfo) error VerifyMfaOTP(ctx context.Context, agentID, authRequestID, code, userAgentID string, info *model.BrowserInfo) error - LinkExternalUsers(ctx context.Context, authReqID, userAgentID string) error - AutoRegisterExternalUser(ctx context.Context, user *user_model.User, externalIDP *user_model.ExternalIDP, member *org_model.OrgMember, authReqID, userAgentID, resourceOwner string) error + LinkExternalUsers(ctx context.Context, authReqID, userAgentID string, info *model.BrowserInfo) error + AutoRegisterExternalUser(ctx context.Context, user *user_model.User, externalIDP *user_model.ExternalIDP, member *org_model.OrgMember, authReqID, userAgentID, resourceOwner string, info *model.BrowserInfo) error + ResetLinkingUsers(ctx context.Context, authReqID, userAgentID string) error + GetOrgByPrimaryDomain(primaryDomain string) (*org_model.OrgView, error) } diff --git a/internal/auth/repository/eventsourcing/eventstore/auth_request.go b/internal/auth/repository/eventsourcing/eventstore/auth_request.go index 73e86fa798..0876dc90f9 100644 --- a/internal/auth/repository/eventsourcing/eventstore/auth_request.go +++ b/internal/auth/repository/eventsourcing/eventstore/auth_request.go @@ -2,35 +2,36 @@ package eventstore import ( "context" - "github.com/caos/zitadel/internal/api/authz" - "github.com/caos/zitadel/internal/eventstore/sdk" - iam_model "github.com/caos/zitadel/internal/iam/model" - iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" - org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" - policy_event "github.com/caos/zitadel/internal/policy/repository/eventsourcing" "time" "github.com/caos/logging" + "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/auth/repository/eventsourcing/view" "github.com/caos/zitadel/internal/auth_request/model" cache "github.com/caos/zitadel/internal/auth_request/repository" "github.com/caos/zitadel/internal/errors" es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/sdk" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" iam_view_model "github.com/caos/zitadel/internal/iam/repository/view/model" "github.com/caos/zitadel/internal/id" org_model "github.com/caos/zitadel/internal/org/model" + org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" org_view_model "github.com/caos/zitadel/internal/org/repository/view/model" + project_view_model "github.com/caos/zitadel/internal/project/repository/view/model" + "github.com/caos/zitadel/internal/tracing" user_model "github.com/caos/zitadel/internal/user/model" user_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" user_view_model "github.com/caos/zitadel/internal/user/repository/view/model" + grant_view_model "github.com/caos/zitadel/internal/usergrant/repository/view/model" ) type AuthRequestRepo struct { UserEvents *user_event.UserEventstore OrgEvents *org_event.OrgEventstore - PolicyEvents *policy_event.PolicyEventstore AuthRequests cache.AuthRequestCache View *view.View @@ -40,13 +41,15 @@ type AuthRequestRepo struct { OrgViewProvider orgViewProvider LoginPolicyViewProvider loginPolicyViewProvider IDPProviderViewProvider idpProviderViewProvider + UserGrantProvider userGrantProvider IdGenerator id.Generator - PasswordCheckLifeTime time.Duration - MfaInitSkippedLifeTime time.Duration - MfaSoftwareCheckLifeTime time.Duration - MfaHardwareCheckLifeTime time.Duration + PasswordCheckLifeTime time.Duration + ExternalLoginCheckLifeTime time.Duration + MfaInitSkippedLifeTime time.Duration + MfaSoftwareCheckLifeTime time.Duration + MfaHardwareCheckLifeTime time.Duration IAMID string } @@ -74,6 +77,12 @@ type userEventProvider interface { type orgViewProvider interface { OrgByID(string) (*org_view_model.OrgView, error) + OrgByPrimaryDomain(string) (*org_view_model.OrgView, error) +} + +type userGrantProvider interface { + ApplicationByClientID(context.Context, string) (*project_view_model.ApplicationView, error) + UserGrantsByProjectAndUserID(string, string) ([]*grant_view_model.UserGrantView, error) } func (repo *AuthRequestRepo) Health(ctx context.Context) error { @@ -83,20 +92,26 @@ func (repo *AuthRequestRepo) Health(ctx context.Context) error { return repo.AuthRequests.Health(ctx) } -func (repo *AuthRequestRepo) CreateAuthRequest(ctx context.Context, request *model.AuthRequest) (*model.AuthRequest, error) { +func (repo *AuthRequestRepo) CreateAuthRequest(ctx context.Context, request *model.AuthRequest) (_ *model.AuthRequest, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() reqID, err := repo.IdGenerator.Next() if err != nil { return nil, err } request.ID = reqID - ids, err := repo.View.AppIDsFromProjectByClientID(ctx, request.ApplicationID) + app, err := repo.View.ApplicationByClientID(ctx, request.ApplicationID) if err != nil { return nil, err } - request.Audience = ids + appIDs, err := repo.View.AppIDsFromProjectID(ctx, app.ProjectID) + if err != nil { + return nil, err + } + request.Audience = appIDs if request.LoginHint != "" { err = repo.checkLoginName(ctx, request, request.LoginHint) - logging.LogWithFields("EVENT-aG311", "login name", request.LoginHint, "id", request.ID, "applicationID", request.ApplicationID).Debug("login hint invalid") + logging.LogWithFields("EVENT-aG311", "login name", request.LoginHint, "id", request.ID, "applicationID", request.ApplicationID).OnError(err).Debug("login hint invalid") } err = repo.AuthRequests.SaveAuthRequest(ctx, request) if err != nil { @@ -105,15 +120,21 @@ func (repo *AuthRequestRepo) CreateAuthRequest(ctx context.Context, request *mod return request, nil } -func (repo *AuthRequestRepo) AuthRequestByID(ctx context.Context, id, userAgentID string) (*model.AuthRequest, error) { +func (repo *AuthRequestRepo) AuthRequestByID(ctx context.Context, id, userAgentID string) (_ *model.AuthRequest, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() return repo.getAuthRequestNextSteps(ctx, id, userAgentID, false) } -func (repo *AuthRequestRepo) AuthRequestByIDCheckLoggedIn(ctx context.Context, id, userAgentID string) (*model.AuthRequest, error) { +func (repo *AuthRequestRepo) AuthRequestByIDCheckLoggedIn(ctx context.Context, id, userAgentID string) (_ *model.AuthRequest, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() return repo.getAuthRequestNextSteps(ctx, id, userAgentID, true) } -func (repo *AuthRequestRepo) SaveAuthCode(ctx context.Context, id, code, userAgentID string) error { +func (repo *AuthRequestRepo) SaveAuthCode(ctx context.Context, id, code, userAgentID string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, id, userAgentID) if err != nil { return err @@ -122,7 +143,9 @@ func (repo *AuthRequestRepo) SaveAuthCode(ctx context.Context, id, code, userAge return repo.AuthRequests.UpdateAuthRequest(ctx, request) } -func (repo *AuthRequestRepo) AuthRequestByCode(ctx context.Context, code string) (*model.AuthRequest, error) { +func (repo *AuthRequestRepo) AuthRequestByCode(ctx context.Context, code string) (_ *model.AuthRequest, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.AuthRequests.GetAuthRequestByCode(ctx, code) if err != nil { return nil, err @@ -135,11 +158,15 @@ func (repo *AuthRequestRepo) AuthRequestByCode(ctx context.Context, code string) return request, nil } -func (repo *AuthRequestRepo) DeleteAuthRequest(ctx context.Context, id string) error { +func (repo *AuthRequestRepo) DeleteAuthRequest(ctx context.Context, id string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() return repo.AuthRequests.DeleteAuthRequest(ctx, id) } -func (repo *AuthRequestRepo) CheckLoginName(ctx context.Context, id, loginName, userAgentID string) error { +func (repo *AuthRequestRepo) CheckLoginName(ctx context.Context, id, loginName, userAgentID string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, id, userAgentID) if err != nil { return err @@ -151,7 +178,9 @@ func (repo *AuthRequestRepo) CheckLoginName(ctx context.Context, id, loginName, return repo.AuthRequests.UpdateAuthRequest(ctx, request) } -func (repo *AuthRequestRepo) SelectExternalIDP(ctx context.Context, authReqID, idpConfigID, userAgentID string) error { +func (repo *AuthRequestRepo) SelectExternalIDP(ctx context.Context, authReqID, idpConfigID, userAgentID string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, authReqID, userAgentID) if err != nil { return err @@ -163,18 +192,28 @@ func (repo *AuthRequestRepo) SelectExternalIDP(ctx context.Context, authReqID, i return repo.AuthRequests.UpdateAuthRequest(ctx, request) } -func (repo *AuthRequestRepo) CheckExternalUserLogin(ctx context.Context, authReqID, userAgentID string, externalUser *model.ExternalUser) error { +func (repo *AuthRequestRepo) CheckExternalUserLogin(ctx context.Context, authReqID, userAgentID string, externalUser *model.ExternalUser, info *model.BrowserInfo) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, authReqID, userAgentID) if err != nil { return err } err = repo.checkExternalUserLogin(request, externalUser.IDPConfigID, externalUser.ExternalUserID) if errors.IsNotFound(err) { - return repo.setLinkingUser(ctx, request, externalUser) + if err := repo.setLinkingUser(ctx, request, externalUser); err != nil { + return err + } + return err } if err != nil { return err } + + err = repo.UserEvents.ExternalLoginChecked(ctx, request.UserID, request.WithCurrentInfo(info)) + if err != nil { + return err + } return repo.AuthRequests.UpdateAuthRequest(ctx, request) } @@ -183,7 +222,9 @@ func (repo *AuthRequestRepo) setLinkingUser(ctx context.Context, request *model. return repo.AuthRequests.UpdateAuthRequest(ctx, request) } -func (repo *AuthRequestRepo) SelectUser(ctx context.Context, id, userID, userAgentID string) error { +func (repo *AuthRequestRepo) SelectUser(ctx context.Context, id, userID, userAgentID string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, id, userAgentID) if err != nil { return err @@ -196,7 +237,9 @@ func (repo *AuthRequestRepo) SelectUser(ctx context.Context, id, userID, userAge return repo.AuthRequests.UpdateAuthRequest(ctx, request) } -func (repo *AuthRequestRepo) VerifyPassword(ctx context.Context, id, userID, password, userAgentID string, info *model.BrowserInfo) error { +func (repo *AuthRequestRepo) VerifyPassword(ctx context.Context, id, userID, password, userAgentID string, info *model.BrowserInfo) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, id, userAgentID) if err != nil { return err @@ -207,7 +250,9 @@ func (repo *AuthRequestRepo) VerifyPassword(ctx context.Context, id, userID, pas return repo.UserEvents.CheckPassword(ctx, userID, password, request.WithCurrentInfo(info)) } -func (repo *AuthRequestRepo) VerifyMfaOTP(ctx context.Context, authRequestID, userID, code, userAgentID string, info *model.BrowserInfo) error { +func (repo *AuthRequestRepo) VerifyMfaOTP(ctx context.Context, authRequestID, userID, code, userAgentID string, info *model.BrowserInfo) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, authRequestID, userAgentID) if err != nil { return err @@ -218,7 +263,9 @@ func (repo *AuthRequestRepo) VerifyMfaOTP(ctx context.Context, authRequestID, us return repo.UserEvents.CheckMfaOTP(ctx, userID, code, request.WithCurrentInfo(info)) } -func (repo *AuthRequestRepo) LinkExternalUsers(ctx context.Context, authReqID, userAgentID string) error { +func (repo *AuthRequestRepo) LinkExternalUsers(ctx context.Context, authReqID, userAgentID string, info *model.BrowserInfo) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, authReqID, userAgentID) if err != nil { return err @@ -227,11 +274,27 @@ func (repo *AuthRequestRepo) LinkExternalUsers(ctx context.Context, authReqID, u if err != nil { return err } + err = repo.UserEvents.ExternalLoginChecked(ctx, request.UserID, request.WithCurrentInfo(info)) + if err != nil { + return err + } request.LinkingUsers = nil return repo.AuthRequests.UpdateAuthRequest(ctx, request) } -func (repo *AuthRequestRepo) AutoRegisterExternalUser(ctx context.Context, registerUser *user_model.User, externalIDP *user_model.ExternalIDP, orgMember *org_model.OrgMember, authReqID, userAgentID, resourceOwner string) error { +func (repo *AuthRequestRepo) ResetLinkingUsers(ctx context.Context, authReqID, userAgentID string) error { + request, err := repo.getAuthRequest(ctx, authReqID, userAgentID) + if err != nil { + return err + } + request.LinkingUsers = nil + request.SelectedIDPConfigID = "" + return repo.AuthRequests.UpdateAuthRequest(ctx, request) +} + +func (repo *AuthRequestRepo) AutoRegisterExternalUser(ctx context.Context, registerUser *user_model.User, externalIDP *user_model.ExternalIDP, orgMember *org_model.OrgMember, authReqID, userAgentID, resourceOwner string, info *model.BrowserInfo) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() request, err := repo.getAuthRequest(ctx, authReqID, userAgentID) if err != nil { return err @@ -240,15 +303,23 @@ func (repo *AuthRequestRepo) AutoRegisterExternalUser(ctx context.Context, regis if resourceOwner != "" { policyResourceOwner = resourceOwner } - pwPolicy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, policyResourceOwner) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(policyResourceOwner) + if errors.IsNotFound(err) { + pwPolicy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.IAMID) + } if err != nil { return err } - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, policyResourceOwner) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(pwPolicy) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(policyResourceOwner) + if errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.IAMID) + } if err != nil { return err } - user, aggregates, err := repo.UserEvents.PrepareRegisterUser(ctx, registerUser, externalIDP, pwPolicy, orgPolicy, resourceOwner) + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + user, aggregates, err := repo.UserEvents.PrepareRegisterUser(ctx, registerUser, externalIDP, pwPolicyView, orgPolicyView, resourceOwner) if err != nil { return err } @@ -266,8 +337,13 @@ func (repo *AuthRequestRepo) AutoRegisterExternalUser(ctx context.Context, regis return err } request.UserID = user.AggregateID + request.UserOrgID = user.ResourceOwner request.SelectedIDPConfigID = externalIDP.IDPConfigID request.LinkingUsers = nil + err = repo.UserEvents.ExternalLoginChecked(ctx, request.UserID, request.WithCurrentInfo(info)) + if err != nil { + return err + } return repo.AuthRequests.UpdateAuthRequest(ctx, request) } @@ -317,7 +393,14 @@ func (repo *AuthRequestRepo) getLoginPolicyAndIDPProviders(ctx context.Context, func (repo *AuthRequestRepo) fillLoginPolicy(ctx context.Context, request *model.AuthRequest) error { orgID := request.UserOrgID if orgID == "" { - orgID = request.GetScopeOrgID() + primaryDomain := request.GetScopeOrgPrimaryDomain() + if primaryDomain != "" { + org, err := repo.GetOrgByPrimaryDomain(primaryDomain) + if err != nil { + return err + } + orgID = org.ID + } } if orgID == "" { orgID = repo.IAMID @@ -335,7 +418,16 @@ func (repo *AuthRequestRepo) fillLoginPolicy(ctx context.Context, request *model } func (repo *AuthRequestRepo) checkLoginName(ctx context.Context, request *model.AuthRequest, loginName string) (err error) { - orgID := request.GetScopeOrgID() + primaryDomain := request.GetScopeOrgPrimaryDomain() + orgID := "" + if primaryDomain != "" { + org, err := repo.GetOrgByPrimaryDomain(primaryDomain) + if err != nil { + return err + } + orgID = org.ID + } + user := new(user_view_model.UserView) if orgID != "" { user, err = repo.View.UserByLoginNameAndResourceOwner(loginName, orgID) @@ -356,6 +448,14 @@ func (repo *AuthRequestRepo) checkLoginName(ctx context.Context, request *model. return nil } +func (repo AuthRequestRepo) GetOrgByPrimaryDomain(primaryDomain string) (*org_model.OrgView, error) { + org, err := repo.OrgViewProvider.OrgByPrimaryDomain(primaryDomain) + if err != nil { + return nil, err + } + return org_view_model.OrgToModel(org), nil +} + func (repo AuthRequestRepo) checkLoginPolicyWithResourceOwner(ctx context.Context, request *model.AuthRequest, user *user_view_model.UserView) error { loginPolicy, idpProviders, err := repo.getLoginPolicyAndIDPProviders(ctx, user.ResourceOwner) if err != nil { @@ -386,10 +486,15 @@ func (repo *AuthRequestRepo) checkSelectedExternalIDP(request *model.AuthRequest } func (repo *AuthRequestRepo) checkExternalUserLogin(request *model.AuthRequest, idpConfigID, externalUserID string) (err error) { - orgID := request.GetScopeOrgID() + primaryDomain := request.GetScopeOrgPrimaryDomain() externalIDP := new(user_view_model.ExternalIDPView) - if orgID != "" { - externalIDP, err = repo.View.ExternalIDPByExternalUserIDAndIDPConfigIDAndResourceOwner(externalUserID, idpConfigID, orgID) + org := new(org_model.OrgView) + if primaryDomain != "" { + org, err = repo.GetOrgByPrimaryDomain(primaryDomain) + if err != nil { + return err + } + externalIDP, err = repo.View.ExternalIDPByExternalUserIDAndIDPConfigIDAndResourceOwner(externalUserID, idpConfigID, org.ID) } else { externalIDP, err = repo.View.ExternalIDPByExternalUserIDAndIDPConfigID(externalUserID, idpConfigID) } @@ -435,7 +540,11 @@ func (repo *AuthRequestRepo) nextSteps(ctx context.Context, request *model.AuthR return nil, err } - if request.SelectedIDPConfigID == "" { + if (request.SelectedIDPConfigID != "" || userSession.SelectedIDPConfigID != "") && (request.LinkingUsers == nil || len(request.LinkingUsers) == 0) { + if !checkVerificationTime(userSession.ExternalLoginVerification, repo.ExternalLoginCheckLifeTime) { + return append(steps, &model.ExternalLoginStep{}), nil + } + } else if (request.SelectedIDPConfigID == "" && userSession.SelectedIDPConfigID == "") || (request.SelectedIDPConfigID != "" && request.LinkingUsers != nil && len(request.LinkingUsers) > 0) { if user.InitRequired { return append(steps, &model.InitUserStep{PasswordSet: user.PasswordSet}), nil } @@ -473,6 +582,15 @@ func (repo *AuthRequestRepo) nextSteps(ctx context.Context, request *model.AuthR } //PLANNED: consent step + + missing, err := userGrantRequired(ctx, request, user, repo.UserGrantProvider) + if err != nil { + return nil, err + } + if missing { + return append(steps, &model.GrantRequiredStep{}), nil + } + return append(steps, &model.RedirectToCallbackStep{}), nil } @@ -603,6 +721,7 @@ func userSessionByIDs(ctx context.Context, provider userSessionViewProvider, eve es_model.UserDeactivated, es_model.HumanPasswordCheckSucceeded, es_model.HumanPasswordCheckFailed, + es_model.HumanExternalLoginCheckSucceeded, es_model.HumanMFAOTPCheckSucceeded, es_model.HumanMFAOTPCheckFailed, es_model.HumanSignedOut: @@ -649,21 +768,32 @@ func activeUserByID(ctx context.Context, userViewProvider userViewProvider, user } func userByID(ctx context.Context, viewProvider userViewProvider, eventProvider userEventProvider, userID string) (*user_model.UserView, error) { - user, err := viewProvider.UserByID(userID) - if err != nil { - return nil, err + user, viewErr := viewProvider.UserByID(userID) + if viewErr != nil && !errors.IsNotFound(viewErr) { + return nil, viewErr + } else if user == nil { + user = new(user_view_model.UserView) } events, err := eventProvider.UserEventsByID(ctx, userID, user.Sequence) if err != nil { logging.Log("EVENT-dfg42").WithError(err).Debug("error retrieving new events") return user_view_model.UserToModel(user), nil } + if len(events) == 0 { + if viewErr != nil { + return nil, viewErr + } + return user_view_model.UserToModel(user), viewErr + } userCopy := *user for _, event := range events { if err := userCopy.AppendEvent(event); err != nil { return user_view_model.UserToModel(user), nil } } + if userCopy.State == int32(user_model.UserStateDeleted) { + return nil, errors.ThrowNotFound(nil, "EVENT-3F9so", "Errors.User.NotFound") + } return user_view_model.UserToModel(&userCopy), nil } @@ -700,3 +830,23 @@ func linkingIDPConfigExistingInAllowedIDPs(linkingUsers []*model.ExternalUser, i } return true } +func userGrantRequired(ctx context.Context, request *model.AuthRequest, user *user_model.UserView, userGrantProvider userGrantProvider) (_ bool, err error) { + var app *project_view_model.ApplicationView + switch request.Request.Type() { + case model.AuthRequestTypeOIDC: + app, err = userGrantProvider.ApplicationByClientID(ctx, request.ApplicationID) + if err != nil { + return false, err + } + default: + return false, errors.ThrowPreconditionFailed(nil, "EVENT-dfrw2", "Errors.AuthRequest.RequestTypeNotSupported") + } + if !app.ProjectRoleCheck { + return false, nil + } + grants, err := userGrantProvider.UserGrantsByProjectAndUserID(app.ProjectID, user.ID) + if err != nil { + return false, err + } + return len(grants) == 0, nil +} diff --git a/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go b/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go index 848b615b42..ea8a299791 100644 --- a/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go +++ b/internal/auth/repository/eventsourcing/eventstore/auth_request_test.go @@ -15,10 +15,12 @@ import ( es_models "github.com/caos/zitadel/internal/eventstore/models" org_model "github.com/caos/zitadel/internal/org/model" org_view_model "github.com/caos/zitadel/internal/org/repository/view/model" + proj_view_model "github.com/caos/zitadel/internal/project/repository/view/model" user_model "github.com/caos/zitadel/internal/user/model" user_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" user_es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" user_view_model "github.com/caos/zitadel/internal/user/repository/view/model" + grant_view_model "github.com/caos/zitadel/internal/usergrant/repository/view/model" ) type mockViewNoUserSession struct{} @@ -42,9 +44,10 @@ func (m *mockViewErrUserSession) UserSessionsByAgentID(string) ([]*user_view_mod } type mockViewUserSession struct { - PasswordVerification time.Time - MfaSoftwareVerification time.Time - Users []mockUser + ExternalLoginVerification time.Time + PasswordVerification time.Time + MfaSoftwareVerification time.Time + Users []mockUser } type mockUser struct { @@ -54,8 +57,9 @@ type mockUser struct { func (m *mockViewUserSession) UserSessionByIDs(string, string) (*user_view_model.UserSessionView, error) { return &user_view_model.UserSessionView{ - PasswordVerification: m.PasswordVerification, - MfaSoftwareVerification: m.MfaSoftwareVerification, + ExternalLoginVerification: m.ExternalLoginVerification, + PasswordVerification: m.PasswordVerification, + MfaSoftwareVerification: m.MfaSoftwareVerification, }, nil } @@ -139,25 +143,54 @@ func (m *mockViewOrg) OrgByID(string) (*org_view_model.OrgView, error) { }, nil } +func (m *mockViewOrg) OrgByPrimaryDomain(string) (*org_view_model.OrgView, error) { + return &org_view_model.OrgView{ + State: int32(m.State), + }, nil +} + type mockViewErrOrg struct{} func (m *mockViewErrOrg) OrgByID(string) (*org_view_model.OrgView, error) { return nil, errors.ThrowInternal(nil, "id", "internal error") } +func (m *mockViewErrOrg) OrgByPrimaryDomain(string) (*org_view_model.OrgView, error) { + return nil, errors.ThrowInternal(nil, "id", "internal error") +} + +type mockUserGrants struct { + roleCheck bool + userGrants int +} + +func (m *mockUserGrants) ApplicationByClientID(ctx context.Context, s string) (*proj_view_model.ApplicationView, error) { + return &proj_view_model.ApplicationView{ProjectRoleCheck: m.roleCheck}, nil +} + +func (m *mockUserGrants) UserGrantsByProjectAndUserID(s string, s2 string) ([]*grant_view_model.UserGrantView, error) { + var grants []*grant_view_model.UserGrantView + if m.userGrants > 0 { + grants = make([]*grant_view_model.UserGrantView, m.userGrants) + } + return grants, nil +} + func TestAuthRequestRepo_nextSteps(t *testing.T) { type fields struct { - UserEvents *user_event.UserEventstore - AuthRequests *cache.AuthRequestCache - View *view.View - userSessionViewProvider userSessionViewProvider - userViewProvider userViewProvider - userEventProvider userEventProvider - orgViewProvider orgViewProvider - PasswordCheckLifeTime time.Duration - MfaInitSkippedLifeTime time.Duration - MfaSoftwareCheckLifeTime time.Duration - MfaHardwareCheckLifeTime time.Duration + UserEvents *user_event.UserEventstore + AuthRequests *cache.AuthRequestCache + View *view.View + userSessionViewProvider userSessionViewProvider + userViewProvider userViewProvider + userEventProvider userEventProvider + orgViewProvider orgViewProvider + userGrantProvider userGrantProvider + PasswordCheckLifeTime time.Duration + ExternalLoginCheckLifeTime time.Duration + MfaInitSkippedLifeTime time.Duration + MfaSoftwareCheckLifeTime time.Duration + MfaHardwareCheckLifeTime time.Duration } type args struct { request *model.AuthRequest @@ -381,7 +414,7 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { nil, }, { - "external user (no password set), callback", + "external user (no external verification), external login step", fields{ userSessionViewProvider: &mockViewUserSession{ MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), @@ -395,6 +428,27 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { MfaSoftwareCheckLifeTime: 18 * time.Hour, }, args{&model.AuthRequest{UserID: "UserID", SelectedIDPConfigID: "IDPConfigID"}, false}, + []model.NextStep{&model.ExternalLoginStep{}}, + nil, + }, + { + "external user (external verification set), callback", + fields{ + userSessionViewProvider: &mockViewUserSession{ + ExternalLoginVerification: time.Now().UTC().Add(-5 * time.Minute), + MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), + }, + userViewProvider: &mockViewUser{ + IsEmailVerified: true, + MfaMaxSetUp: int32(model.MfaLevelSoftware), + }, + userEventProvider: &mockEventUser{}, + orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + userGrantProvider: &mockUserGrants{}, + ExternalLoginCheckLifeTime: 10 * 24 * time.Hour, + MfaSoftwareCheckLifeTime: 18 * time.Hour, + }, + args{&model.AuthRequest{UserID: "UserID", SelectedIDPConfigID: "IDPConfigID", Request: &model.AuthRequestOIDC{}}, false}, []model.NextStep{&model.RedirectToCallbackStep{}}, nil, }, @@ -417,18 +471,21 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { "external user (no password check needed), callback", fields{ userSessionViewProvider: &mockViewUserSession{ - MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), + MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), + ExternalLoginVerification: time.Now().UTC().Add(-5 * time.Minute), }, userViewProvider: &mockViewUser{ PasswordSet: true, IsEmailVerified: true, MfaMaxSetUp: int32(model.MfaLevelSoftware), }, - userEventProvider: &mockEventUser{}, - orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, - MfaSoftwareCheckLifeTime: 18 * time.Hour, + userEventProvider: &mockEventUser{}, + orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + userGrantProvider: &mockUserGrants{}, + MfaSoftwareCheckLifeTime: 18 * time.Hour, + ExternalLoginCheckLifeTime: 10 * 24 * time.Hour, }, - args{&model.AuthRequest{UserID: "UserID", SelectedIDPConfigID: "IDPConfigID"}, false}, + args{&model.AuthRequest{UserID: "UserID", SelectedIDPConfigID: "IDPConfigID", Request: &model.AuthRequestOIDC{}}, false}, []model.NextStep{&model.RedirectToCallbackStep{}}, nil, }, @@ -458,17 +515,19 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { "external user, mfa not verified, mfa check step", fields{ userSessionViewProvider: &mockViewUserSession{ - PasswordVerification: time.Now().UTC().Add(-5 * time.Minute), + PasswordVerification: time.Now().UTC().Add(-5 * time.Minute), + ExternalLoginVerification: time.Now().UTC().Add(-5 * time.Minute), }, userViewProvider: &mockViewUser{ PasswordSet: true, OTPState: int32(user_model.MfaStateReady), MfaMaxSetUp: int32(model.MfaLevelSoftware), }, - userEventProvider: &mockEventUser{}, - orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, - PasswordCheckLifeTime: 10 * 24 * time.Hour, - MfaSoftwareCheckLifeTime: 18 * time.Hour, + userEventProvider: &mockEventUser{}, + orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + PasswordCheckLifeTime: 10 * 24 * time.Hour, + ExternalLoginCheckLifeTime: 10 * 24 * time.Hour, + MfaSoftwareCheckLifeTime: 18 * time.Hour, }, args{&model.AuthRequest{UserID: "UserID", SelectedIDPConfigID: "IDPConfigID"}, false}, []model.NextStep{&model.MfaVerificationStep{ @@ -553,10 +612,11 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { }, userEventProvider: &mockEventUser{}, orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + userGrantProvider: &mockUserGrants{}, PasswordCheckLifeTime: 10 * 24 * time.Hour, MfaSoftwareCheckLifeTime: 18 * time.Hour, }, - args{&model.AuthRequest{UserID: "UserID"}, false}, + args{&model.AuthRequest{UserID: "UserID", Request: &model.AuthRequestOIDC{}}, false}, []model.NextStep{&model.RedirectToCallbackStep{}}, nil, }, @@ -574,15 +634,66 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { }, userEventProvider: &mockEventUser{}, orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + userGrantProvider: &mockUserGrants{}, PasswordCheckLifeTime: 10 * 24 * time.Hour, MfaSoftwareCheckLifeTime: 18 * time.Hour, }, - args{&model.AuthRequest{UserID: "UserID", Prompt: model.PromptNone}, true}, + args{&model.AuthRequest{UserID: "UserID", Prompt: model.PromptNone, Request: &model.AuthRequestOIDC{}}, true}, []model.NextStep{&model.RedirectToCallbackStep{}}, nil, }, { - "linking users, link users step", + "prompt none, checkLoggedIn true, authenticated and required user grants missing, grant required step", + fields{ + userSessionViewProvider: &mockViewUserSession{ + PasswordVerification: time.Now().UTC().Add(-5 * time.Minute), + MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), + }, + userViewProvider: &mockViewUser{ + PasswordSet: true, + IsEmailVerified: true, + MfaMaxSetUp: int32(model.MfaLevelSoftware), + }, + userEventProvider: &mockEventUser{}, + orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + userGrantProvider: &mockUserGrants{ + roleCheck: true, + userGrants: 0, + }, + PasswordCheckLifeTime: 10 * 24 * time.Hour, + MfaSoftwareCheckLifeTime: 18 * time.Hour, + }, + args{&model.AuthRequest{UserID: "UserID", Prompt: model.PromptNone, Request: &model.AuthRequestOIDC{}}, true}, + []model.NextStep{&model.GrantRequiredStep{}}, + nil, + }, + { + "prompt none, checkLoggedIn true, authenticated and required user grants exist, redirect to callback step", + fields{ + userSessionViewProvider: &mockViewUserSession{ + PasswordVerification: time.Now().UTC().Add(-5 * time.Minute), + MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), + }, + userViewProvider: &mockViewUser{ + PasswordSet: true, + IsEmailVerified: true, + MfaMaxSetUp: int32(model.MfaLevelSoftware), + }, + userEventProvider: &mockEventUser{}, + orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + userGrantProvider: &mockUserGrants{ + roleCheck: true, + userGrants: 2, + }, + PasswordCheckLifeTime: 10 * 24 * time.Hour, + MfaSoftwareCheckLifeTime: 18 * time.Hour, + }, + args{&model.AuthRequest{UserID: "UserID", Prompt: model.PromptNone, Request: &model.AuthRequestOIDC{}}, true}, + []model.NextStep{&model.RedirectToCallbackStep{}}, + nil, + }, + { + "linking users, password step", fields{ userSessionViewProvider: &mockViewUserSession{ MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), @@ -596,6 +707,32 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, MfaSoftwareCheckLifeTime: 18 * time.Hour, }, + args{ + &model.AuthRequest{ + UserID: "UserID", + SelectedIDPConfigID: "IDPConfigID", + LinkingUsers: []*model.ExternalUser{{IDPConfigID: "IDPConfigID", ExternalUserID: "UserID", DisplayName: "DisplayName"}}, + }, false}, + []model.NextStep{&model.PasswordStep{}}, + nil, + }, + { + "linking users, linking step", + fields{ + userSessionViewProvider: &mockViewUserSession{ + PasswordVerification: time.Now().UTC().Add(-5 * time.Minute), + MfaSoftwareVerification: time.Now().UTC().Add(-5 * time.Minute), + }, + userViewProvider: &mockViewUser{ + PasswordSet: true, + IsEmailVerified: true, + MfaMaxSetUp: int32(model.MfaLevelSoftware), + }, + userEventProvider: &mockEventUser{}, + orgViewProvider: &mockViewOrg{State: org_model.OrgStateActive}, + MfaSoftwareCheckLifeTime: 18 * time.Hour, + PasswordCheckLifeTime: 10 * 24 * time.Hour, + }, args{ &model.AuthRequest{ UserID: "UserID", @@ -609,17 +746,19 @@ func TestAuthRequestRepo_nextSteps(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { repo := &AuthRequestRepo{ - UserEvents: tt.fields.UserEvents, - AuthRequests: tt.fields.AuthRequests, - View: tt.fields.View, - UserSessionViewProvider: tt.fields.userSessionViewProvider, - UserViewProvider: tt.fields.userViewProvider, - UserEventProvider: tt.fields.userEventProvider, - OrgViewProvider: tt.fields.orgViewProvider, - PasswordCheckLifeTime: tt.fields.PasswordCheckLifeTime, - MfaInitSkippedLifeTime: tt.fields.MfaInitSkippedLifeTime, - MfaSoftwareCheckLifeTime: tt.fields.MfaSoftwareCheckLifeTime, - MfaHardwareCheckLifeTime: tt.fields.MfaHardwareCheckLifeTime, + UserEvents: tt.fields.UserEvents, + AuthRequests: tt.fields.AuthRequests, + View: tt.fields.View, + UserSessionViewProvider: tt.fields.userSessionViewProvider, + UserViewProvider: tt.fields.userViewProvider, + UserEventProvider: tt.fields.userEventProvider, + OrgViewProvider: tt.fields.orgViewProvider, + UserGrantProvider: tt.fields.userGrantProvider, + PasswordCheckLifeTime: tt.fields.PasswordCheckLifeTime, + ExternalLoginCheckLifeTime: tt.fields.ExternalLoginCheckLifeTime, + MfaInitSkippedLifeTime: tt.fields.MfaInitSkippedLifeTime, + MfaSoftwareCheckLifeTime: tt.fields.MfaSoftwareCheckLifeTime, + MfaHardwareCheckLifeTime: tt.fields.MfaHardwareCheckLifeTime, } got, err := repo.nextSteps(context.Background(), tt.args.request, tt.args.checkLoggedIn) if (err != nil && tt.wantErr == nil) || (tt.wantErr != nil && !tt.wantErr(err)) { @@ -988,7 +1127,9 @@ func Test_userByID(t *testing.T) { { "not found, not found error", args{ - viewProvider: &mockViewNoUser{}, + userID: "userID", + viewProvider: &mockViewNoUser{}, + eventProvider: &mockEventUser{}, }, nil, errors.IsNotFound, diff --git a/internal/auth/repository/eventsourcing/eventstore/org.go b/internal/auth/repository/eventsourcing/eventstore/org.go index fb4f46c7c4..05f06889fc 100644 --- a/internal/auth/repository/eventsourcing/eventstore/org.go +++ b/internal/auth/repository/eventsourcing/eventstore/org.go @@ -3,6 +3,9 @@ package eventstore import ( "context" "github.com/caos/logging" + "github.com/caos/zitadel/internal/api/authz" + "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/errors" iam_model "github.com/caos/zitadel/internal/iam/model" iam_view_model "github.com/caos/zitadel/internal/iam/repository/view/model" @@ -13,8 +16,6 @@ import ( org_model "github.com/caos/zitadel/internal/org/model" org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" "github.com/caos/zitadel/internal/org/repository/view/model" - policy_model "github.com/caos/zitadel/internal/policy/model" - policy_es "github.com/caos/zitadel/internal/policy/repository/eventsourcing" usr_es "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) @@ -23,12 +24,12 @@ const ( ) type OrgRepository struct { - SearchLimit uint64 - OrgEventstore *org_es.OrgEventstore - UserEventstore *usr_es.UserEventstore - PolicyEventstore *policy_es.PolicyEventstore + SearchLimit uint64 + OrgEventstore *org_es.OrgEventstore + UserEventstore *usr_es.UserEventstore - View *auth_view.View + View *auth_view.View + SystemDefaults systemdefaults.SystemDefaults } func (repo *OrgRepository) SearchOrgs(ctx context.Context, request *org_model.OrgSearchRequest) (*org_model.OrgSearchResult, error) { @@ -53,14 +54,16 @@ func (repo *OrgRepository) SearchOrgs(ctx context.Context, request *org_model.Or } func (repo *OrgRepository) RegisterOrg(ctx context.Context, register *auth_model.RegisterOrg) (*auth_model.RegisterOrg, error) { - pwPolicy, err := repo.PolicyEventstore.GetPasswordComplexityPolicy(ctx, policy_model.DefaultPolicy) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) if err != nil { return nil, err } - orgPolicy, err := repo.OrgEventstore.GetOrgIAMPolicy(ctx, policy_model.DefaultPolicy) + pwPolicyView := iam_view_model.PasswordComplexityViewToModel(pwPolicy) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) if err != nil { return nil, err } + orgPolicyView := iam_view_model.OrgIAMViewToModel(orgPolicy) users := func(ctx context.Context, domain string) ([]*es_models.Aggregate, error) { userIDs, err := repo.View.UserIDsByDomain(domain) if err != nil { @@ -72,7 +75,7 @@ func (repo *OrgRepository) RegisterOrg(ctx context.Context, register *auth_model if err != nil { return nil, err } - user, userAggregates, err := repo.UserEventstore.PrepareRegisterUser(ctx, register.User, nil, pwPolicy, orgPolicy, org.AggregateID) + user, userAggregates, err := repo.UserEventstore.PrepareRegisterUser(ctx, register.User, nil, pwPolicyView, orgPolicyView, org.AggregateID) if err != nil { return nil, err } @@ -95,12 +98,25 @@ func (repo *OrgRepository) RegisterOrg(ctx context.Context, register *auth_model return RegisterToModel(registerModel), nil } -func (repo *OrgRepository) GetDefaultOrgIamPolicy(ctx context.Context) *org_model.OrgIAMPolicy { - return repo.OrgEventstore.GetDefaultOrgIAMPolicy(ctx) +func (repo *OrgRepository) GetDefaultOrgIAMPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) { + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy := iam_view_model.OrgIAMViewToModel(orgPolicy) + policy.IAMDomain = repo.SystemDefaults.Domain + return policy, err } -func (repo *OrgRepository) GetOrgIamPolicy(ctx context.Context, orgID string) (*org_model.OrgIAMPolicy, error) { - return repo.OrgEventstore.GetOrgIAMPolicy(ctx, orgID) +func (repo *OrgRepository) GetOrgIAMPolicy(ctx context.Context, orgID string) (*iam_model.OrgIAMPolicyView, error) { + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(orgID) + if errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } + if err != nil { + return nil, err + } + return iam_view_model.OrgIAMViewToModel(orgPolicy), nil } func (repo *OrgRepository) GetIDPConfigByID(ctx context.Context, idpConfigID string) (*iam_model.IDPConfigView, error) { @@ -110,3 +126,18 @@ func (repo *OrgRepository) GetIDPConfigByID(ctx context.Context, idpConfigID str } return iam_view_model.IDPConfigViewToModel(idpConfig), nil } + +func (repo *OrgRepository) GetMyPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) { + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + } + if err != nil { + return nil, err + } + return iam_view_model.PasswordComplexityViewToModel(policy), err +} diff --git a/internal/auth/repository/eventsourcing/eventstore/policy.go b/internal/auth/repository/eventsourcing/eventstore/policy.go deleted file mode 100644 index 317909fd99..0000000000 --- a/internal/auth/repository/eventsourcing/eventstore/policy.go +++ /dev/null @@ -1,18 +0,0 @@ -package eventstore - -import ( - "context" - - "github.com/caos/zitadel/internal/api/authz" - pol_model "github.com/caos/zitadel/internal/policy/model" - pol_event "github.com/caos/zitadel/internal/policy/repository/eventsourcing" -) - -type PolicyRepo struct { - PolicyEvents *pol_event.PolicyEventstore -} - -func (repo *PolicyRepo) GetMyPasswordComplexityPolicy(ctx context.Context) (*pol_model.PasswordComplexityPolicy, error) { - ctxData := authz.GetCtxData(ctx) - return repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, ctxData.OrgID) -} diff --git a/internal/auth/repository/eventsourcing/eventstore/project.go b/internal/auth/repository/eventsourcing/eventstore/project.go new file mode 100644 index 0000000000..28fd2e916a --- /dev/null +++ b/internal/auth/repository/eventsourcing/eventstore/project.go @@ -0,0 +1,21 @@ +package eventstore + +import ( + "github.com/caos/zitadel/internal/auth/repository/eventsourcing/view" + "github.com/caos/zitadel/internal/project/model" + proj_event "github.com/caos/zitadel/internal/project/repository/eventsourcing" + proj_view_model "github.com/caos/zitadel/internal/project/repository/view/model" +) + +type ProjectRepo struct { + View *view.View + ProjectEvents *proj_event.ProjectEventstore +} + +func (a *ApplicationRepo) ProjectRolesByProjectID(projectID string) ([]*model.ProjectRoleView, error) { + roles, err := a.View.ProjectRolesByProjectID(projectID) + if err != nil { + return nil, err + } + return proj_view_model.ProjectRolesToModel(roles), nil +} diff --git a/internal/auth/repository/eventsourcing/eventstore/token.go b/internal/auth/repository/eventsourcing/eventstore/token.go index 98240e9023..c96298507f 100644 --- a/internal/auth/repository/eventsourcing/eventstore/token.go +++ b/internal/auth/repository/eventsourcing/eventstore/token.go @@ -2,38 +2,83 @@ package eventstore import ( "context" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + usr_model "github.com/caos/zitadel/internal/user/model" + user_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" + "github.com/caos/zitadel/internal/user/repository/view/model" "time" "github.com/caos/zitadel/internal/auth/repository/eventsourcing/view" - token_model "github.com/caos/zitadel/internal/token/model" - token_view_model "github.com/caos/zitadel/internal/token/repository/view/model" ) type TokenRepo struct { - View *view.View + UserEvents *user_event.UserEventstore + View *view.View } -func (repo *TokenRepo) CreateToken(ctx context.Context, agentID, applicationID, userID string, audience, scopes []string, lifetime time.Duration) (*token_model.Token, error) { +func (repo *TokenRepo) CreateToken(ctx context.Context, agentID, applicationID, userID string, audience, scopes []string, lifetime time.Duration) (*usr_model.Token, error) { preferredLanguage := "" user, _ := repo.View.UserByID(userID) if user != nil { preferredLanguage = user.PreferredLanguage } - token, err := repo.View.CreateToken(agentID, applicationID, userID, preferredLanguage, audience, scopes, lifetime) - if err != nil { - return nil, err + now := time.Now().UTC() + token := &usr_model.Token{ + ObjectRoot: models.ObjectRoot{ + AggregateID: userID, + }, + UserAgentID: agentID, + ApplicationID: applicationID, + Audience: audience, + Scopes: scopes, + Expiration: now.Add(lifetime), + PreferredLanguage: preferredLanguage, } - return token_view_model.TokenToModel(token), nil + return repo.UserEvents.TokenAdded(ctx, token) } -func (repo *TokenRepo) IsTokenValid(ctx context.Context, tokenID string) (bool, error) { - return repo.View.IsTokenValid(tokenID) +func (repo *TokenRepo) IsTokenValid(ctx context.Context, userID, tokenID string) (bool, error) { + token, err := repo.TokenByID(ctx, userID, tokenID) + if err == nil { + return token.Expiration.After(time.Now().UTC()), nil + } + if errors.IsNotFound(err) { + return false, nil + } + return false, err } -func (repo *TokenRepo) TokenByID(ctx context.Context, tokenID string) (*token_model.Token, error) { - token, err := repo.View.TokenByID(tokenID) - if err != nil { - return nil, err +func (repo *TokenRepo) TokenByID(ctx context.Context, userID, tokenID string) (*usr_model.TokenView, error) { + token, viewErr := repo.View.TokenByID(tokenID) + if viewErr != nil && !errors.IsNotFound(viewErr) { + return nil, viewErr } - return token_view_model.TokenToModel(token), nil + if errors.IsNotFound(viewErr) { + token = new(model.TokenView) + token.ID = tokenID + token.UserID = userID + } + + events, esErr := repo.UserEvents.UserEventsByID(ctx, userID, token.Sequence) + if errors.IsNotFound(viewErr) && len(events) == 0 { + return nil, errors.ThrowNotFound(nil, "EVENT-4T90g", "Errors.Token.NotFound") + } + + if esErr != nil { + logging.Log("EVENT-5Nm9s").WithError(viewErr).Debug("error retrieving new events") + return model.TokenViewToModel(token), nil + } + viewToken := *token + for _, event := range events { + err := token.AppendEventIfMyToken(event) + if err != nil { + return model.TokenViewToModel(&viewToken), nil + } + } + if !token.Expiration.After(time.Now().UTC()) || token.Deactivated { + return nil, errors.ThrowNotFound(nil, "EVENT-5Bm9s", "Errors.Token.NotFound") + } + return model.TokenViewToModel(token), nil } diff --git a/internal/auth/repository/eventsourcing/eventstore/user.go b/internal/auth/repository/eventsourcing/eventstore/user.go index 616027bf25..d2be7892ac 100644 --- a/internal/auth/repository/eventsourcing/eventstore/user.go +++ b/internal/auth/repository/eventsourcing/eventstore/user.go @@ -3,6 +3,9 @@ package eventstore import ( "context" + "github.com/caos/zitadel/internal/config/systemdefaults" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/logging" "github.com/caos/zitadel/internal/api/authz" @@ -13,7 +16,7 @@ import ( "github.com/caos/zitadel/internal/eventstore/sdk" org_model "github.com/caos/zitadel/internal/org/model" org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" - policy_event "github.com/caos/zitadel/internal/policy/repository/eventsourcing" + "github.com/caos/zitadel/internal/tracing" "github.com/caos/zitadel/internal/user/model" user_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" usr_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" @@ -21,12 +24,12 @@ import ( ) type UserRepo struct { - SearchLimit uint64 - Eventstore eventstore.Eventstore - UserEvents *user_event.UserEventstore - OrgEvents *org_event.OrgEventstore - PolicyEvents *policy_event.PolicyEventstore - View *view.View + SearchLimit uint64 + Eventstore eventstore.Eventstore + UserEvents *user_event.UserEventstore + OrgEvents *org_event.OrgEventstore + View *view.View + SystemDefaults systemdefaults.SystemDefaults } func (repo *UserRepo) Health(ctx context.Context) error { @@ -46,15 +49,23 @@ func (repo *UserRepo) registerUser(ctx context.Context, registerUser *model.User if resourceOwner != "" { policyResourceOwner = resourceOwner } - pwPolicy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, policyResourceOwner) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(policyResourceOwner) + if errors.IsNotFound(err) { + pwPolicy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, policyResourceOwner) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(pwPolicy) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(policyResourceOwner) + if errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - user, aggregates, err := repo.UserEvents.PrepareRegisterUser(ctx, registerUser, externalIDP, pwPolicy, orgPolicy, resourceOwner) + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + user, aggregates, err := repo.UserEvents.PrepareRegisterUser(ctx, registerUser, externalIDP, pwPolicyView, orgPolicyView, resourceOwner) if err != nil { return nil, err } @@ -215,20 +226,30 @@ func (repo *UserRepo) ChangeMyAddress(ctx context.Context, address *model.Addres } func (repo *UserRepo) ChangeMyPassword(ctx context.Context, old, new string) error { - policy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, authz.GetCtxData(ctx).OrgID) + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return err } - _, err = repo.UserEvents.ChangePassword(ctx, policy, authz.GetCtxData(ctx).UserID, old, new) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(policy) + _, err = repo.UserEvents.ChangePassword(ctx, pwPolicyView, authz.GetCtxData(ctx).UserID, old, new) return err } -func (repo *UserRepo) ChangePassword(ctx context.Context, userID, old, new string) error { - policy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, authz.GetCtxData(ctx).OrgID) +func (repo *UserRepo) ChangePassword(ctx context.Context, userID, old, new string) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return err } - _, err = repo.UserEvents.ChangePassword(ctx, policy, userID, old, new) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(policy) + _, err = repo.UserEvents.ChangePassword(ctx, pwPolicyView, userID, old, new) return err } @@ -279,11 +300,15 @@ func (repo *UserRepo) RemoveMyMfaOTP(ctx context.Context) error { func (repo *UserRepo) ChangeMyUsername(ctx context.Context, username string) error { ctxData := authz.GetCtxData(ctx) - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, ctxData.OrgID) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(ctxData.OrgID) + if errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return err } - return repo.UserEvents.ChangeUsername(ctx, ctxData.UserID, username, orgPolicy) + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + return repo.UserEvents.ChangeUsername(ctx, ctxData.UserID, username, orgPolicyView) } func (repo *UserRepo) ResendInitVerificationMail(ctx context.Context, userID string) error { _, err := repo.UserEvents.CreateInitializeUserCodeByID(ctx, userID) @@ -291,11 +316,15 @@ func (repo *UserRepo) ResendInitVerificationMail(ctx context.Context, userID str } func (repo *UserRepo) VerifyInitCode(ctx context.Context, userID, code, password string) error { - policy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, authz.GetCtxData(ctx).OrgID) + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return err } - return repo.UserEvents.VerifyInitCode(ctx, policy, userID, code, password) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(policy) + return repo.UserEvents.VerifyInitCode(ctx, pwPolicyView, userID, code, password) } func (repo *UserRepo) SkipMfaInit(ctx context.Context, userID string) error { @@ -311,11 +340,15 @@ func (repo *UserRepo) RequestPasswordReset(ctx context.Context, loginname string } func (repo *UserRepo) SetPassword(ctx context.Context, userID, code, password string) error { - policy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, authz.GetCtxData(ctx).OrgID) + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return err } - return repo.UserEvents.SetPassword(ctx, policy, userID, code, password) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(policy) + return repo.UserEvents.SetPassword(ctx, pwPolicyView, userID, code, password) } func (repo *UserRepo) SignOut(ctx context.Context, agentID string) error { @@ -346,6 +379,9 @@ func (repo *UserRepo) UserByID(ctx context.Context, id string) (*model.UserView, return usr_view_model.UserToModel(user), nil } } + if userCopy.State == int32(model.UserStateDeleted) { + return nil, errors.ThrowNotFound(nil, "EVENT-vZ8us", "Errors.User.NotFound") + } return usr_view_model.UserToModel(&userCopy), nil } @@ -366,11 +402,15 @@ func (repo *UserRepo) MyUserChanges(ctx context.Context, lastSequence uint64, li func (repo *UserRepo) ChangeUsername(ctx context.Context, userID, username string) error { policyResourceOwner := authz.GetCtxData(ctx).OrgID - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, policyResourceOwner) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(policyResourceOwner) + if errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return err } - return repo.UserEvents.ChangeUsername(ctx, userID, username, orgPolicy) + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + return repo.UserEvents.ChangeUsername(ctx, userID, username, orgPolicyView) } func checkIDs(ctx context.Context, obj es_models.ObjectRoot) error { diff --git a/internal/auth/repository/eventsourcing/handler/application.go b/internal/auth/repository/eventsourcing/handler/application.go index e4ed8206dc..eccd0d36ab 100644 --- a/internal/auth/repository/eventsourcing/handler/application.go +++ b/internal/auth/repository/eventsourcing/handler/application.go @@ -1,6 +1,8 @@ package handler import ( + "context" + "github.com/caos/logging" "github.com/caos/zitadel/internal/eventstore/models" @@ -32,10 +34,17 @@ func (p *Application) EventQuery() (*models.SearchQuery, error) { return eventsourcing.ProjectQuery(sequence.CurrentSequence), nil } -func (p *Application) Reduce(event *models.Event) (err error) { +func (a *Application) Reduce(event *models.Event) (err error) { app := new(view_model.ApplicationView) switch event.Type { case es_model.ApplicationAdded: + project, err := a.projectEvents.ProjectByID(context.Background(), event.AggregateID) + if err != nil { + return err + } + app.ProjectRoleCheck = project.ProjectRoleCheck + app.ProjectRoleAssertion = project.ProjectRoleAssertion + err = app.AppendEvent(event) case es_model.ApplicationChanged, es_model.OIDCConfigAdded, @@ -46,24 +55,40 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - app, err = p.view.ApplicationByID(event.AggregateID, app.ID) + app, err = a.view.ApplicationByID(event.AggregateID, app.ID) if err != nil { return err } err = app.AppendEvent(event) case es_model.ApplicationRemoved: - err := app.SetData(event) + err = app.SetData(event) if err != nil { return err } - return p.view.DeleteApplication(app.ID, event.Sequence) + return a.view.DeleteApplication(app.ID, event.Sequence) + case es_model.ProjectChanged: + apps, err := a.view.ApplicationsByProjectID(event.AggregateID) + if err != nil { + return err + } + if len(apps) == 0 { + return a.view.ProcessedApplicationSequence(event.Sequence) + } + for _, app := range apps { + if err := app.AppendEvent(event); err != nil { + return err + } + } + return a.view.PutApplications(apps, event.Sequence) + case es_model.ProjectRemoved: + return a.view.DeleteApplicationsByProjectID(event.AggregateID) default: - return p.view.ProcessedApplicationSequence(event.Sequence) + return a.view.ProcessedApplicationSequence(event.Sequence) } if err != nil { return err } - return p.view.PutApplication(app) + return a.view.PutApplication(app) } func (p *Application) OnError(event *models.Event, spoolerError error) error { diff --git a/internal/auth/repository/eventsourcing/handler/handler.go b/internal/auth/repository/eventsourcing/handler/handler.go index 52f078cced..b3b67d35c1 100644 --- a/internal/auth/repository/eventsourcing/handler/handler.go +++ b/internal/auth/repository/eventsourcing/handler/handler.go @@ -37,7 +37,8 @@ type EventstoreRepos struct { func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, eventstore eventstore.Eventstore, repos EventstoreRepos, systemDefaults sd.SystemDefaults) []query.Handler { return []query.Handler{ - &User{handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, orgEvents: repos.OrgEvents}, + &User{handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, + orgEvents: repos.OrgEvents, iamEvents: repos.IamEvents, iamID: systemDefaults.IamID}, &UserSession{handler: handler{view, bulkLimit, configs.cycleDuration("UserSession"), errorCount}, userEvents: repos.UserEvents}, &UserMembership{handler: handler{view, bulkLimit, configs.cycleDuration("UserMembership"), errorCount}, orgEvents: repos.OrgEvents, projectEvents: repos.ProjectEvents}, &Token{handler: handler{view, bulkLimit, configs.cycleDuration("Token"), errorCount}, ProjectEvents: repos.ProjectEvents}, @@ -57,6 +58,9 @@ func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, ev &IDPConfig{handler: handler{view, bulkLimit, configs.cycleDuration("IDPConfig"), errorCount}}, &IDPProvider{handler: handler{view, bulkLimit, configs.cycleDuration("IDPProvider"), errorCount}, systemDefaults: systemDefaults, orgEvents: repos.OrgEvents, iamEvents: repos.IamEvents}, &ExternalIDP{handler: handler{view, bulkLimit, configs.cycleDuration("ExternalIDP"), errorCount}, systemDefaults: systemDefaults, orgEvents: repos.OrgEvents, iamEvents: repos.IamEvents}, + &PasswordComplexityPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("PasswordComplexityPolicy"), errorCount}}, + &OrgIAMPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("OrgIAMPolicy"), errorCount}}, + &ProjectRole{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectRole"), errorCount}, projectEvents: repos.ProjectEvents}, } } diff --git a/internal/auth/repository/eventsourcing/handler/idp_providers.go b/internal/auth/repository/eventsourcing/handler/idp_providers.go index 2f17f8041f..b4c54a2834 100644 --- a/internal/auth/repository/eventsourcing/handler/idp_providers.go +++ b/internal/auth/repository/eventsourcing/handler/idp_providers.go @@ -66,16 +66,21 @@ func (m *IDPProvider) processIdpProvider(event *models.Event) (err error) { } return m.view.DeleteIDPProvider(event.AggregateID, provider.IDPConfigID, event.Sequence) case model.IDPConfigChanged, org_es_model.IDPConfigChanged: - config := new(iam_model.IDPConfig) - config.AppendEvent(event) - providers, err := m.view.IDPProvidersByIDPConfigID(config.IDPConfigID) + esConfig := new(iam_view_model.IDPConfigView) + providerType := iam_model.IDPProviderTypeSystem + if event.AggregateID != m.systemDefaults.IamID { + providerType = iam_model.IDPProviderTypeOrg + } + esConfig.AppendEvent(providerType, event) + providers, err := m.view.IDPProvidersByIDPConfigID(esConfig.IDPConfigID) if err != nil { return err } - if provider.IDPProviderType == int32(iam_model.IDPProviderTypeSystem) { - config, err = m.iamEvents.GetIDPConfig(context.Background(), provider.AggregateID, config.IDPConfigID) + config := new(iam_model.IDPConfig) + if event.AggregateID == m.systemDefaults.IamID { + config, err = m.iamEvents.GetIDPConfig(context.Background(), event.AggregateID, esConfig.IDPConfigID) } else { - config, err = m.orgEvents.GetIDPConfig(context.Background(), provider.AggregateID, provider.IDPConfigID) + config, err = m.orgEvents.GetIDPConfig(context.Background(), event.AggregateID, esConfig.IDPConfigID) } if err != nil { return err @@ -111,6 +116,7 @@ func (m *IDPProvider) fillData(provider *iam_view_model.IDPProviderView) (err er func (m *IDPProvider) fillConfigData(provider *iam_view_model.IDPProviderView, config *iam_model.IDPConfig) { provider.Name = config.Name + provider.StylingType = int32(config.StylingType) provider.IDPConfigType = int32(config.Type) provider.IDPState = int32(config.State) } diff --git a/internal/auth/repository/eventsourcing/handler/org.go b/internal/auth/repository/eventsourcing/handler/org.go index 62ce072258..58bafb6ac0 100644 --- a/internal/auth/repository/eventsourcing/handler/org.go +++ b/internal/auth/repository/eventsourcing/handler/org.go @@ -46,6 +46,17 @@ func (o *Org) Reduce(event *es_models.Event) (err error) { return err } err = org.AppendEvent(event) + case model.OrgDomainPrimarySet: + domain := new(org_model.OrgDomainView) + err = domain.SetData(event) + if err != nil { + return err + } + org, err = o.view.OrgByID(event.AggregateID) + if err != nil { + return err + } + org.Domain = domain.Domain default: return o.view.ProcessedOrgSequence(event.Sequence) } diff --git a/internal/auth/repository/eventsourcing/handler/org_iam_policy.go b/internal/auth/repository/eventsourcing/handler/org_iam_policy.go new file mode 100644 index 0000000000..55f72f74d7 --- /dev/null +++ b/internal/auth/repository/eventsourcing/handler/org_iam_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type OrgIAMPolicy struct { + handler +} + +const ( + orgIAMPolicyTable = "auth.org_iam_policies" +) + +func (m *OrgIAMPolicy) ViewModel() string { + return orgIAMPolicyTable +} + +func (m *OrgIAMPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestOrgIAMPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *OrgIAMPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processOrgIAMPolicy(event) + } + return err +} + +func (m *OrgIAMPolicy) processOrgIAMPolicy(event *models.Event) (err error) { + policy := new(iam_model.OrgIAMPolicyView) + switch event.Type { + case iam_es_model.OrgIAMPolicyAdded, model.OrgIAMPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.OrgIAMPolicyChanged, model.OrgIAMPolicyChanged: + policy, err = m.view.OrgIAMPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.OrgIAMPolicyRemoved: + return m.view.DeleteOrgIAMPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedOrgIAMPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutOrgIAMPolicy(policy, policy.Sequence) +} + +func (m *OrgIAMPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-3Gj8s", "id", event.AggregateID).WithError(err).Warn("something went wrong in orgIAM policy handler") + return spooler.HandleError(event, err, m.view.GetLatestOrgIAMPolicyFailedEvent, m.view.ProcessedOrgIAMPolicyFailedEvent, m.view.ProcessedOrgIAMPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/auth/repository/eventsourcing/handler/password_complexity_policy.go b/internal/auth/repository/eventsourcing/handler/password_complexity_policy.go new file mode 100644 index 0000000000..c280615988 --- /dev/null +++ b/internal/auth/repository/eventsourcing/handler/password_complexity_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type PasswordComplexityPolicy struct { + handler +} + +const ( + passwordComplexityPolicyTable = "auth.password_complexity_policies" +) + +func (m *PasswordComplexityPolicy) ViewModel() string { + return passwordComplexityPolicyTable +} + +func (m *PasswordComplexityPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestPasswordComplexityPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *PasswordComplexityPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processPasswordComplexityPolicy(event) + } + return err +} + +func (m *PasswordComplexityPolicy) processPasswordComplexityPolicy(event *models.Event) (err error) { + policy := new(iam_model.PasswordComplexityPolicyView) + switch event.Type { + case iam_es_model.PasswordComplexityPolicyAdded, model.PasswordComplexityPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.PasswordComplexityPolicyChanged, model.PasswordComplexityPolicyChanged: + policy, err = m.view.PasswordComplexityPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.PasswordComplexityPolicyRemoved: + return m.view.DeletePasswordComplexityPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedPasswordComplexityPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutPasswordComplexityPolicy(policy, policy.Sequence) +} + +func (m *PasswordComplexityPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-4Djo9", "id", event.AggregateID).WithError(err).Warn("something went wrong in passwordComplexity policy handler") + return spooler.HandleError(event, err, m.view.GetLatestPasswordComplexityPolicyFailedEvent, m.view.ProcessedPasswordComplexityPolicyFailedEvent, m.view.ProcessedPasswordComplexityPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/auth/repository/eventsourcing/handler/project_role.go b/internal/auth/repository/eventsourcing/handler/project_role.go new file mode 100644 index 0000000000..e877c867a4 --- /dev/null +++ b/internal/auth/repository/eventsourcing/handler/project_role.go @@ -0,0 +1,70 @@ +package handler + +import ( + "github.com/caos/logging" + + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + "github.com/caos/zitadel/internal/project/repository/eventsourcing" + proj_event "github.com/caos/zitadel/internal/project/repository/eventsourcing" + es_model "github.com/caos/zitadel/internal/project/repository/eventsourcing/model" + view_model "github.com/caos/zitadel/internal/project/repository/view/model" +) + +type ProjectRole struct { + handler + projectEvents *proj_event.ProjectEventstore +} + +const ( + projectRoleTable = "auth.project_roles" +) + +func (p *ProjectRole) ViewModel() string { + return projectRoleTable +} + +func (p *ProjectRole) EventQuery() (*models.SearchQuery, error) { + sequence, err := p.view.GetLatestProjectRoleSequence() + if err != nil { + return nil, err + } + return eventsourcing.ProjectQuery(sequence.CurrentSequence), nil +} + +func (p *ProjectRole) Reduce(event *models.Event) (err error) { + role := new(view_model.ProjectRoleView) + switch event.Type { + case es_model.ProjectRoleAdded: + err = role.AppendEvent(event) + case es_model.ProjectRoleChanged: + err = role.SetData(event) + if err != nil { + return err + } + role, err = p.view.ProjectRoleByIDs(event.AggregateID, event.ResourceOwner, role.Key) + if err != nil { + return err + } + err = role.AppendEvent(event) + case es_model.ProjectRoleRemoved: + err = role.SetData(event) + if err != nil { + return err + } + return p.view.DeleteProjectRole(event.AggregateID, event.ResourceOwner, role.Key, event.Sequence) + case es_model.ProjectRemoved: + return p.view.DeleteProjectRolesByProjectID(event.AggregateID) + default: + return p.view.ProcessedProjectRoleSequence(event.Sequence) + } + if err != nil { + return err + } + return p.view.PutProjectRole(role) +} + +func (p *ProjectRole) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-lso9w", "id", event.AggregateID).WithError(err).Warn("something went wrong in project role handler") + return spooler.HandleError(event, err, p.view.GetLatestProjectRoleFailedEvent, p.view.ProcessedProjectRoleFailedEvent, p.view.ProcessedProjectRoleSequence, p.errorCountUntilSkip) +} diff --git a/internal/auth/repository/eventsourcing/handler/token.go b/internal/auth/repository/eventsourcing/handler/token.go index c9f7fc7355..8fb4c65739 100644 --- a/internal/auth/repository/eventsourcing/handler/token.go +++ b/internal/auth/repository/eventsourcing/handler/token.go @@ -24,12 +24,12 @@ const ( tokenTable = "auth.tokens" ) -func (u *Token) ViewModel() string { +func (t *Token) ViewModel() string { return tokenTable } -func (u *Token) EventQuery() (*models.SearchQuery, error) { - sequence, err := u.view.GetLatestTokenSequence() +func (t *Token) EventQuery() (*models.SearchQuery, error) { + sequence, err := t.view.GetLatestTokenSequence() if err != nil { return nil, err } @@ -41,41 +41,48 @@ func (u *Token) EventQuery() (*models.SearchQuery, error) { LatestSequenceFilter(sequence.CurrentSequence), nil } -func (u *Token) Reduce(event *models.Event) (err error) { +func (t *Token) Reduce(event *models.Event) (err error) { switch event.Type { + case user_es_model.UserTokenAdded: + token := new(view_model.TokenView) + err := token.AppendEvent(event) + if err != nil { + return err + } + return t.view.PutToken(token) case user_es_model.UserProfileChanged, user_es_model.HumanProfileChanged: user := new(view_model.UserView) user.AppendEvent(event) - tokens, err := u.view.TokensByUserID(event.AggregateID) + tokens, err := t.view.TokensByUserID(event.AggregateID) if err != nil { return err } for _, token := range tokens { token.PreferredLanguage = user.PreferredLanguage } - return u.view.PutTokens(tokens, event.Sequence) + return t.view.PutTokens(tokens, event.Sequence) case user_es_model.SignedOut, user_es_model.HumanSignedOut: id, err := agentIDFromSession(event) if err != nil { return err } - return u.view.DeleteSessionTokens(id, event.AggregateID, event.Sequence) + return t.view.DeleteSessionTokens(id, event.AggregateID, event.Sequence) case user_es_model.UserLocked, user_es_model.UserDeactivated, user_es_model.UserRemoved: - return u.view.DeleteUserTokens(event.AggregateID, event.Sequence) + return t.view.DeleteUserTokens(event.AggregateID, event.Sequence) case project_es_model.ApplicationDeactivated, project_es_model.ApplicationRemoved: application, err := applicationFromSession(event) if err != nil { return err } - return u.view.DeleteApplicationTokens(event.Sequence, application.AppID) + return t.view.DeleteApplicationTokens(event.Sequence, application.AppID) case project_es_model.ProjectDeactivated, project_es_model.ProjectRemoved: - project, err := u.ProjectEvents.ProjectByID(context.Background(), event.AggregateID) + project, err := t.ProjectEvents.ProjectByID(context.Background(), event.AggregateID) if err != nil { return err } @@ -83,15 +90,15 @@ func (u *Token) Reduce(event *models.Event) (err error) { for _, app := range project.Applications { applicationsIDs = append(applicationsIDs, app.AppID) } - return u.view.DeleteApplicationTokens(event.Sequence, applicationsIDs...) + return t.view.DeleteApplicationTokens(event.Sequence, applicationsIDs...) default: - return u.view.ProcessedTokenSequence(event.Sequence) + return t.view.ProcessedTokenSequence(event.Sequence) } } -func (u *Token) OnError(event *models.Event, err error) error { +func (t *Token) OnError(event *models.Event, err error) error { logging.LogWithFields("SPOOL-3jkl4", "id", event.AggregateID).WithError(err).Warn("something went wrong in token handler") - return spooler.HandleError(event, err, u.view.GetLatestTokenFailedEvent, u.view.ProcessedTokenFailedEvent, u.view.ProcessedTokenSequence, u.errorCountUntilSkip) + return spooler.HandleError(event, err, t.view.GetLatestTokenFailedEvent, t.view.ProcessedTokenFailedEvent, t.view.ProcessedTokenSequence, t.errorCountUntilSkip) } func agentIDFromSession(event *models.Event) (string, error) { diff --git a/internal/auth/repository/eventsourcing/handler/user.go b/internal/auth/repository/eventsourcing/handler/user.go index 4f2aa1cb66..c05c2f0f73 100644 --- a/internal/auth/repository/eventsourcing/handler/user.go +++ b/internal/auth/repository/eventsourcing/handler/user.go @@ -2,6 +2,7 @@ package handler import ( "context" + iam_es "github.com/caos/zitadel/internal/iam/repository/eventsourcing" es_models "github.com/caos/zitadel/internal/eventstore/models" org_model "github.com/caos/zitadel/internal/org/model" @@ -21,6 +22,8 @@ type User struct { handler eventstore eventstore.Eventstore orgEvents *org_events.OrgEventstore + iamEvents *iam_es.IAMEventstore + iamID string } const ( @@ -111,7 +114,7 @@ func (u *User) ProcessUser(event *models.Event) (err error) { } err = u.fillLoginNames(user) case es_model.UserRemoved: - err = u.view.DeleteUser(event.AggregateID, event.Sequence) + return u.view.DeleteUser(event.AggregateID, event.Sequence) default: return u.view.ProcessedUserSequence(event.Sequence) } @@ -126,9 +129,12 @@ func (u *User) fillLoginNames(user *view_model.UserView) (err error) { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), user.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } user.SetLoginNames(policy, org.Domains) user.PreferredLoginName = user.GenerateLoginName(org.GetPrimaryDomain().Domain, policy.UserLoginMustBeDomain) @@ -155,9 +161,12 @@ func (u *User) fillLoginNamesOnOrgUsers(event *models.Event) error { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } users, err := u.view.UsersByOrgID(event.AggregateID) if err != nil { @@ -174,9 +183,12 @@ func (u *User) fillPreferredLoginNamesOnOrgUsers(event *models.Event) error { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } if !policy.UserLoginMustBeDomain { return nil diff --git a/internal/auth/repository/eventsourcing/handler/user_external_idps.go b/internal/auth/repository/eventsourcing/handler/user_external_idps.go index 44432a1c87..5de4130bcf 100644 --- a/internal/auth/repository/eventsourcing/handler/user_external_idps.go +++ b/internal/auth/repository/eventsourcing/handler/user_external_idps.go @@ -5,17 +5,17 @@ import ( "github.com/caos/logging" "github.com/caos/zitadel/internal/config/systemdefaults" caos_errs "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/iam/repository/eventsourcing" - org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" - org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" - "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" - usr_view_model "github.com/caos/zitadel/internal/user/repository/view/model" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/spooler" iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/eventsourcing" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + iam_view_model "github.com/caos/zitadel/internal/iam/repository/view/model" + org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" + usr_view_model "github.com/caos/zitadel/internal/user/repository/view/model" ) type ExternalIDP struct { @@ -68,6 +68,8 @@ func (m *ExternalIDP) processUser(event *models.Event) (err error) { return err } return m.view.DeleteExternalIDP(externalIDP.ExternalUserID, externalIDP.IDPConfigID, event.Sequence) + case model.UserRemoved: + return m.view.DeleteExternalIDPsByUserID(event.AggregateID, event.Sequence) default: return m.view.ProcessedExternalIDPSequence(event.Sequence) } @@ -80,16 +82,21 @@ func (m *ExternalIDP) processUser(event *models.Event) (err error) { func (m *ExternalIDP) processIdpConfig(event *models.Event) (err error) { switch event.Type { case iam_es_model.IDPConfigChanged, org_es_model.IDPConfigChanged: + configView := new(iam_view_model.IDPConfigView) config := new(iam_model.IDPConfig) - config.AppendEvent(event) - exterinalIDPs, err := m.view.ExternalIDPsByIDPConfigID(config.IDPConfigID) + if event.Type == iam_es_model.IDPConfigChanged { + configView.AppendEvent(iam_model.IDPProviderTypeSystem, event) + } else { + configView.AppendEvent(iam_model.IDPProviderTypeOrg, event) + } + exterinalIDPs, err := m.view.ExternalIDPsByIDPConfigID(configView.IDPConfigID) if err != nil { return err } if event.AggregateType == iam_es_model.IAMAggregate { - config, err = m.iamEvents.GetIDPConfig(context.Background(), config.AggregateID, config.IDPConfigID) + config, err = m.iamEvents.GetIDPConfig(context.Background(), event.AggregateID, configView.IDPConfigID) } else { - config, err = m.orgEvents.GetIDPConfig(context.Background(), config.AggregateID, config.IDPConfigID) + config, err = m.orgEvents.GetIDPConfig(context.Background(), event.AggregateID, configView.IDPConfigID) } if err != nil { return err diff --git a/internal/auth/repository/eventsourcing/handler/user_grant.go b/internal/auth/repository/eventsourcing/handler/user_grant.go index fa7cb6719c..34e85537bd 100644 --- a/internal/auth/repository/eventsourcing/handler/user_grant.go +++ b/internal/auth/repository/eventsourcing/handler/user_grant.go @@ -5,13 +5,13 @@ import ( "strings" "github.com/caos/logging" - "github.com/caos/zitadel/internal/errors" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/model" iam_events "github.com/caos/zitadel/internal/iam/repository/eventsourcing" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" org_model "github.com/caos/zitadel/internal/org/model" @@ -71,7 +71,7 @@ func (u *UserGrant) Reduce(event *models.Event) (err error) { case proj_es_model.ProjectAggregate: err = u.processProject(event) case iam_es_model.IAMAggregate: - err = u.processIamMember(event, "IAM", false) + err = u.processIAMMember(event, "IAM", false) case org_es_model.OrgAggregate: return u.processOrg(event) } @@ -132,7 +132,6 @@ func (u *UserGrant) processUser(event *models.Event) (err error) { default: return u.view.ProcessedUserGrantSequence(event.Sequence) } - return nil } func (u *UserGrant) processProject(event *models.Event) (err error) { @@ -161,7 +160,6 @@ func (u *UserGrant) processProject(event *models.Event) (err error) { default: return u.view.ProcessedUserGrantSequence(event.Sequence) } - return nil } func (u *UserGrant) processOrg(event *models.Event) (err error) { @@ -175,7 +173,7 @@ func (u *UserGrant) processOrg(event *models.Event) (err error) { } } -func (u *UserGrant) processIamMember(event *models.Event, rolePrefix string, suffix bool) error { +func (u *UserGrant) processIAMMember(event *models.Event, rolePrefix string, suffix bool) error { member := new(iam_es_model.IAMMember) switch event.Type { @@ -309,7 +307,8 @@ func (u *UserGrant) setIamProjectID() error { if err != nil { return err } - if !iam.SetUpDone { + + if iam.SetUpDone < iam_model.StepCount-1 { return caos_errs.ThrowPreconditionFailed(nil, "HANDL-s5DTs", "Setup not done") } u.iamProjectID = iam.IAMProjectID @@ -355,6 +354,12 @@ func (u *UserGrant) fillProjectData(grant *view_model.UserGrantView, project *pr func (u *UserGrant) fillOrgData(grant *view_model.UserGrantView, org *org_model.Org) { grant.OrgName = org.Name + for _, domain := range org.Domains { + if domain.Primary { + grant.OrgPrimaryDomain = domain.Domain + break + } + } } func (u *UserGrant) OnError(event *models.Event, err error) error { diff --git a/internal/auth/repository/eventsourcing/handler/user_membership.go b/internal/auth/repository/eventsourcing/handler/user_membership.go index 3796778845..7a1145d224 100644 --- a/internal/auth/repository/eventsourcing/handler/user_membership.go +++ b/internal/auth/repository/eventsourcing/handler/user_membership.go @@ -2,6 +2,7 @@ package handler import ( "context" + "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" org_model "github.com/caos/zitadel/internal/org/model" @@ -39,7 +40,7 @@ func (m *UserMembership) EventQuery() (*models.SearchQuery, error) { return nil, err } return es_models.NewSearchQuery(). - AggregateTypeFilter(iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate). + AggregateTypeFilter(iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate). LatestSequenceFilter(sequence.CurrentSequence), nil } @@ -51,6 +52,8 @@ func (m *UserMembership) Reduce(event *models.Event) (err error) { err = m.processOrg(event) case proj_es_model.ProjectAggregate: err = m.processProject(event) + case model.UserAggregate: + err = m.processUser(event) } return err } @@ -104,7 +107,7 @@ func (m *UserMembership) processOrg(event *models.Event) (err error) { case org_es_model.OrgMemberRemoved: return m.view.DeleteUserMembership(member.UserID, event.AggregateID, event.AggregateID, usr_model.MemberTypeOrganisation, event.Sequence) case org_es_model.OrgChanged: - err = m.updateOrgName(event) + return m.updateOrgName(event) default: return m.view.ProcessedUserMembershipSequence(event.Sequence) } @@ -175,7 +178,11 @@ func (m *UserMembership) processProject(event *models.Event) (err error) { case proj_es_model.ProjectGrantMemberRemoved: return m.view.DeleteUserMembership(member.UserID, event.AggregateID, member.ObjectID, usr_model.MemberTypeProjectGrant, event.Sequence) case proj_es_model.ProjectChanged: - err = m.updateProjectDisplayName(event) + return m.updateProjectDisplayName(event) + case proj_es_model.ProjectRemoved: + return m.view.DeleteUserMembershipsByAggregateID(event.AggregateID, event.Sequence) + case proj_es_model.ProjectGrantRemoved: + return m.view.DeleteUserMembershipsByAggregateIDAndObjectID(event.AggregateID, member.ObjectID, event.Sequence) default: return m.view.ProcessedUserMembershipSequence(event.Sequence) } @@ -210,7 +217,16 @@ func (m *UserMembership) updateProjectDisplayName(event *models.Event) error { return m.view.BulkPutUserMemberships(memberships, event.Sequence) } +func (m *UserMembership) processUser(event *models.Event) (err error) { + switch event.Type { + case model.UserRemoved: + return m.view.DeleteUserMembershipsByUserID(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedUserMembershipSequence(event.Sequence) + } +} + func (m *UserMembership) OnError(event *models.Event, err error) error { - logging.LogWithFields("SPOOL-Ms3fj", "id", event.AggregateID).WithError(err).Warn("something went wrong in orgmember handler") + logging.LogWithFields("SPOOL-Ms3fj", "id", event.AggregateID).WithError(err).Warn("something went wrong in user membership handler") return spooler.HandleError(event, err, m.view.GetLatestUserMembershipFailedEvent, m.view.ProcessedUserMembershipFailedEvent, m.view.ProcessedUserMembershipSequence, m.errorCountUntilSkip) } diff --git a/internal/auth/repository/eventsourcing/handler/user_session.go b/internal/auth/repository/eventsourcing/handler/user_session.go index 58ac71cfd7..9554f2d1ae 100644 --- a/internal/auth/repository/eventsourcing/handler/user_session.go +++ b/internal/auth/repository/eventsourcing/handler/user_session.go @@ -45,6 +45,7 @@ func (u *UserSession) Reduce(event *models.Event) (err error) { es_model.SignedOut, es_model.HumanPasswordCheckSucceeded, es_model.HumanPasswordCheckFailed, + es_model.HumanExternalLoginCheckSucceeded, es_model.HumanMFAOTPCheckSucceeded, es_model.HumanMFAOTPCheckFailed, es_model.HumanSignedOut: diff --git a/internal/auth/repository/eventsourcing/repository.go b/internal/auth/repository/eventsourcing/repository.go index 3da02dcf05..cb83e00705 100644 --- a/internal/auth/repository/eventsourcing/repository.go +++ b/internal/auth/repository/eventsourcing/repository.go @@ -19,7 +19,6 @@ import ( "github.com/caos/zitadel/internal/id" es_key "github.com/caos/zitadel/internal/key/repository/eventsourcing" es_org "github.com/caos/zitadel/internal/org/repository/eventsourcing" - es_policy "github.com/caos/zitadel/internal/policy/repository/eventsourcing" es_proj "github.com/caos/zitadel/internal/project/repository/eventsourcing" es_user "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) @@ -45,7 +44,6 @@ type EsRepository struct { eventstore.UserGrantRepo eventstore.OrgRepository eventstore.IAMRepository - eventstore.PolicyRepo } func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults, authZRepo *authz_repo.EsRepository) (*EsRepository, error) { @@ -69,16 +67,7 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults, au if err != nil { return nil, err } - policy, err := es_policy.StartPolicy( - es_policy.PolicyConfig{ - Eventstore: es, - Cache: conf.Eventstore.Cache, - }, - systemDefaults, - ) - if err != nil { - return nil, err - } + user, err := es_user.StartUser( es_user.UserConfig{ Eventstore: es, @@ -128,33 +117,37 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults, au return &EsRepository{ spool, eventstore.UserRepo{ - SearchLimit: conf.SearchLimit, - Eventstore: es, - UserEvents: user, - OrgEvents: org, - PolicyEvents: policy, - View: view, + SearchLimit: conf.SearchLimit, + Eventstore: es, + UserEvents: user, + OrgEvents: org, + View: view, + SystemDefaults: systemDefaults, }, eventstore.AuthRequestRepo{ - UserEvents: user, - OrgEvents: org, - PolicyEvents: policy, - AuthRequests: authReq, - View: view, - UserSessionViewProvider: view, - UserViewProvider: view, - UserEventProvider: user, - OrgViewProvider: view, - IDPProviderViewProvider: view, - LoginPolicyViewProvider: view, - IdGenerator: idGenerator, - PasswordCheckLifeTime: systemDefaults.VerificationLifetimes.PasswordCheck.Duration, - MfaInitSkippedLifeTime: systemDefaults.VerificationLifetimes.MfaInitSkip.Duration, - MfaSoftwareCheckLifeTime: systemDefaults.VerificationLifetimes.MfaSoftwareCheck.Duration, - MfaHardwareCheckLifeTime: systemDefaults.VerificationLifetimes.MfaHardwareCheck.Duration, - IAMID: systemDefaults.IamID, + UserEvents: user, + OrgEvents: org, + AuthRequests: authReq, + View: view, + UserSessionViewProvider: view, + UserViewProvider: view, + UserEventProvider: user, + OrgViewProvider: view, + IDPProviderViewProvider: view, + LoginPolicyViewProvider: view, + UserGrantProvider: view, + IdGenerator: idGenerator, + PasswordCheckLifeTime: systemDefaults.VerificationLifetimes.PasswordCheck.Duration, + ExternalLoginCheckLifeTime: systemDefaults.VerificationLifetimes.PasswordCheck.Duration, + MfaInitSkippedLifeTime: systemDefaults.VerificationLifetimes.MfaInitSkip.Duration, + MfaSoftwareCheckLifeTime: systemDefaults.VerificationLifetimes.MfaSoftwareCheck.Duration, + MfaHardwareCheckLifeTime: systemDefaults.VerificationLifetimes.MfaHardwareCheck.Duration, + IAMID: systemDefaults.IamID, + }, + eventstore.TokenRepo{ + UserEvents: user, + View: view, }, - eventstore.TokenRepo{View: view}, eventstore.KeyRepository{ KeyEvents: key, View: view, @@ -164,6 +157,7 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults, au View: view, ProjectEvents: project, }, + eventstore.UserSessionRepo{ View: view, }, @@ -175,19 +169,16 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults, au AuthZRepo: authZRepo, }, eventstore.OrgRepository{ - SearchLimit: conf.SearchLimit, - View: view, - OrgEventstore: org, - PolicyEventstore: policy, - UserEventstore: user, + SearchLimit: conf.SearchLimit, + View: view, + OrgEventstore: org, + UserEventstore: user, + SystemDefaults: systemDefaults, }, eventstore.IAMRepository{ IAMEvents: iam, IAMID: systemDefaults.IamID, }, - eventstore.PolicyRepo{ - PolicyEvents: policy, - }, }, nil } diff --git a/internal/auth/repository/eventsourcing/view/application.go b/internal/auth/repository/eventsourcing/view/application.go index 5586b457c5..06e59881eb 100644 --- a/internal/auth/repository/eventsourcing/view/application.go +++ b/internal/auth/repository/eventsourcing/view/application.go @@ -18,16 +18,28 @@ func (v *View) ApplicationByID(projectID, appID string) (*model.ApplicationView, return view.ApplicationByID(v.Db, applicationTable, projectID, appID) } +func (v *View) ApplicationsByProjectID(projectID string) ([]*model.ApplicationView, error) { + return view.ApplicationsByProjectID(v.Db, applicationTable, projectID) +} + func (v *View) SearchApplications(request *proj_model.ApplicationSearchRequest) ([]*model.ApplicationView, uint64, error) { return view.SearchApplications(v.Db, applicationTable, request) } -func (v *View) PutApplication(project *model.ApplicationView) error { - err := view.PutApplication(v.Db, applicationTable, project) +func (v *View) PutApplication(app *model.ApplicationView) error { + err := view.PutApplication(v.Db, applicationTable, app) if err != nil { return err } - return v.ProcessedApplicationSequence(project.Sequence) + return v.ProcessedApplicationSequence(app.Sequence) +} + +func (v *View) PutApplications(apps []*model.ApplicationView, sequence uint64) error { + err := view.PutApplications(v.Db, applicationTable, apps...) + if err != nil { + return err + } + return v.ProcessedApplicationSequence(sequence) } func (v *View) DeleteApplication(appID string, eventSequence uint64) error { @@ -38,6 +50,10 @@ func (v *View) DeleteApplication(appID string, eventSequence uint64) error { return v.ProcessedApplicationSequence(eventSequence) } +func (v *View) DeleteApplicationsByProjectID(projectID string) error { + return view.DeleteApplicationsByProjectID(v.Db, applicationTable, projectID) +} + func (v *View) GetLatestApplicationSequence() (*repository.CurrentSequence, error) { return v.latestSequence(applicationTable) } @@ -55,24 +71,7 @@ func (v *View) ProcessedApplicationFailedEvent(failedEvent *repository.FailedEve } func (v *View) ApplicationByClientID(_ context.Context, clientID string) (*model.ApplicationView, error) { - req := &proj_model.ApplicationSearchRequest{ - Limit: 1, - Queries: []*proj_model.ApplicationSearchQuery{ - { - Key: proj_model.AppSearchKeyOIDCClientID, - Method: global_model.SearchMethodEquals, - Value: clientID, - }, - }, - } - apps, count, err := view.SearchApplications(v.Db, applicationTable, req) - if err != nil { - return nil, errors.ThrowPreconditionFailed(err, "VIEW-sd6JQ", "cannot find client") - } - if count != 1 { - return nil, errors.ThrowPreconditionFailed(nil, "VIEW-dfw3as", "cannot find client") - } - return apps[0], nil + return view.ApplicationByOIDCClientID(v.Db, applicationTable, clientID) } func (v *View) AppIDsFromProjectByClientID(ctx context.Context, clientID string) ([]string, error) { @@ -102,3 +101,27 @@ func (v *View) AppIDsFromProjectByClientID(ctx context.Context, clientID string) } return ids, nil } + +func (v *View) AppIDsFromProjectID(ctx context.Context, projectID string) ([]string, error) { + req := &proj_model.ApplicationSearchRequest{ + Queries: []*proj_model.ApplicationSearchQuery{ + { + Key: proj_model.AppSearchKeyProjectID, + Method: global_model.SearchMethodEquals, + Value: projectID, + }, + }, + } + apps, _, err := view.SearchApplications(v.Db, applicationTable, req) + if err != nil { + return nil, errors.ThrowPreconditionFailed(err, "VIEW-Gd24q", "cannot find applications") + } + ids := make([]string, 0, len(apps)) + for _, app := range apps { + if !app.IsOIDC { + continue + } + ids = append(ids, app.OIDCClientID) + } + return ids, nil +} diff --git a/internal/auth/repository/eventsourcing/view/external_idps.go b/internal/auth/repository/eventsourcing/view/external_idps.go index 70a382b3bc..6050dd73d8 100644 --- a/internal/auth/repository/eventsourcing/view/external_idps.go +++ b/internal/auth/repository/eventsourcing/view/external_idps.go @@ -56,6 +56,14 @@ func (v *View) DeleteExternalIDP(externalUserID, idpConfigID string, eventSequen return v.ProcessedExternalIDPSequence(eventSequence) } +func (v *View) DeleteExternalIDPsByUserID(userID string, eventSequence uint64) error { + err := view.DeleteExternalIDPsByUserID(v.Db, externalIDPTable, userID) + if err != nil { + return err + } + return v.ProcessedExternalIDPSequence(eventSequence) +} + func (v *View) GetLatestExternalIDPSequence() (*global_view.CurrentSequence, error) { return v.latestSequence(externalIDPTable) } diff --git a/internal/auth/repository/eventsourcing/view/org.go b/internal/auth/repository/eventsourcing/view/org.go index ca33f0cdfd..6383f62398 100644 --- a/internal/auth/repository/eventsourcing/view/org.go +++ b/internal/auth/repository/eventsourcing/view/org.go @@ -15,6 +15,10 @@ func (v *View) OrgByID(orgID string) (*org_model.OrgView, error) { return org_view.OrgByID(v.Db, orgTable, orgID) } +func (v *View) OrgByPrimaryDomain(primaryDomain string) (*org_model.OrgView, error) { + return org_view.OrgByPrimaryDomain(v.Db, orgTable, primaryDomain) +} + func (v *View) SearchOrgs(req *model.OrgSearchRequest) ([]*org_model.OrgView, uint64, error) { return org_view.SearchOrgs(v.Db, orgTable, req) } diff --git a/internal/auth/repository/eventsourcing/view/org_iam_policy.go b/internal/auth/repository/eventsourcing/view/org_iam_policy.go new file mode 100644 index 0000000000..2d43efc80e --- /dev/null +++ b/internal/auth/repository/eventsourcing/view/org_iam_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + orgIAMPolicyTable = "auth.org_iam_policies" +) + +func (v *View) OrgIAMPolicyByAggregateID(aggregateID string) (*model.OrgIAMPolicyView, error) { + return view.GetOrgIAMPolicyByAggregateID(v.Db, orgIAMPolicyTable, aggregateID) +} + +func (v *View) PutOrgIAMPolicy(policy *model.OrgIAMPolicyView, sequence uint64) error { + err := view.PutOrgIAMPolicy(v.Db, orgIAMPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedOrgIAMPolicySequence(sequence) +} + +func (v *View) DeleteOrgIAMPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeleteOrgIAMPolicy(v.Db, orgIAMPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedOrgIAMPolicySequence(eventSequence) +} + +func (v *View) GetLatestOrgIAMPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(orgIAMPolicyTable) +} + +func (v *View) ProcessedOrgIAMPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(orgIAMPolicyTable, eventSequence) +} + +func (v *View) GetLatestOrgIAMPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(orgIAMPolicyTable, sequence) +} + +func (v *View) ProcessedOrgIAMPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/auth/repository/eventsourcing/view/password_complexity_policy.go b/internal/auth/repository/eventsourcing/view/password_complexity_policy.go new file mode 100644 index 0000000000..93e28e1eb6 --- /dev/null +++ b/internal/auth/repository/eventsourcing/view/password_complexity_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + passwordComplexityPolicyTable = "auth.password_complexity_policies" +) + +func (v *View) PasswordComplexityPolicyByAggregateID(aggregateID string) (*model.PasswordComplexityPolicyView, error) { + return view.GetPasswordComplexityPolicyByAggregateID(v.Db, passwordComplexityPolicyTable, aggregateID) +} + +func (v *View) PutPasswordComplexityPolicy(policy *model.PasswordComplexityPolicyView, sequence uint64) error { + err := view.PutPasswordComplexityPolicy(v.Db, passwordComplexityPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedPasswordComplexityPolicySequence(sequence) +} + +func (v *View) DeletePasswordComplexityPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeletePasswordComplexityPolicy(v.Db, passwordComplexityPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedPasswordComplexityPolicySequence(eventSequence) +} + +func (v *View) GetLatestPasswordComplexityPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordComplexityPolicyTable) +} + +func (v *View) ProcessedPasswordComplexityPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(passwordComplexityPolicyTable, eventSequence) +} + +func (v *View) GetLatestPasswordComplexityPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(passwordComplexityPolicyTable, sequence) +} + +func (v *View) ProcessedPasswordComplexityPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/auth/repository/eventsourcing/view/project_role.go b/internal/auth/repository/eventsourcing/view/project_role.go new file mode 100644 index 0000000000..fdfe4d9dc1 --- /dev/null +++ b/internal/auth/repository/eventsourcing/view/project_role.go @@ -0,0 +1,68 @@ +package view + +import ( + proj_model "github.com/caos/zitadel/internal/project/model" + "github.com/caos/zitadel/internal/project/repository/view" + "github.com/caos/zitadel/internal/project/repository/view/model" + "github.com/caos/zitadel/internal/view/repository" +) + +const ( + projectRoleTable = "auth.project_roles" +) + +func (v *View) ProjectRoleByIDs(projectID, orgID, key string) (*model.ProjectRoleView, error) { + return view.ProjectRoleByIDs(v.Db, projectRoleTable, projectID, orgID, key) +} + +func (v *View) ProjectRolesByProjectID(projectID string) ([]*model.ProjectRoleView, error) { + return view.ProjectRolesByProjectID(v.Db, projectRoleTable, projectID) +} + +func (v *View) ResourceOwnerProjectRolesByKey(projectID, resourceowner, key string) ([]*model.ProjectRoleView, error) { + return view.ResourceOwnerProjectRolesByKey(v.Db, projectRoleTable, projectID, resourceowner, key) +} + +func (v *View) ResourceOwnerProjectRoles(projectID, resourceowner string) ([]*model.ProjectRoleView, error) { + return view.ResourceOwnerProjectRoles(v.Db, projectRoleTable, projectID, resourceowner) +} + +func (v *View) SearchProjectRoles(request *proj_model.ProjectRoleSearchRequest) ([]*model.ProjectRoleView, uint64, error) { + return view.SearchProjectRoles(v.Db, projectRoleTable, request) +} + +func (v *View) PutProjectRole(project *model.ProjectRoleView) error { + err := view.PutProjectRole(v.Db, projectRoleTable, project) + if err != nil { + return err + } + return v.ProcessedProjectRoleSequence(project.Sequence) +} + +func (v *View) DeleteProjectRole(projectID, orgID, key string, eventSequence uint64) error { + err := view.DeleteProjectRole(v.Db, projectRoleTable, projectID, orgID, key) + if err != nil { + return nil + } + return v.ProcessedProjectRoleSequence(eventSequence) +} + +func (v *View) DeleteProjectRolesByProjectID(projectID string) error { + return view.DeleteProjectRolesByProjectID(v.Db, projectRoleTable, projectID) +} + +func (v *View) GetLatestProjectRoleSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(projectRoleTable) +} + +func (v *View) ProcessedProjectRoleSequence(eventSequence uint64) error { + return v.saveCurrentSequence(projectRoleTable, eventSequence) +} + +func (v *View) GetLatestProjectRoleFailedEvent(sequence uint64) (*repository.FailedEvent, error) { + return v.latestFailedEvent(projectRoleTable, sequence) +} + +func (v *View) ProcessedProjectRoleFailedEvent(failedEvent *repository.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/auth/repository/eventsourcing/view/token.go b/internal/auth/repository/eventsourcing/view/token.go index 3737e60356..94ecabd9b3 100644 --- a/internal/auth/repository/eventsourcing/view/token.go +++ b/internal/auth/repository/eventsourcing/view/token.go @@ -1,62 +1,33 @@ package view import ( + usr_view "github.com/caos/zitadel/internal/user/repository/view" + "github.com/caos/zitadel/internal/user/repository/view/model" "github.com/caos/zitadel/internal/view/repository" - "time" - - "github.com/caos/zitadel/internal/token/repository/view" - "github.com/caos/zitadel/internal/token/repository/view/model" ) const ( tokenTable = "auth.tokens" ) -func (v *View) TokenByID(tokenID string) (*model.Token, error) { - return view.TokenByID(v.Db, tokenTable, tokenID) +func (v *View) TokenByID(tokenID string) (*model.TokenView, error) { + return usr_view.TokenByID(v.Db, tokenTable, tokenID) } -func (v *View) TokensByUserID(userID string) ([]*model.Token, error) { - return view.TokensByUserID(v.Db, tokenTable, userID) +func (v *View) TokensByUserID(userID string) ([]*model.TokenView, error) { + return usr_view.TokensByUserID(v.Db, tokenTable, userID) } -func (v *View) IsTokenValid(tokenID string) (bool, error) { - return view.IsTokenValid(v.Db, tokenTable, tokenID) -} - -func (v *View) CreateToken(agentID, applicationID, userID, preferredLanguage string, audience, scopes []string, lifetime time.Duration) (*model.Token, error) { - id, err := v.idGenerator.Next() - if err != nil { - return nil, err - } - now := time.Now().UTC() - token := &model.Token{ - ID: id, - CreationDate: now, - UserID: userID, - ApplicationID: applicationID, - UserAgentID: agentID, - Scopes: scopes, - Audience: audience, - Expiration: now.Add(lifetime), - PreferredLanguage: preferredLanguage, - } - if err := view.PutToken(v.Db, tokenTable, token); err != nil { - return nil, err - } - return token, nil -} - -func (v *View) PutToken(token *model.Token) error { - err := view.PutToken(v.Db, tokenTable, token) +func (v *View) PutToken(token *model.TokenView) error { + err := usr_view.PutToken(v.Db, tokenTable, token) if err != nil { return err } return v.ProcessedTokenSequence(token.Sequence) } -func (v *View) PutTokens(token []*model.Token, sequence uint64) error { - err := view.PutTokens(v.Db, tokenTable, token...) +func (v *View) PutTokens(token []*model.TokenView, sequence uint64) error { + err := usr_view.PutTokens(v.Db, tokenTable, token...) if err != nil { return err } @@ -64,7 +35,7 @@ func (v *View) PutTokens(token []*model.Token, sequence uint64) error { } func (v *View) DeleteToken(tokenID string, eventSequence uint64) error { - err := view.DeleteToken(v.Db, tokenTable, tokenID) + err := usr_view.DeleteToken(v.Db, tokenTable, tokenID) if err != nil { return nil } @@ -72,7 +43,7 @@ func (v *View) DeleteToken(tokenID string, eventSequence uint64) error { } func (v *View) DeleteSessionTokens(agentID, userID string, eventSequence uint64) error { - err := view.DeleteSessionTokens(v.Db, tokenTable, agentID, userID) + err := usr_view.DeleteSessionTokens(v.Db, tokenTable, agentID, userID) if err != nil { return nil } @@ -80,7 +51,7 @@ func (v *View) DeleteSessionTokens(agentID, userID string, eventSequence uint64) } func (v *View) DeleteUserTokens(userID string, eventSequence uint64) error { - err := view.DeleteUserTokens(v.Db, tokenTable, userID) + err := usr_view.DeleteUserTokens(v.Db, tokenTable, userID) if err != nil { return nil } @@ -88,7 +59,7 @@ func (v *View) DeleteUserTokens(userID string, eventSequence uint64) error { } func (v *View) DeleteApplicationTokens(eventSequence uint64, ids ...string) error { - err := view.DeleteApplicationTokens(v.Db, tokenTable, ids) + err := usr_view.DeleteApplicationTokens(v.Db, tokenTable, ids) if err != nil { return nil } diff --git a/internal/auth/repository/eventsourcing/view/user_membership.go b/internal/auth/repository/eventsourcing/view/user_membership.go index 30ce719b06..cbd241e350 100644 --- a/internal/auth/repository/eventsourcing/view/user_membership.go +++ b/internal/auth/repository/eventsourcing/view/user_membership.go @@ -36,7 +36,7 @@ func (v *View) PutUserMembership(membership *model.UserMembershipView, sequence } func (v *View) BulkPutUserMemberships(memberships []*model.UserMembershipView, sequence uint64) error { - err := view.PutUserMemberships(v.Db, userTable, memberships...) + err := view.PutUserMemberships(v.Db, userMembershipTable, memberships...) if err != nil { return err } @@ -51,6 +51,30 @@ func (v *View) DeleteUserMembership(userID, aggregateID, objectID string, member return v.ProcessedUserMembershipSequence(eventSequence) } +func (v *View) DeleteUserMembershipsByUserID(userID string, eventSequence uint64) error { + err := view.DeleteUserMembershipsByUserID(v.Db, userMembershipTable, userID) + if err != nil { + return nil + } + return v.ProcessedUserMembershipSequence(eventSequence) +} + +func (v *View) DeleteUserMembershipsByAggregateID(aggregateID string, eventSequence uint64) error { + err := view.DeleteUserMembershipsByAggregateID(v.Db, userMembershipTable, aggregateID) + if err != nil { + return nil + } + return v.ProcessedUserMembershipSequence(eventSequence) +} + +func (v *View) DeleteUserMembershipsByAggregateIDAndObjectID(aggregateID, objectID string, eventSequence uint64) error { + err := view.DeleteUserMembershipsByAggregateIDAndObjectID(v.Db, userMembershipTable, aggregateID, objectID) + if err != nil { + return nil + } + return v.ProcessedUserMembershipSequence(eventSequence) +} + func (v *View) GetLatestUserMembershipSequence() (*repository.CurrentSequence, error) { return v.latestSequence(userMembershipTable) } diff --git a/internal/auth/repository/org.go b/internal/auth/repository/org.go index 54b75b2643..2139987a18 100644 --- a/internal/auth/repository/org.go +++ b/internal/auth/repository/org.go @@ -4,12 +4,12 @@ import ( "context" auth_model "github.com/caos/zitadel/internal/auth/model" iam_model "github.com/caos/zitadel/internal/iam/model" - org_model "github.com/caos/zitadel/internal/org/model" ) type OrgRepository interface { RegisterOrg(context.Context, *auth_model.RegisterOrg) (*auth_model.RegisterOrg, error) - GetOrgIamPolicy(ctx context.Context, orgID string) (*org_model.OrgIAMPolicy, error) - GetDefaultOrgIamPolicy(ctx context.Context) *org_model.OrgIAMPolicy + GetOrgIAMPolicy(ctx context.Context, orgID string) (*iam_model.OrgIAMPolicyView, error) + GetDefaultOrgIAMPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) GetIDPConfigByID(ctx context.Context, idpConfigID string) (*iam_model.IDPConfigView, error) + GetMyPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) } diff --git a/internal/auth/repository/policy.go b/internal/auth/repository/policy.go deleted file mode 100644 index e689f2ce0c..0000000000 --- a/internal/auth/repository/policy.go +++ /dev/null @@ -1,10 +0,0 @@ -package repository - -import ( - "context" - "github.com/caos/zitadel/internal/policy/model" -) - -type PolicyRepository interface { - GetMyPasswordComplexityPolicy(ctx context.Context) (*model.PasswordComplexityPolicy, error) -} diff --git a/internal/auth/repository/project.go b/internal/auth/repository/project.go new file mode 100644 index 0000000000..fdfba50064 --- /dev/null +++ b/internal/auth/repository/project.go @@ -0,0 +1,9 @@ +package repository + +import ( + "github.com/caos/zitadel/internal/project/model" +) + +type ProjectRepository interface { + ProjectRolesByProjectID(projectID string) ([]*model.ProjectRoleView, error) +} diff --git a/internal/auth/repository/repository.go b/internal/auth/repository/repository.go index abc0b88329..cbb872ded8 100644 --- a/internal/auth/repository/repository.go +++ b/internal/auth/repository/repository.go @@ -10,10 +10,10 @@ type Repository interface { AuthRequestRepository TokenRepository ApplicationRepository + ProjectRepository KeyRepository UserSessionRepository UserGrantRepository - PolicyRepository OrgRepository IAMRepository } diff --git a/internal/auth/repository/token.go b/internal/auth/repository/token.go index 17db69118e..7c998725ad 100644 --- a/internal/auth/repository/token.go +++ b/internal/auth/repository/token.go @@ -2,13 +2,12 @@ package repository import ( "context" + usr_model "github.com/caos/zitadel/internal/user/model" "time" - - "github.com/caos/zitadel/internal/token/model" ) type TokenRepository interface { - CreateToken(ctx context.Context, agentID, applicationID, userID string, audience, scopes []string, lifetime time.Duration) (*model.Token, error) - IsTokenValid(ctx context.Context, tokenID string) (bool, error) - TokenByID(ctx context.Context, tokenID string) (*model.Token, error) + CreateToken(ctx context.Context, agentID, applicationID, userID string, audience, scopes []string, lifetime time.Duration) (*usr_model.Token, error) + IsTokenValid(ctx context.Context, userID, tokenID string) (bool, error) + TokenByID(ctx context.Context, userID, tokenID string) (*usr_model.TokenView, error) } diff --git a/internal/auth_request/model/auth_request.go b/internal/auth_request/model/auth_request.go index b1f56accf1..54df88007f 100644 --- a/internal/auth_request/model/auth_request.go +++ b/internal/auth_request/model/auth_request.go @@ -126,12 +126,12 @@ func (a *AuthRequest) SetUserInfo(userID, loginName, displayName, userOrgID stri a.UserOrgID = userOrgID } -func (a *AuthRequest) GetScopeOrgID() string { +func (a *AuthRequest) GetScopeOrgPrimaryDomain() string { switch request := a.Request.(type) { case *AuthRequestOIDC: for _, scope := range request.Scopes { - if strings.HasPrefix(scope, OrgIDScope) { - strings.TrimPrefix(scope, OrgIDScope) + if strings.HasPrefix(scope, OrgDomainPrimaryScope) { + return strings.TrimPrefix(scope, OrgDomainPrimaryScope) } } } diff --git a/internal/auth_request/model/next_step.go b/internal/auth_request/model/next_step.go index cbaead8e46..d3f9f45796 100644 --- a/internal/auth_request/model/next_step.go +++ b/internal/auth_request/model/next_step.go @@ -21,6 +21,8 @@ const ( NextStepChangeUsername NextStepLinkUsers NextStepExternalNotFoundOption + NextStepExternalLogin + NextStepGrantRequired ) type UserSessionState int32 @@ -71,6 +73,14 @@ func (s *PasswordStep) Type() NextStepType { return NextStepPassword } +type ExternalLoginStep struct { + SelectedIDPConfigID string +} + +func (s *ExternalLoginStep) Type() NextStepType { + return NextStepExternalLogin +} + type ChangePasswordStep struct{} func (s *ChangePasswordStep) Type() NextStepType { @@ -118,6 +128,12 @@ func (s *LinkUsersStep) Type() NextStepType { return NextStepLinkUsers } +type GrantRequiredStep struct{} + +func (s *GrantRequiredStep) Type() NextStepType { + return NextStepGrantRequired +} + type RedirectToCallbackStep struct{} func (s *RedirectToCallbackStep) Type() NextStepType { diff --git a/internal/auth_request/model/request.go b/internal/auth_request/model/request.go index 5bf1f9a507..e0288ea2a6 100644 --- a/internal/auth_request/model/request.go +++ b/internal/auth_request/model/request.go @@ -19,7 +19,7 @@ const ( ) const ( - OrgIDScope = "urn:zitadel:organisation:id:" + OrgDomainPrimaryScope = "urn:zitadel:org:domain:primary:" ) type AuthRequestOIDC struct { diff --git a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go index c4b041c8ce..359c66ace2 100644 --- a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go +++ b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go @@ -2,6 +2,11 @@ package eventstore import ( "context" + "github.com/caos/logging" + usr_model "github.com/caos/zitadel/internal/user/model" + usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" + "github.com/caos/zitadel/internal/user/repository/view/model" + "strings" "time" "github.com/caos/zitadel/internal/authz/repository/eventsourcing/view" @@ -9,6 +14,7 @@ import ( caos_errs "github.com/caos/zitadel/internal/errors" iam_event "github.com/caos/zitadel/internal/iam/repository/eventsourcing" proj_event "github.com/caos/zitadel/internal/project/repository/eventsourcing" + "github.com/caos/zitadel/internal/tracing" ) type TokenVerifierRepo struct { @@ -16,16 +22,57 @@ type TokenVerifierRepo struct { IAMID string IAMEvents *iam_event.IAMEventstore ProjectEvents *proj_event.ProjectEventstore + UserEvents *usr_event.UserEventstore View *view.View } +func (repo *TokenVerifierRepo) TokenByID(ctx context.Context, tokenID, userID string) (*usr_model.TokenView, error) { + token, viewErr := repo.View.TokenByID(tokenID) + if viewErr != nil && !caos_errs.IsNotFound(viewErr) { + return nil, viewErr + } + if caos_errs.IsNotFound(viewErr) { + token = new(model.TokenView) + token.ID = tokenID + token.UserID = userID + } + + events, esErr := repo.UserEvents.UserEventsByID(ctx, userID, token.Sequence) + if caos_errs.IsNotFound(viewErr) && len(events) == 0 { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-4T90g", "Errors.Token.NotFound") + } + + if esErr != nil { + logging.Log("EVENT-5Nm9s").WithError(viewErr).Debug("error retrieving new events") + return model.TokenViewToModel(token), nil + } + viewToken := *token + for _, event := range events { + err := token.AppendEventIfMyToken(event) + if err != nil { + return model.TokenViewToModel(&viewToken), nil + } + } + if !token.Expiration.After(time.Now().UTC()) || token.Deactivated { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-5Bm9s", "Errors.Token.NotFound") + } + return model.TokenViewToModel(token), nil +} + func (repo *TokenVerifierRepo) VerifyAccessToken(ctx context.Context, tokenString, clientID string) (userID string, agentID string, prefLang string, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() //TODO: use real key - tokenID, err := crypto.DecryptAESString(tokenString, string(repo.TokenVerificationKey[:32])) + tokenIDSubject, err := crypto.DecryptAESString(tokenString, string(repo.TokenVerificationKey[:32])) if err != nil { return "", "", "", caos_errs.ThrowUnauthenticated(nil, "APP-8EF0zZ", "invalid token") } - token, err := repo.View.TokenByID(tokenID) + + splittedToken := strings.Split(tokenIDSubject, ":") + if len(splittedToken) != 2 { + return "", "", "", caos_errs.ThrowUnauthenticated(nil, "APP-GDg3a", "invalid token") + } + token, err := repo.TokenByID(ctx, splittedToken[0], splittedToken[1]) if err != nil { return "", "", "", caos_errs.ThrowUnauthenticated(err, "APP-BxUSiL", "invalid token") } @@ -54,12 +101,15 @@ func (repo *TokenVerifierRepo) ExistsOrg(ctx context.Context, orgID string) erro return err } -func (repo *TokenVerifierRepo) VerifierClientID(ctx context.Context, appName string) (string, error) { +func (repo *TokenVerifierRepo) VerifierClientID(ctx context.Context, appName string) (_ string, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + iam, err := repo.IAMEvents.IAMByID(ctx, repo.IAMID) if err != nil { return "", err } - app, err := repo.View.ApplicationByProjecIDAndAppName(iam.IAMProjectID, appName) + app, err := repo.View.ApplicationByProjecIDAndAppName(ctx, iam.IAMProjectID, appName) if err != nil { return "", err } diff --git a/internal/authz/repository/eventsourcing/eventstore/user_grant.go b/internal/authz/repository/eventsourcing/eventstore/user_grant.go index f1007d68c7..0d217fa9ad 100644 --- a/internal/authz/repository/eventsourcing/eventstore/user_grant.go +++ b/internal/authz/repository/eventsourcing/eventstore/user_grant.go @@ -6,6 +6,7 @@ import ( "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/authz/repository/eventsourcing/view" caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" iam_event "github.com/caos/zitadel/internal/iam/repository/eventsourcing" grant_model "github.com/caos/zitadel/internal/usergrant/model" "github.com/caos/zitadel/internal/usergrant/repository/view/model" @@ -71,7 +72,7 @@ func (repo *UserGrantRepo) FillIamProjectID(ctx context.Context) error { if err != nil { return err } - if !iam.SetUpDone { + if iam.SetUpDone < iam_model.StepCount-1 { return caos_errs.ThrowPreconditionFailed(nil, "EVENT-skiwS", "Setup not done") } repo.IamProjectID = iam.IAMProjectID diff --git a/internal/authz/repository/eventsourcing/handler/application.go b/internal/authz/repository/eventsourcing/handler/application.go index 3b329daa9e..401f761ad0 100644 --- a/internal/authz/repository/eventsourcing/handler/application.go +++ b/internal/authz/repository/eventsourcing/handler/application.go @@ -18,19 +18,19 @@ const ( applicationTable = "authz.applications" ) -func (p *Application) ViewModel() string { +func (a *Application) ViewModel() string { return applicationTable } -func (p *Application) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestApplicationSequence() +func (a *Application) EventQuery() (*models.SearchQuery, error) { + sequence, err := a.view.GetLatestApplicationSequence() if err != nil { return nil, err } return eventsourcing.ProjectQuery(sequence.CurrentSequence), nil } -func (p *Application) Reduce(event *models.Event) (err error) { +func (a *Application) Reduce(event *models.Event) (err error) { app := new(view_model.ApplicationView) switch event.Type { case es_model.ApplicationAdded: @@ -44,7 +44,7 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - app, err = p.view.ApplicationByID(event.AggregateID, app.ID) + app, err = a.view.ApplicationByID(event.AggregateID, app.ID) if err != nil { return err } @@ -54,17 +54,17 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - return p.view.DeleteApplication(app.ID, event.Sequence) + return a.view.DeleteApplication(app.ID, event.Sequence) default: - return p.view.ProcessedApplicationSequence(event.Sequence) + return a.view.ProcessedApplicationSequence(event.Sequence) } if err != nil { return err } - return p.view.PutApplication(app) + return a.view.PutApplication(app) } -func (p *Application) OnError(event *models.Event, spoolerError error) error { +func (a *Application) OnError(event *models.Event, spoolerError error) error { logging.LogWithFields("SPOOL-sjZw", "id", event.AggregateID).WithError(spoolerError).Warn("something went wrong in project app handler") - return spooler.HandleError(event, spoolerError, p.view.GetLatestApplicationFailedEvent, p.view.ProcessedApplicationFailedEvent, p.view.ProcessedApplicationSequence, p.errorCountUntilSkip) + return spooler.HandleError(event, spoolerError, a.view.GetLatestApplicationFailedEvent, a.view.ProcessedApplicationFailedEvent, a.view.ProcessedApplicationSequence, a.errorCountUntilSkip) } diff --git a/internal/authz/repository/eventsourcing/handler/user_grant.go b/internal/authz/repository/eventsourcing/handler/user_grant.go index b0b0e43d7c..897186b8e8 100644 --- a/internal/authz/repository/eventsourcing/handler/user_grant.go +++ b/internal/authz/repository/eventsourcing/handler/user_grant.go @@ -12,6 +12,7 @@ import ( "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/model" iam_events "github.com/caos/zitadel/internal/iam/repository/eventsourcing" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" @@ -56,7 +57,7 @@ func (u *UserGrant) Reduce(event *models.Event) (err error) { case proj_es_model.ProjectAggregate: err = u.processProject(event) case iam_es_model.IAMAggregate: - err = u.processIamMember(event, "IAM", false) + err = u.processIAMMember(event, "IAM", false) case org_es_model.OrgAggregate: return u.processOrg(event) } @@ -89,7 +90,7 @@ func (u *UserGrant) processOrg(event *models.Event) (err error) { } } -func (u *UserGrant) processIamMember(event *models.Event, rolePrefix string, suffix bool) error { +func (u *UserGrant) processIAMMember(event *models.Event, rolePrefix string, suffix bool) error { member := new(iam_es_model.IAMMember) switch event.Type { @@ -157,6 +158,7 @@ func (u *UserGrant) processMember(event *models.Event, rolePrefix, roleSuffix st RoleKeys: roleKeys, CreationDate: event.CreationDate, } + } else { newRoles := roleKeys if grant.RoleKeys != nil { @@ -173,10 +175,20 @@ func (u *UserGrant) processMember(event *models.Event, rolePrefix, roleSuffix st proj_es_model.ProjectGrantMemberRemoved: grant, err := u.view.UserGrantByIDs(event.ResourceOwner, u.iamProjectID, userID) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } - return u.view.DeleteUserGrant(grant.ID, event.Sequence) + if errors.IsNotFound(err) { + return u.view.ProcessedUserGrantSequence(event.Sequence) + } + if roleSuffix != "" { + roleKeys = suffixRoles(roleSuffix, roleKeys) + } + if grant.RoleKeys == nil { + return u.view.ProcessedUserGrantSequence(event.Sequence) + } + grant.RoleKeys = mergeExistingRoles(rolePrefix, roleSuffix, grant.RoleKeys, nil) + return u.view.PutUserGrant(grant, event.Sequence) default: return u.view.ProcessedUserGrantSequence(event.Sequence) } @@ -212,7 +224,7 @@ func (u *UserGrant) setIamProjectID() error { if err != nil { return err } - if !iam.SetUpDone { + if iam.SetUpDone < iam_model.StepCount-1 { return caos_errs.ThrowPreconditionFailed(nil, "HANDL-s5DTs", "Setup not done") } u.iamProjectID = iam.IAMProjectID diff --git a/internal/authz/repository/eventsourcing/repository.go b/internal/authz/repository/eventsourcing/repository.go index 2116f9d5a6..b39ad5e2e8 100644 --- a/internal/authz/repository/eventsourcing/repository.go +++ b/internal/authz/repository/eventsourcing/repository.go @@ -2,6 +2,7 @@ package eventsourcing import ( "context" + es_user "github.com/caos/zitadel/internal/user/repository/eventsourcing" "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/auth_request/repository/cache" @@ -65,6 +66,16 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults) (* if err != nil { return nil, err } + user, err := es_user.StartUser( + es_user.UserConfig{ + Eventstore: es, + Cache: conf.Eventstore.Cache, + }, + systemDefaults, + ) + if err != nil { + return nil, err + } repos := handler.EventstoreRepos{IamEvents: iam} spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, repos, systemDefaults) @@ -85,6 +96,7 @@ func Start(conf Config, authZ authz.Config, systemDefaults sd.SystemDefaults) (* IAMID: systemDefaults.IamID, IAMEvents: iam, ProjectEvents: project, + UserEvents: user, View: view, }, }, nil diff --git a/internal/authz/repository/eventsourcing/view/application.go b/internal/authz/repository/eventsourcing/view/application.go index 63d028719e..bb82b4d62f 100644 --- a/internal/authz/repository/eventsourcing/view/application.go +++ b/internal/authz/repository/eventsourcing/view/application.go @@ -1,9 +1,12 @@ package view import ( + "context" + proj_model "github.com/caos/zitadel/internal/project/model" "github.com/caos/zitadel/internal/project/repository/view" "github.com/caos/zitadel/internal/project/repository/view/model" + "github.com/caos/zitadel/internal/tracing" "github.com/caos/zitadel/internal/view/repository" ) @@ -19,7 +22,10 @@ func (v *View) ApplicationByOIDCClientID(clientID string) (*model.ApplicationVie return view.ApplicationByOIDCClientID(v.Db, applicationTable, clientID) } -func (v *View) ApplicationByProjecIDAndAppName(projectID, appName string) (*model.ApplicationView, error) { +func (v *View) ApplicationByProjecIDAndAppName(ctx context.Context, projectID, appName string) (_ *model.ApplicationView, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + return view.ApplicationByProjectIDAndAppName(v.Db, applicationTable, projectID, appName) } diff --git a/internal/authz/repository/eventsourcing/view/token.go b/internal/authz/repository/eventsourcing/view/token.go index 91975b158a..7c5a7163f6 100644 --- a/internal/authz/repository/eventsourcing/view/token.go +++ b/internal/authz/repository/eventsourcing/view/token.go @@ -1,8 +1,8 @@ package view import ( - "github.com/caos/zitadel/internal/token/repository/view" - "github.com/caos/zitadel/internal/token/repository/view/model" + usr_view "github.com/caos/zitadel/internal/user/repository/view" + usr_view_model "github.com/caos/zitadel/internal/user/repository/view/model" "github.com/caos/zitadel/internal/view/repository" ) @@ -10,16 +10,12 @@ const ( tokenTable = "auth.tokens" ) -func (v *View) TokenByID(tokenID string) (*model.Token, error) { - return view.TokenByID(v.Db, tokenTable, tokenID) +func (v *View) TokenByID(tokenID string) (*usr_view_model.TokenView, error) { + return usr_view.TokenByID(v.Db, tokenTable, tokenID) } -func (v *View) IsTokenValid(tokenID string) (bool, error) { - return view.IsTokenValid(v.Db, tokenTable, tokenID) -} - -func (v *View) PutToken(token *model.Token) error { - err := view.PutToken(v.Db, tokenTable, token) +func (v *View) PutToken(token *usr_view_model.TokenView) error { + err := usr_view.PutToken(v.Db, tokenTable, token) if err != nil { return err } @@ -27,7 +23,7 @@ func (v *View) PutToken(token *model.Token) error { } func (v *View) DeleteToken(tokenID string, eventSequence uint64) error { - err := view.DeleteToken(v.Db, tokenTable, tokenID) + err := usr_view.DeleteToken(v.Db, tokenTable, tokenID) if err != nil { return nil } @@ -35,7 +31,7 @@ func (v *View) DeleteToken(tokenID string, eventSequence uint64) error { } func (v *View) DeleteSessionTokens(agentID, userID string, eventSequence uint64) error { - err := view.DeleteSessionTokens(v.Db, tokenTable, agentID, userID) + err := usr_view.DeleteSessionTokens(v.Db, tokenTable, agentID, userID) if err != nil { return nil } diff --git a/internal/config/systemdefaults/system_defaults.go b/internal/config/systemdefaults/system_defaults.go index 296955ee85..502badee6e 100644 --- a/internal/config/systemdefaults/system_defaults.go +++ b/internal/config/systemdefaults/system_defaults.go @@ -9,8 +9,6 @@ import ( "github.com/caos/zitadel/internal/notification/providers/email" "github.com/caos/zitadel/internal/notification/providers/twilio" "github.com/caos/zitadel/internal/notification/templates" - org_model "github.com/caos/zitadel/internal/org/model" - pol "github.com/caos/zitadel/internal/policy" ) type SystemDefaults struct { @@ -22,7 +20,6 @@ type SystemDefaults struct { IDPConfigVerificationKey *crypto.KeyConfig Multifactors MultifactorConfig VerificationLifetimes VerificationLifetimes - DefaultPolicies DefaultPolicies DomainVerification DomainVerification IamID string Notifications Notifications @@ -53,17 +50,11 @@ type OTPConfig struct { } type VerificationLifetimes struct { - PasswordCheck types.Duration - MfaInitSkip types.Duration - MfaSoftwareCheck types.Duration - MfaHardwareCheck types.Duration -} - -type DefaultPolicies struct { - Age pol.PasswordAgePolicyDefault - Complexity pol.PasswordComplexityPolicyDefault - Lockout pol.PasswordLockoutPolicyDefault - OrgIam org_model.OrgIAMPolicy + PasswordCheck types.Duration + ExternalLoginCheck types.Duration + MfaInitSkip types.Duration + MfaSoftwareCheck types.Duration + MfaHardwareCheck types.Duration } type DomainVerification struct { diff --git a/internal/eventstore/internal/repository/sql/push.go b/internal/eventstore/internal/repository/sql/push.go index 16657a407e..2795a5c89f 100644 --- a/internal/eventstore/internal/repository/sql/push.go +++ b/internal/eventstore/internal/repository/sql/push.go @@ -68,7 +68,8 @@ func precondtion(tx *sql.Tx, aggregate *models.Aggregate) error { func insertEvents(stmt *sql.Stmt, previousSequence Sequence, events []*models.Event) error { for _, event := range events { - err := stmt.QueryRow(event.Type, event.AggregateType, event.AggregateID, event.AggregateVersion, event.CreationDate, Data(event.Data), event.EditorUser, event.EditorService, event.ResourceOwner, previousSequence, + creationDate := sql.NullTime{Time: event.CreationDate, Valid: !event.CreationDate.IsZero()} + err := stmt.QueryRow(event.Type, event.AggregateType, event.AggregateID, event.AggregateVersion, creationDate, Data(event.Data), event.EditorUser, event.EditorService, event.ResourceOwner, previousSequence, event.AggregateType, event.AggregateID, previousSequence, previousSequence).Scan(&previousSequence, &event.CreationDate) if err != nil { diff --git a/internal/iam/model/iam.go b/internal/iam/model/iam.go index 7460715492..f10b6295c2 100644 --- a/internal/iam/model/iam.go +++ b/internal/iam/model/iam.go @@ -4,15 +4,33 @@ import ( es_models "github.com/caos/zitadel/internal/eventstore/models" ) +type Step int + +const ( + Step1 Step = iota + 1 + Step2 + Step3 + Step4 + Step5 + Step6 + //StepCount marks the the length of possible steps (StepCount-1 == last possible step) + StepCount +) + type IAM struct { es_models.ObjectRoot - GlobalOrgID string - IAMProjectID string - SetUpDone bool - SetUpStarted bool - Members []*IAMMember - IDPs []*IDPConfig - DefaultLoginPolicy *LoginPolicy + GlobalOrgID string + IAMProjectID string + SetUpDone Step + SetUpStarted Step + Members []*IAMMember + IDPs []*IDPConfig + DefaultLoginPolicy *LoginPolicy + DefaultLabelPolicy *LabelPolicy + DefaultOrgIAMPolicy *OrgIAMPolicy + DefaultPasswordComplexityPolicy *PasswordComplexityPolicy + DefaultPasswordAgePolicy *PasswordAgePolicy + DefaultPasswordLockoutPolicy *PasswordLockoutPolicy } func (iam *IAM) GetMember(userID string) (int, *IAMMember) { diff --git a/internal/iam/model/idp_config.go b/internal/iam/model/idp_config.go index bf6ecd45e6..29616d8d77 100644 --- a/internal/iam/model/idp_config.go +++ b/internal/iam/model/idp_config.go @@ -10,7 +10,7 @@ type IDPConfig struct { IDPConfigID string Type IdpConfigType Name string - LogoSrc []byte + StylingType IDPStylingType State IDPConfigState OIDCConfig *OIDCIDPConfig } @@ -42,6 +42,13 @@ const ( IDPConfigStateRemoved ) +type IDPStylingType int32 + +const ( + IDPStylingTypeUnspecified IDPStylingType = iota + IDPStylingTypeGoogle +) + type OIDCMappingField int32 const ( @@ -82,3 +89,12 @@ func (oi *OIDCIDPConfig) CryptSecret(crypt crypto.Crypto) error { oi.ClientSecret = cryptedSecret return nil } + +func (st IDPStylingType) GetCSSClass() string { + switch st { + case IDPStylingTypeGoogle: + return "google" + default: + return "" + } +} diff --git a/internal/iam/model/idp_config_view.go b/internal/iam/model/idp_config_view.go index 61770b8dfa..983e0bc5ab 100644 --- a/internal/iam/model/idp_config_view.go +++ b/internal/iam/model/idp_config_view.go @@ -10,7 +10,7 @@ type IDPConfigView struct { AggregateID string IDPConfigID string Name string - LogoSrc []byte + StylingType IDPStylingType State IDPConfigState CreationDate time.Time ChangeDate time.Time diff --git a/internal/iam/model/idp_provider_view.go b/internal/iam/model/idp_provider_view.go index 42f85e1760..5a8f981c13 100644 --- a/internal/iam/model/idp_provider_view.go +++ b/internal/iam/model/idp_provider_view.go @@ -10,6 +10,7 @@ type IDPProviderView struct { IDPConfigID string IDPProviderType IDPProviderType Name string + StylingType IDPStylingType IDPConfigType IdpConfigType IDPState IDPConfigState diff --git a/internal/iam/model/label_policy.go b/internal/iam/model/label_policy.go new file mode 100644 index 0000000000..ead99759a0 --- /dev/null +++ b/internal/iam/model/label_policy.go @@ -0,0 +1,18 @@ +package model + +import ( + "github.com/caos/zitadel/internal/eventstore/models" +) + +type LabelPolicy struct { + models.ObjectRoot + + State PolicyState + Default bool + PrimaryColor string + SecondaryColor string +} + +func (p *LabelPolicy) IsValid() bool { + return p.ObjectRoot.AggregateID != "" +} diff --git a/internal/iam/model/label_policy_view.go b/internal/iam/model/label_policy_view.go new file mode 100644 index 0000000000..9202680909 --- /dev/null +++ b/internal/iam/model/label_policy_view.go @@ -0,0 +1,48 @@ +package model + +import ( + "time" + + "github.com/caos/zitadel/internal/model" +) + +type LabelPolicyView struct { + AggregateID string + PrimaryColor string + SecondaryColor string + Default bool + + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type LabelPolicySearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn LabelPolicySearchKey + Asc bool + Queries []*LabelPolicySearchQuery +} + +type LabelPolicySearchKey int32 + +const ( + LabelPolicySearchKeyUnspecified LabelPolicySearchKey = iota + LabelPolicySearchKeyAggregateID +) + +type LabelPolicySearchQuery struct { + Key LabelPolicySearchKey + Method model.SearchMethod + Value interface{} +} + +type LabelPolicySearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*LabelPolicyView + Sequence uint64 + Timestamp time.Time +} diff --git a/internal/org/model/org_iam_policy.go b/internal/iam/model/org_iam_policy.go similarity index 59% rename from internal/org/model/org_iam_policy.go rename to internal/iam/model/org_iam_policy.go index 20ee51f958..2bbf876660 100644 --- a/internal/org/model/org_iam_policy.go +++ b/internal/iam/model/org_iam_policy.go @@ -7,16 +7,7 @@ import ( type OrgIAMPolicy struct { models.ObjectRoot - Description string State PolicyState UserLoginMustBeDomain bool Default bool - IamDomain string } - -type PolicyState int32 - -const ( - PolicyStateActive PolicyState = iota - PolicyStateRemoved -) diff --git a/internal/iam/model/org_iam_policy_view.go b/internal/iam/model/org_iam_policy_view.go new file mode 100644 index 0000000000..e311aaecec --- /dev/null +++ b/internal/iam/model/org_iam_policy_view.go @@ -0,0 +1,47 @@ +package model + +import ( + "github.com/caos/zitadel/internal/model" + "time" +) + +type OrgIAMPolicyView struct { + AggregateID string + UserLoginMustBeDomain bool + IAMDomain string + Default bool + + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type OrgIAMPolicySearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn OrgIAMPolicySearchKey + Asc bool + Queries []*OrgIAMPolicySearchQuery +} + +type OrgIAMPolicySearchKey int32 + +const ( + OrgIAMPolicySearchKeyUnspecified OrgIAMPolicySearchKey = iota + OrgIAMPolicySearchKeyAggregateID +) + +type OrgIAMPolicySearchQuery struct { + Key OrgIAMPolicySearchKey + Method model.SearchMethod + Value interface{} +} + +type OrgIAMPolicySearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*OrgIAMPolicyView + Sequence uint64 + Timestamp time.Time +} diff --git a/internal/policy/model/policy_age.go b/internal/iam/model/password_age_policy.go similarity index 90% rename from internal/policy/model/policy_age.go rename to internal/iam/model/password_age_policy.go index aba6096393..e3eed17d48 100644 --- a/internal/policy/model/policy_age.go +++ b/internal/iam/model/password_age_policy.go @@ -7,7 +7,6 @@ import ( type PasswordAgePolicy struct { models.ObjectRoot - Description string State PolicyState MaxAgeDays uint64 ExpireWarnDays uint64 diff --git a/internal/iam/model/password_age_policy_view.go b/internal/iam/model/password_age_policy_view.go new file mode 100644 index 0000000000..5e94dd07df --- /dev/null +++ b/internal/iam/model/password_age_policy_view.go @@ -0,0 +1,47 @@ +package model + +import ( + "github.com/caos/zitadel/internal/model" + "time" +) + +type PasswordAgePolicyView struct { + AggregateID string + MaxAgeDays uint64 + ExpireWarnDays uint64 + Default bool + + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type PasswordAgePolicySearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn PasswordAgePolicySearchKey + Asc bool + Queries []*PasswordAgePolicySearchQuery +} + +type PasswordAgePolicySearchKey int32 + +const ( + PasswordAgePolicySearchKeyUnspecified PasswordAgePolicySearchKey = iota + PasswordAgePolicySearchKeyAggregateID +) + +type PasswordAgePolicySearchQuery struct { + Key PasswordAgePolicySearchKey + Method model.SearchMethod + Value interface{} +} + +type PasswordAgePolicySearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*PasswordAgePolicyView + Sequence uint64 + Timestamp time.Time +} diff --git a/internal/iam/model/password_complexity_policy.go b/internal/iam/model/password_complexity_policy.go new file mode 100644 index 0000000000..90ee73b4cc --- /dev/null +++ b/internal/iam/model/password_complexity_policy.go @@ -0,0 +1,32 @@ +package model + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "regexp" +) + +var ( + hasStringLowerCase = regexp.MustCompile(`[a-z]`).MatchString + hasStringUpperCase = regexp.MustCompile(`[A-Z]`).MatchString + hasNumber = regexp.MustCompile(`[0-9]`).MatchString + hasSymbol = regexp.MustCompile(`[^A-Za-z0-9]`).MatchString +) + +type PasswordComplexityPolicy struct { + models.ObjectRoot + + State PolicyState + MinLength uint64 + HasLowercase bool + HasUppercase bool + HasNumber bool + HasSymbol bool +} + +func (p *PasswordComplexityPolicy) IsValid() error { + if p.MinLength == 0 || p.MinLength > 72 { + return caos_errs.ThrowInvalidArgument(nil, "MODEL-Lsp0e", "Errors.User.PasswordComplexityPolicy.MinLengthNotAllowed") + } + return nil +} diff --git a/internal/iam/model/password_complexity_policy_view.go b/internal/iam/model/password_complexity_policy_view.go new file mode 100644 index 0000000000..e206d2238b --- /dev/null +++ b/internal/iam/model/password_complexity_policy_view.go @@ -0,0 +1,74 @@ +package model + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/model" + "time" +) + +type PasswordComplexityPolicyView struct { + AggregateID string + MinLength uint64 + HasLowercase bool + HasUppercase bool + HasNumber bool + HasSymbol bool + Default bool + + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type PasswordComplexityPolicySearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn PasswordComplexityPolicySearchKey + Asc bool + Queries []*PasswordComplexityPolicySearchQuery +} + +type PasswordComplexityPolicySearchKey int32 + +const ( + PasswordComplexityPolicySearchKeyUnspecified PasswordComplexityPolicySearchKey = iota + PasswordComplexityPolicySearchKeyAggregateID +) + +type PasswordComplexityPolicySearchQuery struct { + Key PasswordComplexityPolicySearchKey + Method model.SearchMethod + Value interface{} +} + +type PasswordComplexityPolicySearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*PasswordComplexityPolicyView + Sequence uint64 + Timestamp time.Time +} + +func (p *PasswordComplexityPolicyView) Check(password string) error { + if p.MinLength != 0 && uint64(len(password)) < p.MinLength { + return caos_errs.ThrowInvalidArgument(nil, "MODEL-HuJf6", "Errors.User.PasswordComplexityPolicy.MinLength") + } + + if p.HasLowercase && !hasStringLowerCase(password) { + return caos_errs.ThrowInvalidArgument(nil, "MODEL-co3Xw", "Errors.User.PasswordComplexityPolicy.HasLower") + } + + if p.HasUppercase && !hasStringUpperCase(password) { + return caos_errs.ThrowInvalidArgument(nil, "MODEL-VoaRj", "Errors.User.PasswordComplexityPolicy.HasUpper") + } + + if p.HasNumber && !hasNumber(password) { + return caos_errs.ThrowInvalidArgument(nil, "MODEL-ZBv4H", "Errors.User.PasswordComplexityPolicy.HasNumber") + } + + if p.HasSymbol && !hasSymbol(password) { + return caos_errs.ThrowInvalidArgument(nil, "MODEL-ZDLwA", "Errors.User.PasswordComplexityPolicy.HasSymbol") + } + return nil +} diff --git a/internal/policy/model/policy_complecity_test.go b/internal/iam/model/password_complexity_policy_view_test.go similarity index 85% rename from internal/policy/model/policy_complecity_test.go rename to internal/iam/model/password_complexity_policy_view_test.go index 4efea96d62..a614db0fb9 100644 --- a/internal/policy/model/policy_complecity_test.go +++ b/internal/iam/model/password_complexity_policy_view_test.go @@ -6,7 +6,7 @@ import ( func TestCheckPasswordComplexityPolicy(t *testing.T) { type args struct { - policy *PasswordComplexityPolicy + policy *PasswordComplexityPolicyView password string } tests := []struct { @@ -17,7 +17,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has minlength ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: false, HasSymbol: false, @@ -31,7 +31,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has minlength not ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: false, HasSymbol: false, @@ -45,7 +45,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has lowercase ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: true, HasUppercase: false, HasSymbol: false, @@ -59,7 +59,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has lowercase not ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: true, HasUppercase: false, HasSymbol: false, @@ -73,7 +73,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has uppercase ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: true, HasSymbol: false, @@ -87,7 +87,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has uppercase not ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: true, HasSymbol: false, @@ -101,7 +101,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has symbol ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: false, HasSymbol: true, @@ -115,7 +115,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has symbol not ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: false, HasSymbol: true, @@ -129,7 +129,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has number ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: false, HasSymbol: false, @@ -143,7 +143,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has number not ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: false, HasUppercase: false, HasSymbol: false, @@ -157,7 +157,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has everything ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: true, HasUppercase: true, HasSymbol: true, @@ -171,7 +171,7 @@ func TestCheckPasswordComplexityPolicy(t *testing.T) { { name: "has everything not ok", args: args{ - policy: &PasswordComplexityPolicy{ + policy: &PasswordComplexityPolicyView{ HasLowercase: true, HasUppercase: true, HasSymbol: true, diff --git a/internal/policy/model/policy_lockout.go b/internal/iam/model/password_lockout_policy.go similarity index 64% rename from internal/policy/model/policy_lockout.go rename to internal/iam/model/password_lockout_policy.go index b3e5b19881..7cee02a14e 100644 --- a/internal/policy/model/policy_lockout.go +++ b/internal/iam/model/password_lockout_policy.go @@ -1,11 +1,12 @@ package model -import "github.com/caos/zitadel/internal/eventstore/models" +import ( + "github.com/caos/zitadel/internal/eventstore/models" +) type PasswordLockoutPolicy struct { models.ObjectRoot - Description string State PolicyState MaxAttempts uint64 ShowLockOutFailures bool diff --git a/internal/iam/model/password_lockout_policy_view.go b/internal/iam/model/password_lockout_policy_view.go new file mode 100644 index 0000000000..cf32e9a6e3 --- /dev/null +++ b/internal/iam/model/password_lockout_policy_view.go @@ -0,0 +1,47 @@ +package model + +import ( + "github.com/caos/zitadel/internal/model" + "time" +) + +type PasswordLockoutPolicyView struct { + AggregateID string + MaxAttempts uint64 + ShowLockOutFailures bool + Default bool + + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type PasswordLockoutPolicySearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn PasswordLockoutPolicySearchKey + Asc bool + Queries []*PasswordLockoutPolicySearchQuery +} + +type PasswordLockoutPolicySearchKey int32 + +const ( + PasswordLockoutPolicySearchKeyUnspecified PasswordLockoutPolicySearchKey = iota + PasswordLockoutPolicySearchKeyAggregateID +) + +type PasswordLockoutPolicySearchQuery struct { + Key PasswordLockoutPolicySearchKey + Method model.SearchMethod + Value interface{} +} + +type PasswordLockoutPolicySearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*PasswordLockoutPolicyView + Sequence uint64 + Timestamp time.Time +} diff --git a/internal/iam/repository/eventsourcing/eventstore.go b/internal/iam/repository/eventsourcing/eventstore.go index 405ee87f42..d5236ad220 100644 --- a/internal/iam/repository/eventsourcing/eventstore.go +++ b/internal/iam/repository/eventsourcing/eventstore.go @@ -13,6 +13,7 @@ import ( iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" "github.com/caos/zitadel/internal/id" + "github.com/caos/zitadel/internal/tracing" ) type IAMEventstore struct { @@ -45,7 +46,10 @@ func StartIAM(conf IAMConfig, systemDefaults sd.SystemDefaults) (*IAMEventstore, }, nil } -func (es *IAMEventstore) IAMByID(ctx context.Context, id string) (*iam_model.IAM, error) { +func (es *IAMEventstore) IAMByID(ctx context.Context, id string) (_ *iam_model.IAM, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() + iam := es.iamCache.getIAM(id) query, err := IAMByIDQuery(iam.AggregateID, iam.Sequence) @@ -60,32 +64,37 @@ func (es *IAMEventstore) IAMByID(ctx context.Context, id string) (*iam_model.IAM return model.IAMToModel(iam), nil } -func (es *IAMEventstore) StartSetup(ctx context.Context, iamID string) (*iam_model.IAM, error) { +func (es *IAMEventstore) StartSetup(ctx context.Context, iamID string, step iam_model.Step) (*iam_model.IAM, error) { iam, err := es.IAMByID(ctx, iamID) if err != nil && !caos_errs.IsNotFound(err) { return nil, err } - if iam != nil && iam.SetUpStarted { + if iam != nil && (iam.SetUpStarted >= step || iam.SetUpStarted != iam.SetUpDone) { return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-9so34", "Setup already started") } - repoIam := &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: iamID}} - createAggregate := IAMSetupStartedAggregate(es.AggregateCreator(), repoIam) - err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, createAggregate) + repoIAM := &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: iamID}, SetUpStarted: model.Step(step)} + if iam != nil { + repoIAM.ObjectRoot = iam.ObjectRoot + } + createAggregate := IAMSetupStartedAggregate(es.AggregateCreator(), repoIAM) + err = es_sdk.Push(ctx, es.PushAggregates, repoIAM.AppendEvents, createAggregate) if err != nil { return nil, err } - es.iamCache.cacheIAM(repoIam) - return model.IAMToModel(repoIam), nil + es.iamCache.cacheIAM(repoIAM) + return model.IAMToModel(repoIAM), nil } -func (es *IAMEventstore) SetupDone(ctx context.Context, iamID string) (*iam_model.IAM, error) { +func (es *IAMEventstore) SetupDone(ctx context.Context, iamID string, step iam_model.Step) (*iam_model.IAM, error) { iam, err := es.IAMByID(ctx, iamID) if err != nil { return nil, err } + iam.SetUpDone = step + repoIam := model.IAMFromModel(iam) createAggregate := IAMSetupDoneAggregate(es.AggregateCreator(), repoIam) err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, createAggregate) @@ -97,6 +106,15 @@ func (es *IAMEventstore) SetupDone(ctx context.Context, iamID string) (*iam_mode return model.IAMToModel(repoIam), nil } +func (es *IAMEventstore) PrepareSetupDone(ctx context.Context, iam *model.IAM, aggregate *models.Aggregate, step iam_model.Step) (*model.IAM, *models.Aggregate, func(ctx context.Context, aggregates ...*models.Aggregate) error, error) { + iam.SetUpDone = model.Step(step) + agg, err := IAMSetupDoneEvent(ctx, aggregate, iam) + if err != nil { + return nil, nil, nil, err + } + return iam, agg, es.PushAggregates, nil +} + func (es *IAMEventstore) SetGlobalOrg(ctx context.Context, iamID, globalOrg string) (*iam_model.IAM, error) { iam, err := es.IAMByID(ctx, iamID) if err != nil { @@ -402,20 +420,93 @@ func (es *IAMEventstore) ChangeIDPOIDCConfig(ctx context.Context, config *iam_mo return nil, caos_errs.ThrowInternal(nil, "EVENT-Sldk8", "Errors.Internal") } -func (es *IAMEventstore) AddLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*iam_model.LoginPolicy, error) { +func (es *IAMEventstore) PrepareAddLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*model.IAM, *models.Aggregate, error) { + if policy == nil || policy.AggregateID == "" { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-VwlDv", "Errors.IAM.LabelPolicy.Empty") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, nil, err + } + + repoIam := model.IAMFromModel(iam) + labelPolicy := model.LabelPolicyFromModel(policy) + + addAggregate := LabelPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoIam, labelPolicy) + aggregate, err := addAggregate(ctx) + if err != nil { + return nil, nil, err + } + return repoIam, aggregate, nil +} + +func (es *IAMEventstore) AddLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { if policy == nil || !policy.IsValid() { - return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-Lso02", "Errors.IAM.LoginPolicyInvalid") + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-aAPWI", "Errors.IAM.LabelPolicyInvalid") } iam, err := es.IAMByID(ctx, policy.AggregateID) if err != nil { return nil, err } + repoIam := model.IAMFromModel(iam) + repoLabelPolicy := model.LabelPolicyFromModel(policy) + + addAggregate := LabelPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoLabelPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.LabelPolicyToModel(repoIam.DefaultLabelPolicy), nil +} + +func (es *IAMEventstore) ChangeLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + if policy == nil || !policy.IsValid() { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-vRqjg", "Errors.IAM.LabelPolicyInvalid") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, err + } + + repoIam := model.IAMFromModel(iam) + repoLabelPolicy := model.LabelPolicyFromModel(policy) + + addAggregate := LabelPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoLabelPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.LabelPolicyToModel(repoIam.DefaultLabelPolicy), nil +} + +func (es *IAMEventstore) PrepareAddLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*model.IAM, *models.Aggregate, error) { + if policy == nil || !policy.IsValid() { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-Lso02", "Errors.IAM.LoginPolicyInvalid") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, nil, err + } + repoIam := model.IAMFromModel(iam) repoLoginPolicy := model.LoginPolicyFromModel(policy) - addAggregate := LoginPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoLoginPolicy) - err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + addAggregate, err := LoginPolicyAddedAggregate(ctx, es.Eventstore.AggregateCreator(), repoIam, repoLoginPolicy) + if err != nil { + return nil, nil, err + } + return repoIam, addAggregate, nil +} + +func (es *IAMEventstore) AddLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*iam_model.LoginPolicy, error) { + repoIam, addAggregate, err := es.PrepareAddLoginPolicy(ctx, policy) + if err != nil { + return nil, err + } + err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) if err != nil { return nil, err } @@ -501,3 +592,232 @@ func (es *IAMEventstore) RemoveIDPProviderFromLoginPolicy(ctx context.Context, p es.iamCache.cacheIAM(repoIam) return nil } + +func (es *IAMEventstore) PrepareAddPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*model.IAM, *models.Aggregate, error) { + if policy == nil { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-Lso02", "Errors.IAM.PasswordComplexityPolicy.Empty") + } + if err := policy.IsValid(); err != nil { + return nil, nil, err + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, nil, err + } + + repoIam := model.IAMFromModel(iam) + repoPasswordComplexityPolicy := model.PasswordComplexityPolicyFromModel(policy) + + addAggregate, err := PasswordComplexityPolicyAddedAggregate(ctx, es.Eventstore.AggregateCreator(), repoIam, repoPasswordComplexityPolicy) + if err != nil { + return nil, nil, err + } + return repoIam, addAggregate, nil +} + +func (es *IAMEventstore) AddPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + repoIam, addAggregate, err := es.PrepareAddPasswordComplexityPolicy(ctx, policy) + if err != nil { + return nil, err + } + err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.PasswordComplexityPolicyToModel(repoIam.DefaultPasswordComplexityPolicy), nil +} + +func (es *IAMEventstore) ChangePasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + if policy == nil { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-Lso02", "Errors.IAM.PasswordComplexityPolicy.Empty") + } + if err := policy.IsValid(); err != nil { + return nil, err + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, err + } + + repoIam := model.IAMFromModel(iam) + repoPasswordComplexityPolicy := model.PasswordComplexityPolicyFromModel(policy) + + addAggregate := PasswordComplexityPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoPasswordComplexityPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.PasswordComplexityPolicyToModel(repoIam.DefaultPasswordComplexityPolicy), nil +} + +func (es *IAMEventstore) PrepareAddPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*model.IAM, *models.Aggregate, error) { + if policy == nil || policy.AggregateID == "" { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-2dGt6", "Errors.IAM.PasswordAgePolicy.Empty") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, nil, err + } + + repoIam := model.IAMFromModel(iam) + repoPasswordAgePolicy := model.PasswordAgePolicyFromModel(policy) + + addAggregate, err := PasswordAgePolicyAddedAggregate(ctx, es.Eventstore.AggregateCreator(), repoIam, repoPasswordAgePolicy) + if err != nil { + return nil, nil, err + } + return repoIam, addAggregate, nil +} + +func (es *IAMEventstore) AddPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + repoIam, addAggregate, err := es.PrepareAddPasswordAgePolicy(ctx, policy) + if err != nil { + return nil, err + } + err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.PasswordAgePolicyToModel(repoIam.DefaultPasswordAgePolicy), nil +} + +func (es *IAMEventstore) ChangePasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + if policy == nil || policy.AggregateID == "" { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-2Fgt6", "Errors.IAM.PasswordAgePolicy.Empty") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, err + } + + repoIam := model.IAMFromModel(iam) + repoPasswordAgePolicy := model.PasswordAgePolicyFromModel(policy) + + addAggregate := PasswordAgePolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoPasswordAgePolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.PasswordAgePolicyToModel(repoIam.DefaultPasswordAgePolicy), nil +} + +func (es *IAMEventstore) PrepareAddPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*model.IAM, *models.Aggregate, error) { + if policy == nil || policy.AggregateID == "" { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-3R56z", "Errors.IAM.PasswordLockoutPolicy.Empty") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, nil, err + } + + repoIam := model.IAMFromModel(iam) + repoPasswordLockoutPolicy := model.PasswordLockoutPolicyFromModel(policy) + + addAggregate, err := PasswordLockoutPolicyAddedAggregate(ctx, es.Eventstore.AggregateCreator(), repoIam, repoPasswordLockoutPolicy) + if err != nil { + return nil, nil, err + } + return repoIam, addAggregate, nil +} + +func (es *IAMEventstore) AddPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + repoIam, addAggregate, err := es.PrepareAddPasswordLockoutPolicy(ctx, policy) + if err != nil { + return nil, err + } + err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.PasswordLockoutPolicyToModel(repoIam.DefaultPasswordLockoutPolicy), nil +} + +func (es *IAMEventstore) ChangePasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + if policy == nil || policy.AggregateID == "" { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-6Zsj9", "Errors.IAM.PasswordLockoutPolicy.Empty") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, err + } + + repoIam := model.IAMFromModel(iam) + repoPasswordLockoutPolicy := model.PasswordLockoutPolicyFromModel(policy) + + addAggregate := PasswordLockoutPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoPasswordLockoutPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.PasswordLockoutPolicyToModel(repoIam.DefaultPasswordLockoutPolicy), nil +} + +func (es *IAMEventstore) GetOrgIAMPolicy(ctx context.Context, iamID string) (*iam_model.OrgIAMPolicy, error) { + existingIAM, err := es.IAMByID(ctx, iamID) + if err != nil { + return nil, err + } + if existingIAM.DefaultOrgIAMPolicy == nil { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-2Fj8s", "Errors.IAM.OrgIAM.NotExisting") + } + return existingIAM.DefaultOrgIAMPolicy, nil +} + +func (es *IAMEventstore) PrepareAddOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*model.IAM, *models.Aggregate, error) { + if policy == nil || policy.AggregateID == "" { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-3R56z", "Errors.IAM.OrgIAMPolicy.Empty") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, nil, err + } + + repoIam := model.IAMFromModel(iam) + repoOrgIAMPolicy := model.OrgIAMPolicyFromModel(policy) + + addAggregate, err := OrgIAMPolicyAddedAggregate(ctx, es.Eventstore.AggregateCreator(), repoIam, repoOrgIAMPolicy) + if err != nil { + return nil, nil, err + } + return repoIam, addAggregate, nil +} + +func (es *IAMEventstore) AddOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { + repoIam, addAggregate, err := es.PrepareAddOrgIAMPolicy(ctx, policy) + if err != nil { + return nil, err + } + err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.OrgIAMPolicyToModel(repoIam.DefaultOrgIAMPolicy), nil +} + +func (es *IAMEventstore) ChangeOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { + if policy == nil || policy.AggregateID == "" { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-6Zsj9", "Errors.IAM.OrgIAMPolicy.Empty") + } + iam, err := es.IAMByID(ctx, policy.AggregateID) + if err != nil { + return nil, err + } + + repoIam := model.IAMFromModel(iam) + repoOrgIAMPolicy := model.OrgIAMPolicyFromModel(policy) + + addAggregate := OrgIAMPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoOrgIAMPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.OrgIAMPolicyToModel(repoIam.DefaultOrgIAMPolicy), nil +} diff --git a/internal/iam/repository/eventsourcing/eventstore_mock_test.go b/internal/iam/repository/eventsourcing/eventstore_mock_test.go index 021a37ded7..f022d5b65d 100644 --- a/internal/iam/repository/eventsourcing/eventstore_mock_test.go +++ b/internal/iam/repository/eventsourcing/eventstore_mock_test.go @@ -2,6 +2,7 @@ package eventsourcing import ( "encoding/json" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/id" @@ -39,11 +40,11 @@ func GetSonyFlacke() id.Generator { return id.SonyFlakeGenerator } -func GetMockIamByIDOK(ctrl *gomock.Controller) *IAMEventstore { +func GetMockIAMByIDOK(ctrl *gomock.Controller) *IAMEventstore { data, _ := json.Marshal(model.IAM{GlobalOrgID: "GlobalOrgID"}) events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.GlobalOrgSet, Data: data}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.GlobalOrgSet, Data: data}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -57,9 +58,9 @@ func GetMockIamByIDNoEvents(ctrl *gomock.Controller) *IAMEventstore { return GetMockedEventstore(ctrl, mockEs) } -func GetMockManipulateIam(ctrl *gomock.Controller) *IAMEventstore { +func GetMockManipulateIAM(ctrl *gomock.Controller) *IAMEventstore { events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -68,9 +69,9 @@ func GetMockManipulateIam(ctrl *gomock.Controller) *IAMEventstore { return GetMockedEventstore(ctrl, mockEs) } -func GetMockManipulateIamWithCrypto(ctrl *gomock.Controller) *IAMEventstore { +func GetMockManipulateIAMWithCrypto(ctrl *gomock.Controller) *IAMEventstore { events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -79,11 +80,11 @@ func GetMockManipulateIamWithCrypto(ctrl *gomock.Controller) *IAMEventstore { return GetMockedEventstoreWithCrypto(ctrl, mockEs) } -func GetMockManipulateIamWithMember(ctrl *gomock.Controller) *IAMEventstore { +func GetMockManipulateIAMWithMember(ctrl *gomock.Controller) *IAMEventstore { memberData, _ := json.Marshal(model.IAMMember{UserID: "UserID", Roles: []string{"Role"}}) events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMMemberAdded, Data: memberData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMMemberAdded, Data: memberData}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -92,13 +93,13 @@ func GetMockManipulateIamWithMember(ctrl *gomock.Controller) *IAMEventstore { return GetMockedEventstore(ctrl, mockEs) } -func GetMockManipulateIamWithOIDCIdp(ctrl *gomock.Controller) *IAMEventstore { +func GetMockManipulateIAMWithOIDCIdp(ctrl *gomock.Controller) *IAMEventstore { idpData, _ := json.Marshal(model.IDPConfig{IDPConfigID: "IDPConfigID", Name: "Name"}) oidcData, _ := json.Marshal(model.OIDCIDPConfig{IDPConfigID: "IDPConfigID", ClientID: "ClientID"}) events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IDPConfigAdded, Data: idpData}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OIDCIDPConfigAdded, Data: oidcData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IDPConfigAdded, Data: idpData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.OIDCIDPConfigAdded, Data: oidcData}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -107,13 +108,13 @@ func GetMockManipulateIamWithOIDCIdp(ctrl *gomock.Controller) *IAMEventstore { return GetMockedEventstore(ctrl, mockEs) } -func GetMockManipulateIamWithLoginPolicy(ctrl *gomock.Controller) *IAMEventstore { +func GetMockManipulateIAMWithLoginPolicy(ctrl *gomock.Controller) *IAMEventstore { policyData, _ := json.Marshal(model.LoginPolicy{AllowRegister: true, AllowUsernamePassword: true, AllowExternalIdp: true}) idpProviderData, _ := json.Marshal(model.IDPProvider{IDPConfigID: "IDPConfigID", Type: 1}) events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyAdded, Data: policyData}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyIDPProviderAdded, Data: idpProviderData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyAdded, Data: policyData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyIDPProviderAdded, Data: idpProviderData}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -122,7 +123,59 @@ func GetMockManipulateIamWithLoginPolicy(ctrl *gomock.Controller) *IAMEventstore return GetMockedEventstore(ctrl, mockEs) } -func GetMockManipulateIamNotExisting(ctrl *gomock.Controller) *IAMEventstore { +func GetMockManipulateIAMWithPasswodComplexityPolicy(ctrl *gomock.Controller) *IAMEventstore { + policyData, _ := json.Marshal(model.PasswordComplexityPolicy{MinLength: 10}) + events := []*es_models.Event{ + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordComplexityPolicyAdded, Data: policyData}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockManipulateIAMWithPasswordAgePolicy(ctrl *gomock.Controller) *IAMEventstore { + policyData, _ := json.Marshal(model.PasswordAgePolicy{MaxAgeDays: 10, ExpireWarnDays: 10}) + events := []*es_models.Event{ + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordAgePolicyAdded, Data: policyData}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockManipulateIAMWithPasswordLockoutPolicy(ctrl *gomock.Controller) *IAMEventstore { + policyData, _ := json.Marshal(model.PasswordLockoutPolicy{MaxAttempts: 10, ShowLockOutFailures: true}) + events := []*es_models.Event{ + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordLockoutPolicyAdded, Data: policyData}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockManipulateIAMWithOrgIAMPolicy(ctrl *gomock.Controller) *IAMEventstore { + policyData, _ := json.Marshal(model.OrgIAMPolicy{UserLoginMustBeDomain: true}) + events := []*es_models.Event{ + {AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.OrgIAMPolicyAdded, Data: policyData}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockManipulateIAMNotExisting(ctrl *gomock.Controller) *IAMEventstore { events := []*es_models.Event{} mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -130,3 +183,16 @@ func GetMockManipulateIamNotExisting(ctrl *gomock.Controller) *IAMEventstore { mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) return GetMockedEventstore(ctrl, mockEs) } + +func GetMockManipulateIAMWithLabelPolicy(ctrl *gomock.Controller) *IAMEventstore { + policyData, _ := json.Marshal(model.LabelPolicy{PrimaryColor: "000001", SecondaryColor: "FFFFF1"}) + events := []*es_models.Event{ + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.LabelPolicyAdded, Data: policyData}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} diff --git a/internal/iam/repository/eventsourcing/eventstore_test.go b/internal/iam/repository/eventsourcing/eventstore_test.go index 55310e225e..7ccb53127e 100644 --- a/internal/iam/repository/eventsourcing/eventstore_test.go +++ b/internal/iam/repository/eventsourcing/eventstore_test.go @@ -31,7 +31,7 @@ func TestIamByID(t *testing.T) { { name: "iam from events, ok", args: args{ - es: GetMockIamByIDOK(ctrl), + es: GetMockIAMByIDOK(ctrl), iam: &model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, }, res: res{ @@ -62,12 +62,15 @@ func TestIamByID(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.IAMByID(nil, tt.args.iam.AggregateID) - - if tt.res.errFunc == nil && result.AggregateID != tt.res.iam.AggregateID { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.iam.AggregateID, result.AggregateID) - } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { + if (tt.res.errFunc != nil && !tt.res.errFunc(err)) || (err != nil && tt.res.errFunc == nil) { t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.errFunc != nil && tt.res.errFunc(err) { + return + } + if result.AggregateID != tt.res.iam.AggregateID { + t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.iam.AggregateID, result.AggregateID) } }) } @@ -79,9 +82,10 @@ func TestSetUpStarted(t *testing.T) { es *IAMEventstore ctx context.Context iamID string + step iam_model.Step } type res struct { - iam *model.IAM + iam *iam_model.IAM errFunc func(err error) bool } tests := []struct { @@ -92,20 +96,22 @@ func TestSetUpStarted(t *testing.T) { { name: "setup started iam, ok", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", + step: iam_model.Step1, }, res: res{ - iam: &model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: true}, + iam: &iam_model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: iam_model.Step1}, }, }, { name: "setup already started", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", + step: iam_model.Step1, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -114,8 +120,9 @@ func TestSetUpStarted(t *testing.T) { { name: "setup iam no id", args: args{ - es: GetMockManipulateIam(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + step: iam_model.Step1, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -124,17 +131,20 @@ func TestSetUpStarted(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.StartSetup(tt.args.ctx, tt.args.iamID) - - if tt.res.errFunc == nil && result.AggregateID == "" { + result, err := tt.args.es.StartSetup(tt.args.ctx, tt.args.iamID, tt.args.step) + if (tt.res.errFunc != nil && !tt.res.errFunc(err)) || (err != nil && tt.res.errFunc == nil) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.errFunc != nil && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if tt.res.errFunc == nil && result.SetUpStarted != tt.res.iam.SetUpStarted { + if result.SetUpStarted != tt.res.iam.SetUpStarted { t.Errorf("got wrong result setupStarted: expected: %v, actual: %v ", tt.res.iam.SetUpStarted, result.SetUpStarted) } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -145,9 +155,10 @@ func TestSetUpDone(t *testing.T) { es *IAMEventstore ctx context.Context iamID string + step iam_model.Step } type res struct { - iam *model.IAM + iam *iam_model.IAM errFunc func(err error) bool } tests := []struct { @@ -158,19 +169,21 @@ func TestSetUpDone(t *testing.T) { { name: "setup done iam, ok", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", + step: iam_model.Step1, }, res: res{ - iam: &model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: true, SetUpDone: true}, + iam: &iam_model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: iam_model.Step1, SetUpDone: iam_model.Step1}, }, }, { name: "setup iam no id", args: args{ - es: GetMockManipulateIam(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + step: iam_model.Step1, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -179,9 +192,10 @@ func TestSetUpDone(t *testing.T) { { name: "iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", + step: iam_model.Step1, }, res: res{ errFunc: caos_errs.IsNotFound, @@ -190,17 +204,20 @@ func TestSetUpDone(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.SetupDone(tt.args.ctx, tt.args.iamID) - - if tt.res.errFunc == nil && result.AggregateID == "" { + result, err := tt.args.es.SetupDone(tt.args.ctx, tt.args.iamID, tt.args.step) + if (tt.res.errFunc != nil && !tt.res.errFunc(err)) || (err != nil && tt.res.errFunc == nil) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.errFunc != nil && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if tt.res.errFunc == nil && result.SetUpDone != tt.res.iam.SetUpDone { + if result.SetUpDone != tt.res.iam.SetUpDone { t.Errorf("got wrong result SetUpDone: expected: %v, actual: %v ", tt.res.iam.SetUpDone, result.SetUpDone) } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -225,19 +242,19 @@ func TestSetGlobalOrg(t *testing.T) { { name: "global org set, ok", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", globalOrg: "globalOrg", }, res: res{ - iam: &model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: true, GlobalOrgID: "globalOrg"}, + iam: &model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: model.Step1, GlobalOrgID: "globalOrg"}, }, }, { name: "no iam id", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), globalOrg: "", }, @@ -248,7 +265,7 @@ func TestSetGlobalOrg(t *testing.T) { { name: "no global org", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", }, @@ -259,7 +276,7 @@ func TestSetGlobalOrg(t *testing.T) { { name: "iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", globalOrg: "globalOrg", @@ -272,16 +289,19 @@ func TestSetGlobalOrg(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.SetGlobalOrg(tt.args.ctx, tt.args.iamID, tt.args.globalOrg) - - if tt.res.errFunc == nil && result.AggregateID == "" { + if (tt.res.errFunc != nil && !tt.res.errFunc(err)) || (err != nil && tt.res.errFunc == nil) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.errFunc != nil && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if tt.res.errFunc == nil && result.GlobalOrgID != tt.res.iam.GlobalOrgID { + if result.GlobalOrgID != tt.res.iam.GlobalOrgID { t.Errorf("got wrong result GlobalOrgID: expected: %v, actual: %v ", tt.res.iam.GlobalOrgID, result.GlobalOrgID) } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -306,19 +326,19 @@ func TestSetIamProjectID(t *testing.T) { { name: "iam project set, ok", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", iamProjectID: "iamProjectID", }, res: res{ - iam: &model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: true, IAMProjectID: "iamProjectID"}, + iam: &model.IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "iamID", Sequence: 1}, SetUpStarted: model.Step1, IAMProjectID: "iamProjectID"}, }, }, { name: "no iam id", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamProjectID: "", }, @@ -329,7 +349,7 @@ func TestSetIamProjectID(t *testing.T) { { name: "no global org", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", }, @@ -340,7 +360,7 @@ func TestSetIamProjectID(t *testing.T) { { name: "iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), iamID: "iamID", iamProjectID: "iamProjectID", @@ -353,16 +373,19 @@ func TestSetIamProjectID(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.SetIAMProject(tt.args.ctx, tt.args.iamID, tt.args.iamProjectID) - - if tt.res.errFunc == nil && result.AggregateID == "" { + if (tt.res.errFunc != nil && !tt.res.errFunc(err)) || (err != nil && tt.res.errFunc == nil) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.errFunc != nil && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if tt.res.errFunc == nil && result.IAMProjectID != tt.res.iam.IAMProjectID { + if result.IAMProjectID != tt.res.iam.IAMProjectID { t.Errorf("got wrong result IAMProjectID: expected: %v, actual: %v ", tt.res.iam.IAMProjectID, result.IAMProjectID) } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -386,7 +409,7 @@ func TestAddIamMember(t *testing.T) { { name: "add iam member, ok", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID", Roles: []string{"Roles"}}, }, @@ -397,7 +420,7 @@ func TestAddIamMember(t *testing.T) { { name: "no userid", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Roles: []string{"Roles"}}, }, @@ -408,7 +431,7 @@ func TestAddIamMember(t *testing.T) { { name: "no roles", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID"}, }, @@ -419,7 +442,7 @@ func TestAddIamMember(t *testing.T) { { name: "member already existing", args: args{ - es: GetMockManipulateIamWithMember(ctrl), + es: GetMockManipulateIAMWithMember(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID", Roles: []string{"Roles"}}, }, @@ -430,7 +453,7 @@ func TestAddIamMember(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID", Roles: []string{"Roles"}}, }, @@ -442,19 +465,22 @@ func TestAddIamMember(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.AddIAMMember(tt.args.ctx, tt.args.member) - - if tt.res.errFunc == nil && result.AggregateID == "" { + if (tt.res.errFunc != nil && !tt.res.errFunc(err)) || (err != nil && tt.res.errFunc == nil) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.errFunc != nil && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if tt.res.errFunc == nil && result.UserID != tt.res.result.UserID { + if result.UserID != tt.res.result.UserID { t.Errorf("got wrong result userid: expected: %v, actual: %v ", tt.res.result.UserID, result.UserID) } - if tt.res.errFunc == nil && len(result.Roles) != len(tt.res.result.Roles) { + if len(result.Roles) != len(tt.res.result.Roles) { t.Errorf("got wrong result roles: expected: %v, actual: %v ", tt.res.result.Roles, result.Roles) } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -478,7 +504,7 @@ func TestChangeIamMember(t *testing.T) { { name: "add iam member, ok", args: args{ - es: GetMockManipulateIamWithMember(ctrl), + es: GetMockManipulateIAMWithMember(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID", Roles: []string{"ChangeRoles"}}, }, @@ -489,7 +515,7 @@ func TestChangeIamMember(t *testing.T) { { name: "no userid", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Roles: []string{"ChangeRoles"}}, }, @@ -500,7 +526,7 @@ func TestChangeIamMember(t *testing.T) { { name: "no roles", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID"}, }, @@ -511,7 +537,7 @@ func TestChangeIamMember(t *testing.T) { { name: "member not existing", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID", Roles: []string{"Roles"}}, }, @@ -522,7 +548,7 @@ func TestChangeIamMember(t *testing.T) { { name: "existing not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID", Roles: []string{"ChangeRoles"}}, }, @@ -534,19 +560,22 @@ func TestChangeIamMember(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ChangeIAMMember(tt.args.ctx, tt.args.member) - - if tt.res.errFunc == nil && result.AggregateID == "" { + if (tt.res.errFunc != nil && !tt.res.errFunc(err)) || (err != nil && tt.res.errFunc == nil) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.errFunc != nil && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if tt.res.errFunc == nil && result.UserID != tt.res.result.UserID { + if result.UserID != tt.res.result.UserID { t.Errorf("got wrong result userid: expected: %v, actual: %v ", tt.res.result.UserID, result.UserID) } - if tt.res.errFunc == nil && len(result.Roles) != len(tt.res.result.Roles) { + if len(result.Roles) != len(tt.res.result.Roles) { t.Errorf("got wrong result roles: expected: %v, actual: %v ", tt.res.result.Roles, result.Roles) } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -571,7 +600,7 @@ func TestRemoveIamMember(t *testing.T) { { name: "remove iam member, ok", args: args{ - es: GetMockManipulateIamWithMember(ctrl), + es: GetMockManipulateIAMWithMember(ctrl), ctx: authz.NewMockContext("orgID", "userID"), existingIAM: &model.IAM{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, @@ -586,7 +615,7 @@ func TestRemoveIamMember(t *testing.T) { { name: "no userid", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), existingIAM: &model.IAM{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, @@ -601,7 +630,7 @@ func TestRemoveIamMember(t *testing.T) { { name: "member not existing", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), existingIAM: &model.IAM{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, @@ -615,7 +644,7 @@ func TestRemoveIamMember(t *testing.T) { { name: "existing not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), member: &iam_model.IAMMember{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, UserID: "UserID", Roles: []string{"ChangeRoles"}}, }, @@ -658,7 +687,7 @@ func TestAddIdpConfiguration(t *testing.T) { { name: "add idp, ok", args: args{ - es: GetMockManipulateIamWithCrypto(ctrl), + es: GetMockManipulateIAMWithCrypto(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -687,7 +716,7 @@ func TestAddIdpConfiguration(t *testing.T) { { name: "invalid idp config", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, }, @@ -699,7 +728,7 @@ func TestAddIdpConfiguration(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -721,25 +750,28 @@ func TestAddIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.AddIDPConfig(tt.args.ctx, tt.args.idp) - - if !tt.res.wantErr && result.IDPConfigID == "" { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.IDPConfigID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.OIDCConfig.IDPConfigID == "" { + if result.OIDCConfig.IDPConfigID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.OIDCConfig == nil && result.OIDCConfig.ClientSecret == nil { + if result.OIDCConfig == nil && result.OIDCConfig.ClientSecret == nil { t.Errorf("result has no client secret") } - if !tt.res.wantErr && result.Name != tt.res.result.Name { + if result.Name != tt.res.result.Name { t.Errorf("got wrong result key: expected: %v, actual: %v ", tt.res.result.Name, result.Name) } - if !tt.res.wantErr && result.OIDCConfig.ClientID != tt.res.result.OIDCConfig.ClientID { + if result.OIDCConfig.ClientID != tt.res.result.OIDCConfig.ClientID { t.Errorf("got wrong result key: expected: %v, actual: %v ", tt.res.result.OIDCConfig.ClientID, result.OIDCConfig.ClientID) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -764,7 +796,7 @@ func TestChangeIdpConfiguration(t *testing.T) { { name: "change idp, ok", args: args{ - es: GetMockManipulateIamWithOIDCIdp(ctrl), + es: GetMockManipulateIAMWithOIDCIdp(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -784,7 +816,7 @@ func TestChangeIdpConfiguration(t *testing.T) { { name: "invalid idp", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -798,7 +830,7 @@ func TestChangeIdpConfiguration(t *testing.T) { { name: "idp not existing", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -816,7 +848,7 @@ func TestChangeIdpConfiguration(t *testing.T) { { name: "existing project not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -835,19 +867,22 @@ func TestChangeIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ChangeIDPConfig(tt.args.ctx, tt.args.idp) - + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } if !tt.res.wantErr && result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result AppID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.Name != tt.res.result.Name { + if result.Name != tt.res.result.Name { t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.result.Name, result.Name) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -871,7 +906,7 @@ func TestRemoveIdpConfiguration(t *testing.T) { { name: "remove idp, ok", args: args{ - es: GetMockManipulateIamWithOIDCIdp(ctrl), + es: GetMockManipulateIAMWithOIDCIdp(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -881,7 +916,7 @@ func TestRemoveIdpConfiguration(t *testing.T) { { name: "no IDPConfigID", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, }, @@ -893,7 +928,7 @@ func TestRemoveIdpConfiguration(t *testing.T) { { name: "idp not existing", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -907,7 +942,7 @@ func TestRemoveIdpConfiguration(t *testing.T) { { name: "existing idp not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -952,7 +987,7 @@ func TestDeactivateIdpConfiguration(t *testing.T) { { name: "deactivate, ok", args: args{ - es: GetMockManipulateIamWithOIDCIdp(ctrl), + es: GetMockManipulateIAMWithOIDCIdp(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -973,7 +1008,7 @@ func TestDeactivateIdpConfiguration(t *testing.T) { { name: "no idp id", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, }, @@ -985,7 +1020,7 @@ func TestDeactivateIdpConfiguration(t *testing.T) { { name: "idp not existing", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -1003,7 +1038,7 @@ func TestDeactivateIdpConfiguration(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -1022,19 +1057,22 @@ func TestDeactivateIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.DeactivateIDPConfig(tt.args.ctx, tt.args.idp.AggregateID, tt.args.idp.IDPConfigID) - + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } if !tt.res.wantErr && result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result IDPConfigID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.State != tt.res.result.State { + if result.State != tt.res.result.State { t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.res.result.State, result.State) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -1059,7 +1097,7 @@ func TestReactivateIdpConfiguration(t *testing.T) { { name: "reactivate, ok", args: args{ - es: GetMockManipulateIamWithOIDCIdp(ctrl), + es: GetMockManipulateIAMWithOIDCIdp(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -1080,7 +1118,7 @@ func TestReactivateIdpConfiguration(t *testing.T) { { name: "no idp id", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, }, @@ -1092,7 +1130,7 @@ func TestReactivateIdpConfiguration(t *testing.T) { { name: "idp not existing", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -1110,7 +1148,7 @@ func TestReactivateIdpConfiguration(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), idp: &iam_model.IDPConfig{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, IDPConfigID: "IDPConfigID", @@ -1129,19 +1167,22 @@ func TestReactivateIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ReactivateIDPConfig(tt.args.ctx, tt.args.idp.AggregateID, tt.args.idp.IDPConfigID) - + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } if !tt.res.wantErr && result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result IDPConfigID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.State != tt.res.result.State { + if result.State != tt.res.result.State { t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.res.result.State, result.State) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -1166,7 +1207,7 @@ func TestChangeOIDCIDPConfig(t *testing.T) { { name: "change oidc config, ok", args: args{ - es: GetMockManipulateIamWithOIDCIdp(ctrl), + es: GetMockManipulateIAMWithOIDCIdp(ctrl), ctx: authz.NewMockContext("orgID", "userID"), config: &iam_model.OIDCIDPConfig{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1187,7 +1228,7 @@ func TestChangeOIDCIDPConfig(t *testing.T) { { name: "invalid config", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), config: &iam_model.OIDCIDPConfig{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1202,7 +1243,7 @@ func TestChangeOIDCIDPConfig(t *testing.T) { { name: "idp not existing", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), config: &iam_model.OIDCIDPConfig{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1220,7 +1261,7 @@ func TestChangeOIDCIDPConfig(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), config: &iam_model.OIDCIDPConfig{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1239,19 +1280,22 @@ func TestChangeOIDCIDPConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ChangeIDPOIDCConfig(tt.args.ctx, tt.args.config) - - if !tt.res.wantErr && result.AggregateID == "" { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result AppID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.ClientID != tt.res.result.ClientID { + if result.ClientID != tt.res.result.ClientID { t.Errorf("got wrong result responsetype: expected: %v, actual: %v ", tt.res.result.ClientID, result.ClientID) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -1276,7 +1320,7 @@ func TestAddLoginPolicy(t *testing.T) { { name: "add login policy, ok", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), policy: &iam_model.LoginPolicy{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1293,7 +1337,7 @@ func TestAddLoginPolicy(t *testing.T) { { name: "invalid policy", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), policy: &iam_model.LoginPolicy{ ObjectRoot: es_models.ObjectRoot{Sequence: 0}, @@ -1307,7 +1351,7 @@ func TestAddLoginPolicy(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), policy: &iam_model.LoginPolicy{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1322,12 +1366,15 @@ func TestAddLoginPolicy(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.AddLoginPolicy(tt.args.ctx, tt.args.policy) - - if !tt.res.wantErr && result.AllowRegister != tt.res.result.AllowRegister { - t.Errorf("got wrong result AllowRegister: expected: %v, actual: %v ", tt.res.result.AllowRegister, result.AllowRegister) - } - if tt.res.wantErr && !tt.res.errFunc(err) { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AllowRegister != tt.res.result.AllowRegister { + t.Errorf("got wrong result AllowRegister: expected: %v, actual: %v ", tt.res.result.AllowRegister, result.AllowRegister) } }) } @@ -1353,7 +1400,7 @@ func TestChangeLoginPolicy(t *testing.T) { { name: "add login policy, ok", args: args{ - es: GetMockManipulateIamWithLoginPolicy(ctrl), + es: GetMockManipulateIAMWithLoginPolicy(ctrl), ctx: authz.NewMockContext("orgID", "userID"), policy: &iam_model.LoginPolicy{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1374,7 +1421,7 @@ func TestChangeLoginPolicy(t *testing.T) { { name: "invalid policy", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), policy: &iam_model.LoginPolicy{ ObjectRoot: es_models.ObjectRoot{Sequence: 0}, @@ -1388,7 +1435,7 @@ func TestChangeLoginPolicy(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), policy: &iam_model.LoginPolicy{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1403,19 +1450,22 @@ func TestChangeLoginPolicy(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ChangeLoginPolicy(tt.args.ctx, tt.args.policy) - - if !tt.res.wantErr && result.AllowRegister != tt.res.result.AllowRegister { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AllowRegister != tt.res.result.AllowRegister { t.Errorf("got wrong result AllowRegister: expected: %v, actual: %v ", tt.res.result.AllowRegister, result.AllowRegister) } - if !tt.res.wantErr && result.AllowUsernamePassword != tt.res.result.AllowUsernamePassword { + if result.AllowUsernamePassword != tt.res.result.AllowUsernamePassword { t.Errorf("got wrong result AllowUsernamePassword: expected: %v, actual: %v ", tt.res.result.AllowUsernamePassword, result.AllowUsernamePassword) } - if !tt.res.wantErr && result.AllowExternalIdp != tt.res.result.AllowExternalIdp { + if result.AllowExternalIdp != tt.res.result.AllowExternalIdp { t.Errorf("got wrong result AllowExternalIDP: expected: %v, actual: %v ", tt.res.result.AllowExternalIdp, result.AllowExternalIdp) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -1440,7 +1490,7 @@ func TestAddIdpProviderToLoginPolicy(t *testing.T) { { name: "add idp to login policy, ok", args: args{ - es: GetMockManipulateIamWithLoginPolicy(ctrl), + es: GetMockManipulateIAMWithLoginPolicy(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1455,7 +1505,7 @@ func TestAddIdpProviderToLoginPolicy(t *testing.T) { { name: "add idp to login policy, already existing", args: args{ - es: GetMockManipulateIamWithLoginPolicy(ctrl), + es: GetMockManipulateIAMWithLoginPolicy(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1471,7 +1521,7 @@ func TestAddIdpProviderToLoginPolicy(t *testing.T) { { name: "invalid provider", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1485,7 +1535,7 @@ func TestAddIdpProviderToLoginPolicy(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1501,16 +1551,19 @@ func TestAddIdpProviderToLoginPolicy(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.AddIDPProviderToLoginPolicy(tt.args.ctx, tt.args.provider) - - if !tt.res.wantErr && result.IdpConfigID != tt.res.result.IdpConfigID { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.IdpConfigID != tt.res.result.IdpConfigID { t.Errorf("got wrong result IDPConfigID: expected: %v, actual: %v ", tt.res.result.IdpConfigID, result.IdpConfigID) } - if !tt.res.wantErr && result.Type != tt.res.result.Type { + if result.Type != tt.res.result.Type { t.Errorf("got wrong result Type: expected: %v, actual: %v ", tt.res.result.Type, result.Type) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -1534,7 +1587,7 @@ func TestRemoveIdpProviderFromLoginPolicy(t *testing.T) { { name: "remove idp to login policy, ok", args: args{ - es: GetMockManipulateIamWithLoginPolicy(ctrl), + es: GetMockManipulateIAMWithLoginPolicy(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1547,7 +1600,7 @@ func TestRemoveIdpProviderFromLoginPolicy(t *testing.T) { { name: "remove idp to login policy, not existing", args: args{ - es: GetMockManipulateIamWithLoginPolicy(ctrl), + es: GetMockManipulateIAMWithLoginPolicy(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1563,7 +1616,7 @@ func TestRemoveIdpProviderFromLoginPolicy(t *testing.T) { { name: "invalid provider", args: args{ - es: GetMockManipulateIam(ctrl), + es: GetMockManipulateIAM(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1577,7 +1630,7 @@ func TestRemoveIdpProviderFromLoginPolicy(t *testing.T) { { name: "existing iam not found", args: args{ - es: GetMockManipulateIamNotExisting(ctrl), + es: GetMockManipulateIAMNotExisting(ctrl), ctx: authz.NewMockContext("orgID", "userID"), provider: &iam_model.IDPProvider{ ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, @@ -1603,3 +1656,828 @@ func TestRemoveIdpProviderFromLoginPolicy(t *testing.T) { }) } } + +func TestAddLabelPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.LabelPolicy + } + type res struct { + result *iam_model.LabelPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add label policy, ok", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + }, + }, + res: res{ + result: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddLabelPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.PrimaryColor != tt.res.result.PrimaryColor { + t.Errorf("got wrong result PrimaryColor: expected: %v, actual: %v ", tt.res.result.PrimaryColor, result.PrimaryColor) + } + }) + } +} + +func TestChangeLabelPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.LabelPolicy + } + type res struct { + result *iam_model.LabelPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change label policy, ok", + args: args{ + es: GetMockManipulateIAMWithLabelPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + SecondaryColor: "FFFFFF", + }, + }, + res: res{ + result: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + SecondaryColor: "FFFFFF", + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangeLabelPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.PrimaryColor != tt.res.result.PrimaryColor { + t.Errorf("got wrong result PrimaryColor: expected: %v, actual: %v ", tt.res.result.PrimaryColor, result.PrimaryColor) + } + if result.SecondaryColor != tt.res.result.SecondaryColor { + t.Errorf("got wrong result SecondaryColor: expected: %v, actual: %v ", tt.res.result.SecondaryColor, result.SecondaryColor) + } + }) + } +} +func TestAddPasswordComplexityPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.PasswordComplexityPolicy + } + type res struct { + result *iam_model.PasswordComplexityPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password complexity policy, ok", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + }, + }, + res: res{ + result: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsErrorInvalidArgument, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddPasswordComplexityPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MinLength != tt.res.result.MinLength { + t.Errorf("got wrong result MinLength: expected: %v, actual: %v ", tt.res.result.MinLength, result.MinLength) + } + }) + } +} + +func TestChangePasswordComplexityPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.PasswordComplexityPolicy + } + type res struct { + result *iam_model.PasswordComplexityPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password complexity policy, ok", + args: args{ + es: GetMockManipulateIAMWithPasswodComplexityPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 5, + }, + }, + res: res{ + result: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 5, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsErrorInvalidArgument, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangePasswordComplexityPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MinLength != tt.res.result.MinLength { + t.Errorf("got wrong result MinLength: expected: %v, actual: %v ", tt.res.result.MinLength, result.MinLength) + } + }) + } +} + +func TestAddPasswordAgePolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.PasswordAgePolicy + } + type res struct { + result *iam_model.PasswordAgePolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password age policy, ok", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + ExpireWarnDays: 10, + }, + }, + res: res{ + result: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + ExpireWarnDays: 10, + }, + }, + }, + { + name: "empty policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: nil, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + ExpireWarnDays: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddPasswordAgePolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MaxAgeDays != tt.res.result.MaxAgeDays { + t.Errorf("got wrong result MaxAgeDays: expected: %v, actual: %v ", tt.res.result.MaxAgeDays, result.MaxAgeDays) + } + + if result.ExpireWarnDays != tt.res.result.ExpireWarnDays { + t.Errorf("got wrong result.ExpireWarnDays: expected: %v, actual: %v ", tt.res.result.ExpireWarnDays, result.ExpireWarnDays) + } + }) + } +} + +func TestChangePasswordAgePolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.PasswordAgePolicy + } + type res struct { + result *iam_model.PasswordAgePolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password age policy, ok", + args: args{ + es: GetMockManipulateIAMWithPasswordAgePolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 5, + }, + }, + res: res{ + result: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 5, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: nil, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangePasswordAgePolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MaxAgeDays != tt.res.result.MaxAgeDays { + t.Errorf("got wrong result MaxAgeDays: expected: %v, actual: %v ", tt.res.result.MaxAgeDays, result.MaxAgeDays) + } + + if result.ExpireWarnDays != tt.res.result.ExpireWarnDays { + t.Errorf("got wrong result.ExpireWarnDays: expected: %v, actual: %v ", tt.res.result.ExpireWarnDays, result.ExpireWarnDays) + } + }) + } +} + +func TestAddPasswordLockoutPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.PasswordLockoutPolicy + } + type res struct { + result *iam_model.PasswordLockoutPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password lockout policy, ok", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + ShowLockOutFailures: true, + }, + }, + res: res{ + result: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + ShowLockOutFailures: true, + }, + }, + }, + { + name: "empty policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: nil, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + ShowLockOutFailures: true, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddPasswordLockoutPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + + if result.MaxAttempts != tt.res.result.MaxAttempts { + t.Errorf("got wrong result MaxAttempts: expected: %v, actual: %v ", tt.res.result.MaxAttempts, result.MaxAttempts) + } + + if result.ShowLockOutFailures != tt.res.result.ShowLockOutFailures { + t.Errorf("got wrong result.ShowLockOutFailures: expected: %v, actual: %v ", tt.res.result.ShowLockOutFailures, result.ShowLockOutFailures) + } + }) + } +} + +func TestChangePasswordLockoutPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.PasswordLockoutPolicy + } + type res struct { + result *iam_model.PasswordLockoutPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password lockout policy, ok", + args: args{ + es: GetMockManipulateIAMWithPasswordLockoutPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 5, + }, + }, + res: res{ + result: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 5, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: nil, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangePasswordLockoutPolicy(tt.args.ctx, tt.args.policy) + + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MaxAttempts != tt.res.result.MaxAttempts { + t.Errorf("got wrong result MaxAttempts: expected: %v, actual: %v ", tt.res.result.MaxAttempts, result.MaxAttempts) + } + + if result.ShowLockOutFailures != tt.res.result.ShowLockOutFailures { + t.Errorf("got wrong result.ShowLockOutFailures: expected: %v, actual: %v ", tt.res.result.ShowLockOutFailures, result.ShowLockOutFailures) + } + }) + } +} + +func TestAddOrgIAMPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.OrgIAMPolicy + } + type res struct { + result *iam_model.OrgIAMPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add org iam policy, ok", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.OrgIAMPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + UserLoginMustBeDomain: true, + }, + }, + res: res{ + result: &iam_model.OrgIAMPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + UserLoginMustBeDomain: true, + }, + }, + }, + { + name: "empty policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: nil, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.OrgIAMPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + UserLoginMustBeDomain: true, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddOrgIAMPolicy(tt.args.ctx, tt.args.policy) + + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.UserLoginMustBeDomain != tt.res.result.UserLoginMustBeDomain { + t.Errorf("got wrong result UserLoginMustBeDomain: expected: %v, actual: %v ", tt.res.result.UserLoginMustBeDomain, result.UserLoginMustBeDomain) + } + }) + } +} + +func TestChangeOrgIAMPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.OrgIAMPolicy + } + type res struct { + result *iam_model.OrgIAMPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change org iam policy, ok", + args: args{ + es: GetMockManipulateIAMWithOrgIAMPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.OrgIAMPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + UserLoginMustBeDomain: false, + }, + }, + res: res{ + result: &iam_model.OrgIAMPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + UserLoginMustBeDomain: false, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: nil, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.OrgIAMPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + UserLoginMustBeDomain: true, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangeOrgIAMPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.UserLoginMustBeDomain != tt.res.result.UserLoginMustBeDomain { + t.Errorf("got wrong result UserLoginMustBeDomain: expected: %v, actual: %v ", tt.res.result.UserLoginMustBeDomain, result.UserLoginMustBeDomain) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/iam.go b/internal/iam/repository/eventsourcing/iam.go index 3e3a0c2064..9e5a892028 100644 --- a/internal/iam/repository/eventsourcing/iam.go +++ b/internal/iam/repository/eventsourcing/iam.go @@ -43,7 +43,7 @@ func IAMSetupStartedAggregate(aggCreator *es_models.AggregateCreator, iam *model if err != nil { return nil, err } - return agg.AppendEvent(model.IAMSetupStarted, nil) + return agg.AppendEvent(model.IAMSetupStarted, &struct{ Step model.Step }{Step: iam.SetUpStarted}) } } @@ -54,10 +54,14 @@ func IAMSetupDoneAggregate(aggCreator *es_models.AggregateCreator, iam *model.IA return nil, err } - return agg.AppendEvent(model.IAMSetupDone, nil) + return agg.AppendEvent(model.IAMSetupDone, &struct{ Step model.Step }{Step: iam.SetUpDone}) } } +func IAMSetupDoneEvent(ctx context.Context, agg *es_models.Aggregate, iam *model.IAM) (*es_models.Aggregate, error) { + return agg.AppendEvent(model.IAMSetupDone, &struct{ Step model.Step }{Step: iam.SetUpDone}) +} + func IAMSetGlobalOrgAggregate(aggCreator *es_models.AggregateCreator, iam *model.IAM, globalOrg string) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { if globalOrg == "" { @@ -228,11 +232,10 @@ func OIDCIDPConfigChangedAggregate(aggCreator *es_models.AggregateCreator, exist return agg.AppendEvent(model.OIDCIDPConfigChanged, changes) } } - -func LoginPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.LoginPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { +func LabelPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.LabelPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { if policy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Smla8", "Errors.Internal") + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-e248Y", "Errors.Internal") } agg, err := IAMAggregate(ctx, aggCreator, existing) if err != nil { @@ -240,15 +243,62 @@ func LoginPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing } validationQuery := es_models.NewSearchQuery(). AggregateTypeFilter(model.IAMAggregate). - EventTypesFilter(model.LoginPolicyAdded). + EventTypesFilter(model.LabelPolicyAdded). AggregateIDFilter(existing.AggregateID) - validation := checkExistingLoginPolicyValidation() + validation := checkExistingLabelPolicyValidation() agg.SetPrecondition(validationQuery, validation) - return agg.AppendEvent(model.LoginPolicyAdded, policy) + return agg.AppendEvent(model.LabelPolicyAdded, policy) } } +func checkExistingLabelPolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + for _, event := range events { + switch event.Type { + case model.LabelPolicyAdded: + return errors.ThrowPreconditionFailed(nil, "EVENT-KyLIK", "Errors.IAM.LabelPolicy.AlreadyExists") + } + } + return nil + } +} + +func LabelPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.LabelPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-uP6HQ", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + changes := existing.DefaultLabelPolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-hZE24", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.LabelPolicyChanged, changes) + } +} + +func LoginPolicyAddedAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.LoginPolicy) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Smla8", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + EventTypesFilter(model.LoginPolicyAdded). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingLoginPolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.LoginPolicyAdded, policy) +} + func LoginPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.LoginPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { if policy == nil { @@ -296,6 +346,146 @@ func LoginPolicyIDPProviderRemovedAggregate(ctx context.Context, aggCreator *es_ return agg.AppendEvent(model.LoginPolicyIDPProviderRemoved, provider) } +func PasswordComplexityPolicyAddedAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.PasswordComplexityPolicy) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Smla8", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + EventTypesFilter(model.PasswordComplexityPolicyAdded). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingPasswordComplexityPolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.PasswordComplexityPolicyAdded, policy) +} + +func PasswordComplexityPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.PasswordComplexityPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Mlco9", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + changes := existing.DefaultPasswordComplexityPolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Smk8d", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.PasswordComplexityPolicyChanged, changes) + } +} + +func PasswordAgePolicyAddedAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.PasswordAgePolicy) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-T7sui", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + EventTypesFilter(model.PasswordAgePolicyAdded). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingPasswordAgePolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.PasswordAgePolicyAdded, policy) +} + +func PasswordAgePolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.PasswordAgePolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-3Gs0o", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + changes := existing.DefaultPasswordAgePolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-3Wdos", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.PasswordAgePolicyChanged, changes) + } +} + +func PasswordLockoutPolicyAddedAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.PasswordLockoutPolicy) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-w5Tds", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + EventTypesFilter(model.PasswordLockoutPolicyAdded). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingPasswordLockoutPolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.PasswordLockoutPolicyAdded, policy) +} + +func PasswordLockoutPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.PasswordLockoutPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-2D0fs", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + changes := existing.DefaultPasswordLockoutPolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-7Hsk9", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.PasswordLockoutPolicyChanged, changes) + } +} + +func OrgIAMPolicyAddedAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.OrgIAMPolicy) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-w5Tds", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + EventTypesFilter(model.OrgIAMPolicyAdded). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingOrgIAMPolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.OrgIAMPolicyAdded, policy) +} + +func OrgIAMPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.OrgIAMPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-2D0fs", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + changes := existing.DefaultOrgIAMPolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-7Hsk9", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.OrgIAMPolicyChanged, changes) + } +} + func checkExistingLoginPolicyValidation() func(...*es_models.Event) error { return func(events ...*es_models.Event) error { for _, event := range events { @@ -308,6 +498,54 @@ func checkExistingLoginPolicyValidation() func(...*es_models.Event) error { } } +func checkExistingPasswordComplexityPolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + for _, event := range events { + switch event.Type { + case model.PasswordComplexityPolicyAdded: + return errors.ThrowPreconditionFailed(nil, "EVENT-Ski9d", "Errors.IAM.PasswordComplexityPolicy.AlreadyExists") + } + } + return nil + } +} + +func checkExistingPasswordAgePolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + for _, event := range events { + switch event.Type { + case model.PasswordAgePolicyAdded: + return errors.ThrowPreconditionFailed(nil, "EVENT-Ski9d", "Errors.IAM.PasswordAgePolicy.AlreadyExists") + } + } + return nil + } +} + +func checkExistingPasswordLockoutPolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + for _, event := range events { + switch event.Type { + case model.PasswordLockoutPolicyAdded: + return errors.ThrowPreconditionFailed(nil, "EVENT-Ski9d", "Errors.IAM.PasswordLockoutPolicy.AlreadyExists") + } + } + return nil + } +} + +func checkExistingOrgIAMPolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + for _, event := range events { + switch event.Type { + case model.OrgIAMPolicyAdded: + return errors.ThrowPreconditionFailed(nil, "EVENT-bSm8f", "Errors.IAM.OrgIAMPolicy.AlreadyExists") + } + } + return nil + } +} + func checkExistingLoginPolicyIDPProviderValidation(idpConfigID string) func(...*es_models.Event) error { return func(events ...*es_models.Event) error { idpConfigs := make([]*model.IDPConfig, 0) @@ -316,30 +554,44 @@ func checkExistingLoginPolicyIDPProviderValidation(idpConfigID string) func(...* switch event.Type { case model.IDPConfigAdded: config := new(model.IDPConfig) - config.SetData(event) + err := config.SetData(event) + if err != nil { + return err + } idpConfigs = append(idpConfigs, config) case model.IDPConfigRemoved: config := new(model.IDPConfig) - config.SetData(event) - for i, p := range idpConfigs { - if p.IDPConfigID == config.IDPConfigID { + err := config.SetData(event) + if err != nil { + return err + } + for i := len(idpConfigs) - 1; i >= 0; i-- { + if idpConfigs[i].IDPConfigID == config.IDPConfigID { idpConfigs[i] = idpConfigs[len(idpConfigs)-1] idpConfigs[len(idpConfigs)-1] = nil idpConfigs = idpConfigs[:len(idpConfigs)-1] + break } } case model.LoginPolicyIDPProviderAdded: idp := new(model.IDPProvider) - idp.SetData(event) + err := idp.SetData(event) + if err != nil { + return err + } idps = append(idps, idp) case model.LoginPolicyIDPProviderRemoved: idp := new(model.IDPProvider) - idp.SetData(event) - for i, p := range idps { - if p.IDPConfigID == idp.IDPConfigID { + err := idp.SetData(event) + if err != nil { + return err + } + for i := len(idps) - 1; i >= 0; i-- { + if idps[i].IDPConfigID == idp.IDPConfigID { idps[i] = idps[len(idps)-1] idps[len(idps)-1] = nil idps = idps[:len(idps)-1] + break } } } diff --git a/internal/iam/repository/eventsourcing/iam_test.go b/internal/iam/repository/eventsourcing/iam_test.go index 4f48f5edf0..bfdb0287b8 100644 --- a/internal/iam/repository/eventsourcing/iam_test.go +++ b/internal/iam/repository/eventsourcing/iam_test.go @@ -1158,7 +1158,7 @@ func TestLoginPolicyAddedAggregate(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - agg, err := LoginPolicyAddedAggregate(tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy)(tt.args.ctx) + agg, err := LoginPolicyAddedAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy) if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) @@ -1467,3 +1467,779 @@ func TestLoginPolicyIdpProviderRemovedAggregate(t *testing.T) { }) } } + +func TestPasswordComplexityPolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.PasswordComplexityPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password complexity policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID"}, + newPolicy: &model.PasswordComplexityPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MinLength: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordComplexityPolicyAdded}, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "complexity policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordComplexityPolicyAddedAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestPasswordComplexityPolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.PasswordComplexityPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password complexity policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultPasswordComplexityPolicy: &model.PasswordComplexityPolicy{ + MinLength: 10, + }}, + newPolicy: &model.PasswordComplexityPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MinLength: 5, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordComplexityPolicyChanged}, + }, + }, + { + name: "no changes", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultPasswordComplexityPolicy: &model.PasswordComplexityPolicy{ + MinLength: 10, + }}, + newPolicy: &model.PasswordComplexityPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MinLength: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "complexity policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordComplexityPolicyChangedAggregate(tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestPasswordAgePolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.PasswordAgePolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password age policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID"}, + newPolicy: &model.PasswordAgePolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAgeDays: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordAgePolicyAdded}, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "age policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordAgePolicyAddedAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestPasswordAgePolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.PasswordAgePolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password age policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultPasswordAgePolicy: &model.PasswordAgePolicy{ + MaxAgeDays: 10, + }}, + newPolicy: &model.PasswordAgePolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAgeDays: 5, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordAgePolicyChanged}, + }, + }, + { + name: "no changes", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultPasswordAgePolicy: &model.PasswordAgePolicy{ + MaxAgeDays: 10, + }}, + newPolicy: &model.PasswordAgePolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAgeDays: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "age policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordAgePolicyChangedAggregate(tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestPasswordLockoutPolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.PasswordLockoutPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password lockout policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID"}, + newPolicy: &model.PasswordLockoutPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAttempts: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordLockoutPolicyAdded}, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "lockout policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordLockoutPolicyAddedAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestPasswordLockoutPolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.PasswordLockoutPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password lockout policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultPasswordLockoutPolicy: &model.PasswordLockoutPolicy{ + MaxAttempts: 10, + }}, + newPolicy: &model.PasswordLockoutPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAttempts: 5, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordLockoutPolicyChanged}, + }, + }, + { + name: "no changes", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultPasswordLockoutPolicy: &model.PasswordLockoutPolicy{ + MaxAttempts: 10, + }}, + newPolicy: &model.PasswordLockoutPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAttempts: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "lockout policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordLockoutPolicyChangedAggregate(tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestOrgIAMPolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.OrgIAMPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add org iam policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID"}, + newPolicy: &model.OrgIAMPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + UserLoginMustBeDomain: true, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.OrgIAMPolicyAdded}, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "lockout policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := OrgIAMPolicyAddedAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestOrgIAMPolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existingIAM *model.IAM + newPolicy *model.OrgIAMPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change org iam policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultOrgIAMPolicy: &model.OrgIAMPolicy{ + UserLoginMustBeDomain: true, + }}, + newPolicy: &model.OrgIAMPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + UserLoginMustBeDomain: false, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.OrgIAMPolicyChanged}, + }, + }, + { + name: "no changes", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + IAMProjectID: "IAMProjectID", + DefaultOrgIAMPolicy: &model.OrgIAMPolicy{ + UserLoginMustBeDomain: true, + }}, + newPolicy: &model.OrgIAMPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + UserLoginMustBeDomain: true, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "org iam policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existingIAM: &model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, IAMProjectID: "IAMProjectID"}, + newPolicy: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := OrgIAMPolicyChangedAggregate(tt.args.aggCreator, tt.args.existingIAM, tt.args.newPolicy)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/model/iam.go b/internal/iam/repository/eventsourcing/model/iam.go index e4b0fb40cc..e86889c69d 100644 --- a/internal/iam/repository/eventsourcing/model/iam.go +++ b/internal/iam/repository/eventsourcing/model/iam.go @@ -2,6 +2,7 @@ package model import ( "encoding/json" + "github.com/caos/logging" caos_errs "github.com/caos/zitadel/internal/errors" es_models "github.com/caos/zitadel/internal/eventstore/models" @@ -12,15 +13,28 @@ const ( IAMVersion = "v1" ) +type Step int + +const ( + Step1 = Step(model.Step1) + Step2 = Step(model.Step2) + StepCount = Step(model.StepCount) +) + type IAM struct { es_models.ObjectRoot - SetUpStarted bool `json:"-"` - SetUpDone bool `json:"-"` - GlobalOrgID string `json:"globalOrgId,omitempty"` - IAMProjectID string `json:"iamProjectId,omitempty"` - Members []*IAMMember `json:"-"` - IDPs []*IDPConfig `json:"-"` - DefaultLoginPolicy *LoginPolicy `json:"-"` + SetUpStarted Step `json:"-"` + SetUpDone Step `json:"-"` + GlobalOrgID string `json:"globalOrgId,omitempty"` + IAMProjectID string `json:"iamProjectId,omitempty"` + Members []*IAMMember `json:"-"` + IDPs []*IDPConfig `json:"-"` + DefaultLoginPolicy *LoginPolicy `json:"-"` + DefaultLabelPolicy *LabelPolicy `json:"-"` + DefaultOrgIAMPolicy *OrgIAMPolicy `json:"-"` + DefaultPasswordComplexityPolicy *PasswordComplexityPolicy `json:"-"` + DefaultPasswordAgePolicy *PasswordAgePolicy `json:"-"` + DefaultPasswordLockoutPolicy *PasswordLockoutPolicy `json:"-"` } func IAMFromModel(iam *model.IAM) *IAM { @@ -28,8 +42,8 @@ func IAMFromModel(iam *model.IAM) *IAM { idps := IDPConfigsFromModel(iam.IDPs) converted := &IAM{ ObjectRoot: iam.ObjectRoot, - SetUpStarted: iam.SetUpStarted, - SetUpDone: iam.SetUpDone, + SetUpStarted: Step(iam.SetUpStarted), + SetUpDone: Step(iam.SetUpDone), GlobalOrgID: iam.GlobalOrgID, IAMProjectID: iam.IAMProjectID, Members: members, @@ -38,6 +52,21 @@ func IAMFromModel(iam *model.IAM) *IAM { if iam.DefaultLoginPolicy != nil { converted.DefaultLoginPolicy = LoginPolicyFromModel(iam.DefaultLoginPolicy) } + if iam.DefaultLabelPolicy != nil { + converted.DefaultLabelPolicy = LabelPolicyFromModel(iam.DefaultLabelPolicy) + } + if iam.DefaultPasswordComplexityPolicy != nil { + converted.DefaultPasswordComplexityPolicy = PasswordComplexityPolicyFromModel(iam.DefaultPasswordComplexityPolicy) + } + if iam.DefaultPasswordAgePolicy != nil { + converted.DefaultPasswordAgePolicy = PasswordAgePolicyFromModel(iam.DefaultPasswordAgePolicy) + } + if iam.DefaultPasswordLockoutPolicy != nil { + converted.DefaultPasswordLockoutPolicy = PasswordLockoutPolicyFromModel(iam.DefaultPasswordLockoutPolicy) + } + if iam.DefaultOrgIAMPolicy != nil { + converted.DefaultOrgIAMPolicy = OrgIAMPolicyFromModel(iam.DefaultOrgIAMPolicy) + } return converted } @@ -46,8 +75,8 @@ func IAMToModel(iam *IAM) *model.IAM { idps := IDPConfigsToModel(iam.IDPs) converted := &model.IAM{ ObjectRoot: iam.ObjectRoot, - SetUpStarted: iam.SetUpStarted, - SetUpDone: iam.SetUpDone, + SetUpStarted: model.Step(iam.SetUpStarted), + SetUpDone: model.Step(iam.SetUpDone), GlobalOrgID: iam.GlobalOrgID, IAMProjectID: iam.IAMProjectID, Members: members, @@ -56,6 +85,21 @@ func IAMToModel(iam *IAM) *model.IAM { if iam.DefaultLoginPolicy != nil { converted.DefaultLoginPolicy = LoginPolicyToModel(iam.DefaultLoginPolicy) } + if iam.DefaultLabelPolicy != nil { + converted.DefaultLabelPolicy = LabelPolicyToModel(iam.DefaultLabelPolicy) + } + if iam.DefaultPasswordComplexityPolicy != nil { + converted.DefaultPasswordComplexityPolicy = PasswordComplexityPolicyToModel(iam.DefaultPasswordComplexityPolicy) + } + if iam.DefaultPasswordAgePolicy != nil { + converted.DefaultPasswordAgePolicy = PasswordAgePolicyToModel(iam.DefaultPasswordAgePolicy) + } + if iam.DefaultPasswordLockoutPolicy != nil { + converted.DefaultPasswordLockoutPolicy = PasswordLockoutPolicyToModel(iam.DefaultPasswordLockoutPolicy) + } + if iam.DefaultOrgIAMPolicy != nil { + converted.DefaultOrgIAMPolicy = OrgIAMPolicyToModel(iam.DefaultOrgIAMPolicy) + } return converted } @@ -72,9 +116,27 @@ func (i *IAM) AppendEvent(event *es_models.Event) (err error) { i.ObjectRoot.AppendEvent(event) switch event.Type { case IAMSetupStarted: - i.SetUpStarted = true + if len(event.Data) == 0 { + i.SetUpStarted = Step(model.Step1) + return + } + step := new(struct{ Step Step }) + err = json.Unmarshal(event.Data, step) + if err != nil { + return err + } + i.SetUpStarted = step.Step case IAMSetupDone: - i.SetUpDone = true + if len(event.Data) == 0 { + i.SetUpDone = Step(model.Step1) + return + } + step := new(struct{ Step Step }) + err = json.Unmarshal(event.Data, step) + if err != nil { + return err + } + i.SetUpDone = step.Step case IAMProjectSet, GlobalOrgSet: err = i.SetData(event) @@ -106,6 +168,26 @@ func (i *IAM) AppendEvent(event *es_models.Event) (err error) { return i.appendAddIDPProviderToLoginPolicyEvent(event) case LoginPolicyIDPProviderRemoved: return i.appendRemoveIDPProviderFromLoginPolicyEvent(event) + case LabelPolicyAdded: + return i.appendAddLabelPolicyEvent(event) + case LabelPolicyChanged: + return i.appendChangeLabelPolicyEvent(event) + case PasswordComplexityPolicyAdded: + return i.appendAddPasswordComplexityPolicyEvent(event) + case PasswordComplexityPolicyChanged: + return i.appendChangePasswordComplexityPolicyEvent(event) + case PasswordAgePolicyAdded: + return i.appendAddPasswordAgePolicyEvent(event) + case PasswordAgePolicyChanged: + return i.appendChangePasswordAgePolicyEvent(event) + case PasswordLockoutPolicyAdded: + return i.appendAddPasswordLockoutPolicyEvent(event) + case PasswordLockoutPolicyChanged: + return i.appendChangePasswordLockoutPolicyEvent(event) + case OrgIAMPolicyAdded: + return i.appendAddOrgIAMPolicyEvent(event) + case OrgIAMPolicyChanged: + return i.appendChangeOrgIAMPolicyEvent(event) } return err diff --git a/internal/iam/repository/eventsourcing/model/iam_test.go b/internal/iam/repository/eventsourcing/model/iam_test.go index e418235687..e72d921c29 100644 --- a/internal/iam/repository/eventsourcing/model/iam_test.go +++ b/internal/iam/repository/eventsourcing/model/iam_test.go @@ -2,8 +2,9 @@ package model import ( "encoding/json" - es_models "github.com/caos/zitadel/internal/eventstore/models" "testing" + + es_models "github.com/caos/zitadel/internal/eventstore/models" ) func mockIamData(iam *IAM) []byte { @@ -27,31 +28,31 @@ func TestProjectRoleAppendEvent(t *testing.T) { event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: IAMSetupStarted, ResourceOwner: "OrgID"}, iam: &IAM{}, }, - result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: true}, + result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: Step1}, }, { name: "append set up done event", args: args{ event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: IAMSetupDone, ResourceOwner: "OrgID"}, - iam: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: true}, + iam: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: Step1}, }, - result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: true, SetUpDone: true}, + result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: Step1, SetUpDone: Step1}, }, { name: "append globalorg event", args: args{ event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: GlobalOrgSet, ResourceOwner: "OrgID", Data: mockIamData(&IAM{GlobalOrgID: "GlobalOrg"})}, - iam: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: true}, + iam: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: Step1}, }, - result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: true, GlobalOrgID: "GlobalOrg"}, + result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: Step1, GlobalOrgID: "GlobalOrg"}, }, { name: "append iamproject event", args: args{ event: &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: IAMProjectSet, ResourceOwner: "OrgID", Data: mockIamData(&IAM{IAMProjectID: "IamProject"})}, - iam: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: true}, + iam: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: Step1}, }, - result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: true, IAMProjectID: "IamProject"}, + result: &IAM{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SetUpStarted: Step1, IAMProjectID: "IamProject"}, }, } for _, tt := range tests { diff --git a/internal/iam/repository/eventsourcing/model/idp_config.go b/internal/iam/repository/eventsourcing/model/idp_config.go index 433b25351a..2da5c583ae 100644 --- a/internal/iam/repository/eventsourcing/model/idp_config.go +++ b/internal/iam/repository/eventsourcing/model/idp_config.go @@ -1,7 +1,6 @@ package model import ( - "bytes" "encoding/json" "github.com/caos/logging" es_models "github.com/caos/zitadel/internal/eventstore/models" @@ -14,7 +13,7 @@ type IDPConfig struct { State int32 `json:"-"` Name string `json:"name,omitempty"` Type int32 `json:"idpType,omitempty"` - LogoSrc []byte `json:"logoSrc,omitempty"` + StylingType int32 `json:"stylingType,omitempty"` OIDCIDPConfig *OIDCIDPConfig `json:"-"` } @@ -39,8 +38,8 @@ func (c *IDPConfig) Changes(changed *IDPConfig) map[string]interface{} { if changed.Name != "" && c.Name != changed.Name { changes["name"] = changed.Name } - if changed.LogoSrc != nil && bytes.Equal(c.LogoSrc, changed.LogoSrc) { - changes["logoSrc"] = changed.LogoSrc + if c.StylingType != changed.StylingType { + changes["stylingType"] = changed.StylingType } return changes } @@ -68,7 +67,7 @@ func IDPConfigFromModel(idp *model.IDPConfig) *IDPConfig { Name: idp.Name, State: int32(idp.State), Type: int32(idp.Type), - LogoSrc: idp.LogoSrc, + StylingType: int32(idp.StylingType), } if idp.OIDCConfig != nil { converted.OIDCIDPConfig = OIDCIDPConfigFromModel(idp.OIDCConfig) @@ -81,7 +80,7 @@ func IDPConfigToModel(idp *IDPConfig) *model.IDPConfig { ObjectRoot: idp.ObjectRoot, IDPConfigID: idp.IDPConfigID, Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: model.IDPStylingType(idp.StylingType), State: model.IDPConfigState(idp.State), Type: model.IdpConfigType(idp.Type), } diff --git a/internal/iam/repository/eventsourcing/model/label_policy.go b/internal/iam/repository/eventsourcing/model/label_policy.go new file mode 100644 index 0000000000..738b54fcb0 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/label_policy.go @@ -0,0 +1,78 @@ +package model + +import ( + "encoding/json" + + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type LabelPolicy struct { + models.ObjectRoot + State int32 `json:"-"` + PrimaryColor string `json:"primaryColor"` + SecondaryColor string `json:"secondaryColor"` +} + +func LabelPolicyToModel(policy *LabelPolicy) *iam_model.LabelPolicy { + return &iam_model.LabelPolicy{ + ObjectRoot: policy.ObjectRoot, + State: iam_model.PolicyState(policy.State), + PrimaryColor: policy.PrimaryColor, + SecondaryColor: policy.SecondaryColor, + } +} + +func LabelPolicyFromModel(policy *iam_model.LabelPolicy) *LabelPolicy { + return &LabelPolicy{ + ObjectRoot: policy.ObjectRoot, + State: int32(policy.State), + PrimaryColor: policy.PrimaryColor, + SecondaryColor: policy.SecondaryColor, + } +} + +func (p *LabelPolicy) Changes(changed *LabelPolicy) map[string]interface{} { + changes := make(map[string]interface{}, 2) + + if changed.PrimaryColor != p.PrimaryColor { + changes["primaryColor"] = changed.PrimaryColor + } + if changed.SecondaryColor != p.SecondaryColor { + changes["secondaryColor"] = changed.SecondaryColor + } + + return changes +} + +func (i *IAM) appendAddLabelPolicyEvent(event *es_models.Event) error { + i.DefaultLabelPolicy = new(LabelPolicy) + err := i.DefaultLabelPolicy.SetDataLabel(event) + if err != nil { + return err + } + i.DefaultLabelPolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (i *IAM) appendChangeLabelPolicyEvent(event *es_models.Event) error { + return i.DefaultLabelPolicy.SetDataLabel(event) +} + +func (p *LabelPolicy) SetDataLabel(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "MODEL-ikjhf", "unable to unmarshal data") + } + return nil +} + +func (p *IDPProvider) SetDataLabel(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "MODEL-c41Hn", "unable to unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/eventsourcing/model/label_policy_test.go b/internal/iam/repository/eventsourcing/model/label_policy_test.go new file mode 100644 index 0000000000..094e51f28c --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/label_policy_test.go @@ -0,0 +1,132 @@ +package model + +import ( + "encoding/json" + "testing" + + es_models "github.com/caos/zitadel/internal/eventstore/models" +) + +func TestLabelPolicyChanges(t *testing.T) { + type args struct { + existing *LabelPolicy + new *LabelPolicy + } + type res struct { + changesLen int + } + tests := []struct { + name string + args args + res res + }{ + { + name: "labelpolicy all attributes change", + args: args{ + existing: &LabelPolicy{PrimaryColor: "000001", SecondaryColor: "FFFFFA"}, + new: &LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}, + }, + res: res{ + changesLen: 2, + }, + }, + { + name: "no changes", + args: args{ + existing: &LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}, + new: &LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}, + }, + res: res{ + changesLen: 0, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + changes := tt.args.existing.Changes(tt.args.new) + if len(changes) != tt.res.changesLen { + t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes)) + } + }) + } +} + +func TestAppendAddLabelPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *LabelPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append add label policy event", + args: args{ + iam: new(IAM), + policy: &LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}, + event: new(es_models.Event), + }, + result: &IAM{DefaultLabelPolicy: &LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendAddLabelPolicyEvent(tt.args.event) + if tt.result.DefaultLabelPolicy.PrimaryColor != tt.args.iam.DefaultLabelPolicy.PrimaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultLabelPolicy.PrimaryColor, tt.args.iam.DefaultLabelPolicy.PrimaryColor) + } + if tt.result.DefaultLabelPolicy.SecondaryColor != tt.args.iam.DefaultLabelPolicy.SecondaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultLabelPolicy.SecondaryColor, tt.args.iam.DefaultLabelPolicy.SecondaryColor) + } + }) + } +} + +func TestAppendChangeLabelPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *LabelPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append change label policy event", + args: args{ + iam: &IAM{DefaultLabelPolicy: &LabelPolicy{ + PrimaryColor: "000001", SecondaryColor: "FFFFF0", + }}, + policy: &LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultLabelPolicy: &LabelPolicy{ + PrimaryColor: "000000", SecondaryColor: "FFFFFF", + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendChangeLabelPolicyEvent(tt.args.event) + if tt.result.DefaultLabelPolicy.PrimaryColor != tt.args.iam.DefaultLabelPolicy.PrimaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultLabelPolicy.PrimaryColor, tt.args.iam.DefaultLabelPolicy.PrimaryColor) + } + if tt.result.DefaultLabelPolicy.SecondaryColor != tt.args.iam.DefaultLabelPolicy.SecondaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultLabelPolicy.SecondaryColor, tt.args.iam.DefaultLabelPolicy.SecondaryColor) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/model/oidc_idp_config.go b/internal/iam/repository/eventsourcing/model/oidc_idp_config.go index ecdda1b32c..efd6a84e1c 100644 --- a/internal/iam/repository/eventsourcing/model/oidc_idp_config.go +++ b/internal/iam/repository/eventsourcing/model/oidc_idp_config.go @@ -27,7 +27,7 @@ func (c *OIDCIDPConfig) Changes(changed *OIDCIDPConfig) map[string]interface{} { if c.ClientID != changed.ClientID { changes["clientId"] = changed.ClientID } - if c.ClientSecret != nil && c.ClientSecret != changed.ClientSecret { + if changed.ClientSecret != nil && c.ClientSecret != changed.ClientSecret { changes["clientSecret"] = changed.ClientSecret } if c.Issuer != changed.Issuer { diff --git a/internal/iam/repository/eventsourcing/model/org_iam_policy.go b/internal/iam/repository/eventsourcing/model/org_iam_policy.go new file mode 100644 index 0000000000..3056750803 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/org_iam_policy.go @@ -0,0 +1,63 @@ +package model + +import ( + "encoding/json" + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type OrgIAMPolicy struct { + models.ObjectRoot + + State int32 `json:"-"` + UserLoginMustBeDomain bool `json:"userLoginMustBeDomain"` +} + +func OrgIAMPolicyFromModel(policy *iam_model.OrgIAMPolicy) *OrgIAMPolicy { + return &OrgIAMPolicy{ + ObjectRoot: policy.ObjectRoot, + State: int32(policy.State), + UserLoginMustBeDomain: policy.UserLoginMustBeDomain, + } +} + +func OrgIAMPolicyToModel(policy *OrgIAMPolicy) *iam_model.OrgIAMPolicy { + return &iam_model.OrgIAMPolicy{ + ObjectRoot: policy.ObjectRoot, + State: iam_model.PolicyState(policy.State), + UserLoginMustBeDomain: policy.UserLoginMustBeDomain, + } +} + +func (p *OrgIAMPolicy) Changes(changed *OrgIAMPolicy) map[string]interface{} { + changes := make(map[string]interface{}, 1) + + if p.UserLoginMustBeDomain != changed.UserLoginMustBeDomain { + changes["userLoginMustBeDomain"] = changed.UserLoginMustBeDomain + } + return changes +} + +func (i *IAM) appendAddOrgIAMPolicyEvent(event *es_models.Event) error { + i.DefaultOrgIAMPolicy = new(OrgIAMPolicy) + err := i.DefaultOrgIAMPolicy.SetData(event) + if err != nil { + return err + } + i.DefaultOrgIAMPolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (i *IAM) appendChangeOrgIAMPolicyEvent(event *es_models.Event) error { + return i.DefaultOrgIAMPolicy.SetData(event) +} + +func (p *OrgIAMPolicy) SetData(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "EVENT-7JS9d", "unable to unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/eventsourcing/model/org_iam_policy_test.go b/internal/iam/repository/eventsourcing/model/org_iam_policy_test.go new file mode 100644 index 0000000000..555c620b4c --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/org_iam_policy_test.go @@ -0,0 +1,125 @@ +package model + +import ( + "encoding/json" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "testing" +) + +func TestOrgIAMPolicyChanges(t *testing.T) { + type args struct { + existing *OrgIAMPolicy + new *OrgIAMPolicy + } + type res struct { + changesLen int + } + tests := []struct { + name string + args args + res res + }{ + { + name: "org iam policy all attributes change", + args: args{ + existing: &OrgIAMPolicy{UserLoginMustBeDomain: true}, + new: &OrgIAMPolicy{UserLoginMustBeDomain: false}, + }, + res: res{ + changesLen: 1, + }, + }, + { + name: "no changes", + args: args{ + existing: &OrgIAMPolicy{UserLoginMustBeDomain: true}, + new: &OrgIAMPolicy{UserLoginMustBeDomain: true}, + }, + res: res{ + changesLen: 0, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + changes := tt.args.existing.Changes(tt.args.new) + if len(changes) != tt.res.changesLen { + t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes)) + } + }) + } +} + +func TestAppendAddOrgIAMPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *OrgIAMPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append add org iam policy event", + args: args{ + iam: new(IAM), + policy: &OrgIAMPolicy{UserLoginMustBeDomain: true}, + event: new(es_models.Event), + }, + result: &IAM{DefaultOrgIAMPolicy: &OrgIAMPolicy{UserLoginMustBeDomain: true}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendAddOrgIAMPolicyEvent(tt.args.event) + if tt.result.DefaultOrgIAMPolicy.UserLoginMustBeDomain != tt.args.iam.DefaultOrgIAMPolicy.UserLoginMustBeDomain { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultOrgIAMPolicy.UserLoginMustBeDomain, tt.args.iam.DefaultOrgIAMPolicy.UserLoginMustBeDomain) + } + }) + } +} + +func TestAppendChangeOrgIAMPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *OrgIAMPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append change org iam policy event", + args: args{ + iam: &IAM{DefaultOrgIAMPolicy: &OrgIAMPolicy{ + UserLoginMustBeDomain: true, + }}, + policy: &OrgIAMPolicy{UserLoginMustBeDomain: false}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultOrgIAMPolicy: &OrgIAMPolicy{ + UserLoginMustBeDomain: false, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendChangeOrgIAMPolicyEvent(tt.args.event) + if tt.result.DefaultOrgIAMPolicy.UserLoginMustBeDomain != tt.args.iam.DefaultOrgIAMPolicy.UserLoginMustBeDomain { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultOrgIAMPolicy.UserLoginMustBeDomain, tt.args.iam.DefaultOrgIAMPolicy.UserLoginMustBeDomain) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/model/password_age_policy.go b/internal/iam/repository/eventsourcing/model/password_age_policy.go new file mode 100644 index 0000000000..86c65247d9 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/password_age_policy.go @@ -0,0 +1,69 @@ +package model + +import ( + "encoding/json" + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type PasswordAgePolicy struct { + models.ObjectRoot + + State int32 `json:"-"` + MaxAgeDays uint64 `json:"maxAgeDays"` + ExpireWarnDays uint64 `json:"expireWarnDays"` +} + +func PasswordAgePolicyFromModel(policy *iam_model.PasswordAgePolicy) *PasswordAgePolicy { + return &PasswordAgePolicy{ + ObjectRoot: policy.ObjectRoot, + State: int32(policy.State), + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + } +} + +func PasswordAgePolicyToModel(policy *PasswordAgePolicy) *iam_model.PasswordAgePolicy { + return &iam_model.PasswordAgePolicy{ + ObjectRoot: policy.ObjectRoot, + State: iam_model.PolicyState(policy.State), + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + } +} + +func (p *PasswordAgePolicy) Changes(changed *PasswordAgePolicy) map[string]interface{} { + changes := make(map[string]interface{}, 1) + + if p.MaxAgeDays != changed.MaxAgeDays { + changes["maxAgeDays"] = changed.MaxAgeDays + } + if p.ExpireWarnDays != changed.ExpireWarnDays { + changes["expireWarnDays"] = changed.ExpireWarnDays + } + return changes +} + +func (i *IAM) appendAddPasswordAgePolicyEvent(event *es_models.Event) error { + i.DefaultPasswordAgePolicy = new(PasswordAgePolicy) + err := i.DefaultPasswordAgePolicy.SetData(event) + if err != nil { + return err + } + i.DefaultPasswordAgePolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (i *IAM) appendChangePasswordAgePolicyEvent(event *es_models.Event) error { + return i.DefaultPasswordAgePolicy.SetData(event) +} + +func (p *PasswordAgePolicy) SetData(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "EVENT-7JS9d", "unable to unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/eventsourcing/model/password_age_policy_test.go b/internal/iam/repository/eventsourcing/model/password_age_policy_test.go new file mode 100644 index 0000000000..6e3b9132b3 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/password_age_policy_test.go @@ -0,0 +1,128 @@ +package model + +import ( + "encoding/json" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "testing" +) + +func TestPasswordAgePolicyChanges(t *testing.T) { + type args struct { + existing *PasswordAgePolicy + new *PasswordAgePolicy + } + type res struct { + changesLen int + } + tests := []struct { + name string + args args + res res + }{ + { + name: "age policy all attributes change", + args: args{ + existing: &PasswordAgePolicy{MaxAgeDays: 365, ExpireWarnDays: 5}, + new: &PasswordAgePolicy{MaxAgeDays: 730, ExpireWarnDays: 10}, + }, + res: res{ + changesLen: 2, + }, + }, + { + name: "no changes", + args: args{ + existing: &PasswordAgePolicy{MaxAgeDays: 10, ExpireWarnDays: 10}, + new: &PasswordAgePolicy{MaxAgeDays: 10, ExpireWarnDays: 10}, + }, + res: res{ + changesLen: 0, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + changes := tt.args.existing.Changes(tt.args.new) + if len(changes) != tt.res.changesLen { + t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes)) + } + }) + } +} + +func TestAppendAddPasswordAgePolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *PasswordAgePolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append add password age policy event", + args: args{ + iam: new(IAM), + policy: &PasswordAgePolicy{MaxAgeDays: 10, ExpireWarnDays: 10}, + event: new(es_models.Event), + }, + result: &IAM{DefaultPasswordAgePolicy: &PasswordAgePolicy{MaxAgeDays: 10, ExpireWarnDays: 10}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendAddPasswordAgePolicyEvent(tt.args.event) + if tt.result.DefaultPasswordAgePolicy.MaxAgeDays != tt.args.iam.DefaultPasswordAgePolicy.MaxAgeDays { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordAgePolicy.MaxAgeDays, tt.args.iam.DefaultPasswordAgePolicy.MaxAgeDays) + } + if tt.result.DefaultPasswordAgePolicy.ExpireWarnDays != tt.args.iam.DefaultPasswordAgePolicy.ExpireWarnDays { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordAgePolicy.ExpireWarnDays, tt.args.iam.DefaultPasswordAgePolicy.ExpireWarnDays) + } + }) + } +} + +func TestAppendChangePasswordAgePolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *PasswordAgePolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append change password age policy event", + args: args{ + iam: &IAM{DefaultPasswordAgePolicy: &PasswordAgePolicy{ + MaxAgeDays: 10, + }}, + policy: &PasswordAgePolicy{MaxAgeDays: 5}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultPasswordAgePolicy: &PasswordAgePolicy{ + MaxAgeDays: 5, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendChangePasswordAgePolicyEvent(tt.args.event) + if tt.result.DefaultPasswordAgePolicy.MaxAgeDays != tt.args.iam.DefaultPasswordAgePolicy.MaxAgeDays { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordAgePolicy.MaxAgeDays, tt.args.iam.DefaultPasswordAgePolicy.MaxAgeDays) + } + }) + } +} diff --git a/internal/policy/repository/eventsourcing/model_complexity.go b/internal/iam/repository/eventsourcing/model/password_complexity_policy.go similarity index 54% rename from internal/policy/repository/eventsourcing/model_complexity.go rename to internal/iam/repository/eventsourcing/model/password_complexity_policy.go index 0c49a1c8e8..37dc2db784 100644 --- a/internal/policy/repository/eventsourcing/model_complexity.go +++ b/internal/iam/repository/eventsourcing/model/password_complexity_policy.go @@ -1,22 +1,16 @@ -package eventsourcing +package model import ( "encoding/json" - - "github.com/caos/logging" + "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -const ( - policyComplexityVersion = "v1" + iam_model "github.com/caos/zitadel/internal/iam/model" ) type PasswordComplexityPolicy struct { models.ObjectRoot - Description string `json:"description,omitempty"` State int32 `json:"-"` MinLength uint64 `json:"minLength"` HasLowercase bool `json:"hasLowercase"` @@ -25,11 +19,33 @@ type PasswordComplexityPolicy struct { HasSymbol bool `json:"hasSymbol"` } -func (p *PasswordComplexityPolicy) ComplexityChanges(changed *PasswordComplexityPolicy) map[string]interface{} { - changes := make(map[string]interface{}, 1) - if changed.Description != "" && p.Description != changed.Description { - changes["description"] = changed.Description +func PasswordComplexityPolicyFromModel(policy *iam_model.PasswordComplexityPolicy) *PasswordComplexityPolicy { + return &PasswordComplexityPolicy{ + ObjectRoot: policy.ObjectRoot, + State: int32(policy.State), + MinLength: policy.MinLength, + HasLowercase: policy.HasLowercase, + HasUppercase: policy.HasUppercase, + HasNumber: policy.HasNumber, + HasSymbol: policy.HasSymbol, } +} + +func PasswordComplexityPolicyToModel(policy *PasswordComplexityPolicy) *iam_model.PasswordComplexityPolicy { + return &iam_model.PasswordComplexityPolicy{ + ObjectRoot: policy.ObjectRoot, + State: iam_model.PolicyState(policy.State), + MinLength: policy.MinLength, + HasLowercase: policy.HasLowercase, + HasUppercase: policy.HasUppercase, + HasNumber: policy.HasNumber, + HasSymbol: policy.HasSymbol, + } +} + +func (p *PasswordComplexityPolicy) Changes(changed *PasswordComplexityPolicy) map[string]interface{} { + changes := make(map[string]interface{}, 1) + if p.MinLength != changed.MinLength { changes["minLength"] = changed.MinLength } @@ -48,51 +64,24 @@ func (p *PasswordComplexityPolicy) ComplexityChanges(changed *PasswordComplexity return changes } -func PasswordComplexityPolicyFromModel(policy *model.PasswordComplexityPolicy) *PasswordComplexityPolicy { - return &PasswordComplexityPolicy{ - ObjectRoot: policy.ObjectRoot, - Description: policy.Description, - State: int32(policy.State), - MinLength: policy.MinLength, - HasLowercase: policy.HasLowercase, - HasUppercase: policy.HasUppercase, - HasNumber: policy.HasNumber, - HasSymbol: policy.HasSymbol, - } -} - -func PasswordComplexityPolicyToModel(policy *PasswordComplexityPolicy) *model.PasswordComplexityPolicy { - return &model.PasswordComplexityPolicy{ - ObjectRoot: policy.ObjectRoot, - Description: policy.Description, - State: model.PolicyState(policy.State), - MinLength: policy.MinLength, - HasLowercase: policy.HasLowercase, - HasUppercase: policy.HasUppercase, - HasNumber: policy.HasNumber, - HasSymbol: policy.HasSymbol, - } -} - -func (p *PasswordComplexityPolicy) AppendEvents(events ...*es_models.Event) error { - for _, event := range events { - if err := p.AppendEvent(event); err != nil { - return err - } +func (i *IAM) appendAddPasswordComplexityPolicyEvent(event *es_models.Event) error { + i.DefaultPasswordComplexityPolicy = new(PasswordComplexityPolicy) + err := i.DefaultPasswordComplexityPolicy.SetData(event) + if err != nil { + return err } + i.DefaultPasswordComplexityPolicy.ObjectRoot.CreationDate = event.CreationDate return nil } -func (p *PasswordComplexityPolicy) AppendEvent(event *es_models.Event) error { - p.ObjectRoot.AppendEvent(event) +func (i *IAM) appendChangePasswordComplexityPolicyEvent(event *es_models.Event) error { + return i.DefaultPasswordComplexityPolicy.SetData(event) +} - switch event.Type { - case model.PasswordComplexityPolicyAdded, model.PasswordComplexityPolicyChanged: - if err := json.Unmarshal(event.Data, p); err != nil { - logging.Log("EVEN-idl93").WithError(err).Error("could not unmarshal event data") - return err - } - return nil +func (p *PasswordComplexityPolicy) SetData(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "EVENT-7JS9d", "unable to unmarshal data") } return nil } diff --git a/internal/iam/repository/eventsourcing/model/password_complexity_policy_test.go b/internal/iam/repository/eventsourcing/model/password_complexity_policy_test.go new file mode 100644 index 0000000000..7ea90dc279 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/password_complexity_policy_test.go @@ -0,0 +1,137 @@ +package model + +import ( + "encoding/json" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "testing" +) + +func TestPasswordComplexityPolicyChanges(t *testing.T) { + type args struct { + existing *PasswordComplexityPolicy + new *PasswordComplexityPolicy + } + type res struct { + changesLen int + } + tests := []struct { + name string + args args + res res + }{ + { + name: "loginpolicy all attributes change", + args: args{ + existing: &PasswordComplexityPolicy{MinLength: 10, HasUppercase: true, HasLowercase: true, HasNumber: true, HasSymbol: true}, + new: &PasswordComplexityPolicy{MinLength: 5, HasUppercase: false, HasLowercase: false, HasNumber: false, HasSymbol: false}, + }, + res: res{ + changesLen: 5, + }, + }, + { + name: "no changes", + args: args{ + existing: &PasswordComplexityPolicy{MinLength: 10, HasUppercase: true, HasLowercase: true, HasNumber: true, HasSymbol: true}, + new: &PasswordComplexityPolicy{MinLength: 10, HasUppercase: true, HasLowercase: true, HasNumber: true, HasSymbol: true}, + }, + res: res{ + changesLen: 0, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + changes := tt.args.existing.Changes(tt.args.new) + if len(changes) != tt.res.changesLen { + t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes)) + } + }) + } +} + +func TestAppendAddPasswordComplexityPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *PasswordComplexityPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append add password complexity policy event", + args: args{ + iam: new(IAM), + policy: &PasswordComplexityPolicy{MinLength: 10, HasUppercase: true, HasLowercase: true, HasNumber: true, HasSymbol: true}, + event: new(es_models.Event), + }, + result: &IAM{DefaultPasswordComplexityPolicy: &PasswordComplexityPolicy{MinLength: 10, HasUppercase: true, HasLowercase: true, HasNumber: true, HasSymbol: true}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendAddPasswordComplexityPolicyEvent(tt.args.event) + if tt.result.DefaultPasswordComplexityPolicy.MinLength != tt.args.iam.DefaultPasswordComplexityPolicy.MinLength { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordComplexityPolicy.MinLength, tt.args.iam.DefaultPasswordComplexityPolicy.MinLength) + } + if tt.result.DefaultPasswordComplexityPolicy.HasUppercase != tt.args.iam.DefaultPasswordComplexityPolicy.HasUppercase { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordComplexityPolicy.HasUppercase, tt.args.iam.DefaultPasswordComplexityPolicy.HasUppercase) + } + if tt.result.DefaultPasswordComplexityPolicy.HasLowercase != tt.args.iam.DefaultPasswordComplexityPolicy.HasLowercase { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordComplexityPolicy.HasLowercase, tt.args.iam.DefaultPasswordComplexityPolicy.HasLowercase) + } + if tt.result.DefaultPasswordComplexityPolicy.HasNumber != tt.args.iam.DefaultPasswordComplexityPolicy.HasNumber { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordComplexityPolicy.HasNumber, tt.args.iam.DefaultPasswordComplexityPolicy.HasNumber) + } + if tt.result.DefaultPasswordComplexityPolicy.HasSymbol != tt.args.iam.DefaultPasswordComplexityPolicy.HasSymbol { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordComplexityPolicy.HasSymbol, tt.args.iam.DefaultPasswordComplexityPolicy.HasSymbol) + } + }) + } +} + +func TestAppendChangePasswordComplexityPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *PasswordComplexityPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append change password complexity policy event", + args: args{ + iam: &IAM{DefaultPasswordComplexityPolicy: &PasswordComplexityPolicy{ + MinLength: 10, + }}, + policy: &PasswordComplexityPolicy{MinLength: 5}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultPasswordComplexityPolicy: &PasswordComplexityPolicy{ + MinLength: 5, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendChangePasswordComplexityPolicyEvent(tt.args.event) + if tt.result.DefaultPasswordComplexityPolicy.MinLength != tt.args.iam.DefaultPasswordComplexityPolicy.MinLength { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordComplexityPolicy.MinLength, tt.args.iam.DefaultPasswordComplexityPolicy.MinLength) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/model/password_lockout_policy.go b/internal/iam/repository/eventsourcing/model/password_lockout_policy.go new file mode 100644 index 0000000000..e4878c82f9 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/password_lockout_policy.go @@ -0,0 +1,69 @@ +package model + +import ( + "encoding/json" + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type PasswordLockoutPolicy struct { + models.ObjectRoot + + State int32 `json:"-"` + MaxAttempts uint64 `json:"maxAttempts"` + ShowLockOutFailures bool `json:"showLockOutFailures"` +} + +func PasswordLockoutPolicyFromModel(policy *iam_model.PasswordLockoutPolicy) *PasswordLockoutPolicy { + return &PasswordLockoutPolicy{ + ObjectRoot: policy.ObjectRoot, + State: int32(policy.State), + MaxAttempts: policy.MaxAttempts, + ShowLockOutFailures: policy.ShowLockOutFailures, + } +} + +func PasswordLockoutPolicyToModel(policy *PasswordLockoutPolicy) *iam_model.PasswordLockoutPolicy { + return &iam_model.PasswordLockoutPolicy{ + ObjectRoot: policy.ObjectRoot, + State: iam_model.PolicyState(policy.State), + MaxAttempts: policy.MaxAttempts, + ShowLockOutFailures: policy.ShowLockOutFailures, + } +} + +func (p *PasswordLockoutPolicy) Changes(changed *PasswordLockoutPolicy) map[string]interface{} { + changes := make(map[string]interface{}, 2) + + if p.MaxAttempts != changed.MaxAttempts { + changes["maxAttempts"] = changed.MaxAttempts + } + if p.ShowLockOutFailures != changed.ShowLockOutFailures { + changes["showLockOutFailures"] = changed.ShowLockOutFailures + } + return changes +} + +func (i *IAM) appendAddPasswordLockoutPolicyEvent(event *es_models.Event) error { + i.DefaultPasswordLockoutPolicy = new(PasswordLockoutPolicy) + err := i.DefaultPasswordLockoutPolicy.SetData(event) + if err != nil { + return err + } + i.DefaultPasswordLockoutPolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (i *IAM) appendChangePasswordLockoutPolicyEvent(event *es_models.Event) error { + return i.DefaultPasswordLockoutPolicy.SetData(event) +} + +func (p *PasswordLockoutPolicy) SetData(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "EVENT-7JS9d", "unable to unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/eventsourcing/model/password_lockout_policy_test.go b/internal/iam/repository/eventsourcing/model/password_lockout_policy_test.go new file mode 100644 index 0000000000..78e499da38 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/password_lockout_policy_test.go @@ -0,0 +1,128 @@ +package model + +import ( + "encoding/json" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "testing" +) + +func TestPasswordLockoutPolicyChanges(t *testing.T) { + type args struct { + existing *PasswordLockoutPolicy + new *PasswordLockoutPolicy + } + type res struct { + changesLen int + } + tests := []struct { + name string + args args + res res + }{ + { + name: "lockout policy all attributes change", + args: args{ + existing: &PasswordLockoutPolicy{MaxAttempts: 365, ShowLockOutFailures: true}, + new: &PasswordLockoutPolicy{MaxAttempts: 730, ShowLockOutFailures: false}, + }, + res: res{ + changesLen: 2, + }, + }, + { + name: "no changes", + args: args{ + existing: &PasswordLockoutPolicy{MaxAttempts: 10, ShowLockOutFailures: true}, + new: &PasswordLockoutPolicy{MaxAttempts: 10, ShowLockOutFailures: true}, + }, + res: res{ + changesLen: 0, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + changes := tt.args.existing.Changes(tt.args.new) + if len(changes) != tt.res.changesLen { + t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes)) + } + }) + } +} + +func TestAppendAddPasswordLockoutPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *PasswordLockoutPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append add password lockout policy event", + args: args{ + iam: new(IAM), + policy: &PasswordLockoutPolicy{MaxAttempts: 10, ShowLockOutFailures: true}, + event: new(es_models.Event), + }, + result: &IAM{DefaultPasswordLockoutPolicy: &PasswordLockoutPolicy{MaxAttempts: 10, ShowLockOutFailures: true}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendAddPasswordLockoutPolicyEvent(tt.args.event) + if tt.result.DefaultPasswordLockoutPolicy.MaxAttempts != tt.args.iam.DefaultPasswordLockoutPolicy.MaxAttempts { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordLockoutPolicy.MaxAttempts, tt.args.iam.DefaultPasswordLockoutPolicy.MaxAttempts) + } + if tt.result.DefaultPasswordLockoutPolicy.ShowLockOutFailures != tt.args.iam.DefaultPasswordLockoutPolicy.ShowLockOutFailures { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordLockoutPolicy.ShowLockOutFailures, tt.args.iam.DefaultPasswordLockoutPolicy.ShowLockOutFailures) + } + }) + } +} + +func TestAppendChangePasswordLockoutPolicyEvent(t *testing.T) { + type args struct { + iam *IAM + policy *PasswordLockoutPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append change password lockout policy event", + args: args{ + iam: &IAM{DefaultPasswordLockoutPolicy: &PasswordLockoutPolicy{ + MaxAttempts: 10, + }}, + policy: &PasswordLockoutPolicy{MaxAttempts: 5}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultPasswordLockoutPolicy: &PasswordLockoutPolicy{ + MaxAttempts: 5, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendChangePasswordLockoutPolicyEvent(tt.args.event) + if tt.result.DefaultPasswordLockoutPolicy.MaxAttempts != tt.args.iam.DefaultPasswordLockoutPolicy.MaxAttempts { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultPasswordLockoutPolicy.MaxAttempts, tt.args.iam.DefaultPasswordLockoutPolicy.MaxAttempts) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/model/types.go b/internal/iam/repository/eventsourcing/model/types.go index 94a26b417b..93b153f6a7 100644 --- a/internal/iam/repository/eventsourcing/model/types.go +++ b/internal/iam/repository/eventsourcing/model/types.go @@ -30,4 +30,18 @@ const ( LoginPolicyIDPProviderAdded models.EventType = "iam.policy.login.idpprovider.added" LoginPolicyIDPProviderRemoved models.EventType = "iam.policy.login.idpprovider.removed" LoginPolicyIDPProviderCascadeRemoved models.EventType = "iam.policy.login.idpprovider.cascade.removed" + LabelPolicyAdded models.EventType = "iam.policy.label.added" + LabelPolicyChanged models.EventType = "iam.policy.label.changed" + + PasswordComplexityPolicyAdded models.EventType = "iam.policy.password.complexity.added" + PasswordComplexityPolicyChanged models.EventType = "iam.policy.password.complexity.changed" + + PasswordAgePolicyAdded models.EventType = "iam.policy.password.age.added" + PasswordAgePolicyChanged models.EventType = "iam.policy.password.age.changed" + + PasswordLockoutPolicyAdded models.EventType = "iam.policy.password.lockout.added" + PasswordLockoutPolicyChanged models.EventType = "iam.policy.password.lockout.changed" + + OrgIAMPolicyAdded models.EventType = "iam.policy.org.iam.added" + OrgIAMPolicyChanged models.EventType = "iam.policy.org.iam.changed" ) diff --git a/internal/iam/repository/view/iam_member_view.go b/internal/iam/repository/view/iam_member_view.go index 3b2aaad402..711683b6cd 100644 --- a/internal/iam/repository/view/iam_member_view.go +++ b/internal/iam/repository/view/iam_member_view.go @@ -70,3 +70,8 @@ func DeleteIAMMember(db *gorm.DB, table, orgID, userID string) error { delete := repository.PrepareDeleteByObject(table, member) return delete(db) } + +func DeleteIAMMembersByUserID(db *gorm.DB, table, userID string) error { + delete := repository.PrepareDeleteByKey(table, model.IAMMemberSearchKey(iam_model.IAMMemberSearchKeyUserID), userID) + return delete(db) +} diff --git a/internal/iam/repository/view/label_policy_view.go b/internal/iam/repository/view/label_policy_view.go new file mode 100644 index 0000000000..e77f3b1dc9 --- /dev/null +++ b/internal/iam/repository/view/label_policy_view.go @@ -0,0 +1,32 @@ +package view + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" +) + +func GetLabelPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.LabelPolicyView, error) { + policy := new(model.LabelPolicyView) + userIDQuery := &model.LabelPolicySearchQuery{Key: iam_model.LabelPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, userIDQuery) + err := query(db, policy) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-68G11", "Errors.IAM.LabelPolicy.NotExisting") + } + return policy, err +} + +func PutLabelPolicy(db *gorm.DB, table string, policy *model.LabelPolicyView) error { + save := repository.PrepareSave(table) + return save(db, policy) +} + +func DeleteLabelPolicy(db *gorm.DB, table, aggregateID string) error { + delete := repository.PrepareDeleteByKey(table, model.LabelPolicySearchKey(iam_model.LabelPolicySearchKeyAggregateID), aggregateID) + + return delete(db) +} diff --git a/internal/iam/repository/view/model/idp_config.go b/internal/iam/repository/view/model/idp_config.go index 3a8950b878..049a898c09 100644 --- a/internal/iam/repository/view/model/idp_config.go +++ b/internal/iam/repository/view/model/idp_config.go @@ -26,7 +26,7 @@ type IDPConfigView struct { IDPConfigID string `json:"idpConfigId" gorm:"column:idp_config_id;primary_key"` AggregateID string `json:"-" gorm:"column:aggregate_id"` Name string `json:"name" gorm:"column:name"` - LogoSrc []byte `json:"logoSrc" gorm:"column:logo_src"` + StylingType int32 `json:"stylingType" gorm:"column:styling_type"` CreationDate time.Time `json:"-" gorm:"column:creation_date"` ChangeDate time.Time `json:"-" gorm:"column:change_date"` IDPState int32 `json:"-" gorm:"column:idp_state"` @@ -49,7 +49,7 @@ func IDPConfigViewFromModel(idp *model.IDPConfigView) *IDPConfigView { AggregateID: idp.AggregateID, IDPState: int32(idp.State), Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: int32(idp.StylingType), Sequence: idp.Sequence, CreationDate: idp.CreationDate, ChangeDate: idp.ChangeDate, @@ -70,7 +70,7 @@ func IDPConfigViewToModel(idp *IDPConfigView) *model.IDPConfigView { AggregateID: idp.AggregateID, State: model.IDPConfigState(idp.IDPState), Name: idp.Name, - LogoSrc: idp.LogoSrc, + StylingType: model.IDPStylingType(idp.StylingType), Sequence: idp.Sequence, CreationDate: idp.CreationDate, ChangeDate: idp.ChangeDate, diff --git a/internal/iam/repository/view/model/idp_provider.go b/internal/iam/repository/view/model/idp_provider.go index 7a41f1af9d..e4f2270aac 100644 --- a/internal/iam/repository/view/model/idp_provider.go +++ b/internal/iam/repository/view/model/idp_provider.go @@ -27,6 +27,7 @@ type IDPProviderView struct { ChangeDate time.Time `json:"-" gorm:"column:change_date"` Name string `json:"-" gorm:"column:name"` + StylingType int32 `json:"-" gorm:"column:styling_type"` IDPConfigType int32 `json:"-" gorm:"column:idp_config_type"` IDPProviderType int32 `json:"idpProviderType" gorm:"column:idp_provider_type"` IDPState int32 `json:"-" gorm:"column:idp_state"` @@ -41,6 +42,7 @@ func IDPProviderViewFromModel(provider *model.IDPProviderView) *IDPProviderView CreationDate: provider.CreationDate, ChangeDate: provider.ChangeDate, Name: provider.Name, + StylingType: int32(provider.StylingType), IDPConfigID: provider.IDPConfigID, IDPConfigType: int32(provider.IDPConfigType), IDPProviderType: int32(provider.IDPProviderType), @@ -55,6 +57,7 @@ func IDPProviderViewToModel(provider *IDPProviderView) *model.IDPProviderView { CreationDate: provider.CreationDate, ChangeDate: provider.ChangeDate, Name: provider.Name, + StylingType: model.IDPStylingType(provider.StylingType), IDPConfigID: provider.IDPConfigID, IDPConfigType: model.IdpConfigType(provider.IDPConfigType), IDPProviderType: model.IDPProviderType(provider.IDPProviderType), diff --git a/internal/iam/repository/view/model/label_policy.go b/internal/iam/repository/view/model/label_policy.go new file mode 100644 index 0000000000..0f9e4ad70f --- /dev/null +++ b/internal/iam/repository/view/model/label_policy.go @@ -0,0 +1,82 @@ +package model + +import ( + "encoding/json" + "time" + + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + + es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" +) + +const ( + LabelPolicyKeyAggregateID = "aggregate_id" +) + +type LabelPolicyView struct { + AggregateID string `json:"-" gorm:"column:aggregate_id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:label_policy_state"` + + PrimaryColor string `json:"primaryColor" gorm:"column:primary_color"` + SecondaryColor string `json:"secondaryColor" gorm:"column:secondary_color"` + Default bool `json:"-" gorm:"-"` + + Sequence uint64 `json:"-" gorm:"column:sequence"` +} + +func LabelPolicyViewFromModel(policy *model.LabelPolicyView) *LabelPolicyView { + return &LabelPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + PrimaryColor: policy.PrimaryColor, + SecondaryColor: policy.SecondaryColor, + Default: policy.Default, + } +} + +func LabelPolicyViewToModel(policy *LabelPolicyView) *model.LabelPolicyView { + return &model.LabelPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + PrimaryColor: policy.PrimaryColor, + SecondaryColor: policy.SecondaryColor, + Default: policy.Default, + } +} + +func (i *LabelPolicyView) AppendEvent(event *models.Event) (err error) { + i.Sequence = event.Sequence + i.ChangeDate = event.CreationDate + switch event.Type { + case es_model.LabelPolicyAdded, org_es_model.LabelPolicyAdded: + i.setRootData(event) + i.CreationDate = event.CreationDate + err = i.SetData(event) + case es_model.LabelPolicyChanged, org_es_model.LabelPolicyChanged: + err = i.SetData(event) + } + return err +} + +func (r *LabelPolicyView) setRootData(event *models.Event) { + r.AggregateID = event.AggregateID +} + +func (r *LabelPolicyView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("MODEL-Flp9C").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-Hs8uf", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/label_policy_query.go b/internal/iam/repository/view/model/label_policy_query.go new file mode 100644 index 0000000000..d12dcd2f78 --- /dev/null +++ b/internal/iam/repository/view/model/label_policy_query.go @@ -0,0 +1,59 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type LabelPolicySearchRequest iam_model.LabelPolicySearchRequest +type LabelPolicySearchQuery iam_model.LabelPolicySearchQuery +type LabelPolicySearchKey iam_model.LabelPolicySearchKey + +func (req LabelPolicySearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req LabelPolicySearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req LabelPolicySearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.LabelPolicySearchKeyUnspecified { + return nil + } + return LabelPolicySearchKey(req.SortingColumn) +} + +func (req LabelPolicySearchRequest) GetAsc() bool { + return req.Asc +} + +func (req LabelPolicySearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = LabelPolicySearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req LabelPolicySearchQuery) GetKey() repository.ColumnKey { + return LabelPolicySearchKey(req.Key) +} + +func (req LabelPolicySearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req LabelPolicySearchQuery) GetValue() interface{} { + return req.Value +} + +func (key LabelPolicySearchKey) ToColumnName() string { + switch iam_model.LabelPolicySearchKey(key) { + case iam_model.LabelPolicySearchKeyAggregateID: + return LabelPolicyKeyAggregateID + default: + return "" + } +} diff --git a/internal/iam/repository/view/model/org_iam_policy.go b/internal/iam/repository/view/model/org_iam_policy.go new file mode 100644 index 0000000000..ca2aca0910 --- /dev/null +++ b/internal/iam/repository/view/model/org_iam_policy.go @@ -0,0 +1,78 @@ +package model + +import ( + "encoding/json" + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "time" + + es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" +) + +const ( + OrgIAMPolicyKeyAggregateID = "aggregate_id" +) + +type OrgIAMPolicyView struct { + AggregateID string `json:"-" gorm:"column:aggregate_id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:org_iam_policy_state"` + + UserLoginMustBeDomain bool `json:"userLoginMustBeDomain" gorm:"column:user_login_must_be_domain"` + Default bool `json:"-" gorm:"-"` + + Sequence uint64 `json:"-" gorm:"column:sequence"` +} + +func OrgIAMViewFromModel(policy *model.OrgIAMPolicyView) *OrgIAMPolicyView { + return &OrgIAMPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + Default: policy.Default, + UserLoginMustBeDomain: policy.UserLoginMustBeDomain, + } +} + +func OrgIAMViewToModel(policy *OrgIAMPolicyView) *model.OrgIAMPolicyView { + return &model.OrgIAMPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + UserLoginMustBeDomain: policy.UserLoginMustBeDomain, + Default: policy.Default, + } +} + +func (i *OrgIAMPolicyView) AppendEvent(event *models.Event) (err error) { + i.Sequence = event.Sequence + i.ChangeDate = event.CreationDate + switch event.Type { + case es_model.OrgIAMPolicyAdded, org_es_model.OrgIAMPolicyAdded: + i.setRootData(event) + i.CreationDate = event.CreationDate + err = i.SetData(event) + case es_model.OrgIAMPolicyChanged, org_es_model.OrgIAMPolicyChanged: + err = i.SetData(event) + } + return err +} + +func (r *OrgIAMPolicyView) setRootData(event *models.Event) { + r.AggregateID = event.AggregateID +} + +func (r *OrgIAMPolicyView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("EVEN-Dmi9g").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-Hs8uf", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/org_iam_policy_query.go b/internal/iam/repository/view/model/org_iam_policy_query.go new file mode 100644 index 0000000000..da2f508dbb --- /dev/null +++ b/internal/iam/repository/view/model/org_iam_policy_query.go @@ -0,0 +1,59 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type OrgIAMPolicySearchRequest iam_model.OrgIAMPolicySearchRequest +type OrgIAMPolicySearchQuery iam_model.OrgIAMPolicySearchQuery +type OrgIAMPolicySearchKey iam_model.OrgIAMPolicySearchKey + +func (req OrgIAMPolicySearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req OrgIAMPolicySearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req OrgIAMPolicySearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.OrgIAMPolicySearchKeyUnspecified { + return nil + } + return OrgIAMPolicySearchKey(req.SortingColumn) +} + +func (req OrgIAMPolicySearchRequest) GetAsc() bool { + return req.Asc +} + +func (req OrgIAMPolicySearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = OrgIAMPolicySearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req OrgIAMPolicySearchQuery) GetKey() repository.ColumnKey { + return OrgIAMPolicySearchKey(req.Key) +} + +func (req OrgIAMPolicySearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req OrgIAMPolicySearchQuery) GetValue() interface{} { + return req.Value +} + +func (key OrgIAMPolicySearchKey) ToColumnName() string { + switch iam_model.OrgIAMPolicySearchKey(key) { + case iam_model.OrgIAMPolicySearchKeyAggregateID: + return OrgIAMPolicyKeyAggregateID + default: + return "" + } +} diff --git a/internal/iam/repository/view/model/password_age_policy.go b/internal/iam/repository/view/model/password_age_policy.go new file mode 100644 index 0000000000..99a8bafa7e --- /dev/null +++ b/internal/iam/repository/view/model/password_age_policy.go @@ -0,0 +1,81 @@ +package model + +import ( + "encoding/json" + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "time" + + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" +) + +const ( + PasswordAgeKeyAggregateID = "aggregate_id" +) + +type PasswordAgePolicyView struct { + AggregateID string `json:"-" gorm:"column:aggregate_id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:age_policy_state"` + + MaxAgeDays uint64 `json:"maxAgeDays" gorm:"column:max_age_days"` + ExpireWarnDays uint64 `json:"expireWarnDays" gorm:"column:expire_warn_days"` + Default bool `json:"-" gorm:"-"` + + Sequence uint64 `json:"-" gorm:"column:sequence"` +} + +func PasswordAgeViewFromModel(policy *model.PasswordAgePolicyView) *PasswordAgePolicyView { + return &PasswordAgePolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + Default: policy.Default, + } +} + +func PasswordAgeViewToModel(policy *PasswordAgePolicyView) *model.PasswordAgePolicyView { + return &model.PasswordAgePolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + MaxAgeDays: policy.MaxAgeDays, + ExpireWarnDays: policy.ExpireWarnDays, + Default: policy.Default, + } +} + +func (i *PasswordAgePolicyView) AppendEvent(event *models.Event) (err error) { + i.Sequence = event.Sequence + i.ChangeDate = event.CreationDate + switch event.Type { + case iam_es_model.PasswordAgePolicyAdded, org_es_model.PasswordAgePolicyAdded: + i.setRootData(event) + i.CreationDate = event.CreationDate + err = i.SetData(event) + case iam_es_model.PasswordAgePolicyChanged, org_es_model.PasswordAgePolicyChanged: + err = i.SetData(event) + } + return err +} + +func (r *PasswordAgePolicyView) setRootData(event *models.Event) { + r.AggregateID = event.AggregateID +} + +func (r *PasswordAgePolicyView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("EVEN-gH9os").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-Hs8uf", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/password_age_policy_query.go b/internal/iam/repository/view/model/password_age_policy_query.go new file mode 100644 index 0000000000..41b160bab3 --- /dev/null +++ b/internal/iam/repository/view/model/password_age_policy_query.go @@ -0,0 +1,59 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type PasswordAgePolicySearchRequest iam_model.PasswordAgePolicySearchRequest +type PasswordAgePolicySearchQuery iam_model.PasswordAgePolicySearchQuery +type PasswordAgePolicySearchKey iam_model.PasswordAgePolicySearchKey + +func (req PasswordAgePolicySearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req PasswordAgePolicySearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req PasswordAgePolicySearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.PasswordAgePolicySearchKeyUnspecified { + return nil + } + return PasswordAgePolicySearchKey(req.SortingColumn) +} + +func (req PasswordAgePolicySearchRequest) GetAsc() bool { + return req.Asc +} + +func (req PasswordAgePolicySearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = PasswordAgePolicySearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req PasswordAgePolicySearchQuery) GetKey() repository.ColumnKey { + return PasswordAgePolicySearchKey(req.Key) +} + +func (req PasswordAgePolicySearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req PasswordAgePolicySearchQuery) GetValue() interface{} { + return req.Value +} + +func (key PasswordAgePolicySearchKey) ToColumnName() string { + switch iam_model.PasswordAgePolicySearchKey(key) { + case iam_model.PasswordAgePolicySearchKeyAggregateID: + return PasswordAgeKeyAggregateID + default: + return "" + } +} diff --git a/internal/iam/repository/view/model/password_complexity_policy.go b/internal/iam/repository/view/model/password_complexity_policy.go new file mode 100644 index 0000000000..dd52e57657 --- /dev/null +++ b/internal/iam/repository/view/model/password_complexity_policy.go @@ -0,0 +1,90 @@ +package model + +import ( + "encoding/json" + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "time" + + es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" +) + +const ( + PasswordComplexityKeyAggregateID = "aggregate_id" +) + +type PasswordComplexityPolicyView struct { + AggregateID string `json:"-" gorm:"column:aggregate_id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:complexity_policy_state"` + + MinLength uint64 `json:"minLength" gorm:"column:min_length"` + HasLowercase bool `json:"hasLowercase" gorm:"column:has_lowercase"` + HasUppercase bool `json:"hasUppercase" gorm:"column:has_uppercase"` + HasSymbol bool `json:"hasSymbol" gorm:"column:has_symbol"` + HasNumber bool `json:"hasNumber" gorm:"column:has_number"` + Default bool `json:"-" gorm:"-"` + + Sequence uint64 `json:"-" gorm:"column:sequence"` +} + +func PasswordComplexityViewFromModel(policy *model.PasswordComplexityPolicyView) *PasswordComplexityPolicyView { + return &PasswordComplexityPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + MinLength: policy.MinLength, + HasLowercase: policy.HasLowercase, + HasUppercase: policy.HasUppercase, + HasSymbol: policy.HasSymbol, + HasNumber: policy.HasNumber, + Default: policy.Default, + } +} + +func PasswordComplexityViewToModel(policy *PasswordComplexityPolicyView) *model.PasswordComplexityPolicyView { + return &model.PasswordComplexityPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + MinLength: policy.MinLength, + HasLowercase: policy.HasLowercase, + HasUppercase: policy.HasUppercase, + HasSymbol: policy.HasSymbol, + HasNumber: policy.HasNumber, + Default: policy.Default, + } +} + +func (i *PasswordComplexityPolicyView) AppendEvent(event *models.Event) (err error) { + i.Sequence = event.Sequence + i.ChangeDate = event.CreationDate + switch event.Type { + case es_model.PasswordComplexityPolicyAdded, org_es_model.PasswordComplexityPolicyAdded: + i.setRootData(event) + i.CreationDate = event.CreationDate + err = i.SetData(event) + case es_model.PasswordComplexityPolicyChanged, org_es_model.PasswordComplexityPolicyChanged: + err = i.SetData(event) + } + return err +} + +func (r *PasswordComplexityPolicyView) setRootData(event *models.Event) { + r.AggregateID = event.AggregateID +} + +func (r *PasswordComplexityPolicyView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("EVEN-Dmi9g").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-Hs8uf", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/password_complexity_policy_query.go b/internal/iam/repository/view/model/password_complexity_policy_query.go new file mode 100644 index 0000000000..74b50977d2 --- /dev/null +++ b/internal/iam/repository/view/model/password_complexity_policy_query.go @@ -0,0 +1,59 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type PasswordComplexityPolicySearchRequest iam_model.PasswordComplexityPolicySearchRequest +type PasswordComplexityPolicySearchQuery iam_model.PasswordComplexityPolicySearchQuery +type PasswordComplexityPolicySearchKey iam_model.PasswordComplexityPolicySearchKey + +func (req PasswordComplexityPolicySearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req PasswordComplexityPolicySearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req PasswordComplexityPolicySearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.PasswordComplexityPolicySearchKeyUnspecified { + return nil + } + return PasswordComplexityPolicySearchKey(req.SortingColumn) +} + +func (req PasswordComplexityPolicySearchRequest) GetAsc() bool { + return req.Asc +} + +func (req PasswordComplexityPolicySearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = PasswordComplexityPolicySearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req PasswordComplexityPolicySearchQuery) GetKey() repository.ColumnKey { + return PasswordComplexityPolicySearchKey(req.Key) +} + +func (req PasswordComplexityPolicySearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req PasswordComplexityPolicySearchQuery) GetValue() interface{} { + return req.Value +} + +func (key PasswordComplexityPolicySearchKey) ToColumnName() string { + switch iam_model.PasswordComplexityPolicySearchKey(key) { + case iam_model.PasswordComplexityPolicySearchKeyAggregateID: + return PasswordComplexityKeyAggregateID + default: + return "" + } +} diff --git a/internal/iam/repository/view/model/password_lockout_policy.go b/internal/iam/repository/view/model/password_lockout_policy.go new file mode 100644 index 0000000000..6b73692257 --- /dev/null +++ b/internal/iam/repository/view/model/password_lockout_policy.go @@ -0,0 +1,81 @@ +package model + +import ( + "encoding/json" + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "time" + + es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" +) + +const ( + PasswordLockoutKeyAggregateID = "aggregate_id" +) + +type PasswordLockoutPolicyView struct { + AggregateID string `json:"-" gorm:"column:aggregate_id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:lockout_policy_state"` + + MaxAttempts uint64 `json:"maxAttempts" gorm:"column:max_attempts"` + ShowLockOutFailures bool `json:"showLockOutFailures" gorm:"column:show_lockout_failures"` + Default bool `json:"-" gorm:"-"` + + Sequence uint64 `json:"-" gorm:"column:sequence"` +} + +func PasswordLockoutViewFromModel(policy *model.PasswordLockoutPolicyView) *PasswordLockoutPolicyView { + return &PasswordLockoutPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + MaxAttempts: policy.MaxAttempts, + ShowLockOutFailures: policy.ShowLockOutFailures, + Default: policy.Default, + } +} + +func PasswordLockoutViewToModel(policy *PasswordLockoutPolicyView) *model.PasswordLockoutPolicyView { + return &model.PasswordLockoutPolicyView{ + AggregateID: policy.AggregateID, + Sequence: policy.Sequence, + CreationDate: policy.CreationDate, + ChangeDate: policy.ChangeDate, + MaxAttempts: policy.MaxAttempts, + ShowLockOutFailures: policy.ShowLockOutFailures, + Default: policy.Default, + } +} + +func (i *PasswordLockoutPolicyView) AppendEvent(event *models.Event) (err error) { + i.Sequence = event.Sequence + i.ChangeDate = event.CreationDate + switch event.Type { + case es_model.PasswordLockoutPolicyAdded, org_es_model.PasswordLockoutPolicyAdded: + i.setRootData(event) + i.CreationDate = event.CreationDate + err = i.SetData(event) + case es_model.PasswordLockoutPolicyChanged, org_es_model.PasswordLockoutPolicyChanged: + err = i.SetData(event) + } + return err +} + +func (r *PasswordLockoutPolicyView) setRootData(event *models.Event) { + r.AggregateID = event.AggregateID +} + +func (r *PasswordLockoutPolicyView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("EVEN-gHls0").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-Hs8uf", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/password_lockout_policy_query.go b/internal/iam/repository/view/model/password_lockout_policy_query.go new file mode 100644 index 0000000000..c0c769de95 --- /dev/null +++ b/internal/iam/repository/view/model/password_lockout_policy_query.go @@ -0,0 +1,59 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type PasswordLockoutPolicySearchRequest iam_model.PasswordLockoutPolicySearchRequest +type PasswordLockoutPolicySearchQuery iam_model.PasswordLockoutPolicySearchQuery +type PasswordLockoutPolicySearchKey iam_model.PasswordLockoutPolicySearchKey + +func (req PasswordLockoutPolicySearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req PasswordLockoutPolicySearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req PasswordLockoutPolicySearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.PasswordLockoutPolicySearchKeyUnspecified { + return nil + } + return PasswordLockoutPolicySearchKey(req.SortingColumn) +} + +func (req PasswordLockoutPolicySearchRequest) GetAsc() bool { + return req.Asc +} + +func (req PasswordLockoutPolicySearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = PasswordLockoutPolicySearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req PasswordLockoutPolicySearchQuery) GetKey() repository.ColumnKey { + return PasswordLockoutPolicySearchKey(req.Key) +} + +func (req PasswordLockoutPolicySearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req PasswordLockoutPolicySearchQuery) GetValue() interface{} { + return req.Value +} + +func (key PasswordLockoutPolicySearchKey) ToColumnName() string { + switch iam_model.PasswordLockoutPolicySearchKey(key) { + case iam_model.PasswordLockoutPolicySearchKeyAggregateID: + return PasswordLockoutKeyAggregateID + default: + return "" + } +} diff --git a/internal/iam/repository/view/org_iam_policy_view.go b/internal/iam/repository/view/org_iam_policy_view.go new file mode 100644 index 0000000000..322697ec2f --- /dev/null +++ b/internal/iam/repository/view/org_iam_policy_view.go @@ -0,0 +1,32 @@ +package view + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" +) + +func GetOrgIAMPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.OrgIAMPolicyView, error) { + policy := new(model.OrgIAMPolicyView) + userIDQuery := &model.OrgIAMPolicySearchQuery{Key: iam_model.OrgIAMPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, userIDQuery) + err := query(db, policy) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-5fi9s", "Errors.IAM.OrgIAMPolicy.NotExisting") + } + return policy, err +} + +func PutOrgIAMPolicy(db *gorm.DB, table string, policy *model.OrgIAMPolicyView) error { + save := repository.PrepareSave(table) + return save(db, policy) +} + +func DeleteOrgIAMPolicy(db *gorm.DB, table, aggregateID string) error { + delete := repository.PrepareDeleteByKey(table, model.OrgIAMPolicySearchKey(iam_model.OrgIAMPolicySearchKeyAggregateID), aggregateID) + + return delete(db) +} diff --git a/internal/iam/repository/view/password_age_policy_view.go b/internal/iam/repository/view/password_age_policy_view.go new file mode 100644 index 0000000000..1fbd8c0ca1 --- /dev/null +++ b/internal/iam/repository/view/password_age_policy_view.go @@ -0,0 +1,32 @@ +package view + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" +) + +func GetPasswordAgePolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.PasswordAgePolicyView, error) { + policy := new(model.PasswordAgePolicyView) + userIDQuery := &model.PasswordAgePolicySearchQuery{Key: iam_model.PasswordAgePolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, userIDQuery) + err := query(db, policy) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-Lso0cs", "Errors.IAM.PasswordAgePolicy.NotExisting") + } + return policy, err +} + +func PutPasswordAgePolicy(db *gorm.DB, table string, policy *model.PasswordAgePolicyView) error { + save := repository.PrepareSave(table) + return save(db, policy) +} + +func DeletePasswordAgePolicy(db *gorm.DB, table, aggregateID string) error { + delete := repository.PrepareDeleteByKey(table, model.PasswordAgePolicySearchKey(iam_model.PasswordAgePolicySearchKeyAggregateID), aggregateID) + + return delete(db) +} diff --git a/internal/iam/repository/view/password_complexity_policy_view.go b/internal/iam/repository/view/password_complexity_policy_view.go new file mode 100644 index 0000000000..938c73ff75 --- /dev/null +++ b/internal/iam/repository/view/password_complexity_policy_view.go @@ -0,0 +1,32 @@ +package view + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" +) + +func GetPasswordComplexityPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.PasswordComplexityPolicyView, error) { + policy := new(model.PasswordComplexityPolicyView) + userIDQuery := &model.PasswordComplexityPolicySearchQuery{Key: iam_model.PasswordComplexityPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, userIDQuery) + err := query(db, policy) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-Lso0cs", "Errors.IAM.PasswordComplexityPolicy.NotExisting") + } + return policy, err +} + +func PutPasswordComplexityPolicy(db *gorm.DB, table string, policy *model.PasswordComplexityPolicyView) error { + save := repository.PrepareSave(table) + return save(db, policy) +} + +func DeletePasswordComplexityPolicy(db *gorm.DB, table, aggregateID string) error { + delete := repository.PrepareDeleteByKey(table, model.PasswordComplexityPolicySearchKey(iam_model.PasswordComplexityPolicySearchKeyAggregateID), aggregateID) + + return delete(db) +} diff --git a/internal/iam/repository/view/password_lockout_policy_view.go b/internal/iam/repository/view/password_lockout_policy_view.go new file mode 100644 index 0000000000..74f95204c8 --- /dev/null +++ b/internal/iam/repository/view/password_lockout_policy_view.go @@ -0,0 +1,32 @@ +package view + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" +) + +func GetPasswordLockoutPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.PasswordLockoutPolicyView, error) { + policy := new(model.PasswordLockoutPolicyView) + userIDQuery := &model.PasswordLockoutPolicySearchQuery{Key: iam_model.PasswordLockoutPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, userIDQuery) + err := query(db, policy) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-Lso0cs", "Errors.IAM.PasswordLockoutPolicy.NotExisting") + } + return policy, err +} + +func PutPasswordLockoutPolicy(db *gorm.DB, table string, policy *model.PasswordLockoutPolicyView) error { + save := repository.PrepareSave(table) + return save(db, policy) +} + +func DeletePasswordLockoutPolicy(db *gorm.DB, table, aggregateID string) error { + delete := repository.PrepareDeleteByKey(table, model.PasswordLockoutPolicySearchKey(iam_model.PasswordLockoutPolicySearchKeyAggregateID), aggregateID) + + return delete(db) +} diff --git a/internal/management/repository/eventsourcing/eventstore/org.go b/internal/management/repository/eventsourcing/eventstore/org.go index 2108fabedf..da580eed4d 100644 --- a/internal/management/repository/eventsourcing/eventstore/org.go +++ b/internal/management/repository/eventsourcing/eventstore/org.go @@ -2,25 +2,25 @@ package eventstore import ( "context" + "strings" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/sdk" iam_model "github.com/caos/zitadel/internal/iam/model" iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" iam_view_model "github.com/caos/zitadel/internal/iam/repository/view/model" - usr_model "github.com/caos/zitadel/internal/user/model" - "strings" - - "github.com/caos/zitadel/internal/api/authz" - "github.com/caos/zitadel/internal/errors" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/eventstore/sdk" mgmt_view "github.com/caos/zitadel/internal/management/repository/eventsourcing/view" global_model "github.com/caos/zitadel/internal/model" org_model "github.com/caos/zitadel/internal/org/model" org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" "github.com/caos/zitadel/internal/org/repository/view/model" + usr_model "github.com/caos/zitadel/internal/user/model" usr_es "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) @@ -86,8 +86,19 @@ func (repo *OrgRepository) ReactivateOrg(ctx context.Context, id string) (*org_m return repo.OrgEventstore.ReactivateOrg(ctx, id) } -func (repo *OrgRepository) GetMyOrgIamPolicy(ctx context.Context) (*org_model.OrgIAMPolicy, error) { - return repo.OrgEventstore.GetOrgIAMPolicy(ctx, authz.GetCtxData(ctx).OrgID) +func (repo *OrgRepository) GetMyOrgIamPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) { + policy, err := repo.View.OrgIAMPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.OrgIAMViewToModel(policy), err } func (repo *OrgRepository) SearchMyOrgDomains(ctx context.Context, request *org_model.OrgDomainSearchRequest) (*org_model.OrgDomainSearchResponse, error) { @@ -291,6 +302,31 @@ func (repo *OrgRepository) SearchIDPConfigs(ctx context.Context, request *iam_mo return result, nil } +func (repo *OrgRepository) GetLabelPolicy(ctx context.Context) (*iam_model.LabelPolicyView, error) { + policy, err := repo.View.LabelPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.LabelPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.LabelPolicyViewToModel(policy), err +} + +func (repo *OrgRepository) AddLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.AddLabelPolicy(ctx, policy) +} + +func (repo *OrgRepository) ChangeLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.ChangeLabelPolicy(ctx, policy) +} + func (repo *OrgRepository) GetLoginPolicy(ctx context.Context) (*iam_model.LoginPolicyView, error) { policy, err := repo.View.LoginPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) if errors.IsNotFound(err) { @@ -306,6 +342,15 @@ func (repo *OrgRepository) GetLoginPolicy(ctx context.Context) (*iam_model.Login return iam_es_model.LoginPolicyViewToModel(policy), err } +func (repo *OrgRepository) GetDefaultLoginPolicy(ctx context.Context) (*iam_model.LoginPolicyView, error) { + policy, err := repo.View.LoginPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + return iam_es_model.LoginPolicyViewToModel(policy), err +} + func (repo *OrgRepository) AddLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*iam_model.LoginPolicy, error) { policy.AggregateID = authz.GetCtxData(ctx).OrgID return repo.OrgEventstore.AddLoginPolicy(ctx, policy) @@ -380,3 +425,126 @@ func (repo *OrgRepository) RemoveIDPProviderFromIdpProvider(ctx context.Context, } return sdk.PushAggregates(ctx, repo.Eventstore.PushAggregates, nil, aggregates...) } + +func (repo *OrgRepository) GetPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) { + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.PasswordComplexityViewToModel(policy), err +} + +func (repo *OrgRepository) GetDefaultPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) { + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + return iam_es_model.PasswordComplexityViewToModel(policy), err +} + +func (repo *OrgRepository) AddPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.AddPasswordComplexityPolicy(ctx, policy) +} + +func (repo *OrgRepository) ChangePasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.ChangePasswordComplexityPolicy(ctx, policy) +} + +func (repo *OrgRepository) RemovePasswordComplexityPolicy(ctx context.Context) error { + policy := &iam_model.PasswordComplexityPolicy{ObjectRoot: models.ObjectRoot{ + AggregateID: authz.GetCtxData(ctx).OrgID, + }} + return repo.OrgEventstore.RemovePasswordComplexityPolicy(ctx, policy) +} + +func (repo *OrgRepository) GetPasswordAgePolicy(ctx context.Context) (*iam_model.PasswordAgePolicyView, error) { + policy, err := repo.View.PasswordAgePolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordAgePolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.PasswordAgeViewToModel(policy), err +} + +func (repo *OrgRepository) GetDefaultPasswordAgePolicy(ctx context.Context) (*iam_model.PasswordAgePolicyView, error) { + policy, err := repo.View.PasswordAgePolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + return iam_es_model.PasswordAgeViewToModel(policy), err +} + +func (repo *OrgRepository) AddPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.AddPasswordAgePolicy(ctx, policy) +} + +func (repo *OrgRepository) ChangePasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.ChangePasswordAgePolicy(ctx, policy) +} + +func (repo *OrgRepository) RemovePasswordAgePolicy(ctx context.Context) error { + policy := &iam_model.PasswordAgePolicy{ObjectRoot: models.ObjectRoot{ + AggregateID: authz.GetCtxData(ctx).OrgID, + }} + return repo.OrgEventstore.RemovePasswordAgePolicy(ctx, policy) +} + +func (repo *OrgRepository) GetPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) { + policy, err := repo.View.PasswordLockoutPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + policy, err = repo.View.PasswordLockoutPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.PasswordLockoutViewToModel(policy), err +} + +func (repo *OrgRepository) GetDefaultPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) { + policy, err := repo.View.PasswordLockoutPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + policy.Default = true + return iam_es_model.PasswordLockoutViewToModel(policy), err +} + +func (repo *OrgRepository) AddPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.AddPasswordLockoutPolicy(ctx, policy) +} + +func (repo *OrgRepository) ChangePasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + policy.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.ChangePasswordLockoutPolicy(ctx, policy) +} + +func (repo *OrgRepository) RemovePasswordLockoutPolicy(ctx context.Context) error { + policy := &iam_model.PasswordLockoutPolicy{ObjectRoot: models.ObjectRoot{ + AggregateID: authz.GetCtxData(ctx).OrgID, + }} + return repo.OrgEventstore.RemovePasswordLockoutPolicy(ctx, policy) +} diff --git a/internal/management/repository/eventsourcing/eventstore/policy.go b/internal/management/repository/eventsourcing/eventstore/policy.go deleted file mode 100644 index dee516fe59..0000000000 --- a/internal/management/repository/eventsourcing/eventstore/policy.go +++ /dev/null @@ -1,48 +0,0 @@ -package eventstore - -import ( - "context" - - "github.com/caos/zitadel/internal/api/authz" - pol_model "github.com/caos/zitadel/internal/policy/model" - pol_event "github.com/caos/zitadel/internal/policy/repository/eventsourcing" -) - -type PolicyRepo struct { - PolicyEvents *pol_event.PolicyEventstore - //view *view.View -} - -func (repo *PolicyRepo) CreatePasswordComplexityPolicy(ctx context.Context, policy *pol_model.PasswordComplexityPolicy) (*pol_model.PasswordComplexityPolicy, error) { - return repo.PolicyEvents.CreatePasswordComplexityPolicy(ctx, policy) -} -func (repo *PolicyRepo) GetPasswordComplexityPolicy(ctx context.Context) (*pol_model.PasswordComplexityPolicy, error) { - ctxData := authz.GetCtxData(ctx) - return repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, ctxData.OrgID) -} -func (repo *PolicyRepo) GetDefaultPasswordComplexityPolicy(ctx context.Context) (*pol_model.PasswordComplexityPolicy, error) { - return repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, "0") -} -func (repo *PolicyRepo) UpdatePasswordComplexityPolicy(ctx context.Context, policy *pol_model.PasswordComplexityPolicy) (*pol_model.PasswordComplexityPolicy, error) { - return repo.PolicyEvents.UpdatePasswordComplexityPolicy(ctx, policy) -} -func (repo *PolicyRepo) CreatePasswordAgePolicy(ctx context.Context, policy *pol_model.PasswordAgePolicy) (*pol_model.PasswordAgePolicy, error) { - return repo.PolicyEvents.CreatePasswordAgePolicy(ctx, policy) -} -func (repo *PolicyRepo) GetPasswordAgePolicy(ctx context.Context) (*pol_model.PasswordAgePolicy, error) { - ctxData := authz.GetCtxData(ctx) - return repo.PolicyEvents.GetPasswordAgePolicy(ctx, ctxData.OrgID) -} -func (repo *PolicyRepo) UpdatePasswordAgePolicy(ctx context.Context, policy *pol_model.PasswordAgePolicy) (*pol_model.PasswordAgePolicy, error) { - return repo.PolicyEvents.UpdatePasswordAgePolicy(ctx, policy) -} -func (repo *PolicyRepo) CreatePasswordLockoutPolicy(ctx context.Context, policy *pol_model.PasswordLockoutPolicy) (*pol_model.PasswordLockoutPolicy, error) { - return repo.PolicyEvents.CreatePasswordLockoutPolicy(ctx, policy) -} -func (repo *PolicyRepo) GetPasswordLockoutPolicy(ctx context.Context) (*pol_model.PasswordLockoutPolicy, error) { - ctxData := authz.GetCtxData(ctx) - return repo.PolicyEvents.GetPasswordLockoutPolicy(ctx, ctxData.OrgID) -} -func (repo *PolicyRepo) UpdatePasswordLockoutPolicy(ctx context.Context, policy *pol_model.PasswordLockoutPolicy) (*pol_model.PasswordLockoutPolicy, error) { - return repo.PolicyEvents.UpdatePasswordLockoutPolicy(ctx, policy) -} diff --git a/internal/management/repository/eventsourcing/eventstore/project.go b/internal/management/repository/eventsourcing/eventstore/project.go index 096927bf3b..b79d1ed692 100644 --- a/internal/management/repository/eventsourcing/eventstore/project.go +++ b/internal/management/repository/eventsourcing/eventstore/project.go @@ -62,17 +62,18 @@ func (repo *ProjectRepo) ProjectByID(ctx context.Context, id string) (*proj_mode return model.ProjectToModel(&viewProject), nil } } - + if viewProject.State == int32(proj_model.ProjectStateRemoved) { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-3Mo0s", "Errors.Project.NotFound") + } return model.ProjectToModel(project), nil } -func (repo *ProjectRepo) CreateProject(ctx context.Context, name string) (*proj_model.Project, error) { +func (repo *ProjectRepo) CreateProject(ctx context.Context, project *proj_model.Project) (*proj_model.Project, error) { ctxData := authz.GetCtxData(ctx) iam, err := repo.IAMEvents.IAMByID(ctx, repo.IAMID) if err != nil { return nil, err } - project := &proj_model.Project{Name: name} return repo.ProjectEvents.CreateProject(ctx, project, iam.GlobalOrgID == ctxData.OrgID) } diff --git a/internal/management/repository/eventsourcing/eventstore/user.go b/internal/management/repository/eventsourcing/eventstore/user.go index 6dc41cb564..335b8ab02f 100644 --- a/internal/management/repository/eventsourcing/eventstore/user.go +++ b/internal/management/repository/eventsourcing/eventstore/user.go @@ -2,6 +2,11 @@ package eventstore import ( "context" + es_int "github.com/caos/zitadel/internal/eventstore" + es_models "github.com/caos/zitadel/internal/eventstore/models" + es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" + usr_grant_event "github.com/caos/zitadel/internal/usergrant/repository/eventsourcing" "github.com/caos/logging" "github.com/caos/zitadel/internal/api/authz" @@ -11,7 +16,6 @@ import ( "github.com/caos/zitadel/internal/management/repository/eventsourcing/view" global_model "github.com/caos/zitadel/internal/model" org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" - policy_event "github.com/caos/zitadel/internal/policy/repository/eventsourcing" usr_model "github.com/caos/zitadel/internal/user/model" usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" "github.com/caos/zitadel/internal/user/repository/view/model" @@ -19,12 +23,13 @@ import ( ) type UserRepo struct { - SearchLimit uint64 - UserEvents *usr_event.UserEventstore - PolicyEvents *policy_event.PolicyEventstore - OrgEvents *org_event.OrgEventstore - View *view.View - SystemDefaults systemdefaults.SystemDefaults + es_int.Eventstore + SearchLimit uint64 + UserEvents *usr_event.UserEventstore + OrgEvents *org_event.OrgEventstore + UserGrantEvents *usr_grant_event.UserGrantEventStore + View *view.View + SystemDefaults systemdefaults.SystemDefaults } func (repo *UserRepo) UserByID(ctx context.Context, id string) (*usr_model.UserView, error) { @@ -49,19 +54,30 @@ func (repo *UserRepo) UserByID(ctx context.Context, id string) (*usr_model.UserV return model.UserToModel(user), nil } } + if userCopy.State == int32(usr_model.UserStateDeleted) { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-4Fm9s", "Errors.User.NotFound") + } return model.UserToModel(&userCopy), nil } func (repo *UserRepo) CreateUser(ctx context.Context, user *usr_model.User) (*usr_model.User, error) { - pwPolicy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, authz.GetCtxData(ctx).OrgID) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if err != nil && caos_errs.IsNotFound(err) { + pwPolicy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, authz.GetCtxData(ctx).OrgID) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(pwPolicy) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if err != nil && errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - return repo.UserEvents.CreateUser(ctx, user, pwPolicy, orgPolicy) + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + return repo.UserEvents.CreateUser(ctx, user, pwPolicyView, orgPolicyView) } func (repo *UserRepo) RegisterUser(ctx context.Context, user *usr_model.User, resourceOwner string) (*usr_model.User, error) { @@ -69,15 +85,23 @@ func (repo *UserRepo) RegisterUser(ctx context.Context, user *usr_model.User, re if resourceOwner != "" { policyResourceOwner = resourceOwner } - pwPolicy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, policyResourceOwner) + pwPolicy, err := repo.View.PasswordComplexityPolicyByAggregateID(policyResourceOwner) + if err != nil && caos_errs.IsNotFound(err) { + pwPolicy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, authz.GetCtxData(ctx).OrgID) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(pwPolicy) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if err != nil && errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - return repo.UserEvents.RegisterUser(ctx, user, pwPolicy, orgPolicy, resourceOwner) + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + return repo.UserEvents.RegisterUser(ctx, user, pwPolicyView, orgPolicyView, resourceOwner) } func (repo *UserRepo) DeactivateUser(ctx context.Context, id string) (*usr_model.User, error) { @@ -96,6 +120,40 @@ func (repo *UserRepo) UnlockUser(ctx context.Context, id string) (*usr_model.Use return repo.UserEvents.UnlockUser(ctx, id) } +func (repo *UserRepo) RemoveUser(ctx context.Context, id string) error { + aggregates := make([]*es_models.Aggregate, 0) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if err != nil && errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } + if err != nil { + return err + } + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + user, agg, err := repo.UserEvents.PrepareRemoveUser(ctx, id, orgPolicyView) + if err != nil { + return err + } + aggregates = append(aggregates, agg...) + + // remove user_grants + usergrants, err := repo.View.UserGrantsByUserID(id) + if err != nil { + return err + } + for _, grant := range usergrants { + _, aggs, err := repo.UserGrantEvents.PrepareRemoveUserGrant(ctx, grant.ID, true) + if err != nil { + return err + } + for _, agg := range aggs { + aggregates = append(aggregates, agg) + } + } + + return es_sdk.PushAggregates(ctx, repo.Eventstore.PushAggregates, user.AppendEvents, aggregates...) +} + func (repo *UserRepo) SearchUsers(ctx context.Context, request *usr_model.UserSearchRequest) (*usr_model.UserSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) sequence, sequenceErr := repo.View.GetLatestUserSequence() @@ -107,7 +165,7 @@ func (repo *UserRepo) SearchUsers(ctx context.Context, request *usr_model.UserSe result := &usr_model.UserSearchResponse{ Offset: request.Offset, Limit: request.Limit, - TotalResult: uint64(count), + TotalResult: count, Result: model.UsersToModel(users), } if sequenceErr == nil { @@ -159,11 +217,15 @@ func (repo *UserRepo) UserMfas(ctx context.Context, userID string) ([]*usr_model } func (repo *UserRepo) SetOneTimePassword(ctx context.Context, password *usr_model.Password) (*usr_model.Password, error) { - policy, err := repo.PolicyEvents.GetPasswordComplexityPolicy(ctx, authz.GetCtxData(ctx).OrgID) + policy, err := repo.View.PasswordComplexityPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if err != nil && caos_errs.IsNotFound(err) { + policy, err = repo.View.PasswordComplexityPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return nil, err } - return repo.UserEvents.SetOneTimePassword(ctx, policy, password) + pwPolicyView := iam_es_model.PasswordComplexityViewToModel(policy) + return repo.UserEvents.SetOneTimePassword(ctx, pwPolicyView, password) } func (repo *UserRepo) RequestSetPassword(ctx context.Context, id string, notifyType usr_model.NotificationType) error { @@ -252,11 +314,15 @@ func (repo *UserRepo) ChangeProfile(ctx context.Context, profile *usr_model.Prof } func (repo *UserRepo) ChangeUsername(ctx context.Context, userID, userName string) error { - orgPolicy, err := repo.OrgEvents.GetOrgIAMPolicy(ctx, authz.GetCtxData(ctx).OrgID) + orgPolicy, err := repo.View.OrgIAMPolicyByAggregateID(authz.GetCtxData(ctx).OrgID) + if err != nil && errors.IsNotFound(err) { + orgPolicy, err = repo.View.OrgIAMPolicyByAggregateID(repo.SystemDefaults.IamID) + } if err != nil { return err } - return repo.UserEvents.ChangeUsername(ctx, userID, userName, orgPolicy) + orgPolicyView := iam_es_model.OrgIAMViewToModel(orgPolicy) + return repo.UserEvents.ChangeUsername(ctx, userID, userName, orgPolicyView) } func (repo *UserRepo) EmailByID(ctx context.Context, userID string) (*usr_model.Email, error) { diff --git a/internal/management/repository/eventsourcing/handler/application.go b/internal/management/repository/eventsourcing/handler/application.go index 01673abdb9..4395737197 100644 --- a/internal/management/repository/eventsourcing/handler/application.go +++ b/internal/management/repository/eventsourcing/handler/application.go @@ -1,6 +1,8 @@ package handler import ( + "context" + "github.com/caos/logging" "github.com/caos/zitadel/internal/eventstore/models" @@ -20,22 +22,29 @@ const ( applicationTable = "management.applications" ) -func (p *Application) ViewModel() string { +func (a *Application) ViewModel() string { return applicationTable } -func (p *Application) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestApplicationSequence() +func (a *Application) EventQuery() (*models.SearchQuery, error) { + sequence, err := a.view.GetLatestApplicationSequence() if err != nil { return nil, err } return eventsourcing.ProjectQuery(sequence.CurrentSequence), nil } -func (p *Application) Reduce(event *models.Event) (err error) { +func (a *Application) Reduce(event *models.Event) (err error) { app := new(view_model.ApplicationView) switch event.Type { case es_model.ApplicationAdded: + project, err := a.projectEvents.ProjectByID(context.Background(), event.AggregateID) + if err != nil { + return err + } + app.ProjectRoleCheck = project.ProjectRoleCheck + app.ProjectRoleAssertion = project.ProjectRoleAssertion + err = app.AppendEvent(event) case es_model.ApplicationChanged, es_model.OIDCConfigAdded, @@ -46,7 +55,7 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - app, err = p.view.ApplicationByID(event.AggregateID, app.ID) + app, err = a.view.ApplicationByID(event.AggregateID, app.ID) if err != nil { return err } @@ -56,19 +65,33 @@ func (p *Application) Reduce(event *models.Event) (err error) { if err != nil { return err } - return p.view.DeleteApplication(app.ID, event.Sequence) + return a.view.DeleteApplication(app.ID, event.Sequence) + case es_model.ProjectChanged: + apps, err := a.view.ApplicationsByProjectID(event.AggregateID) + if err != nil { + return err + } + if len(apps) == 0 { + return a.view.ProcessedApplicationSequence(event.Sequence) + } + for _, app := range apps { + if err := app.AppendEvent(event); err != nil { + return err + } + } + return a.view.PutApplications(apps, event.Sequence) case es_model.ProjectRemoved: - return p.view.DeleteApplicationsByProjectID(event.AggregateID) + return a.view.DeleteApplicationsByProjectID(event.AggregateID) default: - return p.view.ProcessedApplicationSequence(event.Sequence) + return a.view.ProcessedApplicationSequence(event.Sequence) } if err != nil { return err } - return p.view.PutApplication(app) + return a.view.PutApplication(app) } -func (p *Application) OnError(event *models.Event, spoolerError error) error { +func (a *Application) OnError(event *models.Event, spoolerError error) error { logging.LogWithFields("SPOOL-ls9ew", "id", event.AggregateID).WithError(spoolerError).Warn("something went wrong in project app handler") - return spooler.HandleError(event, spoolerError, p.view.GetLatestApplicationFailedEvent, p.view.ProcessedApplicationFailedEvent, p.view.ProcessedApplicationSequence, p.errorCountUntilSkip) + return spooler.HandleError(event, spoolerError, a.view.GetLatestApplicationFailedEvent, a.view.ProcessedApplicationFailedEvent, a.view.ProcessedApplicationSequence, a.errorCountUntilSkip) } diff --git a/internal/management/repository/eventsourcing/handler/handler.go b/internal/management/repository/eventsourcing/handler/handler.go index 8b34cfe490..531a9db468 100644 --- a/internal/management/repository/eventsourcing/handler/handler.go +++ b/internal/management/repository/eventsourcing/handler/handler.go @@ -36,23 +36,40 @@ type EventstoreRepos struct { func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, eventstore eventstore.Eventstore, repos EventstoreRepos, defaults systemdefaults.SystemDefaults) []query.Handler { return []query.Handler{ - &Project{handler: handler{view, bulkLimit, configs.cycleDuration("Project"), errorCount}, eventstore: eventstore}, - &ProjectGrant{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectGrant"), errorCount}, eventstore: eventstore, projectEvents: repos.ProjectEvents, orgEvents: repos.OrgEvents}, - &ProjectRole{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectRole"), errorCount}, projectEvents: repos.ProjectEvents}, - &ProjectMember{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectMember"), errorCount}, userEvents: repos.UserEvents}, - &ProjectGrantMember{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectGrantMember"), errorCount}, userEvents: repos.UserEvents}, - &Application{handler: handler{view, bulkLimit, configs.cycleDuration("Application"), errorCount}, projectEvents: repos.ProjectEvents}, - &User{handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, eventstore: eventstore, orgEvents: repos.OrgEvents}, - &UserGrant{handler: handler{view, bulkLimit, configs.cycleDuration("UserGrant"), errorCount}, projectEvents: repos.ProjectEvents, userEvents: repos.UserEvents, orgEvents: repos.OrgEvents}, + &Project{handler: handler{view, bulkLimit, configs.cycleDuration("Project"), errorCount}, + eventstore: eventstore}, + &ProjectGrant{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectGrant"), errorCount}, + eventstore: eventstore, projectEvents: repos.ProjectEvents, orgEvents: repos.OrgEvents}, + &ProjectRole{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectRole"), errorCount}, + projectEvents: repos.ProjectEvents}, + &ProjectMember{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectMember"), errorCount}, + userEvents: repos.UserEvents}, + &ProjectGrantMember{handler: handler{view, bulkLimit, configs.cycleDuration("ProjectGrantMember"), errorCount}, + userEvents: repos.UserEvents}, + &Application{handler: handler{view, bulkLimit, configs.cycleDuration("Application"), errorCount}, + projectEvents: repos.ProjectEvents}, + &User{handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, + eventstore: eventstore, orgEvents: repos.OrgEvents, iamEvents: repos.IamEvents, iamID: defaults.IamID}, + &UserGrant{handler: handler{view, bulkLimit, configs.cycleDuration("UserGrant"), errorCount}, + projectEvents: repos.ProjectEvents, userEvents: repos.UserEvents, orgEvents: repos.OrgEvents}, &Org{handler: handler{view, bulkLimit, configs.cycleDuration("Org"), errorCount}}, - &OrgMember{handler: handler{view, bulkLimit, configs.cycleDuration("OrgMember"), errorCount}, userEvents: repos.UserEvents}, + &OrgMember{handler: handler{view, bulkLimit, configs.cycleDuration("OrgMember"), errorCount}, + userEvents: repos.UserEvents}, &OrgDomain{handler: handler{view, bulkLimit, configs.cycleDuration("OrgDomain"), errorCount}}, - &UserMembership{handler: handler{view, bulkLimit, configs.cycleDuration("UserMembership"), errorCount}, orgEvents: repos.OrgEvents, projectEvents: repos.ProjectEvents}, + &UserMembership{handler: handler{view, bulkLimit, configs.cycleDuration("UserMembership"), errorCount}, + orgEvents: repos.OrgEvents, projectEvents: repos.ProjectEvents}, &MachineKeys{handler: handler{view, bulkLimit, configs.cycleDuration("MachineKeys"), errorCount}}, &IDPConfig{handler: handler{view, bulkLimit, configs.cycleDuration("IDPConfig"), errorCount}}, &LoginPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("LoginPolicy"), errorCount}}, - &IDPProvider{handler: handler{view, bulkLimit, configs.cycleDuration("IDPProvider"), errorCount}, systemDefaults: defaults, iamEvents: repos.IamEvents, orgEvents: repos.OrgEvents}, - &ExternalIDP{handler: handler{view, bulkLimit, configs.cycleDuration("ExternalIDP"), errorCount}, systemDefaults: defaults, iamEvents: repos.IamEvents, orgEvents: repos.OrgEvents}, + &LabelPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("LabelPolicy"), errorCount}}, + &IDPProvider{handler: handler{view, bulkLimit, configs.cycleDuration("IDPProvider"), errorCount}, + systemDefaults: defaults, iamEvents: repos.IamEvents, orgEvents: repos.OrgEvents}, + &ExternalIDP{handler: handler{view, bulkLimit, configs.cycleDuration("ExternalIDP"), errorCount}, + systemDefaults: defaults, iamEvents: repos.IamEvents, orgEvents: repos.OrgEvents}, + &PasswordComplexityPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("PasswordComplexityPolicy"), errorCount}}, + &PasswordAgePolicy{handler: handler{view, bulkLimit, configs.cycleDuration("PasswordAgePolicy"), errorCount}}, + &PasswordLockoutPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("PasswordLockoutPolicy"), errorCount}}, + &OrgIAMPolicy{handler: handler{view, bulkLimit, configs.cycleDuration("OrgIAMPolicy"), errorCount}}, } } diff --git a/internal/management/repository/eventsourcing/handler/idp_providers.go b/internal/management/repository/eventsourcing/handler/idp_providers.go index e0bd37ae75..56e8fbc7d2 100644 --- a/internal/management/repository/eventsourcing/handler/idp_providers.go +++ b/internal/management/repository/eventsourcing/handler/idp_providers.go @@ -66,16 +66,21 @@ func (m *IDPProvider) processIdpProvider(event *models.Event) (err error) { } return m.view.DeleteIdpProvider(event.AggregateID, provider.IDPConfigID, event.Sequence) case model.IDPConfigChanged, org_es_model.IDPConfigChanged: - config := new(iam_model.IDPConfig) - config.AppendEvent(event) - providers, err := m.view.IdpProvidersByIdpConfigID(event.AggregateID, config.IDPConfigID) + esConfig := new(iam_view_model.IDPConfigView) + providerType := iam_model.IDPProviderTypeSystem + if event.AggregateID != m.systemDefaults.IamID { + providerType = iam_model.IDPProviderTypeOrg + } + esConfig.AppendEvent(providerType, event) + providers, err := m.view.IdpProvidersByIdpConfigID(event.AggregateID, esConfig.IDPConfigID) if err != nil { return err } - if provider.IDPProviderType == int32(iam_model.IDPProviderTypeSystem) { - config, err = m.iamEvents.GetIDPConfig(context.Background(), provider.AggregateID, config.IDPConfigID) + config := new(iam_model.IDPConfig) + if event.AggregateID == m.systemDefaults.IamID { + config, err = m.iamEvents.GetIDPConfig(context.Background(), event.AggregateID, esConfig.IDPConfigID) } else { - config, err = m.orgEvents.GetIDPConfig(context.Background(), provider.AggregateID, provider.IDPConfigID) + config, err = m.orgEvents.GetIDPConfig(context.Background(), event.AggregateID, esConfig.IDPConfigID) } if err != nil { return err @@ -111,6 +116,7 @@ func (m *IDPProvider) fillData(provider *iam_view_model.IDPProviderView) (err er func (m *IDPProvider) fillConfigData(provider *iam_view_model.IDPProviderView, config *iam_model.IDPConfig) { provider.Name = config.Name + provider.StylingType = int32(config.StylingType) provider.IDPConfigType = int32(config.Type) provider.IDPState = int32(config.State) } diff --git a/internal/management/repository/eventsourcing/handler/label_policy.go b/internal/management/repository/eventsourcing/handler/label_policy.go new file mode 100644 index 0000000000..8c3238159f --- /dev/null +++ b/internal/management/repository/eventsourcing/handler/label_policy.go @@ -0,0 +1,67 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type LabelPolicy struct { + handler +} + +const ( + labelPolicyTable = "management.label_policies" +) + +func (m *LabelPolicy) ViewModel() string { + return labelPolicyTable +} + +func (m *LabelPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestLabelPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *LabelPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processLabelPolicy(event) + } + return err +} + +func (m *LabelPolicy) processLabelPolicy(event *models.Event) (err error) { + policy := new(iam_model.LabelPolicyView) + switch event.Type { + case iam_es_model.LabelPolicyAdded, model.LabelPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.LabelPolicyChanged, model.LabelPolicyChanged: + policy, err = m.view.LabelPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + default: + return m.view.ProcessedLabelPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutLabelPolicy(policy, policy.Sequence) +} + +func (m *LabelPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-4Djo9", "id", event.AggregateID).WithError(err).Warn("something went wrong in label policy handler") + return spooler.HandleError(event, err, m.view.GetLatestLabelPolicyFailedEvent, m.view.ProcessedLabelPolicyFailedEvent, m.view.ProcessedLabelPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/management/repository/eventsourcing/handler/login_policy.go b/internal/management/repository/eventsourcing/handler/login_policy.go index 6a2ae339ed..464a867b2b 100644 --- a/internal/management/repository/eventsourcing/handler/login_policy.go +++ b/internal/management/repository/eventsourcing/handler/login_policy.go @@ -52,6 +52,8 @@ func (m *LoginPolicy) processLoginPolicy(event *models.Event) (err error) { return err } err = policy.AppendEvent(event) + case model.LoginPolicyRemoved: + return m.view.DeleteLoginPolicy(event.AggregateID, event.Sequence) default: return m.view.ProcessedLoginPolicySequence(event.Sequence) } diff --git a/internal/management/repository/eventsourcing/handler/org_iam_policy.go b/internal/management/repository/eventsourcing/handler/org_iam_policy.go new file mode 100644 index 0000000000..7b0b8860ca --- /dev/null +++ b/internal/management/repository/eventsourcing/handler/org_iam_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type OrgIAMPolicy struct { + handler +} + +const ( + orgIAMPolicyTable = "management.org_iam_policies" +) + +func (m *OrgIAMPolicy) ViewModel() string { + return orgIAMPolicyTable +} + +func (m *OrgIAMPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestOrgIAMPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *OrgIAMPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processOrgIAMPolicy(event) + } + return err +} + +func (m *OrgIAMPolicy) processOrgIAMPolicy(event *models.Event) (err error) { + policy := new(iam_model.OrgIAMPolicyView) + switch event.Type { + case iam_es_model.OrgIAMPolicyAdded, model.OrgIAMPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.OrgIAMPolicyChanged, model.OrgIAMPolicyChanged: + policy, err = m.view.OrgIAMPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.OrgIAMPolicyRemoved: + return m.view.DeleteOrgIAMPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedOrgIAMPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutOrgIAMPolicy(policy, policy.Sequence) +} + +func (m *OrgIAMPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-3Gf9s", "id", event.AggregateID).WithError(err).Warn("something went wrong in orgIAM policy handler") + return spooler.HandleError(event, err, m.view.GetLatestOrgIAMPolicyFailedEvent, m.view.ProcessedOrgIAMPolicyFailedEvent, m.view.ProcessedOrgIAMPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/management/repository/eventsourcing/handler/org_member.go b/internal/management/repository/eventsourcing/handler/org_member.go index 61e8816ca5..c238c2363a 100644 --- a/internal/management/repository/eventsourcing/handler/org_member.go +++ b/internal/management/repository/eventsourcing/handler/org_member.go @@ -104,6 +104,8 @@ func (m *OrgMember) processUser(event *models.Event) (err error) { m.fillUserData(member, user) } return m.view.PutOrgMembers(members, event.Sequence) + case usr_es_model.UserRemoved: + return m.view.DeleteOrgMembersByUserID(event.AggregateID, event.Sequence) default: return m.view.ProcessedOrgMemberSequence(event.Sequence) } diff --git a/internal/management/repository/eventsourcing/handler/password_age_policy.go b/internal/management/repository/eventsourcing/handler/password_age_policy.go new file mode 100644 index 0000000000..ccbb1c85f9 --- /dev/null +++ b/internal/management/repository/eventsourcing/handler/password_age_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type PasswordAgePolicy struct { + handler +} + +const ( + passwordAgePolicyTable = "management.password_age_policies" +) + +func (m *PasswordAgePolicy) ViewModel() string { + return passwordAgePolicyTable +} + +func (m *PasswordAgePolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestPasswordAgePolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *PasswordAgePolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processPasswordAgePolicy(event) + } + return err +} + +func (m *PasswordAgePolicy) processPasswordAgePolicy(event *models.Event) (err error) { + policy := new(iam_model.PasswordAgePolicyView) + switch event.Type { + case iam_es_model.PasswordAgePolicyAdded, model.PasswordAgePolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.PasswordAgePolicyChanged, model.PasswordAgePolicyChanged: + policy, err = m.view.PasswordAgePolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.PasswordAgePolicyRemoved: + return m.view.DeletePasswordAgePolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedPasswordAgePolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutPasswordAgePolicy(policy, policy.Sequence) +} + +func (m *PasswordAgePolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-Bs89f", "id", event.AggregateID).WithError(err).Warn("something went wrong in passwordAge policy handler") + return spooler.HandleError(event, err, m.view.GetLatestPasswordAgePolicyFailedEvent, m.view.ProcessedPasswordAgePolicyFailedEvent, m.view.ProcessedPasswordAgePolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/management/repository/eventsourcing/handler/password_complexity_policy.go b/internal/management/repository/eventsourcing/handler/password_complexity_policy.go new file mode 100644 index 0000000000..61020657e4 --- /dev/null +++ b/internal/management/repository/eventsourcing/handler/password_complexity_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type PasswordComplexityPolicy struct { + handler +} + +const ( + passwordComplexityPolicyTable = "management.password_complexity_policies" +) + +func (m *PasswordComplexityPolicy) ViewModel() string { + return passwordComplexityPolicyTable +} + +func (m *PasswordComplexityPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestPasswordComplexityPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *PasswordComplexityPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processPasswordComplexityPolicy(event) + } + return err +} + +func (m *PasswordComplexityPolicy) processPasswordComplexityPolicy(event *models.Event) (err error) { + policy := new(iam_model.PasswordComplexityPolicyView) + switch event.Type { + case iam_es_model.PasswordComplexityPolicyAdded, model.PasswordComplexityPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.PasswordComplexityPolicyChanged, model.PasswordComplexityPolicyChanged: + policy, err = m.view.PasswordComplexityPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.PasswordComplexityPolicyRemoved: + return m.view.DeletePasswordComplexityPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedPasswordComplexityPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutPasswordComplexityPolicy(policy, policy.Sequence) +} + +func (m *PasswordComplexityPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-4Djo9", "id", event.AggregateID).WithError(err).Warn("something went wrong in passwordComplexity policy handler") + return spooler.HandleError(event, err, m.view.GetLatestPasswordComplexityPolicyFailedEvent, m.view.ProcessedPasswordComplexityPolicyFailedEvent, m.view.ProcessedPasswordComplexityPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/management/repository/eventsourcing/handler/password_lockout_policy.go b/internal/management/repository/eventsourcing/handler/password_lockout_policy.go new file mode 100644 index 0000000000..0c0f1b93c0 --- /dev/null +++ b/internal/management/repository/eventsourcing/handler/password_lockout_policy.go @@ -0,0 +1,69 @@ +package handler + +import ( + "github.com/caos/logging" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type PasswordLockoutPolicy struct { + handler +} + +const ( + passwordLockoutPolicyTable = "management.password_lockout_policies" +) + +func (m *PasswordLockoutPolicy) ViewModel() string { + return passwordLockoutPolicyTable +} + +func (m *PasswordLockoutPolicy) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestPasswordLockoutPolicySequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate, iam_es_model.IAMAggregate). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *PasswordLockoutPolicy) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processPasswordLockoutPolicy(event) + } + return err +} + +func (m *PasswordLockoutPolicy) processPasswordLockoutPolicy(event *models.Event) (err error) { + policy := new(iam_model.PasswordLockoutPolicyView) + switch event.Type { + case iam_es_model.PasswordLockoutPolicyAdded, model.PasswordLockoutPolicyAdded: + err = policy.AppendEvent(event) + case iam_es_model.PasswordLockoutPolicyChanged, model.PasswordLockoutPolicyChanged: + policy, err = m.view.PasswordLockoutPolicyByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = policy.AppendEvent(event) + case model.PasswordLockoutPolicyRemoved: + return m.view.DeletePasswordLockoutPolicy(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedPasswordLockoutPolicySequence(event.Sequence) + } + if err != nil { + return err + } + return m.view.PutPasswordLockoutPolicy(policy, policy.Sequence) +} + +func (m *PasswordLockoutPolicy) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-Bms8f", "id", event.AggregateID).WithError(err).Warn("something went wrong in passwordLockout policy handler") + return spooler.HandleError(event, err, m.view.GetLatestPasswordLockoutPolicyFailedEvent, m.view.ProcessedPasswordLockoutPolicyFailedEvent, m.view.ProcessedPasswordLockoutPolicySequence, m.errorCountUntilSkip) +} diff --git a/internal/management/repository/eventsourcing/handler/user.go b/internal/management/repository/eventsourcing/handler/user.go index 3ba2b916c4..daf07e3f0c 100644 --- a/internal/management/repository/eventsourcing/handler/user.go +++ b/internal/management/repository/eventsourcing/handler/user.go @@ -2,6 +2,7 @@ package handler import ( "context" + iam_es "github.com/caos/zitadel/internal/iam/repository/eventsourcing" "github.com/caos/logging" @@ -20,6 +21,8 @@ type User struct { handler eventstore eventstore.Eventstore orgEvents *org_events.OrgEventstore + iamEvents *iam_es.IAMEventstore + iamID string } const ( @@ -106,7 +109,7 @@ func (u *User) ProcessUser(event *models.Event) (err error) { } err = u.fillLoginNames(user) case es_model.UserRemoved: - err = u.view.DeleteUser(event.AggregateID, event.Sequence) + return u.view.DeleteUser(event.AggregateID, event.Sequence) default: return u.view.ProcessedUserSequence(event.Sequence) } @@ -136,9 +139,12 @@ func (u *User) fillLoginNamesOnOrgUsers(event *models.Event) error { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } users, err := u.view.UsersByOrgID(event.AggregateID) if err != nil { @@ -155,9 +161,12 @@ func (u *User) fillPreferredLoginNamesOnOrgUsers(event *models.Event) error { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } if !policy.UserLoginMustBeDomain { return nil @@ -177,9 +186,12 @@ func (u *User) fillLoginNames(user *view_model.UserView) (err error) { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), user.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } user.SetLoginNames(policy, org.Domains) user.PreferredLoginName = user.GenerateLoginName(org.GetPrimaryDomain().Domain, policy.UserLoginMustBeDomain) diff --git a/internal/management/repository/eventsourcing/handler/user_external_idps.go b/internal/management/repository/eventsourcing/handler/user_external_idps.go index 91e8fa91b1..cfcb8f4885 100644 --- a/internal/management/repository/eventsourcing/handler/user_external_idps.go +++ b/internal/management/repository/eventsourcing/handler/user_external_idps.go @@ -6,6 +6,7 @@ import ( "github.com/caos/zitadel/internal/config/systemdefaults" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/iam/repository/eventsourcing" + iam_view_model "github.com/caos/zitadel/internal/iam/repository/view/model" org_es "github.com/caos/zitadel/internal/org/repository/eventsourcing" org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" @@ -68,6 +69,8 @@ func (m *ExternalIDP) processUser(event *models.Event) (err error) { return err } return m.view.DeleteExternalIDP(externalIDP.ExternalUserID, externalIDP.IDPConfigID, event.Sequence) + case model.UserRemoved: + return m.view.DeleteExternalIDPsByUserID(event.AggregateID, event.Sequence) default: return m.view.ProcessedExternalIDPSequence(event.Sequence) } @@ -80,16 +83,21 @@ func (m *ExternalIDP) processUser(event *models.Event) (err error) { func (m *ExternalIDP) processIdpConfig(event *models.Event) (err error) { switch event.Type { case iam_es_model.IDPConfigChanged, org_es_model.IDPConfigChanged: + configView := new(iam_view_model.IDPConfigView) config := new(iam_model.IDPConfig) - config.AppendEvent(event) - exterinalIDPs, err := m.view.ExternalIDPsByIDPConfigID(config.IDPConfigID) + if event.Type == iam_es_model.IDPConfigChanged { + configView.AppendEvent(iam_model.IDPProviderTypeSystem, event) + } else { + configView.AppendEvent(iam_model.IDPProviderTypeOrg, event) + } + exterinalIDPs, err := m.view.ExternalIDPsByIDPConfigID(configView.IDPConfigID) if err != nil { return err } if event.AggregateType == iam_es_model.IAMAggregate { - config, err = m.iamEvents.GetIDPConfig(context.Background(), config.AggregateID, config.IDPConfigID) + config, err = m.iamEvents.GetIDPConfig(context.Background(), event.AggregateID, configView.IDPConfigID) } else { - config, err = m.orgEvents.GetIDPConfig(context.Background(), config.AggregateID, config.IDPConfigID) + config, err = m.orgEvents.GetIDPConfig(context.Background(), event.AggregateID, configView.IDPConfigID) } if err != nil { return err diff --git a/internal/management/repository/eventsourcing/handler/user_grant.go b/internal/management/repository/eventsourcing/handler/user_grant.go index ce8b1a93d6..9bd28c3dd7 100644 --- a/internal/management/repository/eventsourcing/handler/user_grant.go +++ b/internal/management/repository/eventsourcing/handler/user_grant.go @@ -180,6 +180,12 @@ func (u *UserGrant) fillProjectData(grant *view_model.UserGrantView, project *pr func (u *UserGrant) fillOrgData(grant *view_model.UserGrantView, org *org_model.Org) { grant.OrgName = org.Name + for _, domain := range org.Domains { + if domain.Primary { + grant.OrgPrimaryDomain = domain.Domain + break + } + } } func (u *UserGrant) OnError(event *models.Event, err error) error { diff --git a/internal/management/repository/eventsourcing/handler/user_membership.go b/internal/management/repository/eventsourcing/handler/user_membership.go index 7b3e240e15..af19ad9b81 100644 --- a/internal/management/repository/eventsourcing/handler/user_membership.go +++ b/internal/management/repository/eventsourcing/handler/user_membership.go @@ -7,6 +7,7 @@ import ( org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" proj_event "github.com/caos/zitadel/internal/project/repository/eventsourcing" proj_es_model "github.com/caos/zitadel/internal/project/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" "github.com/caos/logging" @@ -38,7 +39,7 @@ func (m *UserMembership) EventQuery() (*models.SearchQuery, error) { return nil, err } return es_models.NewSearchQuery(). - AggregateTypeFilter(iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate). + AggregateTypeFilter(iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate). LatestSequenceFilter(sequence.CurrentSequence), nil } @@ -50,6 +51,8 @@ func (m *UserMembership) Reduce(event *models.Event) (err error) { err = m.processOrg(event) case proj_es_model.ProjectAggregate: err = m.processProject(event) + case model.UserAggregate: + err = m.processUser(event) } return err } @@ -102,7 +105,7 @@ func (m *UserMembership) processOrg(event *models.Event) (err error) { case org_es_model.OrgMemberRemoved: return m.view.DeleteUserMembership(member.UserID, event.AggregateID, event.AggregateID, usr_model.MemberTypeOrganisation, event.Sequence) case org_es_model.OrgChanged: - err = m.updateOrgDisplayName(event) + return m.updateOrgDisplayName(event) default: return m.view.ProcessedUserMembershipSequence(event.Sequence) } @@ -163,7 +166,11 @@ func (m *UserMembership) processProject(event *models.Event) (err error) { case proj_es_model.ProjectGrantMemberRemoved: return m.view.DeleteUserMembership(member.UserID, event.AggregateID, member.ObjectID, usr_model.MemberTypeProjectGrant, event.Sequence) case proj_es_model.ProjectChanged: - err = m.updateProjectDisplayName(event) + return m.updateProjectDisplayName(event) + case proj_es_model.ProjectRemoved: + return m.view.DeleteUserMembershipsByAggregateID(event.AggregateID, event.Sequence) + case proj_es_model.ProjectGrantRemoved: + return m.view.DeleteUserMembershipsByAggregateIDAndObjectID(event.AggregateID, member.ObjectID, event.Sequence) default: return m.view.ProcessedUserMembershipSequence(event.Sequence) } @@ -198,7 +205,16 @@ func (m *UserMembership) updateProjectDisplayName(event *models.Event) error { return m.view.BulkPutUserMemberships(memberships, event.Sequence) } +func (m *UserMembership) processUser(event *models.Event) (err error) { + switch event.Type { + case model.UserRemoved: + return m.view.DeleteUserMembershipsByUserID(event.AggregateID, event.Sequence) + default: + return m.view.ProcessedUserMembershipSequence(event.Sequence) + } +} + func (m *UserMembership) OnError(event *models.Event, err error) error { - logging.LogWithFields("SPOOL-Ms3fj", "id", event.AggregateID).WithError(err).Warn("something went wrong in orgmember handler") + logging.LogWithFields("SPOOL-Fwer2", "id", event.AggregateID).WithError(err).Warn("something went wrong in user membership handler") return spooler.HandleError(event, err, m.view.GetLatestUserMembershipFailedEvent, m.view.ProcessedUserMembershipFailedEvent, m.view.ProcessedUserMembershipSequence, m.errorCountUntilSkip) } diff --git a/internal/management/repository/eventsourcing/repository.go b/internal/management/repository/eventsourcing/repository.go index a87124efa8..37917c0ea1 100644 --- a/internal/management/repository/eventsourcing/repository.go +++ b/internal/management/repository/eventsourcing/repository.go @@ -13,7 +13,6 @@ import ( "github.com/caos/zitadel/internal/management/repository/eventsourcing/spooler" mgmt_view "github.com/caos/zitadel/internal/management/repository/eventsourcing/view" es_org "github.com/caos/zitadel/internal/org/repository/eventsourcing" - es_pol "github.com/caos/zitadel/internal/policy/repository/eventsourcing" es_proj "github.com/caos/zitadel/internal/project/repository/eventsourcing" es_usr "github.com/caos/zitadel/internal/user/repository/eventsourcing" es_grant "github.com/caos/zitadel/internal/usergrant/repository/eventsourcing" @@ -33,7 +32,6 @@ type EsRepository struct { eventstore.ProjectRepo eventstore.UserRepo eventstore.UserGrantRepo - eventstore.PolicyRepo eventstore.IAMRepository } @@ -59,13 +57,6 @@ func Start(conf Config, systemDefaults sd.SystemDefaults, roles []string) (*EsRe if err != nil { return nil, err } - policy, err := es_pol.StartPolicy(es_pol.PolicyConfig{ - Eventstore: es, - Cache: conf.Eventstore.Cache, - }, systemDefaults) - if err != nil { - return nil, err - } user, err := es_usr.StartUser(es_usr.UserConfig{ Eventstore: es, Cache: conf.Eventstore.Cache, @@ -96,9 +87,8 @@ func Start(conf Config, systemDefaults sd.SystemDefaults, roles []string) (*EsRe spooler: spool, OrgRepository: eventstore.OrgRepository{conf.SearchLimit, org, user, view, roles, systemDefaults}, ProjectRepo: eventstore.ProjectRepo{es, conf.SearchLimit, project, usergrant, user, iam, view, roles, systemDefaults.IamID}, - UserRepo: eventstore.UserRepo{conf.SearchLimit, user, policy, org, view, systemDefaults}, + UserRepo: eventstore.UserRepo{es, conf.SearchLimit, user, org, usergrant, view, systemDefaults}, UserGrantRepo: eventstore.UserGrantRepo{conf.SearchLimit, usergrant, view}, - PolicyRepo: eventstore.PolicyRepo{policy}, IAMRepository: eventstore.IAMRepository{iam}, }, nil } diff --git a/internal/management/repository/eventsourcing/view/application.go b/internal/management/repository/eventsourcing/view/application.go index 53c2dbe687..3d25e2d1d9 100644 --- a/internal/management/repository/eventsourcing/view/application.go +++ b/internal/management/repository/eventsourcing/view/application.go @@ -15,20 +15,28 @@ func (v *View) ApplicationByID(projectID, appID string) (*model.ApplicationView, return view.ApplicationByID(v.Db, applicationTable, projectID, appID) } -func (v *View) ApplicationsByProjectID(ProjectID string) ([]*model.ApplicationView, error) { - return view.ApplicationsByProjectID(v.Db, applicationTable, ProjectID) +func (v *View) ApplicationsByProjectID(projectID string) ([]*model.ApplicationView, error) { + return view.ApplicationsByProjectID(v.Db, applicationTable, projectID) } func (v *View) SearchApplications(request *proj_model.ApplicationSearchRequest) ([]*model.ApplicationView, uint64, error) { return view.SearchApplications(v.Db, applicationTable, request) } -func (v *View) PutApplication(project *model.ApplicationView) error { - err := view.PutApplication(v.Db, applicationTable, project) +func (v *View) PutApplication(app *model.ApplicationView) error { + err := view.PutApplication(v.Db, applicationTable, app) if err != nil { return err } - return v.ProcessedApplicationSequence(project.Sequence) + return v.ProcessedApplicationSequence(app.Sequence) +} + +func (v *View) PutApplications(apps []*model.ApplicationView, sequence uint64) error { + err := view.PutApplications(v.Db, applicationTable, apps...) + if err != nil { + return err + } + return v.ProcessedApplicationSequence(sequence) } func (v *View) DeleteApplication(appID string, eventSequence uint64) error { @@ -39,8 +47,8 @@ func (v *View) DeleteApplication(appID string, eventSequence uint64) error { return v.ProcessedApplicationSequence(eventSequence) } -func (v *View) DeleteApplicationsByProjectID(ProjectID string) error { - return view.DeleteApplicationsByProjectID(v.Db, applicationTable, ProjectID) +func (v *View) DeleteApplicationsByProjectID(projectID string) error { + return view.DeleteApplicationsByProjectID(v.Db, applicationTable, projectID) } func (v *View) GetLatestApplicationSequence() (*repository.CurrentSequence, error) { diff --git a/internal/management/repository/eventsourcing/view/external_idps.go b/internal/management/repository/eventsourcing/view/external_idps.go index 650c8111db..e7f9f9fd0b 100644 --- a/internal/management/repository/eventsourcing/view/external_idps.go +++ b/internal/management/repository/eventsourcing/view/external_idps.go @@ -56,6 +56,13 @@ func (v *View) DeleteExternalIDP(externalUserID, idpConfigID string, eventSequen return v.ProcessedExternalIDPSequence(eventSequence) } +func (v *View) DeleteExternalIDPsByUserID(userID string, eventSequence uint64) error { + err := view.DeleteExternalIDPsByUserID(v.Db, externalIDPTable, userID) + if err != nil { + return err + } + return v.ProcessedExternalIDPSequence(eventSequence) +} func (v *View) GetLatestExternalIDPSequence() (*global_view.CurrentSequence, error) { return v.latestSequence(externalIDPTable) } diff --git a/internal/management/repository/eventsourcing/view/label_policies.go b/internal/management/repository/eventsourcing/view/label_policies.go new file mode 100644 index 0000000000..182ca4f368 --- /dev/null +++ b/internal/management/repository/eventsourcing/view/label_policies.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + labelPolicyTable = "management.label_policies" +) + +func (v *View) LabelPolicyByAggregateID(aggregateID string) (*model.LabelPolicyView, error) { + return view.GetLabelPolicyByAggregateID(v.Db, labelPolicyTable, aggregateID) +} + +func (v *View) PutLabelPolicy(policy *model.LabelPolicyView, sequence uint64) error { + err := view.PutLabelPolicy(v.Db, labelPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedLabelPolicySequence(sequence) +} + +func (v *View) DeleteLabelPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeleteLabelPolicy(v.Db, labelPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedLabelPolicySequence(eventSequence) +} + +func (v *View) GetLatestLabelPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(labelPolicyTable) +} + +func (v *View) ProcessedLabelPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(labelPolicyTable, eventSequence) +} + +func (v *View) GetLatestLabelPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(labelPolicyTable, sequence) +} + +func (v *View) ProcessedLabelPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/management/repository/eventsourcing/view/org_iam_policy.go b/internal/management/repository/eventsourcing/view/org_iam_policy.go new file mode 100644 index 0000000000..81cb67c4ac --- /dev/null +++ b/internal/management/repository/eventsourcing/view/org_iam_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + orgIAMPolicyTable = "management.org_iam_policies" +) + +func (v *View) OrgIAMPolicyByAggregateID(aggregateID string) (*model.OrgIAMPolicyView, error) { + return view.GetOrgIAMPolicyByAggregateID(v.Db, orgIAMPolicyTable, aggregateID) +} + +func (v *View) PutOrgIAMPolicy(policy *model.OrgIAMPolicyView, sequence uint64) error { + err := view.PutOrgIAMPolicy(v.Db, orgIAMPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedOrgIAMPolicySequence(sequence) +} + +func (v *View) DeleteOrgIAMPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeleteOrgIAMPolicy(v.Db, orgIAMPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedOrgIAMPolicySequence(eventSequence) +} + +func (v *View) GetLatestOrgIAMPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(orgIAMPolicyTable) +} + +func (v *View) ProcessedOrgIAMPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(orgIAMPolicyTable, eventSequence) +} + +func (v *View) GetLatestOrgIAMPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(orgIAMPolicyTable, sequence) +} + +func (v *View) ProcessedOrgIAMPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/management/repository/eventsourcing/view/org_member.go b/internal/management/repository/eventsourcing/view/org_member.go index ca99202b09..c4396d5a50 100644 --- a/internal/management/repository/eventsourcing/view/org_member.go +++ b/internal/management/repository/eventsourcing/view/org_member.go @@ -47,6 +47,14 @@ func (v *View) DeleteOrgMember(orgID, userID string, eventSequence uint64) error return v.ProcessedOrgMemberSequence(eventSequence) } +func (v *View) DeleteOrgMembersByUserID(userID string, eventSequence uint64) error { + err := view.DeleteOrgMembersByUserID(v.Db, orgMemberTable, userID) + if err != nil { + return nil + } + return v.ProcessedOrgMemberSequence(eventSequence) +} + func (v *View) GetLatestOrgMemberSequence() (*repository.CurrentSequence, error) { return v.latestSequence(orgMemberTable) } diff --git a/internal/management/repository/eventsourcing/view/password_age_policy.go b/internal/management/repository/eventsourcing/view/password_age_policy.go new file mode 100644 index 0000000000..3d6caaa8a1 --- /dev/null +++ b/internal/management/repository/eventsourcing/view/password_age_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + passwordAgePolicyTable = "management.password_age_policies" +) + +func (v *View) PasswordAgePolicyByAggregateID(aggregateID string) (*model.PasswordAgePolicyView, error) { + return view.GetPasswordAgePolicyByAggregateID(v.Db, passwordAgePolicyTable, aggregateID) +} + +func (v *View) PutPasswordAgePolicy(policy *model.PasswordAgePolicyView, sequence uint64) error { + err := view.PutPasswordAgePolicy(v.Db, passwordAgePolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedPasswordAgePolicySequence(sequence) +} + +func (v *View) DeletePasswordAgePolicy(aggregateID string, eventSequence uint64) error { + err := view.DeletePasswordAgePolicy(v.Db, passwordAgePolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedPasswordAgePolicySequence(eventSequence) +} + +func (v *View) GetLatestPasswordAgePolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordAgePolicyTable) +} + +func (v *View) ProcessedPasswordAgePolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(passwordAgePolicyTable, eventSequence) +} + +func (v *View) GetLatestPasswordAgePolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(passwordAgePolicyTable, sequence) +} + +func (v *View) ProcessedPasswordAgePolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/management/repository/eventsourcing/view/password_complexity_policy.go b/internal/management/repository/eventsourcing/view/password_complexity_policy.go new file mode 100644 index 0000000000..040eb1d596 --- /dev/null +++ b/internal/management/repository/eventsourcing/view/password_complexity_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + passwordComplexityPolicyTable = "management.password_complexity_policies" +) + +func (v *View) PasswordComplexityPolicyByAggregateID(aggregateID string) (*model.PasswordComplexityPolicyView, error) { + return view.GetPasswordComplexityPolicyByAggregateID(v.Db, passwordComplexityPolicyTable, aggregateID) +} + +func (v *View) PutPasswordComplexityPolicy(policy *model.PasswordComplexityPolicyView, sequence uint64) error { + err := view.PutPasswordComplexityPolicy(v.Db, passwordComplexityPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedPasswordComplexityPolicySequence(sequence) +} + +func (v *View) DeletePasswordComplexityPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeletePasswordComplexityPolicy(v.Db, passwordComplexityPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedPasswordComplexityPolicySequence(eventSequence) +} + +func (v *View) GetLatestPasswordComplexityPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordComplexityPolicyTable) +} + +func (v *View) ProcessedPasswordComplexityPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(passwordComplexityPolicyTable, eventSequence) +} + +func (v *View) GetLatestPasswordComplexityPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(passwordComplexityPolicyTable, sequence) +} + +func (v *View) ProcessedPasswordComplexityPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/management/repository/eventsourcing/view/password_lockout_policy.go b/internal/management/repository/eventsourcing/view/password_lockout_policy.go new file mode 100644 index 0000000000..099b961f57 --- /dev/null +++ b/internal/management/repository/eventsourcing/view/password_lockout_policy.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + passwordLockoutPolicyTable = "management.password_lockout_policies" +) + +func (v *View) PasswordLockoutPolicyByAggregateID(aggregateID string) (*model.PasswordLockoutPolicyView, error) { + return view.GetPasswordLockoutPolicyByAggregateID(v.Db, passwordLockoutPolicyTable, aggregateID) +} + +func (v *View) PutPasswordLockoutPolicy(policy *model.PasswordLockoutPolicyView, sequence uint64) error { + err := view.PutPasswordLockoutPolicy(v.Db, passwordLockoutPolicyTable, policy) + if err != nil { + return err + } + return v.ProcessedPasswordLockoutPolicySequence(sequence) +} + +func (v *View) DeletePasswordLockoutPolicy(aggregateID string, eventSequence uint64) error { + err := view.DeletePasswordLockoutPolicy(v.Db, passwordLockoutPolicyTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedPasswordLockoutPolicySequence(eventSequence) +} + +func (v *View) GetLatestPasswordLockoutPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordLockoutPolicyTable) +} + +func (v *View) ProcessedPasswordLockoutPolicySequence(eventSequence uint64) error { + return v.saveCurrentSequence(passwordLockoutPolicyTable, eventSequence) +} + +func (v *View) GetLatestPasswordLockoutPolicyFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(passwordLockoutPolicyTable, sequence) +} + +func (v *View) ProcessedPasswordLockoutPolicyFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/management/repository/eventsourcing/view/user_membership.go b/internal/management/repository/eventsourcing/view/user_membership.go index 303623627a..8188437187 100644 --- a/internal/management/repository/eventsourcing/view/user_membership.go +++ b/internal/management/repository/eventsourcing/view/user_membership.go @@ -32,7 +32,7 @@ func (v *View) PutUserMembership(membership *model.UserMembershipView, sequence } func (v *View) BulkPutUserMemberships(memberships []*model.UserMembershipView, sequence uint64) error { - err := view.PutUserMemberships(v.Db, userTable, memberships...) + err := view.PutUserMemberships(v.Db, userMembershipTable, memberships...) if err != nil { return err } @@ -47,6 +47,30 @@ func (v *View) DeleteUserMembership(userID, aggregateID, objectID string, member return v.ProcessedUserMembershipSequence(eventSequence) } +func (v *View) DeleteUserMembershipsByUserID(userID string, eventSequence uint64) error { + err := view.DeleteUserMembershipsByUserID(v.Db, userMembershipTable, userID) + if err != nil { + return nil + } + return v.ProcessedUserMembershipSequence(eventSequence) +} + +func (v *View) DeleteUserMembershipsByAggregateID(aggregateID string, eventSequence uint64) error { + err := view.DeleteUserMembershipsByAggregateID(v.Db, userMembershipTable, aggregateID) + if err != nil { + return nil + } + return v.ProcessedUserMembershipSequence(eventSequence) +} + +func (v *View) DeleteUserMembershipsByAggregateIDAndObjectID(aggregateID, objectID string, eventSequence uint64) error { + err := view.DeleteUserMembershipsByAggregateIDAndObjectID(v.Db, userMembershipTable, aggregateID, objectID) + if err != nil { + return nil + } + return v.ProcessedUserMembershipSequence(eventSequence) +} + func (v *View) GetLatestUserMembershipSequence() (*repository.CurrentSequence, error) { return v.latestSequence(userMembershipTable) } diff --git a/internal/management/repository/org.go b/internal/management/repository/org.go index e8e8820a72..11b02d14f5 100644 --- a/internal/management/repository/org.go +++ b/internal/management/repository/org.go @@ -30,7 +30,7 @@ type OrgRepository interface { GetOrgMemberRoles() []string - GetMyOrgIamPolicy(ctx context.Context) (*org_model.OrgIAMPolicy, error) + GetMyOrgIamPolicy(ctx context.Context) (*iam_model.OrgIAMPolicyView, error) SearchIDPConfigs(ctx context.Context, request *iam_model.IDPConfigSearchRequest) (*iam_model.IDPConfigSearchResponse, error) IDPConfigByID(ctx context.Context, id string) (*iam_model.IDPConfigView, error) @@ -42,10 +42,29 @@ type OrgRepository interface { ChangeOIDCIDPConfig(ctx context.Context, oidcConfig *iam_model.OIDCIDPConfig) (*iam_model.OIDCIDPConfig, error) GetLoginPolicy(ctx context.Context) (*iam_model.LoginPolicyView, error) + GetDefaultLoginPolicy(ctx context.Context) (*iam_model.LoginPolicyView, error) AddLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*iam_model.LoginPolicy, error) ChangeLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*iam_model.LoginPolicy, error) RemoveLoginPolicy(ctx context.Context) error SearchIDPProviders(ctx context.Context, request *iam_model.IDPProviderSearchRequest) (*iam_model.IDPProviderSearchResponse, error) AddIDPProviderToLoginPolicy(ctx context.Context, provider *iam_model.IDPProvider) (*iam_model.IDPProvider, error) RemoveIDPProviderFromLoginPolicy(ctx context.Context, provider *iam_model.IDPProvider) error + + GetPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) + GetDefaultPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) + AddPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) + ChangePasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) + RemovePasswordComplexityPolicy(ctx context.Context) error + + GetPasswordAgePolicy(ctx context.Context) (*iam_model.PasswordAgePolicyView, error) + GetDefaultPasswordAgePolicy(ctx context.Context) (*iam_model.PasswordAgePolicyView, error) + AddPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) + ChangePasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) + RemovePasswordAgePolicy(ctx context.Context) error + + GetPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) + GetDefaultPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) + AddPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) + ChangePasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) + RemovePasswordLockoutPolicy(ctx context.Context) error } diff --git a/internal/management/repository/policy.go b/internal/management/repository/policy.go deleted file mode 100644 index 9e4808c579..0000000000 --- a/internal/management/repository/policy.go +++ /dev/null @@ -1,20 +0,0 @@ -package repository - -import ( - "context" - - "github.com/caos/zitadel/internal/policy/model" -) - -type PolicyRepository interface { - CreatePasswordComplexityPolicy(ctx context.Context, policy *model.PasswordComplexityPolicy) (*model.PasswordComplexityPolicy, error) - GetPasswordComplexityPolicy(ctx context.Context) (*model.PasswordComplexityPolicy, error) - GetDefaultPasswordComplexityPolicy(ctx context.Context) (*model.PasswordComplexityPolicy, error) - UpdatePasswordComplexityPolicy(ctx context.Context, policy *model.PasswordComplexityPolicy) (*model.PasswordComplexityPolicy, error) - CreatePasswordAgePolicy(ctx context.Context, policy *model.PasswordAgePolicy) (*model.PasswordAgePolicy, error) - GetPasswordAgePolicy(ctx context.Context) (*model.PasswordAgePolicy, error) - UpdatePasswordAgePolicy(ctx context.Context, policy *model.PasswordAgePolicy) (*model.PasswordAgePolicy, error) - CreatePasswordLockoutPolicy(ctx context.Context, policy *model.PasswordLockoutPolicy) (*model.PasswordLockoutPolicy, error) - GetPasswordLockoutPolicy(ctx context.Context) (*model.PasswordLockoutPolicy, error) - UpdatePasswordLockoutPolicy(ctx context.Context, policy *model.PasswordLockoutPolicy) (*model.PasswordLockoutPolicy, error) -} diff --git a/internal/management/repository/project.go b/internal/management/repository/project.go index 382b9df089..06c1e2225a 100644 --- a/internal/management/repository/project.go +++ b/internal/management/repository/project.go @@ -8,7 +8,7 @@ import ( type ProjectRepository interface { ProjectByID(ctx context.Context, id string) (*model.ProjectView, error) - CreateProject(ctx context.Context, name string) (*model.Project, error) + CreateProject(ctx context.Context, project *model.Project) (*model.Project, error) UpdateProject(ctx context.Context, project *model.Project) (*model.Project, error) DeactivateProject(ctx context.Context, id string) (*model.Project, error) ReactivateProject(ctx context.Context, id string) (*model.Project, error) diff --git a/internal/management/repository/repository.go b/internal/management/repository/repository.go index 7351588889..0ed2044712 100644 --- a/internal/management/repository/repository.go +++ b/internal/management/repository/repository.go @@ -3,7 +3,6 @@ package repository type Repository interface { Health() error ProjectRepository - PolicyRepository OrgRepository UserRepository UserGrantRepository diff --git a/internal/management/repository/user.go b/internal/management/repository/user.go index 8b75ee119e..93380aca50 100644 --- a/internal/management/repository/user.go +++ b/internal/management/repository/user.go @@ -14,6 +14,7 @@ type UserRepository interface { ReactivateUser(ctx context.Context, id string) (*model.User, error) LockUser(ctx context.Context, id string) (*model.User, error) UnlockUser(ctx context.Context, id string) (*model.User, error) + RemoveUser(ctx context.Context, id string) error SearchUsers(ctx context.Context, request *model.UserSearchRequest) (*model.UserSearchResponse, error) GetUserByLoginNameGlobal(ctx context.Context, email string) (*model.UserView, error) diff --git a/internal/notification/repository/eventsourcing/handler/handler.go b/internal/notification/repository/eventsourcing/handler/handler.go index 029e060349..a6db3edb74 100644 --- a/internal/notification/repository/eventsourcing/handler/handler.go +++ b/internal/notification/repository/eventsourcing/handler/handler.go @@ -8,6 +8,7 @@ import ( "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/i18n" + iam_es "github.com/caos/zitadel/internal/iam/repository/eventsourcing" "github.com/caos/zitadel/internal/notification/repository/eventsourcing/view" org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" @@ -31,6 +32,7 @@ type handler struct { type EventstoreRepos struct { UserEvents *usr_event.UserEventstore OrgEvents *org_event.OrgEventstore + IAMEvents *iam_es.IAMEventstore } func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, eventstore eventstore.Eventstore, repos EventstoreRepos, systemDefaults sd.SystemDefaults, i18n *i18n.Translator, dir http.FileSystem) []query.Handler { @@ -42,6 +44,8 @@ func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, ev &NotifyUser{ handler: handler{view, bulkLimit, configs.cycleDuration("User"), errorCount}, orgEvents: repos.OrgEvents, + iamEvents: repos.IAMEvents, + iamID: systemDefaults.IamID, }, &Notification{ handler: handler{view, bulkLimit, configs.cycleDuration("Notification"), errorCount}, diff --git a/internal/notification/repository/eventsourcing/handler/notification.go b/internal/notification/repository/eventsourcing/handler/notification.go index 9991e72773..e591b2fd15 100644 --- a/internal/notification/repository/eventsourcing/handler/notification.go +++ b/internal/notification/repository/eventsourcing/handler/notification.go @@ -4,17 +4,21 @@ import ( "context" "encoding/json" "net/http" + "time" "github.com/caos/logging" "github.com/caos/zitadel/internal/api/authz" sd "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" + "github.com/caos/zitadel/internal/errors" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/spooler" "github.com/caos/zitadel/internal/i18n" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/view/model" "github.com/caos/zitadel/internal/notification/types" "github.com/caos/zitadel/internal/user/repository/eventsourcing" usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" @@ -32,8 +36,10 @@ type Notification struct { } const ( - notificationTable = "notification.notifications" - NotifyUserID = "NOTIFICATION" + notificationTable = "notification.notifications" + NotifyUserID = "NOTIFICATION" + labelPolicyTableOrg = "management.label_policies" + labelPolicyTableDef = "adminapi.label_policies" ) func (n *Notification) ViewModel() string { @@ -74,17 +80,27 @@ func (n *Notification) Reduce(event *models.Event) (err error) { } func (n *Notification) handleInitUserCode(event *models.Event) (err error) { - alreadyHandled, err := n.checkIfCodeAlreadyHandled(event.AggregateID, event.Sequence, es_model.InitializedUserCodeAdded, es_model.InitializedUserCodeSent) + initCode := new(es_model.InitUserCode) + if err := initCode.SetData(event); err != nil { + return err + } + alreadyHandled, err := n.checkIfCodeAlreadyHandledOrExpired(event, initCode.Expiry, + es_model.InitializedUserCodeAdded, es_model.InitializedUserCodeSent, + es_model.InitializedHumanCodeAdded, es_model.InitializedHumanCodeSent) if err != nil || alreadyHandled { return err } - initCode := new(es_model.InitUserCode) - initCode.SetData(event) + + colors, err := n.getLabelPolicy(context.Background()) + if err != nil { + return err + } + user, err := n.view.NotifyUserByID(event.AggregateID) if err != nil { return err } - err = types.SendUserInitCode(n.statikDir, n.i18n, user, initCode, n.systemDefaults, n.AesCrypto) + err = types.SendUserInitCode(n.statikDir, n.i18n, user, initCode, n.systemDefaults, n.AesCrypto, colors) if err != nil { return err } @@ -92,17 +108,27 @@ func (n *Notification) handleInitUserCode(event *models.Event) (err error) { } func (n *Notification) handlePasswordCode(event *models.Event) (err error) { - alreadyHandled, err := n.checkIfCodeAlreadyHandled(event.AggregateID, event.Sequence, es_model.UserPasswordCodeAdded, es_model.UserPasswordCodeSent) + pwCode := new(es_model.PasswordCode) + if err := pwCode.SetData(event); err != nil { + return err + } + alreadyHandled, err := n.checkIfCodeAlreadyHandledOrExpired(event, pwCode.Expiry, + es_model.UserPasswordCodeAdded, es_model.UserPasswordCodeSent, + es_model.HumanPasswordCodeAdded, es_model.HumanPasswordCodeSent) if err != nil || alreadyHandled { return err } - pwCode := new(es_model.PasswordCode) - pwCode.SetData(event) + + colors, err := n.getLabelPolicy(context.Background()) + if err != nil { + return err + } + user, err := n.view.NotifyUserByID(event.AggregateID) if err != nil { return err } - err = types.SendPasswordCode(n.statikDir, n.i18n, user, pwCode, n.systemDefaults, n.AesCrypto) + err = types.SendPasswordCode(n.statikDir, n.i18n, user, pwCode, n.systemDefaults, n.AesCrypto, colors) if err != nil { return err } @@ -110,17 +136,27 @@ func (n *Notification) handlePasswordCode(event *models.Event) (err error) { } func (n *Notification) handleEmailVerificationCode(event *models.Event) (err error) { - alreadyHandled, err := n.checkIfCodeAlreadyHandled(event.AggregateID, event.Sequence, es_model.UserEmailCodeAdded, es_model.UserEmailCodeSent) + emailCode := new(es_model.EmailCode) + if err := emailCode.SetData(event); err != nil { + return err + } + alreadyHandled, err := n.checkIfCodeAlreadyHandledOrExpired(event, emailCode.Expiry, + es_model.UserEmailCodeAdded, es_model.UserEmailCodeSent, + es_model.HumanEmailCodeAdded, es_model.HumanEmailCodeSent) if err != nil || alreadyHandled { return nil } - emailCode := new(es_model.EmailCode) - emailCode.SetData(event) + + colors, err := n.getLabelPolicy(context.Background()) + if err != nil { + return err + } + user, err := n.view.NotifyUserByID(event.AggregateID) if err != nil { return err } - err = types.SendEmailVerificationCode(n.statikDir, n.i18n, user, emailCode, n.systemDefaults, n.AesCrypto) + err = types.SendEmailVerificationCode(n.statikDir, n.i18n, user, emailCode, n.systemDefaults, n.AesCrypto, colors) if err != nil { return err } @@ -128,12 +164,16 @@ func (n *Notification) handleEmailVerificationCode(event *models.Event) (err err } func (n *Notification) handlePhoneVerificationCode(event *models.Event) (err error) { - alreadyHandled, err := n.checkIfCodeAlreadyHandled(event.AggregateID, event.Sequence, es_model.UserPhoneCodeAdded, es_model.UserPhoneCodeSent) + phoneCode := new(es_model.PhoneCode) + if err := phoneCode.SetData(event); err != nil { + return err + } + alreadyHandled, err := n.checkIfCodeAlreadyHandledOrExpired(event, phoneCode.Expiry, + es_model.UserPhoneCodeAdded, es_model.UserPhoneCodeSent, + es_model.HumanPhoneCodeAdded, es_model.HumanPhoneCodeSent) if err != nil || alreadyHandled { return nil } - phoneCode := new(es_model.PhoneCode) - phoneCode.SetData(event) user, err := n.view.NotifyUserByID(event.AggregateID) if err != nil { return err @@ -146,7 +186,7 @@ func (n *Notification) handlePhoneVerificationCode(event *models.Event) (err err } func (n *Notification) handleDomainClaimed(event *models.Event) (err error) { - alreadyHandled, err := n.checkIfCodeAlreadyHandled(event.AggregateID, event.Sequence, es_model.DomainClaimed, es_model.DomainClaimedSent) + alreadyHandled, err := n.checkIfAlreadyHandled(event.AggregateID, event.Sequence, es_model.DomainClaimed, es_model.DomainClaimedSent) if err != nil || alreadyHandled { return nil } @@ -166,14 +206,23 @@ func (n *Notification) handleDomainClaimed(event *models.Event) (err error) { return n.userEvents.DomainClaimedSent(getSetNotifyContextData(event.ResourceOwner), event.AggregateID) } -func (n *Notification) checkIfCodeAlreadyHandled(userID string, sequence uint64, addedType, sentType models.EventType) (bool, error) { +func (n *Notification) checkIfCodeAlreadyHandledOrExpired(event *models.Event, expiry time.Duration, eventTypes ...models.EventType) (bool, error) { + if event.CreationDate.Add(expiry).Before(time.Now().UTC()) { + return true, nil + } + return n.checkIfAlreadyHandled(event.AggregateID, event.Sequence, eventTypes...) +} + +func (n *Notification) checkIfAlreadyHandled(userID string, sequence uint64, eventTypes ...models.EventType) (bool, error) { events, err := n.getUserEvents(userID, sequence) if err != nil { return false, err } for _, event := range events { - if event.Type == addedType || event.Type == sentType { - return true, nil + for _, eventType := range eventTypes { + if event.Type == eventType { + return true, nil + } } } return false, nil @@ -196,3 +245,21 @@ func (n *Notification) OnError(event *models.Event, err error) error { func getSetNotifyContextData(orgID string) context.Context { return authz.SetCtxData(context.Background(), authz.CtxData{UserID: NotifyUserID, OrgID: orgID}) } + +// Read organization specific colors +func (n *Notification) getLabelPolicy(ctx context.Context) (*iam_model.LabelPolicyView, error) { + // read from Org + policy, err := n.view.LabelPolicyByAggregateID(authz.GetCtxData(ctx).OrgID, labelPolicyTableOrg) + if errors.IsNotFound(err) { + // read from default + policy, err = n.view.LabelPolicyByAggregateID(n.systemDefaults.IamID, labelPolicyTableDef) + if err != nil { + return nil, err + } + policy.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.LabelPolicyViewToModel(policy), err +} diff --git a/internal/notification/repository/eventsourcing/handler/notify_user.go b/internal/notification/repository/eventsourcing/handler/notify_user.go index 7c72d92205..e05e624d39 100644 --- a/internal/notification/repository/eventsourcing/handler/notify_user.go +++ b/internal/notification/repository/eventsourcing/handler/notify_user.go @@ -2,6 +2,7 @@ package handler import ( "context" + iam_es "github.com/caos/zitadel/internal/iam/repository/eventsourcing" "github.com/caos/logging" @@ -20,6 +21,8 @@ type NotifyUser struct { handler eventstore eventstore.Eventstore orgEvents *org_events.OrgEventstore + iamEvents *iam_es.IAMEventstore + iamID string } const ( @@ -90,7 +93,7 @@ func (u *NotifyUser) ProcessUser(event *models.Event) (err error) { } u.fillLoginNames(user) case es_model.UserRemoved: - err = u.view.DeleteNotifyUser(event.AggregateID, event.Sequence) + return u.view.DeleteNotifyUser(event.AggregateID, event.Sequence) default: return u.view.ProcessedNotifyUserSequence(event.Sequence) } @@ -120,9 +123,12 @@ func (u *NotifyUser) fillLoginNamesOnOrgUsers(event *models.Event) error { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } users, err := u.view.NotifyUsersByOrgID(event.AggregateID) if err != nil { @@ -143,9 +149,12 @@ func (u *NotifyUser) fillPreferredLoginNamesOnOrgUsers(event *models.Event) erro if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), event.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } if !policy.UserLoginMustBeDomain { return nil @@ -169,9 +178,12 @@ func (u *NotifyUser) fillLoginNames(user *view_model.NotifyUser) (err error) { if err != nil { return err } - policy, err := u.orgEvents.GetOrgIAMPolicy(context.Background(), user.ResourceOwner) - if err != nil { - return err + policy := org.OrgIamPolicy + if policy == nil { + policy, err = u.iamEvents.GetOrgIAMPolicy(context.Background(), u.iamID) + if err != nil { + return err + } } user.SetLoginNames(policy, org.Domains) user.PreferredLoginName = user.GenerateLoginName(org.GetPrimaryDomain().Domain, policy.UserLoginMustBeDomain) diff --git a/internal/notification/repository/eventsourcing/repository.go b/internal/notification/repository/eventsourcing/repository.go index 2ebebae503..cfdae2787f 100644 --- a/internal/notification/repository/eventsourcing/repository.go +++ b/internal/notification/repository/eventsourcing/repository.go @@ -1,6 +1,7 @@ package eventsourcing import ( + es_iam "github.com/caos/zitadel/internal/iam/repository/eventsourcing" "net/http" sd "github.com/caos/zitadel/internal/config/systemdefaults" @@ -56,7 +57,14 @@ func Start(conf Config, dir http.FileSystem, systemDefaults sd.SystemDefaults) ( if err != nil { return nil, err } - eventstoreRepos := handler.EventstoreRepos{UserEvents: user, OrgEvents: org} + iam, err := es_iam.StartIAM(es_iam.IAMConfig{ + Eventstore: es, + Cache: conf.Eventstore.Cache, + }, systemDefaults) + if err != nil { + return nil, err + } + eventstoreRepos := handler.EventstoreRepos{UserEvents: user, OrgEvents: org, IAMEvents: iam} spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, eventstoreRepos, systemDefaults, translator, dir) return &EsRepository{ diff --git a/internal/notification/repository/eventsourcing/view/label_policies.go b/internal/notification/repository/eventsourcing/view/label_policies.go new file mode 100644 index 0000000000..a330d4ac84 --- /dev/null +++ b/internal/notification/repository/eventsourcing/view/label_policies.go @@ -0,0 +1,10 @@ +package view + +import ( + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" +) + +func (v *View) LabelPolicyByAggregateID(aggregateID string, labelPolicyTableVar string) (*model.LabelPolicyView, error) { + return view.GetLabelPolicyByAggregateID(v.Db, labelPolicyTableVar, aggregateID) +} diff --git a/internal/notification/static/i18n/de.yaml b/internal/notification/static/i18n/de.yaml index 5435841b70..001c572dfb 100644 --- a/internal/notification/static/i18n/de.yaml +++ b/internal/notification/static/i18n/de.yaml @@ -3,28 +3,28 @@ InitCode: PreHeader: User initialisieren Subject: User initialisieren Greeting: Hallo {{.FirstName}} {{.LastName}}, - Text: Dieser Benutzer wurde soeben im Zitadel erstellt. Mit dem Benutzernamen {{.PreferredLoginName}} kannst du dich anmelden. Nutze den untenstehenden Button, um die Initialisierung abzuschliesen. (Code {{.Code}}) Falls du dieses Mail nicht angefordert hast, kannst du es einfach ignorieren. + Text: Dieser Benutzer wurde soeben im Zitadel erstellt. Mit dem Benutzernamen <br><strong>{{.PreferredLoginName}}</strong><br> kannst du dich anmelden. Nutze den untenstehenden Button, um die Initialisierung abzuschliessen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es einfach ignorieren. ButtonText: Initialisierung abschliessen PasswordReset: Title: Zitadel - Passwort zurücksetzen PreHeader: Passwort zurücksetzen Subject: Passwort zurücksetzen Greeting: Hallo {{.FirstName}} {{.LastName}}, - Text: Wir haben eine Anfrage für das Zurücksetzen deines Passwortes bekommen. Du kannst den untenstehenden Button verwenden, um dein Passwort zurückzusetzen. (Code {{.Code}}) Falls du dieses Mail nicht angefordert hast, kannst du es ignorieren. + Text: Wir haben eine Anfrage für das Zurücksetzen deines Passwortes bekommen. Du kannst den untenstehenden Button verwenden, um dein Passwort zurückzusetzen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es ignorieren. ButtonText: Passwort zurücksetzen VerifyEmail: Title: Zitadel - Email verifizieren PreHeader: Email verifizieren Subject: Email verifizieren Greeting: Hallo {{.FirstName}} {{.LastName}}, - Text: Eine neue E-Mail Adresse wurde hinzugefügt. Bitte verwende den untenstehenden Button um diese zu verifizieren. (Code {{.Code}}) Falls du deine E-Mail Adresse nicht selber hinzugefügt hast, kannst du dieses E-Mail ignorieren. + Text: Eine neue E-Mail Adresse wurde hinzugefügt. Bitte verwende den untenstehenden Button um diese zu verifizieren <br>(Code <strong>{{.Code}}</strong>).<br> Falls du deine E-Mail Adresse nicht selber hinzugefügt hast, kannst du dieses E-Mail ignorieren. ButtonText: Email verifizieren VerifyPhone: Title: Zitadel - Telefonnummer verifizieren PreHeader: Telefonnummer verifizieren Subject: Telefonnummer verifizieren Greeting: Hallo {{.FirstName}} {{.LastName}}, - Text: Eine Telefonnummer wurde hinzugefügt. Bitte verifiziere diese in dem du folgenden Code eingibst {{.Code}} + Text: Eine Telefonnummer wurde hinzugefügt. Bitte verifiziere diese in dem du folgenden Code eingibst<br>(Code <strong>{{.Code}}</strong>).<br> ButtonText: Telefon verifizieren DomainClaimed: Title: Zitadel - Domain wurde beansprucht diff --git a/internal/notification/static/templates/template 01 Tabelle black.mjml b/internal/notification/static/templates/template 01 Tabelle black.mjml new file mode 100644 index 0000000000..8d514752eb --- /dev/null +++ b/internal/notification/static/templates/template 01 Tabelle black.mjml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{.Greeting}} + {{.Text}} + {{.ButtonText}} + + CAOS AG | Teufener Strasse 19 | CH-9000 St. Gallen + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/notification/static/templates/template 01 Tabelle.mjml b/internal/notification/static/templates/template 01 Tabelle.mjml new file mode 100644 index 0000000000..0fdb0466f1 --- /dev/null +++ b/internal/notification/static/templates/template 01 Tabelle.mjml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{.Greeting}} + {{.Text}} + {{.ButtonText}} + + CAOS AG | Teufener Strasse 19 | CH-9000 St. Gallen + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/notification/static/templates/template 02 Absolut.mjml b/internal/notification/static/templates/template 02 Absolut.mjml new file mode 100644 index 0000000000..dc9646c1ae --- /dev/null +++ b/internal/notification/static/templates/template 02 Absolut.mjml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + {{.Greeting}} + {{.Text}} + {{.ButtonText}} + + CAOS AG | Teufener Strasse 19 | CH-9000 St. Gallen + + + + + + + \ No newline at end of file diff --git a/internal/notification/static/templates/template.html b/internal/notification/static/templates/template.html index 4ad75554d1..77319e45a0 100644 --- a/internal/notification/static/templates/template.html +++ b/internal/notification/static/templates/template.html @@ -1,508 +1,714 @@ - - - - - - {{.Title}} - + + + + + + + + + + + + - + + + + + + + + + +
+ + + + + + + +
+ + + + +
+
+ + + + + + +
+ + + + + + + + +
+ + + - - - - -
-

Zitadel

-
- - - - - - - - - - - - - - - - +
+ + + +
+ + + + + + + +
+ + +
+ + +
+ + + + + + + +
+ + + + + + + +
+ + + + + - + + +
+ + +  
+ +
+ +
+ +
+ + +
+ + +
+ +
+ + + + + +
+ + + + + + + + + +
+ + + + + +
+ + + + + + + +
+ + +
+ + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + +
+ +
+ +
+ +
+ + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
{{.Greeting}}
+ +
+ +
{{.Text}}
+ +
+ + + + + +
+ + {{.ButtonText}} + +
+ +
+ +
CAOS AG | Teufener Strasse 19 | CH-9000 St. Gallen
+ +
+ +
+ +
+ + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + +
+ +
+ +
+ +
+ + +
+ + +
+ +
+ + + + + +
+ + + + + + + + + +
+ + + + + +
+ + + + + + + +
+ + +
+ + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + +
+ +
+ +
+ +
+ + +
+ + +
+ +
+ + + + + +
+ + +
+
+
+ + + + +
+ +
+ + + + \ No newline at end of file diff --git a/internal/notification/templates/templateData.go b/internal/notification/templates/templateData.go index a19aef9876..ee7b910709 100644 --- a/internal/notification/templates/templateData.go +++ b/internal/notification/templates/templateData.go @@ -1,17 +1,21 @@ package templates import ( + "html" + "github.com/caos/zitadel/internal/i18n" ) type TemplateData struct { - Title string - PreHeader string - Subject string - Greeting string - Text string - Href string - ButtonText string + Title string + PreHeader string + Subject string + Greeting string + Text string + Href string + ButtonText string + PrimaryColor string + SecondaryColor string } func (data *TemplateData) Translate(i18n *i18n.Translator, args map[string]interface{}, langs ...string) { @@ -19,7 +23,7 @@ func (data *TemplateData) Translate(i18n *i18n.Translator, args map[string]inter data.PreHeader = i18n.Localize(data.PreHeader, nil, langs...) data.Subject = i18n.Localize(data.Subject, nil, langs...) data.Greeting = i18n.Localize(data.Greeting, args, langs...) - data.Text = i18n.Localize(data.Text, args, langs...) + data.Text = html.UnescapeString(i18n.Localize(data.Text, args, langs...)) data.Href = i18n.Localize(data.Href, nil, langs...) data.ButtonText = i18n.Localize(data.ButtonText, nil, langs...) } diff --git a/internal/notification/types/email_verification_code.go b/internal/notification/types/email_verification_code.go index 9459f8cf61..77f5750e48 100644 --- a/internal/notification/types/email_verification_code.go +++ b/internal/notification/types/email_verification_code.go @@ -1,13 +1,15 @@ package types import ( + "net/http" + "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/i18n" + iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/notification/templates" es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" view_model "github.com/caos/zitadel/internal/user/repository/view/model" - "net/http" ) type EmailVerificationCodeData struct { @@ -15,7 +17,7 @@ type EmailVerificationCodeData struct { URL string } -func SendEmailVerificationCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.EmailCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm) error { +func SendEmailVerificationCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.EmailCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -32,6 +34,9 @@ func SendEmailVerificationCode(dir http.FileSystem, i18n *i18n.Translator, user systemDefaults.Notifications.TemplateData.VerifyEmail.Translate(i18n, args, user.PreferredLanguage) emailCodeData := &EmailVerificationCodeData{TemplateData: systemDefaults.Notifications.TemplateData.VerifyEmail, URL: url} + // Set the color in initCodeData + emailCodeData.PrimaryColor = colors.PrimaryColor + emailCodeData.SecondaryColor = colors.SecondaryColor template, err := templates.GetParsedTemplate(dir, emailCodeData) if err != nil { return err diff --git a/internal/notification/types/init_code.go b/internal/notification/types/init_code.go index 704aac23e4..86da8d3ccd 100644 --- a/internal/notification/types/init_code.go +++ b/internal/notification/types/init_code.go @@ -1,13 +1,15 @@ package types import ( + "net/http" + "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/i18n" + iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/notification/templates" es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" view_model "github.com/caos/zitadel/internal/user/repository/view/model" - "net/http" ) type InitCodeEmailData struct { @@ -21,7 +23,7 @@ type UrlData struct { PasswordSet bool } -func SendUserInitCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.InitUserCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm) error { +func SendUserInitCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.InitUserCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -39,6 +41,9 @@ func SendUserInitCode(dir http.FileSystem, i18n *i18n.Translator, user *view_mod systemDefaults.Notifications.TemplateData.InitCode.Translate(i18n, args, user.PreferredLanguage) initCodeData := &InitCodeEmailData{TemplateData: systemDefaults.Notifications.TemplateData.InitCode, URL: url} + // Set the color in initCodeData + initCodeData.PrimaryColor = colors.PrimaryColor + initCodeData.SecondaryColor = colors.SecondaryColor template, err := templates.GetParsedTemplate(dir, initCodeData) if err != nil { return err diff --git a/internal/notification/types/password_code.go b/internal/notification/types/password_code.go index 4ca8a16b5d..41f6a21dc6 100644 --- a/internal/notification/types/password_code.go +++ b/internal/notification/types/password_code.go @@ -1,13 +1,15 @@ package types import ( + "net/http" + "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/i18n" + iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/notification/templates" es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" view_model "github.com/caos/zitadel/internal/user/repository/view/model" - "net/http" ) type PasswordCodeData struct { @@ -17,7 +19,7 @@ type PasswordCodeData struct { URL string } -func SendPasswordCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.PasswordCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm) error { +func SendPasswordCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.PasswordCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -34,6 +36,9 @@ func SendPasswordCode(dir http.FileSystem, i18n *i18n.Translator, user *view_mod systemDefaults.Notifications.TemplateData.PasswordReset.Translate(i18n, args, user.PreferredLanguage) passwordCodeData := &PasswordCodeData{TemplateData: systemDefaults.Notifications.TemplateData.PasswordReset, FirstName: user.FirstName, LastName: user.LastName, URL: url} + // Set the color in initCodeData + passwordCodeData.PrimaryColor = colors.PrimaryColor + passwordCodeData.SecondaryColor = colors.SecondaryColor template, err := templates.GetParsedTemplate(dir, passwordCodeData) if err != nil { return err diff --git a/internal/notification/types/user_email.go b/internal/notification/types/user_email.go index d6b3928e2e..974aabc60c 100644 --- a/internal/notification/types/user_email.go +++ b/internal/notification/types/user_email.go @@ -1,6 +1,8 @@ package types import ( + "html" + "github.com/caos/zitadel/internal/config/systemdefaults" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/notification/providers" @@ -14,6 +16,7 @@ func generateEmail(user *view_model.NotifyUser, subject, content string, config if err != nil { return err } + content = html.UnescapeString(content) message := &email.EmailMessage{ SenderEmail: config.Providers.Email.From, Recipients: []string{user.VerifiedEmail}, diff --git a/internal/org/model/org.go b/internal/org/model/org.go index 83f3de8004..c5ec7829a3 100644 --- a/internal/org/model/org.go +++ b/internal/org/model/org.go @@ -1,10 +1,11 @@ package model import ( + "strings" + es_models "github.com/caos/zitadel/internal/eventstore/models" iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/golang/protobuf/ptypes/timestamp" - "strings" ) type Org struct { @@ -14,9 +15,13 @@ type Org struct { Name string Domains []*OrgDomain - Members []*OrgMember - OrgIamPolicy *OrgIAMPolicy - LoginPolicy *iam_model.LoginPolicy + Members []*OrgMember + OrgIamPolicy *iam_model.OrgIAMPolicy + LoginPolicy *iam_model.LoginPolicy + LabelPolicy *iam_model.LabelPolicy + PasswordComplexityPolicy *iam_model.PasswordComplexityPolicy + PasswordAgePolicy *iam_model.PasswordAgePolicy + PasswordLockoutPolicy *iam_model.PasswordLockoutPolicy IDPs []*iam_model.IDPConfig } diff --git a/internal/org/repository/eventsourcing/eventstore.go b/internal/org/repository/eventsourcing/eventstore.go index 5fa4c44000..384d9e1fc3 100644 --- a/internal/org/repository/eventsourcing/eventstore.go +++ b/internal/org/repository/eventsourcing/eventstore.go @@ -27,7 +27,6 @@ type OrgEventstore struct { idGenerator id.Generator verificationAlgorithm crypto.EncryptionAlgorithm verificationGenerator crypto.Generator - defaultOrgIamPolicy *org_model.OrgIAMPolicy verificationValidator func(domain string, token string, verifier string, checkType http_utils.CheckType) error secretCrypto crypto.Crypto } @@ -39,9 +38,6 @@ type OrgConfig struct { } func StartOrg(conf OrgConfig, defaults systemdefaults.SystemDefaults) *OrgEventstore { - policy := defaults.DefaultPolicies.OrgIam - policy.Default = true - policy.IamDomain = conf.IAMDomain verificationAlg, err := crypto.NewAESCrypto(defaults.DomainVerification.VerificationKey) logging.Log("EVENT-aZ22d").OnError(err).Panic("cannot create verificationAlgorithm for domain verification") verificationGen := crypto.NewEncryptionGenerator(defaults.DomainVerification.VerificationGenerator, verificationAlg) @@ -57,7 +53,6 @@ func StartOrg(conf OrgConfig, defaults systemdefaults.SystemDefaults) *OrgEvents verificationValidator: http_utils.ValidateDomain, IAMDomain: conf.IAMDomain, IamID: defaults.IamID, - defaultOrgIamPolicy: &policy, secretCrypto: aesCrypto, } } @@ -464,22 +459,18 @@ func (es *OrgEventstore) RemoveOrgMember(ctx context.Context, member *org_model. return es_sdk.Push(ctx, es.PushAggregates, repoMember.AppendEvents, orgAggregate) } -func (es *OrgEventstore) GetDefaultOrgIAMPolicy(ctx context.Context) *org_model.OrgIAMPolicy { - return es.defaultOrgIamPolicy -} - -func (es *OrgEventstore) GetOrgIAMPolicy(ctx context.Context, orgID string) (*org_model.OrgIAMPolicy, error) { +func (es *OrgEventstore) GetOrgIAMPolicy(ctx context.Context, orgID string) (*iam_model.OrgIAMPolicy, error) { existingOrg, err := es.OrgByID(ctx, org_model.NewOrg(orgID)) - if err != nil && !errors.IsNotFound(err) { + if err != nil { return nil, err } - if existingOrg != nil && existingOrg.OrgIamPolicy != nil { - return existingOrg.OrgIamPolicy, nil + if existingOrg.OrgIamPolicy == nil { + return nil, errors.ThrowNotFound(nil, "EVENT-3F9sf", "Errors.Org.OrgIAM.NotExisting") } - return es.defaultOrgIamPolicy, nil + return existingOrg.OrgIamPolicy, nil } -func (es *OrgEventstore) AddOrgIAMPolicy(ctx context.Context, policy *org_model.OrgIAMPolicy) (*org_model.OrgIAMPolicy, error) { +func (es *OrgEventstore) AddOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { existingOrg, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) if err != nil { return nil, err @@ -488,7 +479,7 @@ func (es *OrgEventstore) AddOrgIAMPolicy(ctx context.Context, policy *org_model. return nil, errors.ThrowPreconditionFailed(nil, "EVENT-7Usj3", "Errors.Org.PolicyAlreadyExists") } repoOrg := model.OrgFromModel(existingOrg) - repoPolicy := model.OrgIAMPolicyFromModel(policy) + repoPolicy := iam_es_model.OrgIAMPolicyFromModel(policy) orgAggregate := OrgIAMPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPolicy) if err != nil { return nil, err @@ -498,10 +489,10 @@ func (es *OrgEventstore) AddOrgIAMPolicy(ctx context.Context, policy *org_model. return nil, err } - return model.OrgIAMPolicyToModel(repoOrg.OrgIamPolicy), nil + return iam_es_model.OrgIAMPolicyToModel(repoOrg.OrgIAMPolicy), nil } -func (es *OrgEventstore) ChangeOrgIAMPolicy(ctx context.Context, policy *org_model.OrgIAMPolicy) (*org_model.OrgIAMPolicy, error) { +func (es *OrgEventstore) ChangeOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { existingOrg, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) if err != nil { return nil, err @@ -510,7 +501,7 @@ func (es *OrgEventstore) ChangeOrgIAMPolicy(ctx context.Context, policy *org_mod return nil, errors.ThrowPreconditionFailed(nil, "EVENT-8juSd", "Errors.Org.PolicyNotExisting") } repoOrg := model.OrgFromModel(existingOrg) - repoPolicy := model.OrgIAMPolicyFromModel(policy) + repoPolicy := iam_es_model.OrgIAMPolicyFromModel(policy) orgAggregate := OrgIAMPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPolicy) if err != nil { return nil, err @@ -520,7 +511,7 @@ func (es *OrgEventstore) ChangeOrgIAMPolicy(ctx context.Context, policy *org_mod return nil, err } - return model.OrgIAMPolicyToModel(repoOrg.OrgIamPolicy), nil + return iam_es_model.OrgIAMPolicyToModel(repoOrg.OrgIAMPolicy), nil } func (es *OrgEventstore) RemoveOrgIAMPolicy(ctx context.Context, orgID string) error { @@ -543,7 +534,7 @@ func (es *OrgEventstore) AddIDPConfig(ctx context.Context, idp *iam_model.IDPCon if idp == nil || !idp.IsValid(true) { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Ms89d", "Errors.Org.IdpInvalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(idp.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(idp.AggregateID)) if err != nil { return nil, err } @@ -557,7 +548,7 @@ func (es *OrgEventstore) AddIDPConfig(ctx context.Context, idp *iam_model.IDPCon idp.OIDCConfig.IDPConfigID = id err = idp.OIDCConfig.CryptSecret(es.secretCrypto) } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoIdp := iam_es_model.IDPConfigFromModel(idp) addAggregate := IDPConfigAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoIdp) @@ -575,14 +566,14 @@ func (es *OrgEventstore) ChangeIDPConfig(ctx context.Context, idp *iam_model.IDP if idp == nil || !idp.IsValid(false) { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Mslo9", "Errors.Org.IdpInvalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(idp.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(idp.AggregateID)) if err != nil { return nil, err } - if _, i := existing.GetIDP(idp.IDPConfigID); i == nil { + if _, i := org.GetIDP(idp.IDPConfigID); i == nil { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Aji8e", "Errors.Org.IdpNotExisting") } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoIdp := iam_es_model.IDPConfigFromModel(idp) iamAggregate := IDPConfigChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoIdp) @@ -600,14 +591,14 @@ func (es *OrgEventstore) PrepareRemoveIDPConfig(ctx context.Context, idp *iam_mo if idp.IDPConfigID == "" { return nil, nil, errors.ThrowPreconditionFailed(nil, "EVENT-Wz7sD", "Errors.Org.IDMissing") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(idp.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(idp.AggregateID)) if err != nil { return nil, nil, err } - if _, i := existing.GetIDP(idp.IDPConfigID); i == nil { + if _, i := org.GetIDP(idp.IDPConfigID); i == nil { return nil, nil, errors.ThrowPreconditionFailed(nil, "EVENT-Smiu8", "Errors.Org.IdpNotExisting") } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoIdp := iam_es_model.IDPConfigFromModel(idp) provider := new(iam_es_model.IDPProvider) if repoOrg.LoginPolicy != nil { @@ -632,15 +623,15 @@ func (es *OrgEventstore) DeactivateIDPConfig(ctx context.Context, orgID, idpID s if idpID == "" { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Smk8d", "Errors.Org.IDMissing") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(orgID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(orgID)) if err != nil { return nil, err } idp := &iam_model.IDPConfig{IDPConfigID: idpID} - if _, app := existing.GetIDP(idp.IDPConfigID); app == nil { + if _, app := org.GetIDP(idp.IDPConfigID); app == nil { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Amk8d", "Errors.Org.IdpNotExisting") } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoIdp := iam_es_model.IDPConfigFromModel(idp) iamAggregate := IDPConfigDeactivatedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoIdp) @@ -658,15 +649,15 @@ func (es *OrgEventstore) ReactivateIDPConfig(ctx context.Context, orgID, idpID s if idpID == "" { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Xm8df", "Errors.Org.IDMissing") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(orgID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(orgID)) if err != nil { return nil, err } idp := &iam_model.IDPConfig{IDPConfigID: idpID} - if _, i := existing.GetIDP(idp.IDPConfigID); i == nil { + if _, i := org.GetIDP(idp.IDPConfigID); i == nil { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Qls0f", "Errors.Org.IdpNotExisting") } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoIdp := iam_es_model.IDPConfigFromModel(idp) iamAggregate := IDPConfigReactivatedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoIdp) @@ -684,12 +675,12 @@ func (es *OrgEventstore) ChangeIDPOIDCConfig(ctx context.Context, config *iam_mo if config == nil || !config.IsValid(false) { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Qs789", "Errors.Org.OIDCConfigInvalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(config.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(config.AggregateID)) if err != nil { return nil, err } var idp *iam_model.IDPConfig - if _, idp = existing.GetIDP(config.IDPConfigID); idp == nil { + if _, idp = org.GetIDP(config.IDPConfigID); idp == nil { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-pso0s", "Errors.Org.IdpNoExisting") } if idp.Type != iam_model.IDPConfigTypeOIDC { @@ -700,7 +691,7 @@ func (es *OrgEventstore) ChangeIDPOIDCConfig(ctx context.Context, config *iam_mo } else { config.ClientSecret = nil } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoConfig := iam_es_model.OIDCIDPConfigFromModel(config) iamAggregate := OIDCIDPConfigChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoConfig) @@ -714,16 +705,56 @@ func (es *OrgEventstore) ChangeIDPOIDCConfig(ctx context.Context, config *iam_mo return nil, errors.ThrowInternal(nil, "EVENT-Sldk8", "Errors.Internal") } -func (es *OrgEventstore) AddLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*iam_model.LoginPolicy, error) { +func (es *OrgEventstore) AddLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { if policy == nil || !policy.IsValid() { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Sjkl9", "Errors.Org.LoginPolicy.Invalid") + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-37rSC", "Errors.Org.LabelPolicyInvalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) if err != nil { return nil, err } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) + repoLabelPolicy := iam_es_model.LabelPolicyFromModel(policy) + + addAggregate := LabelPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoLabelPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.LabelPolicyToModel(repoOrg.LabelPolicy), nil +} + +func (es *OrgEventstore) ChangeLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + if policy == nil || !policy.IsValid() { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-0NBIw", "Errors.Org.LabelPolicyInvalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoLabelPolicy := iam_es_model.LabelPolicyFromModel(policy) + + addAggregate := LabelPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoLabelPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.LabelPolicyToModel(repoOrg.LabelPolicy), nil +} + +func (es *OrgEventstore) AddLoginPolicy(ctx context.Context, policy *iam_model.LoginPolicy) (*iam_model.LoginPolicy, error) { + if policy == nil || !policy.IsValid() { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Sjkl9", "Errors.Org.LoginPolicy.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) repoLoginPolicy := iam_es_model.LoginPolicyFromModel(policy) addAggregate := LoginPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoLoginPolicy) @@ -738,16 +769,16 @@ func (es *OrgEventstore) ChangeLoginPolicy(ctx context.Context, policy *iam_mode if policy == nil || !policy.IsValid() { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Lso02", "Errors.Org.LoginPolicy.Invalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) if err != nil { return nil, err } - if existing.LoginPolicy == nil { + if org.LoginPolicy == nil { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Lso02", "Errors.Org.LoginPolicy.NotExisting") } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoLoginPolicy := iam_es_model.LoginPolicyFromModel(policy) addAggregate := LoginPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoLoginPolicy) @@ -762,11 +793,11 @@ func (es *OrgEventstore) RemoveLoginPolicy(ctx context.Context, policy *iam_mode if policy == nil || !policy.IsValid() { return errors.ThrowPreconditionFailed(nil, "EVENT-O0s9e", "Errors.Org.LoginPolicy.Invalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) if err != nil { return err } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) addAggregate := LoginPolicyRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg) return es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) @@ -787,17 +818,17 @@ func (es *OrgEventstore) AddIDPProviderToLoginPolicy(ctx context.Context, provid if provider == nil || !provider.IsValid() { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Sjd8e", "Errors.Org.IdpProviderInvalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(provider.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(provider.AggregateID)) if err != nil { return nil, err } - if existing.LoginPolicy == nil { + if org.LoginPolicy == nil { return nil, errors.ThrowAlreadyExists(nil, "EVENT-sk9fW", "Errors.Org.LoginPolicy.NotExisting") } - if _, m := existing.LoginPolicy.GetIdpProvider(provider.IdpConfigID); m != nil { + if _, m := org.LoginPolicy.GetIdpProvider(provider.IdpConfigID); m != nil { return nil, errors.ThrowAlreadyExists(nil, "EVENT-Lso9f", "Errors.Org.LoginPolicy.IdpProviderAlreadyExisting") } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) repoProvider := iam_es_model.IDPProviderFromModel(provider) addAggregate := LoginPolicyIDPProviderAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoProvider, es.IamID) @@ -815,14 +846,14 @@ func (es *OrgEventstore) PrepareRemoveIDPProviderFromLoginPolicy(ctx context.Con if provider == nil || !provider.IsValid() { return nil, nil, errors.ThrowPreconditionFailed(nil, "EVENT-Esi8c", "Errors.IdpProviderInvalid") } - existing, err := es.OrgByID(ctx, org_model.NewOrg(provider.AggregateID)) + org, err := es.OrgByID(ctx, org_model.NewOrg(provider.AggregateID)) if err != nil { return nil, nil, err } - if _, m := existing.LoginPolicy.GetIdpProvider(provider.IdpConfigID); m == nil { + if _, m := org.LoginPolicy.GetIdpProvider(provider.IdpConfigID); m == nil { return nil, nil, errors.ThrowPreconditionFailed(nil, "EVENT-29skr", "Errors.IAM.LoginPolicy.IdpProviderNotExisting") } - repoOrg := model.OrgFromModel(existing) + repoOrg := model.OrgFromModel(org) providerID := &iam_es_model.IDPProviderID{provider.IdpConfigID} providerAggregates, err := LoginPolicyIDPProviderRemovedAggregate(ctx, es.Eventstore.AggregateCreator(), repoOrg, providerID, cascade) if err != nil { @@ -838,3 +869,184 @@ func (es *OrgEventstore) RemoveIDPProviderFromLoginPolicy(ctx context.Context, p } return es_sdk.PushAggregates(ctx, es.PushAggregates, repoOrg.AppendEvents, agg) } + +func (es *OrgEventstore) AddPasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Sjkl9", "Errors.Org.PasswordComplexityPolicy.Invalid") + } + + if err := policy.IsValid(); err != nil { + return nil, err + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoPasswordComplexityPolicy := iam_es_model.PasswordComplexityPolicyFromModel(policy) + + addAggregate := PasswordComplexityPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPasswordComplexityPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.PasswordComplexityPolicyToModel(repoOrg.PasswordComplexityPolicy), nil +} + +func (es *OrgEventstore) ChangePasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_model.PasswordComplexityPolicy, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-r5Hd", "Errors.Org.PasswordComplexityPolicy.Empty") + } + if err := policy.IsValid(); err != nil { + return nil, err + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + if org.PasswordComplexityPolicy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-v6Hdr", "Errors.Org.PasswordComplexityPolicy.NotExisting") + } + + repoOrg := model.OrgFromModel(org) + repoPasswordComplexityPolicy := iam_es_model.PasswordComplexityPolicyFromModel(policy) + + addAggregate := PasswordComplexityPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPasswordComplexityPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.PasswordComplexityPolicyToModel(repoOrg.PasswordComplexityPolicy), nil +} + +func (es *OrgEventstore) RemovePasswordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) error { + if policy == nil || policy.AggregateID == "" { + return errors.ThrowPreconditionFailed(nil, "EVENT-3Ghs8", "Errors.Org.PasswordComplexityPolicy.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return err + } + repoOrg := model.OrgFromModel(org) + + addAggregate := PasswordComplexityPolicyRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg) + return es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) +} + +func (es *OrgEventstore) AddPasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + if policy == nil || policy.AggregateID == "" { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Sjkl9", "Errors.Org.PasswordAgePolicy.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoPasswordAgePolicy := iam_es_model.PasswordAgePolicyFromModel(policy) + + addAggregate := PasswordAgePolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPasswordAgePolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.PasswordAgePolicyToModel(repoOrg.PasswordAgePolicy), nil +} + +func (es *OrgEventstore) ChangePasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_model.PasswordAgePolicy, error) { + if policy == nil || policy.AggregateID == "" { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-r5Hd", "Errors.Org.PasswordAgePolicy.Empty") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + if org.PasswordAgePolicy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-v6Hdr", "Errors.Org.PasswordAgePolicy.NotExisting") + } + + repoOrg := model.OrgFromModel(org) + repoPasswordAgePolicy := iam_es_model.PasswordAgePolicyFromModel(policy) + + addAggregate := PasswordAgePolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPasswordAgePolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.PasswordAgePolicyToModel(repoOrg.PasswordAgePolicy), nil +} + +func (es *OrgEventstore) RemovePasswordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) error { + if policy == nil || policy.AggregateID == "" { + return errors.ThrowPreconditionFailed(nil, "EVENT-3Ghs8", "Errors.Org.PasswordAgePolicy.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return err + } + repoOrg := model.OrgFromModel(org) + + addAggregate := PasswordAgePolicyRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg) + return es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) +} + +func (es *OrgEventstore) AddPasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + if policy == nil || policy.AggregateID == "" { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-6Zdk9", "Errors.Org.PasswordLockoutPolicy.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoPasswordLockoutPolicy := iam_es_model.PasswordLockoutPolicyFromModel(policy) + + addAggregate := PasswordLockoutPolicyAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPasswordLockoutPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.PasswordLockoutPolicyToModel(repoOrg.PasswordLockoutPolicy), nil +} + +func (es *OrgEventstore) ChangePasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_model.PasswordLockoutPolicy, error) { + if policy == nil || policy.AggregateID == "" { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-lp0Sf", "Errors.Org.PasswordLockoutPolicy.Empty") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return nil, err + } + + if org.PasswordLockoutPolicy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-3Fks9", "Errors.Org.PasswordLockoutPolicy.NotExisting") + } + + repoOrg := model.OrgFromModel(org) + repoPasswordLockoutPolicy := iam_es_model.PasswordLockoutPolicyFromModel(policy) + + addAggregate := PasswordLockoutPolicyChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoPasswordLockoutPolicy) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.PasswordLockoutPolicyToModel(repoOrg.PasswordLockoutPolicy), nil +} + +func (es *OrgEventstore) RemovePasswordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) error { + if policy == nil || policy.AggregateID == "" { + return errors.ThrowPreconditionFailed(nil, "EVENT-6Hls0", "Errors.Org.PasswordLockoutPolicy.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(policy.AggregateID)) + if err != nil { + return err + } + repoOrg := model.OrgFromModel(org) + + addAggregate := PasswordLockoutPolicyRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg) + return es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) +} diff --git a/internal/org/repository/eventsourcing/eventstore_mock_test.go b/internal/org/repository/eventsourcing/eventstore_mock_test.go index a2ab610d10..5592ede9ca 100644 --- a/internal/org/repository/eventsourcing/eventstore_mock_test.go +++ b/internal/org/repository/eventsourcing/eventstore_mock_test.go @@ -2,6 +2,7 @@ package eventsourcing import ( "encoding/json" + "github.com/caos/zitadel/internal/crypto" iam_model "github.com/caos/zitadel/internal/iam/model" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" @@ -41,7 +42,7 @@ func GetMockChangesOrgOK(ctrl *gomock.Controller) *OrgEventstore { } events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateIDApp", Sequence: 1, AggregateType: repo_model.OrgAggregate, Data: data}, + {AggregateID: "AggregateIDApp", Sequence: 1, AggregateType: repo_model.OrgAggregate, Data: data}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -63,7 +64,7 @@ func GetMockChangesOrgWithCrypto(ctrl *gomock.Controller) *OrgEventstore { } data, _ := json.Marshal(org) events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: data}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: data}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -77,9 +78,9 @@ func GetMockChangesOrgWithOIDCIdp(ctrl *gomock.Controller) *OrgEventstore { idpData, _ := json.Marshal(iam_es_model.IDPConfig{IDPConfigID: "IDPConfigID", Name: "Name"}) oidcData, _ := json.Marshal(iam_es_model.OIDCIDPConfig{IDPConfigID: "IDPConfigID", ClientID: "ClientID"}) events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IDPConfigAdded, Data: idpData}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OIDCIDPConfigAdded, Data: oidcData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.IDPConfigAdded, Data: idpData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.OIDCIDPConfigAdded, Data: oidcData}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) @@ -93,9 +94,77 @@ func GetMockChangesOrgWithLoginPolicy(ctrl *gomock.Controller) *OrgEventstore { loginPolicy, _ := json.Marshal(iam_es_model.LoginPolicy{AllowRegister: true, AllowExternalIdp: true, AllowUsernamePassword: true}) idpData, _ := json.Marshal(iam_es_model.IDPProvider{IDPConfigID: "IDPConfigID", Type: int32(iam_model.IDPProviderTypeSystem)}) events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyAdded, Data: loginPolicy}, - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyIDPProviderAdded, Data: idpData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyAdded, Data: loginPolicy}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.LoginPolicyIDPProviderAdded, Data: idpData}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockChangesOrgWithPasswordComplexityPolicy(ctrl *gomock.Controller) *OrgEventstore { + orgData, _ := json.Marshal(model.Org{Name: "MusterOrg"}) + passwordComplexityPolicy, _ := json.Marshal(iam_es_model.PasswordComplexityPolicy{ + MinLength: 10, + HasLowercase: true, + HasUppercase: true, + HasSymbol: true, + HasNumber: true, + }) + events := []*es_models.Event{ + {AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordComplexityPolicyAdded, Data: passwordComplexityPolicy}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockChangesOrgWithPasswordLockoutPolicy(ctrl *gomock.Controller) *OrgEventstore { + orgData, _ := json.Marshal(model.Org{Name: "MusterOrg"}) + passwordLockoutPolicy, _ := json.Marshal(iam_es_model.PasswordLockoutPolicy{ + MaxAttempts: 10, + ShowLockOutFailures: true, + }) + events := []*es_models.Event{ + {AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordLockoutPolicyAdded, Data: passwordLockoutPolicy}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockChangesOrgWithPasswordAgePolicy(ctrl *gomock.Controller) *OrgEventstore { + orgData, _ := json.Marshal(model.Org{Name: "MusterOrg"}) + passwordAgePolicy, _ := json.Marshal(iam_es_model.PasswordAgePolicy{ + MaxAgeDays: 10, + ExpireWarnDays: 10, + }) + events := []*es_models.Event{ + {AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + {AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordAgePolicyAdded, Data: passwordAgePolicy}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockChangesOrgWithLabelPolicy(ctrl *gomock.Controller) *OrgEventstore { + orgData, _ := json.Marshal(model.Org{Name: "MusterOrg"}) + labelPolicy, _ := json.Marshal(iam_es_model.LabelPolicy{PrimaryColor: "000001", SecondaryColor: "FFFFF1"}) + events := []*es_models.Event{ + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.LabelPolicyAdded, Data: labelPolicy}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) diff --git a/internal/org/repository/eventsourcing/eventstore_test.go b/internal/org/repository/eventsourcing/eventstore_test.go index 440d585bdf..78eb10acb4 100644 --- a/internal/org/repository/eventsourcing/eventstore_test.go +++ b/internal/org/repository/eventsourcing/eventstore_test.go @@ -3,10 +3,11 @@ package eventsourcing import ( "context" "encoding/json" - iam_model "github.com/caos/zitadel/internal/iam/model" "testing" "time" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" @@ -1656,11 +1657,15 @@ func TestChangesOrg(t *testing.T) { if err != nil { } } - if !tt.res.wantErr && result.LastSequence != tt.res.changes.LastSequence && org.Name != tt.res.org.Name { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.changes.LastSequence, result.LastSequence) - } - if tt.res.wantErr && !tt.res.errFunc(err) { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.LastSequence != tt.res.changes.LastSequence && org.Name != tt.res.org.Name { + t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.changes.LastSequence, result.LastSequence) } }) } @@ -1749,25 +1754,28 @@ func TestAddIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.AddIDPConfig(tt.args.ctx, tt.args.idp) - - if !tt.res.wantErr && result.IDPConfigID == "" { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.IDPConfigID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.OIDCConfig.IDPConfigID == "" { + if result.OIDCConfig.IDPConfigID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.OIDCConfig == nil && result.OIDCConfig.ClientSecret == nil { + if result.OIDCConfig == nil && result.OIDCConfig.ClientSecret == nil { t.Errorf("result has no client secret") } - if !tt.res.wantErr && result.Name != tt.res.result.Name { + if result.Name != tt.res.result.Name { t.Errorf("got wrong result key: expected: %v, actual: %v ", tt.res.result.Name, result.Name) } - if !tt.res.wantErr && result.OIDCConfig.ClientID != tt.res.result.OIDCConfig.ClientID { + if result.OIDCConfig.ClientID != tt.res.result.OIDCConfig.ClientID { t.Errorf("got wrong result key: expected: %v, actual: %v ", tt.res.result.OIDCConfig.ClientID, result.OIDCConfig.ClientID) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -1863,19 +1871,22 @@ func TestChangeIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ChangeIDPConfig(tt.args.ctx, tt.args.idp) - - if !tt.res.wantErr && result.AggregateID == "" { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result IdpConfigID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.Name != tt.res.result.Name { + if result.Name != tt.res.result.Name { t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.result.Name, result.Name) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -2050,19 +2061,22 @@ func TestDeactivateIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.DeactivateIDPConfig(tt.args.ctx, tt.args.idp.AggregateID, tt.args.idp.IDPConfigID) - - if !tt.res.wantErr && result.AggregateID == "" { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result IDPConfigID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.State != tt.res.result.State { + if result.State != tt.res.result.State { t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.res.result.State, result.State) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -2157,19 +2171,22 @@ func TestReactivateIdpConfiguration(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ReactivateIDPConfig(tt.args.ctx, tt.args.idp.AggregateID, tt.args.idp.IDPConfigID) - - if !tt.res.wantErr && result.AggregateID == "" { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result IDPConfigID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.State != tt.res.result.State { + if result.State != tt.res.result.State { t.Errorf("got wrong result state: expected: %v, actual: %v ", tt.res.result.State, result.State) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -2267,19 +2284,22 @@ func TestChangeOIDCIDPConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ChangeIDPOIDCConfig(tt.args.ctx, tt.args.config) - - if !tt.res.wantErr && result.AggregateID == "" { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AggregateID == "" { t.Errorf("result has no id") } - if !tt.res.wantErr && result.IDPConfigID != tt.res.result.IDPConfigID { + if result.IDPConfigID != tt.res.result.IDPConfigID { t.Errorf("got wrong result AppID: expected: %v, actual: %v ", tt.res.result.IDPConfigID, result.IDPConfigID) } - if !tt.res.wantErr && result.ClientID != tt.res.result.ClientID { + if result.ClientID != tt.res.result.ClientID { t.Errorf("got wrong result responsetype: expected: %v, actual: %v ", tt.res.result.ClientID, result.ClientID) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -2431,19 +2451,22 @@ func TestChangeLoginPolicy(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.ChangeLoginPolicy(tt.args.ctx, tt.args.policy) - - if !tt.res.wantErr && result.AllowRegister != tt.res.result.AllowRegister { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.AllowRegister != tt.res.result.AllowRegister { t.Errorf("got wrong result AllowRegister: expected: %v, actual: %v ", tt.res.result.AllowRegister, result.AllowRegister) } - if !tt.res.wantErr && result.AllowUsernamePassword != tt.res.result.AllowUsernamePassword { + if result.AllowUsernamePassword != tt.res.result.AllowUsernamePassword { t.Errorf("got wrong result AllowUsernamePassword: expected: %v, actual: %v ", tt.res.result.AllowUsernamePassword, result.AllowUsernamePassword) } - if !tt.res.wantErr && result.AllowExternalIdp != tt.res.result.AllowExternalIdp { + if result.AllowExternalIdp != tt.res.result.AllowExternalIdp { t.Errorf("got wrong result AllowExternalIDP: expected: %v, actual: %v ", tt.res.result.AllowExternalIdp, result.AllowExternalIdp) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -2603,16 +2626,19 @@ func TestAddIdpProviderToLoginPolicy(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := tt.args.es.AddIDPProviderToLoginPolicy(tt.args.ctx, tt.args.provider) - - if !tt.res.wantErr && result.IdpConfigID != tt.res.result.IdpConfigID { + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.IdpConfigID != tt.res.result.IdpConfigID { t.Errorf("got wrong result IDPConfigID: expected: %v, actual: %v ", tt.res.result.IdpConfigID, result.IdpConfigID) } - if !tt.res.wantErr && result.Type != tt.res.result.Type { + if result.Type != tt.res.result.Type { t.Errorf("got wrong result Type: expected: %v, actual: %v ", tt.res.result.Type, result.Type) } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } }) } } @@ -2705,3 +2731,930 @@ func TestRemoveIdpProviderFromLoginPolicy(t *testing.T) { }) } } + +func TestAddLabelPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.LabelPolicy + } + type res struct { + result *iam_model.LabelPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add label policy, ok", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + }, + }, + res: res{ + result: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing org not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddLabelPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.PrimaryColor != tt.res.result.PrimaryColor { + t.Errorf("got wrong result PrimaryColor: expected: %v, actual: %v ", tt.res.result.PrimaryColor, result.PrimaryColor) + } + }) + } +} + +func TestChangeLabelPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.LabelPolicy + } + type res struct { + result *iam_model.LabelPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add label policy, ok", + args: args{ + es: GetMockChangesOrgWithLabelPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + SecondaryColor: "FFFFFF", + }, + }, + res: res{ + result: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + PrimaryColor: "000000", + SecondaryColor: "FFFFFF", + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.LabelPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangeLabelPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.PrimaryColor != tt.res.result.PrimaryColor { + t.Errorf("got wrong result PrimaryColor: expected: %v, actual: %v ", tt.res.result.PrimaryColor, result.PrimaryColor) + } + if result.SecondaryColor != tt.res.result.SecondaryColor { + t.Errorf("got wrong result SecondaryColor: expected: %v, actual: %v ", tt.res.result.SecondaryColor, result.SecondaryColor) + } + }) + } +} +func TestAddPasswordComplexityPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordComplexityPolicy + } + type res struct { + result *iam_model.PasswordComplexityPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password complexity policy, ok", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + HasLowercase: true, + HasUppercase: true, + HasSymbol: true, + HasNumber: true, + }, + }, + res: res{ + result: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + HasLowercase: true, + HasUppercase: true, + HasSymbol: true, + HasNumber: true, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsErrorInvalidArgument, + }, + }, + { + name: "existing org not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddPasswordComplexityPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MinLength != tt.res.result.MinLength { + t.Errorf("got wrong result MinLength: expected: %v, actual: %v ", tt.res.result.MinLength, result.MinLength) + } + if result.HasLowercase != tt.res.result.HasLowercase { + t.Errorf("got wrong result HasLowercase: expected: %v, actual: %v ", tt.res.result.HasLowercase, result.HasLowercase) + } + if result.HasUppercase != tt.res.result.HasUppercase { + t.Errorf("got wrong result HasUppercase: expected: %v, actual: %v ", tt.res.result.HasUppercase, result.HasUppercase) + } + if result.HasNumber != tt.res.result.HasNumber { + t.Errorf("got wrong result HasNumber: expected: %v, actual: %v ", tt.res.result.HasNumber, result.HasNumber) + } + if result.HasSymbol != tt.res.result.HasSymbol { + t.Errorf("got wrong result HasSymbol: expected: %v, actual: %v ", tt.res.result.HasSymbol, result.HasSymbol) + } + }) + } +} + +func TestChangePasswordComplexityPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordComplexityPolicy + } + type res struct { + result *iam_model.PasswordComplexityPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password complexity policy, ok", + args: args{ + es: GetMockChangesOrgWithPasswordComplexityPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 5, + HasLowercase: false, + HasUppercase: false, + HasSymbol: false, + HasNumber: false, + }, + }, + res: res{ + result: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 5, + HasLowercase: false, + HasUppercase: false, + HasSymbol: false, + HasNumber: false, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsErrorInvalidArgument, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MinLength: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangePasswordComplexityPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MinLength != tt.res.result.MinLength { + t.Errorf("got wrong result MinLength: expected: %v, actual: %v ", tt.res.result.MinLength, result.MinLength) + } + if result.HasLowercase != tt.res.result.HasLowercase { + t.Errorf("got wrong result HasLowercase: expected: %v, actual: %v ", tt.res.result.HasLowercase, result.HasLowercase) + } + if result.HasUppercase != tt.res.result.HasUppercase { + t.Errorf("got wrong result HasUppercase: expected: %v, actual: %v ", tt.res.result.HasUppercase, result.HasUppercase) + } + if result.HasNumber != tt.res.result.HasNumber { + t.Errorf("got wrong result HasNumber: expected: %v, actual: %v ", tt.res.result.HasNumber, result.HasNumber) + } + if result.HasSymbol != tt.res.result.HasSymbol { + t.Errorf("got wrong result HasSymbol: expected: %v, actual: %v ", tt.res.result.HasSymbol, result.HasSymbol) + } + }) + } +} + +func TestRemovePasswordComplexityPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordComplexityPolicy + } + type res struct { + result *iam_model.PasswordComplexityPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "remove password compelxity policy, ok", + args: args{ + es: GetMockChangesOrgWithPasswordComplexityPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{}, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordComplexityPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.args.es.RemovePasswordComplexityPolicy(tt.args.ctx, tt.args.policy) + + if !tt.res.wantErr && err != nil { + t.Errorf("got wrong result should not get err: %v", err) + } + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestAddPasswordAgePolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordAgePolicy + } + type res struct { + result *iam_model.PasswordAgePolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password age policy, ok", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + ExpireWarnDays: 10, + }, + }, + res: res{ + result: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + ExpireWarnDays: 10, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing org not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + ExpireWarnDays: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddPasswordAgePolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MaxAgeDays != tt.res.result.MaxAgeDays { + t.Errorf("got wrong result MaxAgeDays: expected: %v, actual: %v ", tt.res.result.MaxAgeDays, result.MaxAgeDays) + } + if result.ExpireWarnDays != tt.res.result.ExpireWarnDays { + t.Errorf("got wrong result.ExpireWarnDays: expected: %v, actual: %v ", tt.res.result.ExpireWarnDays, result.ExpireWarnDays) + } + }) + } +} + +func TestChangePasswordAgePolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordAgePolicy + } + type res struct { + result *iam_model.PasswordAgePolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password age policy, ok", + args: args{ + es: GetMockChangesOrgWithPasswordAgePolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 5, + ExpireWarnDays: 5, + }, + }, + res: res{ + result: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 5, + ExpireWarnDays: 5, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAgeDays: 10, + ExpireWarnDays: 10, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangePasswordAgePolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MaxAgeDays != tt.res.result.MaxAgeDays { + t.Errorf("got wrong result MaxAgeDays: expected: %v, actual: %v ", tt.res.result.MaxAgeDays, result.MaxAgeDays) + } + if result.ExpireWarnDays != tt.res.result.ExpireWarnDays { + t.Errorf("got wrong result.ExpireWarnDays: expected: %v, actual: %v ", tt.res.result.ExpireWarnDays, result.ExpireWarnDays) + } + }) + } +} + +func TestRemovePasswordAgePolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordAgePolicy + } + type res struct { + result *iam_model.PasswordAgePolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "remove password age policy, ok", + args: args{ + es: GetMockChangesOrgWithPasswordAgePolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{}, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordAgePolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.args.es.RemovePasswordAgePolicy(tt.args.ctx, tt.args.policy) + + if !tt.res.wantErr && err != nil { + t.Errorf("got wrong result should not get err: %v", err) + } + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestAddPasswordLockoutPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordLockoutPolicy + } + type res struct { + result *iam_model.PasswordLockoutPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password lockout policy, ok", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + ShowLockOutFailures: true, + }, + }, + res: res{ + result: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + ShowLockOutFailures: true, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing org not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + ShowLockOutFailures: true, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddPasswordLockoutPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MaxAttempts != tt.res.result.MaxAttempts { + t.Errorf("got wrong result MaxAttempts: expected: %v, actual: %v ", tt.res.result.MaxAttempts, result.MaxAttempts) + } + if result.ShowLockOutFailures != tt.res.result.ShowLockOutFailures { + t.Errorf("got wrong result.ShowLockOutFailures: expected: %v, actual: %v ", tt.res.result.ShowLockOutFailures, result.ShowLockOutFailures) + } + }) + } +} + +func TestChangePasswordLockoutPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordLockoutPolicy + } + type res struct { + result *iam_model.PasswordLockoutPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password lockout policy, ok", + args: args{ + es: GetMockChangesOrgWithPasswordLockoutPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 5, + ShowLockOutFailures: false, + }, + }, + res: res{ + result: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 5, + ShowLockOutFailures: false, + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MaxAttempts: 10, + ShowLockOutFailures: true, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangePasswordLockoutPolicy(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MaxAttempts != tt.res.result.MaxAttempts { + t.Errorf("got wrong result MaxAttempts: expected: %v, actual: %v ", tt.res.result.MaxAttempts, result.MaxAttempts) + } + if result.ShowLockOutFailures != tt.res.result.ShowLockOutFailures { + t.Errorf("got wrong result.ShowLockOutFailures: expected: %v, actual: %v ", tt.res.result.ShowLockOutFailures, result.ShowLockOutFailures) + } + }) + } +} + +func TestRemovePasswordLockoutPolicy(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + policy *iam_model.PasswordLockoutPolicy + } + type res struct { + result *iam_model.PasswordLockoutPolicy + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "remove password lockout policy, ok", + args: args{ + es: GetMockChangesOrgWithPasswordLockoutPolicy(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{}, + }, + { + name: "invalid policy", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.PasswordLockoutPolicy{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.args.es.RemovePasswordLockoutPolicy(tt.args.ctx, tt.args.policy) + + if !tt.res.wantErr && err != nil { + t.Errorf("got wrong result should not get err: %v", err) + } + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/label_policy.go b/internal/org/repository/eventsourcing/label_policy.go new file mode 100644 index 0000000000..051f5e025e --- /dev/null +++ b/internal/org/repository/eventsourcing/label_policy.go @@ -0,0 +1,77 @@ +package eventsourcing + +import ( + "context" + + "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func LabelPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.LabelPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-TUWod", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingLabelPolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.LabelPolicyAdded, policy) + } +} + +func LabelPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.LabelPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-unRI2", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + changes := existing.LabelPolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Tz130", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.LabelPolicyChanged, changes) + } +} + +func LabelPolicyRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if existing == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-v7E9b", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.LabelPolicyRemoved, nil) + } +} + +func checkExistingLabelPolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + existing := false + for _, event := range events { + switch event.Type { + case model.LabelPolicyAdded: + existing = true + case model.LabelPolicyRemoved: + existing = false + } + } + if existing { + return errors.ThrowPreconditionFailed(nil, "EVENT-g9mCI", "Errors.Org.LabelPolicy.AlreadyExists") + } + return nil + } +} diff --git a/internal/org/repository/eventsourcing/label_policy_test.go b/internal/org/repository/eventsourcing/label_policy_test.go new file mode 100644 index 0000000000..ccd0c2a6ec --- /dev/null +++ b/internal/org/repository/eventsourcing/label_policy_test.go @@ -0,0 +1,186 @@ +package eventsourcing + +import ( + "context" + "testing" + + "github.com/caos/zitadel/internal/api/authz" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func TestLabelPolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.LabelPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add label polciy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + new: &iam_es_model.LabelPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PrimaryColor: "000000", + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.LabelPolicyAdded}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "label policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := LabelPolicyAddedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestLabelPolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.LabelPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change label policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + LabelPolicy: &iam_es_model.LabelPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + new: &iam_es_model.LabelPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PrimaryColor: "000000", + SecondaryColor: "FFFFFF", + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.LabelPolicyChanged}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "label policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := LabelPolicyChangedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/login_policy.go b/internal/org/repository/eventsourcing/login_policy.go index 1a59c08e01..1b31096b51 100644 --- a/internal/org/repository/eventsourcing/login_policy.go +++ b/internal/org/repository/eventsourcing/login_policy.go @@ -118,7 +118,10 @@ func checkExistingLoginPolicyIDPProviderValidation(idpProvider *iam_es_model.IDP switch event.Type { case model.IDPConfigAdded, iam_es_model.IDPConfigAdded: config := new(iam_es_model.IDPConfig) - config.SetData(event) + err := config.SetData(event) + if err != nil { + return err + } idpConfigs = append(idpConfigs, config) if event.AggregateType == model.OrgAggregate { config.Type = int32(iam_model.IDPProviderTypeOrg) @@ -127,27 +130,41 @@ func checkExistingLoginPolicyIDPProviderValidation(idpProvider *iam_es_model.IDP } case model.IDPConfigRemoved, iam_es_model.IDPConfigRemoved: config := new(iam_es_model.IDPConfig) - config.SetData(event) - for i, p := range idpConfigs { - if p.IDPConfigID == config.IDPConfigID { + err := config.SetData(event) + if err != nil { + return err + } + for i := len(idpConfigs) - 1; i >= 0; i-- { + if idpConfigs[i].IDPConfigID == config.IDPConfigID { idpConfigs[i] = idpConfigs[len(idpConfigs)-1] idpConfigs[len(idpConfigs)-1] = nil idpConfigs = idpConfigs[:len(idpConfigs)-1] + break } } case model.LoginPolicyIDPProviderAdded: idp := new(iam_es_model.IDPProvider) - idp.SetData(event) - case model.LoginPolicyIDPProviderRemoved: + err := idp.SetData(event) + if err != nil { + return err + } + idps = append(idps, idp) + case model.LoginPolicyIDPProviderRemoved, model.LoginPolicyIDPProviderCascadeRemoved: idp := new(iam_es_model.IDPProvider) - idp.SetData(event) - for i, p := range idps { - if p.IDPConfigID == idp.IDPConfigID { + err := idp.SetData(event) + if err != nil { + return err + } + for i := len(idps) - 1; i >= 0; i-- { + if idps[i].IDPConfigID == idp.IDPConfigID { idps[i] = idps[len(idps)-1] idps[len(idps)-1] = nil idps = idps[:len(idps)-1] + break } } + case model.LoginPolicyRemoved: + idps = make([]*iam_es_model.IDPProvider, 0) } } exists := false diff --git a/internal/org/repository/eventsourcing/model/label_policy.go b/internal/org/repository/eventsourcing/model/label_policy.go new file mode 100644 index 0000000000..13b281dd0f --- /dev/null +++ b/internal/org/repository/eventsourcing/model/label_policy.go @@ -0,0 +1,24 @@ +package model + +import ( + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func (o *Org) appendAddLabelPolicyEvent(event *es_models.Event) error { + o.LabelPolicy = new(iam_es_model.LabelPolicy) + err := o.LabelPolicy.SetDataLabel(event) + if err != nil { + return err + } + o.LabelPolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (o *Org) appendChangeLabelPolicyEvent(event *es_models.Event) error { + return o.LabelPolicy.SetDataLabel(event) +} + +func (o *Org) appendRemoveLabelPolicyEvent(event *es_models.Event) { + o.LabelPolicy = nil +} diff --git a/internal/org/repository/eventsourcing/model/label_policy_test.go b/internal/org/repository/eventsourcing/model/label_policy_test.go new file mode 100644 index 0000000000..819d76996a --- /dev/null +++ b/internal/org/repository/eventsourcing/model/label_policy_test.go @@ -0,0 +1,91 @@ +package model + +import ( + "encoding/json" + "testing" + + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func TestAppendAddLabelPolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.LabelPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append add label policy event", + args: args{ + org: &Org{}, + policy: &iam_es_model.LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}, + event: &es_models.Event{}, + }, + result: &Org{LabelPolicy: &iam_es_model.LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendAddLabelPolicyEvent(tt.args.event) + if tt.result.LabelPolicy.PrimaryColor != tt.args.org.LabelPolicy.PrimaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.LabelPolicy.PrimaryColor, tt.args.org.LabelPolicy.PrimaryColor) + } + if tt.result.LabelPolicy.SecondaryColor != tt.args.org.LabelPolicy.SecondaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.LabelPolicy.SecondaryColor, tt.args.org.LabelPolicy.SecondaryColor) + } + }) + } +} + +func TestAppendChangeLabelPolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.LabelPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append change label policy event", + args: args{ + org: &Org{LabelPolicy: &iam_es_model.LabelPolicy{ + SecondaryColor: "FFFFF0", + PrimaryColor: "000001", + }}, + policy: &iam_es_model.LabelPolicy{PrimaryColor: "000000", SecondaryColor: "FFFFFF"}, + event: &es_models.Event{}, + }, + result: &Org{LabelPolicy: &iam_es_model.LabelPolicy{ + SecondaryColor: "FFFFFF", + PrimaryColor: "000000", + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendChangeLabelPolicyEvent(tt.args.event) + if tt.result.LabelPolicy.PrimaryColor != tt.args.org.LabelPolicy.PrimaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.LabelPolicy.PrimaryColor, tt.args.org.LabelPolicy.PrimaryColor) + } + if tt.result.LabelPolicy.SecondaryColor != tt.args.org.LabelPolicy.SecondaryColor { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.LabelPolicy.SecondaryColor, tt.args.org.LabelPolicy.SecondaryColor) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/model/org.go b/internal/org/repository/eventsourcing/model/org.go index 18c04acaff..b5402385d2 100644 --- a/internal/org/repository/eventsourcing/model/org.go +++ b/internal/org/repository/eventsourcing/model/org.go @@ -2,6 +2,7 @@ package model import ( "encoding/json" + "github.com/caos/zitadel/internal/iam/model" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" @@ -20,11 +21,15 @@ type Org struct { Name string `json:"name,omitempty"` State int32 `json:"-"` - Domains []*OrgDomain `json:"-"` - Members []*OrgMember `json:"-"` - OrgIamPolicy *OrgIAMPolicy `json:"-"` - LoginPolicy *iam_es_model.LoginPolicy `json:"-"` - IDPs []*iam_es_model.IDPConfig `json:"-"` + Domains []*OrgDomain `json:"-"` + Members []*OrgMember `json:"-"` + OrgIAMPolicy *iam_es_model.OrgIAMPolicy `json:"-"` + LabelPolicy *iam_es_model.LabelPolicy `json:"-"` + IDPs []*iam_es_model.IDPConfig `json:"-"` + LoginPolicy *iam_es_model.LoginPolicy `json:"-"` + PasswordComplexityPolicy *iam_es_model.PasswordComplexityPolicy `json:"-"` + PasswordAgePolicy *iam_es_model.PasswordAgePolicy `json:"-"` + PasswordLockoutPolicy *iam_es_model.PasswordLockoutPolicy `json:"-"` } func OrgFromModel(org *org_model.Org) *Org { @@ -40,11 +45,23 @@ func OrgFromModel(org *org_model.Org) *Org { IDPs: idps, } if org.OrgIamPolicy != nil { - converted.OrgIamPolicy = OrgIAMPolicyFromModel(org.OrgIamPolicy) + converted.OrgIAMPolicy = iam_es_model.OrgIAMPolicyFromModel(org.OrgIamPolicy) } if org.LoginPolicy != nil { converted.LoginPolicy = iam_es_model.LoginPolicyFromModel(org.LoginPolicy) } + if org.LabelPolicy != nil { + converted.LabelPolicy = iam_es_model.LabelPolicyFromModel(org.LabelPolicy) + } + if org.PasswordComplexityPolicy != nil { + converted.PasswordComplexityPolicy = iam_es_model.PasswordComplexityPolicyFromModel(org.PasswordComplexityPolicy) + } + if org.PasswordAgePolicy != nil { + converted.PasswordAgePolicy = iam_es_model.PasswordAgePolicyFromModel(org.PasswordAgePolicy) + } + if org.PasswordLockoutPolicy != nil { + converted.PasswordLockoutPolicy = iam_es_model.PasswordLockoutPolicyFromModel(org.PasswordLockoutPolicy) + } return converted } @@ -57,12 +74,24 @@ func OrgToModel(org *Org) *org_model.Org { Members: OrgMembersToModel(org.Members), IDPs: iam_es_model.IDPConfigsToModel(org.IDPs), } - if org.OrgIamPolicy != nil { - converted.OrgIamPolicy = OrgIAMPolicyToModel(org.OrgIamPolicy) + if org.OrgIAMPolicy != nil { + converted.OrgIamPolicy = iam_es_model.OrgIAMPolicyToModel(org.OrgIAMPolicy) } if org.LoginPolicy != nil { converted.LoginPolicy = iam_es_model.LoginPolicyToModel(org.LoginPolicy) } + if org.LabelPolicy != nil { + converted.LabelPolicy = iam_es_model.LabelPolicyToModel(org.LabelPolicy) + } + if org.PasswordComplexityPolicy != nil { + converted.PasswordComplexityPolicy = iam_es_model.PasswordComplexityPolicyToModel(org.PasswordComplexityPolicy) + } + if org.PasswordAgePolicy != nil { + converted.PasswordAgePolicy = iam_es_model.PasswordAgePolicyToModel(org.PasswordAgePolicy) + } + if org.PasswordLockoutPolicy != nil { + converted.PasswordLockoutPolicy = iam_es_model.PasswordLockoutPolicyToModel(org.PasswordLockoutPolicy) + } return converted } @@ -154,6 +183,12 @@ func (o *Org) AppendEvent(event *es_models.Event) (err error) { err = o.appendAddOIDCIDPConfigEvent(event) case OIDCIDPConfigChanged: err = o.appendChangeOIDCIDPConfigEvent(event) + case LabelPolicyAdded: + err = o.appendAddLabelPolicyEvent(event) + case LabelPolicyChanged: + err = o.appendChangeLabelPolicyEvent(event) + case LabelPolicyRemoved: + o.appendRemoveLabelPolicyEvent(event) case LoginPolicyAdded: err = o.appendAddLoginPolicyEvent(event) case LoginPolicyChanged: @@ -164,6 +199,24 @@ func (o *Org) AppendEvent(event *es_models.Event) (err error) { err = o.appendAddIdpProviderToLoginPolicyEvent(event) case LoginPolicyIDPProviderRemoved: err = o.appendRemoveIdpProviderFromLoginPolicyEvent(event) + case PasswordComplexityPolicyAdded: + err = o.appendAddPasswordComplexityPolicyEvent(event) + case PasswordComplexityPolicyChanged: + err = o.appendChangePasswordComplexityPolicyEvent(event) + case PasswordComplexityPolicyRemoved: + o.appendRemovePasswordComplexityPolicyEvent(event) + case PasswordAgePolicyAdded: + err = o.appendAddPasswordAgePolicyEvent(event) + case PasswordAgePolicyChanged: + err = o.appendChangePasswordAgePolicyEvent(event) + case PasswordAgePolicyRemoved: + o.appendRemovePasswordAgePolicyEvent(event) + case PasswordLockoutPolicyAdded: + err = o.appendAddPasswordLockoutPolicyEvent(event) + case PasswordLockoutPolicyChanged: + err = o.appendChangePasswordLockoutPolicyEvent(event) + case PasswordLockoutPolicyRemoved: + o.appendRemovePasswordLockoutPolicyEvent(event) } if err != nil { return err diff --git a/internal/org/repository/eventsourcing/model/org_iam_policy.go b/internal/org/repository/eventsourcing/model/org_iam_policy.go index 354ee5cc3c..f7b6241426 100644 --- a/internal/org/repository/eventsourcing/model/org_iam_policy.go +++ b/internal/org/repository/eventsourcing/model/org_iam_policy.go @@ -1,72 +1,24 @@ package model import ( - "encoding/json" - "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" - org_model "github.com/caos/zitadel/internal/org/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" ) -type OrgIAMPolicy struct { - models.ObjectRoot - - Description string `json:"description,omitempty"` - State int32 `json:"-"` - UserLoginMustBeDomain bool `json:"userLoginMustBeDomain"` -} - -func OrgIAMPolicyToModel(policy *OrgIAMPolicy) *org_model.OrgIAMPolicy { - return &org_model.OrgIAMPolicy{ - ObjectRoot: policy.ObjectRoot, - State: org_model.PolicyState(policy.State), - UserLoginMustBeDomain: policy.UserLoginMustBeDomain, - } -} - -func OrgIAMPolicyFromModel(policy *org_model.OrgIAMPolicy) *OrgIAMPolicy { - return &OrgIAMPolicy{ - ObjectRoot: policy.ObjectRoot, - State: int32(policy.State), - UserLoginMustBeDomain: policy.UserLoginMustBeDomain, - } -} - func (o *Org) appendAddOrgIAMPolicyEvent(event *es_models.Event) error { - o.OrgIamPolicy = new(OrgIAMPolicy) - err := o.OrgIamPolicy.SetData(event) + o.OrgIAMPolicy = new(iam_es_model.OrgIAMPolicy) + err := o.OrgIAMPolicy.SetData(event) if err != nil { return err } - o.OrgIamPolicy.ObjectRoot.CreationDate = event.CreationDate + o.OrgIAMPolicy.ObjectRoot.CreationDate = event.CreationDate return nil } func (o *Org) appendChangeOrgIAMPolicyEvent(event *es_models.Event) error { - return o.OrgIamPolicy.SetData(event) + return o.OrgIAMPolicy.SetData(event) } func (o *Org) appendRemoveOrgIAMPolicyEvent() { - o.OrgIamPolicy = nil -} - -func (p *OrgIAMPolicy) Changes(changed *OrgIAMPolicy) map[string]interface{} { - changes := make(map[string]interface{}, 2) - - if changed.Description != p.Description { - changes["description"] = changed.Description - } - if changed.UserLoginMustBeDomain != p.UserLoginMustBeDomain { - changes["userLoginMustBeDomain"] = changed.UserLoginMustBeDomain - } - - return changes -} - -func (p *OrgIAMPolicy) SetData(event *es_models.Event) error { - err := json.Unmarshal(event.Data, p) - if err != nil { - return errors.ThrowInternal(err, "EVENT-7JS9d", "unable to unmarshal data") - } - return nil + o.OrgIAMPolicy = nil } diff --git a/internal/org/repository/eventsourcing/model/password_age_policy.go b/internal/org/repository/eventsourcing/model/password_age_policy.go new file mode 100644 index 0000000000..09ddb64529 --- /dev/null +++ b/internal/org/repository/eventsourcing/model/password_age_policy.go @@ -0,0 +1,24 @@ +package model + +import ( + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func (o *Org) appendAddPasswordAgePolicyEvent(event *es_models.Event) error { + o.PasswordAgePolicy = new(iam_es_model.PasswordAgePolicy) + err := o.PasswordAgePolicy.SetData(event) + if err != nil { + return err + } + o.PasswordAgePolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (o *Org) appendChangePasswordAgePolicyEvent(event *es_models.Event) error { + return o.PasswordAgePolicy.SetData(event) +} + +func (o *Org) appendRemovePasswordAgePolicyEvent(event *es_models.Event) { + o.PasswordAgePolicy = nil +} diff --git a/internal/org/repository/eventsourcing/model/password_age_policy_test.go b/internal/org/repository/eventsourcing/model/password_age_policy_test.go new file mode 100644 index 0000000000..34e03ad092 --- /dev/null +++ b/internal/org/repository/eventsourcing/model/password_age_policy_test.go @@ -0,0 +1,86 @@ +package model + +import ( + "encoding/json" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "testing" +) + +func TestAppendAddPasswordAgePolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.PasswordAgePolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append add password age policy event", + args: args{ + org: &Org{}, + policy: &iam_es_model.PasswordAgePolicy{MaxAgeDays: 10}, + event: &es_models.Event{}, + }, + result: &Org{PasswordAgePolicy: &iam_es_model.PasswordAgePolicy{MaxAgeDays: 10}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendAddPasswordAgePolicyEvent(tt.args.event) + if tt.result.PasswordAgePolicy.MaxAgeDays != tt.args.org.PasswordAgePolicy.MaxAgeDays { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordAgePolicy.MaxAgeDays, tt.args.org.PasswordAgePolicy.MaxAgeDays) + } + }) + } +} + +func TestAppendChangePasswordAgePolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.PasswordAgePolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append change password age policy event", + args: args{ + org: &Org{PasswordAgePolicy: &iam_es_model.PasswordAgePolicy{ + MaxAgeDays: 10, + }}, + policy: &iam_es_model.PasswordAgePolicy{MaxAgeDays: 5, ExpireWarnDays: 10}, + event: &es_models.Event{}, + }, + result: &Org{PasswordAgePolicy: &iam_es_model.PasswordAgePolicy{ + MaxAgeDays: 5, + ExpireWarnDays: 10, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendChangePasswordAgePolicyEvent(tt.args.event) + if tt.result.PasswordAgePolicy.MaxAgeDays != tt.args.org.PasswordAgePolicy.MaxAgeDays { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordAgePolicy.MaxAgeDays, tt.args.org.PasswordAgePolicy.MaxAgeDays) + } + if tt.result.PasswordAgePolicy.ExpireWarnDays != tt.args.org.PasswordAgePolicy.ExpireWarnDays { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordAgePolicy.ExpireWarnDays, tt.args.org.PasswordAgePolicy.ExpireWarnDays) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/model/password_complexity_policy.go b/internal/org/repository/eventsourcing/model/password_complexity_policy.go new file mode 100644 index 0000000000..be9e769a1e --- /dev/null +++ b/internal/org/repository/eventsourcing/model/password_complexity_policy.go @@ -0,0 +1,24 @@ +package model + +import ( + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func (o *Org) appendAddPasswordComplexityPolicyEvent(event *es_models.Event) error { + o.PasswordComplexityPolicy = new(iam_es_model.PasswordComplexityPolicy) + err := o.PasswordComplexityPolicy.SetData(event) + if err != nil { + return err + } + o.PasswordComplexityPolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (o *Org) appendChangePasswordComplexityPolicyEvent(event *es_models.Event) error { + return o.PasswordComplexityPolicy.SetData(event) +} + +func (o *Org) appendRemovePasswordComplexityPolicyEvent(event *es_models.Event) { + o.PasswordComplexityPolicy = nil +} diff --git a/internal/org/repository/eventsourcing/model/password_complexity_policy_test.go b/internal/org/repository/eventsourcing/model/password_complexity_policy_test.go new file mode 100644 index 0000000000..85417bfe36 --- /dev/null +++ b/internal/org/repository/eventsourcing/model/password_complexity_policy_test.go @@ -0,0 +1,86 @@ +package model + +import ( + "encoding/json" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "testing" +) + +func TestAppendAddPasswordComplexityPolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.PasswordComplexityPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append add password complexity policy event", + args: args{ + org: &Org{}, + policy: &iam_es_model.PasswordComplexityPolicy{MinLength: 10}, + event: &es_models.Event{}, + }, + result: &Org{PasswordComplexityPolicy: &iam_es_model.PasswordComplexityPolicy{MinLength: 10}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendAddPasswordComplexityPolicyEvent(tt.args.event) + if tt.result.PasswordComplexityPolicy.MinLength != tt.args.org.PasswordComplexityPolicy.MinLength { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordComplexityPolicy.MinLength, tt.args.org.PasswordComplexityPolicy.MinLength) + } + }) + } +} + +func TestAppendChangePasswordComplexityPolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.PasswordComplexityPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append change password complexity policy event", + args: args{ + org: &Org{PasswordComplexityPolicy: &iam_es_model.PasswordComplexityPolicy{ + MinLength: 10, + }}, + policy: &iam_es_model.PasswordComplexityPolicy{MinLength: 5, HasLowercase: true}, + event: &es_models.Event{}, + }, + result: &Org{PasswordComplexityPolicy: &iam_es_model.PasswordComplexityPolicy{ + MinLength: 5, + HasLowercase: true, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendChangePasswordComplexityPolicyEvent(tt.args.event) + if tt.result.PasswordComplexityPolicy.MinLength != tt.args.org.PasswordComplexityPolicy.MinLength { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordComplexityPolicy.MinLength, tt.args.org.PasswordComplexityPolicy.MinLength) + } + if tt.result.PasswordComplexityPolicy.HasLowercase != tt.args.org.PasswordComplexityPolicy.HasLowercase { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordComplexityPolicy.HasLowercase, tt.args.org.PasswordComplexityPolicy.HasLowercase) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/model/password_lockout_policy.go b/internal/org/repository/eventsourcing/model/password_lockout_policy.go new file mode 100644 index 0000000000..9aa5efd33f --- /dev/null +++ b/internal/org/repository/eventsourcing/model/password_lockout_policy.go @@ -0,0 +1,24 @@ +package model + +import ( + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func (o *Org) appendAddPasswordLockoutPolicyEvent(event *es_models.Event) error { + o.PasswordLockoutPolicy = new(iam_es_model.PasswordLockoutPolicy) + err := o.PasswordLockoutPolicy.SetData(event) + if err != nil { + return err + } + o.PasswordLockoutPolicy.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (o *Org) appendChangePasswordLockoutPolicyEvent(event *es_models.Event) error { + return o.PasswordLockoutPolicy.SetData(event) +} + +func (o *Org) appendRemovePasswordLockoutPolicyEvent(event *es_models.Event) { + o.PasswordLockoutPolicy = nil +} diff --git a/internal/org/repository/eventsourcing/model/password_lockout_policy_test.go b/internal/org/repository/eventsourcing/model/password_lockout_policy_test.go new file mode 100644 index 0000000000..7efdf2955f --- /dev/null +++ b/internal/org/repository/eventsourcing/model/password_lockout_policy_test.go @@ -0,0 +1,86 @@ +package model + +import ( + "encoding/json" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "testing" +) + +func TestAppendAddPasswordLockoutPolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.PasswordLockoutPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append add password age policy event", + args: args{ + org: &Org{}, + policy: &iam_es_model.PasswordLockoutPolicy{MaxAttempts: 10}, + event: &es_models.Event{}, + }, + result: &Org{PasswordLockoutPolicy: &iam_es_model.PasswordLockoutPolicy{MaxAttempts: 10}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendAddPasswordLockoutPolicyEvent(tt.args.event) + if tt.result.PasswordLockoutPolicy.MaxAttempts != tt.args.org.PasswordLockoutPolicy.MaxAttempts { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordLockoutPolicy.MaxAttempts, tt.args.org.PasswordLockoutPolicy.MaxAttempts) + } + }) + } +} + +func TestAppendChangePasswordLockoutPolicyEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.PasswordLockoutPolicy + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append change password age policy event", + args: args{ + org: &Org{PasswordLockoutPolicy: &iam_es_model.PasswordLockoutPolicy{ + MaxAttempts: 10, + }}, + policy: &iam_es_model.PasswordLockoutPolicy{MaxAttempts: 5, ShowLockOutFailures: true}, + event: &es_models.Event{}, + }, + result: &Org{PasswordLockoutPolicy: &iam_es_model.PasswordLockoutPolicy{ + MaxAttempts: 5, + ShowLockOutFailures: true, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendChangePasswordLockoutPolicyEvent(tt.args.event) + if tt.result.PasswordLockoutPolicy.MaxAttempts != tt.args.org.PasswordLockoutPolicy.MaxAttempts { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordLockoutPolicy.MaxAttempts, tt.args.org.PasswordLockoutPolicy.MaxAttempts) + } + if tt.result.PasswordLockoutPolicy.ShowLockOutFailures != tt.args.org.PasswordLockoutPolicy.ShowLockOutFailures { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.PasswordLockoutPolicy.ShowLockOutFailures, tt.args.org.PasswordLockoutPolicy.ShowLockOutFailures) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/model/types.go b/internal/org/repository/eventsourcing/model/types.go index c07df6663d..eb3c5d17b0 100644 --- a/internal/org/repository/eventsourcing/model/types.go +++ b/internal/org/repository/eventsourcing/model/types.go @@ -51,4 +51,19 @@ const ( LoginPolicyIDPProviderAdded models.EventType = "org.policy.login.idpprovider.added" LoginPolicyIDPProviderRemoved models.EventType = "org.policy.login.idpprovider.removed" LoginPolicyIDPProviderCascadeRemoved models.EventType = "org.policy.login.idpprovider.cascade.removed" + LabelPolicyAdded models.EventType = "org.policy.label.added" + LabelPolicyChanged models.EventType = "org.policy.label.changed" + LabelPolicyRemoved models.EventType = "org.policy.label.removed" + + PasswordComplexityPolicyAdded models.EventType = "org.policy.password.complexity.added" + PasswordComplexityPolicyChanged models.EventType = "org.policy.password.complexity.changed" + PasswordComplexityPolicyRemoved models.EventType = "org.policy.password.complexity.removed" + + PasswordAgePolicyAdded models.EventType = "org.policy.password.age.added" + PasswordAgePolicyChanged models.EventType = "org.policy.password.age.changed" + PasswordAgePolicyRemoved models.EventType = "org.policy.password.age.removed" + + PasswordLockoutPolicyAdded models.EventType = "org.policy.password.lockout.added" + PasswordLockoutPolicyChanged models.EventType = "org.policy.password.lockout.changed" + PasswordLockoutPolicyRemoved models.EventType = "org.policy.password.lockout.removed" ) diff --git a/internal/org/repository/eventsourcing/org_iam_policy.go b/internal/org/repository/eventsourcing/org_iam_policy.go index 274ba07998..a922aeaa7a 100644 --- a/internal/org/repository/eventsourcing/org_iam_policy.go +++ b/internal/org/repository/eventsourcing/org_iam_policy.go @@ -2,13 +2,14 @@ package eventsourcing import ( "context" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" "github.com/caos/zitadel/internal/errors" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" ) -func OrgIAMPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, org *model.Org, policy *model.OrgIAMPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { +func OrgIAMPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, org *model.Org, policy *iam_es_model.OrgIAMPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { if policy == nil { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-i9sJS", "Errors.Internal") @@ -21,7 +22,7 @@ func OrgIAMPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, org *mod } } -func OrgIAMPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, org *model.Org, policy *model.OrgIAMPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { +func OrgIAMPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, org *model.Org, policy *iam_es_model.OrgIAMPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { if policy == nil { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-9Ksie", "Errors.Internal") @@ -30,7 +31,7 @@ func OrgIAMPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, org *m if err != nil { return nil, err } - changes := org.OrgIamPolicy.Changes(policy) + changes := org.OrgIAMPolicy.Changes(policy) if len(changes) == 0 { return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Js6Vs", "Errors.NoChangesFound") } diff --git a/internal/org/repository/eventsourcing/org_iam_policy_test.go b/internal/org/repository/eventsourcing/org_iam_policy_test.go index c277fcae38..319efd8de9 100644 --- a/internal/org/repository/eventsourcing/org_iam_policy_test.go +++ b/internal/org/repository/eventsourcing/org_iam_policy_test.go @@ -2,6 +2,7 @@ package eventsourcing import ( "context" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" "testing" "github.com/caos/zitadel/internal/api/authz" @@ -20,7 +21,7 @@ func TestOrgIamPolicyAddedAggregates(t *testing.T) { ctx context.Context aggCreator *es_models.AggregateCreator org *model.Org - policy *model.OrgIAMPolicy + policy *iam_es_model.OrgIAMPolicy } tests := []struct { name string @@ -48,8 +49,7 @@ func TestOrgIamPolicyAddedAggregates(t *testing.T) { Sequence: 5, }, }, - policy: &model.OrgIAMPolicy{ - Description: "description", + policy: &iam_es_model.OrgIAMPolicy{ UserLoginMustBeDomain: true, }, }, @@ -90,7 +90,7 @@ func TestOrgIamPolicyChangedAggregates(t *testing.T) { ctx context.Context aggCreator *es_models.AggregateCreator org *model.Org - policy *model.OrgIAMPolicy + policy *iam_es_model.OrgIAMPolicy } tests := []struct { name string @@ -117,13 +117,11 @@ func TestOrgIamPolicyChangedAggregates(t *testing.T) { AggregateID: "sdaf", Sequence: 5, }, - OrgIamPolicy: &model.OrgIAMPolicy{ - Description: "description", + OrgIAMPolicy: &iam_es_model.OrgIAMPolicy{ UserLoginMustBeDomain: true, }, }, - policy: &model.OrgIAMPolicy{ - Description: "description", + policy: &iam_es_model.OrgIAMPolicy{ UserLoginMustBeDomain: false, }, }, @@ -143,13 +141,11 @@ func TestOrgIamPolicyChangedAggregates(t *testing.T) { AggregateID: "sdaf", Sequence: 5, }, - OrgIamPolicy: &model.OrgIAMPolicy{ - Description: "description", + OrgIAMPolicy: &iam_es_model.OrgIAMPolicy{ UserLoginMustBeDomain: true, }, }, - policy: &model.OrgIAMPolicy{ - Description: "description", + policy: &iam_es_model.OrgIAMPolicy{ UserLoginMustBeDomain: true, }, }, @@ -204,8 +200,7 @@ func TestOrgIamPolicyRemovedAggregates(t *testing.T) { AggregateID: "sdaf", Sequence: 5, }, - OrgIamPolicy: &model.OrgIAMPolicy{ - Description: "description", + OrgIAMPolicy: &iam_es_model.OrgIAMPolicy{ UserLoginMustBeDomain: true, }, }, diff --git a/internal/org/repository/eventsourcing/password_age_policy.go b/internal/org/repository/eventsourcing/password_age_policy.go new file mode 100644 index 0000000000..04d2acd03e --- /dev/null +++ b/internal/org/repository/eventsourcing/password_age_policy.go @@ -0,0 +1,76 @@ +package eventsourcing + +import ( + "context" + "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func PasswordAgePolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.PasswordAgePolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Hms9d", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingPasswordAgePolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.PasswordAgePolicyAdded, policy) + } +} + +func PasswordAgePolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.PasswordAgePolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-3Gms0f", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + changes := existing.PasswordAgePolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Ls0rs", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.PasswordAgePolicyChanged, changes) + } +} + +func PasswordAgePolicyRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if existing == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-4Gsk9", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.PasswordAgePolicyRemoved, nil) + } +} + +func checkExistingPasswordAgePolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + existing := false + for _, event := range events { + switch event.Type { + case model.PasswordAgePolicyAdded: + existing = true + case model.PasswordAgePolicyRemoved: + existing = false + } + } + if existing { + return errors.ThrowPreconditionFailed(nil, "EVENT-2Fjs0", "Errors.Org.PasswordAgePolicy.AlreadyExists") + } + return nil + } +} diff --git a/internal/org/repository/eventsourcing/password_age_policy_test.go b/internal/org/repository/eventsourcing/password_age_policy_test.go new file mode 100644 index 0000000000..fb2b637985 --- /dev/null +++ b/internal/org/repository/eventsourcing/password_age_policy_test.go @@ -0,0 +1,258 @@ +package eventsourcing + +import ( + "context" + "github.com/caos/zitadel/internal/api/authz" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "testing" +) + +func TestPasswordAgePolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.PasswordAgePolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password age policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + new: &iam_es_model.PasswordAgePolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAgeDays: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordAgePolicyAdded}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "password age policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordAgePolicyAddedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + }) + } +} + +func TestPasswordAgePolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.PasswordAgePolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password age policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PasswordAgePolicy: &iam_es_model.PasswordAgePolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + new: &iam_es_model.PasswordAgePolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAgeDays: 5, + ExpireWarnDays: 5, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordAgePolicyChanged}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "password age policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordAgePolicyChangedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + }) + } +} + +func TestPasswordAgePolicyRemovedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "remove password age policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PasswordAgePolicy: &iam_es_model.PasswordAgePolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordAgePolicyRemoved}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordAgePolicyRemovedAggregate(tt.args.aggCreator, tt.args.existing)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/password_complexity_policy.go b/internal/org/repository/eventsourcing/password_complexity_policy.go new file mode 100644 index 0000000000..f87ec93c25 --- /dev/null +++ b/internal/org/repository/eventsourcing/password_complexity_policy.go @@ -0,0 +1,76 @@ +package eventsourcing + +import ( + "context" + "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func PasswordComplexityPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.PasswordComplexityPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-F8iso", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingPasswordComplexityPolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.PasswordComplexityPolicyAdded, policy) + } +} + +func PasswordComplexityPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.PasswordComplexityPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-2dFT5", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + changes := existing.PasswordComplexityPolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Smk8d", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.PasswordComplexityPolicyChanged, changes) + } +} + +func PasswordComplexityPolicyRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if existing == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Lso9f", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.PasswordComplexityPolicyRemoved, nil) + } +} + +func checkExistingPasswordComplexityPolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + existing := false + for _, event := range events { + switch event.Type { + case model.PasswordComplexityPolicyAdded: + existing = true + case model.PasswordComplexityPolicyRemoved: + existing = false + } + } + if existing { + return errors.ThrowPreconditionFailed(nil, "EVENT-5Fjs8", "Errors.Org.PasswordComplexityPolicy.AlreadyExists") + } + return nil + } +} diff --git a/internal/org/repository/eventsourcing/password_complexity_policy_test.go b/internal/org/repository/eventsourcing/password_complexity_policy_test.go new file mode 100644 index 0000000000..f9ca57c76a --- /dev/null +++ b/internal/org/repository/eventsourcing/password_complexity_policy_test.go @@ -0,0 +1,258 @@ +package eventsourcing + +import ( + "context" + "github.com/caos/zitadel/internal/api/authz" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "testing" +) + +func TestPasswordComplexityPolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.PasswordComplexityPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password complexity polciy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + new: &iam_es_model.PasswordComplexityPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MinLength: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordComplexityPolicyAdded}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "password complexity policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordComplexityPolicyAddedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + }) + } +} + +func TestPasswordComplexityPolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.PasswordComplexityPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password complexity policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PasswordComplexityPolicy: &iam_es_model.PasswordComplexityPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + new: &iam_es_model.PasswordComplexityPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MinLength: 5, + HasLowercase: true, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordComplexityPolicyChanged}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "password complexity policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordComplexityPolicyChangedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + }) + } +} + +func TestPasswordComplexityPolicyRemovedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "remove password complexity policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PasswordComplexityPolicy: &iam_es_model.PasswordComplexityPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordComplexityPolicyRemoved}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordComplexityPolicyRemovedAggregate(tt.args.aggCreator, tt.args.existing)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/password_lockout_policy.go b/internal/org/repository/eventsourcing/password_lockout_policy.go new file mode 100644 index 0000000000..adb6583c78 --- /dev/null +++ b/internal/org/repository/eventsourcing/password_lockout_policy.go @@ -0,0 +1,76 @@ +package eventsourcing + +import ( + "context" + "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func PasswordLockoutPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.PasswordLockoutPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-4Tfi9", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingPasswordLockoutPolicyValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.PasswordLockoutPolicyAdded, policy) + } +} + +func PasswordLockoutPolicyChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.PasswordLockoutPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-5lf9s", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + changes := existing.PasswordLockoutPolicy.Changes(policy) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-1dj9G", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.PasswordLockoutPolicyChanged, changes) + } +} + +func PasswordLockoutPolicyRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if existing == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-6Hsl0", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.PasswordLockoutPolicyRemoved, nil) + } +} + +func checkExistingPasswordLockoutPolicyValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + existing := false + for _, event := range events { + switch event.Type { + case model.PasswordLockoutPolicyAdded: + existing = true + case model.PasswordLockoutPolicyRemoved: + existing = false + } + } + if existing { + return errors.ThrowPreconditionFailed(nil, "EVENT-2Dfl0", "Errors.Org.PasswordLockoutPolicy.AlreadyExists") + } + return nil + } +} diff --git a/internal/org/repository/eventsourcing/password_lockout_policy_test.go b/internal/org/repository/eventsourcing/password_lockout_policy_test.go new file mode 100644 index 0000000000..3cb83b0ef7 --- /dev/null +++ b/internal/org/repository/eventsourcing/password_lockout_policy_test.go @@ -0,0 +1,258 @@ +package eventsourcing + +import ( + "context" + "github.com/caos/zitadel/internal/api/authz" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + "testing" +) + +func TestPasswordLockoutPolicyAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.PasswordLockoutPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add password lockout polciy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + new: &iam_es_model.PasswordLockoutPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAttempts: 10, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordLockoutPolicyAdded}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "password lockout policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordLockoutPolicyAddedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + }) + } +} + +func TestPasswordLockoutPolicyChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.PasswordLockoutPolicy + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change password lockout policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PasswordLockoutPolicy: &iam_es_model.PasswordLockoutPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + new: &iam_es_model.PasswordLockoutPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MaxAttempts: 5, + ShowLockOutFailures: true, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordLockoutPolicyChanged}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "password lockout policy config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordLockoutPolicyChangedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + }) + } +} + +func TestPasswordLockoutPolicyRemovedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "remove password lockout policy", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + PasswordLockoutPolicy: &iam_es_model.PasswordLockoutPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.PasswordLockoutPolicyRemoved}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := PasswordLockoutPolicyRemovedAggregate(tt.args.aggCreator, tt.args.existing)(tt.args.ctx) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + } + }) + } +} diff --git a/internal/org/repository/view/org_member_view.go b/internal/org/repository/view/org_member_view.go index 2d44013662..ef52864b52 100644 --- a/internal/org/repository/view/org_member_view.go +++ b/internal/org/repository/view/org_member_view.go @@ -70,3 +70,8 @@ func DeleteOrgMember(db *gorm.DB, table, orgID, userID string) error { delete := repository.PrepareDeleteByObject(table, member) return delete(db) } + +func DeleteOrgMembersByUserID(db *gorm.DB, table, userID string) error { + delete := repository.PrepareDeleteByKey(table, model.OrgMemberSearchKey(org_model.OrgMemberSearchKeyUserID), userID) + return delete(db) +} diff --git a/internal/org/repository/view/org_view.go b/internal/org/repository/view/org_view.go index 0647091035..178e6a5038 100644 --- a/internal/org/repository/view/org_view.go +++ b/internal/org/repository/view/org_view.go @@ -1,11 +1,12 @@ package view import ( + "github.com/jinzhu/gorm" + caos_errs "github.com/caos/zitadel/internal/errors" org_model "github.com/caos/zitadel/internal/org/model" "github.com/caos/zitadel/internal/org/repository/view/model" "github.com/caos/zitadel/internal/view/repository" - "github.com/jinzhu/gorm" ) func OrgByID(db *gorm.DB, table, orgID string) (*model.OrgView, error) { @@ -18,6 +19,16 @@ func OrgByID(db *gorm.DB, table, orgID string) (*model.OrgView, error) { return org, err } +func OrgByPrimaryDomain(db *gorm.DB, table, primaryDomain string) (*model.OrgView, error) { + org := new(model.OrgView) + query := repository.PrepareGetByKey(table, model.OrgSearchKey(org_model.OrgSearchKeyOrgDomain), primaryDomain) + err := query(db, org) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-GEwea", "Errors.Org.NotFound") + } + return org, err +} + func SearchOrgs(db *gorm.DB, table string, req *org_model.OrgSearchRequest) ([]*model.OrgView, uint64, error) { orgs := make([]*model.OrgView, 0) query := repository.PrepareSearchQuery(table, model.OrgSearchRequest{Limit: req.Limit, Offset: req.Offset, Queries: req.Queries}) diff --git a/internal/policy/default.go b/internal/policy/default.go deleted file mode 100644 index fb02396d74..0000000000 --- a/internal/policy/default.go +++ /dev/null @@ -1,22 +0,0 @@ -package policy - -type PasswordAgePolicyDefault struct { - Description string - MaxAgeDays uint64 - ExpireWarnDays uint64 -} - -type PasswordComplexityPolicyDefault struct { - Description string - MinLength uint64 - HasLowercase bool - HasUppercase bool - HasNumber bool - HasSymbol bool -} - -type PasswordLockoutPolicyDefault struct { - Description string - MaxAttempts uint64 - ShowLockOutFailures bool -} diff --git a/internal/policy/model/policy_complexity.go b/internal/policy/model/policy_complexity.go deleted file mode 100644 index fbde89812f..0000000000 --- a/internal/policy/model/policy_complexity.go +++ /dev/null @@ -1,56 +0,0 @@ -package model - -import ( - caos_errs "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/eventstore/models" - "regexp" -) - -var ( - hasStringLowerCase = regexp.MustCompile(`[a-z]`).MatchString - hasStringUpperCase = regexp.MustCompile(`[A-Z]`).MatchString - hasNumber = regexp.MustCompile(`[0-9]`).MatchString - hasSymbol = regexp.MustCompile(`[^A-Za-z0-9]`).MatchString -) - -type PasswordComplexityPolicy struct { - models.ObjectRoot - - Description string - State PolicyState - MinLength uint64 - HasLowercase bool - HasUppercase bool - HasNumber bool - HasSymbol bool -} - -func (p *PasswordComplexityPolicy) IsValid() error { - if p.MinLength == 0 || p.MinLength > 72 { - return caos_errs.ThrowInvalidArgument(nil, "MODEL-Lsp0e", "Errors.User.PasswordComplexityPolicy.MinLengthNotAllowed") - } - return nil -} - -func (p *PasswordComplexityPolicy) Check(password string) error { - if p.MinLength != 0 && uint64(len(password)) < p.MinLength { - return caos_errs.ThrowInvalidArgument(nil, "MODEL-HuJf6", "Errors.User.PasswordComplexityPolicy.MinLength") - } - - if p.HasLowercase && !hasStringLowerCase(password) { - return caos_errs.ThrowInvalidArgument(nil, "MODEL-co3Xw", "Errors.User.PasswordComplexityPolicy.HasLower") - } - - if p.HasUppercase && !hasStringUpperCase(password) { - return caos_errs.ThrowInvalidArgument(nil, "MODEL-VoaRj", "Errors.User.PasswordComplexityPolicy.HasUpper") - } - - if p.HasNumber && !hasNumber(password) { - return caos_errs.ThrowInvalidArgument(nil, "MODEL-ZBv4H", "Errors.User.PasswordComplexityPolicy.HasNumber") - } - - if p.HasSymbol && !hasSymbol(password) { - return caos_errs.ThrowInvalidArgument(nil, "MODEL-ZDLwA", "Errors.User.PasswordComplexityPolicy.HasSymbol") - } - return nil -} diff --git a/internal/policy/model/types.go b/internal/policy/model/types.go deleted file mode 100644 index 82d66d5eef..0000000000 --- a/internal/policy/model/types.go +++ /dev/null @@ -1,33 +0,0 @@ -package model - -import "github.com/caos/zitadel/internal/eventstore/models" - -const ( - //default - DefaultPolicy = "0" - - // complexity - PasswordComplexityPolicyAggregate models.AggregateType = "policy.password.complexity" - - PasswordComplexityPolicyAdded models.EventType = "policy.password.complexity.added" - PasswordComplexityPolicyChanged models.EventType = "policy.password.complexity.changed" - - // age - PasswordAgePolicyAggregate models.AggregateType = "policy.password.age" - - PasswordAgePolicyAdded models.EventType = "policy.password.age.added" - PasswordAgePolicyChanged models.EventType = "policy.password.age.changed" - - // lockout - PasswordLockoutPolicyAggregate models.AggregateType = "policy.password.lockout" - - PasswordLockoutPolicyAdded models.EventType = "policy.password.lockout.added" - PasswordLockoutPolicyChanged models.EventType = "policy.password.lockout.changed" -) - -type PolicyState int32 - -const ( - PolicyStateActive PolicyState = iota - PolicyStateInactive -) diff --git a/internal/policy/repository/eventsourcing/cache.go b/internal/policy/repository/eventsourcing/cache.go deleted file mode 100644 index 79aa96a221..0000000000 --- a/internal/policy/repository/eventsourcing/cache.go +++ /dev/null @@ -1,34 +0,0 @@ -package eventsourcing - -import ( - "github.com/caos/logging" - "github.com/caos/zitadel/internal/cache" - "github.com/caos/zitadel/internal/cache/config" - "github.com/caos/zitadel/internal/eventstore/models" -) - -type PolicyCache struct { - policyCache cache.Cache -} - -func StartCache(conf *config.CacheConfig) (*PolicyCache, error) { - policyCache, err := conf.Config.NewCache() - logging.Log("EVENT-L7ZcH").OnError(err).Panic("unable to create policy cache") - - return &PolicyCache{policyCache: policyCache}, nil -} - -func (c *PolicyCache) getPolicy(id string) (policy *PasswordComplexityPolicy) { - policy = &PasswordComplexityPolicy{ObjectRoot: models.ObjectRoot{AggregateID: id}} - if err := c.policyCache.Get(id, policy); err != nil { - logging.Log("EVENT-tkUue").WithError(err).Debug("error in getting cache") - } - return policy -} - -func (c *PolicyCache) cachePolicy(policy *PasswordComplexityPolicy) { - err := c.policyCache.Set(policy.AggregateID, policy) - if err != nil { - logging.Log("EVENT-DVcpF").WithError(err).Debug("error in setting policy cache") - } -} diff --git a/internal/policy/repository/eventsourcing/cache_age.go b/internal/policy/repository/eventsourcing/cache_age.go deleted file mode 100644 index e8e9ec6dd0..0000000000 --- a/internal/policy/repository/eventsourcing/cache_age.go +++ /dev/null @@ -1,20 +0,0 @@ -package eventsourcing - -import ( - "github.com/caos/logging" -) - -func (c *PolicyCache) getAgePolicy(id string) (policy *PasswordAgePolicy) { - policy = new(PasswordAgePolicy) - if err := c.policyCache.Get(id, policy); err != nil { - logging.Log("EVENT-NqMFM").WithError(err).Debug("error in getting cache") - } - return policy -} - -func (c *PolicyCache) cacheAgePolicy(policy *PasswordAgePolicy) { - err := c.policyCache.Set(policy.AggregateID, policy) - if err != nil { - logging.Log("EVENT-6vRvM").WithError(err).Debug("error in setting policy cache") - } -} diff --git a/internal/policy/repository/eventsourcing/cache_complexity.go b/internal/policy/repository/eventsourcing/cache_complexity.go deleted file mode 100644 index 7c05e5528d..0000000000 --- a/internal/policy/repository/eventsourcing/cache_complexity.go +++ /dev/null @@ -1,20 +0,0 @@ -package eventsourcing - -import ( - "github.com/caos/logging" -) - -func (c *PolicyCache) getComplexityPolicy(id string) (policy *PasswordComplexityPolicy) { - policy = new(PasswordComplexityPolicy) - if err := c.policyCache.Get(id, policy); err != nil { - logging.Log("EVENT-Wgrph").WithError(err).Debug("error in getting cache") - } - return policy -} - -func (c *PolicyCache) cacheComplexityPolicy(policy *PasswordComplexityPolicy) { - err := c.policyCache.Set(policy.AggregateID, policy) - if err != nil { - logging.Log("EVENT-ylGny").WithError(err).Debug("error in setting policy cache") - } -} diff --git a/internal/policy/repository/eventsourcing/cache_lockout.go b/internal/policy/repository/eventsourcing/cache_lockout.go deleted file mode 100644 index 4fbb7f700e..0000000000 --- a/internal/policy/repository/eventsourcing/cache_lockout.go +++ /dev/null @@ -1,20 +0,0 @@ -package eventsourcing - -import ( - "github.com/caos/logging" -) - -func (c *PolicyCache) getLockoutPolicy(id string) (policy *PasswordLockoutPolicy) { - policy = new(PasswordLockoutPolicy) - if err := c.policyCache.Get(id, policy); err != nil { - logging.Log("EVENT-Zoljf").WithError(err).Debug("error in getting cache") - } - return policy -} - -func (c *PolicyCache) cacheLockoutPolicy(policy *PasswordLockoutPolicy) { - err := c.policyCache.Set(policy.AggregateID, policy) - if err != nil { - logging.Log("EVENT-6klAf").WithError(err).Debug("error in setting policy cache") - } -} diff --git a/internal/policy/repository/eventsourcing/eventstore.go b/internal/policy/repository/eventsourcing/eventstore.go deleted file mode 100644 index 25922d4626..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore.go +++ /dev/null @@ -1,38 +0,0 @@ -package eventsourcing - -import ( - "github.com/caos/zitadel/internal/cache/config" - sd "github.com/caos/zitadel/internal/config/systemdefaults" - es_int "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/id" - "github.com/caos/zitadel/internal/policy" -) - -type PolicyEventstore struct { - es_int.Eventstore - policyCache *PolicyCache - idGenerator id.Generator - passwordAgePolicyDefault policy.PasswordAgePolicyDefault - passwordComplexityPolicyDefault policy.PasswordComplexityPolicyDefault - passwordLockoutPolicyDefault policy.PasswordLockoutPolicyDefault -} - -type PolicyConfig struct { - es_int.Eventstore - Cache *config.CacheConfig -} - -func StartPolicy(conf PolicyConfig, systemDefaults sd.SystemDefaults) (*PolicyEventstore, error) { - policyCache, err := StartCache(conf.Cache) - if err != nil { - return nil, err - } - return &PolicyEventstore{ - Eventstore: conf.Eventstore, - policyCache: policyCache, - idGenerator: id.SonyFlakeGenerator, - passwordAgePolicyDefault: systemDefaults.DefaultPolicies.Age, - passwordComplexityPolicyDefault: systemDefaults.DefaultPolicies.Complexity, - passwordLockoutPolicyDefault: systemDefaults.DefaultPolicies.Lockout, - }, nil -} diff --git a/internal/policy/repository/eventsourcing/eventstore_age.go b/internal/policy/repository/eventsourcing/eventstore_age.go deleted file mode 100644 index 8addfacbec..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_age.go +++ /dev/null @@ -1,76 +0,0 @@ -package eventsourcing - -import ( - "context" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" - pol_model "github.com/caos/zitadel/internal/policy/model" -) - -func (es *PolicyEventstore) GetPasswordAgePolicy(ctx context.Context, id string) (*pol_model.PasswordAgePolicy, error) { - policy := es.policyCache.getAgePolicy(id) - - query := PasswordAgePolicyQuery(id, policy.Sequence) - err := es_sdk.Filter(ctx, es.FilterEvents, policy.AppendEvents, query) - if caos_errs.IsNotFound(err) && es.passwordAgePolicyDefault.Description != "" { - policy.Description = es.passwordAgePolicyDefault.Description - policy.MaxAgeDays = es.passwordAgePolicyDefault.MaxAgeDays - policy.ExpireWarnDays = es.passwordAgePolicyDefault.ExpireWarnDays - } else if err != nil { - return nil, err - } - es.policyCache.cacheAgePolicy(policy) - return PasswordAgePolicyToModel(policy), nil -} - -func (es *PolicyEventstore) CreatePasswordAgePolicy(ctx context.Context, policy *pol_model.PasswordAgePolicy) (*pol_model.PasswordAgePolicy, error) { - ctxData := authz.GetCtxData(ctx) - existingPolicy, err := es.GetPasswordAgePolicy(ctx, ctxData.OrgID) - if err != nil && !caos_errs.IsNotFound(err) { - return nil, err - } - if existingPolicy != nil && existingPolicy.Sequence > 0 { - return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-yDJ5I", "Errors.Policy.AlreadyExists") - } - - id, err := es.idGenerator.Next() - if err != nil { - return nil, err - } - policy.AggregateID = id - - repoPolicy := PasswordAgePolicyFromModel(policy) - - createAggregate := PasswordAgePolicyCreateAggregate(es.AggregateCreator(), repoPolicy) - err = es_sdk.Push(ctx, es.PushAggregates, repoPolicy.AppendEvents, createAggregate) - if err != nil { - return nil, err - } - - es.policyCache.cacheAgePolicy(repoPolicy) - return PasswordAgePolicyToModel(repoPolicy), nil -} - -func (es *PolicyEventstore) UpdatePasswordAgePolicy(ctx context.Context, policy *pol_model.PasswordAgePolicy) (*pol_model.PasswordAgePolicy, error) { - ctxData := authz.GetCtxData(ctx) - existingPolicy, err := es.GetPasswordAgePolicy(ctx, ctxData.OrgID) - if err != nil { - return nil, err - } - if existingPolicy.Sequence <= 0 { - return es.CreatePasswordAgePolicy(ctx, policy) - } - repoExisting := PasswordAgePolicyFromModel(existingPolicy) - repoNew := PasswordAgePolicyFromModel(policy) - - updateAggregate := PasswordAgePolicyUpdateAggregate(es.AggregateCreator(), repoExisting, repoNew) - err = es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, updateAggregate) - if err != nil { - return nil, err - } - - es.policyCache.cacheAgePolicy(repoExisting) - return PasswordAgePolicyToModel(repoExisting), nil -} diff --git a/internal/policy/repository/eventsourcing/eventstore_age_mock_test.go b/internal/policy/repository/eventsourcing/eventstore_age_mock_test.go deleted file mode 100644 index 37bf4b09a9..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_age_mock_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package eventsourcing - -import ( - "encoding/json" - - "github.com/caos/zitadel/internal/id" - - mock_cache "github.com/caos/zitadel/internal/cache/mock" - "github.com/caos/zitadel/internal/eventstore/mock" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" - "github.com/golang/mock/gomock" -) - -func GetMockedEventstoreAge(ctrl *gomock.Controller, mockEs *mock.MockEventstore) *PolicyEventstore { - return &PolicyEventstore{ - Eventstore: mockEs, - policyCache: GetMockCacheAge(ctrl), - idGenerator: GetSonyFlake(), - } -} - -func GetMockCacheAge(ctrl *gomock.Controller) *PolicyCache { - mockCache := mock_cache.NewMockCache(ctrl) - mockCache.EXPECT().Get(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockCache.EXPECT().Set(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - return &PolicyCache{policyCache: mockCache} -} - -func GetSonyFlake() id.Generator { - return id.SonyFlakeGenerator -} - -func GetMockGetPasswordAgePolicyOK(ctrl *gomock.Controller) *PolicyEventstore { - data, _ := json.Marshal(model.PasswordAgePolicy{Description: "Name"}) - events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordAgePolicyAdded, Data: data}, - } - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - return GetMockedEventstoreAge(ctrl, mockEs) -} - -func GetMockGetPasswordAgePolicyNoEvents(ctrl *gomock.Controller) *PolicyEventstore { - events := []*es_models.Event{} - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - return GetMockedEventstoreAge(ctrl, mockEs) -} - -func GetMockPasswordAgePolicy(ctrl *gomock.Controller) *PolicyEventstore { - data, _ := json.Marshal(model.PasswordAgePolicy{Description: "Name"}) - events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordAgePolicyAdded, Data: data}, - } - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) - mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) - return GetMockedEventstoreAge(ctrl, mockEs) -} - -func GetMockPasswordAgePolicyNoEvents(ctrl *gomock.Controller) *PolicyEventstore { - events := []*es_models.Event{} - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) - mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) - return GetMockedEventstoreAge(ctrl, mockEs) -} diff --git a/internal/policy/repository/eventsourcing/eventstore_age_test.go b/internal/policy/repository/eventsourcing/eventstore_age_test.go deleted file mode 100644 index 93751888c6..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_age_test.go +++ /dev/null @@ -1,169 +0,0 @@ -package eventsourcing - -import ( - "context" - "testing" - - "github.com/golang/mock/gomock" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -func TestGetPasswordAgePolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - policy *model.PasswordAgePolicy - } - type res struct { - policy *model.PasswordAgePolicy - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy from events, ok", - args: args{ - es: GetMockGetPasswordAgePolicyOK(ctrl), - policy: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, - }, - res: res{ - policy: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, - }, - }, - { - name: "policy from events, no events", - args: args{ - es: GetMockGetPasswordAgePolicyNoEvents(ctrl), - policy: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 2}}, - }, - res: res{ - wantErr: true, - errFunc: caos_errs.IsNotFound, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.GetPasswordAgePolicy(nil, tt.args.policy.AggregateID) - - if !tt.res.wantErr && result.AggregateID != tt.res.policy.AggregateID { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.AggregateID, result.AggregateID) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestCreatePasswordAgePolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - ctx context.Context - policy *model.PasswordAgePolicy - } - type res struct { - policy *model.PasswordAgePolicy - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "create policy, ok", - args: args{ - es: GetMockPasswordAgePolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - policy: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name"}, - }, - res: res{ - policy: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name"}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.CreatePasswordAgePolicy(tt.args.ctx, tt.args.policy) - - if !tt.res.wantErr && result.AggregateID == "" { - t.Errorf("result has no id") - } - if !tt.res.wantErr && result.Description != tt.res.policy.Description { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.Description, result.Description) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestUpdatePasswordAgePolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - ctx context.Context - new *model.PasswordAgePolicy - } - type res struct { - policy *model.PasswordAgePolicy - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "update policy, ok", - args: args{ - es: GetMockPasswordAgePolicy(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - new: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew"}, - }, - res: res{ - policy: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew"}, - }, - }, - { - name: "existing policy not found", - args: args{ - es: GetMockPasswordAgePolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - new: &model.PasswordAgePolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew"}, - }, - res: res{ - wantErr: true, - errFunc: caos_errs.IsNotFound, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.UpdatePasswordAgePolicy(tt.args.ctx, tt.args.new) - - if !tt.res.wantErr && result.AggregateID == "" { - t.Errorf("result has no id") - } - if !tt.res.wantErr && result.Description != tt.res.policy.Description { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.Description, result.Description) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} diff --git a/internal/policy/repository/eventsourcing/eventstore_complexity.go b/internal/policy/repository/eventsourcing/eventstore_complexity.go deleted file mode 100644 index 074c434036..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_complexity.go +++ /dev/null @@ -1,85 +0,0 @@ -package eventsourcing - -import ( - "context" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" - pol_model "github.com/caos/zitadel/internal/policy/model" -) - -func (es *PolicyEventstore) GetPasswordComplexityPolicy(ctx context.Context, id string) (*pol_model.PasswordComplexityPolicy, error) { - policy := es.policyCache.getComplexityPolicy(id) - - query := PasswordComplexityPolicyQuery(id, policy.Sequence) - err := es_sdk.Filter(ctx, es.FilterEvents, policy.AppendEvents, query) - if caos_errs.IsNotFound(err) && es.passwordComplexityPolicyDefault.Description != "" { - policy.Description = es.passwordComplexityPolicyDefault.Description - policy.MinLength = es.passwordComplexityPolicyDefault.MinLength - policy.HasLowercase = es.passwordComplexityPolicyDefault.HasLowercase - policy.HasUppercase = es.passwordComplexityPolicyDefault.HasUppercase - policy.HasNumber = es.passwordComplexityPolicyDefault.HasNumber - policy.HasSymbol = es.passwordComplexityPolicyDefault.HasSymbol - } else if err != nil { - return nil, err - } - es.policyCache.cacheComplexityPolicy(policy) - return PasswordComplexityPolicyToModel(policy), nil -} - -func (es *PolicyEventstore) CreatePasswordComplexityPolicy(ctx context.Context, policy *pol_model.PasswordComplexityPolicy) (*pol_model.PasswordComplexityPolicy, error) { - ctxData := authz.GetCtxData(ctx) - if err := policy.IsValid(); err != nil { - return nil, err - } - existingPolicy, err := es.GetPasswordComplexityPolicy(ctx, ctxData.OrgID) - if err != nil && !caos_errs.IsNotFound(err) { - return nil, err - } - if existingPolicy != nil && existingPolicy.Sequence > 0 { - return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-yDJ5I", "Errors.Policy.AlreadyExists") - } - - id, err := es.idGenerator.Next() - if err != nil { - return nil, err - } - policy.AggregateID = id - - repoPolicy := PasswordComplexityPolicyFromModel(policy) - - createAggregate := PasswordComplexityPolicyCreateAggregate(es.AggregateCreator(), repoPolicy) - err = es_sdk.Push(ctx, es.PushAggregates, repoPolicy.AppendEvents, createAggregate) - if err != nil { - return nil, err - } - - es.policyCache.cacheComplexityPolicy(repoPolicy) - return PasswordComplexityPolicyToModel(repoPolicy), nil -} - -func (es *PolicyEventstore) UpdatePasswordComplexityPolicy(ctx context.Context, policy *pol_model.PasswordComplexityPolicy) (*pol_model.PasswordComplexityPolicy, error) { - ctxData := authz.GetCtxData(ctx) - if err := policy.IsValid(); err != nil { - return nil, err - } - existingPolicy, err := es.GetPasswordComplexityPolicy(ctx, ctxData.OrgID) - if err != nil { - return nil, err - } - if existingPolicy.Sequence <= 0 { - return es.CreatePasswordComplexityPolicy(ctx, policy) - } - repoExisting := PasswordComplexityPolicyFromModel(existingPolicy) - repoNew := PasswordComplexityPolicyFromModel(policy) - - updateAggregate := PasswordComplexityPolicyUpdateAggregate(es.AggregateCreator(), repoExisting, repoNew) - err = es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, updateAggregate) - if err != nil { - return nil, err - } - - es.policyCache.cacheComplexityPolicy(repoExisting) - return PasswordComplexityPolicyToModel(repoExisting), nil -} diff --git a/internal/policy/repository/eventsourcing/eventstore_complexity_mock_test.go b/internal/policy/repository/eventsourcing/eventstore_complexity_mock_test.go deleted file mode 100644 index bab874b331..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_complexity_mock_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package eventsourcing - -import ( - "encoding/json" - - mock_cache "github.com/caos/zitadel/internal/cache/mock" - "github.com/caos/zitadel/internal/eventstore/mock" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" - "github.com/golang/mock/gomock" -) - -func GetMockedEventstoreComplexity(ctrl *gomock.Controller, mockEs *mock.MockEventstore) *PolicyEventstore { - return &PolicyEventstore{ - Eventstore: mockEs, - policyCache: GetMockCacheComplexity(ctrl), - idGenerator: GetSonyFlake(), - } -} - -func GetMockCacheComplexity(ctrl *gomock.Controller) *PolicyCache { - mockCache := mock_cache.NewMockCache(ctrl) - mockCache.EXPECT().Get(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockCache.EXPECT().Set(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - return &PolicyCache{policyCache: mockCache} -} - -func GetMockGetPasswordComplexityPolicyOK(ctrl *gomock.Controller) *PolicyEventstore { - data, _ := json.Marshal(model.PasswordComplexityPolicy{Description: "Name"}) - events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordComplexityPolicyAdded, Data: data}, - } - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - return GetMockedEventstoreComplexity(ctrl, mockEs) -} - -func GetMockGetPasswordComplexityPolicyNoEvents(ctrl *gomock.Controller) *PolicyEventstore { - events := []*es_models.Event{} - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - return GetMockedEventstoreComplexity(ctrl, mockEs) -} - -func GetMockPasswordComplexityPolicy(ctrl *gomock.Controller) *PolicyEventstore { - data, _ := json.Marshal(model.PasswordComplexityPolicy{Description: "Name"}) - events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordComplexityPolicyAdded, Data: data}, - } - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) - mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) - return GetMockedEventstoreComplexity(ctrl, mockEs) -} - -func GetMockPasswordComplexityPolicyNoEvents(ctrl *gomock.Controller) *PolicyEventstore { - events := []*es_models.Event{} - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) - mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) - return GetMockedEventstoreComplexity(ctrl, mockEs) -} diff --git a/internal/policy/repository/eventsourcing/eventstore_complexity_test.go b/internal/policy/repository/eventsourcing/eventstore_complexity_test.go deleted file mode 100644 index 8afdd66799..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_complexity_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package eventsourcing - -import ( - "context" - "testing" - - "github.com/golang/mock/gomock" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -func TestGetPasswordComplexityPolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - policy *model.PasswordComplexityPolicy - } - type res struct { - policy *model.PasswordComplexityPolicy - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy from events, ok", - args: args{ - es: GetMockGetPasswordComplexityPolicyOK(ctrl), - policy: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, - }, - res: res{ - policy: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, - }, - }, - { - name: "policy from events, no events", - args: args{ - es: GetMockGetPasswordComplexityPolicyNoEvents(ctrl), - policy: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 2}}, - }, - res: res{ - wantErr: true, - errFunc: caos_errs.IsNotFound, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.GetPasswordComplexityPolicy(nil, tt.args.policy.AggregateID) - - if !tt.res.wantErr && result.AggregateID != tt.res.policy.AggregateID { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.AggregateID, result.AggregateID) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestCreatePasswordComplexityPolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - ctx context.Context - policy *model.PasswordComplexityPolicy - } - type res struct { - policy *model.PasswordComplexityPolicy - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "create policy, ok", - args: args{ - es: GetMockPasswordComplexityPolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - policy: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name", MinLength: 8}, - }, - res: res{ - policy: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name", MinLength: 8}, - }, - }, - { - name: "create policy, no minlength", - args: args{ - es: GetMockPasswordComplexityPolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - policy: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name"}, - }, - res: res{ - errFunc: caos_errs.IsErrorInvalidArgument, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.CreatePasswordComplexityPolicy(tt.args.ctx, tt.args.policy) - - if tt.res.errFunc == nil && result.AggregateID == "" { - t.Errorf("result has no id") - } - if tt.res.errFunc == nil && result.Description != tt.res.policy.Description { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.Description, result.Description) - } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestUpdatePasswordComplexityPolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - ctx context.Context - new *model.PasswordComplexityPolicy - } - type res struct { - policy *model.PasswordComplexityPolicy - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "update policy, ok", - args: args{ - es: GetMockPasswordComplexityPolicy(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - new: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew", MinLength: 8}, - }, - res: res{ - policy: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew", MinLength: 8}, - }, - }, - { - name: "create policy, no minlength", - args: args{ - es: GetMockPasswordComplexityPolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - new: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name"}, - }, - res: res{ - errFunc: caos_errs.IsErrorInvalidArgument, - }, - }, - { - name: "existing policy not found", - args: args{ - es: GetMockPasswordComplexityPolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - new: &model.PasswordComplexityPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew", MinLength: 8}, - }, - res: res{ - errFunc: caos_errs.IsNotFound, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.UpdatePasswordComplexityPolicy(tt.args.ctx, tt.args.new) - - if tt.res.errFunc == nil && result.AggregateID == "" { - t.Errorf("result has no id") - } - if tt.res.errFunc == nil && result.Description != tt.res.policy.Description { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.Description, result.Description) - } - if tt.res.errFunc != nil && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} diff --git a/internal/policy/repository/eventsourcing/eventstore_lockout.go b/internal/policy/repository/eventsourcing/eventstore_lockout.go deleted file mode 100644 index b54af4753c..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_lockout.go +++ /dev/null @@ -1,76 +0,0 @@ -package eventsourcing - -import ( - "context" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" - pol_model "github.com/caos/zitadel/internal/policy/model" -) - -func (es *PolicyEventstore) GetPasswordLockoutPolicy(ctx context.Context, id string) (*pol_model.PasswordLockoutPolicy, error) { - policy := es.policyCache.getLockoutPolicy(id) - - query := PasswordLockoutPolicyQuery(id, policy.Sequence) - err := es_sdk.Filter(ctx, es.FilterEvents, policy.AppendEvents, query) - if caos_errs.IsNotFound(err) && es.passwordLockoutPolicyDefault.Description != "" { - policy.Description = es.passwordLockoutPolicyDefault.Description - policy.MaxAttempts = es.passwordLockoutPolicyDefault.MaxAttempts - policy.ShowLockOutFailures = es.passwordLockoutPolicyDefault.ShowLockOutFailures - } else if err != nil { - return nil, err - } - es.policyCache.cacheLockoutPolicy(policy) - return PasswordLockoutPolicyToModel(policy), nil -} - -func (es *PolicyEventstore) CreatePasswordLockoutPolicy(ctx context.Context, policy *pol_model.PasswordLockoutPolicy) (*pol_model.PasswordLockoutPolicy, error) { - ctxData := authz.GetCtxData(ctx) - existingPolicy, err := es.GetPasswordLockoutPolicy(ctx, ctxData.OrgID) - if err != nil && !caos_errs.IsNotFound(err) { - return nil, err - } - if existingPolicy != nil && existingPolicy.Sequence > 0 { - return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-yDJ5I", "Errors.Policy.AlreadyExists") - } - - id, err := es.idGenerator.Next() - if err != nil { - return nil, err - } - policy.AggregateID = id - - repoPolicy := PasswordLockoutPolicyFromModel(policy) - - createAggregate := PasswordLockoutPolicyCreateAggregate(es.AggregateCreator(), repoPolicy) - err = es_sdk.Push(ctx, es.PushAggregates, repoPolicy.AppendEvents, createAggregate) - if err != nil { - return nil, err - } - - es.policyCache.cacheLockoutPolicy(repoPolicy) - return PasswordLockoutPolicyToModel(repoPolicy), nil -} - -func (es *PolicyEventstore) UpdatePasswordLockoutPolicy(ctx context.Context, policy *pol_model.PasswordLockoutPolicy) (*pol_model.PasswordLockoutPolicy, error) { - ctxData := authz.GetCtxData(ctx) - existingPolicy, err := es.GetPasswordLockoutPolicy(ctx, ctxData.OrgID) - if err != nil { - return nil, err - } - if existingPolicy.Sequence <= 0 { - return es.CreatePasswordLockoutPolicy(ctx, policy) - } - repoExisting := PasswordLockoutPolicyFromModel(existingPolicy) - repoNew := PasswordLockoutPolicyFromModel(policy) - - updateAggregate := PasswordLockoutPolicyUpdateAggregate(es.AggregateCreator(), repoExisting, repoNew) - err = es_sdk.Push(ctx, es.PushAggregates, repoExisting.AppendEvents, updateAggregate) - if err != nil { - return nil, err - } - - es.policyCache.cacheLockoutPolicy(repoExisting) - return PasswordLockoutPolicyToModel(repoExisting), nil -} diff --git a/internal/policy/repository/eventsourcing/eventstore_lockout_mock_test.go b/internal/policy/repository/eventsourcing/eventstore_lockout_mock_test.go deleted file mode 100644 index bf3d0ae971..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_lockout_mock_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package eventsourcing - -import ( - "encoding/json" - - mock_cache "github.com/caos/zitadel/internal/cache/mock" - "github.com/caos/zitadel/internal/eventstore/mock" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" - "github.com/golang/mock/gomock" -) - -func GetMockedEventstoreLockout(ctrl *gomock.Controller, mockEs *mock.MockEventstore) *PolicyEventstore { - return &PolicyEventstore{ - Eventstore: mockEs, - policyCache: GetMockCacheLockout(ctrl), - idGenerator: GetSonyFlake(), - } -} - -func GetMockCacheLockout(ctrl *gomock.Controller) *PolicyCache { - mockCache := mock_cache.NewMockCache(ctrl) - mockCache.EXPECT().Get(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - mockCache.EXPECT().Set(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() - return &PolicyCache{policyCache: mockCache} -} - -func GetMockGetPasswordLockoutPolicyOK(ctrl *gomock.Controller) *PolicyEventstore { - data, _ := json.Marshal(model.PasswordLockoutPolicy{Description: "Name"}) - events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordLockoutPolicyAdded, Data: data}, - } - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - return GetMockedEventstoreLockout(ctrl, mockEs) -} - -func GetMockGetPasswordLockoutPolicyNoEvents(ctrl *gomock.Controller) *PolicyEventstore { - events := []*es_models.Event{} - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - return GetMockedEventstoreLockout(ctrl, mockEs) -} - -func GetMockPasswordLockoutPolicy(ctrl *gomock.Controller) *PolicyEventstore { - data, _ := json.Marshal(model.PasswordLockoutPolicy{Description: "Name"}) - events := []*es_models.Event{ - &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.PasswordLockoutPolicyAdded, Data: data}, - } - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) - mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) - return GetMockedEventstoreLockout(ctrl, mockEs) -} - -func GetMockPasswordLockoutPolicyNoEvents(ctrl *gomock.Controller) *PolicyEventstore { - events := []*es_models.Event{} - mockEs := mock.NewMockEventstore(ctrl) - mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) - mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) - mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) - return GetMockedEventstoreLockout(ctrl, mockEs) -} diff --git a/internal/policy/repository/eventsourcing/eventstore_lockout_test.go b/internal/policy/repository/eventsourcing/eventstore_lockout_test.go deleted file mode 100644 index df77cef4da..0000000000 --- a/internal/policy/repository/eventsourcing/eventstore_lockout_test.go +++ /dev/null @@ -1,169 +0,0 @@ -package eventsourcing - -import ( - "context" - "testing" - - "github.com/golang/mock/gomock" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -func TestGetPasswordLockoutPolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - policy *model.PasswordLockoutPolicy - } - type res struct { - policy *model.PasswordLockoutPolicy - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy from events, ok", - args: args{ - es: GetMockGetPasswordLockoutPolicyOK(ctrl), - policy: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, - }, - res: res{ - policy: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}}, - }, - }, - { - name: "policy from events, no events", - args: args{ - es: GetMockGetPasswordLockoutPolicyNoEvents(ctrl), - policy: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 2}}, - }, - res: res{ - wantErr: true, - errFunc: caos_errs.IsNotFound, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.GetPasswordLockoutPolicy(nil, tt.args.policy.AggregateID) - - if !tt.res.wantErr && result.AggregateID != tt.res.policy.AggregateID { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.AggregateID, result.AggregateID) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestCreatePasswordLockoutPolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - ctx context.Context - policy *model.PasswordLockoutPolicy - } - type res struct { - policy *model.PasswordLockoutPolicy - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "create policy, ok", - args: args{ - es: GetMockPasswordLockoutPolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - policy: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name"}, - }, - res: res{ - policy: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID1", Sequence: 2}, Description: "Name"}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.CreatePasswordLockoutPolicy(tt.args.ctx, tt.args.policy) - - if !tt.res.wantErr && result.AggregateID == "" { - t.Errorf("result has no id") - } - if !tt.res.wantErr && result.Description != tt.res.policy.Description { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.Description, result.Description) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestUpdatePasswordLockoutPolicy(t *testing.T) { - ctrl := gomock.NewController(t) - type args struct { - es *PolicyEventstore - ctx context.Context - new *model.PasswordLockoutPolicy - } - type res struct { - policy *model.PasswordLockoutPolicy - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "update policy, ok", - args: args{ - es: GetMockPasswordLockoutPolicy(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - new: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew"}, - }, - res: res{ - policy: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew"}, - }, - }, - { - name: "existing policy not found", - args: args{ - es: GetMockPasswordLockoutPolicyNoEvents(ctrl), - ctx: authz.NewMockContext("orgID", "userID"), - new: &model.PasswordLockoutPolicy{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "NameNew"}, - }, - res: res{ - wantErr: true, - errFunc: caos_errs.IsNotFound, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := tt.args.es.UpdatePasswordLockoutPolicy(tt.args.ctx, tt.args.new) - - if !tt.res.wantErr && result.AggregateID == "" { - t.Errorf("result has no id") - } - if !tt.res.wantErr && result.Description != tt.res.policy.Description { - t.Errorf("got wrong result name: expected: %v, actual: %v ", tt.res.policy.Description, result.Description) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} diff --git a/internal/policy/repository/eventsourcing/model_age.go b/internal/policy/repository/eventsourcing/model_age.go deleted file mode 100644 index b2d06b0682..0000000000 --- a/internal/policy/repository/eventsourcing/model_age.go +++ /dev/null @@ -1,80 +0,0 @@ -package eventsourcing - -import ( - "encoding/json" - - "github.com/caos/logging" - "github.com/caos/zitadel/internal/eventstore/models" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -const ( - policyAgeVersion = "v1" -) - -type PasswordAgePolicy struct { - models.ObjectRoot - - Description string `json:"description,omitempty"` - State int32 `json:"-"` - MaxAgeDays uint64 `json:"maxAgeDays"` - ExpireWarnDays uint64 `json:"expireWarnDays"` -} - -func (p *PasswordAgePolicy) AgeChanges(changed *PasswordAgePolicy) map[string]interface{} { - changes := make(map[string]interface{}, 1) - if changed.Description != "" && p.Description != changed.Description { - changes["description"] = changed.Description - } - if p.MaxAgeDays != changed.MaxAgeDays { - changes["maxAgeDays"] = changed.MaxAgeDays - } - if p.ExpireWarnDays != changed.ExpireWarnDays { - changes["expireWarnDays"] = changed.ExpireWarnDays - } - return changes -} - -func PasswordAgePolicyFromModel(policy *model.PasswordAgePolicy) *PasswordAgePolicy { - return &PasswordAgePolicy{ - ObjectRoot: policy.ObjectRoot, - Description: policy.Description, - State: int32(policy.State), - MaxAgeDays: policy.MaxAgeDays, - ExpireWarnDays: policy.ExpireWarnDays, - } -} - -func PasswordAgePolicyToModel(policy *PasswordAgePolicy) *model.PasswordAgePolicy { - return &model.PasswordAgePolicy{ - ObjectRoot: policy.ObjectRoot, - Description: policy.Description, - State: model.PolicyState(policy.State), - MaxAgeDays: policy.MaxAgeDays, - ExpireWarnDays: policy.ExpireWarnDays, - } -} - -func (p *PasswordAgePolicy) AppendEvents(events ...*es_models.Event) error { - for _, event := range events { - if err := p.AppendEvent(event); err != nil { - return err - } - } - return nil -} - -func (p *PasswordAgePolicy) AppendEvent(event *es_models.Event) error { - p.ObjectRoot.AppendEvent(event) - - switch event.Type { - case model.PasswordAgePolicyAdded, model.PasswordAgePolicyChanged: - if err := json.Unmarshal(event.Data, p); err != nil { - logging.Log("EVEN-idl93").WithError(err).Error("could not unmarshal event data") - return err - } - return nil - } - return nil -} diff --git a/internal/policy/repository/eventsourcing/model_lockout.go b/internal/policy/repository/eventsourcing/model_lockout.go deleted file mode 100644 index 5d28d6124b..0000000000 --- a/internal/policy/repository/eventsourcing/model_lockout.go +++ /dev/null @@ -1,80 +0,0 @@ -package eventsourcing - -import ( - "encoding/json" - - "github.com/caos/logging" - "github.com/caos/zitadel/internal/eventstore/models" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -const ( - policyLockoutVersion = "v1" -) - -type PasswordLockoutPolicy struct { - models.ObjectRoot - - Description string `json:"description,omitempty"` - State int32 `json:"-"` - MaxAttempts uint64 `json:"maxAttempts"` - ShowLockOutFailures bool `json:"showLockOutFailures"` -} - -func (p *PasswordLockoutPolicy) LockoutChanges(changed *PasswordLockoutPolicy) map[string]interface{} { - changes := make(map[string]interface{}, 1) - if changed.Description != "" && p.Description != changed.Description { - changes["description"] = changed.Description - } - if p.MaxAttempts != changed.MaxAttempts { - changes["maxAttempts"] = changed.MaxAttempts - } - if p.ShowLockOutFailures != changed.ShowLockOutFailures { - changes["showLockOutFailures"] = changed.ShowLockOutFailures - } - return changes -} - -func PasswordLockoutPolicyFromModel(policy *model.PasswordLockoutPolicy) *PasswordLockoutPolicy { - return &PasswordLockoutPolicy{ - ObjectRoot: policy.ObjectRoot, - Description: policy.Description, - State: int32(policy.State), - MaxAttempts: policy.MaxAttempts, - ShowLockOutFailures: policy.ShowLockOutFailures, - } -} - -func PasswordLockoutPolicyToModel(policy *PasswordLockoutPolicy) *model.PasswordLockoutPolicy { - return &model.PasswordLockoutPolicy{ - ObjectRoot: policy.ObjectRoot, - Description: policy.Description, - State: model.PolicyState(policy.State), - MaxAttempts: policy.MaxAttempts, - ShowLockOutFailures: policy.ShowLockOutFailures, - } -} - -func (p *PasswordLockoutPolicy) AppendEvents(events ...*es_models.Event) error { - for _, event := range events { - if err := p.AppendEvent(event); err != nil { - return err - } - } - return nil -} - -func (p *PasswordLockoutPolicy) AppendEvent(event *es_models.Event) error { - p.ObjectRoot.AppendEvent(event) - - switch event.Type { - case model.PasswordLockoutPolicyAdded, model.PasswordLockoutPolicyChanged: - if err := json.Unmarshal(event.Data, p); err != nil { - logging.Log("EVEN-idl93").WithError(err).Error("could not unmarshal event data") - return err - } - return nil - } - return nil -} diff --git a/internal/policy/repository/eventsourcing/policy_age.go b/internal/policy/repository/eventsourcing/policy_age.go deleted file mode 100644 index 61675f0d96..0000000000 --- a/internal/policy/repository/eventsourcing/policy_age.go +++ /dev/null @@ -1,51 +0,0 @@ -package eventsourcing - -import ( - "context" - - "github.com/caos/zitadel/internal/errors" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -func PasswordAgePolicyQuery(recourceOwner string, latestSequence uint64) *es_models.SearchQuery { - return es_models.NewSearchQuery(). - AggregateTypeFilter(model.PasswordAgePolicyAggregate). - LatestSequenceFilter(latestSequence). - ResourceOwnerFilter(recourceOwner) -} - -func PasswordAgePolicyAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, policy *PasswordAgePolicy) (*es_models.Aggregate, error) { - if policy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-1T05i", "Errors.Internal") - } - return aggCreator.NewAggregate(ctx, policy.AggregateID, model.PasswordAgePolicyAggregate, policyAgeVersion, policy.Sequence) -} - -func PasswordAgePolicyCreateAggregate(aggCreator *es_models.AggregateCreator, policy *PasswordAgePolicy) func(ctx context.Context) (*es_models.Aggregate, error) { - return func(ctx context.Context) (*es_models.Aggregate, error) { - if policy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-kdie6", "Errors.Internal") - } - agg, err := PasswordAgePolicyAggregate(ctx, aggCreator, policy) - if err != nil { - return nil, err - } - - return agg.AppendEvent(model.PasswordAgePolicyAdded, policy) - } -} - -func PasswordAgePolicyUpdateAggregate(aggCreator *es_models.AggregateCreator, existingPolicy *PasswordAgePolicy, newPolicy *PasswordAgePolicy) func(ctx context.Context) (*es_models.Aggregate, error) { - return func(ctx context.Context) (*es_models.Aggregate, error) { - if newPolicy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dhr74", "Errors.Internal") - } - agg, err := PasswordAgePolicyAggregate(ctx, aggCreator, existingPolicy) - if err != nil { - return nil, err - } - changes := existingPolicy.AgeChanges(newPolicy) - return agg.AppendEvent(model.PasswordAgePolicyChanged, changes) - } -} diff --git a/internal/policy/repository/eventsourcing/policy_age_test.go b/internal/policy/repository/eventsourcing/policy_age_test.go deleted file mode 100644 index 407911f540..0000000000 --- a/internal/policy/repository/eventsourcing/policy_age_test.go +++ /dev/null @@ -1,268 +0,0 @@ -package eventsourcing - -import ( - "context" - "testing" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/eventstore/models" - policy_model "github.com/caos/zitadel/internal/policy/model" -) - -func TestGetPasswordAgePolicyQuery(t *testing.T) { - type args struct { - recourceOwner string - sequence uint64 - } - type res struct { - filterLen int - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "Get password age policy query ok", - args: args{ - recourceOwner: "org", - sequence: 14, - }, - res: res{ - filterLen: 3, - }, - }, - { - name: "Get password age policy query, no org", - args: args{ - sequence: 1, - }, - res: res{ - filterLen: 3, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - query := PasswordAgePolicyQuery(tt.args.recourceOwner, tt.args.sequence) - if !tt.res.wantErr && query == nil { - t.Errorf("query should not be nil") - } - if !tt.res.wantErr && len(query.Filters) != tt.res.filterLen { - t.Errorf("got wrong filter len: expected: %v, actual: %v ", tt.res.filterLen, len(query.Filters)) - } - }) - } -} - -func TestPasswordAgePolicyAggregate(t *testing.T) { - - type args struct { - ctx context.Context - aggCreator *models.AggregateCreator - policy *PasswordAgePolicy - } - type res struct { - eventLen int - aggType models.AggregateType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "create aggregate", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - aggCreator: models.NewAggregateCreator("Test"), - policy: &PasswordAgePolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "Test"}, - }, - res: res{ - eventLen: 0, - aggType: policy_model.PasswordAgePolicyAggregate, - }, - }, - { - name: "policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 0, - aggType: policy_model.PasswordAgePolicyAggregate, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordAgePolicyAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.policy) - - if !tt.res.wantErr && agg == nil { - t.Errorf("agg should not be nil") - } - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestPasswordAgePolicyCreateAggregate(t *testing.T) { - type args struct { - ctx context.Context - new *PasswordAgePolicy - aggCreator *models.AggregateCreator - } - type res struct { - eventLen int - eventType models.EventType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy update aggregate ok", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - new: &PasswordAgePolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName", State: int32(policy_model.PolicyStateActive)}, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordAgePolicyAdded, - }, - }, - { - name: "new policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - new: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordAgePolicyAdded, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordAgePolicyCreateAggregate(tt.args.aggCreator, tt.args.new)(tt.args.ctx) - - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if !tt.res.wantErr && agg.Events[0].Type != tt.res.eventType { - t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventType, agg.Events[0].Type.String()) - } - if !tt.res.wantErr && agg.Events[0].Data == nil { - t.Errorf("should have data in event") - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestPasswordAgePolicyUpdateAggregate(t *testing.T) { - type args struct { - ctx context.Context - existingPolicy *PasswordAgePolicy - newPolicy *PasswordAgePolicy - aggCreator *models.AggregateCreator - } - type res struct { - eventLen int - eventType models.EventType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy update aggregate ok", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: &PasswordAgePolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName", State: int32(policy_model.PolicyStateActive)}, - newPolicy: &PasswordAgePolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName_Changed", State: int32(policy_model.PolicyStateActive)}, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordAgePolicyChanged, - }, - }, - { - name: "existing policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordAgePolicyChanged, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - { - name: "new policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: &PasswordAgePolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "ProjectName", State: int32(policy_model.PolicyStateActive)}, - newPolicy: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordAgePolicyChanged, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordAgePolicyUpdateAggregate(tt.args.aggCreator, tt.args.existingPolicy, tt.args.newPolicy)(tt.args.ctx) - - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if !tt.res.wantErr && agg.Events[0].Type != tt.res.eventType { - t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventType, agg.Events[0].Type.String()) - } - if !tt.res.wantErr && agg.Events[0].Data == nil { - t.Errorf("should have data in event") - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} diff --git a/internal/policy/repository/eventsourcing/policy_complexity.go b/internal/policy/repository/eventsourcing/policy_complexity.go deleted file mode 100644 index 360449e226..0000000000 --- a/internal/policy/repository/eventsourcing/policy_complexity.go +++ /dev/null @@ -1,52 +0,0 @@ -package eventsourcing - -import ( - "context" - - "github.com/caos/zitadel/internal/errors" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -func PasswordComplexityPolicyQuery(recourceOwner string, latestSequence uint64) *es_models.SearchQuery { - return es_models.NewSearchQuery(). - AggregateTypeFilter(model.PasswordComplexityPolicyAggregate). - LatestSequenceFilter(latestSequence). - ResourceOwnerFilter(recourceOwner) - -} - -func PasswordComplexityPolicyAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, policy *PasswordComplexityPolicy) (*es_models.Aggregate, error) { - if policy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-fRVr9", "Errors.Internal") - } - return aggCreator.NewAggregate(ctx, policy.AggregateID, model.PasswordComplexityPolicyAggregate, policyComplexityVersion, policy.Sequence) -} - -func PasswordComplexityPolicyCreateAggregate(aggCreator *es_models.AggregateCreator, policy *PasswordComplexityPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { - return func(ctx context.Context) (*es_models.Aggregate, error) { - if policy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-kdie6", "Errors.Internal") - } - agg, err := PasswordComplexityPolicyAggregate(ctx, aggCreator, policy) - if err != nil { - return nil, err - } - - return agg.AppendEvent(model.PasswordComplexityPolicyAdded, policy) - } -} - -func PasswordComplexityPolicyUpdateAggregate(aggCreator *es_models.AggregateCreator, existingPolicy *PasswordComplexityPolicy, newPolicy *PasswordComplexityPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { - return func(ctx context.Context) (*es_models.Aggregate, error) { - if newPolicy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dhr74", "Errors.Internal") - } - agg, err := PasswordComplexityPolicyAggregate(ctx, aggCreator, existingPolicy) - if err != nil { - return nil, err - } - changes := existingPolicy.ComplexityChanges(newPolicy) - return agg.AppendEvent(model.PasswordComplexityPolicyChanged, changes) - } -} diff --git a/internal/policy/repository/eventsourcing/policy_complexity_test.go b/internal/policy/repository/eventsourcing/policy_complexity_test.go deleted file mode 100644 index b819a94bb3..0000000000 --- a/internal/policy/repository/eventsourcing/policy_complexity_test.go +++ /dev/null @@ -1,268 +0,0 @@ -package eventsourcing - -import ( - "context" - "testing" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/eventstore/models" - policy_model "github.com/caos/zitadel/internal/policy/model" -) - -func TestPasswordComplexityPolicyQuery(t *testing.T) { - type args struct { - recourceOwner string - sequence uint64 - } - type res struct { - filterLen int - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "Get password complexity policy query ok", - args: args{ - recourceOwner: "org", - sequence: 0, - }, - res: res{ - filterLen: 2, - }, - }, - { - name: "Get password complexity policy query, no org", - args: args{ - sequence: 1, - }, - res: res{ - filterLen: 3, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - query := PasswordComplexityPolicyQuery(tt.args.recourceOwner, tt.args.sequence) - if !tt.res.wantErr && query == nil { - t.Errorf("query should not be nil") - } - if !tt.res.wantErr && len(query.Filters) != tt.res.filterLen { - t.Errorf("got wrong filter len: expected: %v, actual: %v ", tt.res.filterLen, len(query.Filters)) - } - }) - } -} - -func TestPasswordComplexityPolicyAggregate(t *testing.T) { - - type args struct { - ctx context.Context - aggCreator *models.AggregateCreator - policy *PasswordComplexityPolicy - } - type res struct { - eventLen int - aggType models.AggregateType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "create aggregate", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - aggCreator: models.NewAggregateCreator("Test"), - policy: &PasswordComplexityPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "Test"}, - }, - res: res{ - eventLen: 0, - aggType: policy_model.PasswordComplexityPolicyAggregate, - }, - }, - { - name: "policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 0, - aggType: policy_model.PasswordComplexityPolicyAggregate, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordComplexityPolicyAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.policy) - - if !tt.res.wantErr && agg == nil { - t.Errorf("agg should not be nil") - } - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestPasswordComplexityPolicyCreateAggregate(t *testing.T) { - type args struct { - ctx context.Context - new *PasswordComplexityPolicy - aggCreator *models.AggregateCreator - } - type res struct { - eventLen int - eventType models.EventType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy update aggregate ok", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - new: &PasswordComplexityPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName", State: int32(policy_model.PolicyStateActive)}, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordComplexityPolicyAdded, - }, - }, - { - name: "new policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - new: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordComplexityPolicyAdded, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordComplexityPolicyCreateAggregate(tt.args.aggCreator, tt.args.new)(tt.args.ctx) - - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if !tt.res.wantErr && agg.Events[0].Type != tt.res.eventType { - t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventType, agg.Events[0].Type.String()) - } - if !tt.res.wantErr && agg.Events[0].Data == nil { - t.Errorf("should have data in event") - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestPasswordComplexityPolicyUpdateAggregate(t *testing.T) { - type args struct { - ctx context.Context - existingPolicy *PasswordComplexityPolicy - newPolicy *PasswordComplexityPolicy - aggCreator *models.AggregateCreator - } - type res struct { - eventLen int - eventType models.EventType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy update aggregate ok", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: &PasswordComplexityPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName", State: int32(policy_model.PolicyStateActive)}, - newPolicy: &PasswordComplexityPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName_Changed", State: int32(policy_model.PolicyStateActive)}, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordComplexityPolicyChanged, - }, - }, - { - name: "existing policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordComplexityPolicyChanged, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - { - name: "new policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: &PasswordComplexityPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "ProjectName", State: int32(policy_model.PolicyStateActive)}, - newPolicy: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordComplexityPolicyChanged, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordComplexityPolicyUpdateAggregate(tt.args.aggCreator, tt.args.existingPolicy, tt.args.newPolicy)(tt.args.ctx) - - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if !tt.res.wantErr && agg.Events[0].Type != tt.res.eventType { - t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventType, agg.Events[0].Type.String()) - } - if !tt.res.wantErr && agg.Events[0].Data == nil { - t.Errorf("should have data in event") - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} diff --git a/internal/policy/repository/eventsourcing/policy_lockout.go b/internal/policy/repository/eventsourcing/policy_lockout.go deleted file mode 100644 index c01715e8c8..0000000000 --- a/internal/policy/repository/eventsourcing/policy_lockout.go +++ /dev/null @@ -1,53 +0,0 @@ -package eventsourcing - -import ( - "context" - - "github.com/caos/zitadel/internal/errors" - es_models "github.com/caos/zitadel/internal/eventstore/models" - "github.com/caos/zitadel/internal/policy/model" -) - -func PasswordLockoutPolicyQuery(recourceOwner string, latestSequence uint64) *es_models.SearchQuery { - return es_models.NewSearchQuery(). - AggregateTypeFilter(model.PasswordLockoutPolicyAggregate). - LatestSequenceFilter(latestSequence). - ResourceOwnerFilter(recourceOwner) - -} - -func PasswordLockoutPolicyAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, policy *PasswordLockoutPolicy) (*es_models.Aggregate, error) { - if policy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-aTRlj", "Errors.Internal") - } - return aggCreator.NewAggregate(ctx, policy.AggregateID, model.PasswordLockoutPolicyAggregate, policyLockoutVersion, policy.Sequence) -} - -func PasswordLockoutPolicyCreateAggregate(aggCreator *es_models.AggregateCreator, policy *PasswordLockoutPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { - return func(ctx context.Context) (*es_models.Aggregate, error) { - if policy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-kdie6", "Errors.Internal") - } - - agg, err := PasswordLockoutPolicyAggregate(ctx, aggCreator, policy) - if err != nil { - return nil, err - } - - return agg.AppendEvent(model.PasswordLockoutPolicyAdded, policy) - } -} - -func PasswordLockoutPolicyUpdateAggregate(aggCreator *es_models.AggregateCreator, existingPolicy *PasswordLockoutPolicy, newPolicy *PasswordLockoutPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { - return func(ctx context.Context) (*es_models.Aggregate, error) { - if newPolicy == nil { - return nil, errors.ThrowPreconditionFailed(nil, "EVENT-dhr74", "Errors.Internal") - } - agg, err := PasswordLockoutPolicyAggregate(ctx, aggCreator, existingPolicy) - if err != nil { - return nil, err - } - changes := existingPolicy.LockoutChanges(newPolicy) - return agg.AppendEvent(model.PasswordLockoutPolicyChanged, changes) - } -} diff --git a/internal/policy/repository/eventsourcing/policy_lockout_test.go b/internal/policy/repository/eventsourcing/policy_lockout_test.go deleted file mode 100644 index 7caa3b394b..0000000000 --- a/internal/policy/repository/eventsourcing/policy_lockout_test.go +++ /dev/null @@ -1,268 +0,0 @@ -package eventsourcing - -import ( - "context" - "testing" - - "github.com/caos/zitadel/internal/api/authz" - caos_errs "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/eventstore/models" - policy_model "github.com/caos/zitadel/internal/policy/model" -) - -func TestGetPasswordLockoutPolicyQuery(t *testing.T) { - type args struct { - recourceOwner string - sequence uint64 - } - type res struct { - filterLen int - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "Get password lockout policy query ok", - args: args{ - recourceOwner: "org", - sequence: 14, - }, - res: res{ - filterLen: 3, - }, - }, - { - name: "Get password lockout policy query, no org", - args: args{ - sequence: 1, - }, - res: res{ - filterLen: 3, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - query := PasswordLockoutPolicyQuery(tt.args.recourceOwner, tt.args.sequence) - if !tt.res.wantErr && query == nil { - t.Errorf("query should not be nil") - } - if !tt.res.wantErr && len(query.Filters) != tt.res.filterLen { - t.Errorf("got wrong filter len: expected: %v, actual: %v ", tt.res.filterLen, len(query.Filters)) - } - }) - } -} - -func TestPasswordLockoutPolicyAggregate(t *testing.T) { - - type args struct { - ctx context.Context - aggCreator *models.AggregateCreator - policy *PasswordLockoutPolicy - } - type res struct { - eventLen int - aggType models.AggregateType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "create aggregate", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - aggCreator: models.NewAggregateCreator("Test"), - policy: &PasswordLockoutPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Description: "Test"}, - }, - res: res{ - eventLen: 0, - aggType: policy_model.PasswordLockoutPolicyAggregate, - }, - }, - { - name: "policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 0, - aggType: policy_model.PasswordLockoutPolicyAggregate, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordLockoutPolicyAggregate(tt.args.ctx, tt.args.aggCreator, tt.args.policy) - - if !tt.res.wantErr && agg == nil { - t.Errorf("agg should not be nil") - } - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestPasswordLockoutPolicyCreateAggregate(t *testing.T) { - type args struct { - ctx context.Context - newPolicy *PasswordLockoutPolicy - aggCreator *models.AggregateCreator - } - type res struct { - eventLen int - eventType models.EventType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy update aggregate ok", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - newPolicy: &PasswordLockoutPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName", State: int32(policy_model.PolicyStateActive)}, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordLockoutPolicyAdded, - }, - }, - { - name: "new policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - newPolicy: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordLockoutPolicyAdded, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordLockoutPolicyCreateAggregate(tt.args.aggCreator, tt.args.newPolicy)(tt.args.ctx) - - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if !tt.res.wantErr && agg.Events[0].Type != tt.res.eventType { - t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventType, agg.Events[0].Type.String()) - } - if !tt.res.wantErr && agg.Events[0].Data == nil { - t.Errorf("should have data in event") - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} - -func TestPasswordLockoutPolicyUpdateAggregate(t *testing.T) { - type args struct { - ctx context.Context - existingPolicy *PasswordLockoutPolicy - newPolicy *PasswordLockoutPolicy - aggCreator *models.AggregateCreator - } - type res struct { - eventLen int - eventType models.EventType - wantErr bool - errFunc func(err error) bool - } - tests := []struct { - name string - args args - res res - }{ - { - name: "policy update aggregate ok", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: &PasswordLockoutPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName", State: int32(policy_model.PolicyStateActive)}, - newPolicy: &PasswordLockoutPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "PolicyName_Changed", State: int32(policy_model.PolicyStateActive)}, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordLockoutPolicyChanged, - }, - }, - { - name: "existing policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordLockoutPolicyChanged, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - { - name: "new policy nil", - args: args{ - ctx: authz.NewMockContext("orgID", "userID"), - existingPolicy: &PasswordLockoutPolicy{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, Description: "ProjectName", State: int32(policy_model.PolicyStateActive)}, - newPolicy: nil, - aggCreator: models.NewAggregateCreator("Test"), - }, - res: res{ - eventLen: 1, - eventType: policy_model.PasswordLockoutPolicyChanged, - wantErr: true, - errFunc: caos_errs.IsPreconditionFailed, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - agg, err := PasswordLockoutPolicyUpdateAggregate(tt.args.aggCreator, tt.args.existingPolicy, tt.args.newPolicy)(tt.args.ctx) - - if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { - t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) - } - if !tt.res.wantErr && agg.Events[0].Type != tt.res.eventType { - t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventType, agg.Events[0].Type.String()) - } - if !tt.res.wantErr && agg.Events[0].Data == nil { - t.Errorf("should have data in event") - } - if tt.res.wantErr && !tt.res.errFunc(err) { - t.Errorf("got wrong err: %v ", err) - } - }) - } -} diff --git a/internal/project/model/application_view.go b/internal/project/model/application_view.go index 778d1f7293..e6c5d334c3 100644 --- a/internal/project/model/application_view.go +++ b/internal/project/model/application_view.go @@ -7,12 +7,14 @@ import ( ) type ApplicationView struct { - ID string - ProjectID string - Name string - CreationDate time.Time - ChangeDate time.Time - State AppState + ID string + ProjectID string + Name string + CreationDate time.Time + ChangeDate time.Time + State AppState + ProjectRoleAssertion bool + ProjectRoleCheck bool IsOIDC bool OIDCVersion OIDCVersion @@ -27,6 +29,9 @@ type ApplicationView struct { ComplianceProblems []string DevMode bool OriginAllowList []string + AccessTokenType OIDCTokenType + IDTokenRoleAssertion bool + AccessTokenRoleAssertion bool Sequence uint64 } diff --git a/internal/project/model/oidc_config.go b/internal/project/model/oidc_config.go index a0c4d03fb0..1f267c8f60 100644 --- a/internal/project/model/oidc_config.go +++ b/internal/project/model/oidc_config.go @@ -21,19 +21,22 @@ const ( type OIDCConfig struct { es_models.ObjectRoot - AppID string - ClientID string - ClientSecret *crypto.CryptoValue - ClientSecretString string - RedirectUris []string - ResponseTypes []OIDCResponseType - GrantTypes []OIDCGrantType - ApplicationType OIDCApplicationType - AuthMethodType OIDCAuthMethodType - PostLogoutRedirectUris []string - OIDCVersion OIDCVersion - Compliance *Compliance - DevMode bool + AppID string + ClientID string + ClientSecret *crypto.CryptoValue + ClientSecretString string + RedirectUris []string + ResponseTypes []OIDCResponseType + GrantTypes []OIDCGrantType + ApplicationType OIDCApplicationType + AuthMethodType OIDCAuthMethodType + PostLogoutRedirectUris []string + OIDCVersion OIDCVersion + Compliance *Compliance + DevMode bool + AccessTokenType OIDCTokenType + AccessTokenRoleAssertion bool + IDTokenRoleAssertion bool } type OIDCVersion int32 @@ -79,6 +82,13 @@ type Compliance struct { Problems []string } +type OIDCTokenType int32 + +const ( + OIDCTokenTypeBearer OIDCTokenType = iota + OIDCTokenTypeJWT +) + func (c *OIDCConfig) IsValid() bool { grantTypes := c.getRequiredGrantTypes() for _, grantType := range grantTypes { diff --git a/internal/project/model/project.go b/internal/project/model/project.go index fb9532f653..439f75e9cd 100644 --- a/internal/project/model/project.go +++ b/internal/project/model/project.go @@ -1,19 +1,22 @@ package model import ( - es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/golang/protobuf/ptypes/timestamp" + + es_models "github.com/caos/zitadel/internal/eventstore/models" ) type Project struct { es_models.ObjectRoot - State ProjectState - Name string - Members []*ProjectMember - Roles []*ProjectRole - Applications []*Application - Grants []*ProjectGrant + State ProjectState + Name string + Members []*ProjectMember + Roles []*ProjectRole + Applications []*Application + Grants []*ProjectGrant + ProjectRoleAssertion bool + ProjectRoleCheck bool } type ProjectChanges struct { Changes []*ProjectChange diff --git a/internal/project/model/project_view.go b/internal/project/model/project_view.go index bf76564454..f6764911ff 100644 --- a/internal/project/model/project_view.go +++ b/internal/project/model/project_view.go @@ -1,18 +1,21 @@ package model import ( - "github.com/caos/zitadel/internal/model" "time" + + "github.com/caos/zitadel/internal/model" ) type ProjectView struct { - ProjectID string - Name string - CreationDate time.Time - ChangeDate time.Time - State ProjectState - ResourceOwner string - Sequence uint64 + ProjectID string + Name string + CreationDate time.Time + ChangeDate time.Time + State ProjectState + ResourceOwner string + ProjectRoleAssertion bool + ProjectRoleCheck bool + Sequence uint64 } type ProjectViewSearchRequest struct { diff --git a/internal/project/repository/eventsourcing/eventstore.go b/internal/project/repository/eventsourcing/eventstore.go index 6ec960fd44..d9b3f861bb 100644 --- a/internal/project/repository/eventsourcing/eventstore.go +++ b/internal/project/repository/eventsourcing/eventstore.go @@ -67,6 +67,9 @@ func (es *ProjectEventstore) ProjectByID(ctx context.Context, id string) (*proj_ if err != nil && !(caos_errs.IsNotFound(err) && project.Sequence != 0) { return nil, err } + if project.State == int32(proj_model.ProjectStateRemoved) { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-dG8ie", "Errors.Project.NotFound") + } es.projectCache.cacheProject(project) return model.ProjectToModel(project), nil } @@ -318,7 +321,7 @@ func (es *ProjectEventstore) AddProjectRoles(ctx context.Context, roles ...*proj } for _, role := range roles { if !role.IsValid() { - return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-idue3", "Errors.Project.MemberInvalid") + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-iduG4", "Errors.Project.RoleInvalid") } } existingProject, err := es.ProjectByID(ctx, roles[0].AggregateID) diff --git a/internal/project/repository/eventsourcing/model/oidc_config.go b/internal/project/repository/eventsourcing/model/oidc_config.go index 55e0ab4177..29360be1d5 100644 --- a/internal/project/repository/eventsourcing/model/oidc_config.go +++ b/internal/project/repository/eventsourcing/model/oidc_config.go @@ -2,26 +2,31 @@ package model import ( "encoding/json" + "reflect" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/crypto" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/project/model" - "reflect" ) type OIDCConfig struct { es_models.ObjectRoot - Version int32 `json:"oidcVersion,omitempty"` - AppID string `json:"appId"` - ClientID string `json:"clientId,omitempty"` - ClientSecret *crypto.CryptoValue `json:"clientSecret,omitempty"` - RedirectUris []string `json:"redirectUris,omitempty"` - ResponseTypes []int32 `json:"responseTypes,omitempty"` - GrantTypes []int32 `json:"grantTypes,omitempty"` - ApplicationType int32 `json:"applicationType,omitempty"` - AuthMethodType int32 `json:"authMethodType,omitempty"` - PostLogoutRedirectUris []string `json:"postLogoutRedirectUris,omitempty"` - DevMode bool `json:"devMode,omitempty"` + Version int32 `json:"oidcVersion,omitempty"` + AppID string `json:"appId"` + ClientID string `json:"clientId,omitempty"` + ClientSecret *crypto.CryptoValue `json:"clientSecret,omitempty"` + RedirectUris []string `json:"redirectUris,omitempty"` + ResponseTypes []int32 `json:"responseTypes,omitempty"` + GrantTypes []int32 `json:"grantTypes,omitempty"` + ApplicationType int32 `json:"applicationType,omitempty"` + AuthMethodType int32 `json:"authMethodType,omitempty"` + PostLogoutRedirectUris []string `json:"postLogoutRedirectUris,omitempty"` + DevMode bool `json:"devMode,omitempty"` + AccessTokenType int32 `json:"accessTokenType,omitempty"` + AccessTokenRoleAssertion bool `json:"accessTokenRoleAssertion,omitempty"` + IDTokenRoleAssertion bool `json:"idTokenRoleAssertion,omitempty"` } func (c *OIDCConfig) Changes(changed *OIDCConfig) map[string]interface{} { @@ -51,6 +56,15 @@ func (c *OIDCConfig) Changes(changed *OIDCConfig) map[string]interface{} { if c.DevMode != changed.DevMode { changes["devMode"] = changed.DevMode } + if c.AccessTokenType != changed.AccessTokenType { + changes["accessTokenType"] = changed.AccessTokenType + } + if c.AccessTokenRoleAssertion != changed.AccessTokenRoleAssertion { + changes["accessTokenRoleAssertion"] = changed.AccessTokenRoleAssertion + } + if c.IDTokenRoleAssertion != changed.IDTokenRoleAssertion { + changes["idTokenRoleAssertion"] = changed.IDTokenRoleAssertion + } return changes } @@ -64,18 +78,21 @@ func OIDCConfigFromModel(config *model.OIDCConfig) *OIDCConfig { grantTypes[i] = int32(rt) } return &OIDCConfig{ - ObjectRoot: config.ObjectRoot, - AppID: config.AppID, - Version: int32(config.OIDCVersion), - ClientID: config.ClientID, - ClientSecret: config.ClientSecret, - RedirectUris: config.RedirectUris, - ResponseTypes: responseTypes, - GrantTypes: grantTypes, - ApplicationType: int32(config.ApplicationType), - AuthMethodType: int32(config.AuthMethodType), - PostLogoutRedirectUris: config.PostLogoutRedirectUris, - DevMode: config.DevMode, + ObjectRoot: config.ObjectRoot, + AppID: config.AppID, + Version: int32(config.OIDCVersion), + ClientID: config.ClientID, + ClientSecret: config.ClientSecret, + RedirectUris: config.RedirectUris, + ResponseTypes: responseTypes, + GrantTypes: grantTypes, + ApplicationType: int32(config.ApplicationType), + AuthMethodType: int32(config.AuthMethodType), + PostLogoutRedirectUris: config.PostLogoutRedirectUris, + DevMode: config.DevMode, + AccessTokenType: int32(config.AccessTokenType), + AccessTokenRoleAssertion: config.AccessTokenRoleAssertion, + IDTokenRoleAssertion: config.IDTokenRoleAssertion, } } @@ -89,18 +106,21 @@ func OIDCConfigToModel(config *OIDCConfig) *model.OIDCConfig { grantTypes[i] = model.OIDCGrantType(rt) } oidcConfig := &model.OIDCConfig{ - ObjectRoot: config.ObjectRoot, - AppID: config.AppID, - OIDCVersion: model.OIDCVersion(config.Version), - ClientID: config.ClientID, - ClientSecret: config.ClientSecret, - RedirectUris: config.RedirectUris, - ResponseTypes: responseTypes, - GrantTypes: grantTypes, - ApplicationType: model.OIDCApplicationType(config.ApplicationType), - AuthMethodType: model.OIDCAuthMethodType(config.AuthMethodType), - PostLogoutRedirectUris: config.PostLogoutRedirectUris, - DevMode: config.DevMode, + ObjectRoot: config.ObjectRoot, + AppID: config.AppID, + OIDCVersion: model.OIDCVersion(config.Version), + ClientID: config.ClientID, + ClientSecret: config.ClientSecret, + RedirectUris: config.RedirectUris, + ResponseTypes: responseTypes, + GrantTypes: grantTypes, + ApplicationType: model.OIDCApplicationType(config.ApplicationType), + AuthMethodType: model.OIDCAuthMethodType(config.AuthMethodType), + PostLogoutRedirectUris: config.PostLogoutRedirectUris, + DevMode: config.DevMode, + AccessTokenType: model.OIDCTokenType(config.AccessTokenType), + AccessTokenRoleAssertion: config.AccessTokenRoleAssertion, + IDTokenRoleAssertion: config.IDTokenRoleAssertion, } oidcConfig.FillCompliance() return oidcConfig diff --git a/internal/project/repository/eventsourcing/model/project.go b/internal/project/repository/eventsourcing/model/project.go index 0fd1dc98a4..c0f8d8e35a 100644 --- a/internal/project/repository/eventsourcing/model/project.go +++ b/internal/project/repository/eventsourcing/model/project.go @@ -2,7 +2,9 @@ package model import ( "encoding/json" + "github.com/caos/logging" + es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/project/model" ) @@ -13,12 +15,14 @@ const ( type Project struct { es_models.ObjectRoot - Name string `json:"name,omitempty"` - State int32 `json:"-"` - Members []*ProjectMember `json:"-"` - Roles []*ProjectRole `json:"-"` - Applications []*Application `json:"-"` - Grants []*ProjectGrant `json:"-"` + Name string `json:"name,omitempty"` + ProjectRoleAssertion bool `json:"projectRoleAssertion,omitempty"` + ProjectRoleCheck bool `json:"projectRoleCheck,omitempty"` + State int32 `json:"-"` + Members []*ProjectMember `json:"-"` + Roles []*ProjectRole `json:"-"` + Applications []*Application `json:"-"` + Grants []*ProjectGrant `json:"-"` } func GetProject(projects []*Project, id string) (int, *Project) { @@ -35,6 +39,12 @@ func (p *Project) Changes(changed *Project) map[string]interface{} { if changed.Name != "" && p.Name != changed.Name { changes["name"] = changed.Name } + if p.ProjectRoleAssertion != changed.ProjectRoleAssertion { + changes["projectRoleAssertion"] = changed.ProjectRoleAssertion + } + if p.ProjectRoleCheck != changed.ProjectRoleCheck { + changes["projectRoleCheck"] = changed.ProjectRoleCheck + } return changes } @@ -44,13 +54,15 @@ func ProjectFromModel(project *model.Project) *Project { apps := AppsFromModel(project.Applications) grants := GrantsFromModel(project.Grants) return &Project{ - ObjectRoot: project.ObjectRoot, - Name: project.Name, - State: int32(project.State), - Members: members, - Roles: roles, - Applications: apps, - Grants: grants, + ObjectRoot: project.ObjectRoot, + Name: project.Name, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, + State: int32(project.State), + Members: members, + Roles: roles, + Applications: apps, + Grants: grants, } } @@ -60,13 +72,15 @@ func ProjectToModel(project *Project) *model.Project { apps := AppsToModel(project.Applications) grants := GrantsToModel(project.Grants) return &model.Project{ - ObjectRoot: project.ObjectRoot, - Name: project.Name, - State: model.ProjectState(project.State), - Members: members, - Roles: roles, - Applications: apps, - Grants: grants, + ObjectRoot: project.ObjectRoot, + Name: project.Name, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, + State: model.ProjectState(project.State), + Members: members, + Roles: roles, + Applications: apps, + Grants: grants, } } diff --git a/internal/project/repository/view/application_view.go b/internal/project/repository/view/application_view.go index e871b690b8..414d7dfcf7 100644 --- a/internal/project/repository/view/application_view.go +++ b/internal/project/repository/view/application_view.go @@ -69,6 +69,15 @@ func PutApplication(db *gorm.DB, table string, app *model.ApplicationView) error return save(db, app) } +func PutApplications(db *gorm.DB, table string, apps ...*model.ApplicationView) error { + save := repository.PrepareBulkSave(table) + s := make([]interface{}, len(apps)) + for i, app := range apps { + s[i] = app + } + return save(db, s...) +} + func DeleteApplication(db *gorm.DB, table, appID string) error { delete := repository.PrepareDeleteByKey(table, model.ApplicationSearchKey(proj_model.AppSearchKeyAppID), appID) return delete(db) diff --git a/internal/project/repository/view/model/application.go b/internal/project/repository/view/model/application.go index c26acbd6ce..aa38c325fd 100644 --- a/internal/project/repository/view/model/application.go +++ b/internal/project/repository/view/model/application.go @@ -23,12 +23,14 @@ const ( ) type ApplicationView struct { - ID string `json:"appId" gorm:"column:id;primary_key"` - ProjectID string `json:"-" gorm:"column:project_id"` - Name string `json:"name" gorm:"column:app_name"` - CreationDate time.Time `json:"-" gorm:"column:creation_date"` - ChangeDate time.Time `json:"-" gorm:"column:change_date"` - State int32 `json:"-" gorm:"column:app_state"` + ID string `json:"appId" gorm:"column:id;primary_key"` + ProjectID string `json:"-" gorm:"column:project_id"` + Name string `json:"name" gorm:"column:app_name"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:app_state"` + ProjectRoleAssertion bool `json:"projectRoleAssertion" gorm:"column:project_role_assertion"` + ProjectRoleCheck bool `json:"projectRoleCheck" gorm:"column:project_role_check"` IsOIDC bool `json:"-" gorm:"column:is_oidc"` OIDCVersion int32 `json:"oidcVersion" gorm:"column:oidc_version"` @@ -43,58 +45,24 @@ type ApplicationView struct { ComplianceProblems pq.StringArray `json:"-" gorm:"column:compliance_problems"` DevMode bool `json:"devMode" gorm:"column:dev_mode"` OriginAllowList pq.StringArray `json:"-" gorm:"column:origin_allow_list"` + AccessTokenType int32 `json:"accessTokenType" gorm:"column:access_token_type"` + AccessTokenRoleAssertion bool `json:"accessTokenRoleAssertion" gorm:"column:access_token_role_assertion"` + IDTokenRoleAssertion bool `json:"idTokenRoleAssertion" gorm:"column:id_token_role_assertion"` Sequence uint64 `json:"-" gorm:"sequence"` } -func ApplicationViewFromModel(app *model.ApplicationView) *ApplicationView { - return &ApplicationView{ - ID: app.ID, - ProjectID: app.ProjectID, - Name: app.Name, - State: int32(app.State), - Sequence: app.Sequence, - CreationDate: app.CreationDate, - ChangeDate: app.ChangeDate, - - IsOIDC: app.IsOIDC, - OIDCClientID: app.OIDCClientID, - OIDCRedirectUris: app.OIDCRedirectUris, - OIDCResponseTypes: OIDCResponseTypesFromModel(app.OIDCResponseTypes), - OIDCGrantTypes: OIDCGrantTypesFromModel(app.OIDCGrantTypes), - OIDCApplicationType: int32(app.OIDCApplicationType), - OIDCAuthMethodType: int32(app.OIDCAuthMethodType), - OIDCPostLogoutRedirectUris: app.OIDCPostLogoutRedirectUris, - DevMode: app.DevMode, - OriginAllowList: app.OriginAllowList, - } -} - -func OIDCResponseTypesFromModel(oidctypes []model.OIDCResponseType) []int64 { - result := make([]int64, len(oidctypes)) - for i, t := range oidctypes { - result[i] = int64(t) - } - return result -} - -func OIDCGrantTypesFromModel(granttypes []model.OIDCGrantType) []int64 { - result := make([]int64, len(granttypes)) - for i, t := range granttypes { - result[i] = int64(t) - } - return result -} - func ApplicationViewToModel(app *ApplicationView) *model.ApplicationView { return &model.ApplicationView{ - ID: app.ID, - ProjectID: app.ProjectID, - Name: app.Name, - State: model.AppState(app.State), - Sequence: app.Sequence, - CreationDate: app.CreationDate, - ChangeDate: app.ChangeDate, + ID: app.ID, + ProjectID: app.ProjectID, + Name: app.Name, + State: model.AppState(app.State), + Sequence: app.Sequence, + CreationDate: app.CreationDate, + ChangeDate: app.ChangeDate, + ProjectRoleAssertion: app.ProjectRoleAssertion, + ProjectRoleCheck: app.ProjectRoleCheck, IsOIDC: app.IsOIDC, OIDCVersion: model.OIDCVersion(app.OIDCVersion), @@ -109,6 +77,9 @@ func ApplicationViewToModel(app *ApplicationView) *model.ApplicationView { ComplianceProblems: app.ComplianceProblems, DevMode: app.DevMode, OriginAllowList: app.OriginAllowList, + AccessTokenType: model.OIDCTokenType(app.AccessTokenType), + AccessTokenRoleAssertion: app.AccessTokenRoleAssertion, + IDTokenRoleAssertion: app.IDTokenRoleAssertion, } } @@ -152,6 +123,8 @@ func (a *ApplicationView) AppendEventIfMyApp(event *models.Event) (err error) { } case es_model.ApplicationRemoved: return view.SetData(event) + case es_model.ProjectChanged: + return a.AppendEvent(event) case es_model.ProjectRemoved: return a.AppendEvent(event) default: @@ -162,6 +135,7 @@ func (a *ApplicationView) AppendEventIfMyApp(event *models.Event) (err error) { } return nil } + func (a *ApplicationView) AppendEvent(event *models.Event) (err error) { a.Sequence = event.Sequence a.ChangeDate = event.CreationDate @@ -186,6 +160,8 @@ func (a *ApplicationView) AppendEvent(event *models.Event) (err error) { } a.setCompliance() return a.setOriginAllowList() + case es_model.ProjectChanged: + return a.SetData(event) case es_model.ApplicationDeactivated: a.State = int32(model.AppStateInactive) case es_model.ApplicationReactivated: diff --git a/internal/project/repository/view/model/project.go b/internal/project/repository/view/model/project.go index e496dd3349..1671adaaec 100644 --- a/internal/project/repository/view/model/project.go +++ b/internal/project/repository/view/model/project.go @@ -2,12 +2,14 @@ package model import ( "encoding/json" + "time" + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/project/model" es_model "github.com/caos/zitadel/internal/project/repository/eventsourcing/model" - "time" ) const ( @@ -17,36 +19,42 @@ const ( ) type ProjectView struct { - ProjectID string `json:"-" gorm:"column:project_id;primary_key"` - Name string `json:"name" gorm:"column:project_name"` - CreationDate time.Time `json:"-" gorm:"column:creation_date"` - ChangeDate time.Time `json:"-" gorm:"column:change_date"` - State int32 `json:"-" gorm:"column:project_state"` - ResourceOwner string `json:"-" gorm:"column:resource_owner"` - Sequence uint64 `json:"-" gorm:"column:sequence"` + ProjectID string `json:"-" gorm:"column:project_id;primary_key"` + Name string `json:"name" gorm:"column:project_name"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:project_state"` + ResourceOwner string `json:"-" gorm:"column:resource_owner"` + ProjectRoleAssertion bool `json:"projectRoleAssertion" gorm:"column:project_role_assertion"` + ProjectRoleCheck bool `json:"projectRoleCheck" gorm:"column:project_role_check"` + Sequence uint64 `json:"-" gorm:"column:sequence"` } func ProjectFromModel(project *model.ProjectView) *ProjectView { return &ProjectView{ - ProjectID: project.ProjectID, - Name: project.Name, - ChangeDate: project.ChangeDate, - CreationDate: project.CreationDate, - State: int32(project.State), - ResourceOwner: project.ResourceOwner, - Sequence: project.Sequence, + ProjectID: project.ProjectID, + Name: project.Name, + ChangeDate: project.ChangeDate, + CreationDate: project.CreationDate, + State: int32(project.State), + ResourceOwner: project.ResourceOwner, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, + Sequence: project.Sequence, } } func ProjectToModel(project *ProjectView) *model.ProjectView { return &model.ProjectView{ - ProjectID: project.ProjectID, - Name: project.Name, - ChangeDate: project.ChangeDate, - CreationDate: project.CreationDate, - State: model.ProjectState(project.State), - ResourceOwner: project.ResourceOwner, - Sequence: project.Sequence, + ProjectID: project.ProjectID, + Name: project.Name, + ChangeDate: project.ChangeDate, + CreationDate: project.CreationDate, + State: model.ProjectState(project.State), + ResourceOwner: project.ResourceOwner, + ProjectRoleAssertion: project.ProjectRoleAssertion, + ProjectRoleCheck: project.ProjectRoleCheck, + Sequence: project.Sequence, } } @@ -73,6 +81,8 @@ func (p *ProjectView) AppendEvent(event *models.Event) (err error) { p.State = int32(model.ProjectStateInactive) case es_model.ProjectReactivated: p.State = int32(model.ProjectStateActive) + case es_model.ProjectRemoved: + p.State = int32(model.ProjectStateRemoved) } return err } diff --git a/internal/setup/config.go b/internal/setup/config.go index b176d3bf3e..9c8f56056f 100644 --- a/internal/setup/config.go +++ b/internal/setup/config.go @@ -1,11 +1,47 @@ package setup +import ( + "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + type IAMSetUp struct { - GlobalOrg string - IAMProject string - DefaultLoginPolicy LoginPolicy - Orgs []Org - Owners []string + Step1 *Step1 + Step2 *Step2 + Step3 *Step3 + Step4 *Step4 + Step5 *Step5 + Step6 *Step6 +} + +func (setup *IAMSetUp) steps(currentDone iam_model.Step) ([]step, error) { + steps := make([]step, 0) + missingSteps := make([]iam_model.Step, 0) + + for _, step := range []step{ + setup.Step1, + setup.Step2, + setup.Step3, + setup.Step4, + setup.Step5, + setup.Step6, + } { + if step.step() <= currentDone { + continue + } + + if step.isNil() { + missingSteps = append(missingSteps, step.step()) + continue + } + steps = append(steps, step) + } + + if len(missingSteps) > 0 { + return nil, errors.ThrowPreconditionFailedf(nil, "SETUP-1nk49", "steps %v not configured", missingSteps) + } + + return steps, nil } type LoginPolicy struct { diff --git a/internal/setup/setup.go b/internal/setup/setup.go index a6e1a089e5..717cd0258f 100644 --- a/internal/setup/setup.go +++ b/internal/setup/setup.go @@ -7,22 +7,18 @@ import ( "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/errors" caos_errs "github.com/caos/zitadel/internal/errors" es_int "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/models" iam_model "github.com/caos/zitadel/internal/iam/model" es_iam "github.com/caos/zitadel/internal/iam/repository/eventsourcing" iam_event "github.com/caos/zitadel/internal/iam/repository/eventsourcing" - org_model "github.com/caos/zitadel/internal/org/model" es_org "github.com/caos/zitadel/internal/org/repository/eventsourcing" org_event "github.com/caos/zitadel/internal/org/repository/eventsourcing" - policy_model "github.com/caos/zitadel/internal/policy/model" - es_policy "github.com/caos/zitadel/internal/policy/repository/eventsourcing" - policy_event "github.com/caos/zitadel/internal/policy/repository/eventsourcing" proj_model "github.com/caos/zitadel/internal/project/model" es_proj "github.com/caos/zitadel/internal/project/repository/eventsourcing" proj_event "github.com/caos/zitadel/internal/project/repository/eventsourcing" - usr_model "github.com/caos/zitadel/internal/user/model" es_usr "github.com/caos/zitadel/internal/user/repository/eventsourcing" usr_event "github.com/caos/zitadel/internal/user/repository/eventsourcing" ) @@ -33,15 +29,6 @@ type Setup struct { OrgEvents *org_event.OrgEventstore UserEvents *usr_event.UserEventstore ProjectEvents *proj_event.ProjectEventstore - PolicyEvents *policy_event.PolicyEventstore -} - -type initializer struct { - *Setup - createdUsers map[string]*usr_model.User - createdOrgs map[string]*org_model.Org - createdProjects map[string]*proj_model.Project - pwComplexityPolicy *policy_model.PasswordComplexityPolicy } const ( @@ -96,320 +83,69 @@ func StartSetup(esConfig es_int.Config, sd systemdefaults.SystemDefaults) (*Setu return nil, err } - setup.PolicyEvents, err = es_policy.StartPolicy(es_policy.PolicyConfig{ - Eventstore: es, - Cache: esConfig.Cache, - }, sd) - if err != nil { - return nil, err - } return setup, nil } func (s *Setup) Execute(ctx context.Context, setUpConfig IAMSetUp) error { + logging.Log("SETUP-hwG32").Info("starting setup") + iam, err := s.IamEvents.IAMByID(ctx, s.iamID) if err != nil && !caos_errs.IsNotFound(err) { return err } - if iam != nil && (iam.SetUpStarted || iam.SetUpDone) { + if iam != nil && (iam.SetUpDone == iam_model.StepCount-1 || iam.SetUpStarted != iam.SetUpDone) { + logging.Log("SETUP-cWEsn").Info("all steps done") return nil } - logging.Log("SETUP-hwG32").Info("starting setup") - ctx = setSetUpContextData(ctx, s.iamID) - iam, err = s.IamEvents.StartSetup(ctx, s.iamID) - if err != nil { - return err + if iam == nil { + iam = &iam_model.IAM{ObjectRoot: models.ObjectRoot{AggregateID: s.iamID}} } - setUp := &initializer{ - Setup: s, - createdUsers: make(map[string]*usr_model.User), - createdOrgs: make(map[string]*org_model.Org), - createdProjects: make(map[string]*proj_model.Project), - } - - err = setUp.loginPolicy(ctx, setUpConfig.DefaultLoginPolicy) - if err != nil { - logging.Log("SETUP-Hdu8S").WithError(err).Error("unable to create login policy") - return err - } - - pwComplexityPolicy, err := s.PolicyEvents.GetPasswordComplexityPolicy(ctx, policy_model.DefaultPolicy) - if err != nil { - logging.Log("SETUP-9osWF").WithError(err).Error("unable to read complexity policy") - return err - } - setUp.pwComplexityPolicy = pwComplexityPolicy - - err = setUp.orgs(ctx, setUpConfig.Orgs) - if err != nil { - logging.Log("SETUP-p4oWq").WithError(err).Error("unable to set up orgs") + steps, err := setUpConfig.steps(iam.SetUpDone) + if err != nil || len(steps) == 0 { return err } ctx = setSetUpContextData(ctx, s.iamID) - err = setUp.iamOwners(ctx, setUpConfig.Owners) - if err != nil { - logging.Log("SETUP-WHr01").WithError(err).Error("unable to set up iam owners") - return err + + for _, step := range steps { + step.init(s) + if step.step() != iam.SetUpDone+1 { + logging.LogWithFields("SETUP-rxRM1", "step", step.step(), "previous", iam.SetUpDone).Warn("wrong step order") + return errors.ThrowPreconditionFailed(nil, "SETUP-wwAqO", "too few steps for this zitadel verison") + } + iam, err = s.IamEvents.StartSetup(ctx, s.iamID, step.step()) + if err != nil { + return err + } + + iam, err = step.execute(ctx) + if err != nil { + return err + } + + err = s.validateExecutedStep(ctx) + if err != nil { + return err + } } - err = setUp.setGlobalOrg(ctx, setUpConfig.GlobalOrg) - if err != nil { - logging.Log("SETUP-0874m").WithError(err).Error("unable to set global org") - return err - } - - err = setUp.setIamProject(ctx, setUpConfig.IAMProject) - if err != nil { - logging.Log("SETUP-kaWjq").WithError(err).Error("unable to set zitadel project") - return err - } - - iam, err = s.IamEvents.SetupDone(ctx, s.iamID) - if err != nil { - logging.Log("SETUP-de342").WithError(err).Error("unable to finish setup") - return err - } logging.Log("SETUP-ds31h").Info("setup done") return nil } -func (setUp *initializer) loginPolicy(ctx context.Context, policy LoginPolicy) error { - logging.Log("SETUP-4djul").Info("setting up login policy") - loginPolicy := &iam_model.LoginPolicy{ - ObjectRoot: models.ObjectRoot{ - AggregateID: setUp.iamID, - }, - AllowRegister: policy.AllowRegister, - AllowUsernamePassword: policy.AllowUsernamePassword, - AllowExternalIdp: policy.AllowExternalIdp, - } - _, err := setUp.IamEvents.AddLoginPolicy(ctx, loginPolicy) - return err -} - -func (setUp *initializer) orgs(ctx context.Context, orgs []Org) error { - logging.Log("SETUP-dsTh3").Info("setting up orgs") - for _, iamOrg := range orgs { - org, err := setUp.org(ctx, iamOrg) - if err != nil { - logging.LogWithFields("SETUP-IlLif", "Org", iamOrg.Name).WithError(err).Error("unable to create org") - return err - } - setUp.createdOrgs[iamOrg.Name] = org - - var policy *org_model.OrgIAMPolicy - if iamOrg.OrgIamPolicy { - policy, err = setUp.iamorgpolicy(ctx, org) - if err != nil { - logging.LogWithFields("SETUP-IlLif", "Org IAM Policy", iamOrg.Name).WithError(err).Error("unable to create iam org policy") - return err - } - } else { - policy, err = setUp.OrgEvents.GetOrgIAMPolicy(ctx, policy_model.DefaultPolicy) - if err != nil { - logging.LogWithFields("SETUP-IS8wS", "Org IAM Policy", iamOrg.Name).WithError(err).Error("unable to get default iam org policy") - return err - } - } - - ctx = setSetUpContextData(ctx, org.AggregateID) - err = setUp.users(ctx, iamOrg.Users, policy) - if err != nil { - logging.LogWithFields("SETUP-8zfwz", "Org", iamOrg.Name).WithError(err).Error("unable to set up org users") - return err - } - - err = setUp.orgOwners(ctx, org, iamOrg.Owners) - if err != nil { - logging.LogWithFields("SETUP-0874m", "Org", iamOrg.Name).WithError(err).Error("unable to set up org owners") - return err - } - - err = setUp.projects(ctx, iamOrg.Projects, setUp.createdUsers[iamOrg.Owners[0]].AggregateID) - if err != nil { - logging.LogWithFields("SETUP-wUzqY", "Org", iamOrg.Name).WithError(err).Error("unable to set up org projects") - return err - } - } - logging.Log("SETUP-dgjT4").Info("orgs set up") - return nil -} - -func (setUp *initializer) org(ctx context.Context, org Org) (*org_model.Org, error) { - ctx = setSetUpContextData(ctx, "") - createOrg := &org_model.Org{ - Name: org.Name, - Domains: []*org_model.OrgDomain{{Domain: org.Domain}}, - } - return setUp.OrgEvents.CreateOrg(ctx, createOrg, nil) -} - -func (setUp *initializer) iamorgpolicy(ctx context.Context, org *org_model.Org) (*org_model.OrgIAMPolicy, error) { - ctx = setSetUpContextData(ctx, org.AggregateID) - policy := &org_model.OrgIAMPolicy{ - ObjectRoot: models.ObjectRoot{AggregateID: org.AggregateID}, - UserLoginMustBeDomain: false, - } - return setUp.OrgEvents.AddOrgIAMPolicy(ctx, policy) -} - -func (setUp *initializer) iamOwners(ctx context.Context, owners []string) error { - logging.Log("SETUP-dtxfj").Info("setting iam owners") - for _, iamOwner := range owners { - user, ok := setUp.createdUsers[iamOwner] - if !ok { - logging.LogWithFields("SETUP-8siew", "Owner", iamOwner).Error("unable to add user to iam members") - return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-su6L3", "unable to add user to iam members") - } - _, err := setUp.IamEvents.AddIAMMember(ctx, &iam_model.IAMMember{ObjectRoot: models.ObjectRoot{AggregateID: setUp.iamID}, UserID: user.AggregateID, Roles: []string{"IAM_OWNER"}}) - if err != nil { - logging.Log("SETUP-LM7rI").WithError(err).Error("unable to add iam administrator to iam members as owner") - return err - } - } - logging.Log("SETUP-fg5aq").Info("iam owners set") - return nil -} - -func (setUp *initializer) setGlobalOrg(ctx context.Context, globalOrgName string) error { - logging.Log("SETUP-dsj75").Info("setting global org") - globalOrg, ok := setUp.createdOrgs[globalOrgName] - if !ok { - logging.LogWithFields("SETUP-FBhs9", "GlobalOrg", globalOrgName).Error("global org not created") - return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-4GwU7", "global org not created: %v", globalOrgName) - } - - if _, err := setUp.IamEvents.SetGlobalOrg(ctx, setUp.iamID, globalOrg.AggregateID); err != nil { - logging.Log("SETUP-uGMA3").WithError(err).Error("unable to set global org on iam") +func (s *Setup) validateExecutedStep(ctx context.Context) error { + iam, err := s.IamEvents.IAMByID(ctx, s.iamID) + if err != nil { return err } - logging.Log("SETUP-d32h1").Info("global org set") - return nil -} - -func (setUp *initializer) setIamProject(ctx context.Context, iamProjectName string) error { - logging.Log("SETUP-HE3qa").Info("setting iam project") - iamProject, ok := setUp.createdProjects[iamProjectName] - if !ok { - logging.LogWithFields("SETUP-SJFWP", "IAM Project", iamProjectName).Error("iam project created") - return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-sGmQt", "iam project not created: %v", iamProjectName) - } - - if _, err := setUp.IamEvents.SetIAMProject(ctx, setUp.iamID, iamProject.AggregateID); err != nil { - logging.Log("SETUP-i1pNh").WithError(err).Error("unable to set iam project on iam") - return err - } - logging.Log("SETUP-d7WEU").Info("iam project set") - return nil -} - -func (setUp *initializer) users(ctx context.Context, users []User, orgPolicy *org_model.OrgIAMPolicy) error { - for _, user := range users { - created, err := setUp.user(ctx, user, orgPolicy) - if err != nil { - logging.LogWithFields("SETUP-9soer", "Email", user.Email).WithError(err).Error("unable to create iam user") - return err - } - setUp.createdUsers[user.Email] = created + if iam.SetUpStarted != iam.SetUpDone { + return errors.ThrowInternal(nil, "SETUP-QeukK", "started step is not equal to done") } return nil } -func (setUp *initializer) user(ctx context.Context, user User, orgPolicy *org_model.OrgIAMPolicy) (*usr_model.User, error) { - createUser := &usr_model.User{ - UserName: user.UserName, - Human: &usr_model.Human{ - Profile: &usr_model.Profile{ - FirstName: user.FirstName, - LastName: user.LastName, - }, - Email: &usr_model.Email{ - EmailAddress: user.Email, - IsEmailVerified: true, - }, - Password: &usr_model.Password{ - SecretString: user.Password, - }, - }, - } - return setUp.UserEvents.CreateUser(ctx, createUser, setUp.pwComplexityPolicy, orgPolicy) -} - -func (setUp *initializer) orgOwners(ctx context.Context, org *org_model.Org, owners []string) error { - for _, orgOwner := range owners { - user, ok := setUp.createdUsers[orgOwner] - if !ok { - logging.LogWithFields("SETUP-s9ilr", "Owner", orgOwner).Error("unable to add user to org members") - return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-s0prs", "unable to add user to org members: %v", orgOwner) - } - err := setUp.orgOwner(ctx, org, user) - if err != nil { - logging.Log("SETUP-s90oe").WithError(err).Error("unable to add global org admin to members of global org") - return err - } - } - return nil -} - -func (setUp *initializer) orgOwner(ctx context.Context, org *org_model.Org, user *usr_model.User) error { - addMember := &org_model.OrgMember{ - ObjectRoot: models.ObjectRoot{AggregateID: org.AggregateID}, - UserID: user.AggregateID, - Roles: []string{OrgOwnerRole}, - } - _, err := setUp.OrgEvents.AddOrgMember(ctx, addMember) - return err -} - -func (setUp *initializer) projects(ctx context.Context, projects []Project, ownerID string) error { - ctxData := authz.GetCtxData(ctx) - ctxData.UserID = ownerID - projectCtx := authz.SetCtxData(ctx, ctxData) - - for _, project := range projects { - createdProject, err := setUp.project(projectCtx, project) - if err != nil { - return err - } - setUp.createdProjects[createdProject.Name] = createdProject - for _, oidc := range project.OIDCApps { - app, err := setUp.oidcApp(ctx, createdProject, oidc) - if err != nil { - return err - } - logging.LogWithFields("SETUP-asd32f", "name", app.Name, "clientID", app.OIDCConfig.ClientID).Info("created OIDC application") - } - } - return nil -} - -func (setUp *initializer) project(ctx context.Context, project Project) (*proj_model.Project, error) { - addProject := &proj_model.Project{ - Name: project.Name, - } - return setUp.ProjectEvents.CreateProject(ctx, addProject, false) -} - -func (setUp *initializer) oidcApp(ctx context.Context, project *proj_model.Project, oidc OIDCApp) (*proj_model.Application, error) { - addOIDCApp := &proj_model.Application{ - ObjectRoot: models.ObjectRoot{AggregateID: project.AggregateID}, - Name: oidc.Name, - OIDCConfig: &proj_model.OIDCConfig{ - RedirectUris: oidc.RedirectUris, - ResponseTypes: getOIDCResponseTypes(oidc.ResponseTypes), - GrantTypes: getOIDCGrantTypes(oidc.GrantTypes), - ApplicationType: getOIDCApplicationType(oidc.ApplicationType), - AuthMethodType: getOIDCAuthMethod(oidc.AuthMethodType), - PostLogoutRedirectUris: oidc.PostLogoutRedirectUris, - DevMode: oidc.DevMode, - }, - } - return setUp.ProjectEvents.AddApplication(ctx, addOIDCApp) -} - func getOIDCResponseTypes(responseTypes []string) []proj_model.OIDCResponseType { types := make([]proj_model.OIDCResponseType, len(responseTypes)) for i, t := range responseTypes { diff --git a/internal/setup/step.go b/internal/setup/step.go new file mode 100644 index 0000000000..f9e497058f --- /dev/null +++ b/internal/setup/step.go @@ -0,0 +1,14 @@ +package setup + +import ( + "context" + + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type step interface { + step() iam_model.Step + execute(context.Context) (*iam_model.IAM, error) + init(*Setup) + isNil() bool +} diff --git a/internal/setup/step1.go b/internal/setup/step1.go new file mode 100644 index 0000000000..a745a1a3e4 --- /dev/null +++ b/internal/setup/step1.go @@ -0,0 +1,324 @@ +package setup + +import ( + "context" + + "github.com/caos/logging" + "github.com/caos/zitadel/internal/api/authz" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + iam_model "github.com/caos/zitadel/internal/iam/model" + org_model "github.com/caos/zitadel/internal/org/model" + proj_model "github.com/caos/zitadel/internal/project/model" + usr_model "github.com/caos/zitadel/internal/user/model" +) + +type Step1 struct { + GlobalOrg string + IAMProject string + DefaultLoginPolicy LoginPolicy + Orgs []Org + Owners []string + + setup *Setup + createdUsers map[string]*usr_model.User + createdOrgs map[string]*org_model.Org + createdProjects map[string]*proj_model.Project + pwComplexityPolicy *iam_model.PasswordComplexityPolicyView +} + +func (s *Step1) isNil() bool { + return s == nil +} + +func (step *Step1) step() iam_model.Step { + return iam_model.Step1 +} + +func (step *Step1) init(setup *Setup) { + step.setup = setup + step.createdUsers = make(map[string]*usr_model.User) + step.createdOrgs = make(map[string]*org_model.Org) + step.createdProjects = make(map[string]*proj_model.Project) +} + +func (step *Step1) execute(ctx context.Context) (*iam_model.IAM, error) { + err := step.loginPolicy(ctx, step.DefaultLoginPolicy) + if err != nil { + logging.Log("SETUP-Hdu8S").WithError(err).Error("unable to create login policy") + return nil, err + } + + step.pwComplexityPolicy = new(iam_model.PasswordComplexityPolicyView) + + err = step.orgs(ctx, step.Orgs) + if err != nil { + logging.Log("SETUP-p4oWq").WithError(err).Error("unable to set up orgs") + return nil, err + } + + ctx = setSetUpContextData(ctx, step.setup.iamID) + err = step.iamOwners(ctx, step.Owners) + if err != nil { + logging.Log("SETUP-WHr01").WithError(err).Error("unable to set up iam owners") + return nil, err + } + + err = step.setGlobalOrg(ctx, step.GlobalOrg) + if err != nil { + logging.Log("SETUP-0874m").WithError(err).Error("unable to set global org") + return nil, err + } + + err = step.setIamProject(ctx, step.IAMProject) + if err != nil { + logging.Log("SETUP-kaWjq").WithError(err).Error("unable to set zitadel project") + return nil, err + } + + iam, err := step.setup.IamEvents.SetupDone(ctx, step.setup.iamID, step.step()) + if err != nil { + logging.Log("SETUP-de342").WithField("step", step.step()).WithError(err).Error("unable to finish setup") + return nil, err + } + return iam, nil +} + +func (step *Step1) loginPolicy(ctx context.Context, policy LoginPolicy) error { + logging.Log("SETUP-4djul").Info("setting up login policy") + loginPolicy := &iam_model.LoginPolicy{ + ObjectRoot: models.ObjectRoot{ + AggregateID: step.setup.iamID, + }, + AllowRegister: policy.AllowRegister, + AllowUsernamePassword: policy.AllowUsernamePassword, + AllowExternalIdp: policy.AllowExternalIdp, + } + _, err := step.setup.IamEvents.AddLoginPolicy(ctx, loginPolicy) + return err +} + +func (step *Step1) orgs(ctx context.Context, orgs []Org) error { + logging.Log("SETUP-dsTh3").Info("setting up orgs") + for _, iamOrg := range orgs { + org, err := step.org(ctx, iamOrg) + if err != nil { + logging.LogWithFields("SETUP-IlLif", "Org", iamOrg.Name).WithError(err).Error("unable to create org") + return err + } + step.createdOrgs[iamOrg.Name] = org + + var policy *iam_model.OrgIAMPolicyView + if iamOrg.OrgIamPolicy { + policy, err = step.iamorgpolicy(ctx, org) + if err != nil { + logging.LogWithFields("SETUP-IlLif", "Org IAM Policy", iamOrg.Name).WithError(err).Error("unable to create iam org policy") + return err + } + } else { + policy = &iam_model.OrgIAMPolicyView{ + UserLoginMustBeDomain: true, + } + } + + ctx = setSetUpContextData(ctx, org.AggregateID) + err = step.users(ctx, iamOrg.Users, policy) + if err != nil { + logging.LogWithFields("SETUP-8zfwz", "Org", iamOrg.Name).WithError(err).Error("unable to set up org users") + return err + } + + err = step.orgOwners(ctx, org, iamOrg.Owners) + if err != nil { + logging.LogWithFields("SETUP-0874m", "Org", iamOrg.Name).WithError(err).Error("unable to set up org owners") + return err + } + + err = step.projects(ctx, iamOrg.Projects, step.createdUsers[iamOrg.Owners[0]].AggregateID) + if err != nil { + logging.LogWithFields("SETUP-wUzqY", "Org", iamOrg.Name).WithError(err).Error("unable to set up org projects") + return err + } + } + logging.Log("SETUP-dgjT4").Info("orgs set up") + return nil +} + +func (step *Step1) org(ctx context.Context, org Org) (*org_model.Org, error) { + ctx = setSetUpContextData(ctx, "") + createOrg := &org_model.Org{ + Name: org.Name, + Domains: []*org_model.OrgDomain{{Domain: org.Domain}}, + } + return step.setup.OrgEvents.CreateOrg(ctx, createOrg, nil) +} + +func (step *Step1) iamorgpolicy(ctx context.Context, org *org_model.Org) (*iam_model.OrgIAMPolicyView, error) { + ctx = setSetUpContextData(ctx, org.AggregateID) + policy := &iam_model.OrgIAMPolicy{ + ObjectRoot: models.ObjectRoot{AggregateID: org.AggregateID}, + UserLoginMustBeDomain: false, + } + createdpolicy, err := step.setup.OrgEvents.AddOrgIAMPolicy(ctx, policy) + if err != nil { + return nil, err + } + return &iam_model.OrgIAMPolicyView{ + AggregateID: org.AggregateID, + UserLoginMustBeDomain: createdpolicy.UserLoginMustBeDomain, + }, nil +} + +func (step *Step1) iamOwners(ctx context.Context, owners []string) error { + logging.Log("SETUP-dtxfj").Info("setting iam owners") + for _, iamOwner := range owners { + user, ok := step.createdUsers[iamOwner] + if !ok { + logging.LogWithFields("SETUP-8siew", "Owner", iamOwner).Error("unable to add user to iam members") + return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-su6L3", "unable to add user to iam members") + } + _, err := step.setup.IamEvents.AddIAMMember(ctx, &iam_model.IAMMember{ObjectRoot: models.ObjectRoot{AggregateID: step.setup.iamID}, UserID: user.AggregateID, Roles: []string{"IAM_OWNER"}}) + if err != nil { + logging.Log("SETUP-LM7rI").WithError(err).Error("unable to add iam administrator to iam members as owner") + return err + } + } + logging.Log("SETUP-fg5aq").Info("iam owners set") + return nil +} + +func (step *Step1) setGlobalOrg(ctx context.Context, globalOrgName string) error { + logging.Log("SETUP-dsj75").Info("setting global org") + globalOrg, ok := step.createdOrgs[globalOrgName] + if !ok { + logging.LogWithFields("SETUP-FBhs9", "GlobalOrg", globalOrgName).Error("global org not created") + return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-4GwU7", "global org not created: %v", globalOrgName) + } + + if _, err := step.setup.IamEvents.SetGlobalOrg(ctx, step.setup.iamID, globalOrg.AggregateID); err != nil { + logging.Log("SETUP-uGMA3").WithError(err).Error("unable to set global org on iam") + return err + } + logging.Log("SETUP-d32h1").Info("global org set") + return nil +} + +func (step *Step1) setIamProject(ctx context.Context, iamProjectName string) error { + logging.Log("SETUP-HE3qa").Info("setting iam project") + iamProject, ok := step.createdProjects[iamProjectName] + if !ok { + logging.LogWithFields("SETUP-SJFWP", "IAM Project", iamProjectName).Error("iam project created") + return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-sGmQt", "iam project not created: %v", iamProjectName) + } + + if _, err := step.setup.IamEvents.SetIAMProject(ctx, step.setup.iamID, iamProject.AggregateID); err != nil { + logging.Log("SETUP-i1pNh").WithError(err).Error("unable to set iam project on iam") + return err + } + logging.Log("SETUP-d7WEU").Info("iam project set") + return nil +} + +func (step *Step1) users(ctx context.Context, users []User, orgPolicy *iam_model.OrgIAMPolicyView) error { + for _, user := range users { + created, err := step.user(ctx, user, orgPolicy) + if err != nil { + logging.LogWithFields("SETUP-9soer", "Email", user.Email).WithError(err).Error("unable to create iam user") + return err + } + step.createdUsers[user.Email] = created + } + return nil +} + +func (step *Step1) user(ctx context.Context, user User, orgPolicy *iam_model.OrgIAMPolicyView) (*usr_model.User, error) { + createUser := &usr_model.User{ + UserName: user.UserName, + Human: &usr_model.Human{ + Profile: &usr_model.Profile{ + FirstName: user.FirstName, + LastName: user.LastName, + }, + Email: &usr_model.Email{ + EmailAddress: user.Email, + IsEmailVerified: true, + }, + Password: &usr_model.Password{ + SecretString: user.Password, + }, + }, + } + return step.setup.UserEvents.CreateUser(ctx, createUser, step.pwComplexityPolicy, orgPolicy) +} + +func (step *Step1) orgOwners(ctx context.Context, org *org_model.Org, owners []string) error { + for _, orgOwner := range owners { + user, ok := step.createdUsers[orgOwner] + if !ok { + logging.LogWithFields("SETUP-s9ilr", "Owner", orgOwner).Error("unable to add user to org members") + return caos_errs.ThrowPreconditionFailedf(nil, "SETUP-s0prs", "unable to add user to org members: %v", orgOwner) + } + err := step.orgOwner(ctx, org, user) + if err != nil { + logging.Log("SETUP-s90oe").WithError(err).Error("unable to add global org admin to members of global org") + return err + } + } + return nil +} + +func (step *Step1) orgOwner(ctx context.Context, org *org_model.Org, user *usr_model.User) error { + addMember := &org_model.OrgMember{ + ObjectRoot: models.ObjectRoot{AggregateID: org.AggregateID}, + UserID: user.AggregateID, + Roles: []string{OrgOwnerRole}, + } + _, err := step.setup.OrgEvents.AddOrgMember(ctx, addMember) + return err +} + +func (step *Step1) projects(ctx context.Context, projects []Project, ownerID string) error { + ctxData := authz.GetCtxData(ctx) + ctxData.UserID = ownerID + projectCtx := authz.SetCtxData(ctx, ctxData) + + for _, project := range projects { + createdProject, err := step.project(projectCtx, project) + if err != nil { + return err + } + step.createdProjects[createdProject.Name] = createdProject + for _, oidc := range project.OIDCApps { + app, err := step.oidcApp(ctx, createdProject, oidc) + if err != nil { + return err + } + logging.LogWithFields("SETUP-asd32f", "name", app.Name, "clientID", app.OIDCConfig.ClientID).Info("created OIDC application") + } + } + return nil +} + +func (step *Step1) project(ctx context.Context, project Project) (*proj_model.Project, error) { + addProject := &proj_model.Project{ + Name: project.Name, + } + return step.setup.ProjectEvents.CreateProject(ctx, addProject, false) +} + +func (step *Step1) oidcApp(ctx context.Context, project *proj_model.Project, oidc OIDCApp) (*proj_model.Application, error) { + addOIDCApp := &proj_model.Application{ + ObjectRoot: models.ObjectRoot{AggregateID: project.AggregateID}, + Name: oidc.Name, + OIDCConfig: &proj_model.OIDCConfig{ + RedirectUris: oidc.RedirectUris, + ResponseTypes: getOIDCResponseTypes(oidc.ResponseTypes), + GrantTypes: getOIDCGrantTypes(oidc.GrantTypes), + ApplicationType: getOIDCApplicationType(oidc.ApplicationType), + AuthMethodType: getOIDCAuthMethod(oidc.AuthMethodType), + PostLogoutRedirectUris: oidc.PostLogoutRedirectUris, + DevMode: oidc.DevMode, + }, + } + return step.setup.ProjectEvents.AddApplication(ctx, addOIDCApp) +} diff --git a/internal/setup/step2.go b/internal/setup/step2.go new file mode 100644 index 0000000000..6517b35c84 --- /dev/null +++ b/internal/setup/step2.go @@ -0,0 +1,57 @@ +package setup + +import ( + "context" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore/models" + es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +type Step2 struct { + DefaultPasswordComplexityPolicy iam_model.PasswordComplexityPolicy + + setup *Setup +} + +func (s *Step2) isNil() bool { + return s == nil +} + +func (step *Step2) step() iam_model.Step { + return iam_model.Step2 +} + +func (step *Step2) init(setup *Setup) { + step.setup = setup +} + +func (step *Step2) execute(ctx context.Context) (*iam_model.IAM, error) { + iam, agg, err := step.passwordComplexityPolicy(ctx, &step.DefaultPasswordComplexityPolicy) + if err != nil { + logging.Log("SETUP-Ms9fl").WithField("step", step.step()).WithError(err).Error("unable to finish setup (pw complexity policy)") + return nil, err + } + iam, agg, push, err := step.setup.IamEvents.PrepareSetupDone(ctx, iam, agg, step.step()) + if err != nil { + logging.Log("SETUP-V8sui").WithField("step", step.step()).WithError(err).Error("unable to finish setup (prepare setup done)") + return nil, err + } + err = es_sdk.PushAggregates(ctx, push, iam.AppendEvents, agg) + if err != nil { + logging.Log("SETUP-V8sui").WithField("step", step.step()).WithError(err).Error("unable to finish setup") + return nil, err + } + return iam_es_model.IAMToModel(iam), nil +} + +func (step *Step2) passwordComplexityPolicy(ctx context.Context, policy *iam_model.PasswordComplexityPolicy) (*iam_es_model.IAM, *models.Aggregate, error) { + logging.Log("SETUP-Bs8id").Info("setting up password complexity policy") + policy.AggregateID = step.setup.iamID + iam, aggregate, err := step.setup.IamEvents.PrepareAddPasswordComplexityPolicy(ctx, policy) + if err != nil { + return nil, nil, err + } + return iam, aggregate, nil +} diff --git a/internal/setup/step3.go b/internal/setup/step3.go new file mode 100644 index 0000000000..1ebfd9a0e6 --- /dev/null +++ b/internal/setup/step3.go @@ -0,0 +1,57 @@ +package setup + +import ( + "context" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore/models" + es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +type Step3 struct { + DefaultPasswordAgePolicy iam_model.PasswordAgePolicy + + setup *Setup +} + +func (s *Step3) isNil() bool { + return s == nil +} + +func (step *Step3) step() iam_model.Step { + return iam_model.Step3 +} + +func (step *Step3) init(setup *Setup) { + step.setup = setup +} + +func (step *Step3) execute(ctx context.Context) (*iam_model.IAM, error) { + iam, agg, err := step.passwordAgePolicy(ctx, &step.DefaultPasswordAgePolicy) + if err != nil { + logging.Log("SETUP-Mski9").WithField("step", step.step()).WithError(err).Error("unable to finish setup (pw age policy)") + return nil, err + } + iam, agg, push, err := step.setup.IamEvents.PrepareSetupDone(ctx, iam, agg, step.step()) + if err != nil { + logging.Log("SETUP-4Gsny").WithField("step", step.step()).WithError(err).Error("unable to finish setup (prepare setup done)") + return nil, err + } + err = es_sdk.PushAggregates(ctx, push, iam.AppendEvents, agg) + if err != nil { + logging.Log("SETUP-Yc8ui").WithField("step", step.step()).WithError(err).Error("unable to finish setup") + return nil, err + } + return iam_es_model.IAMToModel(iam), nil +} + +func (step *Step3) passwordAgePolicy(ctx context.Context, policy *iam_model.PasswordAgePolicy) (*iam_es_model.IAM, *models.Aggregate, error) { + logging.Log("SETUP-bVs8i").Info("setting up password complexity policy") + policy.AggregateID = step.setup.iamID + iam, aggregate, err := step.setup.IamEvents.PrepareAddPasswordAgePolicy(ctx, policy) + if err != nil { + return nil, nil, err + } + return iam, aggregate, nil +} diff --git a/internal/setup/step4.go b/internal/setup/step4.go new file mode 100644 index 0000000000..fa50bc1511 --- /dev/null +++ b/internal/setup/step4.go @@ -0,0 +1,57 @@ +package setup + +import ( + "context" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore/models" + es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +type Step4 struct { + DefaultPasswordLockoutPolicy iam_model.PasswordLockoutPolicy + + setup *Setup +} + +func (s *Step4) isNil() bool { + return s == nil +} + +func (step *Step4) step() iam_model.Step { + return iam_model.Step4 +} + +func (step *Step4) init(setup *Setup) { + step.setup = setup +} + +func (step *Step4) execute(ctx context.Context) (*iam_model.IAM, error) { + iam, agg, err := step.passwordLockoutPolicy(ctx, &step.DefaultPasswordLockoutPolicy) + if err != nil { + logging.Log("SETUP-xCd9i").WithField("step", step.step()).WithError(err).Error("unable to finish setup (pw age policy)") + return nil, err + } + iam, agg, push, err := step.setup.IamEvents.PrepareSetupDone(ctx, iam, agg, step.step()) + if err != nil { + logging.Log("SETUP-bVsm9").WithField("step", step.step()).WithError(err).Error("unable to finish setup (prepare setup done)") + return nil, err + } + err = es_sdk.PushAggregates(ctx, push, iam.AppendEvents, agg) + if err != nil { + logging.Log("SETUP-wCxko").WithField("step", step.step()).WithError(err).Error("unable to finish setup") + return nil, err + } + return iam_es_model.IAMToModel(iam), nil +} + +func (step *Step4) passwordLockoutPolicy(ctx context.Context, policy *iam_model.PasswordLockoutPolicy) (*iam_es_model.IAM, *models.Aggregate, error) { + logging.Log("SETUP-vSfr4").Info("setting up password complexity policy") + policy.AggregateID = step.setup.iamID + iam, aggregate, err := step.setup.IamEvents.PrepareAddPasswordLockoutPolicy(ctx, policy) + if err != nil { + return nil, nil, err + } + return iam, aggregate, nil +} diff --git a/internal/setup/step5.go b/internal/setup/step5.go new file mode 100644 index 0000000000..d45f9a11fd --- /dev/null +++ b/internal/setup/step5.go @@ -0,0 +1,57 @@ +package setup + +import ( + "context" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore/models" + es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +type Step5 struct { + DefaultOrgIAMPolicy iam_model.OrgIAMPolicy + + setup *Setup +} + +func (s *Step5) isNil() bool { + return s == nil +} + +func (step *Step5) step() iam_model.Step { + return iam_model.Step5 +} + +func (step *Step5) init(setup *Setup) { + step.setup = setup +} + +func (step *Step5) execute(ctx context.Context) (*iam_model.IAM, error) { + iam, agg, err := step.orgIAMPolicy(ctx, &step.DefaultOrgIAMPolicy) + if err != nil { + logging.Log("SETUP-3nKd9").WithField("step", step.step()).WithError(err).Error("unable to finish setup (org iam policy)") + return nil, err + } + iam, agg, push, err := step.setup.IamEvents.PrepareSetupDone(ctx, iam, agg, step.step()) + if err != nil { + logging.Log("SETUP-5h8Ds").WithField("step", step.step()).WithError(err).Error("unable to finish setup (prepare setup done)") + return nil, err + } + err = es_sdk.PushAggregates(ctx, push, iam.AppendEvents, agg) + if err != nil { + logging.Log("SETUP-3fGk0").WithField("step", step.step()).WithError(err).Error("unable to finish setup") + return nil, err + } + return iam_es_model.IAMToModel(iam), nil +} + +func (step *Step5) orgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_es_model.IAM, *models.Aggregate, error) { + logging.Log("SETUP-5Gn8s").Info("setting up org iam policy") + policy.AggregateID = step.setup.iamID + iam, aggregate, err := step.setup.IamEvents.PrepareAddOrgIAMPolicy(ctx, policy) + if err != nil { + return nil, nil, err + } + return iam, aggregate, nil +} diff --git a/internal/setup/step6.go b/internal/setup/step6.go new file mode 100644 index 0000000000..57d46ee31b --- /dev/null +++ b/internal/setup/step6.go @@ -0,0 +1,58 @@ +package setup + +import ( + "context" + + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore/models" + es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" + iam_model "github.com/caos/zitadel/internal/iam/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +type Step6 struct { + DefaultLabelPolicy iam_model.LabelPolicy + + setup *Setup +} + +func (s *Step6) isNil() bool { + return s == nil +} + +func (step *Step6) step() iam_model.Step { + return iam_model.Step6 +} + +func (step *Step6) init(setup *Setup) { + step.setup = setup +} + +func (step *Step6) execute(ctx context.Context) (*iam_model.IAM, error) { + iam, agg, err := step.labelPolicy(ctx, &step.DefaultLabelPolicy) + if err != nil { + logging.Log("SETUP-ZTuS1").WithField("step", step.step()).WithError(err).Error("unable to finish setup (Label policy)") + return nil, err + } + iam, agg, push, err := step.setup.IamEvents.PrepareSetupDone(ctx, iam, agg, step.step()) + if err != nil { + logging.Log("SETUP-OkF8o").WithField("step", step.step()).WithError(err).Error("unable to finish setup (prepare setup done)") + return nil, err + } + err = es_sdk.PushAggregates(ctx, push, iam.AppendEvents, agg) + if err != nil { + logging.Log("SETUP-YbQ6T").WithField("step", step.step()).WithError(err).Error("unable to finish setup") + return nil, err + } + return iam_es_model.IAMToModel(iam), nil +} + +func (step *Step6) labelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_es_model.IAM, *models.Aggregate, error) { + logging.Log("SETUP-geMuZ").Info("setting up labelpolicy") + policy.AggregateID = step.setup.iamID + iam, aggregate, err := step.setup.IamEvents.PrepareAddLabelPolicy(ctx, policy) + if err != nil { + return nil, nil, err + } + return iam, aggregate, nil +} diff --git a/internal/static/i18n/de.yaml b/internal/static/i18n/de.yaml index 8674ee145d..542d03ea1b 100644 --- a/internal/static/i18n/de.yaml +++ b/internal/static/i18n/de.yaml @@ -83,12 +83,30 @@ Errors: IdpNotExisting: IDP Konfiguration existiert nicht OIDCConfigInvalid: OIDC IDP Konfiguration ist ungültig IdpIsNotOIDC: IDP Konfiguration ist nicht vom Typ OIDC + IDP: + InvalidSearchQuery: Ungültiger Suchparameter LoginPolicy: Invalid: Login Policy ist ungültig NotExisting: Login Policy existiert nicht auf dieser Organisation AlreadyExists: Login Policy existiert bereits IdpProviderAlreadyExisting: Idp Provider existiert bereits IdpProviderNotExisting: Idp Provider existiert nicht + PasswordComplexity: + Empty: Passwort Komplexitäts Policy ist leer + NotExisting: Passwort Komplexitäts Policy existiert nicht + AlreadyExists: Passwort Komplexitäts Policy existiert bereits + PasswordLockout: + Empty: Passwort Lockout Policy ist leer + NotExisting: Passwort Lockout Policy existiert nicht + AlreadyExists: Passwort Lockout Policy existiert bereits + PasswordAge: + Empty: Passwort Age Policy ist leer + NotExisting: Passwort Age Policy existiert nicht + AlreadyExists: Passwort Age Policy existiert bereits + OrgIAM: + Empty: Org IAM Policy ist leer + NotExisting: Org IAM Policy existiert nicht + AlreadyExists: Org IAM Policy existiert bereits Project: ProjectIDMissing: Project Id fehlt AlreadyExists: Project existiert bereits auf der Organisation @@ -141,6 +159,22 @@ Errors: AlreadyExists: Default Login Policy existiert bereits IdpProviderAlreadyExisting: Idp Provider existiert bereits IdpProviderNotExisting: Idp Provider existiert nicht + PasswordComplexityPolicy: + NotExisting: Default Password Complexity Policy existiert nicht + AlreadyExists: Default Password Complexity Policy existiert bereits + Empty: Default Password Complexity Policy leer + PasswordAgePolicy: + NotExisting: Default Password Age Policy existiert nicht + AlreadyExists: Default Password Age Policy existiert bereits + Empty: Default Password Age Policy leer + PasswordLockoutPolicy: + NotExisting: Default Password Lockout Policy existiert nicht + AlreadyExists: Default Password Lockout Policy existiert bereits + Empty: Default Password Lockout Policy leer + OrgIAM: + NotExisting: Default Org IAM Policy existiert nicht + AlreadyExists: Default Org IAM Policy existiert bereits + Empty: Default Org IAM Policy leer Policy: AlreadyExists: Policy existiert bereits UserGrant: @@ -169,6 +203,8 @@ EventTypes: check: succeeded: Benutzerinitialisierung erfolgreich failed: Benutzerinitialisierung fehlgeschlagen + token: + added: Access Token ausgestellt username: reserved: Benutzername reserviert released: Benutzername freigegeben @@ -217,6 +253,9 @@ EventTypes: check: succeeded: Passwortvalidierung erfolgreich failed: Passwortvalidierung fehlgeschlagen + externallogin: + check: + succeeded: Externer login erfolgreich durchgeführt externalidp: added: Externer IDP wurde hinzugefügt removed: Externer IDP wurde gelöscht @@ -340,11 +379,24 @@ EventTypes: changed: SAML IDP Konfiguration geändert policy: login: - added: Login Policy hinzugefügt - changed: Login Policy geändert + added: Login Richtlinie hinzugefügt + changed: Login Richtlinie geändert idpprovider: - added: Idp Provider zu Login Policy hinzugefügt - removed: Idp Provider aus Login Policy gelöscht + added: Idp Provider zu Login Richtlinie hinzugefügt + removed: Idp Provider aus Login Richtlinie gelöscht + password: + complexity: + added: Passwort Komplexitäts Richtlinie hinzugefügt + changed: Passwort Komplexitäts Richtlinie geändert + removed: Passwort Komplexitäts Richtlinie gelöscht + age: + added: Passwort Alter Richtlinie hinzugefügt + changed: Passwort Alter Richtlinie geändert + removed: Passwort Alter Richtlinie gelöscht + lockout: + added: Passwort Sperrungs Richtlinie hinzugefügt + changed: Passwort Sperrungs Richtlinie geändert + removed: Passwort Sperrungs Richtlinie gelöscht project: added: Projekt hinzugefügt changed: Project geändert diff --git a/internal/static/i18n/en.yaml b/internal/static/i18n/en.yaml index 815d641868..417c86a569 100644 --- a/internal/static/i18n/en.yaml +++ b/internal/static/i18n/en.yaml @@ -83,12 +83,22 @@ Errors: IdpNotExisting: IDP configuration does not exist OIDCConfigInvalid: OIDC IDP configuration is invalid IdpIsNotOIDC: IDP configuration is not of type oidc + IDP: + InvalidSearchQuery: Ungültiger Suchparameter LoginPolicy: Invalid: Login Policy is invalid NotExisting: Login Policy not existig AlreadyExists: Login Policy already exists IdpProviderAlreadyExisting: Idp Provider already existing IdpProviderNotExisting: Idp Provider not existing + PasswordComplexity: + Empty: Passwort Complexity Policy is empty + NotExisting: Passwort Complexity Policy doesn't exist + AlreadyExists: Passwort Complexity Policy already exists + OrgIAM: + Empty: Org IAM Policy is empty + NotExisting: Org IAM Policy doesn't exist + AlreadyExists: Org IAM Policy already exists Project: ProjectIDMissing: Project Id missing AlreadyExists: Project already exists on organisation @@ -141,6 +151,30 @@ Errors: AlreadyExists: Default Login Policy already exists IdpProviderAlreadyExisting: Idp Provider already existing IdpProviderNotExisting: Idp Provider not existing + PasswordComplexityPolicy: + NotExisting: Default Password Complexity Policy not existing + AlreadyExists: Default Password Complexity Policy already existing + Empty: Default Password Complexity Policy empty + PasswordAgePolicy: + NotExisting: Default Password Age Policy not existing + AlreadyExists: Default Password Age Policy already existing + Empty: Default Password Age Policy empty + PasswordLockoutPolicy: + NotExisting: Default Password Lockout Policy not existing + AlreadyExists: Default Password Lockout Policy already existing + Empty: Default Password Lockout Policy empty + PasswordLockout: + Empty: Passwort Lockout Policy is empty + NotExisting: Passwort Lockout Policy not existing + AlreadyExists: Passwort Lockout Policy already exists + PasswordAge: + Empty: Passwort Age Policy is empty + NotExisting: Passwort Age Policy not existing + AlreadyExists: Passwort Age Policy already exists + OrgIAM: + Empty: Org IAM Policy is empty + NotExisting: Org IAM Policy not existing + AlreadyExists: Org IAM Policy already exists Policy: AlreadyExists: Policy already exists UserGrant: @@ -169,6 +203,8 @@ EventTypes: check: succeeded: Initialisation check succeded failed: Initialisation check failed + token: + added: Access Token ausgestellt username: reserved: Username reserved released: Username released @@ -217,6 +253,9 @@ EventTypes: check: succeeded: Password check succeeded failed: Password check failed + externallogin: + check: + succeeded: External login succeeded externalidp: added: Externer IDP added removed: Externer IDP removed @@ -345,6 +384,19 @@ EventTypes: idpprovider: added: Idp Provider added to Login Policy removed: Idp Provider removed from Login Policy + password: + complexity: + added: Password complexity policy added + changed: Password complexity policy changed + removed: Password complexity policy removed + age: + added: Password age policy added + changed: Password age policy changed + removed: Password age policy removed + lockout: + added: Password lockout policy added + changed: Password lockout policy changed + removed: Password lockout policy removed project: added: Project added changed: Project changed diff --git a/internal/token/repository/view/model/token.go b/internal/token/repository/view/model/token.go deleted file mode 100644 index bd0cb83168..0000000000 --- a/internal/token/repository/view/model/token.go +++ /dev/null @@ -1,67 +0,0 @@ -package model - -import ( - "time" - - "github.com/lib/pq" - - "github.com/caos/zitadel/internal/token/model" -) - -const ( - TokenKeyTokenID = "id" - TokenKeyUserID = "user_id" - TokenKeyApplicationID = "application_id" - TokenKeyUserAgentID = "user_agent_id" - TokenKeyExpiration = "expiration" - TokenKeyResourceOwner = "resource_owner" -) - -type Token struct { - ID string `json:"-" gorm:"column:id;primary_key"` - CreationDate time.Time `json:"-" gorm:"column:creation_date"` - ChangeDate time.Time `json:"-" gorm:"column:change_date"` - ResourceOwner string `json:"-" gorm:"column:resource_owner"` - UserID string `json:"-" gorm:"column:user_id"` - ApplicationID string `json:"-" gorm:"column:application_id"` - UserAgentID string `json:"-" gorm:"column:user_agent_id"` - Audience pq.StringArray `json:"-" gorm:"column:audience"` - Scopes pq.StringArray `json:"-" gorm:"column:scopes"` - Expiration time.Time `json:"-" gorm:"column:expiration"` - Sequence uint64 `json:"-" gorm:"column:sequence"` - PreferredLanguage string `json:"-" gorm:"column:preferred_language"` -} - -func TokenFromModel(token *model.Token) *Token { - return &Token{ - ID: token.ID, - CreationDate: token.CreationDate, - ChangeDate: token.ChangeDate, - ResourceOwner: token.ResourceOwner, - UserID: token.UserID, - ApplicationID: token.ApplicationID, - UserAgentID: token.UserAgentID, - Audience: token.Audience, - Scopes: token.Scopes, - Expiration: token.Expiration, - Sequence: token.Sequence, - PreferredLanguage: token.PreferredLanguage, - } -} - -func TokenToModel(token *Token) *model.Token { - return &model.Token{ - ID: token.ID, - CreationDate: token.CreationDate, - ChangeDate: token.ChangeDate, - ResourceOwner: token.ResourceOwner, - UserID: token.UserID, - ApplicationID: token.ApplicationID, - UserAgentID: token.UserAgentID, - Audience: token.Audience, - Scopes: token.Scopes, - Expiration: token.Expiration, - Sequence: token.Sequence, - PreferredLanguage: token.PreferredLanguage, - } -} diff --git a/internal/token/repository/view/token.go b/internal/token/repository/view/token.go deleted file mode 100644 index 24ae43d8a6..0000000000 --- a/internal/token/repository/view/token.go +++ /dev/null @@ -1,85 +0,0 @@ -package view - -import ( - "time" - - "github.com/caos/zitadel/internal/errors" - global_model "github.com/caos/zitadel/internal/model" - token_model "github.com/caos/zitadel/internal/token/model" - "github.com/caos/zitadel/internal/token/repository/view/model" - "github.com/caos/zitadel/internal/view/repository" - "github.com/jinzhu/gorm" - "github.com/lib/pq" -) - -func TokenByID(db *gorm.DB, table, tokenID string) (*model.Token, error) { - token := new(model.Token) - query := repository.PrepareGetByKey(table, model.TokenSearchKey(token_model.TokenSearchKeyTokenID), tokenID) - err := query(db, token) - if errors.IsNotFound(err) { - return nil, errors.ThrowNotFound(nil, "VIEW-6ub3p", "Errors.Token.NotFound") - } - return token, err -} - -func TokensByUserID(db *gorm.DB, table, userID string) ([]*model.Token, error) { - tokens := make([]*model.Token, 0) - userIDQuery := &token_model.TokenSearchQuery{ - Key: token_model.TokenSearchKeyUserID, - Method: global_model.SearchMethodEquals, - Value: userID, - } - query := repository.PrepareSearchQuery(table, model.TokenSearchRequest{ - Queries: []*token_model.TokenSearchQuery{userIDQuery}, - }) - _, err := query(db, &tokens) - return tokens, err -} - -func IsTokenValid(db *gorm.DB, table, tokenID string) (bool, error) { - token, err := TokenByID(db, table, tokenID) - if err == nil { - return token.Expiration.After(time.Now().UTC()), nil - } - if errors.IsNotFound(err) { - return false, nil - } - return false, err -} - -func PutToken(db *gorm.DB, table string, token *model.Token) error { - save := repository.PrepareSave(table) - return save(db, token) -} - -func PutTokens(db *gorm.DB, table string, tokens ...*model.Token) error { - save := repository.PrepareBulkSave(table) - t := make([]interface{}, len(tokens)) - for i, token := range tokens { - t[i] = token - } - return save(db, t...) -} - -func DeleteToken(db *gorm.DB, table, tokenID string) error { - delete := repository.PrepareDeleteByKey(table, model.TokenSearchKey(token_model.TokenSearchKeyTokenID), tokenID) - return delete(db) -} - -func DeleteSessionTokens(db *gorm.DB, table, agentID, userID string) error { - delete := repository.PrepareDeleteByKeys(table, - repository.Key{Key: model.TokenSearchKey(token_model.TokenSearchKeyUserAgentID), Value: agentID}, - repository.Key{Key: model.TokenSearchKey(token_model.TokenSearchKeyUserID), Value: userID}, - ) - return delete(db) -} - -func DeleteUserTokens(db *gorm.DB, table, userID string) error { - delete := repository.PrepareDeleteByKey(table, model.TokenSearchKey(token_model.TokenSearchKeyUserID), userID) - return delete(db) -} - -func DeleteApplicationTokens(db *gorm.DB, table string, appIDs []string) error { - delete := repository.PrepareDeleteByKey(table, model.TokenSearchKey(token_model.TokenSearchKeyApplicationID), pq.StringArray(appIDs)) - return delete(db) -} diff --git a/internal/tracing/http_handler.go b/internal/tracing/http_handler.go index a3b9631863..969f5efbf2 100644 --- a/internal/tracing/http_handler.go +++ b/internal/tracing/http_handler.go @@ -8,9 +8,7 @@ import ( "go.opencensus.io/trace" ) -func TraceHandler(handler http.Handler, ignoredMethods ...string) http.Handler { - healthEndpoints := strings.Join(ignoredMethods, ";;") - +func TraceHandler(handler http.Handler, ignoredEndpoints ...string) http.Handler { return &ochttp.Handler{ Handler: handler, FormatSpanName: func(r *http.Request) string { @@ -23,8 +21,12 @@ func TraceHandler(handler http.Handler, ignoredMethods ...string) http.Handler { StartOptions: trace.StartOptions{Sampler: Sampler()}, IsHealthEndpoint: func(r *http.Request) bool { - n := strings.Contains(healthEndpoints, r.URL.RequestURI()) - return n + for _, endpoint := range ignoredEndpoints { + if strings.HasPrefix(r.URL.RequestURI(), endpoint) { + return true + } + } + return false }, } } diff --git a/internal/tracing/tracing.go b/internal/tracing/tracing.go index 61fdc4b318..5184ec8ea9 100644 --- a/internal/tracing/tracing.go +++ b/internal/tracing/tracing.go @@ -38,6 +38,13 @@ func NewSpan(ctx context.Context) (context.Context, *Span) { return T.NewSpan(ctx, GetCaller()) } +func NewNamedSpan(ctx context.Context, name string) (context.Context, *Span) { + if T == nil { + return ctx, CreateSpan(nil) + } + return T.NewSpan(ctx, name) +} + func NewClientSpan(ctx context.Context) (context.Context, *Span) { if T == nil { return ctx, CreateSpan(nil) @@ -52,18 +59,18 @@ func NewServerSpan(ctx context.Context) (context.Context, *Span) { return T.NewServerSpan(ctx, GetCaller()) } -func NewClientInterceptorSpan(ctx context.Context, name string) (context.Context, *Span) { +func NewClientInterceptorSpan(ctx context.Context) (context.Context, *Span) { if T == nil { return ctx, CreateSpan(nil) } - return T.NewClientInterceptorSpan(ctx, name) + return T.NewClientInterceptorSpan(ctx, GetCaller()) } -func NewServerInterceptorSpan(ctx context.Context, name string) (context.Context, *Span) { +func NewServerInterceptorSpan(ctx context.Context) (context.Context, *Span) { if T == nil { return ctx, CreateSpan(nil) } - return T.NewServerInterceptorSpan(ctx, name) + return T.NewServerInterceptorSpan(ctx, GetCaller()) } func NewSpanHTTP(r *http.Request) (*http.Request, *Span) { diff --git a/internal/ui/login/handler/external_login_handler.go b/internal/ui/login/handler/external_login_handler.go index b00673ddc8..8f8bd033f7 100644 --- a/internal/ui/login/handler/external_login_handler.go +++ b/internal/ui/login/handler/external_login_handler.go @@ -6,6 +6,7 @@ import ( http_mw "github.com/caos/zitadel/internal/api/http/middleware" "github.com/caos/zitadel/internal/auth_request/model" "github.com/caos/zitadel/internal/crypto" + "github.com/caos/zitadel/internal/errors" caos_errors "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/models" iam_model "github.com/caos/zitadel/internal/iam/model" @@ -33,12 +34,22 @@ type externalIDPCallbackData struct { type externalNotFoundOptionFormData struct { Link bool `schema:"link"` AutoRegister bool `schema:"autoregister"` + ResetLinking bool `schema:"resetlinking"` } type externalNotFoundOptionData struct { baseData } +func (l *Login) handleExternalLoginStep(w http.ResponseWriter, r *http.Request, authReq *model.AuthRequest, selectedIDPConfigID string) { + for _, idp := range authReq.AllowedExternalIDPs { + if idp.IDPConfigID == selectedIDPConfigID { + l.handleIDP(w, r, authReq, selectedIDPConfigID) + } + } + l.renderLogin(w, r, authReq, errors.ThrowInvalidArgument(nil, "VIEW-Fsj7f", "Errors.User.ExternalIDP.NotAllowed")) +} + func (l *Login) handleExternalLogin(w http.ResponseWriter, r *http.Request) { data := new(externalIDPData) authReq, err := l.getAuthRequestAndParseData(r, data) @@ -50,7 +61,11 @@ func (l *Login) handleExternalLogin(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, l.zitadelURL, http.StatusFound) return } - idpConfig, err := l.getIDPConfigByID(r, data.IDPConfigID) + l.handleIDP(w, r, authReq, data.IDPConfigID) +} + +func (l *Login) handleIDP(w http.ResponseWriter, r *http.Request, authReq *model.AuthRequest, selectedIDPConfigID string) { + idpConfig, err := l.getIDPConfigByID(r, selectedIDPConfigID) if err != nil { l.renderError(w, r, authReq, err) return @@ -116,9 +131,12 @@ func (l *Login) getRPConfig(w http.ResponseWriter, r *http.Request, authReq *mod func (l *Login) handleExternalUserAuthenticated(w http.ResponseWriter, r *http.Request, authReq *model.AuthRequest, idpConfig *iam_model.IDPConfigView, userAgentID string, tokens *oidc.Tokens) { externalUser := l.mapTokenToLoginUser(tokens, idpConfig) - err := l.authRepo.CheckExternalUserLogin(r.Context(), authReq.ID, userAgentID, externalUser) + err := l.authRepo.CheckExternalUserLogin(r.Context(), authReq.ID, userAgentID, externalUser, model.BrowserInfoFromRequest(r)) if err != nil { - l.renderExternalNotFoundOption(w, r, authReq, nil) + if errors.IsNotFound(err) { + err = nil + } + l.renderExternalNotFoundOption(w, r, authReq, err) return } l.renderNextStep(w, r, authReq) @@ -139,35 +157,52 @@ func (l *Login) handleExternalNotFoundOptionCheck(w http.ResponseWriter, r *http data := new(externalNotFoundOptionFormData) authReq, err := l.getAuthRequestAndParseData(r, data) if err != nil { - l.renderError(w, r, authReq, err) + l.renderExternalNotFoundOption(w, r, authReq, err) return } if data.Link { l.renderLogin(w, r, authReq, nil) return + } else if data.ResetLinking { + userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context()) + err = l.authRepo.ResetLinkingUsers(r.Context(), authReq.ID, userAgentID) + if err != nil { + l.renderExternalNotFoundOption(w, r, authReq, err) + } + l.handleLogin(w, r) + return } l.handleAutoRegister(w, r, authReq) } func (l *Login) handleAutoRegister(w http.ResponseWriter, r *http.Request, authReq *model.AuthRequest) { - orgIamPolicy, err := l.getOrgIamPolicy(r, authReq.GetScopeOrgID()) - if err != nil { - l.renderExternalNotFoundOption(w, r, authReq, err) - return - } iam, err := l.authRepo.GetIAM(r.Context()) if err != nil { l.renderExternalNotFoundOption(w, r, authReq, err) return } + resourceOwner := iam.GlobalOrgID member := &org_model.OrgMember{ ObjectRoot: models.ObjectRoot{AggregateID: iam.GlobalOrgID}, Roles: []string{orgProjectCreatorRole}, } - if authReq.GetScopeOrgID() != iam.GlobalOrgID && authReq.GetScopeOrgID() != "" { - member = nil - resourceOwner = authReq.GetScopeOrgID() + if authReq.GetScopeOrgPrimaryDomain() != "" { + primaryDomain := authReq.GetScopeOrgPrimaryDomain() + org, err := l.authRepo.GetOrgByPrimaryDomain(primaryDomain) + if err != nil { + l.renderExternalNotFoundOption(w, r, authReq, err) + } + if org.ID != iam.GlobalOrgID { + member = nil + resourceOwner = org.ID + } + } + + orgIamPolicy, err := l.getOrgIamPolicy(r, resourceOwner) + if err != nil { + l.renderExternalNotFoundOption(w, r, authReq, err) + return } idpConfig, err := l.authRepo.GetIDPConfigByID(r.Context(), authReq.SelectedIDPConfigID) @@ -178,7 +213,7 @@ func (l *Login) handleAutoRegister(w http.ResponseWriter, r *http.Request, authR userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context()) user, externalIDP := l.mapExternalUserToLoginUser(orgIamPolicy, authReq.LinkingUsers[len(authReq.LinkingUsers)-1], idpConfig) - err = l.authRepo.AutoRegisterExternalUser(setContext(r.Context(), resourceOwner), user, externalIDP, member, authReq.ID, userAgentID, resourceOwner) + err = l.authRepo.AutoRegisterExternalUser(setContext(r.Context(), resourceOwner), user, externalIDP, member, authReq.ID, userAgentID, resourceOwner, model.BrowserInfoFromRequest(r)) if err != nil { l.renderExternalNotFoundOption(w, r, authReq, err) return @@ -187,37 +222,36 @@ func (l *Login) handleAutoRegister(w http.ResponseWriter, r *http.Request, authR } func (l *Login) mapTokenToLoginUser(tokens *oidc.Tokens, idpConfig *iam_model.IDPConfigView) *model.ExternalUser { - displayName := tokens.IDTokenClaims.PreferredUsername - if displayName == "" && tokens.IDTokenClaims.Email != "" { - displayName = tokens.IDTokenClaims.Email + displayName := tokens.IDTokenClaims.GetPreferredUsername() + if displayName == "" && tokens.IDTokenClaims.GetEmail() != "" { + displayName = tokens.IDTokenClaims.GetEmail() } switch idpConfig.OIDCIDPDisplayNameMapping { case iam_model.OIDCMappingFieldEmail: - if tokens.IDTokenClaims.EmailVerified && tokens.IDTokenClaims.Email != "" { - displayName = tokens.IDTokenClaims.Email + if tokens.IDTokenClaims.IsEmailVerified() && tokens.IDTokenClaims.GetEmail() != "" { + displayName = tokens.IDTokenClaims.GetEmail() } } externalUser := &model.ExternalUser{ IDPConfigID: idpConfig.IDPConfigID, - ExternalUserID: tokens.IDTokenClaims.Subject, - PreferredUsername: tokens.IDTokenClaims.PreferredUsername, + ExternalUserID: tokens.IDTokenClaims.GetSubject(), + PreferredUsername: tokens.IDTokenClaims.GetPreferredUsername(), DisplayName: displayName, - FirstName: tokens.IDTokenClaims.GivenName, - LastName: tokens.IDTokenClaims.FamilyName, - NickName: tokens.IDTokenClaims.Nickname, - Email: tokens.IDTokenClaims.Email, - IsEmailVerified: tokens.IDTokenClaims.EmailVerified, + FirstName: tokens.IDTokenClaims.GetGivenName(), + LastName: tokens.IDTokenClaims.GetFamilyName(), + NickName: tokens.IDTokenClaims.GetNickname(), + Email: tokens.IDTokenClaims.GetEmail(), + IsEmailVerified: tokens.IDTokenClaims.IsEmailVerified(), } - if tokens.IDTokenClaims.PhoneNumber != "" { - externalUser.Phone = tokens.IDTokenClaims.PhoneNumber - externalUser.IsPhoneVerified = tokens.IDTokenClaims.PhoneNumberVerified + if tokens.IDTokenClaims.GetPhoneNumber() != "" { + externalUser.Phone = tokens.IDTokenClaims.GetPhoneNumber() + externalUser.IsPhoneVerified = tokens.IDTokenClaims.IsPhoneNumberVerified() } return externalUser } - -func (l *Login) mapExternalUserToLoginUser(orgIamPolicy *org_model.OrgIAMPolicy, linkingUser *model.ExternalUser, idpConfig *iam_model.IDPConfigView) (*usr_model.User, *usr_model.ExternalIDP) { +func (l *Login) mapExternalUserToLoginUser(orgIamPolicy *iam_model.OrgIAMPolicyView, linkingUser *model.ExternalUser, idpConfig *iam_model.IDPConfigView) (*usr_model.User, *usr_model.ExternalIDP) { username := linkingUser.PreferredUsername switch idpConfig.OIDCUsernameMapping { case iam_model.OIDCMappingFieldEmail: diff --git a/internal/ui/login/handler/external_register_handler.go b/internal/ui/login/handler/external_register_handler.go index e5cdc8bb04..0d8079adeb 100644 --- a/internal/ui/login/handler/external_register_handler.go +++ b/internal/ui/login/handler/external_register_handler.go @@ -1,8 +1,13 @@ package handler import ( + "net/http" + "strings" + "github.com/caos/oidc/pkg/oidc" "github.com/caos/oidc/pkg/rp" + "golang.org/x/text/language" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" "github.com/caos/zitadel/internal/auth_request/model" caos_errors "github.com/caos/zitadel/internal/errors" @@ -10,8 +15,6 @@ import ( iam_model "github.com/caos/zitadel/internal/iam/model" org_model "github.com/caos/zitadel/internal/org/model" usr_model "github.com/caos/zitadel/internal/user/model" - "net/http" - "strings" ) func (l *Login) handleExternalRegister(w http.ResponseWriter, r *http.Request) { @@ -71,11 +74,6 @@ func (l *Login) handleExternalRegisterCallback(w http.ResponseWriter, r *http.Re } func (l *Login) handleExternalUserRegister(w http.ResponseWriter, r *http.Request, authReq *model.AuthRequest, idpConfig *iam_model.IDPConfigView, userAgentID string, tokens *oidc.Tokens) { - orgIamPolicy, err := l.getOrgIamPolicy(r, authReq.GetScopeOrgID()) - if err != nil { - l.renderRegisterOption(w, r, authReq, err) - return - } iam, err := l.authRepo.GetIAM(r.Context()) if err != nil { l.renderRegisterOption(w, r, authReq, err) @@ -86,11 +84,24 @@ func (l *Login) handleExternalUserRegister(w http.ResponseWriter, r *http.Reques ObjectRoot: models.ObjectRoot{AggregateID: iam.GlobalOrgID}, Roles: []string{orgProjectCreatorRole}, } - if authReq.GetScopeOrgID() != iam.GlobalOrgID && authReq.GetScopeOrgID() != "" { - member = nil - resourceOwner = authReq.GetScopeOrgID() - } + if authReq.GetScopeOrgPrimaryDomain() != "" { + primaryDomain := authReq.GetScopeOrgPrimaryDomain() + org, err := l.authRepo.GetOrgByPrimaryDomain(primaryDomain) + if err != nil { + l.renderRegisterOption(w, r, authReq, err) + return + } + if org.ID != iam.GlobalOrgID { + member = nil + resourceOwner = org.ID + } + } + orgIamPolicy, err := l.getOrgIamPolicy(r, resourceOwner) + if err != nil { + l.renderRegisterOption(w, r, authReq, err) + return + } user, externalIDP := l.mapTokenToLoginUserAndExternalIDP(orgIamPolicy, tokens, idpConfig) _, err = l.authRepo.RegisterExternalUser(setContext(r.Context(), resourceOwner), user, externalIDP, member, resourceOwner) if err != nil { @@ -100,12 +111,12 @@ func (l *Login) handleExternalUserRegister(w http.ResponseWriter, r *http.Reques l.renderNextStep(w, r, authReq) } -func (l *Login) mapTokenToLoginUserAndExternalIDP(orgIamPolicy *org_model.OrgIAMPolicy, tokens *oidc.Tokens, idpConfig *iam_model.IDPConfigView) (*usr_model.User, *usr_model.ExternalIDP) { - username := tokens.IDTokenClaims.PreferredUsername +func (l *Login) mapTokenToLoginUserAndExternalIDP(orgIamPolicy *iam_model.OrgIAMPolicyView, tokens *oidc.Tokens, idpConfig *iam_model.IDPConfigView) (*usr_model.User, *usr_model.ExternalIDP) { + username := tokens.IDTokenClaims.GetPreferredUsername() switch idpConfig.OIDCUsernameMapping { case iam_model.OIDCMappingFieldEmail: - if tokens.IDTokenClaims.EmailVerified && tokens.IDTokenClaims.Email != "" { - username = tokens.IDTokenClaims.Email + if tokens.IDTokenClaims.IsEmailVerified() && tokens.IDTokenClaims.GetEmail() != "" { + username = tokens.IDTokenClaims.GetEmail() } } @@ -120,35 +131,35 @@ func (l *Login) mapTokenToLoginUserAndExternalIDP(orgIamPolicy *org_model.OrgIAM UserName: username, Human: &usr_model.Human{ Profile: &usr_model.Profile{ - FirstName: tokens.IDTokenClaims.GivenName, - LastName: tokens.IDTokenClaims.FamilyName, - PreferredLanguage: tokens.IDTokenClaims.Locale, - NickName: tokens.IDTokenClaims.Nickname, + FirstName: tokens.IDTokenClaims.GetGivenName(), + LastName: tokens.IDTokenClaims.GetFamilyName(), + PreferredLanguage: language.Tag(tokens.IDTokenClaims.GetLocale()), + NickName: tokens.IDTokenClaims.GetNickname(), }, Email: &usr_model.Email{ - EmailAddress: tokens.IDTokenClaims.Email, - IsEmailVerified: tokens.IDTokenClaims.EmailVerified, + EmailAddress: tokens.IDTokenClaims.GetEmail(), + IsEmailVerified: tokens.IDTokenClaims.IsEmailVerified(), }, }, } - if tokens.IDTokenClaims.PhoneNumber != "" { + if tokens.IDTokenClaims.GetPhoneNumber() != "" { user.Phone = &usr_model.Phone{ - PhoneNumber: tokens.IDTokenClaims.PhoneNumber, - IsPhoneVerified: tokens.IDTokenClaims.PhoneNumberVerified, + PhoneNumber: tokens.IDTokenClaims.GetPhoneNumber(), + IsPhoneVerified: tokens.IDTokenClaims.IsPhoneNumberVerified(), } } - displayName := tokens.IDTokenClaims.PreferredUsername + displayName := tokens.IDTokenClaims.GetPreferredUsername() switch idpConfig.OIDCIDPDisplayNameMapping { case iam_model.OIDCMappingFieldEmail: - if tokens.IDTokenClaims.EmailVerified && tokens.IDTokenClaims.Email != "" { - displayName = tokens.IDTokenClaims.Email + if tokens.IDTokenClaims.IsEmailVerified() && tokens.IDTokenClaims.GetEmail() != "" { + displayName = tokens.IDTokenClaims.GetEmail() } } externalIDP := &usr_model.ExternalIDP{ IDPConfigID: idpConfig.IDPConfigID, - UserID: tokens.IDTokenClaims.Subject, + UserID: tokens.IDTokenClaims.GetSubject(), DisplayName: displayName, } return user, externalIDP diff --git a/internal/ui/login/handler/link_users_handler.go b/internal/ui/login/handler/link_users_handler.go index ca238486bb..62346cf4ad 100644 --- a/internal/ui/login/handler/link_users_handler.go +++ b/internal/ui/login/handler/link_users_handler.go @@ -13,7 +13,7 @@ const ( func (l *Login) linkUsers(w http.ResponseWriter, r *http.Request, authReq *model.AuthRequest, err error) { userAgentID, _ := http_mw.UserAgentIDFromCtx(r.Context()) - err = l.authRepo.LinkExternalUsers(setContext(r.Context(), authReq.UserOrgID), authReq.ID, userAgentID) + err = l.authRepo.LinkExternalUsers(setContext(r.Context(), authReq.UserOrgID), authReq.ID, userAgentID, model.BrowserInfoFromRequest(r)) l.renderLinkUsersDone(w, r, authReq, err) } diff --git a/internal/ui/login/handler/login.go b/internal/ui/login/handler/login.go index 4322c9c27f..149167c418 100644 --- a/internal/ui/login/handler/login.go +++ b/internal/ui/login/handler/login.go @@ -19,7 +19,6 @@ import ( "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/form" "github.com/caos/zitadel/internal/id" - _ "github.com/caos/zitadel/internal/ui/login/statik" ) @@ -83,7 +82,7 @@ func CreateLogin(config Config, authRepo *eventsourcing.EsRepository, systemDefa security := middleware.SecurityHeaders(csp(), login.cspErrorHandler) userAgentCookie, err := middleware.NewUserAgentHandler(config.UserAgentCookieConfig, id.SonyFlakeGenerator, localDevMode) logging.Log("CONFI-Dvwf2").OnError(err).Panic("unable to create userAgentInterceptor") - login.router = CreateRouter(login, statikFS, csrf, cache, security, userAgentCookie) + login.router = CreateRouter(login, statikFS, csrf, cache, security, userAgentCookie, middleware.TraceHandler(EndpointResources)) login.renderer = CreateRenderer(prefix, statikFS, config.LanguageCookieName, config.DefaultLanguage) login.parser = form.NewParser() return login, handlerPrefix diff --git a/internal/ui/login/handler/password_complexity_policy_handler.go b/internal/ui/login/handler/password_complexity_policy_handler.go index fc0054f552..e1d35d66a8 100644 --- a/internal/ui/login/handler/password_complexity_policy_handler.go +++ b/internal/ui/login/handler/password_complexity_policy_handler.go @@ -3,7 +3,7 @@ package handler import ( "github.com/caos/zitadel/internal/auth_request/model" "github.com/caos/zitadel/internal/errors" - policy_model "github.com/caos/zitadel/internal/policy/model" + iam_model "github.com/caos/zitadel/internal/iam/model" "net/http" "regexp" "strconv" @@ -23,7 +23,7 @@ var ( hasSymbol = regexp.MustCompile(SymbolRegex).MatchString ) -func (l *Login) getPasswordComplexityPolicy(r *http.Request, orgID string) (*policy_model.PasswordComplexityPolicy, string, error) { +func (l *Login) getPasswordComplexityPolicy(r *http.Request, orgID string) (*iam_model.PasswordComplexityPolicyView, string, error) { policy, err := l.authRepo.GetMyPasswordComplexityPolicy(setContext(r.Context(), orgID)) if err != nil { return nil, err.Error(), err @@ -32,7 +32,7 @@ func (l *Login) getPasswordComplexityPolicy(r *http.Request, orgID string) (*pol return policy, description, nil } -func (l *Login) getPasswordComplexityPolicyByUserID(r *http.Request, userID string) (*policy_model.PasswordComplexityPolicy, string, error) { +func (l *Login) getPasswordComplexityPolicyByUserID(r *http.Request, userID string) (*iam_model.PasswordComplexityPolicyView, string, error) { user, err := l.authRepo.UserByID(r.Context(), userID) if err != nil { return nil, "", nil @@ -45,7 +45,7 @@ func (l *Login) getPasswordComplexityPolicyByUserID(r *http.Request, userID stri return policy, description, nil } -func (l *Login) generatePolicyDescription(r *http.Request, policy *policy_model.PasswordComplexityPolicy) (string, error) { +func (l *Login) generatePolicyDescription(r *http.Request, policy *iam_model.PasswordComplexityPolicyView) (string, error) { description := "
    " minLength := l.renderer.LocalizeFromRequest(r, "Password.MinLength", nil) description += "
  • clear" + minLength + " " + strconv.Itoa(int(policy.MinLength)) + "
  • " diff --git a/internal/ui/login/handler/policy_handler.go b/internal/ui/login/handler/policy_handler.go index b9741240ee..5d0c92ccd0 100644 --- a/internal/ui/login/handler/policy_handler.go +++ b/internal/ui/login/handler/policy_handler.go @@ -2,15 +2,18 @@ package handler import ( iam_model "github.com/caos/zitadel/internal/iam/model" - org_model "github.com/caos/zitadel/internal/org/model" "net/http" ) -func (l *Login) getOrgIamPolicy(r *http.Request, orgID string) (*org_model.OrgIAMPolicy, error) { +func (l *Login) getDefaultOrgIamPolicy(r *http.Request) (*iam_model.OrgIAMPolicyView, error) { + return l.authRepo.GetDefaultOrgIAMPolicy(r.Context()) +} + +func (l *Login) getOrgIamPolicy(r *http.Request, orgID string) (*iam_model.OrgIAMPolicyView, error) { if orgID == "" { - return l.authRepo.GetDefaultOrgIamPolicy(r.Context()), nil + return l.authRepo.GetDefaultOrgIAMPolicy(r.Context()) } - return l.authRepo.GetOrgIamPolicy(r.Context(), orgID) + return l.authRepo.GetOrgIAMPolicy(r.Context(), orgID) } func (l *Login) getIDPConfigByID(r *http.Request, idpConfigID string) (*iam_model.IDPConfigView, error) { diff --git a/internal/ui/login/handler/register_handler.go b/internal/ui/login/handler/register_handler.go index e8ffdf0508..4ec4eb1bf8 100644 --- a/internal/ui/login/handler/register_handler.go +++ b/internal/ui/login/handler/register_handler.go @@ -71,9 +71,17 @@ func (l *Login) handleRegisterCheck(w http.ResponseWriter, r *http.Request) { ObjectRoot: models.ObjectRoot{AggregateID: iam.GlobalOrgID}, Roles: []string{orgProjectCreatorRole}, } - if authRequest.GetScopeOrgID() != "" && authRequest.GetScopeOrgID() != iam.GlobalOrgID { - member = nil - resourceOwner = authRequest.GetScopeOrgID() + if authRequest.GetScopeOrgPrimaryDomain() != "" { + primaryDomain := authRequest.GetScopeOrgPrimaryDomain() + org, err := l.authRepo.GetOrgByPrimaryDomain(primaryDomain) + if err != nil { + l.renderRegisterOption(w, r, authRequest, err) + return + } + if org.ID != iam.GlobalOrgID { + member = nil + resourceOwner = org.ID + } } user, err := l.authRepo.Register(setContext(r.Context(), resourceOwner), data.toUserModel(), member, resourceOwner) if err != nil { diff --git a/internal/ui/login/handler/register_option_handler.go b/internal/ui/login/handler/register_option_handler.go index b915da4269..254b258b4f 100644 --- a/internal/ui/login/handler/register_option_handler.go +++ b/internal/ui/login/handler/register_option_handler.go @@ -35,7 +35,12 @@ func (l *Login) renderRegisterOption(w http.ResponseWriter, r *http.Request, aut data := registerOptionData{ baseData: l.getBaseData(r, authReq, "RegisterOption", errType, errMessage), } - l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplRegisterOption], data, nil) + funcs := map[string]interface{}{ + "hasExternalLogin": func() bool { + return authReq.LoginPolicy.AllowExternalIDP && authReq.AllowedExternalIDPs != nil && len(authReq.AllowedExternalIDPs) > 0 + }, + } + l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplRegisterOption], data, funcs) } func (l *Login) handleRegisterOptionCheck(w http.ResponseWriter, r *http.Request) { diff --git a/internal/ui/login/handler/register_org_handler.go b/internal/ui/login/handler/register_org_handler.go index fe2b200c38..c1a4b8dc6e 100644 --- a/internal/ui/login/handler/register_org_handler.go +++ b/internal/ui/login/handler/register_org_handler.go @@ -108,10 +108,10 @@ func (l *Login) renderRegisterOrg(w http.ResponseWriter, r *http.Request, authRe data.HasNumber = NumberRegex } } - orgPolicy, err := l.getOrgIamPolicy(r, "0") + orgPolicy, err := l.getDefaultOrgIamPolicy(r) if orgPolicy != nil { data.UserLoginMustBeDomain = orgPolicy.UserLoginMustBeDomain - data.IamDomain = orgPolicy.IamDomain + data.IamDomain = orgPolicy.IAMDomain } l.renderer.RenderTemplate(w, r, l.renderer.Templates[tmplRegisterOrg], data, nil) diff --git a/internal/ui/login/handler/renderer.go b/internal/ui/login/handler/renderer.go index dbba159ac3..de09a28f45 100644 --- a/internal/ui/login/handler/renderer.go +++ b/internal/ui/login/handler/renderer.go @@ -140,6 +140,9 @@ func CreateRenderer(pathPrefix string, staticDir http.FileSystem, cookieName str "hasExternalLogin": func() bool { return false }, + "idpProviderClass": func(stylingType iam_model.IDPStylingType) string { + return stylingType.GetCSSClass() + }, } var err error r.Renderer, err = renderer.NewRenderer( @@ -156,6 +159,7 @@ func (l *Login) renderNextStep(w http.ResponseWriter, r *http.Request, authReq * authReq, err := l.authRepo.AuthRequestByID(r.Context(), authReq.ID, userAgentID) if err != nil { l.renderInternalError(w, r, authReq, caos_errs.ThrowInternal(nil, "APP-sio0W", "could not get authreq")) + return } if len(authReq.PossibleSteps) == 0 { l.renderInternalError(w, r, authReq, caos_errs.ThrowInternal(nil, "APP-9sdp4", "no possible steps")) @@ -208,6 +212,10 @@ func (l *Login) chooseNextStep(w http.ResponseWriter, r *http.Request, authReq * l.linkUsers(w, r, authReq, err) case *model.ExternalNotFoundOptionStep: l.renderExternalNotFoundOption(w, r, authReq, err) + case *model.ExternalLoginStep: + l.handleExternalLoginStep(w, r, authReq, step.SelectedIDPConfigID) + case *model.GrantRequiredStep: + l.renderInternalError(w, r, authReq, caos_errs.ThrowPreconditionFailed(nil, "APP-asb43", "Errors.User.GrantRequired")) default: l.renderInternalError(w, r, authReq, caos_errs.ThrowInternal(nil, "APP-ds3QF", "step no possible")) } @@ -223,11 +231,14 @@ func (l *Login) renderInternalError(w http.ResponseWriter, r *http.Request, auth } func (l *Login) getUserData(r *http.Request, authReq *model.AuthRequest, title string, errType, errMessage string) userData { - return userData{ + userData := userData{ baseData: l.getBaseData(r, authReq, title, errType, errMessage), profileData: l.getProfileData(authReq), - Linking: len(authReq.LinkingUsers) > 0, } + if authReq != nil && authReq.LinkingUsers != nil { + userData.Linking = len(authReq.LinkingUsers) > 0 + } + return userData } func (l *Login) getBaseData(r *http.Request, authReq *model.AuthRequest, title string, errType, errMessage string) baseData { @@ -292,7 +303,14 @@ func (l *Login) getOrgID(authReq *model.AuthRequest) string { if authReq.Request == nil { return "" } - return authReq.GetScopeOrgID() + primaryDomain := authReq.GetScopeOrgPrimaryDomain() + if primaryDomain != "" { + org, _ := l.authRepo.GetOrgByPrimaryDomain(primaryDomain) + if org != nil { + return org.ID + } + } + return "" } func getRequestID(authReq *model.AuthRequest, r *http.Request) string { diff --git a/internal/ui/login/static/i18n/de.yaml b/internal/ui/login/static/i18n/de.yaml index a88ecf6757..ec6feac462 100644 --- a/internal/ui/login/static/i18n/de.yaml +++ b/internal/ui/login/static/i18n/de.yaml @@ -187,6 +187,7 @@ Errors: AuthRequest: NotFound: AuthRequest konnte nicht gefunden werden UserAgentNotCorresponding: User Agent stimmt nicht überein + RequestTypeNotSupported: Requesttyp wird nicht unterstürzt User: NotFound: Benutzer konnte nicht gefunden werden NotMatchingUserID: User stimm nicht mit User in Auth Request überein @@ -225,5 +226,7 @@ Errors: NotActive: Benutzer ist nicht aktiv ExternalIDP: IDPTypeNotImplemented: IDP Typ ist nicht implementiert + NotAllowed: Externer Login Provider ist nicht erlaubt + GrantRequired: Der Login an diese Applikation ist nicht möglich. Der Benutzer benötigt mindestens eine Berechtigung an der Applikation. Bitte melde dich bei deinem Administrator. optional: (optional) diff --git a/internal/ui/login/static/i18n/en.yaml b/internal/ui/login/static/i18n/en.yaml index c21db87b1c..e020e0edae 100644 --- a/internal/ui/login/static/i18n/en.yaml +++ b/internal/ui/login/static/i18n/en.yaml @@ -187,6 +187,7 @@ Errors: AuthRequest: NotFound: Could not find authrequest UserAgentNotCorresponding: User Agent does not correspond + RequestTypeNotSupported: Request type is not supported User: NotFound: User could not be found NotMatchingUserID: User and user in authrequest don't match @@ -225,6 +226,8 @@ Errors: NotActive: User is not active ExternalIDP: IDPTypeNotImplemented: IDP Type is not implemented + NotAllowed: External Login Provider not allowed + GrantRequired: Login not possible. The user is required to have at least one grant on the application. Please contact your administrator. optional: (optional) diff --git a/internal/ui/login/static/resources/images/idp/google.png b/internal/ui/login/static/resources/images/idp/google.png new file mode 100644 index 0000000000..94e00f90b3 Binary files /dev/null and b/internal/ui/login/static/resources/images/idp/google.png differ diff --git a/internal/ui/login/static/resources/themes/caos/css/dark.css b/internal/ui/login/static/resources/themes/caos/css/dark.css index ea9bdd761a..80a79a848a 100644 --- a/internal/ui/login/static/resources/themes/caos/css/dark.css +++ b/internal/ui/login/static/resources/themes/caos/css/dark.css @@ -161,7 +161,8 @@ button, .button { outline: none; display: inline-block; text-align: center; - line-height: 40px; + line-height: 44px; + padding: 1px 6px; } button:hover, .button:hover { background-color: #f60075; @@ -184,6 +185,29 @@ button:disabled:hover, .button:disabled:hover { background-color: #999999; border: 1px solid #999999; } +button.google, .button.google { + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + color: #FFFFFF; + background-color: #4285F4; +} +button.google span.logo, .button.google span.logo { + height: 46px; + width: 46px; + background-color: #FFFFFF; + background-image: url("../../../images/idp/google.png"); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; +} +button.google span.provider-name, .button.google span.provider-name { + position: absolute; + left: 50%; + transform: translateX(-50%); +} input:not([type=radio]), select { background-color: #252525; diff --git a/internal/ui/login/static/resources/themes/caos/css/dark.css.map b/internal/ui/login/static/resources/themes/caos/css/dark.css.map index ff3a62044f..449a4e6fe6 100644 --- a/internal/ui/login/static/resources/themes/caos/css/dark.css.map +++ b/internal/ui/login/static/resources/themes/caos/css/dark.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA,WEzBS;EF0BT;;;AAGJ;EACI,OCnBQ;EDoBR,aC1BS;ED2BT;EACA,WEhCU;;;AFmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCvDW;EDwDX;EACA;;AAEA;EACI,OC3DY;;AD8DhB;EACI;;;AAIR;EACI,kBCvEc;EDwEd,OCtEW;EDuEX;EACA;EACA;EACA;EACA,QExFU;EFyFV;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBCnFY;EDoFZ,OCvFU;EDwFV;;AAGJ;EACI,kBC1FO;ED2FP,OC5FI;ED6FJ;;AACA;EACI,kBC7FQ;;ADiGhB;EACI,kBEvFW;EFwFX;;AAEA;EACI,kBE3FO;EF4FP;;;AAOZ;EACI,kBEnGmB;EFoGnB,OClHQ;EDmHR,QE/HU;EFgIV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EE9HN;;AACA;EFyHE;IExHA;IACA;;;AF+HA;EElIF;;AACA;EFiIE;IEhIA;IACA;;;;AFsIA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WE5JE;EF6JF;;AAGJ;EACI;EACA;EACA;EACA,OE/IC;;;AFqJT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OCpMA;;ADwMR;EACI,OE7LK;EF8LL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCnOI;EDoOJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBE7NW;;AFgOf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cEtPO;EFuPP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OElRP;;AFyRL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EE5SV;;AACA;EFuSM;IEtSJ;IACA;;;AF8SQ;EACI;EACA;EEnTd;;AACA;EFgTU;IE/SR;IACA;;;AFqTI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OE7TN;;AFkUE;EACI,OEpUL;;AFyUP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC7WI;;ADgXR;EACI,MClXU;;;ADuXd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OEpZO","file":"dark.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA,WEzBS;EF0BT;;;AAGJ;EACI,OCnBQ;EDoBR,aC1BS;ED2BT;EACA,WEhCU;;;AFmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCvDW;EDwDX;EACA;;AAEA;EACI,OC3DY;;AD8DhB;EACI;;;AAIR;EACI,kBCvEc;EDwEd,OCtEW;EDuEX;EACA;EACA;EACA;EACA,QExFU;EFyFV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBCpFY;EDqFZ,OCxFU;EDyFV;;AAGJ;EACI,kBC3FO;ED4FP,OC7FI;ED8FJ;;AACA;EACI,kBC9FQ;;ADkGhB;EACI,kBExFW;EFyFX;;AAEA;EACI,kBE5FO;EF6FP;;AAIR;EACI;EACA;EACA;EACA;EACA,OEhGa;EFiGb,kBEhGmB;;AFkGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBE9HmB;EF+HnB,OC7IQ;ED8IR,QE1JU;EF2JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EEzJN;;AACA;EFoJE;IEnJA;IACA;;;AF0JA;EE7JF;;AACA;EF4JE;IE3JA;IACA;;;;AFiKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WEvLE;EFwLF;;AAGJ;EACI;EACA;EACA;EACA,OE1KC;;;AFgLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OC/NA;;ADmOR;EACI,OExNK;EFyNL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OC9PI;ED+PJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBExPW;;AF2Pf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cEjRO;EFkRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OE7SP;;AFoTL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EEvUV;;AACA;EFkUM;IEjUJ;IACA;;;AFyUQ;EACI;EACA;EE9Ud;;AACA;EF2UU;IE1UR;IACA;;;AFgVI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OErVN;;AF0VE;EACI,OE5VL;;AFiWP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCxYI;;AD2YR;EACI,MC7YU;;;ADkZd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OE5aO","file":"dark.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/caos/css/light.css b/internal/ui/login/static/resources/themes/caos/css/light.css index 1f1a0b1767..e9168da6da 100644 --- a/internal/ui/login/static/resources/themes/caos/css/light.css +++ b/internal/ui/login/static/resources/themes/caos/css/light.css @@ -161,7 +161,8 @@ button, .button { outline: none; display: inline-block; text-align: center; - line-height: 40px; + line-height: 44px; + padding: 1px 6px; } button:hover, .button:hover { background-color: #f60075; @@ -184,6 +185,29 @@ button:disabled:hover, .button:disabled:hover { background-color: #999999; border: 1px solid #999999; } +button.google, .button.google { + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + color: #FFFFFF; + background-color: #4285F4; +} +button.google span.logo, .button.google span.logo { + height: 46px; + width: 46px; + background-color: #FFFFFF; + background-image: url("../../../images/idp/google.png"); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; +} +button.google span.provider-name, .button.google span.provider-name { + position: absolute; + left: 50%; + transform: translateX(-50%); +} input:not([type=radio]), select { background-color: #252525; @@ -546,6 +570,13 @@ html button.other-user:hover .other-user-image, html .button.other-user:hover .o background-size: 80px 60px; } } +html button.google, html .button.google { + color: #8b8d8d; + background-color: #FFFFFF; +} +html button.google span.logo, html .button.google span.logo { + background-image: url("../../../images/idp/google.png"); +} html input:not([type=radio]), html select { background-color: #FFFFFF; color: #282828; diff --git a/internal/ui/login/static/resources/themes/caos/css/light.css.map b/internal/ui/login/static/resources/themes/caos/css/light.css.map index 5bf7e126f4..aeb7aefcf1 100644 --- a/internal/ui/login/static/resources/themes/caos/css/light.css.map +++ b/internal/ui/login/static/resources/themes/caos/css/light.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA,WEzBS;EF0BT;;;AAGJ;EACI,OCnBQ;EDoBR,aC1BS;ED2BT;EACA,WEhCU;;;AFmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCvDW;EDwDX;EACA;;AAEA;EACI,OC3DY;;AD8DhB;EACI;;;AAIR;EACI,kBCvEc;EDwEd,OCtEW;EDuEX;EACA;EACA;EACA;EACA,QExFU;EFyFV;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBCnFY;EDoFZ,OCvFU;EDwFV;;AAGJ;EACI,kBC1FO;ED2FP,OC5FI;ED6FJ;;AACA;EACI,kBC7FQ;;ADiGhB;EACI,kBEvFW;EFwFX;;AAEA;EACI,kBE3FO;EF4FP;;;AAOZ;EACI,kBEnGmB;EFoGnB,OClHQ;EDmHR,QE/HU;EFgIV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EE9HN;;AACA;EFyHE;IExHA;IACA;;;AF+HA;EElIF;;AACA;EFiIE;IEhIA;IACA;;;;AFsIA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WE5JE;EF6JF;;AAGJ;EACI;EACA;EACA;EACA,OE/IC;;;AFqJT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OCpMA;;ADwMR;EACI,OE7LK;EF8LL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCnOI;EDoOJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBE7NW;;AFgOf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cEtPO;EFuPP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OElRP;;AFyRL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EE5SV;;AACA;EFuSM;IEtSJ;IACA;;;AF8SQ;EACI;EACA;EEnTd;;AACA;EFgTU;IE/SR;IACA;;;AFqTI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OE7TN;;AFkUE;EACI,OEpUL;;AFyUP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC7WI;;ADgXR;EACI,MClXU;;;ADuXd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OEpZO;;;AClCX;EACI,kBFeQ;EEdR,OFac;;AERd;EACI;;AAGJ;EACI,OFGU;;AEAd;EACI;EACA;EACA;;AAEA;EACI,kBFIa;EEHb;EACA,ODqBgB;;AClBpB;EACI,kBFVG;EEWH,ODgBgB;ECfhB;EACA;;AACA;EACI,kBFdI;;AEkBZ;EACI,kBDRO;ECSP;;AAEA;EACI,kBDZG;ECaH;;AAIR;EACI,OFhCM;;AEkCN;EACI;EACA,kBDPY;;ACYhB;EDxCV;;AACA;ECuCU;IDtCR;IACA;;;ACyCQ;EACI,kBDjBY;;ACmBZ;ED/Cd;;AACA;EC8Cc;ID7CZ;IACA;;;ACmDQ;EDtDV;;AACA;ECqDU;IDpDR;IACA;;;ACwDY;ED3Dd;;AACA;EC0Dc;IDzDZ;IACA;;;AC+DA;EACI,kBDvCoB;ECwCpB,OFrEU;;AEyEV;EACI,MF1EM;;AE6EV;EACI,MF7EA;;AEiFR;EAEQ;;;AAMR;EACI,OF3FU;;AE+Fb;EACI,OD9DM;;ACkEN;EACI,ODpEG;;;AC4EZ;ED5GF;;AACA;EC2GE;ID1GA;IACA;;;AC6GA;EDhHF;;AACA;EC+GE;ID9GA;IACA;;;;ACkHJ;EACI;;;AAGJ;EACI,OD1FY","file":"light.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCDc;EDEd,OCDQ;EDER;EACA;EACA;;;AAMJ;EACI,OCXQ;EDYR,aClBS;EDmBT;EACA,WEzBS;EF0BT;;;AAGJ;EACI,OCnBQ;EDoBR,aC1BS;ED2BT;EACA,WEhCU;;;AFmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OCvDW;EDwDX;EACA;;AAEA;EACI,OC3DY;;AD8DhB;EACI;;;AAIR;EACI,kBCvEc;EDwEd,OCtEW;EDuEX;EACA;EACA;EACA;EACA,QExFU;EFyFV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBCpFY;EDqFZ,OCxFU;EDyFV;;AAGJ;EACI,kBC3FO;ED4FP,OC7FI;ED8FJ;;AACA;EACI,kBC9FQ;;ADkGhB;EACI,kBExFW;EFyFX;;AAEA;EACI,kBE5FO;EF6FP;;AAIR;EACI;EACA;EACA;EACA;EACA,OEhGa;EFiGb,kBEhGmB;;AFkGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBE9HmB;EF+HnB,OC7IQ;ED8IR,QE1JU;EF2JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EEzJN;;AACA;EFoJE;IEnJA;IACA;;;AF0JA;EE7JF;;AACA;EF4JE;IE3JA;IACA;;;;AFiKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WEvLE;EFwLF;;AAGJ;EACI;EACA;EACA;EACA,OE1KC;;;AFgLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OC/NA;;ADmOR;EACI,OExNK;EFyNL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OC9PI;ED+PJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBExPW;;AF2Pf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cEjRO;EFkRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OE7SP;;AFoTL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EEvUV;;AACA;EFkUM;IEjUJ;IACA;;;AFyUQ;EACI;EACA;EE9Ud;;AACA;EF2UU;IE1UR;IACA;;;AFgVI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OErVN;;AF0VE;EACI,OE5VL;;AFiWP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCxYI;;AD2YR;EACI,MC7YU;;;ADkZd;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OE5aO;;;ACrCX;EACI,kBFeQ;EEdR,OFac;;AERd;EACI;;AAGJ;EACI,OFGU;;AEAd;EACI;EACA;EACA;;AAEA;EACI,kBFIa;EEHb;EACA,ODyBgB;;ACtBpB;EACI,kBFVG;EEWH,ODoBgB;ECnBhB;EACA;;AACA;EACI,kBFdI;;AEkBZ;EACI,kBDRO;ECSP;;AAEA;EACI,kBDZG;ECaH;;AAIR;EACI,OFhCM;;AEkCN;EACI;EACA,kBDHY;;ACQhB;EDxCV;;AACA;ECuCU;IDtCR;IACA;;;ACyCQ;EACI,kBDbY;;ACeZ;ED/Cd;;AACA;EC8Cc;ID7CZ;IACA;;;ACmDQ;EDtDV;;AACA;ECqDU;IDpDR;IACA;;;ACwDY;ED3Dd;;AACA;EC0Dc;IDzDZ;IACA;;;AC8DI;EACI,OD7Bc;EC8Bd,kBD7BoB;;AC+BpB;EACI;;AAKZ;EACI,kBD5CoB;EC6CpB,OF9EU;;AEkFV;EACI,MFnFM;;AEsFV;EACI,MFtFA;;AE0FR;EAEQ;;;AAMR;EACI,OFpGU;;AEwGb;EACI,ODhEM;;ACoEN;EACI,ODtEG;;;AC8EZ;EDrHF;;AACA;ECoHE;IDnHA;IACA;;;ACsHA;EDzHF;;AACA;ECwHE;IDvHA;IACA;;;;AC2HJ;EACI;;;AAGJ;EACI,OD5FY","file":"light.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/light.scss b/internal/ui/login/static/resources/themes/scss/light.scss index 0b55a06ab6..1c5b0c6b7f 100644 --- a/internal/ui/login/static/resources/themes/scss/light.scss +++ b/internal/ui/login/static/resources/themes/scss/light.scss @@ -79,6 +79,15 @@ html { } } } + + &.google { + color: $idpGoogleFontColorLight; + background-color: $idpGoogleBackgroundColorLight; + + span.logo { + background-image: url($idpGoogleImg + '.png'); + } + } } input:not([type='radio']), select { diff --git a/internal/ui/login/static/resources/themes/scss/main.scss b/internal/ui/login/static/resources/themes/scss/main.scss index 1b21a4fba8..2a43896f99 100644 --- a/internal/ui/login/static/resources/themes/scss/main.scss +++ b/internal/ui/login/static/resources/themes/scss/main.scss @@ -97,7 +97,8 @@ button, .button { outline: none; display: inline-block; text-align: center; - line-height: 40px; + line-height: 44px; + padding: 1px 6px; &:hover { background-color: $primaryColorHover; @@ -123,6 +124,32 @@ button, .button { border: 1px solid $inputBorderColor; } } + + &.google { + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + color: $idpGoogleFontColor; + background-color: $idpGoogleBackgroundColor; + + span.logo { + height: 46px; + width: 46px; + background-color: #FFFFFF; + background-image: url($idpGoogleImg + '.png'); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; + } + + span.provider-name { + position: absolute; + left: 50%; + transform: translateX(-50%); + } + } } @@ -438,4 +465,4 @@ footer { .error { color: $nokColor; -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/variables.scss b/internal/ui/login/static/resources/themes/scss/variables.scss index 1cbd3c65b5..31b23f5379 100644 --- a/internal/ui/login/static/resources/themes/scss/variables.scss +++ b/internal/ui/login/static/resources/themes/scss/variables.scss @@ -33,11 +33,15 @@ $inputBackgroundColor: #252525; $buttonBackgroundColorHover: $inputBackgroundColor; $profileImgDark: "../../../images/icon-user-dark"; $otherUserImgDark: "../../../images/icon-newuser-dark"; +$idpGoogleImg: "../../../images/idp/google"; +$idpGoogleFontColor: #FFFFFF; +$idpGoogleBackgroundColor: #4285F4; $nokColor: #F20D6B; $okColor: #0DF279; $errorColor: red; + // ----- LIGHT-THEME -------- $backgroundColorLight: #f5f5f5; $fontColorLight: $backgroundColor; @@ -47,5 +51,8 @@ $inputBackgroundColorLight: #FFFFFF; $buttonBackgroundColorHoverLight: $inputBackgroundColorLight; $profileImgLight: "../../../images/icon-user-light"; $otherUserImgLight: "../../../images/icon-newuser-light"; +$idpGoogleImgLight: "../../../images/idp/google"; +$idpGoogleFontColorLight: #8b8d8d; +$idpGoogleBackgroundColorLight: #FFFFFF; $nokColorLight: #F20D6B; $okColorLight: #50CA3D; \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/css/dark.css b/internal/ui/login/static/resources/themes/zitadel/css/dark.css index 037a0e6b6e..87f37afe9b 100644 --- a/internal/ui/login/static/resources/themes/zitadel/css/dark.css +++ b/internal/ui/login/static/resources/themes/zitadel/css/dark.css @@ -162,7 +162,8 @@ button, .button { outline: none; display: inline-block; text-align: center; - line-height: 40px; + line-height: 44px; + padding: 1px 6px; } button:hover, .button:hover { background-color: #5b8fd3; @@ -185,6 +186,29 @@ button:disabled:hover, .button:disabled:hover { background-color: #999999; border: 1px solid #999999; } +button.google, .button.google { + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + color: #FFFFFF; + background-color: #4285F4; +} +button.google span.logo, .button.google span.logo { + height: 46px; + width: 46px; + background-color: #FFFFFF; + background-image: url("../../../images/idp/google.png"); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; +} +button.google span.provider-name, .button.google span.provider-name { + position: absolute; + left: 50%; + transform: translateX(-50%); +} input:not([type=radio]), select { background-color: #252525; diff --git a/internal/ui/login/static/resources/themes/zitadel/css/dark.css.map b/internal/ui/login/static/resources/themes/zitadel/css/dark.css.map index 3e41e2309a..6bbf67f0ed 100644 --- a/internal/ui/login/static/resources/themes/zitadel/css/dark.css.map +++ b/internal/ui/login/static/resources/themes/zitadel/css/dark.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCQc;EDPd,OCQQ;EDPR;EACA;EACA;EAEI;;;AAIR;EACI,OCFQ;EDGR,aC3BS;ED4BT;EACA,WCzBS;ED0BT;;;AAGJ;EACI,OCVQ;EDWR,aCnCS;EDoCT;EACA,WChCU;;;ADmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OC9CW;ED+CX;EACA;;AAEA;EACI,OClDY;;ADqDhB;EACI;;;AAIR;EACI,kBC9Dc;ED+Dd,OC7DW;ED8DX;EACA;EACA;EACA;EACA,QCxFU;EDyFV;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBC1EY;ED2EZ,OC9EU;ED+EV;;AAGJ;EACI,kBCjFO;EDkFP,OCnFI;EDoFJ;;AACA;EACI,kBCpFQ;;ADwFhB;EACI,kBCvFW;EDwFX;;AAEA;EACI,kBC3FO;ED4FP;;;AAOZ;EACI,kBCnGmB;EDoGnB,OCzGQ;ED0GR,QC/HU;EDgIV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EC9HN;;AACA;EDyHE;ICxHA;IACA;;;AD+HA;EClIF;;AACA;EDiIE;IChIA;IACA;;;;ADsIA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WC5JE;ED6JF;;AAGJ;EACI;EACA;EACA;EACA,OC/IC;;;ADqJT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OC3LA;;AD+LR;EACI,OC7LK;ED8LL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OC1NI;ED2NJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBC7NW;;ADgOf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cCtPO;EDuPP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OClRP;;ADyRL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EC5SV;;AACA;EDuSM;ICtSJ;IACA;;;AD8SQ;EACI;EACA;ECnTd;;AACA;EDgTU;IC/SR;IACA;;;ADqTI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OC7TN;;ADkUE;EACI,OCpUL;;ADyUP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCpWI;;ADuWR;EACI,MCzWU;;;AD8Wd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OCpZO","file":"dark.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCQc;EDPd,OCQQ;EDPR;EACA;EACA;EAEI;;;AAIR;EACI,OCFQ;EDGR,aC3BS;ED4BT;EACA,WCzBS;ED0BT;;;AAGJ;EACI,OCVQ;EDWR,aCnCS;EDoCT;EACA,WChCU;;;ADmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OC9CW;ED+CX;EACA;;AAEA;EACI,OClDY;;ADqDhB;EACI;;;AAIR;EACI,kBC9Dc;ED+Dd,OC7DW;ED8DX;EACA;EACA;EACA;EACA,QCxFU;EDyFV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBC3EY;ED4EZ,OC/EU;EDgFV;;AAGJ;EACI,kBClFO;EDmFP,OCpFI;EDqFJ;;AACA;EACI,kBCrFQ;;ADyFhB;EACI,kBCxFW;EDyFX;;AAEA;EACI,kBC5FO;ED6FP;;AAIR;EACI;EACA;EACA;EACA;EACA,OChGa;EDiGb,kBChGmB;;ADkGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBC9HmB;ED+HnB,OCpIQ;EDqIR,QC1JU;ED2JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;ECzJN;;AACA;EDoJE;ICnJA;IACA;;;AD0JA;EC7JF;;AACA;ED4JE;IC3JA;IACA;;;;ADiKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WCvLE;EDwLF;;AAGJ;EACI;EACA;EACA;EACA,OC1KC;;;ADgLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OCtNA;;AD0NR;EACI,OCxNK;EDyNL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCrPI;EDsPJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBCxPW;;AD2Pf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cCjRO;EDkRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OC7SP;;ADoTL;EACI;;AAEJ;EACI;EACA;EACA;EACA;ECvUV;;AACA;EDkUM;ICjUJ;IACA;;;ADyUQ;EACI;EACA;EC9Ud;;AACA;ED2UU;IC1UR;IACA;;;ADgVI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OCrVN;;AD0VE;EACI,OC5VL;;ADiWP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC/XI;;ADkYR;EACI,MCpYU;;;ADyYd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OC5aO","file":"dark.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/css/light.css b/internal/ui/login/static/resources/themes/zitadel/css/light.css index 3b6763a38d..4890c85e1b 100644 --- a/internal/ui/login/static/resources/themes/zitadel/css/light.css +++ b/internal/ui/login/static/resources/themes/zitadel/css/light.css @@ -162,7 +162,8 @@ button, .button { outline: none; display: inline-block; text-align: center; - line-height: 40px; + line-height: 44px; + padding: 1px 6px; } button:hover, .button:hover { background-color: #5b8fd3; @@ -185,6 +186,29 @@ button:disabled:hover, .button:disabled:hover { background-color: #999999; border: 1px solid #999999; } +button.google, .button.google { + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + color: #FFFFFF; + background-color: #4285F4; +} +button.google span.logo, .button.google span.logo { + height: 46px; + width: 46px; + background-color: #FFFFFF; + background-image: url("../../../images/idp/google.png"); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; +} +button.google span.provider-name, .button.google span.provider-name { + position: absolute; + left: 50%; + transform: translateX(-50%); +} input:not([type=radio]), select { background-color: #252525; @@ -547,6 +571,13 @@ html button.other-user:hover .other-user-image, html .button.other-user:hover .o background-size: 80px 60px; } } +html button.google, html .button.google { + color: #8b8d8d; + background-color: #FFFFFF; +} +html button.google span.logo, html .button.google span.logo { + background-image: url("../../../images/idp/google.png"); +} html input:not([type=radio]), html select { background-color: #FFFFFF; color: #282828; diff --git a/internal/ui/login/static/resources/themes/zitadel/css/light.css.map b/internal/ui/login/static/resources/themes/zitadel/css/light.css.map index ddbb08b558..0383c7d816 100644 --- a/internal/ui/login/static/resources/themes/zitadel/css/light.css.map +++ b/internal/ui/login/static/resources/themes/zitadel/css/light.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCQc;EDPd,OCQQ;EDPR;EACA;EACA;EAEI;;;AAIR;EACI,OCFQ;EDGR,aC3BS;ED4BT;EACA,WCzBS;ED0BT;;;AAGJ;EACI,OCVQ;EDWR,aCnCS;EDoCT;EACA,WChCU;;;ADmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OC9CW;ED+CX;EACA;;AAEA;EACI,OClDY;;ADqDhB;EACI;;;AAIR;EACI,kBC9Dc;ED+Dd,OC7DW;ED8DX;EACA;EACA;EACA;EACA,QCxFU;EDyFV;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBC1EY;ED2EZ,OC9EU;ED+EV;;AAGJ;EACI,kBCjFO;EDkFP,OCnFI;EDoFJ;;AACA;EACI,kBCpFQ;;ADwFhB;EACI,kBCvFW;EDwFX;;AAEA;EACI,kBC3FO;ED4FP;;;AAOZ;EACI,kBCnGmB;EDoGnB,OCzGQ;ED0GR,QC/HU;EDgIV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EC9HN;;AACA;EDyHE;ICxHA;IACA;;;AD+HA;EClIF;;AACA;EDiIE;IChIA;IACA;;;;ADsIA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WC5JE;ED6JF;;AAGJ;EACI;EACA;EACA;EACA,OC/IC;;;ADqJT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OC3LA;;AD+LR;EACI,OC7LK;ED8LL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OC1NI;ED2NJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBC7NW;;ADgOf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cCtPO;EDuPP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OClRP;;ADyRL;EACI;;AAEJ;EACI;EACA;EACA;EACA;EC5SV;;AACA;EDuSM;ICtSJ;IACA;;;AD8SQ;EACI;EACA;ECnTd;;AACA;EDgTU;IC/SR;IACA;;;ADqTI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OC7TN;;ADkUE;EACI,OCpUL;;ADyUP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCpWI;;ADuWR;EACI,MCzWU;;;AD8Wd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OCpZO;;;AClCX;EACI,kBDuCmB;ECtCnB,ODsBc;ECpBV;;AAGJ;EACI;;AAGJ;EACI,ODYU;;ACTd;EACI,kBDwBe;ECvBf,ODSO;ECRP;;AAEA;EACI,kBDsBa;ECrBb;EACA,ODqBgB;;AClBpB;EACI,kBDDG;ECEH,ODgBgB;ECfhB;EACA;;AACA;EACI,kBDLI;;ACSZ;EACI,kBDRO;ECSP;;AAEA;EACI,kBDZG;ECaH;;AAIR;EACI,ODvBM;;ACyBN;EACI;EACA,kBDPY;;ACYhB;EDxCV;;AACA;ECuCU;IDtCR;IACA;;;ACyCQ;EACI,kBDjBY;;ACmBZ;ED/Cd;;AACA;EC8Cc;ID7CZ;IACA;;;ACmDQ;EDtDV;;AACA;ECqDU;IDpDR;IACA;;;ACwDY;ED3Dd;;AACA;EC0Dc;IDzDZ;IACA;;;AC+DA;EACI,kBDvCoB;ECwCpB,OD5DU;;ACgEV;EACI,MDjEM;;ACoEV;EACI,MDrDW;;ACiEnB;EACI,ODlFU;;ACsFb;EACI,OD9DM;;ACkEN;EACI,ODpEG;;;AC4EZ;ED5GF;;AACA;EC2GE;ID1GA;IACA;;;AC6GA;EDhHF;;AACA;EC+GE;ID9GA;IACA;;;;ACkHJ;EACI;;;AAGJ;EACI,OD1FY","file":"light.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA,kBCQc;EDPd,OCQQ;EDPR;EACA;EACA;EAEI;;;AAIR;EACI,OCFQ;EDGR,aC3BS;ED4BT;EACA,WCzBS;ED0BT;;;AAGJ;EACI,OCVQ;EDWR,aCnCS;EDoCT;EACA,WChCU;;;ADmCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OC9CW;ED+CX;EACA;;AAEA;EACI,OClDY;;ADqDhB;EACI;;;AAIR;EACI,kBC9Dc;ED+Dd,OC7DW;ED8DX;EACA;EACA;EACA;EACA,QCxFU;EDyFV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBC3EY;ED4EZ,OC/EU;EDgFV;;AAGJ;EACI,kBClFO;EDmFP,OCpFI;EDqFJ;;AACA;EACI,kBCrFQ;;ADyFhB;EACI,kBCxFW;EDyFX;;AAEA;EACI,kBC5FO;ED6FP;;AAIR;EACI;EACA;EACA;EACA;EACA,OChGa;EDiGb,kBChGmB;;ADkGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBC9HmB;ED+HnB,OCpIQ;EDqIR,QC1JU;ED2JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;ECzJN;;AACA;EDoJE;ICnJA;IACA;;;AD0JA;EC7JF;;AACA;ED4JE;IC3JA;IACA;;;;ADiKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WCvLE;EDwLF;;AAGJ;EACI;EACA;EACA;EACA,OC1KC;;;ADgLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OCtNA;;AD0NR;EACI,OCxNK;EDyNL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCrPI;EDsPJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBCxPW;;AD2Pf;EACI;;AAIR;EACI;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA,cCjRO;EDkRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OC7SP;;ADoTL;EACI;;AAEJ;EACI;EACA;EACA;EACA;ECvUV;;AACA;EDkUM;ICjUJ;IACA;;;ADyUQ;EACI;EACA;EC9Ud;;AACA;ED2UU;IC1UR;IACA;;;ADgVI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OCrVN;;AD0VE;EACI,OC5VL;;ADiWP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC/XI;;ADkYR;EACI,MCpYU;;;ADyYd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OC5aO;;;ACrCX;EACI,kBD2CmB;EC1CnB,ODsBc;ECpBV;;AAGJ;EACI;;AAGJ;EACI,ODYU;;ACTd;EACI,kBD4Be;EC3Bf,ODSO;ECRP;;AAEA;EACI,kBD0Ba;ECzBb;EACA,ODyBgB;;ACtBpB;EACI,kBDDG;ECEH,ODoBgB;ECnBhB;EACA;;AACA;EACI,kBDLI;;ACSZ;EACI,kBDRO;ECSP;;AAEA;EACI,kBDZG;ECaH;;AAIR;EACI,ODvBM;;ACyBN;EACI;EACA,kBDHY;;ACQhB;EDxCV;;AACA;ECuCU;IDtCR;IACA;;;ACyCQ;EACI,kBDbY;;ACeZ;ED/Cd;;AACA;EC8Cc;ID7CZ;IACA;;;ACmDQ;EDtDV;;AACA;ECqDU;IDpDR;IACA;;;ACwDY;ED3Dd;;AACA;EC0Dc;IDzDZ;IACA;;;AC8DI;EACI,OD7Bc;EC8Bd,kBD7BoB;;AC+BpB;EACI;;AAKZ;EACI,kBD5CoB;EC6CpB,ODrEU;;ACyEV;EACI,MD1EM;;AC6EV;EACI,MD1DW;;ACsEnB;EACI,OD3FU;;AC+Fb;EACI,ODhEM;;ACoEN;EACI,ODtEG;;;AC8EZ;EDrHF;;AACA;ECoHE;IDnHA;IACA;;;ACsHA;EDzHF;;AACA;ECwHE;IDvHA;IACA;;;;AC2HJ;EACI;;;AAGJ;EACI,OD5FY","file":"light.css"} \ No newline at end of file diff --git a/internal/ui/login/static/templates/error-message.html b/internal/ui/login/static/templates/error-message.html index 8bee342aa1..323d2d2624 100644 --- a/internal/ui/login/static/templates/error-message.html +++ b/internal/ui/login/static/templates/error-message.html @@ -1,9 +1,7 @@ {{ define "error-message" }} {{if .ErrMessage }} -
    -
    - {{ if .ErrType }}{{ .ErrType }} - {{end}}{{ .ErrMessage }} -
    +
    + {{ if .ErrType }}{{ .ErrType }} - {{end}}{{ .ErrMessage }}
    {{end}} {{ end }} \ No newline at end of file diff --git a/internal/ui/login/static/templates/error.html b/internal/ui/login/static/templates/error.html index b7553992f4..724c2037af 100644 --- a/internal/ui/login/static/templates/error.html +++ b/internal/ui/login/static/templates/error.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ .ErrType }} {{ .ErrMessage }}
    diff --git a/internal/ui/login/static/templates/external_not_found_option.html b/internal/ui/login/static/templates/external_not_found_option.html index a56525c689..29510b7c96 100644 --- a/internal/ui/login/static/templates/external_not_found_option.html +++ b/internal/ui/login/static/templates/external_not_found_option.html @@ -15,9 +15,7 @@
    - - {{t "Actions.Back"}} - +
    {{template "error-message" .}} diff --git a/internal/ui/login/static/templates/login.html b/internal/ui/login/static/templates/login.html index 4f84cdbdaa..0df0371c3c 100644 --- a/internal/ui/login/static/templates/login.html +++ b/internal/ui/login/static/templates/login.html @@ -42,8 +42,9 @@ {{ $reqid := .AuthReqID}} {{range $provider := .IDPProviders}} - - {{$provider.Name}} + + + {{$provider.Name}} {{end}}
    diff --git a/internal/ui/login/static/templates/register_option.html b/internal/ui/login/static/templates/register_option.html index 6e5d8e889a..b4b732ef1a 100644 --- a/internal/ui/login/static/templates/register_option.html +++ b/internal/ui/login/static/templates/register_option.html @@ -19,8 +19,9 @@ {{if .LoginPolicy.AllowExternalIDP}} {{ $reqid := .AuthReqID}} {{range $provider := .IDPProviders}} - - {{$provider.Name}} + + + {{$provider.Name}} {{end}} {{end}} diff --git a/internal/user/model/password.go b/internal/user/model/password.go index 57fb9957d6..9762dade2f 100644 --- a/internal/user/model/password.go +++ b/internal/user/model/password.go @@ -4,7 +4,7 @@ import ( "github.com/caos/zitadel/internal/crypto" caos_errs "github.com/caos/zitadel/internal/errors" es_models "github.com/caos/zitadel/internal/eventstore/models" - policy_model "github.com/caos/zitadel/internal/policy/model" + iam_model "github.com/caos/zitadel/internal/iam/model" "time" ) @@ -35,7 +35,7 @@ func (p *Password) IsValid() bool { return p.AggregateID != "" && p.SecretString != "" } -func (p *Password) HashPasswordIfExisting(policy *policy_model.PasswordComplexityPolicy, passwordAlg crypto.HashAlgorithm, onetime bool) error { +func (p *Password) HashPasswordIfExisting(policy *iam_model.PasswordComplexityPolicyView, passwordAlg crypto.HashAlgorithm, onetime bool) error { if p.SecretString == "" { return nil } diff --git a/internal/user/model/token.go b/internal/user/model/token.go new file mode 100644 index 0000000000..02113552ea --- /dev/null +++ b/internal/user/model/token.go @@ -0,0 +1,18 @@ +package model + +import ( + es_models "github.com/caos/zitadel/internal/eventstore/models" + "time" +) + +type Token struct { + es_models.ObjectRoot + + TokenID string + ApplicationID string + UserAgentID string + Audience []string + Expiration time.Time + Scopes []string + PreferredLanguage string +} diff --git a/internal/token/model/token.go b/internal/user/model/token_view.go similarity index 96% rename from internal/token/model/token.go rename to internal/user/model/token_view.go index 5f9a8d0843..d09c712897 100644 --- a/internal/token/model/token.go +++ b/internal/user/model/token_view.go @@ -6,7 +6,7 @@ import ( "github.com/caos/zitadel/internal/model" ) -type Token struct { +type TokenView struct { ID string CreationDate time.Time ChangeDate time.Time @@ -44,7 +44,7 @@ const ( type TokenSearchQuery struct { Key TokenSearchKey Method model.SearchMethod - Value string + Value interface{} } type TokenSearchResponse struct { diff --git a/internal/user/model/user.go b/internal/user/model/user.go index 5846d7d56c..197f6c5d49 100644 --- a/internal/user/model/user.go +++ b/internal/user/model/user.go @@ -1,11 +1,11 @@ package model import ( + iam_model "github.com/caos/zitadel/internal/iam/model" "strings" caos_errors "github.com/caos/zitadel/internal/errors" es_models "github.com/caos/zitadel/internal/eventstore/models" - org_model "github.com/caos/zitadel/internal/org/model" "github.com/golang/protobuf/ptypes/timestamp" ) @@ -30,7 +30,7 @@ const ( UserStateInitial ) -func (u *User) CheckOrgIAMPolicy(policy *org_model.OrgIAMPolicy) error { +func (u *User) CheckOrgIAMPolicy(policy *iam_model.OrgIAMPolicyView) error { if policy == nil { return caos_errors.ThrowPreconditionFailed(nil, "MODEL-zSH7j", "Errors.Users.OrgIamPolicyNil") } @@ -89,7 +89,7 @@ func (u *User) IsValid() bool { return u.Machine.IsValid() } -func (u *User) CheckOrgIamPolicy(policy *org_model.OrgIAMPolicy) error { +func (u *User) CheckOrgIamPolicy(policy *iam_model.OrgIAMPolicy) error { if policy == nil { return caos_errors.ThrowPreconditionFailed(nil, "MODEL-zSH7j", "Errors.Users.OrgIamPolicyNil") } diff --git a/internal/user/model/user_human.go b/internal/user/model/user_human.go index 93efa82f83..91a988b53c 100644 --- a/internal/user/model/user_human.go +++ b/internal/user/model/user_human.go @@ -1,10 +1,9 @@ package model import ( + iam_model "github.com/caos/zitadel/internal/iam/model" "time" - policy_model "github.com/caos/zitadel/internal/policy/model" - "github.com/caos/zitadel/internal/crypto" es_models "github.com/caos/zitadel/internal/eventstore/models" ) @@ -57,7 +56,7 @@ func (u *Human) IsOTPReady() bool { return u.OTP != nil && u.OTP.State == MfaStateReady } -func (u *Human) HashPasswordIfExisting(policy *policy_model.PasswordComplexityPolicy, passwordAlg crypto.HashAlgorithm, onetime bool) error { +func (u *Human) HashPasswordIfExisting(policy *iam_model.PasswordComplexityPolicyView, passwordAlg crypto.HashAlgorithm, onetime bool) error { if u.Password != nil { return u.Password.HashPasswordIfExisting(policy, passwordAlg, onetime) } diff --git a/internal/user/model/user_session_view.go b/internal/user/model/user_session_view.go index ce6cfccae2..61308571be 100644 --- a/internal/user/model/user_session_view.go +++ b/internal/user/model/user_session_view.go @@ -17,7 +17,9 @@ type UserSessionView struct { UserName string LoginName string DisplayName string + SelectedIDPConfigID string PasswordVerification time.Time + ExternalLoginVerification time.Time MfaSoftwareVerification time.Time MfaSoftwareVerificationType req_model.MfaType MfaHardwareVerification time.Time diff --git a/internal/user/repository/eventsourcing/eventstore.go b/internal/user/repository/eventsourcing/eventstore.go index d0425de443..72bb8cbbfc 100644 --- a/internal/user/repository/eventsourcing/eventstore.go +++ b/internal/user/repository/eventsourcing/eventstore.go @@ -7,23 +7,21 @@ import ( "github.com/caos/logging" "github.com/golang/protobuf/ptypes" - - "github.com/caos/zitadel/internal/errors" - "github.com/caos/zitadel/internal/id" - org_model "github.com/caos/zitadel/internal/org/model" - policy_model "github.com/caos/zitadel/internal/policy/model" - "github.com/pquerna/otp/totp" req_model "github.com/caos/zitadel/internal/auth_request/model" "github.com/caos/zitadel/internal/cache/config" sd "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" + "github.com/caos/zitadel/internal/errors" caos_errs "github.com/caos/zitadel/internal/errors" es_int "github.com/caos/zitadel/internal/eventstore" es_models "github.com/caos/zitadel/internal/eventstore/models" es_sdk "github.com/caos/zitadel/internal/eventstore/sdk" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/id" global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/tracing" usr_model "github.com/caos/zitadel/internal/user/model" "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" ) @@ -104,6 +102,9 @@ func (es *UserEventstore) UserByID(ctx context.Context, id string) (*usr_model.U if err != nil && caos_errs.IsNotFound(err) && user.Sequence == 0 { return nil, err } + if user.State == int32(usr_model.UserStateDeleted) { + return nil, caos_errs.ThrowNotFound(nil, "EVENT-6hsK9", "Errors.User.NotFound") + } es.userCache.cacheUser(user) return model.UserToModel(user), nil } @@ -116,7 +117,7 @@ func (es *UserEventstore) UserEventsByID(ctx context.Context, id string, sequenc return es.FilterEvents(ctx, query) } -func (es *UserEventstore) prepareCreateMachine(ctx context.Context, user *usr_model.User, orgIamPolicy *org_model.OrgIAMPolicy, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { +func (es *UserEventstore) prepareCreateMachine(ctx context.Context, user *usr_model.User, orgIamPolicy *iam_model.OrgIAMPolicyView, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { machine := model.UserFromModel(user) if !orgIamPolicy.UserLoginMustBeDomain { @@ -128,7 +129,7 @@ func (es *UserEventstore) prepareCreateMachine(ctx context.Context, user *usr_mo return machine, createAggregates, err } -func (es *UserEventstore) prepareCreateHuman(ctx context.Context, user *usr_model.User, pwPolicy *policy_model.PasswordComplexityPolicy, orgIAMPolicy *org_model.OrgIAMPolicy, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { +func (es *UserEventstore) prepareCreateHuman(ctx context.Context, user *usr_model.User, pwPolicy *iam_model.PasswordComplexityPolicyView, orgIAMPolicy *iam_model.OrgIAMPolicyView, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { err := user.CheckOrgIAMPolicy(orgIAMPolicy) if err != nil { return nil, nil, err @@ -160,7 +161,7 @@ func (es *UserEventstore) prepareCreateHuman(ctx context.Context, user *usr_mode return repoUser, createAggregates, err } -func (es *UserEventstore) PrepareCreateUser(ctx context.Context, user *usr_model.User, pwPolicy *policy_model.PasswordComplexityPolicy, orgIAMPolicy *org_model.OrgIAMPolicy, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { +func (es *UserEventstore) PrepareCreateUser(ctx context.Context, user *usr_model.User, pwPolicy *iam_model.PasswordComplexityPolicyView, orgIAMPolicy *iam_model.OrgIAMPolicyView, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { id, err := es.idGenerator.Next() if err != nil { return nil, nil, err @@ -175,7 +176,7 @@ func (es *UserEventstore) PrepareCreateUser(ctx context.Context, user *usr_model return nil, nil, errors.ThrowInvalidArgument(nil, "EVENT-Q29tp", "Errors.User.TypeUndefined") } -func (es *UserEventstore) CreateUser(ctx context.Context, user *usr_model.User, pwPolicy *policy_model.PasswordComplexityPolicy, orgIAMPolicy *org_model.OrgIAMPolicy) (*usr_model.User, error) { +func (es *UserEventstore) CreateUser(ctx context.Context, user *usr_model.User, pwPolicy *iam_model.PasswordComplexityPolicyView, orgIAMPolicy *iam_model.OrgIAMPolicyView) (*usr_model.User, error) { repoUser, aggregates, err := es.PrepareCreateUser(ctx, user, pwPolicy, orgIAMPolicy, "") if err != nil { return nil, err @@ -190,7 +191,7 @@ func (es *UserEventstore) CreateUser(ctx context.Context, user *usr_model.User, return model.UserToModel(repoUser), nil } -func (es *UserEventstore) PrepareRegisterUser(ctx context.Context, user *usr_model.User, externalIDP *usr_model.ExternalIDP, policy *policy_model.PasswordComplexityPolicy, orgIAMPolicy *org_model.OrgIAMPolicy, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { +func (es *UserEventstore) PrepareRegisterUser(ctx context.Context, user *usr_model.User, externalIDP *usr_model.ExternalIDP, policy *iam_model.PasswordComplexityPolicyView, orgIAMPolicy *iam_model.OrgIAMPolicyView, resourceOwner string) (*model.User, []*es_models.Aggregate, error) { if user.Human == nil { return nil, nil, caos_errs.ThrowInvalidArgument(nil, "EVENT-ht8Ux", "Errors.User.Invalid") } @@ -232,7 +233,7 @@ func (es *UserEventstore) PrepareRegisterUser(ctx context.Context, user *usr_mod return repoUser, aggregates, err } -func (es *UserEventstore) RegisterUser(ctx context.Context, user *usr_model.User, pwPolicy *policy_model.PasswordComplexityPolicy, orgIAMPolicy *org_model.OrgIAMPolicy, resourceOwner string) (*usr_model.User, error) { +func (es *UserEventstore) RegisterUser(ctx context.Context, user *usr_model.User, pwPolicy *iam_model.PasswordComplexityPolicyView, orgIAMPolicy *iam_model.OrgIAMPolicyView, resourceOwner string) (*usr_model.User, error) { repoUser, createAggregates, err := es.PrepareRegisterUser(ctx, user, nil, pwPolicy, orgIAMPolicy, resourceOwner) if err != nil { return nil, err @@ -323,6 +324,28 @@ func (es *UserEventstore) UnlockUser(ctx context.Context, id string) (*usr_model return model.UserToModel(repoUser), nil } +func (es *UserEventstore) PrepareRemoveUser(ctx context.Context, id string, orgIamPolicy *iam_model.OrgIAMPolicyView) (*model.User, []*es_models.Aggregate, error) { + user, err := es.UserByID(ctx, id) + if err != nil { + return nil, nil, err + } + + repoUser := model.UserFromModel(user) + aggregate, err := UserRemoveAggregate(ctx, es.AggregateCreator(), repoUser, orgIamPolicy.UserLoginMustBeDomain) + if err != nil { + return nil, nil, err + } + return repoUser, aggregate, nil +} + +func (es *UserEventstore) RemoveUser(ctx context.Context, id string, orgIamPolicy *iam_model.OrgIAMPolicyView) error { + repoUser, aggregate, err := es.PrepareRemoveUser(ctx, id, orgIamPolicy) + if err != nil { + return err + } + return es_sdk.PushAggregates(ctx, es.PushAggregates, repoUser.AppendEvents, aggregate...) +} + func (es *UserEventstore) UserChanges(ctx context.Context, id string, lastSequence uint64, limit uint64, sortAscending bool) (*usr_model.UserChanges, error) { query := ChangesQuery(id, lastSequence, limit, sortAscending) @@ -450,7 +473,7 @@ func (es *UserEventstore) InitCodeSent(ctx context.Context, userID string) error return nil } -func (es *UserEventstore) VerifyInitCode(ctx context.Context, policy *policy_model.PasswordComplexityPolicy, userID, verificationCode, password string) error { +func (es *UserEventstore) VerifyInitCode(ctx context.Context, policy *iam_model.PasswordComplexityPolicyView, userID, verificationCode, password string) error { if userID == "" { return caos_errs.ThrowPreconditionFailed(nil, "EVENT-lo9fd", "Errors.User.UserIDMissing") } @@ -531,7 +554,9 @@ func (es *UserEventstore) UserPasswordByID(ctx context.Context, userID string) ( return nil, caos_errs.ThrowNotFound(nil, "EVENT-d8e2", "Errors.User.Password.NotFound") } -func (es *UserEventstore) CheckPassword(ctx context.Context, userID, password string, authRequest *req_model.AuthRequest) error { +func (es *UserEventstore) CheckPassword(ctx context.Context, userID, password string, authRequest *req_model.AuthRequest) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() user, err := es.UserByID(ctx, userID) if err != nil { return err @@ -542,7 +567,10 @@ func (es *UserEventstore) CheckPassword(ctx context.Context, userID, password st if user.Password == nil { return caos_errs.ThrowPreconditionFailed(nil, "EVENT-s35Fa", "Errors.User.Password.Empty") } - if err := crypto.CompareHash(user.Password.SecretCrypto, []byte(password), es.PasswordAlg); err == nil { + ctx, spanPasswordComparison := tracing.NewNamedSpan(ctx, "crypto.CompareHash") + err = crypto.CompareHash(user.Password.SecretCrypto, []byte(password), es.PasswordAlg) + spanPasswordComparison.EndWithError(err) + if err == nil { return es.setPasswordCheckResult(ctx, user, authRequest, PasswordCheckSucceededAggregate) } if err := es.setPasswordCheckResult(ctx, user, authRequest, PasswordCheckFailedAggregate); err != nil { @@ -551,11 +579,13 @@ func (es *UserEventstore) CheckPassword(ctx context.Context, userID, password st return caos_errs.ThrowInvalidArgument(nil, "EVENT-452ad", "Errors.User.Password.Invalid") } -func (es *UserEventstore) setPasswordCheckResult(ctx context.Context, user *usr_model.User, authRequest *req_model.AuthRequest, check func(*es_models.AggregateCreator, *model.User, *model.AuthRequest) es_sdk.AggregateFunc) error { +func (es *UserEventstore) setPasswordCheckResult(ctx context.Context, user *usr_model.User, authRequest *req_model.AuthRequest, check func(*es_models.AggregateCreator, *model.User, *model.AuthRequest) es_sdk.AggregateFunc) (err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() repoUser := model.UserFromModel(user) repoAuthRequest := model.AuthRequestFromModel(authRequest) agg := check(es.AggregateCreator(), repoUser, repoAuthRequest) - err := es_sdk.Push(ctx, es.PushAggregates, repoUser.AppendEvents, agg) + err = es_sdk.Push(ctx, es.PushAggregates, repoUser.AppendEvents, agg) if err != nil { return err } @@ -563,7 +593,7 @@ func (es *UserEventstore) setPasswordCheckResult(ctx context.Context, user *usr_ return nil } -func (es *UserEventstore) SetOneTimePassword(ctx context.Context, policy *policy_model.PasswordComplexityPolicy, password *usr_model.Password) (*usr_model.Password, error) { +func (es *UserEventstore) SetOneTimePassword(ctx context.Context, policy *iam_model.PasswordComplexityPolicyView, password *usr_model.Password) (*usr_model.Password, error) { user, err := es.UserByID(ctx, password.AggregateID) if err != nil { return nil, err @@ -574,7 +604,7 @@ func (es *UserEventstore) SetOneTimePassword(ctx context.Context, policy *policy return es.changedPassword(ctx, user, policy, password.SecretString, true) } -func (es *UserEventstore) SetPassword(ctx context.Context, policy *policy_model.PasswordComplexityPolicy, userID, code, password string) error { +func (es *UserEventstore) SetPassword(ctx context.Context, policy *iam_model.PasswordComplexityPolicyView, userID, code, password string) error { user, err := es.UserByID(ctx, userID) if err != nil { return err @@ -592,6 +622,46 @@ func (es *UserEventstore) SetPassword(ctx context.Context, policy *policy_model. return err } +func (es *UserEventstore) ExternalLoginChecked(ctx context.Context, userID string, authRequest *req_model.AuthRequest) error { + user, err := es.UserByID(ctx, userID) + if err != nil { + return err + } + if user.Human == nil { + return errors.ThrowPreconditionFailed(nil, "EVENT-Gns8i", "Errors.User.NotHuman") + } + repoUser := model.UserFromModel(user) + repoAuthRequest := model.AuthRequestFromModel(authRequest) + agg := ExternalLoginCheckSucceededAggregate(es.AggregateCreator(), repoUser, repoAuthRequest) + err = es_sdk.Push(ctx, es.PushAggregates, repoUser.AppendEvents, agg) + if err != nil { + return err + } + es.userCache.cacheUser(repoUser) + return nil +} + +func (es *UserEventstore) TokenAdded(ctx context.Context, token *usr_model.Token) (*usr_model.Token, error) { + user, err := es.UserByID(ctx, token.AggregateID) + if err != nil { + return nil, err + } + id, err := es.idGenerator.Next() + if err != nil { + return nil, err + } + token.TokenID = id + repoUser := model.UserFromModel(user) + repoToken := model.TokenFromModel(token) + agg := TokenAddedAggregate(es.AggregateCreator(), repoUser, repoToken) + err = es_sdk.Push(ctx, es.PushAggregates, repoToken.AppendEvents, agg) + if err != nil { + return nil, err + } + es.userCache.cacheUser(repoUser) + return model.TokenToModel(repoToken), nil +} + func (es *UserEventstore) ChangeMachine(ctx context.Context, machine *usr_model.Machine) (*usr_model.Machine, error) { user, err := es.UserByID(ctx, machine.AggregateID) if err != nil { @@ -614,7 +684,9 @@ func (es *UserEventstore) ChangeMachine(ctx context.Context, machine *usr_model. return model.MachineToModel(repoUser.Machine), nil } -func (es *UserEventstore) ChangePassword(ctx context.Context, policy *policy_model.PasswordComplexityPolicy, userID, old, new string) (*usr_model.Password, error) { +func (es *UserEventstore) ChangePassword(ctx context.Context, policy *iam_model.PasswordComplexityPolicyView, userID, old, new string) (_ *usr_model.Password, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() user, err := es.UserByID(ctx, userID) if err != nil { return nil, err @@ -625,15 +697,20 @@ func (es *UserEventstore) ChangePassword(ctx context.Context, policy *policy_mod if user.Password == nil { return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-Fds3s", "Errors.User.Password.Empty") } - if err := crypto.CompareHash(user.Password.SecretCrypto, []byte(old), es.PasswordAlg); err != nil { + ctx, spanPasswordComparison := tracing.NewNamedSpan(ctx, "crypto.CompareHash") + err = crypto.CompareHash(user.Password.SecretCrypto, []byte(old), es.PasswordAlg) + spanPasswordComparison.EndWithError(err) + if err != nil { return nil, caos_errs.ThrowInvalidArgument(nil, "EVENT-s56a3", "Errors.User.Password.Invalid") } return es.changedPassword(ctx, user, policy, new, false) } -func (es *UserEventstore) changedPassword(ctx context.Context, user *usr_model.User, policy *policy_model.PasswordComplexityPolicy, password string, onetime bool) (*usr_model.Password, error) { +func (es *UserEventstore) changedPassword(ctx context.Context, user *usr_model.User, policy *iam_model.PasswordComplexityPolicyView, password string, onetime bool) (_ *usr_model.Password, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() pw := &usr_model.Password{SecretString: password} - err := pw.HashPasswordIfExisting(policy, es.PasswordAlg, onetime) + err = pw.HashPasswordIfExisting(policy, es.PasswordAlg, onetime) if err != nil { return nil, err } @@ -1385,7 +1462,7 @@ func (es *UserEventstore) DomainClaimedSent(ctx context.Context, userID string) return nil } -func (es *UserEventstore) ChangeUsername(ctx context.Context, userID, username string, orgIamPolicy *org_model.OrgIAMPolicy) error { +func (es *UserEventstore) ChangeUsername(ctx context.Context, userID, username string, orgIamPolicy *iam_model.OrgIAMPolicyView) error { user, err := es.UserByID(ctx, userID) if err != nil { return err diff --git a/internal/user/repository/eventsourcing/eventstore_mock_test.go b/internal/user/repository/eventsourcing/eventstore_mock_test.go index 44c8daff5c..ec0e0cc9e0 100644 --- a/internal/user/repository/eventsourcing/eventstore_mock_test.go +++ b/internal/user/repository/eventsourcing/eventstore_mock_test.go @@ -472,8 +472,8 @@ func GetMockManipulateUserWithExternalIDP(ctrl *gomock.Controller) *UserEventsto dataUser, _ := json.Marshal(user) dataIDP, _ := json.Marshal(externalIDP) events := []*es_models.Event{ - {AggregateID: "AggregateID", AggregateVersion: "v1", Sequence: 1, Type: model.UserAdded, Data: dataUser}, - {AggregateID: "AggregateID", AggregateVersion: "v1", Sequence: 1, Type: model.HumanExternalIDPAdded, Data: dataIDP}, + {AggregateID: "AggregateID", AggregateVersion: "v1", Sequence: 1, Type: model.UserAdded, Data: dataUser, ResourceOwner: "ResourceOwner"}, + {AggregateID: "AggregateID", AggregateVersion: "v1", Sequence: 1, Type: model.HumanExternalIDPAdded, Data: dataIDP, ResourceOwner: "ResourceOwner"}, } mockEs := mock.NewMockEventstore(ctrl) mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) diff --git a/internal/user/repository/eventsourcing/eventstore_test.go b/internal/user/repository/eventsourcing/eventstore_test.go index 2d1265341e..9dba522daf 100644 --- a/internal/user/repository/eventsourcing/eventstore_test.go +++ b/internal/user/repository/eventsourcing/eventstore_test.go @@ -3,6 +3,7 @@ package eventsourcing import ( "context" "encoding/json" + iam_model "github.com/caos/zitadel/internal/iam/model" "net" "testing" "time" @@ -14,8 +15,6 @@ import ( "github.com/caos/zitadel/internal/crypto" caos_errs "github.com/caos/zitadel/internal/errors" es_models "github.com/caos/zitadel/internal/eventstore/models" - org_model "github.com/caos/zitadel/internal/org/model" - policy_model "github.com/caos/zitadel/internal/policy/model" "github.com/caos/zitadel/internal/user/model" repo_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" ) @@ -95,8 +94,8 @@ func TestCreateUser(t *testing.T) { es *UserEventstore ctx context.Context user *model.User - policy *policy_model.PasswordComplexityPolicy - orgPolicy *org_model.OrgIAMPolicy + policy *iam_model.PasswordComplexityPolicyView + orgPolicy *iam_model.OrgIAMPolicyView } type res struct { user *model.User @@ -133,8 +132,8 @@ func TestCreateUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, }, res: res{ user: &model.User{ @@ -176,8 +175,8 @@ func TestCreateUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{UserLoginMustBeDomain: false}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{UserLoginMustBeDomain: false}, }, res: res{ user: &model.User{ObjectRoot: es_models.ObjectRoot{Sequence: 1}, @@ -226,8 +225,8 @@ func TestCreateUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, }, res: res{ user: &model.User{ObjectRoot: es_models.ObjectRoot{Sequence: 1}, @@ -275,8 +274,8 @@ func TestCreateUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, }, res: res{ user: &model.User{ObjectRoot: es_models.ObjectRoot{Sequence: 1}, @@ -301,8 +300,8 @@ func TestCreateUser(t *testing.T) { es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), user: &model.User{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Human: &model.Human{}}, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -314,7 +313,7 @@ func TestCreateUser(t *testing.T) { es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), user: &model.User{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Human: &model.Human{}}, - orgPolicy: &org_model.OrgIAMPolicy{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -326,7 +325,7 @@ func TestCreateUser(t *testing.T) { es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), user: &model.User{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 1}, Human: &model.Human{}}, - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -367,8 +366,8 @@ func TestRegisterUser(t *testing.T) { ctx context.Context user *model.User resourceOwner string - policy *policy_model.PasswordComplexityPolicy - orgPolicy *org_model.OrgIAMPolicy + policy *iam_model.PasswordComplexityPolicyView + orgPolicy *iam_model.OrgIAMPolicyView } type res struct { user *model.User @@ -406,8 +405,8 @@ func TestRegisterUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{UserLoginMustBeDomain: true}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{UserLoginMustBeDomain: true}, resourceOwner: "ResourceOwner", }, res: res{ @@ -450,8 +449,8 @@ func TestRegisterUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{UserLoginMustBeDomain: false}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{UserLoginMustBeDomain: false}, resourceOwner: "ResourceOwner", }, res: res{ @@ -476,8 +475,8 @@ func TestRegisterUser(t *testing.T) { es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), user: &model.User{ObjectRoot: es_models.ObjectRoot{Sequence: 1}, Human: &model.Human{}}, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, resourceOwner: "ResourceOwner", }, res: res{ @@ -502,8 +501,8 @@ func TestRegisterUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, resourceOwner: "ResourceOwner", }, res: res{ @@ -528,8 +527,8 @@ func TestRegisterUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, - orgPolicy: &org_model.OrgIAMPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -553,7 +552,7 @@ func TestRegisterUser(t *testing.T) { }, }, }, - orgPolicy: &org_model.OrgIAMPolicy{}, + orgPolicy: &iam_model.OrgIAMPolicyView{}, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -577,7 +576,7 @@ func TestRegisterUser(t *testing.T) { }, }, }, - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, }, res: res{ errFunc: caos_errs.IsPreconditionFailed, @@ -1078,7 +1077,7 @@ func TestInitCodeVerify(t *testing.T) { type args struct { es *UserEventstore ctx context.Context - policy *policy_model.PasswordComplexityPolicy + policy *iam_model.PasswordComplexityPolicyView userID string verifyCode string password string @@ -1105,7 +1104,7 @@ func TestInitCodeVerify(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, verifyCode: "code", userID: "userID", }, @@ -1125,7 +1124,7 @@ func TestInitCodeVerify(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", verifyCode: "code", password: "password", @@ -1145,7 +1144,7 @@ func TestInitCodeVerify(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", verifyCode: "code", password: "password", @@ -1156,7 +1155,7 @@ func TestInitCodeVerify(t *testing.T) { args: args{ es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "", verifyCode: "code", password: "password", @@ -1170,7 +1169,7 @@ func TestInitCodeVerify(t *testing.T) { args: args{ es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{HasNumber: true}, + policy: &iam_model.PasswordComplexityPolicyView{HasNumber: true}, userID: "userID", verifyCode: "code", password: "password", @@ -1184,7 +1183,7 @@ func TestInitCodeVerify(t *testing.T) { args: args{ es: GetMockManipulateUserNoEventsWithPw(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", password: "password", verifyCode: "code", @@ -1352,7 +1351,7 @@ func TestSetOneTimePassword(t *testing.T) { type args struct { es *UserEventstore ctx context.Context - policy *policy_model.PasswordComplexityPolicy + policy *iam_model.PasswordComplexityPolicyView password *model.Password } type res struct { @@ -1369,7 +1368,7 @@ func TestSetOneTimePassword(t *testing.T) { args: args{ es: GetMockManipulateUserWithPasswordCodeGen(ctrl, repo_model.User{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, Human: &repo_model.Human{}}), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, password: &model.Password{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SecretString: "Password"}, }, res: res{ @@ -1381,7 +1380,7 @@ func TestSetOneTimePassword(t *testing.T) { args: args{ es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, password: &model.Password{ObjectRoot: es_models.ObjectRoot{AggregateID: ""}, SecretString: "Password"}, }, res: res{ @@ -1393,7 +1392,7 @@ func TestSetOneTimePassword(t *testing.T) { args: args{ es: GetMockManipulateUserNoEvents(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, password: &model.Password{ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID"}, SecretString: "Password"}, }, res: res{ @@ -1557,7 +1556,7 @@ func TestSetPassword(t *testing.T) { type args struct { es *UserEventstore ctx context.Context - policy *policy_model.PasswordComplexityPolicy + policy *iam_model.PasswordComplexityPolicyView userID string code string password string @@ -1587,7 +1586,7 @@ func TestSetPassword(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", code: "code", password: "password", @@ -1599,7 +1598,7 @@ func TestSetPassword(t *testing.T) { args: args{ es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "", code: "code", password: "password", @@ -1613,7 +1612,7 @@ func TestSetPassword(t *testing.T) { args: args{ es: GetMockManipulateUserNoEvents(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", code: "code", password: "password", @@ -1632,7 +1631,7 @@ func TestSetPassword(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", code: "code", password: "password", @@ -1658,7 +1657,7 @@ func TestSetPassword(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", code: "code", password: "password", @@ -1687,7 +1686,7 @@ func TestChangePassword(t *testing.T) { type args struct { es *UserEventstore ctx context.Context - policy *policy_model.PasswordComplexityPolicy + policy *iam_model.PasswordComplexityPolicyView userID string old string new string @@ -1717,7 +1716,7 @@ func TestChangePassword(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", old: "old", new: "new", @@ -1731,7 +1730,7 @@ func TestChangePassword(t *testing.T) { args: args{ es: GetMockManipulateUser(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "", old: "old", new: "new", @@ -1745,7 +1744,7 @@ func TestChangePassword(t *testing.T) { args: args{ es: GetMockManipulateUserNoEvents(ctrl), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", old: "old", new: "new", @@ -1764,7 +1763,7 @@ func TestChangePassword(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", old: "old", new: "new", @@ -1789,7 +1788,7 @@ func TestChangePassword(t *testing.T) { }, ), ctx: authz.NewMockContext("orgID", "userID"), - policy: &policy_model.PasswordComplexityPolicy{}, + policy: &iam_model.PasswordComplexityPolicyView{}, userID: "userID", old: "old", new: "new", diff --git a/internal/user/repository/eventsourcing/model/auth_request.go b/internal/user/repository/eventsourcing/model/auth_request.go index fc3744517e..e66d88257c 100644 --- a/internal/user/repository/eventsourcing/model/auth_request.go +++ b/internal/user/repository/eventsourcing/model/auth_request.go @@ -1,22 +1,28 @@ package model import ( + "encoding/json" + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" "net" "github.com/caos/zitadel/internal/auth_request/model" ) type AuthRequest struct { - ID string `json:"id,omitempty"` - UserAgentID string `json:"userAgentID,omitempty"` + ID string `json:"id,omitempty"` + UserAgentID string `json:"userAgentID,omitempty"` + SelectedIDPConfigID string `json:"selectedIDPConfigID,omitempty"` *BrowserInfo } func AuthRequestFromModel(request *model.AuthRequest) *AuthRequest { return &AuthRequest{ - ID: request.ID, - UserAgentID: request.AgentID, - BrowserInfo: BrowserInfoFromModel(request.BrowserInfo), + ID: request.ID, + UserAgentID: request.AgentID, + BrowserInfo: BrowserInfoFromModel(request.BrowserInfo), + SelectedIDPConfigID: request.SelectedIDPConfigID, } } @@ -33,3 +39,11 @@ func BrowserInfoFromModel(info *model.BrowserInfo) *BrowserInfo { RemoteIP: info.RemoteIP, } } + +func (a *AuthRequest) SetData(event *es_models.Event) error { + if err := json.Unmarshal(event.Data, a); err != nil { + logging.Log("EVEN-T5df6").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-yGmhh", "could not unmarshal event") + } + return nil +} diff --git a/internal/user/repository/eventsourcing/model/token.go b/internal/user/repository/eventsourcing/model/token.go new file mode 100644 index 0000000000..d562cece7e --- /dev/null +++ b/internal/user/repository/eventsourcing/model/token.go @@ -0,0 +1,80 @@ +package model + +import ( + "encoding/json" + "time" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/user/model" +) + +type Token struct { + es_models.ObjectRoot + + TokenID string `json:"tokenId" gorm:"column:token_id"` + ApplicationID string `json:"applicationId" gorm:"column:application_id"` + UserAgentID string `json:"userAgentId" gorm:"column:user_agent_id"` + Audience []string `json:"audience" gorm:"column:audience"` + Scopes []string `json:"scopes" gorm:"column:scopes"` + Expiration time.Time `json:"expiration" gorm:"column:expiration"` + PreferredLanguage string `json:"preferredLanguage" gorm:"column:preferred_language"` +} + +func TokenFromModel(token *model.Token) *Token { + return &Token{ + ObjectRoot: token.ObjectRoot, + TokenID: token.TokenID, + ApplicationID: token.ApplicationID, + UserAgentID: token.UserAgentID, + Audience: token.Audience, + Scopes: token.Scopes, + Expiration: token.Expiration, + PreferredLanguage: token.PreferredLanguage, + } +} + +func TokenToModel(token *Token) *model.Token { + return &model.Token{ + ObjectRoot: token.ObjectRoot, + TokenID: token.TokenID, + ApplicationID: token.ApplicationID, + UserAgentID: token.UserAgentID, + Audience: token.Audience, + Scopes: token.Scopes, + Expiration: token.Expiration, + PreferredLanguage: token.PreferredLanguage, + } +} + +func (t *Token) AppendEvents(events ...*es_models.Event) error { + for _, event := range events { + if err := t.AppendEvent(event); err != nil { + return err + } + } + + return nil +} + +func (t *Token) AppendEvent(event *es_models.Event) error { + switch event.Type { + case UserTokenAdded: + err := t.setData(event) + if err != nil { + return err + } + t.CreationDate = event.CreationDate + } + return nil +} + +func (t *Token) setData(event *es_models.Event) error { + t.ObjectRoot.AppendEvent(event) + if err := json.Unmarshal(event.Data, t); err != nil { + logging.Log("EVEN-4Fm9s").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-5Gms9", "could not unmarshal event") + } + return nil +} diff --git a/internal/user/repository/eventsourcing/model/types.go b/internal/user/repository/eventsourcing/model/types.go index 3571538d8f..bc5efdf1a1 100644 --- a/internal/user/repository/eventsourcing/model/types.go +++ b/internal/user/repository/eventsourcing/model/types.go @@ -67,6 +67,8 @@ const ( UserDeactivated models.EventType = "user.deactivated" UserReactivated models.EventType = "user.reactivated" UserRemoved models.EventType = "user.removed" + + UserTokenAdded models.EventType = "user.token.added" ) // the following consts are for user(v2).human @@ -84,6 +86,8 @@ const ( HumanPasswordCheckSucceeded models.EventType = "user.human.password.check.succeeded" HumanPasswordCheckFailed models.EventType = "user.human.password.check.failed" + HumanExternalLoginCheckSucceeded models.EventType = "user.human.externallogin.check.succeeded" + HumanExternalIDPReserved models.EventType = "user.human.externalidp.reserved" HumanExternalIDPReleased models.EventType = "user.human.externalidp.released" diff --git a/internal/user/repository/eventsourcing/model/user.go b/internal/user/repository/eventsourcing/model/user.go index 02127bbf72..d97ace7685 100644 --- a/internal/user/repository/eventsourcing/model/user.go +++ b/internal/user/repository/eventsourcing/model/user.go @@ -94,6 +94,8 @@ func (u *User) AppendEvent(event *es_models.Event) error { u.appendLockedEvent() case UserUnlocked: u.appendUnlockedEvent() + case UserRemoved: + u.appendRemovedEvent() } if u.Human != nil { @@ -138,3 +140,7 @@ func (u *User) appendLockedEvent() { func (u *User) appendUnlockedEvent() { u.State = int32(model.UserStateActive) } + +func (u *User) appendRemovedEvent() { + u.State = int32(model.UserStateDeleted) +} diff --git a/internal/user/repository/eventsourcing/user.go b/internal/user/repository/eventsourcing/user.go index ca79d9add5..3dcf50a0d4 100644 --- a/internal/user/repository/eventsourcing/user.go +++ b/internal/user/repository/eventsourcing/user.go @@ -282,7 +282,7 @@ func releasedUniqueUserNameAggregate(ctx context.Context, aggCreator *es_models. return nil, err } - return aggregate.SetPrecondition(UserUserNameUniqueQuery(uniqueUserName), isEventValidation(aggregate, model.UserUserNameReserved)), nil + return aggregate.SetPrecondition(UserUserNameUniqueQuery(uniqueUserName), isEventValidation(aggregate, model.UserUserNameReleased)), nil } func changeUniqueUserNameAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, resourceOwner, oldUsername, username string, userLoginMustBeDomain bool) ([]*es_models.Aggregate, error) { @@ -315,6 +315,25 @@ func UserUnlockAggregate(aggCreator *es_models.AggregateCreator, user *model.Use return userStateAggregate(aggCreator, user, model.UserUnlocked) } +func UserRemoveAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, user *model.User, userLoginMustBeDomain bool) ([]*es_models.Aggregate, error) { + agg, err := UserAggregate(ctx, aggCreator, user) + if err != nil { + return nil, err + } + agg, err = agg.AppendEvent(model.UserRemoved, nil) + if err != nil { + return nil, err + } + uniqueAgg, err := releasedUniqueUserNameAggregate(ctx, aggCreator, user.ResourceOwner, user.UserName, userLoginMustBeDomain) + if err != nil { + return nil, err + } + return []*es_models.Aggregate{ + agg, + uniqueAgg, + }, nil +} + func userStateAggregate(aggCreator *es_models.AggregateCreator, user *model.User, state es_models.EventType) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { agg, err := UserAggregate(ctx, aggCreator, user) @@ -445,6 +464,26 @@ func PasswordCodeSentAggregate(aggCreator *es_models.AggregateCreator, user *mod } } +func ExternalLoginCheckSucceededAggregate(aggCreator *es_models.AggregateCreator, user *model.User, check *model.AuthRequest) es_sdk.AggregateFunc { + return func(ctx context.Context) (*es_models.Aggregate, error) { + agg, err := UserAggregateOverwriteContext(ctx, aggCreator, user, user.ResourceOwner, user.AggregateID) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.HumanExternalLoginCheckSucceeded, check) + } +} + +func TokenAddedAggregate(aggCreator *es_models.AggregateCreator, user *model.User, token *model.Token) es_sdk.AggregateFunc { + return func(ctx context.Context) (*es_models.Aggregate, error) { + agg, err := UserAggregateOverwriteContext(ctx, aggCreator, user, user.ResourceOwner, user.AggregateID) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.UserTokenAdded, token) + } +} + func MachineChangeAggregate(aggCreator *es_models.AggregateCreator, user *model.User, machine *model.Machine) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { if machine == nil { @@ -797,7 +836,7 @@ func ExternalIDPRemovedAggregate(ctx context.Context, aggCreator *es_models.Aggr } aggregates := make([]*es_models.Aggregate, 0) - agg, err := UserAggregate(ctx, aggCreator, user) + agg, err := UserAggregateOverwriteContext(ctx, aggCreator, user, user.ResourceOwner, authz.GetCtxData(ctx).UserID) if err != nil { return nil, err } @@ -806,7 +845,7 @@ func ExternalIDPRemovedAggregate(ctx context.Context, aggCreator *es_models.Aggr } else { agg, err = agg.AppendEvent(model.HumanExternalIDPRemoved, externalIDP) } - uniqueReleasedAggregate, err := releasedUniqueExternalIDPAggregate(ctx, aggCreator, externalIDP) + uniqueReleasedAggregate, err := releasedUniqueExternalIDPAggregate(ctx, aggCreator, externalIDP, user.ResourceOwner) if err != nil { return nil, err } @@ -831,9 +870,10 @@ func reservedUniqueExternalIDPAggregate(ctx context.Context, aggCreator *es_mode return aggregate.SetPrecondition(UserExternalIDPUniqueQuery(uniqueExternlIDP), isEventValidation(aggregate, model.HumanExternalIDPReserved)), nil } -func releasedUniqueExternalIDPAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, externalIDP *model.ExternalIDP) (aggregate *es_models.Aggregate, err error) { +func releasedUniqueExternalIDPAggregate(ctx context.Context, aggCreator *es_models.AggregateCreator, externalIDP *model.ExternalIDP, resourceOwnerID string) (aggregate *es_models.Aggregate, err error) { uniqueExternlIDP := externalIDP.IDPConfigID + externalIDP.UserID - aggregate, err = aggCreator.NewAggregate(ctx, uniqueExternlIDP, model.UserExternalIDPAggregate, model.UserVersion, 0) + aggregate, err = aggCreator.NewAggregate(ctx, uniqueExternlIDP, model.UserExternalIDPAggregate, model.UserVersion, 0, es_models.OverwriteResourceOwner(resourceOwnerID), es_models.OverwriteEditorUser(authz.GetCtxData(ctx).UserID)) + if err != nil { return nil, err } diff --git a/internal/user/repository/eventsourcing/user_test.go b/internal/user/repository/eventsourcing/user_test.go index 7d4b978ef6..9e5917b150 100644 --- a/internal/user/repository/eventsourcing/user_test.go +++ b/internal/user/repository/eventsourcing/user_test.go @@ -2388,8 +2388,9 @@ func TestExternalIDPRemovedAggregates(t *testing.T) { aggCreator: models.NewAggregateCreator("test"), user: &model.User{ ObjectRoot: models.ObjectRoot{ - AggregateID: "AggregateID", - Sequence: 5, + AggregateID: "AggregateID", + Sequence: 5, + ResourceOwner: "ResourceOwner", }, }, externalIDP: &model.ExternalIDP{ diff --git a/internal/user/repository/view/external_idp_view.go b/internal/user/repository/view/external_idp_view.go index cd1e5d5f78..ce01d3d459 100644 --- a/internal/user/repository/view/external_idp_view.go +++ b/internal/user/repository/view/external_idp_view.go @@ -115,3 +115,8 @@ func DeleteExternalIDP(db *gorm.DB, table, externalUserID, idpConfigID string) e ) return delete(db) } + +func DeleteExternalIDPsByUserID(db *gorm.DB, table, userID string) error { + delete := repository.PrepareDeleteByKey(table, model.ExternalIDPSearchKey(usr_model.ExternalIDPSearchKeyUserID), userID) + return delete(db) +} diff --git a/internal/user/repository/view/model/notify_user.go b/internal/user/repository/view/model/notify_user.go index 51260ef903..b5a5e687f6 100644 --- a/internal/user/repository/view/model/notify_user.go +++ b/internal/user/repository/view/model/notify_user.go @@ -2,6 +2,7 @@ package model import ( "encoding/json" + iam_model "github.com/caos/zitadel/internal/iam/model" "time" "github.com/caos/logging" @@ -95,7 +96,7 @@ func (u *NotifyUser) GenerateLoginName(domain string, appendDomain bool) string return u.UserName + "@" + domain } -func (u *NotifyUser) SetLoginNames(policy *org_model.OrgIAMPolicy, domains []*org_model.OrgDomain) { +func (u *NotifyUser) SetLoginNames(policy *iam_model.OrgIAMPolicy, domains []*org_model.OrgDomain) { loginNames := make([]string, 0) for _, d := range domains { if d.Verified { diff --git a/internal/user/repository/view/model/token.go b/internal/user/repository/view/model/token.go new file mode 100644 index 0000000000..725132ad52 --- /dev/null +++ b/internal/user/repository/view/model/token.go @@ -0,0 +1,127 @@ +package model + +import ( + "encoding/json" + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + usr_model "github.com/caos/zitadel/internal/user/model" + usr_es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" + "time" + + "github.com/lib/pq" +) + +const ( + TokenKeyTokenID = "id" + TokenKeyUserID = "user_id" + TokenKeyApplicationID = "application_id" + TokenKeyUserAgentID = "user_agent_id" + TokenKeyExpiration = "expiration" + TokenKeyResourceOwner = "resource_owner" +) + +type TokenView struct { + ID string `json:"tokenId" gorm:"column:id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + ResourceOwner string `json:"-" gorm:"column:resource_owner"` + UserID string `json:"-" gorm:"column:user_id"` + ApplicationID string `json:"applicationId" gorm:"column:application_id"` + UserAgentID string `json:"userAgentId" gorm:"column:user_agent_id"` + Audience pq.StringArray `json:"audience" gorm:"column:audience"` + Scopes pq.StringArray `json:"scopes" gorm:"column:scopes"` + Expiration time.Time `json:"expiration" gorm:"column:expiration"` + Sequence uint64 `json:"-" gorm:"column:sequence"` + PreferredLanguage string `json:"preferredLanguage" gorm:"column:preferred_language"` + Deactivated bool `json:"-" gorm:"-"` +} + +func TokenViewFromModel(token *usr_model.TokenView) *TokenView { + return &TokenView{ + ID: token.ID, + CreationDate: token.CreationDate, + ChangeDate: token.ChangeDate, + ResourceOwner: token.ResourceOwner, + UserID: token.UserID, + ApplicationID: token.ApplicationID, + UserAgentID: token.UserAgentID, + Audience: token.Audience, + Scopes: token.Scopes, + Expiration: token.Expiration, + Sequence: token.Sequence, + PreferredLanguage: token.PreferredLanguage, + } +} + +func TokenViewToModel(token *TokenView) *usr_model.TokenView { + return &usr_model.TokenView{ + ID: token.ID, + CreationDate: token.CreationDate, + ChangeDate: token.ChangeDate, + ResourceOwner: token.ResourceOwner, + UserID: token.UserID, + ApplicationID: token.ApplicationID, + UserAgentID: token.UserAgentID, + Audience: token.Audience, + Scopes: token.Scopes, + Expiration: token.Expiration, + Sequence: token.Sequence, + PreferredLanguage: token.PreferredLanguage, + } +} + +func (t *TokenView) AppendEventIfMyToken(event *models.Event) (err error) { + view := new(TokenView) + switch event.Type { + case usr_es_model.UserTokenAdded: + view.setRootData(event) + err = view.setData(event) + case usr_es_model.UserRemoved, + usr_es_model.UserDeactivated, + usr_es_model.UserLocked: + t.Deactivated = true + return nil + case usr_es_model.UserUnlocked, + usr_es_model.UserReactivated: + if t.ID != "" && event.CreationDate.Before(t.CreationDate) { + t.Deactivated = false + } + return nil + default: + return nil + } + if view.ID == t.ID { + return t.AppendEvent(event) + } + return nil +} + +func (t *TokenView) AppendEvent(event *es_models.Event) error { + t.ChangeDate = event.CreationDate + t.Sequence = event.Sequence + switch event.Type { + case usr_es_model.UserTokenAdded: + t.setRootData(event) + err := t.setData(event) + if err != nil { + return err + } + t.CreationDate = event.CreationDate + } + return nil +} + +func (t *TokenView) setRootData(event *models.Event) { + t.UserID = event.AggregateID + t.ResourceOwner = event.ResourceOwner +} + +func (t *TokenView) setData(event *es_models.Event) error { + if err := json.Unmarshal(event.Data, t); err != nil { + logging.Log("EVEN-3Gm9s").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-5Gms9", "could not unmarshal event") + } + return nil +} diff --git a/internal/token/repository/view/model/token_query.go b/internal/user/repository/view/model/token_query.go similarity index 68% rename from internal/token/repository/view/model/token_query.go rename to internal/user/repository/view/model/token_query.go index 28a8f5dddc..1148956371 100644 --- a/internal/token/repository/view/model/token_query.go +++ b/internal/user/repository/view/model/token_query.go @@ -2,13 +2,13 @@ package model import ( global_model "github.com/caos/zitadel/internal/model" - token_model "github.com/caos/zitadel/internal/token/model" + "github.com/caos/zitadel/internal/user/model" "github.com/caos/zitadel/internal/view/repository" ) -type TokenSearchRequest token_model.TokenSearchRequest -type TokenSearchQuery token_model.TokenSearchQuery -type TokenSearchKey token_model.TokenSearchKey +type TokenSearchRequest model.TokenSearchRequest +type TokenSearchQuery model.TokenSearchQuery +type TokenSearchKey model.TokenSearchKey func (req TokenSearchRequest) GetLimit() uint64 { return req.Limit @@ -19,7 +19,7 @@ func (req TokenSearchRequest) GetOffset() uint64 { } func (req TokenSearchRequest) GetSortingColumn() repository.ColumnKey { - if req.SortingColumn == token_model.TokenSearchKeyUnspecified { + if req.SortingColumn == model.TokenSearchKeyUnspecified { return nil } return TokenSearchKey(req.SortingColumn) @@ -50,18 +50,18 @@ func (req TokenSearchQuery) GetValue() interface{} { } func (key TokenSearchKey) ToColumnName() string { - switch token_model.TokenSearchKey(key) { - case token_model.TokenSearchKeyTokenID: + switch model.TokenSearchKey(key) { + case model.TokenSearchKeyTokenID: return TokenKeyTokenID - case token_model.TokenSearchKeyUserAgentID: + case model.TokenSearchKeyUserAgentID: return TokenKeyUserAgentID - case token_model.TokenSearchKeyUserID: + case model.TokenSearchKeyUserID: return TokenKeyUserID - case token_model.TokenSearchKeyApplicationID: + case model.TokenSearchKeyApplicationID: return TokenKeyApplicationID - case token_model.TokenSearchKeyExpiration: + case model.TokenSearchKeyExpiration: return TokenKeyExpiration - case token_model.TokenSearchKeyResourceOwner: + case model.TokenSearchKeyResourceOwner: return TokenKeyResourceOwner default: return "" diff --git a/internal/user/repository/view/model/user.go b/internal/user/repository/view/model/user.go index 44aeecbe56..02996bee3f 100644 --- a/internal/user/repository/view/model/user.go +++ b/internal/user/repository/view/model/user.go @@ -2,6 +2,7 @@ package model import ( "encoding/json" + iam_model "github.com/caos/zitadel/internal/iam/model" "time" org_model "github.com/caos/zitadel/internal/org/model" @@ -169,7 +170,7 @@ func (u *UserView) GenerateLoginName(domain string, appendDomain bool) string { return u.UserName + "@" + domain } -func (u *UserView) SetLoginNames(policy *org_model.OrgIAMPolicy, domains []*org_model.OrgDomain) { +func (u *UserView) SetLoginNames(policy *iam_model.OrgIAMPolicy, domains []*org_model.OrgDomain) { loginNames := make([]string, 0) for _, d := range domains { if d.Verified { @@ -206,6 +207,8 @@ func (u *UserView) AppendEvent(event *models.Event) (err error) { return err } err = u.setPasswordData(event) + case es_model.UserRemoved: + u.State = int32(model.UserStateDeleted) case es_model.UserPasswordChanged, es_model.HumanPasswordChanged: err = u.setPasswordData(event) diff --git a/internal/user/repository/view/model/user_membership.go b/internal/user/repository/view/model/user_membership.go index bc2d2a6472..584c67b7bd 100644 --- a/internal/user/repository/view/model/user_membership.go +++ b/internal/user/repository/view/model/user_membership.go @@ -87,10 +87,10 @@ func (u *UserMembershipView) AppendEvent(event *models.Event) (err error) { err = u.setProjectMemberData(event) case proj_es_model.ProjectGrantMemberAdded: u.setRootData(event, model.MemberTypeProjectGrant) - err = u.setProjectMemberData(event) + err = u.setProjectGrantMemberData(event) case proj_es_model.ProjectGrantMemberChanged, proj_es_model.ProjectGrantMemberRemoved: - err = u.setProjectMemberData(event) + err = u.setProjectGrantMemberData(event) } return err } diff --git a/internal/user/repository/view/model/user_session.go b/internal/user/repository/view/model/user_session.go index 669241af79..3796266257 100644 --- a/internal/user/repository/view/model/user_session.go +++ b/internal/user/repository/view/model/user_session.go @@ -30,7 +30,9 @@ type UserSessionView struct { UserName string `json:"-" gorm:"column:user_name"` LoginName string `json:"-" gorm:"column:login_name"` DisplayName string `json:"-" gorm:"column:user_display_name"` + SelectedIDPConfigID string `json:"selectedIDPConfigID" gorm:"column:selected_idp_config_id"` PasswordVerification time.Time `json:"-" gorm:"column:password_verification"` + ExternalLoginVerification time.Time `json:"-" gorm:"column:external_login_verification"` MfaSoftwareVerification time.Time `json:"-" gorm:"column:mfa_software_verification"` MfaSoftwareVerificationType int32 `json:"-" gorm:"column:mfa_software_verification_type"` MfaHardwareVerification time.Time `json:"-" gorm:"column:mfa_hardware_verification"` @@ -58,7 +60,9 @@ func UserSessionToModel(userSession *UserSessionView) *model.UserSessionView { UserName: userSession.UserName, LoginName: userSession.LoginName, DisplayName: userSession.DisplayName, + SelectedIDPConfigID: userSession.SelectedIDPConfigID, PasswordVerification: userSession.PasswordVerification, + ExternalLoginVerification: userSession.ExternalLoginVerification, MfaSoftwareVerification: userSession.MfaSoftwareVerification, MfaSoftwareVerificationType: req_model.MfaType(userSession.MfaSoftwareVerificationType), MfaHardwareVerification: userSession.MfaHardwareVerification, @@ -83,6 +87,12 @@ func (v *UserSessionView) AppendEvent(event *models.Event) { es_model.HumanPasswordCheckSucceeded: v.PasswordVerification = event.CreationDate v.State = int32(req_model.UserSessionStateActive) + case es_model.HumanExternalLoginCheckSucceeded: + data := new(es_model.AuthRequest) + data.SetData(event) + v.ExternalLoginVerification = event.CreationDate + v.SelectedIDPConfigID = data.SelectedIDPConfigID + v.State = int32(req_model.UserSessionStateActive) case es_model.UserPasswordCheckFailed, es_model.UserPasswordChanged, es_model.HumanPasswordCheckFailed, @@ -104,6 +114,7 @@ func (v *UserSessionView) AppendEvent(event *models.Event) { es_model.UserDeactivated: v.PasswordVerification = time.Time{} v.MfaSoftwareVerification = time.Time{} + v.ExternalLoginVerification = time.Time{} v.State = int32(req_model.UserSessionStateTerminated) } } diff --git a/internal/user/repository/view/token_view.go b/internal/user/repository/view/token_view.go new file mode 100644 index 0000000000..5666661fdd --- /dev/null +++ b/internal/user/repository/view/token_view.go @@ -0,0 +1,72 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/user/model" + usr_model "github.com/caos/zitadel/internal/user/repository/view/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" + "github.com/lib/pq" +) + +func TokenByID(db *gorm.DB, table, tokenID string) (*usr_model.TokenView, error) { + token := new(usr_model.TokenView) + query := repository.PrepareGetByKey(table, usr_model.TokenSearchKey(model.TokenSearchKeyTokenID), tokenID) + err := query(db, token) + if errors.IsNotFound(err) { + return nil, errors.ThrowNotFound(nil, "VIEW-6ub3p", "Errors.Token.NotFound") + } + return token, err +} + +func TokensByUserID(db *gorm.DB, table, userID string) ([]*usr_model.TokenView, error) { + tokens := make([]*usr_model.TokenView, 0) + userIDQuery := &model.TokenSearchQuery{ + Key: model.TokenSearchKeyUserID, + Method: global_model.SearchMethodEquals, + Value: userID, + } + query := repository.PrepareSearchQuery(table, usr_model.TokenSearchRequest{ + Queries: []*model.TokenSearchQuery{userIDQuery}, + }) + _, err := query(db, &tokens) + return tokens, err +} + +func PutToken(db *gorm.DB, table string, token *usr_model.TokenView) error { + save := repository.PrepareSave(table) + return save(db, token) +} + +func PutTokens(db *gorm.DB, table string, tokens ...*usr_model.TokenView) error { + save := repository.PrepareBulkSave(table) + t := make([]interface{}, len(tokens)) + for i, token := range tokens { + t[i] = token + } + return save(db, t...) +} + +func DeleteToken(db *gorm.DB, table, tokenID string) error { + delete := repository.PrepareDeleteByKey(table, usr_model.TokenSearchKey(model.TokenSearchKeyTokenID), tokenID) + return delete(db) +} + +func DeleteSessionTokens(db *gorm.DB, table, agentID, userID string) error { + delete := repository.PrepareDeleteByKeys(table, + repository.Key{Key: usr_model.TokenSearchKey(model.TokenSearchKeyUserAgentID), Value: agentID}, + repository.Key{Key: usr_model.TokenSearchKey(model.TokenSearchKeyUserID), Value: userID}, + ) + return delete(db) +} + +func DeleteUserTokens(db *gorm.DB, table, userID string) error { + delete := repository.PrepareDeleteByKey(table, usr_model.TokenSearchKey(model.TokenSearchKeyUserID), userID) + return delete(db) +} + +func DeleteApplicationTokens(db *gorm.DB, table string, appIDs []string) error { + delete := repository.PrepareDeleteByKey(table, usr_model.TokenSearchKey(model.TokenSearchKeyApplicationID), pq.StringArray(appIDs)) + return delete(db) +} diff --git a/internal/user/repository/view/usermembership_view.go b/internal/user/repository/view/usermembership_view.go index 9006b35f2b..a2082a06e0 100644 --- a/internal/user/repository/view/usermembership_view.go +++ b/internal/user/repository/view/usermembership_view.go @@ -20,7 +20,7 @@ func UserMembershipByIDs(db *gorm.DB, table, userID, aggregateID, objectID strin query := repository.PrepareGetByQuery(table, userIDQuery, aggregateIDQuery, objectIDQuery, memberTypeQuery) err := query(db, memberships) if caos_errs.IsNotFound(err) { - return nil, caos_errs.ThrowNotFound(nil, "VIEW-sj8Sw", "Errors.UserMembership.NotFound") + return nil, caos_errs.ThrowNotFound(nil, "VIEW-5Tsji", "Errors.UserMembership.NotFound") } return memberships, err } @@ -78,3 +78,21 @@ func DeleteUserMembership(db *gorm.DB, table, userID, aggregateID, objectID stri ) return delete(db) } + +func DeleteUserMembershipsByUserID(db *gorm.DB, table, userID string) error { + delete := repository.PrepareDeleteByKey(table, model.UserMembershipSearchKey(usr_model.UserMembershipSearchKeyUserID), userID) + return delete(db) +} + +func DeleteUserMembershipsByAggregateID(db *gorm.DB, table, aggregateID string) error { + delete := repository.PrepareDeleteByKey(table, model.UserMembershipSearchKey(usr_model.UserMembershipSearchKeyAggregateID), aggregateID) + return delete(db) +} + +func DeleteUserMembershipsByAggregateIDAndObjectID(db *gorm.DB, table, aggregateID, objectID string) error { + delete := repository.PrepareDeleteByKeys(table, + repository.Key{Key: model.UserMembershipSearchKey(usr_model.UserMembershipSearchKeyAggregateID), Value: aggregateID}, + repository.Key{Key: model.UserMembershipSearchKey(usr_model.UserMembershipSearchKeyObjectID), Value: objectID}, + ) + return delete(db) +} diff --git a/internal/usergrant/model/user_grant_view.go b/internal/usergrant/model/user_grant_view.go index e4776ea0b4..4511d63e92 100644 --- a/internal/usergrant/model/user_grant_view.go +++ b/internal/usergrant/model/user_grant_view.go @@ -7,20 +7,20 @@ import ( ) type UserGrantView struct { - ID string - ResourceOwner string - UserID string - ProjectID string - GrantID string - UserName string - FirstName string - LastName string - DisplayName string - Email string - ProjectName string - OrgName string - OrgDomain string - RoleKeys []string + ID string + ResourceOwner string + UserID string + ProjectID string + GrantID string + UserName string + FirstName string + LastName string + DisplayName string + Email string + ProjectName string + OrgName string + OrgPrimaryDomain string + RoleKeys []string CreationDate time.Time ChangeDate time.Time diff --git a/internal/usergrant/repository/view/model/user_grant.go b/internal/usergrant/repository/view/model/user_grant.go index b65436b0da..4f59f0b8a6 100644 --- a/internal/usergrant/repository/view/model/user_grant.go +++ b/internal/usergrant/repository/view/model/user_grant.go @@ -5,11 +5,12 @@ import ( "time" "github.com/caos/logging" + "github.com/lib/pq" + caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/usergrant/model" es_model "github.com/caos/zitadel/internal/usergrant/repository/eventsourcing/model" - "github.com/lib/pq" ) const ( @@ -24,19 +25,20 @@ const ( ) type UserGrantView struct { - ID string `json:"-" gorm:"column:id;primary_key"` - ResourceOwner string `json:"-" gorm:"resource_owner"` - UserID string `json:"userId" gorm:"user_id"` - ProjectID string `json:"projectId" gorm:"column:project_id"` - GrantID string `json:"grantId" gorm:"column:grant_id"` - UserName string `json:"-" gorm:"column:user_name"` - FirstName string `json:"-" gorm:"column:first_name"` - LastName string `json:"-" gorm:"column:last_name"` - DisplayName string `json:"-" gorm:"column:display_name"` - Email string `json:"-" gorm:"column:email"` - ProjectName string `json:"-" gorm:"column:project_name"` - OrgName string `json:"-" gorm:"column:org_name"` - RoleKeys pq.StringArray `json:"roleKeys" gorm:"column:role_keys"` + ID string `json:"-" gorm:"column:id;primary_key"` + ResourceOwner string `json:"-" gorm:"resource_owner"` + UserID string `json:"userId" gorm:"user_id"` + ProjectID string `json:"projectId" gorm:"column:project_id"` + GrantID string `json:"grantId" gorm:"column:grant_id"` + UserName string `json:"-" gorm:"column:user_name"` + FirstName string `json:"-" gorm:"column:first_name"` + LastName string `json:"-" gorm:"column:last_name"` + DisplayName string `json:"-" gorm:"column:display_name"` + Email string `json:"-" gorm:"column:email"` + ProjectName string `json:"-" gorm:"column:project_name"` + OrgName string `json:"-" gorm:"column:org_name"` + OrgPrimaryDomain string `json:"-" gorm:"column:org_primary_domain"` + RoleKeys pq.StringArray `json:"roleKeys" gorm:"column:role_keys"` CreationDate time.Time `json:"-" gorm:"column:creation_date"` ChangeDate time.Time `json:"-" gorm:"column:change_date"` @@ -47,22 +49,24 @@ type UserGrantView struct { func UserGrantToModel(grant *UserGrantView) *model.UserGrantView { return &model.UserGrantView{ - ID: grant.ID, - ResourceOwner: grant.ResourceOwner, - UserID: grant.UserID, - ProjectID: grant.ProjectID, - ChangeDate: grant.ChangeDate, - CreationDate: grant.CreationDate, - State: model.UserGrantState(grant.State), - UserName: grant.UserName, - FirstName: grant.FirstName, - LastName: grant.LastName, - DisplayName: grant.DisplayName, - Email: grant.Email, - ProjectName: grant.ProjectName, - OrgName: grant.OrgName, - RoleKeys: grant.RoleKeys, - Sequence: grant.Sequence, + ID: grant.ID, + ResourceOwner: grant.ResourceOwner, + UserID: grant.UserID, + ProjectID: grant.ProjectID, + ChangeDate: grant.ChangeDate, + CreationDate: grant.CreationDate, + State: model.UserGrantState(grant.State), + UserName: grant.UserName, + FirstName: grant.FirstName, + LastName: grant.LastName, + DisplayName: grant.DisplayName, + Email: grant.Email, + ProjectName: grant.ProjectName, + OrgName: grant.OrgName, + OrgPrimaryDomain: grant.OrgPrimaryDomain, + RoleKeys: grant.RoleKeys, + Sequence: grant.Sequence, + GrantID: grant.GrantID, } } diff --git a/migrations/cockroach/V1.16__user_session.sql b/migrations/cockroach/V1.16__user_session.sql new file mode 100644 index 0000000000..913a11561c --- /dev/null +++ b/migrations/cockroach/V1.16__user_session.sql @@ -0,0 +1,2 @@ +ALTER TABLE auth.user_sessions ADD COLUMN external_login_verification TIMESTAMPTZ; +ALTER TABLE auth.user_sessions ADD COLUMN selected_idp_config_id TEXT; diff --git a/migrations/cockroach/V1.17__policies.sql b/migrations/cockroach/V1.17__policies.sql new file mode 100644 index 0000000000..94b6aa40be --- /dev/null +++ b/migrations/cockroach/V1.17__policies.sql @@ -0,0 +1,173 @@ +CREATE TABLE auth.password_complexity_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + complexity_policy_state SMALLINT, + sequence BIGINT, + + min_length BIGINT, + has_lowercase BOOLEAN, + has_uppercase BOOLEAN, + has_symbol BOOLEAN, + has_number BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE adminapi.password_complexity_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + complexity_policy_state SMALLINT, + sequence BIGINT, + + min_length BIGINT, + has_lowercase BOOLEAN, + has_uppercase BOOLEAN, + has_symbol BOOLEAN, + has_number BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE management.password_complexity_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + complexity_policy_state SMALLINT, + sequence BIGINT, + + min_length BIGINT, + has_lowercase BOOLEAN, + has_uppercase BOOLEAN, + has_symbol BOOLEAN, + has_number BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE auth.password_age_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + age_policy_state SMALLINT, + sequence BIGINT, + + max_age_days BIGINT, + expire_warn_days BIGINT, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE adminapi.password_age_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + age_policy_state SMALLINT, + sequence BIGINT, + + max_age_days BIGINT, + expire_warn_days BIGINT, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE management.password_age_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + age_policy_state SMALLINT, + sequence BIGINT, + + max_age_days BIGINT, + expire_warn_days BIGINT, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE auth.password_lockout_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + lockout_policy_state SMALLINT, + sequence BIGINT, + + max_attempts BIGINT, + show_lockout_failures BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE adminapi.password_lockout_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + lockout_policy_state SMALLINT, + sequence BIGINT, + + max_attempts BIGINT, + show_lockout_failures BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE management.password_lockout_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + lockout_policy_state SMALLINT, + sequence BIGINT, + + max_attempts BIGINT, + show_lockout_failures BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE management.org_iam_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + org_iam_policy_state SMALLINT, + sequence BIGINT, + + user_login_must_be_domain BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE auth.org_iam_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + org_iam_policy_state SMALLINT, + sequence BIGINT, + + user_login_must_be_domain BOOLEAN, + + PRIMARY KEY (aggregate_id) +); + +CREATE TABLE adminapi.org_iam_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + org_iam_policy_state SMALLINT, + sequence BIGINT, + + user_login_must_be_domain BOOLEAN, + + PRIMARY KEY (aggregate_id) +); \ No newline at end of file diff --git a/migrations/cockroach/V1.18__scope_projectroles.sql b/migrations/cockroach/V1.18__scope_projectroles.sql new file mode 100644 index 0000000000..0a07159d45 --- /dev/null +++ b/migrations/cockroach/V1.18__scope_projectroles.sql @@ -0,0 +1,40 @@ +CREATE TABLE auth.project_roles ( + project_id TEXT, + role_key TEXT, + display_name TEXT, + resource_owner TEXT, + org_id TEXT, + group_name TEXT, + + creation_date TIMESTAMPTZ, + sequence BIGINT, + + PRIMARY KEY (org_id, project_id, role_key) +); + +ALTER TABLE authz.user_grants ADD COLUMN org_primary_domain TEXT; +ALTER TABLE auth.user_grants ADD COLUMN org_primary_domain TEXT; +ALTER TABLE management.user_grants ADD COLUMN org_primary_domain TEXT; + +ALTER TABLE authz.applications ADD COLUMN access_token_type SMALLINT; +ALTER TABLE auth.applications ADD COLUMN access_token_type SMALLINT; +ALTER TABLE management.applications ADD COLUMN access_token_type SMALLINT; + +ALTER TABLE management.projects ADD COLUMN project_role_assertion BOOLEAN; +ALTER TABLE management.projects ADD COLUMN project_role_check BOOLEAN; + +ALTER TABLE authz.applications ADD COLUMN project_role_assertion BOOLEAN; +ALTER TABLE auth.applications ADD COLUMN project_role_assertion BOOLEAN; +ALTER TABLE management.applications ADD COLUMN project_role_assertion BOOLEAN; + +ALTER TABLE authz.applications ADD COLUMN project_role_check BOOLEAN; +ALTER TABLE auth.applications ADD COLUMN project_role_check BOOLEAN; +ALTER TABLE management.applications ADD COLUMN project_role_check BOOLEAN; + +ALTER TABLE authz.applications ADD COLUMN access_token_role_assertion BOOLEAN; +ALTER TABLE auth.applications ADD COLUMN access_token_role_assertion BOOLEAN; +ALTER TABLE management.applications ADD COLUMN access_token_role_assertion BOOLEAN; + +ALTER TABLE authz.applications ADD COLUMN id_token_role_assertion BOOLEAN; +ALTER TABLE auth.applications ADD COLUMN id_token_role_assertion BOOLEAN; +ALTER TABLE management.applications ADD COLUMN id_token_role_assertion BOOLEAN; \ No newline at end of file diff --git a/migrations/cockroach/V1.19__idp_configs.sql b/migrations/cockroach/V1.19__idp_configs.sql new file mode 100644 index 0000000000..24a8cb7561 --- /dev/null +++ b/migrations/cockroach/V1.19__idp_configs.sql @@ -0,0 +1,12 @@ +ALTER TABLE management.idp_configs DROP COLUMN logo_src; +ALTER TABLE adminapi.idp_configs DROP COLUMN logo_src; +ALTER TABLE auth.idp_configs DROP COLUMN logo_src; + +ALTER TABLE management.idp_configs ADD COLUMN styling_type SMALLINT; +ALTER TABLE adminapi.idp_configs ADD COLUMN styling_type SMALLINT; +ALTER TABLE auth.idp_configs ADD COLUMN styling_type SMALLINT; + +ALTER TABLE management.idp_providers ADD COLUMN styling_type SMALLINT; +ALTER TABLE adminapi.idp_providers ADD COLUMN styling_type SMALLINT; +ALTER TABLE auth.idp_providers ADD COLUMN styling_type SMALLINT; + diff --git a/migrations/cockroach/V1.20__label_policies.sql b/migrations/cockroach/V1.20__label_policies.sql new file mode 100644 index 0000000000..3bbe42a04d --- /dev/null +++ b/migrations/cockroach/V1.20__label_policies.sql @@ -0,0 +1,31 @@ +CREATE TABLE adminapi.label_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + label_policy_state SMALLINT, + sequence BIGINT, + + primary_color TEXT, + secondary_color TEXT, + + PRIMARY KEY (aggregate_id) +); + + +CREATE TABLE management.label_policies ( + aggregate_id TEXT, + + creation_date TIMESTAMPTZ, + change_date TIMESTAMPTZ, + label_policy_state SMALLINT, + sequence BIGINT, + + primary_color TEXT, + secondary_color TEXT, + + PRIMARY KEY (aggregate_id) +); + +GRANT SELECT ON TABLE adminapi.label_policies TO notification; +GRANT SELECT ON TABLE management.label_policies TO notification; \ No newline at end of file diff --git a/pkg/grpc/admin/admin.pb.authoptions.go b/pkg/grpc/admin/admin.pb.authoptions.go index 22005775b3..f8494f6081 100644 --- a/pkg/grpc/admin/admin.pb.authoptions.go +++ b/pkg/grpc/admin/admin.pb.authoptions.go @@ -34,6 +34,16 @@ var AdminService_AuthMethods = authz.MethodMapping{ CheckParam: "", }, + "/caos.zitadel.admin.api.v1.AdminService/GetDefaultOrgIamPolicy": authz.Option{ + Permission: "iam.policy.read", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultOrgIamPolicy": authz.Option{ + Permission: "iam.policy.write", + CheckParam: "", + }, + "/caos.zitadel.admin.api.v1.AdminService/GetOrgIamPolicy": authz.Option{ Permission: "iam.policy.read", CheckParam: "", @@ -49,7 +59,7 @@ var AdminService_AuthMethods = authz.MethodMapping{ CheckParam: "", }, - "/caos.zitadel.admin.api.v1.AdminService/DeleteOrgIamPolicy": authz.Option{ + "/caos.zitadel.admin.api.v1.AdminService/RemoveOrgIamPolicy": authz.Option{ Permission: "iam.policy.delete", CheckParam: "", }, @@ -139,6 +149,16 @@ var AdminService_AuthMethods = authz.MethodMapping{ CheckParam: "", }, + "/caos.zitadel.admin.api.v1.AdminService/GetDefaultLabelPolicy": authz.Option{ + Permission: "iam.policy.read", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultLabelPolicy": authz.Option{ + Permission: "iam.policy.write", + CheckParam: "", + }, + "/caos.zitadel.admin.api.v1.AdminService/GetDefaultLoginPolicy": authz.Option{ Permission: "iam.policy.read", CheckParam: "", @@ -163,4 +183,34 @@ var AdminService_AuthMethods = authz.MethodMapping{ Permission: "iam.policy.write", CheckParam: "", }, + + "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordComplexityPolicy": authz.Option{ + Permission: "iam.policy.read", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordComplexityPolicy": authz.Option{ + Permission: "iam.policy.write", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordAgePolicy": authz.Option{ + Permission: "iam.policy.read", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordAgePolicy": authz.Option{ + Permission: "iam.policy.write", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordLockoutPolicy": authz.Option{ + Permission: "iam.policy.read", + CheckParam: "", + }, + + "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordLockoutPolicy": authz.Option{ + Permission: "iam.policy.write", + CheckParam: "", + }, } diff --git a/pkg/grpc/admin/admin.pb.go b/pkg/grpc/admin/admin.pb.go index d28d012bef..a5b94e0431 100644 --- a/pkg/grpc/admin/admin.pb.go +++ b/pkg/grpc/admin/admin.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.20.1 -// protoc v3.11.3 +// protoc-gen-go v1.25.0 +// protoc v3.13.0 // source: admin.proto package admin @@ -473,6 +473,52 @@ func (SearchMethod) EnumDescriptor() ([]byte, []int) { return file_admin_proto_rawDescGZIP(), []int{7} } +type IdpStylingType int32 + +const ( + IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED IdpStylingType = 0 + IdpStylingType_IDPSTYLINGTYPE_GOOGLE IdpStylingType = 1 +) + +// Enum value maps for IdpStylingType. +var ( + IdpStylingType_name = map[int32]string{ + 0: "IDPSTYLINGTYPE_UNSPECIFIED", + 1: "IDPSTYLINGTYPE_GOOGLE", + } + IdpStylingType_value = map[string]int32{ + "IDPSTYLINGTYPE_UNSPECIFIED": 0, + "IDPSTYLINGTYPE_GOOGLE": 1, + } +) + +func (x IdpStylingType) Enum() *IdpStylingType { + p := new(IdpStylingType) + *p = x + return p +} + +func (x IdpStylingType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IdpStylingType) Descriptor() protoreflect.EnumDescriptor { + return file_admin_proto_enumTypes[8].Descriptor() +} + +func (IdpStylingType) Type() protoreflect.EnumType { + return &file_admin_proto_enumTypes[8] +} + +func (x IdpStylingType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use IdpStylingType.Descriptor instead. +func (IdpStylingType) EnumDescriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{8} +} + type IdpState int32 const ( @@ -506,11 +552,11 @@ func (x IdpState) String() string { } func (IdpState) Descriptor() protoreflect.EnumDescriptor { - return file_admin_proto_enumTypes[8].Descriptor() + return file_admin_proto_enumTypes[9].Descriptor() } func (IdpState) Type() protoreflect.EnumType { - return &file_admin_proto_enumTypes[8] + return &file_admin_proto_enumTypes[9] } func (x IdpState) Number() protoreflect.EnumNumber { @@ -519,7 +565,7 @@ func (x IdpState) Number() protoreflect.EnumNumber { // Deprecated: Use IdpState.Descriptor instead. func (IdpState) EnumDescriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{8} + return file_admin_proto_rawDescGZIP(), []int{9} } type OIDCMappingField int32 @@ -555,11 +601,11 @@ func (x OIDCMappingField) String() string { } func (OIDCMappingField) Descriptor() protoreflect.EnumDescriptor { - return file_admin_proto_enumTypes[9].Descriptor() + return file_admin_proto_enumTypes[10].Descriptor() } func (OIDCMappingField) Type() protoreflect.EnumType { - return &file_admin_proto_enumTypes[9] + return &file_admin_proto_enumTypes[10] } func (x OIDCMappingField) Number() protoreflect.EnumNumber { @@ -568,7 +614,7 @@ func (x OIDCMappingField) Number() protoreflect.EnumNumber { // Deprecated: Use OIDCMappingField.Descriptor instead. func (OIDCMappingField) EnumDescriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{9} + return file_admin_proto_rawDescGZIP(), []int{10} } type IdpSearchKey int32 @@ -604,11 +650,11 @@ func (x IdpSearchKey) String() string { } func (IdpSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_admin_proto_enumTypes[10].Descriptor() + return file_admin_proto_enumTypes[11].Descriptor() } func (IdpSearchKey) Type() protoreflect.EnumType { - return &file_admin_proto_enumTypes[10] + return &file_admin_proto_enumTypes[11] } func (x IdpSearchKey) Number() protoreflect.EnumNumber { @@ -617,7 +663,7 @@ func (x IdpSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use IdpSearchKey.Descriptor instead. func (IdpSearchKey) EnumDescriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{10} + return file_admin_proto_rawDescGZIP(), []int{11} } type IdpType int32 @@ -653,11 +699,11 @@ func (x IdpType) String() string { } func (IdpType) Descriptor() protoreflect.EnumDescriptor { - return file_admin_proto_enumTypes[11].Descriptor() + return file_admin_proto_enumTypes[12].Descriptor() } func (IdpType) Type() protoreflect.EnumType { - return &file_admin_proto_enumTypes[11] + return &file_admin_proto_enumTypes[12] } func (x IdpType) Number() protoreflect.EnumNumber { @@ -666,7 +712,7 @@ func (x IdpType) Number() protoreflect.EnumNumber { // Deprecated: Use IdpType.Descriptor instead. func (IdpType) EnumDescriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{11} + return file_admin_proto_rawDescGZIP(), []int{12} } type OrgID struct { @@ -2036,12 +2082,11 @@ type OrgIamPolicy struct { unknownFields protoimpl.UnknownFields OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - UserLoginMustBeDomain bool `protobuf:"varint,3,opt,name=user_login_must_be_domain,json=userLoginMustBeDomain,proto3" json:"user_login_must_be_domain,omitempty"` - Default bool `protobuf:"varint,4,opt,name=default,proto3" json:"default,omitempty"` - Sequence uint64 `protobuf:"varint,5,opt,name=sequence,proto3" json:"sequence,omitempty"` - CreationDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` - ChangeDate *timestamp.Timestamp `protobuf:"bytes,7,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` + UserLoginMustBeDomain bool `protobuf:"varint,2,opt,name=user_login_must_be_domain,json=userLoginMustBeDomain,proto3" json:"user_login_must_be_domain,omitempty"` + Default bool `protobuf:"varint,3,opt,name=default,proto3" json:"default,omitempty"` + Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` } func (x *OrgIamPolicy) Reset() { @@ -2083,13 +2128,6 @@ func (x *OrgIamPolicy) GetOrgId() string { return "" } -func (x *OrgIamPolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - func (x *OrgIamPolicy) GetUserLoginMustBeDomain() bool { if x != nil { return x.UserLoginMustBeDomain @@ -2125,6 +2163,93 @@ func (x *OrgIamPolicy) GetChangeDate() *timestamp.Timestamp { return nil } +type OrgIamPolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + UserLoginMustBeDomain bool `protobuf:"varint,2,opt,name=user_login_must_be_domain,json=userLoginMustBeDomain,proto3" json:"user_login_must_be_domain,omitempty"` + Default bool `protobuf:"varint,3,opt,name=default,proto3" json:"default,omitempty"` + Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *OrgIamPolicyView) Reset() { + *x = OrgIamPolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OrgIamPolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OrgIamPolicyView) ProtoMessage() {} + +func (x *OrgIamPolicyView) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OrgIamPolicyView.ProtoReflect.Descriptor instead. +func (*OrgIamPolicyView) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{18} +} + +func (x *OrgIamPolicyView) GetOrgId() string { + if x != nil { + return x.OrgId + } + return "" +} + +func (x *OrgIamPolicyView) GetUserLoginMustBeDomain() bool { + if x != nil { + return x.UserLoginMustBeDomain + } + return false +} + +func (x *OrgIamPolicyView) GetDefault() bool { + if x != nil { + return x.Default + } + return false +} + +func (x *OrgIamPolicyView) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *OrgIamPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *OrgIamPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + type OrgIamPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2138,7 +2263,7 @@ type OrgIamPolicyRequest struct { func (x *OrgIamPolicyRequest) Reset() { *x = OrgIamPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[18] + mi := &file_admin_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2151,7 +2276,7 @@ func (x *OrgIamPolicyRequest) String() string { func (*OrgIamPolicyRequest) ProtoMessage() {} func (x *OrgIamPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[18] + mi := &file_admin_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2164,7 +2289,7 @@ func (x *OrgIamPolicyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgIamPolicyRequest.ProtoReflect.Descriptor instead. func (*OrgIamPolicyRequest) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{18} + return file_admin_proto_rawDescGZIP(), []int{19} } func (x *OrgIamPolicyRequest) GetOrgId() string { @@ -2199,7 +2324,7 @@ type OrgIamPolicyID struct { func (x *OrgIamPolicyID) Reset() { *x = OrgIamPolicyID{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[19] + mi := &file_admin_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2212,7 +2337,7 @@ func (x *OrgIamPolicyID) String() string { func (*OrgIamPolicyID) ProtoMessage() {} func (x *OrgIamPolicyID) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[19] + mi := &file_admin_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2225,7 +2350,7 @@ func (x *OrgIamPolicyID) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgIamPolicyID.ProtoReflect.Descriptor instead. func (*OrgIamPolicyID) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{19} + return file_admin_proto_rawDescGZIP(), []int{20} } func (x *OrgIamPolicyID) GetOrgId() string { @@ -2246,7 +2371,7 @@ type IamMemberRoles struct { func (x *IamMemberRoles) Reset() { *x = IamMemberRoles{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[20] + mi := &file_admin_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2259,7 +2384,7 @@ func (x *IamMemberRoles) String() string { func (*IamMemberRoles) ProtoMessage() {} func (x *IamMemberRoles) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[20] + mi := &file_admin_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2272,7 +2397,7 @@ func (x *IamMemberRoles) ProtoReflect() protoreflect.Message { // Deprecated: Use IamMemberRoles.ProtoReflect.Descriptor instead. func (*IamMemberRoles) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{20} + return file_admin_proto_rawDescGZIP(), []int{21} } func (x *IamMemberRoles) GetRoles() []string { @@ -2297,7 +2422,7 @@ type IamMember struct { func (x *IamMember) Reset() { *x = IamMember{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[21] + mi := &file_admin_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2310,7 +2435,7 @@ func (x *IamMember) String() string { func (*IamMember) ProtoMessage() {} func (x *IamMember) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[21] + mi := &file_admin_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2323,7 +2448,7 @@ func (x *IamMember) ProtoReflect() protoreflect.Message { // Deprecated: Use IamMember.ProtoReflect.Descriptor instead. func (*IamMember) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{21} + return file_admin_proto_rawDescGZIP(), []int{22} } func (x *IamMember) GetUserId() string { @@ -2373,7 +2498,7 @@ type AddIamMemberRequest struct { func (x *AddIamMemberRequest) Reset() { *x = AddIamMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[22] + mi := &file_admin_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2386,7 +2511,7 @@ func (x *AddIamMemberRequest) String() string { func (*AddIamMemberRequest) ProtoMessage() {} func (x *AddIamMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[22] + mi := &file_admin_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2399,7 +2524,7 @@ func (x *AddIamMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddIamMemberRequest.ProtoReflect.Descriptor instead. func (*AddIamMemberRequest) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{22} + return file_admin_proto_rawDescGZIP(), []int{23} } func (x *AddIamMemberRequest) GetUserId() string { @@ -2428,7 +2553,7 @@ type ChangeIamMemberRequest struct { func (x *ChangeIamMemberRequest) Reset() { *x = ChangeIamMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[23] + mi := &file_admin_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2441,7 +2566,7 @@ func (x *ChangeIamMemberRequest) String() string { func (*ChangeIamMemberRequest) ProtoMessage() {} func (x *ChangeIamMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[23] + mi := &file_admin_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2454,7 +2579,7 @@ func (x *ChangeIamMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeIamMemberRequest.ProtoReflect.Descriptor instead. func (*ChangeIamMemberRequest) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{23} + return file_admin_proto_rawDescGZIP(), []int{24} } func (x *ChangeIamMemberRequest) GetUserId() string { @@ -2482,7 +2607,7 @@ type RemoveIamMemberRequest struct { func (x *RemoveIamMemberRequest) Reset() { *x = RemoveIamMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[24] + mi := &file_admin_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2495,7 +2620,7 @@ func (x *RemoveIamMemberRequest) String() string { func (*RemoveIamMemberRequest) ProtoMessage() {} func (x *RemoveIamMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[24] + mi := &file_admin_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2508,7 +2633,7 @@ func (x *RemoveIamMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveIamMemberRequest.ProtoReflect.Descriptor instead. func (*RemoveIamMemberRequest) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{24} + return file_admin_proto_rawDescGZIP(), []int{25} } func (x *RemoveIamMemberRequest) GetUserId() string { @@ -2534,7 +2659,7 @@ type IamMemberSearchResponse struct { func (x *IamMemberSearchResponse) Reset() { *x = IamMemberSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[25] + mi := &file_admin_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2547,7 +2672,7 @@ func (x *IamMemberSearchResponse) String() string { func (*IamMemberSearchResponse) ProtoMessage() {} func (x *IamMemberSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[25] + mi := &file_admin_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2560,7 +2685,7 @@ func (x *IamMemberSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IamMemberSearchResponse.ProtoReflect.Descriptor instead. func (*IamMemberSearchResponse) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{25} + return file_admin_proto_rawDescGZIP(), []int{26} } func (x *IamMemberSearchResponse) GetOffset() uint64 { @@ -2625,7 +2750,7 @@ type IamMemberView struct { func (x *IamMemberView) Reset() { *x = IamMemberView{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[26] + mi := &file_admin_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2638,7 +2763,7 @@ func (x *IamMemberView) String() string { func (*IamMemberView) ProtoMessage() {} func (x *IamMemberView) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[26] + mi := &file_admin_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2651,7 +2776,7 @@ func (x *IamMemberView) ProtoReflect() protoreflect.Message { // Deprecated: Use IamMemberView.ProtoReflect.Descriptor instead. func (*IamMemberView) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{26} + return file_admin_proto_rawDescGZIP(), []int{27} } func (x *IamMemberView) GetUserId() string { @@ -2737,7 +2862,7 @@ type IamMemberSearchRequest struct { func (x *IamMemberSearchRequest) Reset() { *x = IamMemberSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[27] + mi := &file_admin_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2750,7 +2875,7 @@ func (x *IamMemberSearchRequest) String() string { func (*IamMemberSearchRequest) ProtoMessage() {} func (x *IamMemberSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[27] + mi := &file_admin_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2763,7 +2888,7 @@ func (x *IamMemberSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IamMemberSearchRequest.ProtoReflect.Descriptor instead. func (*IamMemberSearchRequest) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{27} + return file_admin_proto_rawDescGZIP(), []int{28} } func (x *IamMemberSearchRequest) GetOffset() uint64 { @@ -2800,7 +2925,7 @@ type IamMemberSearchQuery struct { func (x *IamMemberSearchQuery) Reset() { *x = IamMemberSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[28] + mi := &file_admin_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2813,7 +2938,7 @@ func (x *IamMemberSearchQuery) String() string { func (*IamMemberSearchQuery) ProtoMessage() {} func (x *IamMemberSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[28] + mi := &file_admin_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2826,7 +2951,7 @@ func (x *IamMemberSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use IamMemberSearchQuery.ProtoReflect.Descriptor instead. func (*IamMemberSearchQuery) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{28} + return file_admin_proto_rawDescGZIP(), []int{29} } func (x *IamMemberSearchQuery) GetKey() IamMemberSearchKey { @@ -2863,7 +2988,7 @@ type FailedEventID struct { func (x *FailedEventID) Reset() { *x = FailedEventID{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[29] + mi := &file_admin_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2876,7 +3001,7 @@ func (x *FailedEventID) String() string { func (*FailedEventID) ProtoMessage() {} func (x *FailedEventID) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[29] + mi := &file_admin_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2889,7 +3014,7 @@ func (x *FailedEventID) ProtoReflect() protoreflect.Message { // Deprecated: Use FailedEventID.ProtoReflect.Descriptor instead. func (*FailedEventID) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{29} + return file_admin_proto_rawDescGZIP(), []int{30} } func (x *FailedEventID) GetDatabase() string { @@ -2924,7 +3049,7 @@ type FailedEvents struct { func (x *FailedEvents) Reset() { *x = FailedEvents{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[30] + mi := &file_admin_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2937,7 +3062,7 @@ func (x *FailedEvents) String() string { func (*FailedEvents) ProtoMessage() {} func (x *FailedEvents) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[30] + mi := &file_admin_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2950,7 +3075,7 @@ func (x *FailedEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use FailedEvents.ProtoReflect.Descriptor instead. func (*FailedEvents) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{30} + return file_admin_proto_rawDescGZIP(), []int{31} } func (x *FailedEvents) GetFailedEvents() []*FailedEvent { @@ -2975,7 +3100,7 @@ type FailedEvent struct { func (x *FailedEvent) Reset() { *x = FailedEvent{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[31] + mi := &file_admin_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2988,7 +3113,7 @@ func (x *FailedEvent) String() string { func (*FailedEvent) ProtoMessage() {} func (x *FailedEvent) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[31] + mi := &file_admin_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3001,7 +3126,7 @@ func (x *FailedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use FailedEvent.ProtoReflect.Descriptor instead. func (*FailedEvent) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{31} + return file_admin_proto_rawDescGZIP(), []int{32} } func (x *FailedEvent) GetDatabase() string { @@ -3051,7 +3176,7 @@ type ViewID struct { func (x *ViewID) Reset() { *x = ViewID{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[32] + mi := &file_admin_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3064,7 +3189,7 @@ func (x *ViewID) String() string { func (*ViewID) ProtoMessage() {} func (x *ViewID) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[32] + mi := &file_admin_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3077,7 +3202,7 @@ func (x *ViewID) ProtoReflect() protoreflect.Message { // Deprecated: Use ViewID.ProtoReflect.Descriptor instead. func (*ViewID) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{32} + return file_admin_proto_rawDescGZIP(), []int{33} } func (x *ViewID) GetDatabase() string { @@ -3105,7 +3230,7 @@ type Views struct { func (x *Views) Reset() { *x = Views{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[33] + mi := &file_admin_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3118,7 +3243,7 @@ func (x *Views) String() string { func (*Views) ProtoMessage() {} func (x *Views) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[33] + mi := &file_admin_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3131,7 +3256,7 @@ func (x *Views) ProtoReflect() protoreflect.Message { // Deprecated: Use Views.ProtoReflect.Descriptor instead. func (*Views) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{33} + return file_admin_proto_rawDescGZIP(), []int{34} } func (x *Views) GetViews() []*View { @@ -3155,7 +3280,7 @@ type View struct { func (x *View) Reset() { *x = View{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[34] + mi := &file_admin_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3168,7 +3293,7 @@ func (x *View) String() string { func (*View) ProtoMessage() {} func (x *View) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[34] + mi := &file_admin_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3181,7 +3306,7 @@ func (x *View) ProtoReflect() protoreflect.Message { // Deprecated: Use View.ProtoReflect.Descriptor instead. func (*View) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{34} + return file_admin_proto_rawDescGZIP(), []int{35} } func (x *View) GetDatabase() string { @@ -3223,7 +3348,7 @@ type IdpID struct { func (x *IdpID) Reset() { *x = IdpID{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[35] + mi := &file_admin_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3236,7 +3361,7 @@ func (x *IdpID) String() string { func (*IdpID) ProtoMessage() {} func (x *IdpID) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[35] + mi := &file_admin_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3249,7 +3374,7 @@ func (x *IdpID) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpID.ProtoReflect.Descriptor instead. func (*IdpID) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{35} + return file_admin_proto_rawDescGZIP(), []int{36} } func (x *IdpID) GetId() string { @@ -3269,7 +3394,7 @@ type Idp struct { CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,6,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + StylingType IdpStylingType `protobuf:"varint,6,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.admin.api.v1.IdpStylingType" json:"styling_type,omitempty"` // Types that are assignable to IdpConfig: // *Idp_OidcConfig IdpConfig isIdp_IdpConfig `protobuf_oneof:"idp_config"` @@ -3279,7 +3404,7 @@ type Idp struct { func (x *Idp) Reset() { *x = Idp{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[36] + mi := &file_admin_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3292,7 +3417,7 @@ func (x *Idp) String() string { func (*Idp) ProtoMessage() {} func (x *Idp) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[36] + mi := &file_admin_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3305,7 +3430,7 @@ func (x *Idp) ProtoReflect() protoreflect.Message { // Deprecated: Use Idp.ProtoReflect.Descriptor instead. func (*Idp) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{36} + return file_admin_proto_rawDescGZIP(), []int{37} } func (x *Idp) GetId() string { @@ -3343,11 +3468,11 @@ func (x *Idp) GetName() string { return "" } -func (x *Idp) GetLogoSrc() []byte { +func (x *Idp) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } func (m *Idp) GetIdpConfig() isIdp_IdpConfig { @@ -3386,15 +3511,15 @@ type IdpUpdate struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,3,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + StylingType IdpStylingType `protobuf:"varint,3,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.admin.api.v1.IdpStylingType" json:"styling_type,omitempty"` } func (x *IdpUpdate) Reset() { *x = IdpUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[37] + mi := &file_admin_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3407,7 +3532,7 @@ func (x *IdpUpdate) String() string { func (*IdpUpdate) ProtoMessage() {} func (x *IdpUpdate) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[37] + mi := &file_admin_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3420,7 +3545,7 @@ func (x *IdpUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpUpdate.ProtoReflect.Descriptor instead. func (*IdpUpdate) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{37} + return file_admin_proto_rawDescGZIP(), []int{38} } func (x *IdpUpdate) GetId() string { @@ -3437,11 +3562,11 @@ func (x *IdpUpdate) GetName() string { return "" } -func (x *IdpUpdate) GetLogoSrc() []byte { +func (x *IdpUpdate) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } type OidcIdpConfig struct { @@ -3458,7 +3583,7 @@ type OidcIdpConfig struct { func (x *OidcIdpConfig) Reset() { *x = OidcIdpConfig{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[38] + mi := &file_admin_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3471,7 +3596,7 @@ func (x *OidcIdpConfig) String() string { func (*OidcIdpConfig) ProtoMessage() {} func (x *OidcIdpConfig) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[38] + mi := &file_admin_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3484,7 +3609,7 @@ func (x *OidcIdpConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfig.ProtoReflect.Descriptor instead. func (*OidcIdpConfig) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{38} + return file_admin_proto_rawDescGZIP(), []int{39} } func (x *OidcIdpConfig) GetClientId() string { @@ -3521,7 +3646,7 @@ type OidcIdpConfigCreate struct { unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,2,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + StylingType IdpStylingType `protobuf:"varint,2,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.admin.api.v1.IdpStylingType" json:"styling_type,omitempty"` ClientId string `protobuf:"bytes,3,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` ClientSecret string `protobuf:"bytes,4,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` Issuer string `protobuf:"bytes,5,opt,name=issuer,proto3" json:"issuer,omitempty"` @@ -3533,7 +3658,7 @@ type OidcIdpConfigCreate struct { func (x *OidcIdpConfigCreate) Reset() { *x = OidcIdpConfigCreate{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[39] + mi := &file_admin_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3546,7 +3671,7 @@ func (x *OidcIdpConfigCreate) String() string { func (*OidcIdpConfigCreate) ProtoMessage() {} func (x *OidcIdpConfigCreate) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[39] + mi := &file_admin_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3559,7 +3684,7 @@ func (x *OidcIdpConfigCreate) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfigCreate.ProtoReflect.Descriptor instead. func (*OidcIdpConfigCreate) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{39} + return file_admin_proto_rawDescGZIP(), []int{40} } func (x *OidcIdpConfigCreate) GetName() string { @@ -3569,11 +3694,11 @@ func (x *OidcIdpConfigCreate) GetName() string { return "" } -func (x *OidcIdpConfigCreate) GetLogoSrc() []byte { +func (x *OidcIdpConfigCreate) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } func (x *OidcIdpConfigCreate) GetClientId() string { @@ -3635,7 +3760,7 @@ type OidcIdpConfigUpdate struct { func (x *OidcIdpConfigUpdate) Reset() { *x = OidcIdpConfigUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[40] + mi := &file_admin_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3648,7 +3773,7 @@ func (x *OidcIdpConfigUpdate) String() string { func (*OidcIdpConfigUpdate) ProtoMessage() {} func (x *OidcIdpConfigUpdate) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[40] + mi := &file_admin_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3661,7 +3786,7 @@ func (x *OidcIdpConfigUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfigUpdate.ProtoReflect.Descriptor instead. func (*OidcIdpConfigUpdate) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{40} + return file_admin_proto_rawDescGZIP(), []int{41} } func (x *OidcIdpConfigUpdate) GetIdpId() string { @@ -3729,7 +3854,7 @@ type IdpSearchResponse struct { func (x *IdpSearchResponse) Reset() { *x = IdpSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[41] + mi := &file_admin_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3742,7 +3867,7 @@ func (x *IdpSearchResponse) String() string { func (*IdpSearchResponse) ProtoMessage() {} func (x *IdpSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[41] + mi := &file_admin_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3755,7 +3880,7 @@ func (x *IdpSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpSearchResponse.ProtoReflect.Descriptor instead. func (*IdpSearchResponse) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{41} + return file_admin_proto_rawDescGZIP(), []int{42} } func (x *IdpSearchResponse) GetOffset() uint64 { @@ -3810,7 +3935,7 @@ type IdpView struct { CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,6,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + StylingType IdpStylingType `protobuf:"varint,6,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.admin.api.v1.IdpStylingType" json:"styling_type,omitempty"` // Types that are assignable to IdpConfigView: // *IdpView_OidcConfig IdpConfigView isIdpView_IdpConfigView `protobuf_oneof:"idp_config_view"` @@ -3820,7 +3945,7 @@ type IdpView struct { func (x *IdpView) Reset() { *x = IdpView{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[42] + mi := &file_admin_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3833,7 +3958,7 @@ func (x *IdpView) String() string { func (*IdpView) ProtoMessage() {} func (x *IdpView) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[42] + mi := &file_admin_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3846,7 +3971,7 @@ func (x *IdpView) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpView.ProtoReflect.Descriptor instead. func (*IdpView) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{42} + return file_admin_proto_rawDescGZIP(), []int{43} } func (x *IdpView) GetId() string { @@ -3884,11 +4009,11 @@ func (x *IdpView) GetName() string { return "" } -func (x *IdpView) GetLogoSrc() []byte { +func (x *IdpView) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } func (m *IdpView) GetIdpConfigView() isIdpView_IdpConfigView { @@ -3937,7 +4062,7 @@ type OidcIdpConfigView struct { func (x *OidcIdpConfigView) Reset() { *x = OidcIdpConfigView{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[43] + mi := &file_admin_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3950,7 +4075,7 @@ func (x *OidcIdpConfigView) String() string { func (*OidcIdpConfigView) ProtoMessage() {} func (x *OidcIdpConfigView) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[43] + mi := &file_admin_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3963,7 +4088,7 @@ func (x *OidcIdpConfigView) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfigView.ProtoReflect.Descriptor instead. func (*OidcIdpConfigView) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{43} + return file_admin_proto_rawDescGZIP(), []int{44} } func (x *OidcIdpConfigView) GetClientId() string { @@ -4014,7 +4139,7 @@ type IdpSearchRequest struct { func (x *IdpSearchRequest) Reset() { *x = IdpSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[44] + mi := &file_admin_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4027,7 +4152,7 @@ func (x *IdpSearchRequest) String() string { func (*IdpSearchRequest) ProtoMessage() {} func (x *IdpSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[44] + mi := &file_admin_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4040,7 +4165,7 @@ func (x *IdpSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpSearchRequest.ProtoReflect.Descriptor instead. func (*IdpSearchRequest) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{44} + return file_admin_proto_rawDescGZIP(), []int{45} } func (x *IdpSearchRequest) GetOffset() uint64 { @@ -4077,7 +4202,7 @@ type IdpSearchQuery struct { func (x *IdpSearchQuery) Reset() { *x = IdpSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[45] + mi := &file_admin_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4090,7 +4215,7 @@ func (x *IdpSearchQuery) String() string { func (*IdpSearchQuery) ProtoMessage() {} func (x *IdpSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[45] + mi := &file_admin_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4103,7 +4228,7 @@ func (x *IdpSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpSearchQuery.ProtoReflect.Descriptor instead. func (*IdpSearchQuery) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{45} + return file_admin_proto_rawDescGZIP(), []int{46} } func (x *IdpSearchQuery) GetKey() IdpSearchKey { @@ -4127,20 +4252,219 @@ func (x *IdpSearchQuery) GetValue() string { return "" } +type DefaultLabelPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PrimaryColor string `protobuf:"bytes,1,opt,name=primary_color,json=primaryColor,proto3" json:"primary_color,omitempty"` + SecondaryColor string `protobuf:"bytes,2,opt,name=secondary_color,json=secondaryColor,proto3" json:"secondary_color,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultLabelPolicy) Reset() { + *x = DefaultLabelPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultLabelPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultLabelPolicy) ProtoMessage() {} + +func (x *DefaultLabelPolicy) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultLabelPolicy.ProtoReflect.Descriptor instead. +func (*DefaultLabelPolicy) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{47} +} + +func (x *DefaultLabelPolicy) GetPrimaryColor() string { + if x != nil { + return x.PrimaryColor + } + return "" +} + +func (x *DefaultLabelPolicy) GetSecondaryColor() string { + if x != nil { + return x.SecondaryColor + } + return "" +} + +func (x *DefaultLabelPolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultLabelPolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type DefaultLabelPolicyUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PrimaryColor string `protobuf:"bytes,1,opt,name=primary_color,json=primaryColor,proto3" json:"primary_color,omitempty"` + SecondaryColor string `protobuf:"bytes,2,opt,name=secondary_color,json=secondaryColor,proto3" json:"secondary_color,omitempty"` +} + +func (x *DefaultLabelPolicyUpdate) Reset() { + *x = DefaultLabelPolicyUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultLabelPolicyUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultLabelPolicyUpdate) ProtoMessage() {} + +func (x *DefaultLabelPolicyUpdate) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultLabelPolicyUpdate.ProtoReflect.Descriptor instead. +func (*DefaultLabelPolicyUpdate) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{48} +} + +func (x *DefaultLabelPolicyUpdate) GetPrimaryColor() string { + if x != nil { + return x.PrimaryColor + } + return "" +} + +func (x *DefaultLabelPolicyUpdate) GetSecondaryColor() string { + if x != nil { + return x.SecondaryColor + } + return "" +} + +type DefaultLabelPolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PrimaryColor string `protobuf:"bytes,1,opt,name=primary_color,json=primaryColor,proto3" json:"primary_color,omitempty"` + SecondaryColor string `protobuf:"bytes,2,opt,name=secondary_color,json=secondaryColor,proto3" json:"secondary_color,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultLabelPolicyView) Reset() { + *x = DefaultLabelPolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultLabelPolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultLabelPolicyView) ProtoMessage() {} + +func (x *DefaultLabelPolicyView) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultLabelPolicyView.ProtoReflect.Descriptor instead. +func (*DefaultLabelPolicyView) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{49} +} + +func (x *DefaultLabelPolicyView) GetPrimaryColor() string { + if x != nil { + return x.PrimaryColor + } + return "" +} + +func (x *DefaultLabelPolicyView) GetSecondaryColor() string { + if x != nil { + return x.SecondaryColor + } + return "" +} + +func (x *DefaultLabelPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultLabelPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + type DefaultLoginPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AllowUsernamePassword bool `protobuf:"varint,1,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` - AllowRegister bool `protobuf:"varint,2,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` - AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + AllowUsernamePassword bool `protobuf:"varint,1,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` + AllowRegister bool `protobuf:"varint,2,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` + AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` } func (x *DefaultLoginPolicy) Reset() { *x = DefaultLoginPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[46] + mi := &file_admin_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4153,7 +4477,7 @@ func (x *DefaultLoginPolicy) String() string { func (*DefaultLoginPolicy) ProtoMessage() {} func (x *DefaultLoginPolicy) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[46] + mi := &file_admin_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4166,7 +4490,7 @@ func (x *DefaultLoginPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use DefaultLoginPolicy.ProtoReflect.Descriptor instead. func (*DefaultLoginPolicy) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{46} + return file_admin_proto_rawDescGZIP(), []int{50} } func (x *DefaultLoginPolicy) GetAllowUsernamePassword() bool { @@ -4190,6 +4514,83 @@ func (x *DefaultLoginPolicy) GetAllowExternalIdp() bool { return false } +func (x *DefaultLoginPolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultLoginPolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type DefaultLoginPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AllowUsernamePassword bool `protobuf:"varint,1,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` + AllowRegister bool `protobuf:"varint,2,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` + AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` +} + +func (x *DefaultLoginPolicyRequest) Reset() { + *x = DefaultLoginPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultLoginPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultLoginPolicyRequest) ProtoMessage() {} + +func (x *DefaultLoginPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultLoginPolicyRequest.ProtoReflect.Descriptor instead. +func (*DefaultLoginPolicyRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{51} +} + +func (x *DefaultLoginPolicyRequest) GetAllowUsernamePassword() bool { + if x != nil { + return x.AllowUsernamePassword + } + return false +} + +func (x *DefaultLoginPolicyRequest) GetAllowRegister() bool { + if x != nil { + return x.AllowRegister + } + return false +} + +func (x *DefaultLoginPolicyRequest) GetAllowExternalIdp() bool { + if x != nil { + return x.AllowExternalIdp + } + return false +} + type IdpProviderID struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4201,7 +4602,7 @@ type IdpProviderID struct { func (x *IdpProviderID) Reset() { *x = IdpProviderID{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[47] + mi := &file_admin_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4214,7 +4615,7 @@ func (x *IdpProviderID) String() string { func (*IdpProviderID) ProtoMessage() {} func (x *IdpProviderID) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[47] + mi := &file_admin_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4227,7 +4628,7 @@ func (x *IdpProviderID) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderID.ProtoReflect.Descriptor instead. func (*IdpProviderID) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{47} + return file_admin_proto_rawDescGZIP(), []int{52} } func (x *IdpProviderID) GetIdpConfigId() string { @@ -4242,15 +4643,17 @@ type DefaultLoginPolicyView struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AllowUsernamePassword bool `protobuf:"varint,1,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` - AllowRegister bool `protobuf:"varint,2,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` - AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + AllowUsernamePassword bool `protobuf:"varint,1,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` + AllowRegister bool `protobuf:"varint,2,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` + AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` } func (x *DefaultLoginPolicyView) Reset() { *x = DefaultLoginPolicyView{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[48] + mi := &file_admin_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4263,7 +4666,7 @@ func (x *DefaultLoginPolicyView) String() string { func (*DefaultLoginPolicyView) ProtoMessage() {} func (x *DefaultLoginPolicyView) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[48] + mi := &file_admin_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4276,7 +4679,7 @@ func (x *DefaultLoginPolicyView) ProtoReflect() protoreflect.Message { // Deprecated: Use DefaultLoginPolicyView.ProtoReflect.Descriptor instead. func (*DefaultLoginPolicyView) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{48} + return file_admin_proto_rawDescGZIP(), []int{53} } func (x *DefaultLoginPolicyView) GetAllowUsernamePassword() bool { @@ -4300,6 +4703,20 @@ func (x *DefaultLoginPolicyView) GetAllowExternalIdp() bool { return false } +func (x *DefaultLoginPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultLoginPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + type IdpProviderView struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4313,7 +4730,7 @@ type IdpProviderView struct { func (x *IdpProviderView) Reset() { *x = IdpProviderView{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[49] + mi := &file_admin_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4326,7 +4743,7 @@ func (x *IdpProviderView) String() string { func (*IdpProviderView) ProtoMessage() {} func (x *IdpProviderView) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[49] + mi := &file_admin_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4339,7 +4756,7 @@ func (x *IdpProviderView) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderView.ProtoReflect.Descriptor instead. func (*IdpProviderView) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{49} + return file_admin_proto_rawDescGZIP(), []int{54} } func (x *IdpProviderView) GetIdpConfigId() string { @@ -4379,7 +4796,7 @@ type IdpProviderSearchResponse struct { func (x *IdpProviderSearchResponse) Reset() { *x = IdpProviderSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[50] + mi := &file_admin_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4392,7 +4809,7 @@ func (x *IdpProviderSearchResponse) String() string { func (*IdpProviderSearchResponse) ProtoMessage() {} func (x *IdpProviderSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[50] + mi := &file_admin_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4405,7 +4822,7 @@ func (x *IdpProviderSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderSearchResponse.ProtoReflect.Descriptor instead. func (*IdpProviderSearchResponse) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{50} + return file_admin_proto_rawDescGZIP(), []int{55} } func (x *IdpProviderSearchResponse) GetOffset() uint64 { @@ -4462,7 +4879,7 @@ type IdpProviderSearchRequest struct { func (x *IdpProviderSearchRequest) Reset() { *x = IdpProviderSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_admin_proto_msgTypes[51] + mi := &file_admin_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4475,7 +4892,7 @@ func (x *IdpProviderSearchRequest) String() string { func (*IdpProviderSearchRequest) ProtoMessage() {} func (x *IdpProviderSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_admin_proto_msgTypes[51] + mi := &file_admin_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4488,7 +4905,7 @@ func (x *IdpProviderSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderSearchRequest.ProtoReflect.Descriptor instead. func (*IdpProviderSearchRequest) Descriptor() ([]byte, []int) { - return file_admin_proto_rawDescGZIP(), []int{51} + return file_admin_proto_rawDescGZIP(), []int{56} } func (x *IdpProviderSearchRequest) GetOffset() uint64 { @@ -4505,6 +4922,669 @@ func (x *IdpProviderSearchRequest) GetLimit() uint64 { return 0 } +type DefaultPasswordComplexityPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinLength uint64 `protobuf:"varint,1,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + HasUppercase bool `protobuf:"varint,2,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` + HasLowercase bool `protobuf:"varint,3,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` + HasNumber bool `protobuf:"varint,4,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` + HasSymbol bool `protobuf:"varint,5,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,7,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultPasswordComplexityPolicy) Reset() { + *x = DefaultPasswordComplexityPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordComplexityPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordComplexityPolicy) ProtoMessage() {} + +func (x *DefaultPasswordComplexityPolicy) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordComplexityPolicy.ProtoReflect.Descriptor instead. +func (*DefaultPasswordComplexityPolicy) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{57} +} + +func (x *DefaultPasswordComplexityPolicy) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *DefaultPasswordComplexityPolicy) GetHasUppercase() bool { + if x != nil { + return x.HasUppercase + } + return false +} + +func (x *DefaultPasswordComplexityPolicy) GetHasLowercase() bool { + if x != nil { + return x.HasLowercase + } + return false +} + +func (x *DefaultPasswordComplexityPolicy) GetHasNumber() bool { + if x != nil { + return x.HasNumber + } + return false +} + +func (x *DefaultPasswordComplexityPolicy) GetHasSymbol() bool { + if x != nil { + return x.HasSymbol + } + return false +} + +func (x *DefaultPasswordComplexityPolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultPasswordComplexityPolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type DefaultPasswordComplexityPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinLength uint64 `protobuf:"varint,1,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + HasUppercase bool `protobuf:"varint,2,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` + HasLowercase bool `protobuf:"varint,3,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` + HasNumber bool `protobuf:"varint,4,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` + HasSymbol bool `protobuf:"varint,5,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` +} + +func (x *DefaultPasswordComplexityPolicyRequest) Reset() { + *x = DefaultPasswordComplexityPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordComplexityPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordComplexityPolicyRequest) ProtoMessage() {} + +func (x *DefaultPasswordComplexityPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordComplexityPolicyRequest.ProtoReflect.Descriptor instead. +func (*DefaultPasswordComplexityPolicyRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{58} +} + +func (x *DefaultPasswordComplexityPolicyRequest) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *DefaultPasswordComplexityPolicyRequest) GetHasUppercase() bool { + if x != nil { + return x.HasUppercase + } + return false +} + +func (x *DefaultPasswordComplexityPolicyRequest) GetHasLowercase() bool { + if x != nil { + return x.HasLowercase + } + return false +} + +func (x *DefaultPasswordComplexityPolicyRequest) GetHasNumber() bool { + if x != nil { + return x.HasNumber + } + return false +} + +func (x *DefaultPasswordComplexityPolicyRequest) GetHasSymbol() bool { + if x != nil { + return x.HasSymbol + } + return false +} + +type DefaultPasswordComplexityPolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinLength uint64 `protobuf:"varint,1,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + HasUppercase bool `protobuf:"varint,2,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` + HasLowercase bool `protobuf:"varint,3,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` + HasNumber bool `protobuf:"varint,4,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` + HasSymbol bool `protobuf:"varint,5,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,7,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultPasswordComplexityPolicyView) Reset() { + *x = DefaultPasswordComplexityPolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordComplexityPolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordComplexityPolicyView) ProtoMessage() {} + +func (x *DefaultPasswordComplexityPolicyView) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordComplexityPolicyView.ProtoReflect.Descriptor instead. +func (*DefaultPasswordComplexityPolicyView) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{59} +} + +func (x *DefaultPasswordComplexityPolicyView) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *DefaultPasswordComplexityPolicyView) GetHasUppercase() bool { + if x != nil { + return x.HasUppercase + } + return false +} + +func (x *DefaultPasswordComplexityPolicyView) GetHasLowercase() bool { + if x != nil { + return x.HasLowercase + } + return false +} + +func (x *DefaultPasswordComplexityPolicyView) GetHasNumber() bool { + if x != nil { + return x.HasNumber + } + return false +} + +func (x *DefaultPasswordComplexityPolicyView) GetHasSymbol() bool { + if x != nil { + return x.HasSymbol + } + return false +} + +func (x *DefaultPasswordComplexityPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultPasswordComplexityPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type DefaultPasswordAgePolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAgeDays uint64 `protobuf:"varint,1,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` + ExpireWarnDays uint64 `protobuf:"varint,2,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultPasswordAgePolicy) Reset() { + *x = DefaultPasswordAgePolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordAgePolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordAgePolicy) ProtoMessage() {} + +func (x *DefaultPasswordAgePolicy) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordAgePolicy.ProtoReflect.Descriptor instead. +func (*DefaultPasswordAgePolicy) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{60} +} + +func (x *DefaultPasswordAgePolicy) GetMaxAgeDays() uint64 { + if x != nil { + return x.MaxAgeDays + } + return 0 +} + +func (x *DefaultPasswordAgePolicy) GetExpireWarnDays() uint64 { + if x != nil { + return x.ExpireWarnDays + } + return 0 +} + +func (x *DefaultPasswordAgePolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultPasswordAgePolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type DefaultPasswordAgePolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAgeDays uint64 `protobuf:"varint,1,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` + ExpireWarnDays uint64 `protobuf:"varint,2,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` +} + +func (x *DefaultPasswordAgePolicyRequest) Reset() { + *x = DefaultPasswordAgePolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordAgePolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordAgePolicyRequest) ProtoMessage() {} + +func (x *DefaultPasswordAgePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordAgePolicyRequest.ProtoReflect.Descriptor instead. +func (*DefaultPasswordAgePolicyRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{61} +} + +func (x *DefaultPasswordAgePolicyRequest) GetMaxAgeDays() uint64 { + if x != nil { + return x.MaxAgeDays + } + return 0 +} + +func (x *DefaultPasswordAgePolicyRequest) GetExpireWarnDays() uint64 { + if x != nil { + return x.ExpireWarnDays + } + return 0 +} + +type DefaultPasswordAgePolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAgeDays uint64 `protobuf:"varint,1,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` + ExpireWarnDays uint64 `protobuf:"varint,2,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultPasswordAgePolicyView) Reset() { + *x = DefaultPasswordAgePolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordAgePolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordAgePolicyView) ProtoMessage() {} + +func (x *DefaultPasswordAgePolicyView) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordAgePolicyView.ProtoReflect.Descriptor instead. +func (*DefaultPasswordAgePolicyView) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{62} +} + +func (x *DefaultPasswordAgePolicyView) GetMaxAgeDays() uint64 { + if x != nil { + return x.MaxAgeDays + } + return 0 +} + +func (x *DefaultPasswordAgePolicyView) GetExpireWarnDays() uint64 { + if x != nil { + return x.ExpireWarnDays + } + return 0 +} + +func (x *DefaultPasswordAgePolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultPasswordAgePolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type DefaultPasswordLockoutPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAttempts uint64 `protobuf:"varint,1,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` + ShowLockoutFailure bool `protobuf:"varint,2,opt,name=show_lockout_failure,json=showLockoutFailure,proto3" json:"show_lockout_failure,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultPasswordLockoutPolicy) Reset() { + *x = DefaultPasswordLockoutPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordLockoutPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordLockoutPolicy) ProtoMessage() {} + +func (x *DefaultPasswordLockoutPolicy) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordLockoutPolicy.ProtoReflect.Descriptor instead. +func (*DefaultPasswordLockoutPolicy) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{63} +} + +func (x *DefaultPasswordLockoutPolicy) GetMaxAttempts() uint64 { + if x != nil { + return x.MaxAttempts + } + return 0 +} + +func (x *DefaultPasswordLockoutPolicy) GetShowLockoutFailure() bool { + if x != nil { + return x.ShowLockoutFailure + } + return false +} + +func (x *DefaultPasswordLockoutPolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultPasswordLockoutPolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type DefaultPasswordLockoutPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAttempts uint64 `protobuf:"varint,1,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` + ShowLockoutFailure bool `protobuf:"varint,2,opt,name=show_lockout_failure,json=showLockoutFailure,proto3" json:"show_lockout_failure,omitempty"` +} + +func (x *DefaultPasswordLockoutPolicyRequest) Reset() { + *x = DefaultPasswordLockoutPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordLockoutPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordLockoutPolicyRequest) ProtoMessage() {} + +func (x *DefaultPasswordLockoutPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordLockoutPolicyRequest.ProtoReflect.Descriptor instead. +func (*DefaultPasswordLockoutPolicyRequest) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{64} +} + +func (x *DefaultPasswordLockoutPolicyRequest) GetMaxAttempts() uint64 { + if x != nil { + return x.MaxAttempts + } + return 0 +} + +func (x *DefaultPasswordLockoutPolicyRequest) GetShowLockoutFailure() bool { + if x != nil { + return x.ShowLockoutFailure + } + return false +} + +type DefaultPasswordLockoutPolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAttempts uint64 `protobuf:"varint,1,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` + ShowLockoutFailure bool `protobuf:"varint,2,opt,name=show_lockout_failure,json=showLockoutFailure,proto3" json:"show_lockout_failure,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *DefaultPasswordLockoutPolicyView) Reset() { + *x = DefaultPasswordLockoutPolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_admin_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultPasswordLockoutPolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultPasswordLockoutPolicyView) ProtoMessage() {} + +func (x *DefaultPasswordLockoutPolicyView) ProtoReflect() protoreflect.Message { + mi := &file_admin_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultPasswordLockoutPolicyView.ProtoReflect.Descriptor instead. +func (*DefaultPasswordLockoutPolicyView) Descriptor() ([]byte, []int) { + return file_admin_proto_rawDescGZIP(), []int{65} +} + +func (x *DefaultPasswordLockoutPolicyView) GetMaxAttempts() uint64 { + if x != nil { + return x.MaxAttempts + } + return 0 +} + +func (x *DefaultPasswordLockoutPolicyView) GetShowLockoutFailure() bool { + if x != nil { + return x.ShowLockoutFailure + } + return false +} + +func (x *DefaultPasswordLockoutPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *DefaultPasswordLockoutPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + var File_admin_proto protoreflect.FileDescriptor var file_admin_proto_rawDesc = []byte{ @@ -4764,289 +5844,401 @@ var file_admin_proto_rawDesc = []byte{ 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xb5, 0x02, 0x0a, 0x0c, 0x4f, 0x72, + 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x93, 0x02, 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, + 0x64, 0x12, 0x38, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, + 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4d, + 0x75, 0x73, 0x74, 0x42, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, + 0x97, 0x02, 0x0a, 0x10, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x56, 0x69, 0x65, 0x77, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x19, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x62, + 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, + 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4d, 0x75, 0x73, 0x74, 0x42, 0x65, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x13, 0x4f, 0x72, + 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1e, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x4d, 0x75, 0x73, 0x74, 0x42, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6e, 0x4d, 0x75, 0x73, 0x74, 0x42, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x30, 0x0a, + 0x0e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x12, + 0x1e, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, + 0x26, 0x0a, 0x0e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x09, 0x49, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, - 0x65, 0x22, 0x91, 0x01, 0x0a, 0x13, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x06, 0x6f, 0x72, 0x67, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x19, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x62, - 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, - 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4d, 0x75, 0x73, 0x74, 0x42, 0x65, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x30, 0x0a, 0x0e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x26, 0x0a, 0x0e, 0x49, 0x61, 0x6d, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, - 0xd4, 0x01, 0x0a, 0x09, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, - 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, - 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x22, 0x9e, 0x02, 0x0a, 0x17, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x40, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0xea, 0x02, 0x0a, 0x0d, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x91, 0x01, 0x0a, 0x16, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x49, 0x0a, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x14, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x49, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x49, 0x44, 0x12, 0x23, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x5b, 0x0a, 0x0c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xb9, 0x01, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x66, 0x61, - 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x53, 0x0a, 0x06, 0x56, 0x69, 0x65, 0x77, 0x49, 0x44, 0x12, 0x23, 0x0a, 0x08, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, - 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x05, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x35, 0x0a, - 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x05, 0x76, - 0x69, 0x65, 0x77, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x04, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, - 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, - 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x20, 0x0a, 0x05, 0x49, 0x64, 0x70, 0x49, - 0x44, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0xf4, 0x02, 0x0a, 0x03, 0x49, - 0x64, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x53, 0x72, 0x63, 0x12, 0x4b, 0x0a, 0x0b, 0x6f, 0x69, - 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, - 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, - 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0x53, 0x0a, 0x09, 0x49, 0x64, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, - 0x6f, 0x67, 0x6f, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, - 0x6f, 0x67, 0x6f, 0x53, 0x72, 0x63, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x4f, 0x69, 0x64, 0x63, 0x49, - 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, - 0x73, 0x75, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, - 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x22, 0xa4, 0x03, 0x0a, 0x13, 0x4f, - 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x53, 0x72, 0x63, 0x12, 0x27, 0x0a, - 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, - 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, - 0x18, 0xc8, 0x01, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x10, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x22, 0xfd, 0x02, 0x0a, 0x13, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x06, 0x69, 0x64, 0x70, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x05, 0x69, 0x64, 0x70, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x09, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, - 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, - 0x18, 0xc8, 0x01, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x10, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x4d, + 0x0a, 0x13, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x50, 0x0a, + 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, + 0x3a, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x9e, 0x02, 0x0a, 0x17, + 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, + 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, + 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, + 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xea, 0x02, 0x0a, + 0x0d, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, + 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x16, 0x49, 0x61, + 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x49, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x14, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x49, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x3f, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x0d, 0x46, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x23, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x24, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x76, 0x69, 0x65, + 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x5b, + 0x0a, 0x0c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4b, + 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xb9, 0x01, 0x0a, 0x0b, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x06, 0x56, 0x69, 0x65, 0x77, 0x49, + 0x44, 0x12, 0x23, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x05, + 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x05, 0x76, 0x69, 0x65, 0x77, 0x73, 0x22, 0xb1, 0x01, 0x0a, + 0x04, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, + 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, + 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x20, 0x0a, 0x05, 0x49, 0x64, 0x70, 0x49, 0x44, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, + 0x69, 0x64, 0x22, 0xa7, 0x03, 0x0a, 0x03, 0x49, 0x64, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x81, 0x03, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x56, 0x69, - 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x73, 0x74, 0x79, 0x6c, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, + 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, + 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0c, + 0x0a, 0x0a, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x86, 0x01, 0x0a, + 0x09, 0x49, 0x64, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x73, 0x74, 0x79, 0x6c, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, + 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, + 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, + 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x22, 0xd7, 0x03, 0x0a, 0x13, 0x4f, 0x69, + 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x27, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x08, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x0c, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, + 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x10, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x22, 0xfd, 0x02, 0x0a, 0x13, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x06, 0x69, + 0x64, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x69, 0x64, 0x70, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x09, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, + 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, + 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x10, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x22, 0x92, 0x02, 0x0a, 0x11, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb4, 0x03, 0x0a, 0x07, 0x49, 0x64, 0x70, + 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x4f, 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x69, + 0x65, 0x77, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x11, 0x0a, 0x0f, + 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x22, + 0x9e, 0x02, 0x0a, 0x11, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x12, 0x64, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, + 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x22, 0x85, 0x01, 0x0a, 0x10, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xac, 0x01, 0x0a, 0x0e, 0x49, 0x64, 0x70, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x43, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, + 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x3f, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, + 0x6c, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x3f, 0x0a, 0x0d, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, + 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x18, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0xe4, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, + 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x43, + 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, @@ -5054,80 +6246,58 @@ var file_admin_proto_rawDesc = []byte{ 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x53, 0x72, 0x63, 0x12, 0x4f, 0x0a, 0x0b, 0x6f, 0x69, - 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, - 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, - 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x69, 0x64, 0x70, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x22, 0x9e, 0x02, 0x0a, 0x11, 0x4f, - 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x69, 0x65, 0x77, - 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, - 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x64, 0x0a, - 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, - 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, - 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x85, 0x01, 0x0a, 0x10, - 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43, - 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x22, 0xac, 0x01, 0x0a, 0x0e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x43, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x06, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x70, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, 0x22, 0x3c, 0x0a, 0x0d, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x0d, 0x69, 0x64, 0x70, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x49, 0x64, 0x22, 0xa5, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, - 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2c, - 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x69, 0x64, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, 0x22, 0x81, 0x01, 0x0a, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x9f, 0x02, 0x0a, 0x12, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, 0x12, + 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xa8, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x70, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, 0x22, 0x3c, 0x0a, 0x0d, 0x49, 0x64, 0x70, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x0d, 0x69, 0x64, 0x70, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x16, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, + 0x77, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, 0x12, 0x3f, + 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0f, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, @@ -5158,416 +6328,668 @@ var file_admin_proto_rawDesc = []byte{ 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2a, - 0x50, 0x0a, 0x08, 0x4f, 0x72, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4f, - 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, - 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, - 0x02, 0x2a, 0x74, 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, - 0x79, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, - 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, - 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, - 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, - 0x16, 0x0a, 0x12, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x6c, 0x0a, 0x0f, 0x4f, 0x72, 0x67, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x52, - 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x45, 0x51, - 0x55, 0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, - 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x53, - 0x5f, 0x57, 0x49, 0x54, 0x48, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x53, 0x45, - 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, - 0x49, 0x4e, 0x53, 0x10, 0x02, 0x2a, 0xaf, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, - 0x0a, 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, - 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x44, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, - 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, 0x05, - 0x12, 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, - 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x06, 0x2a, 0x58, 0x0a, 0x06, 0x47, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x12, 0x16, 0x0a, 0x12, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x45, 0x4e, - 0x44, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x4d, 0x41, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, - 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x12, 0x0a, - 0x0e, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x56, 0x45, 0x52, 0x53, 0x45, 0x10, - 0x03, 0x2a, 0x41, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x4b, 0x45, - 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x13, 0x0a, 0x0f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x4b, 0x45, 0x59, 0x5f, 0x4a, 0x53, - 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0xbb, 0x01, 0x0a, 0x12, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x1e, 0x49, - 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, - 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x21, 0x0a, 0x1d, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, - 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, - 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x4e, 0x41, - 0x4d, 0x45, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, - 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, - 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x44, - 0x10, 0x04, 0x2a, 0xea, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, - 0x48, 0x4f, 0x44, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x53, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x45, - 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, - 0x49, 0x4e, 0x53, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, - 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x49, 0x47, 0x4e, - 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x10, 0x03, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x45, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0xc6, 0x02, 0x0a, 0x1f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, + 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, + 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x68, 0x61, 0x73, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, + 0x61, 0x73, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xcf, 0x01, 0x0a, 0x26, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, + 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, + 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x68, 0x61, 0x73, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, + 0x61, 0x73, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0xca, 0x02, 0x0a, 0x23, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, + 0x65, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, + 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, 0x70, + 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, + 0x61, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x68, + 0x61, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x68, 0x61, 0x73, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, + 0x73, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x68, 0x61, 0x73, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xe4, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, + 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, + 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, + 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x6d, + 0x0a, 0x1f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, + 0x61, 0x79, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, + 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x22, 0xe8, 0x01, + 0x0a, 0x1c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x20, + 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, + 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, + 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xf1, 0x01, 0x0a, 0x1c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, + 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, + 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, + 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x68, 0x6f, 0x77, + 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x3f, + 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x7a, 0x0a, 0x23, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, + 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, + 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, + 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, + 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x21, 0x0a, + 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, + 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, + 0x2a, 0x50, 0x0a, 0x08, 0x4f, 0x72, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x14, + 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x52, 0x47, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4f, + 0x52, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, + 0x10, 0x02, 0x2a, 0x74, 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, + 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, + 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4f, 0x52, 0x47, 0x53, 0x45, + 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x02, + 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x6c, 0x0a, 0x0f, 0x4f, 0x72, 0x67, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x16, 0x4f, + 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x45, + 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x47, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x53, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x41, - 0x53, 0x45, 0x10, 0x04, 0x12, 0x25, 0x0a, 0x21, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, - 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x49, 0x47, - 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x41, 0x52, - 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, - 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x10, 0x07, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x41, 0x52, 0x43, - 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x48, 0x41, - 0x4e, 0x10, 0x08, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, - 0x48, 0x4f, 0x44, 0x5f, 0x49, 0x53, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x46, 0x10, 0x09, 0x12, - 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, - 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x10, 0x0a, 0x2a, - 0x62, 0x0a, 0x08, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x49, - 0x44, 0x50, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, - 0x44, 0x50, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x44, 0x50, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, - 0x45, 0x10, 0x02, 0x2a, 0x79, 0x0a, 0x10, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x49, 0x44, 0x43, 0x4d, - 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x49, 0x44, - 0x43, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x52, - 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x4e, 0x41, 0x4d, 0x45, - 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, - 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x2a, 0x63, - 0x0a, 0x0c, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1c, - 0x0a, 0x18, 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, - 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x49, 0x44, 0x50, - 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, - 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x41, 0x4d, - 0x45, 0x10, 0x02, 0x2a, 0x46, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, - 0x0a, 0x13, 0x49, 0x44, 0x50, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, 0x50, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, 0x50, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x4c, 0x10, 0x02, 0x32, 0x86, 0x25, 0x0a, 0x0c, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x07, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x53, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x53, + 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x41, 0x49, 0x4e, 0x53, 0x10, 0x02, 0x2a, 0xaf, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, + 0x11, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x45, 0x44, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x53, + 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, + 0x05, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, + 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x06, 0x2a, 0x58, 0x0a, 0x06, 0x47, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x12, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x45, + 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x4d, 0x41, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, + 0x0b, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x12, + 0x0a, 0x0e, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x56, 0x45, 0x52, 0x53, 0x45, + 0x10, 0x03, 0x2a, 0x41, 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x4b, + 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x4b, 0x45, 0x59, 0x5f, 0x4a, + 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0xbb, 0x01, 0x0a, 0x12, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x1e, + 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, + 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, + 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, + 0x45, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, + 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x4e, + 0x41, 0x4d, 0x45, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, + 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x45, 0x4d, 0x41, 0x49, + 0x4c, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x41, 0x4d, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, + 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, + 0x44, 0x10, 0x04, 0x2a, 0xea, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x00, 0x12, 0x1c, 0x0a, + 0x18, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x53, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, + 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x41, 0x49, 0x4e, 0x53, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x49, 0x47, + 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x10, 0x03, 0x12, 0x28, 0x0a, 0x24, 0x53, + 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x52, + 0x54, 0x53, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x43, + 0x41, 0x53, 0x45, 0x10, 0x04, 0x12, 0x25, 0x0a, 0x21, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, + 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x49, + 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, + 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x45, 0x41, + 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x10, 0x07, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x41, 0x52, + 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x48, + 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x49, 0x53, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x46, 0x10, 0x09, + 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, + 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x10, 0x0a, + 0x2a, 0x4b, 0x0a, 0x0e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x44, 0x50, 0x53, 0x54, 0x59, 0x4c, 0x49, 0x4e, 0x47, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x44, 0x50, 0x53, 0x54, 0x59, 0x4c, 0x49, 0x4e, 0x47, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0x62, 0x0a, + 0x08, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x44, 0x50, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x44, 0x50, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x44, 0x50, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, + 0x02, 0x2a, 0x79, 0x0a, 0x10, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x41, 0x50, + 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x49, 0x44, 0x43, 0x4d, + 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x46, + 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, + 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, + 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x2a, 0x63, 0x0a, 0x0c, + 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x18, + 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x44, + 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x49, 0x44, 0x50, 0x5f, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x44, + 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, + 0x02, 0x2a, 0x46, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, + 0x49, 0x44, 0x50, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, 0x50, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, 0x50, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x4c, 0x10, 0x02, 0x32, 0xe5, 0x33, 0x0a, 0x0c, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x47, 0x0a, 0x05, 0x52, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x4e, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x11, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x49, 0x73, 0x4f, 0x72, 0x67, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x4f, 0x72, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x4f, 0x72, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x69, 0x73, 0x75, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x42, 0x79, 0x49, 0x44, + 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, + 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x72, 0x67, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x6f, 0x72, 0x67, + 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4f, + 0x72, 0x67, 0x73, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, + 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x8b, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x55, 0x70, + 0x4f, 0x72, 0x67, 0x12, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x72, 0x67, 0x53, 0x65, 0x74, 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, + 0x65, 0x74, 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x74, + 0x75, 0x70, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, - 0x08, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x47, 0x0a, 0x05, 0x52, 0x65, 0x61, - 0x64, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x0e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x12, 0x4e, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, - 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0b, 0x49, 0x73, 0x4f, 0x72, 0x67, 0x55, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4f, 0x72, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x4f, 0x72, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x69, 0x73, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, - 0x72, 0x65, 0x61, 0x64, 0x12, 0x70, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x42, 0x79, - 0x49, 0x44, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x72, 0x67, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x67, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x6f, - 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, - 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4f, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x72, 0x67, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, - 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, - 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x8b, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x74, - 0x55, 0x70, 0x4f, 0x72, 0x67, 0x12, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x65, 0x74, 0x55, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, - 0x67, 0x53, 0x65, 0x74, 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, 0x73, - 0x65, 0x74, 0x75, 0x70, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x69, 0x61, 0x6d, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9c, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, - 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x44, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x35, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, - 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa8, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, - 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, - 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, - 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0xa8, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, 0x61, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x56, 0x69, 0x65, 0x77, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x6f, + 0x72, 0x67, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x6d, 0x82, 0xb5, 0x18, 0x11, 0x0a, + 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, + 0x12, 0xb4, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, + 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, + 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x1a, + 0x1d, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x6d, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, + 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, + 0x69, 0x65, 0x77, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x6f, 0x72, + 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x6d, 0x82, 0xb5, 0x18, 0x11, 0x0a, + 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, + 0x12, 0xae, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x1a, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, - 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x12, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x2a, 0x18, 0x2f, - 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x61, - 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x69, 0x61, 0x6d, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x83, - 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x63, + 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, + 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x2f, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x6d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, + 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x12, 0xae, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x49, + 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x1a, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, + 0x2f, 0x7b, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x2f, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x6d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, + 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x96, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, + 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x20, 0x2a, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x6f, 0x72, 0x67, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6f, 0x72, + 0x67, 0x69, 0x61, 0x6d, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x11, + 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, + 0x64, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x22, 0x08, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, + 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x61, + 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xab, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, - 0x0e, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x82, - 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, - 0x72, 0x65, 0x61, 0x64, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x29, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0d, 0x22, 0x08, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x61, 0x6d, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, - 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, - 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, - 0x12, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xab, 0x01, 0x0a, 0x10, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, - 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, + 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, + 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x62, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x56, 0x69, 0x65, 0x77, + 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0x1c, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x82, 0xb5, 0x18, 0x0a, 0x0a, + 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x7c, 0x0a, 0x09, 0x43, 0x6c, 0x65, + 0x61, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x21, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x76, 0x69, 0x65, 0x77, + 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x7b, 0x76, 0x69, + 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x69, 0x61, + 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x23, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, + 0x12, 0xa4, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x44, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, + 0x2a, 0x36, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x7b, 0x76, 0x69, 0x65, 0x77, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x69, 0x61, + 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x75, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x42, 0x79, + 0x49, 0x44, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, - 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x62, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x56, - 0x69, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0x1c, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x82, 0xb5, - 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x7c, 0x0a, 0x09, - 0x43, 0x6c, 0x65, 0x61, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x21, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1d, 0x2f, 0x76, - 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, - 0x7b, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, - 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x23, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x69, 0x61, 0x6d, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x12, 0xa4, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x46, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x38, 0x2a, 0x36, 0x2f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x7b, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x7d, 0x2f, 0x7b, 0x76, - 0x69, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x7b, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, - 0x09, 0x69, 0x61, 0x6d, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x75, 0x0a, 0x07, 0x49, 0x64, - 0x70, 0x42, 0x79, 0x49, 0x44, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x22, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x56, 0x69, 0x65, 0x77, 0x22, 0x24, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, - 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x72, 0x65, 0x61, - 0x64, 0x12, 0x89, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x69, 0x64, 0x63, - 0x49, 0x64, 0x70, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x64, 0x70, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x69, 0x64, - 0x70, 0x73, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, - 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x81, 0x01, - 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x24, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x1a, - 0x0a, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, - 0x18, 0x0f, 0x0a, 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1b, 0x1a, 0x16, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, - 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, - 0x18, 0x0f, 0x0a, 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x12, 0x8d, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1b, 0x1a, 0x16, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, - 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, - 0x18, 0x0f, 0x0a, 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x12, 0x72, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x70, 0x49, 0x44, 0x1a, 0x22, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x2a, 0x0a, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa8, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, - 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x28, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, - 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, - 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x1a, - 0x19, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x6f, 0x69, 0x64, 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x0f, 0x0a, 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x93, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x70, 0x73, 0x12, - 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, - 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, + 0x2e, 0x49, 0x64, 0x70, 0x56, 0x69, 0x65, 0x77, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, + 0x12, 0x0a, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0e, + 0x0a, 0x0c, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x89, + 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, + 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, + 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, + 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, + 0x6f, 0x69, 0x64, 0x63, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x69, 0x61, 0x6d, + 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x0f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x24, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x64, 0x70, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x1a, 0x0a, 0x2f, 0x69, + 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, + 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8d, + 0x01, 0x0a, 0x13, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, + 0x1a, 0x16, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, + 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8d, + 0x01, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, + 0x1a, 0x16, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x72, 0x65, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, + 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x72, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x20, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, + 0x70, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x2a, 0x0a, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, + 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0xa8, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x69, 0x64, + 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x28, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x1a, 0x19, 0x2f, 0x69, + 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x69, 0x64, + 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, + 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x93, 0x01, + 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x70, 0x73, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x12, 0x22, 0x0d, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, - 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x90, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, - 0x6f, 0x67, 0x69, 0x6e, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x18, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x22, + 0x0d, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x69, 0x61, 0x6d, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x72, + 0x65, 0x61, 0x64, 0x12, 0x90, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xd4, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, - 0x24, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, - 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xb7, 0x01, - 0x0a, 0x22, 0x41, 0x64, 0x64, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x54, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x28, + 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, + 0x12, 0x0f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xb0, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, + 0x0f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x90, 0x01, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x31, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xb1, 0x01, 0x0a, + 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, + 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x1a, 0x0f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, + 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x12, 0xd4, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, + 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xb7, 0x01, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x49, + 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, - 0x22, 0x1c, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, - 0x6e, 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xba, 0x01, 0x0a, 0x27, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x72, 0x6f, - 0x6d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x49, 0x44, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x69, 0x64, 0x70, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, + 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x12, 0xb7, 0x01, 0x0a, 0x27, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x64, 0x70, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x2a, 0x2c, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb8, 0x01, 0x0a, 0x22, + 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x3e, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, + 0x79, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xe6, 0x01, 0x0a, 0x25, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x41, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x22, 0x2c, 0x2f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x69, - 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, - 0x18, 0x12, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x42, 0xba, 0x01, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x92, - 0x41, 0x8e, 0x01, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x22, 0x2b, 0x12, 0x29, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x64, 0x6d, 0x69, - 0x6e, 0x32, 0x03, 0x30, 0x2e, 0x31, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x3a, 0x10, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, - 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, - 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x1a, 0x1d, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x69, + 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, + 0xa3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, + 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x61, 0x67, 0x65, + 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xca, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1b, 0x1a, 0x16, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x61, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, + 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0xaf, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x3b, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, + 0x6d, 0x69, 0x6e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x37, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x82, + 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0xda, 0x01, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, + 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3e, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, 0x2f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x2f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, + 0x10, 0x69, 0x61, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x42, 0xba, 0x01, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, + 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x92, 0x41, 0x8e, 0x01, + 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x22, 0x2b, 0x12, 0x29, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x32, 0x03, + 0x30, 0x2e, 0x31, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5582,211 +7004,272 @@ func file_admin_proto_rawDescGZIP() []byte { return file_admin_proto_rawDescData } -var file_admin_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 52) +var file_admin_proto_enumTypes = make([]protoimpl.EnumInfo, 13) +var file_admin_proto_msgTypes = make([]protoimpl.MessageInfo, 66) var file_admin_proto_goTypes = []interface{}{ - (OrgState)(0), // 0: caos.zitadel.admin.api.v1.OrgState - (OrgSearchKey)(0), // 1: caos.zitadel.admin.api.v1.OrgSearchKey - (OrgSearchMethod)(0), // 2: caos.zitadel.admin.api.v1.OrgSearchMethod - (UserState)(0), // 3: caos.zitadel.admin.api.v1.UserState - (Gender)(0), // 4: caos.zitadel.admin.api.v1.Gender - (MachineKeyType)(0), // 5: caos.zitadel.admin.api.v1.MachineKeyType - (IamMemberSearchKey)(0), // 6: caos.zitadel.admin.api.v1.IamMemberSearchKey - (SearchMethod)(0), // 7: caos.zitadel.admin.api.v1.SearchMethod - (IdpState)(0), // 8: caos.zitadel.admin.api.v1.IdpState - (OIDCMappingField)(0), // 9: caos.zitadel.admin.api.v1.OIDCMappingField - (IdpSearchKey)(0), // 10: caos.zitadel.admin.api.v1.IdpSearchKey - (IdpType)(0), // 11: caos.zitadel.admin.api.v1.IdpType - (*OrgID)(nil), // 12: caos.zitadel.admin.api.v1.OrgID - (*UniqueOrgRequest)(nil), // 13: caos.zitadel.admin.api.v1.UniqueOrgRequest - (*UniqueOrgResponse)(nil), // 14: caos.zitadel.admin.api.v1.UniqueOrgResponse - (*Org)(nil), // 15: caos.zitadel.admin.api.v1.Org - (*OrgSearchRequest)(nil), // 16: caos.zitadel.admin.api.v1.OrgSearchRequest - (*OrgSearchQuery)(nil), // 17: caos.zitadel.admin.api.v1.OrgSearchQuery - (*OrgSearchResponse)(nil), // 18: caos.zitadel.admin.api.v1.OrgSearchResponse - (*OrgSetUpRequest)(nil), // 19: caos.zitadel.admin.api.v1.OrgSetUpRequest - (*OrgSetUpResponse)(nil), // 20: caos.zitadel.admin.api.v1.OrgSetUpResponse - (*CreateUserRequest)(nil), // 21: caos.zitadel.admin.api.v1.CreateUserRequest - (*CreateHumanRequest)(nil), // 22: caos.zitadel.admin.api.v1.CreateHumanRequest - (*CreateMachineRequest)(nil), // 23: caos.zitadel.admin.api.v1.CreateMachineRequest - (*UserResponse)(nil), // 24: caos.zitadel.admin.api.v1.UserResponse - (*HumanResponse)(nil), // 25: caos.zitadel.admin.api.v1.HumanResponse - (*MachineResponse)(nil), // 26: caos.zitadel.admin.api.v1.MachineResponse - (*MachineKeyResponse)(nil), // 27: caos.zitadel.admin.api.v1.MachineKeyResponse - (*CreateOrgRequest)(nil), // 28: caos.zitadel.admin.api.v1.CreateOrgRequest - (*OrgIamPolicy)(nil), // 29: caos.zitadel.admin.api.v1.OrgIamPolicy - (*OrgIamPolicyRequest)(nil), // 30: caos.zitadel.admin.api.v1.OrgIamPolicyRequest - (*OrgIamPolicyID)(nil), // 31: caos.zitadel.admin.api.v1.OrgIamPolicyID - (*IamMemberRoles)(nil), // 32: caos.zitadel.admin.api.v1.IamMemberRoles - (*IamMember)(nil), // 33: caos.zitadel.admin.api.v1.IamMember - (*AddIamMemberRequest)(nil), // 34: caos.zitadel.admin.api.v1.AddIamMemberRequest - (*ChangeIamMemberRequest)(nil), // 35: caos.zitadel.admin.api.v1.ChangeIamMemberRequest - (*RemoveIamMemberRequest)(nil), // 36: caos.zitadel.admin.api.v1.RemoveIamMemberRequest - (*IamMemberSearchResponse)(nil), // 37: caos.zitadel.admin.api.v1.IamMemberSearchResponse - (*IamMemberView)(nil), // 38: caos.zitadel.admin.api.v1.IamMemberView - (*IamMemberSearchRequest)(nil), // 39: caos.zitadel.admin.api.v1.IamMemberSearchRequest - (*IamMemberSearchQuery)(nil), // 40: caos.zitadel.admin.api.v1.IamMemberSearchQuery - (*FailedEventID)(nil), // 41: caos.zitadel.admin.api.v1.FailedEventID - (*FailedEvents)(nil), // 42: caos.zitadel.admin.api.v1.FailedEvents - (*FailedEvent)(nil), // 43: caos.zitadel.admin.api.v1.FailedEvent - (*ViewID)(nil), // 44: caos.zitadel.admin.api.v1.ViewID - (*Views)(nil), // 45: caos.zitadel.admin.api.v1.Views - (*View)(nil), // 46: caos.zitadel.admin.api.v1.View - (*IdpID)(nil), // 47: caos.zitadel.admin.api.v1.IdpID - (*Idp)(nil), // 48: caos.zitadel.admin.api.v1.Idp - (*IdpUpdate)(nil), // 49: caos.zitadel.admin.api.v1.IdpUpdate - (*OidcIdpConfig)(nil), // 50: caos.zitadel.admin.api.v1.OidcIdpConfig - (*OidcIdpConfigCreate)(nil), // 51: caos.zitadel.admin.api.v1.OidcIdpConfigCreate - (*OidcIdpConfigUpdate)(nil), // 52: caos.zitadel.admin.api.v1.OidcIdpConfigUpdate - (*IdpSearchResponse)(nil), // 53: caos.zitadel.admin.api.v1.IdpSearchResponse - (*IdpView)(nil), // 54: caos.zitadel.admin.api.v1.IdpView - (*OidcIdpConfigView)(nil), // 55: caos.zitadel.admin.api.v1.OidcIdpConfigView - (*IdpSearchRequest)(nil), // 56: caos.zitadel.admin.api.v1.IdpSearchRequest - (*IdpSearchQuery)(nil), // 57: caos.zitadel.admin.api.v1.IdpSearchQuery - (*DefaultLoginPolicy)(nil), // 58: caos.zitadel.admin.api.v1.DefaultLoginPolicy - (*IdpProviderID)(nil), // 59: caos.zitadel.admin.api.v1.IdpProviderID - (*DefaultLoginPolicyView)(nil), // 60: caos.zitadel.admin.api.v1.DefaultLoginPolicyView - (*IdpProviderView)(nil), // 61: caos.zitadel.admin.api.v1.IdpProviderView - (*IdpProviderSearchResponse)(nil), // 62: caos.zitadel.admin.api.v1.IdpProviderSearchResponse - (*IdpProviderSearchRequest)(nil), // 63: caos.zitadel.admin.api.v1.IdpProviderSearchRequest - (*timestamp.Timestamp)(nil), // 64: google.protobuf.Timestamp - (*empty.Empty)(nil), // 65: google.protobuf.Empty - (*_struct.Struct)(nil), // 66: google.protobuf.Struct + (OrgState)(0), // 0: caos.zitadel.admin.api.v1.OrgState + (OrgSearchKey)(0), // 1: caos.zitadel.admin.api.v1.OrgSearchKey + (OrgSearchMethod)(0), // 2: caos.zitadel.admin.api.v1.OrgSearchMethod + (UserState)(0), // 3: caos.zitadel.admin.api.v1.UserState + (Gender)(0), // 4: caos.zitadel.admin.api.v1.Gender + (MachineKeyType)(0), // 5: caos.zitadel.admin.api.v1.MachineKeyType + (IamMemberSearchKey)(0), // 6: caos.zitadel.admin.api.v1.IamMemberSearchKey + (SearchMethod)(0), // 7: caos.zitadel.admin.api.v1.SearchMethod + (IdpStylingType)(0), // 8: caos.zitadel.admin.api.v1.IdpStylingType + (IdpState)(0), // 9: caos.zitadel.admin.api.v1.IdpState + (OIDCMappingField)(0), // 10: caos.zitadel.admin.api.v1.OIDCMappingField + (IdpSearchKey)(0), // 11: caos.zitadel.admin.api.v1.IdpSearchKey + (IdpType)(0), // 12: caos.zitadel.admin.api.v1.IdpType + (*OrgID)(nil), // 13: caos.zitadel.admin.api.v1.OrgID + (*UniqueOrgRequest)(nil), // 14: caos.zitadel.admin.api.v1.UniqueOrgRequest + (*UniqueOrgResponse)(nil), // 15: caos.zitadel.admin.api.v1.UniqueOrgResponse + (*Org)(nil), // 16: caos.zitadel.admin.api.v1.Org + (*OrgSearchRequest)(nil), // 17: caos.zitadel.admin.api.v1.OrgSearchRequest + (*OrgSearchQuery)(nil), // 18: caos.zitadel.admin.api.v1.OrgSearchQuery + (*OrgSearchResponse)(nil), // 19: caos.zitadel.admin.api.v1.OrgSearchResponse + (*OrgSetUpRequest)(nil), // 20: caos.zitadel.admin.api.v1.OrgSetUpRequest + (*OrgSetUpResponse)(nil), // 21: caos.zitadel.admin.api.v1.OrgSetUpResponse + (*CreateUserRequest)(nil), // 22: caos.zitadel.admin.api.v1.CreateUserRequest + (*CreateHumanRequest)(nil), // 23: caos.zitadel.admin.api.v1.CreateHumanRequest + (*CreateMachineRequest)(nil), // 24: caos.zitadel.admin.api.v1.CreateMachineRequest + (*UserResponse)(nil), // 25: caos.zitadel.admin.api.v1.UserResponse + (*HumanResponse)(nil), // 26: caos.zitadel.admin.api.v1.HumanResponse + (*MachineResponse)(nil), // 27: caos.zitadel.admin.api.v1.MachineResponse + (*MachineKeyResponse)(nil), // 28: caos.zitadel.admin.api.v1.MachineKeyResponse + (*CreateOrgRequest)(nil), // 29: caos.zitadel.admin.api.v1.CreateOrgRequest + (*OrgIamPolicy)(nil), // 30: caos.zitadel.admin.api.v1.OrgIamPolicy + (*OrgIamPolicyView)(nil), // 31: caos.zitadel.admin.api.v1.OrgIamPolicyView + (*OrgIamPolicyRequest)(nil), // 32: caos.zitadel.admin.api.v1.OrgIamPolicyRequest + (*OrgIamPolicyID)(nil), // 33: caos.zitadel.admin.api.v1.OrgIamPolicyID + (*IamMemberRoles)(nil), // 34: caos.zitadel.admin.api.v1.IamMemberRoles + (*IamMember)(nil), // 35: caos.zitadel.admin.api.v1.IamMember + (*AddIamMemberRequest)(nil), // 36: caos.zitadel.admin.api.v1.AddIamMemberRequest + (*ChangeIamMemberRequest)(nil), // 37: caos.zitadel.admin.api.v1.ChangeIamMemberRequest + (*RemoveIamMemberRequest)(nil), // 38: caos.zitadel.admin.api.v1.RemoveIamMemberRequest + (*IamMemberSearchResponse)(nil), // 39: caos.zitadel.admin.api.v1.IamMemberSearchResponse + (*IamMemberView)(nil), // 40: caos.zitadel.admin.api.v1.IamMemberView + (*IamMemberSearchRequest)(nil), // 41: caos.zitadel.admin.api.v1.IamMemberSearchRequest + (*IamMemberSearchQuery)(nil), // 42: caos.zitadel.admin.api.v1.IamMemberSearchQuery + (*FailedEventID)(nil), // 43: caos.zitadel.admin.api.v1.FailedEventID + (*FailedEvents)(nil), // 44: caos.zitadel.admin.api.v1.FailedEvents + (*FailedEvent)(nil), // 45: caos.zitadel.admin.api.v1.FailedEvent + (*ViewID)(nil), // 46: caos.zitadel.admin.api.v1.ViewID + (*Views)(nil), // 47: caos.zitadel.admin.api.v1.Views + (*View)(nil), // 48: caos.zitadel.admin.api.v1.View + (*IdpID)(nil), // 49: caos.zitadel.admin.api.v1.IdpID + (*Idp)(nil), // 50: caos.zitadel.admin.api.v1.Idp + (*IdpUpdate)(nil), // 51: caos.zitadel.admin.api.v1.IdpUpdate + (*OidcIdpConfig)(nil), // 52: caos.zitadel.admin.api.v1.OidcIdpConfig + (*OidcIdpConfigCreate)(nil), // 53: caos.zitadel.admin.api.v1.OidcIdpConfigCreate + (*OidcIdpConfigUpdate)(nil), // 54: caos.zitadel.admin.api.v1.OidcIdpConfigUpdate + (*IdpSearchResponse)(nil), // 55: caos.zitadel.admin.api.v1.IdpSearchResponse + (*IdpView)(nil), // 56: caos.zitadel.admin.api.v1.IdpView + (*OidcIdpConfigView)(nil), // 57: caos.zitadel.admin.api.v1.OidcIdpConfigView + (*IdpSearchRequest)(nil), // 58: caos.zitadel.admin.api.v1.IdpSearchRequest + (*IdpSearchQuery)(nil), // 59: caos.zitadel.admin.api.v1.IdpSearchQuery + (*DefaultLabelPolicy)(nil), // 60: caos.zitadel.admin.api.v1.DefaultLabelPolicy + (*DefaultLabelPolicyUpdate)(nil), // 61: caos.zitadel.admin.api.v1.DefaultLabelPolicyUpdate + (*DefaultLabelPolicyView)(nil), // 62: caos.zitadel.admin.api.v1.DefaultLabelPolicyView + (*DefaultLoginPolicy)(nil), // 63: caos.zitadel.admin.api.v1.DefaultLoginPolicy + (*DefaultLoginPolicyRequest)(nil), // 64: caos.zitadel.admin.api.v1.DefaultLoginPolicyRequest + (*IdpProviderID)(nil), // 65: caos.zitadel.admin.api.v1.IdpProviderID + (*DefaultLoginPolicyView)(nil), // 66: caos.zitadel.admin.api.v1.DefaultLoginPolicyView + (*IdpProviderView)(nil), // 67: caos.zitadel.admin.api.v1.IdpProviderView + (*IdpProviderSearchResponse)(nil), // 68: caos.zitadel.admin.api.v1.IdpProviderSearchResponse + (*IdpProviderSearchRequest)(nil), // 69: caos.zitadel.admin.api.v1.IdpProviderSearchRequest + (*DefaultPasswordComplexityPolicy)(nil), // 70: caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicy + (*DefaultPasswordComplexityPolicyRequest)(nil), // 71: caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicyRequest + (*DefaultPasswordComplexityPolicyView)(nil), // 72: caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicyView + (*DefaultPasswordAgePolicy)(nil), // 73: caos.zitadel.admin.api.v1.DefaultPasswordAgePolicy + (*DefaultPasswordAgePolicyRequest)(nil), // 74: caos.zitadel.admin.api.v1.DefaultPasswordAgePolicyRequest + (*DefaultPasswordAgePolicyView)(nil), // 75: caos.zitadel.admin.api.v1.DefaultPasswordAgePolicyView + (*DefaultPasswordLockoutPolicy)(nil), // 76: caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicy + (*DefaultPasswordLockoutPolicyRequest)(nil), // 77: caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicyRequest + (*DefaultPasswordLockoutPolicyView)(nil), // 78: caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicyView + (*timestamp.Timestamp)(nil), // 79: google.protobuf.Timestamp + (*empty.Empty)(nil), // 80: google.protobuf.Empty + (*_struct.Struct)(nil), // 81: google.protobuf.Struct } var file_admin_proto_depIdxs = []int32{ - 0, // 0: caos.zitadel.admin.api.v1.Org.state:type_name -> caos.zitadel.admin.api.v1.OrgState - 64, // 1: caos.zitadel.admin.api.v1.Org.creation_date:type_name -> google.protobuf.Timestamp - 64, // 2: caos.zitadel.admin.api.v1.Org.change_date:type_name -> google.protobuf.Timestamp - 1, // 3: caos.zitadel.admin.api.v1.OrgSearchRequest.sorting_column:type_name -> caos.zitadel.admin.api.v1.OrgSearchKey - 17, // 4: caos.zitadel.admin.api.v1.OrgSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.OrgSearchQuery - 1, // 5: caos.zitadel.admin.api.v1.OrgSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.OrgSearchKey - 2, // 6: caos.zitadel.admin.api.v1.OrgSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.OrgSearchMethod - 15, // 7: caos.zitadel.admin.api.v1.OrgSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.Org - 64, // 8: caos.zitadel.admin.api.v1.OrgSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 28, // 9: caos.zitadel.admin.api.v1.OrgSetUpRequest.org:type_name -> caos.zitadel.admin.api.v1.CreateOrgRequest - 21, // 10: caos.zitadel.admin.api.v1.OrgSetUpRequest.user:type_name -> caos.zitadel.admin.api.v1.CreateUserRequest - 15, // 11: caos.zitadel.admin.api.v1.OrgSetUpResponse.org:type_name -> caos.zitadel.admin.api.v1.Org - 24, // 12: caos.zitadel.admin.api.v1.OrgSetUpResponse.user:type_name -> caos.zitadel.admin.api.v1.UserResponse - 22, // 13: caos.zitadel.admin.api.v1.CreateUserRequest.human:type_name -> caos.zitadel.admin.api.v1.CreateHumanRequest - 23, // 14: caos.zitadel.admin.api.v1.CreateUserRequest.machine:type_name -> caos.zitadel.admin.api.v1.CreateMachineRequest - 4, // 15: caos.zitadel.admin.api.v1.CreateHumanRequest.gender:type_name -> caos.zitadel.admin.api.v1.Gender - 3, // 16: caos.zitadel.admin.api.v1.UserResponse.state:type_name -> caos.zitadel.admin.api.v1.UserState - 64, // 17: caos.zitadel.admin.api.v1.UserResponse.creation_date:type_name -> google.protobuf.Timestamp - 64, // 18: caos.zitadel.admin.api.v1.UserResponse.change_date:type_name -> google.protobuf.Timestamp - 25, // 19: caos.zitadel.admin.api.v1.UserResponse.human:type_name -> caos.zitadel.admin.api.v1.HumanResponse - 26, // 20: caos.zitadel.admin.api.v1.UserResponse.machine:type_name -> caos.zitadel.admin.api.v1.MachineResponse - 4, // 21: caos.zitadel.admin.api.v1.HumanResponse.gender:type_name -> caos.zitadel.admin.api.v1.Gender - 27, // 22: caos.zitadel.admin.api.v1.MachineResponse.keys:type_name -> caos.zitadel.admin.api.v1.MachineKeyResponse - 5, // 23: caos.zitadel.admin.api.v1.MachineKeyResponse.type:type_name -> caos.zitadel.admin.api.v1.MachineKeyType - 64, // 24: caos.zitadel.admin.api.v1.MachineKeyResponse.creation_date:type_name -> google.protobuf.Timestamp - 64, // 25: caos.zitadel.admin.api.v1.MachineKeyResponse.expiration_date:type_name -> google.protobuf.Timestamp - 64, // 26: caos.zitadel.admin.api.v1.OrgIamPolicy.creation_date:type_name -> google.protobuf.Timestamp - 64, // 27: caos.zitadel.admin.api.v1.OrgIamPolicy.change_date:type_name -> google.protobuf.Timestamp - 64, // 28: caos.zitadel.admin.api.v1.IamMember.change_date:type_name -> google.protobuf.Timestamp - 64, // 29: caos.zitadel.admin.api.v1.IamMember.creation_date:type_name -> google.protobuf.Timestamp - 38, // 30: caos.zitadel.admin.api.v1.IamMemberSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.IamMemberView - 64, // 31: caos.zitadel.admin.api.v1.IamMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 64, // 32: caos.zitadel.admin.api.v1.IamMemberView.change_date:type_name -> google.protobuf.Timestamp - 64, // 33: caos.zitadel.admin.api.v1.IamMemberView.creation_date:type_name -> google.protobuf.Timestamp - 40, // 34: caos.zitadel.admin.api.v1.IamMemberSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.IamMemberSearchQuery - 6, // 35: caos.zitadel.admin.api.v1.IamMemberSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.IamMemberSearchKey - 7, // 36: caos.zitadel.admin.api.v1.IamMemberSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.SearchMethod - 43, // 37: caos.zitadel.admin.api.v1.FailedEvents.failed_events:type_name -> caos.zitadel.admin.api.v1.FailedEvent - 46, // 38: caos.zitadel.admin.api.v1.Views.views:type_name -> caos.zitadel.admin.api.v1.View - 64, // 39: caos.zitadel.admin.api.v1.View.view_timestamp:type_name -> google.protobuf.Timestamp - 8, // 40: caos.zitadel.admin.api.v1.Idp.state:type_name -> caos.zitadel.admin.api.v1.IdpState - 64, // 41: caos.zitadel.admin.api.v1.Idp.creation_date:type_name -> google.protobuf.Timestamp - 64, // 42: caos.zitadel.admin.api.v1.Idp.change_date:type_name -> google.protobuf.Timestamp - 50, // 43: caos.zitadel.admin.api.v1.Idp.oidc_config:type_name -> caos.zitadel.admin.api.v1.OidcIdpConfig - 9, // 44: caos.zitadel.admin.api.v1.OidcIdpConfigCreate.idp_display_name_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField - 9, // 45: caos.zitadel.admin.api.v1.OidcIdpConfigCreate.username_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField - 9, // 46: caos.zitadel.admin.api.v1.OidcIdpConfigUpdate.idp_display_name_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField - 9, // 47: caos.zitadel.admin.api.v1.OidcIdpConfigUpdate.username_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField - 54, // 48: caos.zitadel.admin.api.v1.IdpSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.IdpView - 64, // 49: caos.zitadel.admin.api.v1.IdpSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 8, // 50: caos.zitadel.admin.api.v1.IdpView.state:type_name -> caos.zitadel.admin.api.v1.IdpState - 64, // 51: caos.zitadel.admin.api.v1.IdpView.creation_date:type_name -> google.protobuf.Timestamp - 64, // 52: caos.zitadel.admin.api.v1.IdpView.change_date:type_name -> google.protobuf.Timestamp - 55, // 53: caos.zitadel.admin.api.v1.IdpView.oidc_config:type_name -> caos.zitadel.admin.api.v1.OidcIdpConfigView - 9, // 54: caos.zitadel.admin.api.v1.OidcIdpConfigView.idp_display_name_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField - 9, // 55: caos.zitadel.admin.api.v1.OidcIdpConfigView.username_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField - 57, // 56: caos.zitadel.admin.api.v1.IdpSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.IdpSearchQuery - 10, // 57: caos.zitadel.admin.api.v1.IdpSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.IdpSearchKey - 7, // 58: caos.zitadel.admin.api.v1.IdpSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.SearchMethod - 11, // 59: caos.zitadel.admin.api.v1.IdpProviderView.type:type_name -> caos.zitadel.admin.api.v1.IdpType - 61, // 60: caos.zitadel.admin.api.v1.IdpProviderSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.IdpProviderView - 64, // 61: caos.zitadel.admin.api.v1.IdpProviderSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 65, // 62: caos.zitadel.admin.api.v1.AdminService.Healthz:input_type -> google.protobuf.Empty - 65, // 63: caos.zitadel.admin.api.v1.AdminService.Ready:input_type -> google.protobuf.Empty - 65, // 64: caos.zitadel.admin.api.v1.AdminService.Validate:input_type -> google.protobuf.Empty - 13, // 65: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:input_type -> caos.zitadel.admin.api.v1.UniqueOrgRequest - 12, // 66: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:input_type -> caos.zitadel.admin.api.v1.OrgID - 16, // 67: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:input_type -> caos.zitadel.admin.api.v1.OrgSearchRequest - 19, // 68: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:input_type -> caos.zitadel.admin.api.v1.OrgSetUpRequest - 31, // 69: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID - 30, // 70: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest - 30, // 71: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest - 31, // 72: caos.zitadel.admin.api.v1.AdminService.DeleteOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID - 65, // 73: caos.zitadel.admin.api.v1.AdminService.GetIamMemberRoles:input_type -> google.protobuf.Empty - 34, // 74: caos.zitadel.admin.api.v1.AdminService.AddIamMember:input_type -> caos.zitadel.admin.api.v1.AddIamMemberRequest - 35, // 75: caos.zitadel.admin.api.v1.AdminService.ChangeIamMember:input_type -> caos.zitadel.admin.api.v1.ChangeIamMemberRequest - 36, // 76: caos.zitadel.admin.api.v1.AdminService.RemoveIamMember:input_type -> caos.zitadel.admin.api.v1.RemoveIamMemberRequest - 39, // 77: caos.zitadel.admin.api.v1.AdminService.SearchIamMembers:input_type -> caos.zitadel.admin.api.v1.IamMemberSearchRequest - 65, // 78: caos.zitadel.admin.api.v1.AdminService.GetViews:input_type -> google.protobuf.Empty - 44, // 79: caos.zitadel.admin.api.v1.AdminService.ClearView:input_type -> caos.zitadel.admin.api.v1.ViewID - 65, // 80: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:input_type -> google.protobuf.Empty - 41, // 81: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:input_type -> caos.zitadel.admin.api.v1.FailedEventID - 47, // 82: caos.zitadel.admin.api.v1.AdminService.IdpByID:input_type -> caos.zitadel.admin.api.v1.IdpID - 51, // 83: caos.zitadel.admin.api.v1.AdminService.CreateOidcIdp:input_type -> caos.zitadel.admin.api.v1.OidcIdpConfigCreate - 49, // 84: caos.zitadel.admin.api.v1.AdminService.UpdateIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpUpdate - 47, // 85: caos.zitadel.admin.api.v1.AdminService.DeactivateIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpID - 47, // 86: caos.zitadel.admin.api.v1.AdminService.ReactivateIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpID - 47, // 87: caos.zitadel.admin.api.v1.AdminService.RemoveIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpID - 52, // 88: caos.zitadel.admin.api.v1.AdminService.UpdateOidcIdpConfig:input_type -> caos.zitadel.admin.api.v1.OidcIdpConfigUpdate - 56, // 89: caos.zitadel.admin.api.v1.AdminService.SearchIdps:input_type -> caos.zitadel.admin.api.v1.IdpSearchRequest - 65, // 90: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicy:input_type -> google.protobuf.Empty - 58, // 91: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultLoginPolicy:input_type -> caos.zitadel.admin.api.v1.DefaultLoginPolicy - 63, // 92: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicyIdpProviders:input_type -> caos.zitadel.admin.api.v1.IdpProviderSearchRequest - 59, // 93: caos.zitadel.admin.api.v1.AdminService.AddIdpProviderToDefaultLoginPolicy:input_type -> caos.zitadel.admin.api.v1.IdpProviderID - 59, // 94: caos.zitadel.admin.api.v1.AdminService.RemoveIdpProviderFromDefaultLoginPolicy:input_type -> caos.zitadel.admin.api.v1.IdpProviderID - 65, // 95: caos.zitadel.admin.api.v1.AdminService.Healthz:output_type -> google.protobuf.Empty - 65, // 96: caos.zitadel.admin.api.v1.AdminService.Ready:output_type -> google.protobuf.Empty - 66, // 97: caos.zitadel.admin.api.v1.AdminService.Validate:output_type -> google.protobuf.Struct - 14, // 98: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:output_type -> caos.zitadel.admin.api.v1.UniqueOrgResponse - 15, // 99: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:output_type -> caos.zitadel.admin.api.v1.Org - 18, // 100: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:output_type -> caos.zitadel.admin.api.v1.OrgSearchResponse - 20, // 101: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:output_type -> caos.zitadel.admin.api.v1.OrgSetUpResponse - 29, // 102: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy - 29, // 103: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy - 29, // 104: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy - 65, // 105: caos.zitadel.admin.api.v1.AdminService.DeleteOrgIamPolicy:output_type -> google.protobuf.Empty - 32, // 106: caos.zitadel.admin.api.v1.AdminService.GetIamMemberRoles:output_type -> caos.zitadel.admin.api.v1.IamMemberRoles - 33, // 107: caos.zitadel.admin.api.v1.AdminService.AddIamMember:output_type -> caos.zitadel.admin.api.v1.IamMember - 33, // 108: caos.zitadel.admin.api.v1.AdminService.ChangeIamMember:output_type -> caos.zitadel.admin.api.v1.IamMember - 65, // 109: caos.zitadel.admin.api.v1.AdminService.RemoveIamMember:output_type -> google.protobuf.Empty - 37, // 110: caos.zitadel.admin.api.v1.AdminService.SearchIamMembers:output_type -> caos.zitadel.admin.api.v1.IamMemberSearchResponse - 45, // 111: caos.zitadel.admin.api.v1.AdminService.GetViews:output_type -> caos.zitadel.admin.api.v1.Views - 65, // 112: caos.zitadel.admin.api.v1.AdminService.ClearView:output_type -> google.protobuf.Empty - 42, // 113: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:output_type -> caos.zitadel.admin.api.v1.FailedEvents - 65, // 114: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:output_type -> google.protobuf.Empty - 54, // 115: caos.zitadel.admin.api.v1.AdminService.IdpByID:output_type -> caos.zitadel.admin.api.v1.IdpView - 48, // 116: caos.zitadel.admin.api.v1.AdminService.CreateOidcIdp:output_type -> caos.zitadel.admin.api.v1.Idp - 48, // 117: caos.zitadel.admin.api.v1.AdminService.UpdateIdpConfig:output_type -> caos.zitadel.admin.api.v1.Idp - 48, // 118: caos.zitadel.admin.api.v1.AdminService.DeactivateIdpConfig:output_type -> caos.zitadel.admin.api.v1.Idp - 48, // 119: caos.zitadel.admin.api.v1.AdminService.ReactivateIdpConfig:output_type -> caos.zitadel.admin.api.v1.Idp - 65, // 120: caos.zitadel.admin.api.v1.AdminService.RemoveIdpConfig:output_type -> google.protobuf.Empty - 50, // 121: caos.zitadel.admin.api.v1.AdminService.UpdateOidcIdpConfig:output_type -> caos.zitadel.admin.api.v1.OidcIdpConfig - 53, // 122: caos.zitadel.admin.api.v1.AdminService.SearchIdps:output_type -> caos.zitadel.admin.api.v1.IdpSearchResponse - 60, // 123: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultLoginPolicyView - 58, // 124: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultLoginPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultLoginPolicy - 62, // 125: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicyIdpProviders:output_type -> caos.zitadel.admin.api.v1.IdpProviderSearchResponse - 59, // 126: caos.zitadel.admin.api.v1.AdminService.AddIdpProviderToDefaultLoginPolicy:output_type -> caos.zitadel.admin.api.v1.IdpProviderID - 65, // 127: caos.zitadel.admin.api.v1.AdminService.RemoveIdpProviderFromDefaultLoginPolicy:output_type -> google.protobuf.Empty - 95, // [95:128] is the sub-list for method output_type - 62, // [62:95] is the sub-list for method input_type - 62, // [62:62] is the sub-list for extension type_name - 62, // [62:62] is the sub-list for extension extendee - 0, // [0:62] is the sub-list for field type_name + 0, // 0: caos.zitadel.admin.api.v1.Org.state:type_name -> caos.zitadel.admin.api.v1.OrgState + 79, // 1: caos.zitadel.admin.api.v1.Org.creation_date:type_name -> google.protobuf.Timestamp + 79, // 2: caos.zitadel.admin.api.v1.Org.change_date:type_name -> google.protobuf.Timestamp + 1, // 3: caos.zitadel.admin.api.v1.OrgSearchRequest.sorting_column:type_name -> caos.zitadel.admin.api.v1.OrgSearchKey + 18, // 4: caos.zitadel.admin.api.v1.OrgSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.OrgSearchQuery + 1, // 5: caos.zitadel.admin.api.v1.OrgSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.OrgSearchKey + 2, // 6: caos.zitadel.admin.api.v1.OrgSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.OrgSearchMethod + 16, // 7: caos.zitadel.admin.api.v1.OrgSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.Org + 79, // 8: caos.zitadel.admin.api.v1.OrgSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 29, // 9: caos.zitadel.admin.api.v1.OrgSetUpRequest.org:type_name -> caos.zitadel.admin.api.v1.CreateOrgRequest + 22, // 10: caos.zitadel.admin.api.v1.OrgSetUpRequest.user:type_name -> caos.zitadel.admin.api.v1.CreateUserRequest + 16, // 11: caos.zitadel.admin.api.v1.OrgSetUpResponse.org:type_name -> caos.zitadel.admin.api.v1.Org + 25, // 12: caos.zitadel.admin.api.v1.OrgSetUpResponse.user:type_name -> caos.zitadel.admin.api.v1.UserResponse + 23, // 13: caos.zitadel.admin.api.v1.CreateUserRequest.human:type_name -> caos.zitadel.admin.api.v1.CreateHumanRequest + 24, // 14: caos.zitadel.admin.api.v1.CreateUserRequest.machine:type_name -> caos.zitadel.admin.api.v1.CreateMachineRequest + 4, // 15: caos.zitadel.admin.api.v1.CreateHumanRequest.gender:type_name -> caos.zitadel.admin.api.v1.Gender + 3, // 16: caos.zitadel.admin.api.v1.UserResponse.state:type_name -> caos.zitadel.admin.api.v1.UserState + 79, // 17: caos.zitadel.admin.api.v1.UserResponse.creation_date:type_name -> google.protobuf.Timestamp + 79, // 18: caos.zitadel.admin.api.v1.UserResponse.change_date:type_name -> google.protobuf.Timestamp + 26, // 19: caos.zitadel.admin.api.v1.UserResponse.human:type_name -> caos.zitadel.admin.api.v1.HumanResponse + 27, // 20: caos.zitadel.admin.api.v1.UserResponse.machine:type_name -> caos.zitadel.admin.api.v1.MachineResponse + 4, // 21: caos.zitadel.admin.api.v1.HumanResponse.gender:type_name -> caos.zitadel.admin.api.v1.Gender + 28, // 22: caos.zitadel.admin.api.v1.MachineResponse.keys:type_name -> caos.zitadel.admin.api.v1.MachineKeyResponse + 5, // 23: caos.zitadel.admin.api.v1.MachineKeyResponse.type:type_name -> caos.zitadel.admin.api.v1.MachineKeyType + 79, // 24: caos.zitadel.admin.api.v1.MachineKeyResponse.creation_date:type_name -> google.protobuf.Timestamp + 79, // 25: caos.zitadel.admin.api.v1.MachineKeyResponse.expiration_date:type_name -> google.protobuf.Timestamp + 79, // 26: caos.zitadel.admin.api.v1.OrgIamPolicy.creation_date:type_name -> google.protobuf.Timestamp + 79, // 27: caos.zitadel.admin.api.v1.OrgIamPolicy.change_date:type_name -> google.protobuf.Timestamp + 79, // 28: caos.zitadel.admin.api.v1.OrgIamPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 79, // 29: caos.zitadel.admin.api.v1.OrgIamPolicyView.change_date:type_name -> google.protobuf.Timestamp + 79, // 30: caos.zitadel.admin.api.v1.IamMember.change_date:type_name -> google.protobuf.Timestamp + 79, // 31: caos.zitadel.admin.api.v1.IamMember.creation_date:type_name -> google.protobuf.Timestamp + 40, // 32: caos.zitadel.admin.api.v1.IamMemberSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.IamMemberView + 79, // 33: caos.zitadel.admin.api.v1.IamMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 79, // 34: caos.zitadel.admin.api.v1.IamMemberView.change_date:type_name -> google.protobuf.Timestamp + 79, // 35: caos.zitadel.admin.api.v1.IamMemberView.creation_date:type_name -> google.protobuf.Timestamp + 42, // 36: caos.zitadel.admin.api.v1.IamMemberSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.IamMemberSearchQuery + 6, // 37: caos.zitadel.admin.api.v1.IamMemberSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.IamMemberSearchKey + 7, // 38: caos.zitadel.admin.api.v1.IamMemberSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.SearchMethod + 45, // 39: caos.zitadel.admin.api.v1.FailedEvents.failed_events:type_name -> caos.zitadel.admin.api.v1.FailedEvent + 48, // 40: caos.zitadel.admin.api.v1.Views.views:type_name -> caos.zitadel.admin.api.v1.View + 79, // 41: caos.zitadel.admin.api.v1.View.view_timestamp:type_name -> google.protobuf.Timestamp + 9, // 42: caos.zitadel.admin.api.v1.Idp.state:type_name -> caos.zitadel.admin.api.v1.IdpState + 79, // 43: caos.zitadel.admin.api.v1.Idp.creation_date:type_name -> google.protobuf.Timestamp + 79, // 44: caos.zitadel.admin.api.v1.Idp.change_date:type_name -> google.protobuf.Timestamp + 8, // 45: caos.zitadel.admin.api.v1.Idp.styling_type:type_name -> caos.zitadel.admin.api.v1.IdpStylingType + 52, // 46: caos.zitadel.admin.api.v1.Idp.oidc_config:type_name -> caos.zitadel.admin.api.v1.OidcIdpConfig + 8, // 47: caos.zitadel.admin.api.v1.IdpUpdate.styling_type:type_name -> caos.zitadel.admin.api.v1.IdpStylingType + 8, // 48: caos.zitadel.admin.api.v1.OidcIdpConfigCreate.styling_type:type_name -> caos.zitadel.admin.api.v1.IdpStylingType + 10, // 49: caos.zitadel.admin.api.v1.OidcIdpConfigCreate.idp_display_name_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField + 10, // 50: caos.zitadel.admin.api.v1.OidcIdpConfigCreate.username_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField + 10, // 51: caos.zitadel.admin.api.v1.OidcIdpConfigUpdate.idp_display_name_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField + 10, // 52: caos.zitadel.admin.api.v1.OidcIdpConfigUpdate.username_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField + 56, // 53: caos.zitadel.admin.api.v1.IdpSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.IdpView + 79, // 54: caos.zitadel.admin.api.v1.IdpSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 9, // 55: caos.zitadel.admin.api.v1.IdpView.state:type_name -> caos.zitadel.admin.api.v1.IdpState + 79, // 56: caos.zitadel.admin.api.v1.IdpView.creation_date:type_name -> google.protobuf.Timestamp + 79, // 57: caos.zitadel.admin.api.v1.IdpView.change_date:type_name -> google.protobuf.Timestamp + 8, // 58: caos.zitadel.admin.api.v1.IdpView.styling_type:type_name -> caos.zitadel.admin.api.v1.IdpStylingType + 57, // 59: caos.zitadel.admin.api.v1.IdpView.oidc_config:type_name -> caos.zitadel.admin.api.v1.OidcIdpConfigView + 10, // 60: caos.zitadel.admin.api.v1.OidcIdpConfigView.idp_display_name_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField + 10, // 61: caos.zitadel.admin.api.v1.OidcIdpConfigView.username_mapping:type_name -> caos.zitadel.admin.api.v1.OIDCMappingField + 59, // 62: caos.zitadel.admin.api.v1.IdpSearchRequest.queries:type_name -> caos.zitadel.admin.api.v1.IdpSearchQuery + 11, // 63: caos.zitadel.admin.api.v1.IdpSearchQuery.key:type_name -> caos.zitadel.admin.api.v1.IdpSearchKey + 7, // 64: caos.zitadel.admin.api.v1.IdpSearchQuery.method:type_name -> caos.zitadel.admin.api.v1.SearchMethod + 79, // 65: caos.zitadel.admin.api.v1.DefaultLabelPolicy.creation_date:type_name -> google.protobuf.Timestamp + 79, // 66: caos.zitadel.admin.api.v1.DefaultLabelPolicy.change_date:type_name -> google.protobuf.Timestamp + 79, // 67: caos.zitadel.admin.api.v1.DefaultLabelPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 79, // 68: caos.zitadel.admin.api.v1.DefaultLabelPolicyView.change_date:type_name -> google.protobuf.Timestamp + 79, // 69: caos.zitadel.admin.api.v1.DefaultLoginPolicy.creation_date:type_name -> google.protobuf.Timestamp + 79, // 70: caos.zitadel.admin.api.v1.DefaultLoginPolicy.change_date:type_name -> google.protobuf.Timestamp + 79, // 71: caos.zitadel.admin.api.v1.DefaultLoginPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 79, // 72: caos.zitadel.admin.api.v1.DefaultLoginPolicyView.change_date:type_name -> google.protobuf.Timestamp + 12, // 73: caos.zitadel.admin.api.v1.IdpProviderView.type:type_name -> caos.zitadel.admin.api.v1.IdpType + 67, // 74: caos.zitadel.admin.api.v1.IdpProviderSearchResponse.result:type_name -> caos.zitadel.admin.api.v1.IdpProviderView + 79, // 75: caos.zitadel.admin.api.v1.IdpProviderSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 79, // 76: caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicy.creation_date:type_name -> google.protobuf.Timestamp + 79, // 77: caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicy.change_date:type_name -> google.protobuf.Timestamp + 79, // 78: caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 79, // 79: caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicyView.change_date:type_name -> google.protobuf.Timestamp + 79, // 80: caos.zitadel.admin.api.v1.DefaultPasswordAgePolicy.creation_date:type_name -> google.protobuf.Timestamp + 79, // 81: caos.zitadel.admin.api.v1.DefaultPasswordAgePolicy.change_date:type_name -> google.protobuf.Timestamp + 79, // 82: caos.zitadel.admin.api.v1.DefaultPasswordAgePolicyView.creation_date:type_name -> google.protobuf.Timestamp + 79, // 83: caos.zitadel.admin.api.v1.DefaultPasswordAgePolicyView.change_date:type_name -> google.protobuf.Timestamp + 79, // 84: caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicy.creation_date:type_name -> google.protobuf.Timestamp + 79, // 85: caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicy.change_date:type_name -> google.protobuf.Timestamp + 79, // 86: caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 79, // 87: caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicyView.change_date:type_name -> google.protobuf.Timestamp + 80, // 88: caos.zitadel.admin.api.v1.AdminService.Healthz:input_type -> google.protobuf.Empty + 80, // 89: caos.zitadel.admin.api.v1.AdminService.Ready:input_type -> google.protobuf.Empty + 80, // 90: caos.zitadel.admin.api.v1.AdminService.Validate:input_type -> google.protobuf.Empty + 14, // 91: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:input_type -> caos.zitadel.admin.api.v1.UniqueOrgRequest + 13, // 92: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:input_type -> caos.zitadel.admin.api.v1.OrgID + 17, // 93: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:input_type -> caos.zitadel.admin.api.v1.OrgSearchRequest + 20, // 94: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:input_type -> caos.zitadel.admin.api.v1.OrgSetUpRequest + 80, // 95: caos.zitadel.admin.api.v1.AdminService.GetDefaultOrgIamPolicy:input_type -> google.protobuf.Empty + 32, // 96: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest + 33, // 97: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID + 32, // 98: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest + 32, // 99: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyRequest + 33, // 100: caos.zitadel.admin.api.v1.AdminService.RemoveOrgIamPolicy:input_type -> caos.zitadel.admin.api.v1.OrgIamPolicyID + 80, // 101: caos.zitadel.admin.api.v1.AdminService.GetIamMemberRoles:input_type -> google.protobuf.Empty + 36, // 102: caos.zitadel.admin.api.v1.AdminService.AddIamMember:input_type -> caos.zitadel.admin.api.v1.AddIamMemberRequest + 37, // 103: caos.zitadel.admin.api.v1.AdminService.ChangeIamMember:input_type -> caos.zitadel.admin.api.v1.ChangeIamMemberRequest + 38, // 104: caos.zitadel.admin.api.v1.AdminService.RemoveIamMember:input_type -> caos.zitadel.admin.api.v1.RemoveIamMemberRequest + 41, // 105: caos.zitadel.admin.api.v1.AdminService.SearchIamMembers:input_type -> caos.zitadel.admin.api.v1.IamMemberSearchRequest + 80, // 106: caos.zitadel.admin.api.v1.AdminService.GetViews:input_type -> google.protobuf.Empty + 46, // 107: caos.zitadel.admin.api.v1.AdminService.ClearView:input_type -> caos.zitadel.admin.api.v1.ViewID + 80, // 108: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:input_type -> google.protobuf.Empty + 43, // 109: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:input_type -> caos.zitadel.admin.api.v1.FailedEventID + 49, // 110: caos.zitadel.admin.api.v1.AdminService.IdpByID:input_type -> caos.zitadel.admin.api.v1.IdpID + 53, // 111: caos.zitadel.admin.api.v1.AdminService.CreateOidcIdp:input_type -> caos.zitadel.admin.api.v1.OidcIdpConfigCreate + 51, // 112: caos.zitadel.admin.api.v1.AdminService.UpdateIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpUpdate + 49, // 113: caos.zitadel.admin.api.v1.AdminService.DeactivateIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpID + 49, // 114: caos.zitadel.admin.api.v1.AdminService.ReactivateIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpID + 49, // 115: caos.zitadel.admin.api.v1.AdminService.RemoveIdpConfig:input_type -> caos.zitadel.admin.api.v1.IdpID + 54, // 116: caos.zitadel.admin.api.v1.AdminService.UpdateOidcIdpConfig:input_type -> caos.zitadel.admin.api.v1.OidcIdpConfigUpdate + 58, // 117: caos.zitadel.admin.api.v1.AdminService.SearchIdps:input_type -> caos.zitadel.admin.api.v1.IdpSearchRequest + 80, // 118: caos.zitadel.admin.api.v1.AdminService.GetDefaultLabelPolicy:input_type -> google.protobuf.Empty + 61, // 119: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultLabelPolicy:input_type -> caos.zitadel.admin.api.v1.DefaultLabelPolicyUpdate + 80, // 120: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicy:input_type -> google.protobuf.Empty + 64, // 121: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultLoginPolicy:input_type -> caos.zitadel.admin.api.v1.DefaultLoginPolicyRequest + 69, // 122: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicyIdpProviders:input_type -> caos.zitadel.admin.api.v1.IdpProviderSearchRequest + 65, // 123: caos.zitadel.admin.api.v1.AdminService.AddIdpProviderToDefaultLoginPolicy:input_type -> caos.zitadel.admin.api.v1.IdpProviderID + 65, // 124: caos.zitadel.admin.api.v1.AdminService.RemoveIdpProviderFromDefaultLoginPolicy:input_type -> caos.zitadel.admin.api.v1.IdpProviderID + 80, // 125: caos.zitadel.admin.api.v1.AdminService.GetDefaultPasswordComplexityPolicy:input_type -> google.protobuf.Empty + 71, // 126: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultPasswordComplexityPolicy:input_type -> caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicyRequest + 80, // 127: caos.zitadel.admin.api.v1.AdminService.GetDefaultPasswordAgePolicy:input_type -> google.protobuf.Empty + 74, // 128: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultPasswordAgePolicy:input_type -> caos.zitadel.admin.api.v1.DefaultPasswordAgePolicyRequest + 80, // 129: caos.zitadel.admin.api.v1.AdminService.GetDefaultPasswordLockoutPolicy:input_type -> google.protobuf.Empty + 77, // 130: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultPasswordLockoutPolicy:input_type -> caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicyRequest + 80, // 131: caos.zitadel.admin.api.v1.AdminService.Healthz:output_type -> google.protobuf.Empty + 80, // 132: caos.zitadel.admin.api.v1.AdminService.Ready:output_type -> google.protobuf.Empty + 81, // 133: caos.zitadel.admin.api.v1.AdminService.Validate:output_type -> google.protobuf.Struct + 15, // 134: caos.zitadel.admin.api.v1.AdminService.IsOrgUnique:output_type -> caos.zitadel.admin.api.v1.UniqueOrgResponse + 16, // 135: caos.zitadel.admin.api.v1.AdminService.GetOrgByID:output_type -> caos.zitadel.admin.api.v1.Org + 19, // 136: caos.zitadel.admin.api.v1.AdminService.SearchOrgs:output_type -> caos.zitadel.admin.api.v1.OrgSearchResponse + 21, // 137: caos.zitadel.admin.api.v1.AdminService.SetUpOrg:output_type -> caos.zitadel.admin.api.v1.OrgSetUpResponse + 31, // 138: caos.zitadel.admin.api.v1.AdminService.GetDefaultOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicyView + 30, // 139: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy + 31, // 140: caos.zitadel.admin.api.v1.AdminService.GetOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicyView + 30, // 141: caos.zitadel.admin.api.v1.AdminService.CreateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy + 30, // 142: caos.zitadel.admin.api.v1.AdminService.UpdateOrgIamPolicy:output_type -> caos.zitadel.admin.api.v1.OrgIamPolicy + 80, // 143: caos.zitadel.admin.api.v1.AdminService.RemoveOrgIamPolicy:output_type -> google.protobuf.Empty + 34, // 144: caos.zitadel.admin.api.v1.AdminService.GetIamMemberRoles:output_type -> caos.zitadel.admin.api.v1.IamMemberRoles + 35, // 145: caos.zitadel.admin.api.v1.AdminService.AddIamMember:output_type -> caos.zitadel.admin.api.v1.IamMember + 35, // 146: caos.zitadel.admin.api.v1.AdminService.ChangeIamMember:output_type -> caos.zitadel.admin.api.v1.IamMember + 80, // 147: caos.zitadel.admin.api.v1.AdminService.RemoveIamMember:output_type -> google.protobuf.Empty + 39, // 148: caos.zitadel.admin.api.v1.AdminService.SearchIamMembers:output_type -> caos.zitadel.admin.api.v1.IamMemberSearchResponse + 47, // 149: caos.zitadel.admin.api.v1.AdminService.GetViews:output_type -> caos.zitadel.admin.api.v1.Views + 80, // 150: caos.zitadel.admin.api.v1.AdminService.ClearView:output_type -> google.protobuf.Empty + 44, // 151: caos.zitadel.admin.api.v1.AdminService.GetFailedEvents:output_type -> caos.zitadel.admin.api.v1.FailedEvents + 80, // 152: caos.zitadel.admin.api.v1.AdminService.RemoveFailedEvent:output_type -> google.protobuf.Empty + 56, // 153: caos.zitadel.admin.api.v1.AdminService.IdpByID:output_type -> caos.zitadel.admin.api.v1.IdpView + 50, // 154: caos.zitadel.admin.api.v1.AdminService.CreateOidcIdp:output_type -> caos.zitadel.admin.api.v1.Idp + 50, // 155: caos.zitadel.admin.api.v1.AdminService.UpdateIdpConfig:output_type -> caos.zitadel.admin.api.v1.Idp + 50, // 156: caos.zitadel.admin.api.v1.AdminService.DeactivateIdpConfig:output_type -> caos.zitadel.admin.api.v1.Idp + 50, // 157: caos.zitadel.admin.api.v1.AdminService.ReactivateIdpConfig:output_type -> caos.zitadel.admin.api.v1.Idp + 80, // 158: caos.zitadel.admin.api.v1.AdminService.RemoveIdpConfig:output_type -> google.protobuf.Empty + 52, // 159: caos.zitadel.admin.api.v1.AdminService.UpdateOidcIdpConfig:output_type -> caos.zitadel.admin.api.v1.OidcIdpConfig + 55, // 160: caos.zitadel.admin.api.v1.AdminService.SearchIdps:output_type -> caos.zitadel.admin.api.v1.IdpSearchResponse + 62, // 161: caos.zitadel.admin.api.v1.AdminService.GetDefaultLabelPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultLabelPolicyView + 60, // 162: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultLabelPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultLabelPolicy + 66, // 163: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultLoginPolicyView + 63, // 164: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultLoginPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultLoginPolicy + 68, // 165: caos.zitadel.admin.api.v1.AdminService.GetDefaultLoginPolicyIdpProviders:output_type -> caos.zitadel.admin.api.v1.IdpProviderSearchResponse + 65, // 166: caos.zitadel.admin.api.v1.AdminService.AddIdpProviderToDefaultLoginPolicy:output_type -> caos.zitadel.admin.api.v1.IdpProviderID + 80, // 167: caos.zitadel.admin.api.v1.AdminService.RemoveIdpProviderFromDefaultLoginPolicy:output_type -> google.protobuf.Empty + 72, // 168: caos.zitadel.admin.api.v1.AdminService.GetDefaultPasswordComplexityPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicyView + 70, // 169: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultPasswordComplexityPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultPasswordComplexityPolicy + 75, // 170: caos.zitadel.admin.api.v1.AdminService.GetDefaultPasswordAgePolicy:output_type -> caos.zitadel.admin.api.v1.DefaultPasswordAgePolicyView + 73, // 171: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultPasswordAgePolicy:output_type -> caos.zitadel.admin.api.v1.DefaultPasswordAgePolicy + 78, // 172: caos.zitadel.admin.api.v1.AdminService.GetDefaultPasswordLockoutPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicyView + 76, // 173: caos.zitadel.admin.api.v1.AdminService.UpdateDefaultPasswordLockoutPolicy:output_type -> caos.zitadel.admin.api.v1.DefaultPasswordLockoutPolicy + 131, // [131:174] is the sub-list for method output_type + 88, // [88:131] is the sub-list for method input_type + 88, // [88:88] is the sub-list for extension type_name + 88, // [88:88] is the sub-list for extension extendee + 0, // [0:88] is the sub-list for field type_name } func init() { file_admin_proto_init() } @@ -6012,7 +7495,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrgIamPolicyRequest); i { + switch v := v.(*OrgIamPolicyView); i { case 0: return &v.state case 1: @@ -6024,7 +7507,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrgIamPolicyID); i { + switch v := v.(*OrgIamPolicyRequest); i { case 0: return &v.state case 1: @@ -6036,7 +7519,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IamMemberRoles); i { + switch v := v.(*OrgIamPolicyID); i { case 0: return &v.state case 1: @@ -6048,7 +7531,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IamMember); i { + switch v := v.(*IamMemberRoles); i { case 0: return &v.state case 1: @@ -6060,7 +7543,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddIamMemberRequest); i { + switch v := v.(*IamMember); i { case 0: return &v.state case 1: @@ -6072,7 +7555,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeIamMemberRequest); i { + switch v := v.(*AddIamMemberRequest); i { case 0: return &v.state case 1: @@ -6084,7 +7567,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveIamMemberRequest); i { + switch v := v.(*ChangeIamMemberRequest); i { case 0: return &v.state case 1: @@ -6096,7 +7579,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IamMemberSearchResponse); i { + switch v := v.(*RemoveIamMemberRequest); i { case 0: return &v.state case 1: @@ -6108,7 +7591,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IamMemberView); i { + switch v := v.(*IamMemberSearchResponse); i { case 0: return &v.state case 1: @@ -6120,7 +7603,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IamMemberSearchRequest); i { + switch v := v.(*IamMemberView); i { case 0: return &v.state case 1: @@ -6132,7 +7615,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IamMemberSearchQuery); i { + switch v := v.(*IamMemberSearchRequest); i { case 0: return &v.state case 1: @@ -6144,7 +7627,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FailedEventID); i { + switch v := v.(*IamMemberSearchQuery); i { case 0: return &v.state case 1: @@ -6156,7 +7639,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FailedEvents); i { + switch v := v.(*FailedEventID); i { case 0: return &v.state case 1: @@ -6168,7 +7651,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FailedEvent); i { + switch v := v.(*FailedEvents); i { case 0: return &v.state case 1: @@ -6180,7 +7663,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ViewID); i { + switch v := v.(*FailedEvent); i { case 0: return &v.state case 1: @@ -6192,7 +7675,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Views); i { + switch v := v.(*ViewID); i { case 0: return &v.state case 1: @@ -6204,7 +7687,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*View); i { + switch v := v.(*Views); i { case 0: return &v.state case 1: @@ -6216,7 +7699,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpID); i { + switch v := v.(*View); i { case 0: return &v.state case 1: @@ -6228,7 +7711,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Idp); i { + switch v := v.(*IdpID); i { case 0: return &v.state case 1: @@ -6240,7 +7723,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpUpdate); i { + switch v := v.(*Idp); i { case 0: return &v.state case 1: @@ -6252,7 +7735,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OidcIdpConfig); i { + switch v := v.(*IdpUpdate); i { case 0: return &v.state case 1: @@ -6264,7 +7747,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OidcIdpConfigCreate); i { + switch v := v.(*OidcIdpConfig); i { case 0: return &v.state case 1: @@ -6276,7 +7759,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OidcIdpConfigUpdate); i { + switch v := v.(*OidcIdpConfigCreate); i { case 0: return &v.state case 1: @@ -6288,7 +7771,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpSearchResponse); i { + switch v := v.(*OidcIdpConfigUpdate); i { case 0: return &v.state case 1: @@ -6300,7 +7783,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpView); i { + switch v := v.(*IdpSearchResponse); i { case 0: return &v.state case 1: @@ -6312,7 +7795,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OidcIdpConfigView); i { + switch v := v.(*IdpView); i { case 0: return &v.state case 1: @@ -6324,7 +7807,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpSearchRequest); i { + switch v := v.(*OidcIdpConfigView); i { case 0: return &v.state case 1: @@ -6336,7 +7819,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpSearchQuery); i { + switch v := v.(*IdpSearchRequest); i { case 0: return &v.state case 1: @@ -6348,7 +7831,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DefaultLoginPolicy); i { + switch v := v.(*IdpSearchQuery); i { case 0: return &v.state case 1: @@ -6360,7 +7843,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpProviderID); i { + switch v := v.(*DefaultLabelPolicy); i { case 0: return &v.state case 1: @@ -6372,7 +7855,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DefaultLoginPolicyView); i { + switch v := v.(*DefaultLabelPolicyUpdate); i { case 0: return &v.state case 1: @@ -6384,7 +7867,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpProviderView); i { + switch v := v.(*DefaultLabelPolicyView); i { case 0: return &v.state case 1: @@ -6396,7 +7879,7 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IdpProviderSearchResponse); i { + switch v := v.(*DefaultLoginPolicy); i { case 0: return &v.state case 1: @@ -6408,6 +7891,66 @@ func file_admin_proto_init() { } } file_admin_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultLoginPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IdpProviderID); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultLoginPolicyView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IdpProviderView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IdpProviderSearchResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpProviderSearchRequest); i { case 0: return &v.state @@ -6419,6 +7962,114 @@ func file_admin_proto_init() { return nil } } + file_admin_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordComplexityPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordComplexityPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordComplexityPolicyView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordAgePolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordAgePolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordAgePolicyView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordLockoutPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordLockoutPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_admin_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultPasswordLockoutPolicyView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_admin_proto_msgTypes[9].OneofWrappers = []interface{}{ (*CreateUserRequest_Human)(nil), @@ -6428,10 +8079,10 @@ func file_admin_proto_init() { (*UserResponse_Human)(nil), (*UserResponse_Machine)(nil), } - file_admin_proto_msgTypes[36].OneofWrappers = []interface{}{ + file_admin_proto_msgTypes[37].OneofWrappers = []interface{}{ (*Idp_OidcConfig)(nil), } - file_admin_proto_msgTypes[42].OneofWrappers = []interface{}{ + file_admin_proto_msgTypes[43].OneofWrappers = []interface{}{ (*IdpView_OidcConfig)(nil), } type x struct{} @@ -6439,8 +8090,8 @@ func file_admin_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_admin_proto_rawDesc, - NumEnums: 12, - NumMessages: 52, + NumEnums: 13, + NumMessages: 66, NumExtensions: 0, NumServices: 1, }, @@ -6478,10 +8129,12 @@ type AdminServiceClient interface { SearchOrgs(ctx context.Context, in *OrgSearchRequest, opts ...grpc.CallOption) (*OrgSearchResponse, error) SetUpOrg(ctx context.Context, in *OrgSetUpRequest, opts ...grpc.CallOption) (*OrgSetUpResponse, error) //ORG_IAM_POLICY - GetOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*OrgIamPolicy, error) + GetDefaultOrgIamPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*OrgIamPolicyView, error) + UpdateDefaultOrgIamPolicy(ctx context.Context, in *OrgIamPolicyRequest, opts ...grpc.CallOption) (*OrgIamPolicy, error) + GetOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*OrgIamPolicyView, error) CreateOrgIamPolicy(ctx context.Context, in *OrgIamPolicyRequest, opts ...grpc.CallOption) (*OrgIamPolicy, error) UpdateOrgIamPolicy(ctx context.Context, in *OrgIamPolicyRequest, opts ...grpc.CallOption) (*OrgIamPolicy, error) - DeleteOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) + RemoveOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) GetIamMemberRoles(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*IamMemberRoles, error) AddIamMember(ctx context.Context, in *AddIamMemberRequest, opts ...grpc.CallOption) (*IamMember, error) ChangeIamMember(ctx context.Context, in *ChangeIamMemberRequest, opts ...grpc.CallOption) (*IamMember, error) @@ -6499,11 +8152,19 @@ type AdminServiceClient interface { RemoveIdpConfig(ctx context.Context, in *IdpID, opts ...grpc.CallOption) (*empty.Empty, error) UpdateOidcIdpConfig(ctx context.Context, in *OidcIdpConfigUpdate, opts ...grpc.CallOption) (*OidcIdpConfig, error) SearchIdps(ctx context.Context, in *IdpSearchRequest, opts ...grpc.CallOption) (*IdpSearchResponse, error) + GetDefaultLabelPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultLabelPolicyView, error) + UpdateDefaultLabelPolicy(ctx context.Context, in *DefaultLabelPolicyUpdate, opts ...grpc.CallOption) (*DefaultLabelPolicy, error) GetDefaultLoginPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultLoginPolicyView, error) - UpdateDefaultLoginPolicy(ctx context.Context, in *DefaultLoginPolicy, opts ...grpc.CallOption) (*DefaultLoginPolicy, error) + UpdateDefaultLoginPolicy(ctx context.Context, in *DefaultLoginPolicyRequest, opts ...grpc.CallOption) (*DefaultLoginPolicy, error) GetDefaultLoginPolicyIdpProviders(ctx context.Context, in *IdpProviderSearchRequest, opts ...grpc.CallOption) (*IdpProviderSearchResponse, error) AddIdpProviderToDefaultLoginPolicy(ctx context.Context, in *IdpProviderID, opts ...grpc.CallOption) (*IdpProviderID, error) RemoveIdpProviderFromDefaultLoginPolicy(ctx context.Context, in *IdpProviderID, opts ...grpc.CallOption) (*empty.Empty, error) + GetDefaultPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultPasswordComplexityPolicyView, error) + UpdateDefaultPasswordComplexityPolicy(ctx context.Context, in *DefaultPasswordComplexityPolicyRequest, opts ...grpc.CallOption) (*DefaultPasswordComplexityPolicy, error) + GetDefaultPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultPasswordAgePolicyView, error) + UpdateDefaultPasswordAgePolicy(ctx context.Context, in *DefaultPasswordAgePolicyRequest, opts ...grpc.CallOption) (*DefaultPasswordAgePolicy, error) + GetDefaultPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultPasswordLockoutPolicyView, error) + UpdateDefaultPasswordLockoutPolicy(ctx context.Context, in *DefaultPasswordLockoutPolicyRequest, opts ...grpc.CallOption) (*DefaultPasswordLockoutPolicy, error) } type adminServiceClient struct { @@ -6577,8 +8238,26 @@ func (c *adminServiceClient) SetUpOrg(ctx context.Context, in *OrgSetUpRequest, return out, nil } -func (c *adminServiceClient) GetOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*OrgIamPolicy, error) { +func (c *adminServiceClient) GetDefaultOrgIamPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*OrgIamPolicyView, error) { + out := new(OrgIamPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetDefaultOrgIamPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) UpdateDefaultOrgIamPolicy(ctx context.Context, in *OrgIamPolicyRequest, opts ...grpc.CallOption) (*OrgIamPolicy, error) { out := new(OrgIamPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultOrgIamPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) GetOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*OrgIamPolicyView, error) { + out := new(OrgIamPolicyView) err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetOrgIamPolicy", in, out, opts...) if err != nil { return nil, err @@ -6604,9 +8283,9 @@ func (c *adminServiceClient) UpdateOrgIamPolicy(ctx context.Context, in *OrgIamP return out, nil } -func (c *adminServiceClient) DeleteOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) { +func (c *adminServiceClient) RemoveOrgIamPolicy(ctx context.Context, in *OrgIamPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) { out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/DeleteOrgIamPolicy", in, out, opts...) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/RemoveOrgIamPolicy", in, out, opts...) if err != nil { return nil, err } @@ -6766,6 +8445,24 @@ func (c *adminServiceClient) SearchIdps(ctx context.Context, in *IdpSearchReques return out, nil } +func (c *adminServiceClient) GetDefaultLabelPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultLabelPolicyView, error) { + out := new(DefaultLabelPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetDefaultLabelPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) UpdateDefaultLabelPolicy(ctx context.Context, in *DefaultLabelPolicyUpdate, opts ...grpc.CallOption) (*DefaultLabelPolicy, error) { + out := new(DefaultLabelPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultLabelPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *adminServiceClient) GetDefaultLoginPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultLoginPolicyView, error) { out := new(DefaultLoginPolicyView) err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetDefaultLoginPolicy", in, out, opts...) @@ -6775,7 +8472,7 @@ func (c *adminServiceClient) GetDefaultLoginPolicy(ctx context.Context, in *empt return out, nil } -func (c *adminServiceClient) UpdateDefaultLoginPolicy(ctx context.Context, in *DefaultLoginPolicy, opts ...grpc.CallOption) (*DefaultLoginPolicy, error) { +func (c *adminServiceClient) UpdateDefaultLoginPolicy(ctx context.Context, in *DefaultLoginPolicyRequest, opts ...grpc.CallOption) (*DefaultLoginPolicy, error) { out := new(DefaultLoginPolicy) err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultLoginPolicy", in, out, opts...) if err != nil { @@ -6811,6 +8508,60 @@ func (c *adminServiceClient) RemoveIdpProviderFromDefaultLoginPolicy(ctx context return out, nil } +func (c *adminServiceClient) GetDefaultPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultPasswordComplexityPolicyView, error) { + out := new(DefaultPasswordComplexityPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordComplexityPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) UpdateDefaultPasswordComplexityPolicy(ctx context.Context, in *DefaultPasswordComplexityPolicyRequest, opts ...grpc.CallOption) (*DefaultPasswordComplexityPolicy, error) { + out := new(DefaultPasswordComplexityPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordComplexityPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) GetDefaultPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultPasswordAgePolicyView, error) { + out := new(DefaultPasswordAgePolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordAgePolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) UpdateDefaultPasswordAgePolicy(ctx context.Context, in *DefaultPasswordAgePolicyRequest, opts ...grpc.CallOption) (*DefaultPasswordAgePolicy, error) { + out := new(DefaultPasswordAgePolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordAgePolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) GetDefaultPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*DefaultPasswordLockoutPolicyView, error) { + out := new(DefaultPasswordLockoutPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordLockoutPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *adminServiceClient) UpdateDefaultPasswordLockoutPolicy(ctx context.Context, in *DefaultPasswordLockoutPolicyRequest, opts ...grpc.CallOption) (*DefaultPasswordLockoutPolicy, error) { + out := new(DefaultPasswordLockoutPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordLockoutPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // AdminServiceServer is the server API for AdminService service. type AdminServiceServer interface { // Healthz returns status OK as soon as the service started @@ -6824,10 +8575,12 @@ type AdminServiceServer interface { SearchOrgs(context.Context, *OrgSearchRequest) (*OrgSearchResponse, error) SetUpOrg(context.Context, *OrgSetUpRequest) (*OrgSetUpResponse, error) //ORG_IAM_POLICY - GetOrgIamPolicy(context.Context, *OrgIamPolicyID) (*OrgIamPolicy, error) + GetDefaultOrgIamPolicy(context.Context, *empty.Empty) (*OrgIamPolicyView, error) + UpdateDefaultOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) + GetOrgIamPolicy(context.Context, *OrgIamPolicyID) (*OrgIamPolicyView, error) CreateOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) UpdateOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) - DeleteOrgIamPolicy(context.Context, *OrgIamPolicyID) (*empty.Empty, error) + RemoveOrgIamPolicy(context.Context, *OrgIamPolicyID) (*empty.Empty, error) GetIamMemberRoles(context.Context, *empty.Empty) (*IamMemberRoles, error) AddIamMember(context.Context, *AddIamMemberRequest) (*IamMember, error) ChangeIamMember(context.Context, *ChangeIamMemberRequest) (*IamMember, error) @@ -6845,11 +8598,19 @@ type AdminServiceServer interface { RemoveIdpConfig(context.Context, *IdpID) (*empty.Empty, error) UpdateOidcIdpConfig(context.Context, *OidcIdpConfigUpdate) (*OidcIdpConfig, error) SearchIdps(context.Context, *IdpSearchRequest) (*IdpSearchResponse, error) + GetDefaultLabelPolicy(context.Context, *empty.Empty) (*DefaultLabelPolicyView, error) + UpdateDefaultLabelPolicy(context.Context, *DefaultLabelPolicyUpdate) (*DefaultLabelPolicy, error) GetDefaultLoginPolicy(context.Context, *empty.Empty) (*DefaultLoginPolicyView, error) - UpdateDefaultLoginPolicy(context.Context, *DefaultLoginPolicy) (*DefaultLoginPolicy, error) + UpdateDefaultLoginPolicy(context.Context, *DefaultLoginPolicyRequest) (*DefaultLoginPolicy, error) GetDefaultLoginPolicyIdpProviders(context.Context, *IdpProviderSearchRequest) (*IdpProviderSearchResponse, error) AddIdpProviderToDefaultLoginPolicy(context.Context, *IdpProviderID) (*IdpProviderID, error) RemoveIdpProviderFromDefaultLoginPolicy(context.Context, *IdpProviderID) (*empty.Empty, error) + GetDefaultPasswordComplexityPolicy(context.Context, *empty.Empty) (*DefaultPasswordComplexityPolicyView, error) + UpdateDefaultPasswordComplexityPolicy(context.Context, *DefaultPasswordComplexityPolicyRequest) (*DefaultPasswordComplexityPolicy, error) + GetDefaultPasswordAgePolicy(context.Context, *empty.Empty) (*DefaultPasswordAgePolicyView, error) + UpdateDefaultPasswordAgePolicy(context.Context, *DefaultPasswordAgePolicyRequest) (*DefaultPasswordAgePolicy, error) + GetDefaultPasswordLockoutPolicy(context.Context, *empty.Empty) (*DefaultPasswordLockoutPolicyView, error) + UpdateDefaultPasswordLockoutPolicy(context.Context, *DefaultPasswordLockoutPolicyRequest) (*DefaultPasswordLockoutPolicy, error) } // UnimplementedAdminServiceServer can be embedded to have forward compatible implementations. @@ -6877,7 +8638,13 @@ func (*UnimplementedAdminServiceServer) SearchOrgs(context.Context, *OrgSearchRe func (*UnimplementedAdminServiceServer) SetUpOrg(context.Context, *OrgSetUpRequest) (*OrgSetUpResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetUpOrg not implemented") } -func (*UnimplementedAdminServiceServer) GetOrgIamPolicy(context.Context, *OrgIamPolicyID) (*OrgIamPolicy, error) { +func (*UnimplementedAdminServiceServer) GetDefaultOrgIamPolicy(context.Context, *empty.Empty) (*OrgIamPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultOrgIamPolicy not implemented") +} +func (*UnimplementedAdminServiceServer) UpdateDefaultOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDefaultOrgIamPolicy not implemented") +} +func (*UnimplementedAdminServiceServer) GetOrgIamPolicy(context.Context, *OrgIamPolicyID) (*OrgIamPolicyView, error) { return nil, status.Errorf(codes.Unimplemented, "method GetOrgIamPolicy not implemented") } func (*UnimplementedAdminServiceServer) CreateOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) { @@ -6886,8 +8653,8 @@ func (*UnimplementedAdminServiceServer) CreateOrgIamPolicy(context.Context, *Org func (*UnimplementedAdminServiceServer) UpdateOrgIamPolicy(context.Context, *OrgIamPolicyRequest) (*OrgIamPolicy, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateOrgIamPolicy not implemented") } -func (*UnimplementedAdminServiceServer) DeleteOrgIamPolicy(context.Context, *OrgIamPolicyID) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteOrgIamPolicy not implemented") +func (*UnimplementedAdminServiceServer) RemoveOrgIamPolicy(context.Context, *OrgIamPolicyID) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveOrgIamPolicy not implemented") } func (*UnimplementedAdminServiceServer) GetIamMemberRoles(context.Context, *empty.Empty) (*IamMemberRoles, error) { return nil, status.Errorf(codes.Unimplemented, "method GetIamMemberRoles not implemented") @@ -6940,10 +8707,16 @@ func (*UnimplementedAdminServiceServer) UpdateOidcIdpConfig(context.Context, *Oi func (*UnimplementedAdminServiceServer) SearchIdps(context.Context, *IdpSearchRequest) (*IdpSearchResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SearchIdps not implemented") } +func (*UnimplementedAdminServiceServer) GetDefaultLabelPolicy(context.Context, *empty.Empty) (*DefaultLabelPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultLabelPolicy not implemented") +} +func (*UnimplementedAdminServiceServer) UpdateDefaultLabelPolicy(context.Context, *DefaultLabelPolicyUpdate) (*DefaultLabelPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDefaultLabelPolicy not implemented") +} func (*UnimplementedAdminServiceServer) GetDefaultLoginPolicy(context.Context, *empty.Empty) (*DefaultLoginPolicyView, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDefaultLoginPolicy not implemented") } -func (*UnimplementedAdminServiceServer) UpdateDefaultLoginPolicy(context.Context, *DefaultLoginPolicy) (*DefaultLoginPolicy, error) { +func (*UnimplementedAdminServiceServer) UpdateDefaultLoginPolicy(context.Context, *DefaultLoginPolicyRequest) (*DefaultLoginPolicy, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateDefaultLoginPolicy not implemented") } func (*UnimplementedAdminServiceServer) GetDefaultLoginPolicyIdpProviders(context.Context, *IdpProviderSearchRequest) (*IdpProviderSearchResponse, error) { @@ -6955,6 +8728,24 @@ func (*UnimplementedAdminServiceServer) AddIdpProviderToDefaultLoginPolicy(conte func (*UnimplementedAdminServiceServer) RemoveIdpProviderFromDefaultLoginPolicy(context.Context, *IdpProviderID) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveIdpProviderFromDefaultLoginPolicy not implemented") } +func (*UnimplementedAdminServiceServer) GetDefaultPasswordComplexityPolicy(context.Context, *empty.Empty) (*DefaultPasswordComplexityPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultPasswordComplexityPolicy not implemented") +} +func (*UnimplementedAdminServiceServer) UpdateDefaultPasswordComplexityPolicy(context.Context, *DefaultPasswordComplexityPolicyRequest) (*DefaultPasswordComplexityPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDefaultPasswordComplexityPolicy not implemented") +} +func (*UnimplementedAdminServiceServer) GetDefaultPasswordAgePolicy(context.Context, *empty.Empty) (*DefaultPasswordAgePolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultPasswordAgePolicy not implemented") +} +func (*UnimplementedAdminServiceServer) UpdateDefaultPasswordAgePolicy(context.Context, *DefaultPasswordAgePolicyRequest) (*DefaultPasswordAgePolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDefaultPasswordAgePolicy not implemented") +} +func (*UnimplementedAdminServiceServer) GetDefaultPasswordLockoutPolicy(context.Context, *empty.Empty) (*DefaultPasswordLockoutPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultPasswordLockoutPolicy not implemented") +} +func (*UnimplementedAdminServiceServer) UpdateDefaultPasswordLockoutPolicy(context.Context, *DefaultPasswordLockoutPolicyRequest) (*DefaultPasswordLockoutPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateDefaultPasswordLockoutPolicy not implemented") +} func RegisterAdminServiceServer(s *grpc.Server, srv AdminServiceServer) { s.RegisterService(&_AdminService_serviceDesc, srv) @@ -7086,6 +8877,42 @@ func _AdminService_SetUpOrg_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _AdminService_GetDefaultOrgIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).GetDefaultOrgIamPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/GetDefaultOrgIamPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).GetDefaultOrgIamPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_UpdateDefaultOrgIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OrgIamPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).UpdateDefaultOrgIamPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultOrgIamPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).UpdateDefaultOrgIamPolicy(ctx, req.(*OrgIamPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _AdminService_GetOrgIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(OrgIamPolicyID) if err := dec(in); err != nil { @@ -7140,20 +8967,20 @@ func _AdminService_UpdateOrgIamPolicy_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } -func _AdminService_DeleteOrgIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _AdminService_RemoveOrgIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(OrgIamPolicyID) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AdminServiceServer).DeleteOrgIamPolicy(ctx, in) + return srv.(AdminServiceServer).RemoveOrgIamPolicy(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/caos.zitadel.admin.api.v1.AdminService/DeleteOrgIamPolicy", + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/RemoveOrgIamPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AdminServiceServer).DeleteOrgIamPolicy(ctx, req.(*OrgIamPolicyID)) + return srv.(AdminServiceServer).RemoveOrgIamPolicy(ctx, req.(*OrgIamPolicyID)) } return interceptor(ctx, in, info, handler) } @@ -7464,6 +9291,42 @@ func _AdminService_SearchIdps_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _AdminService_GetDefaultLabelPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).GetDefaultLabelPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/GetDefaultLabelPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).GetDefaultLabelPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_UpdateDefaultLabelPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DefaultLabelPolicyUpdate) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).UpdateDefaultLabelPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultLabelPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).UpdateDefaultLabelPolicy(ctx, req.(*DefaultLabelPolicyUpdate)) + } + return interceptor(ctx, in, info, handler) +} + func _AdminService_GetDefaultLoginPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(empty.Empty) if err := dec(in); err != nil { @@ -7483,7 +9346,7 @@ func _AdminService_GetDefaultLoginPolicy_Handler(srv interface{}, ctx context.Co } func _AdminService_UpdateDefaultLoginPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DefaultLoginPolicy) + in := new(DefaultLoginPolicyRequest) if err := dec(in); err != nil { return nil, err } @@ -7495,7 +9358,7 @@ func _AdminService_UpdateDefaultLoginPolicy_Handler(srv interface{}, ctx context FullMethod: "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultLoginPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AdminServiceServer).UpdateDefaultLoginPolicy(ctx, req.(*DefaultLoginPolicy)) + return srv.(AdminServiceServer).UpdateDefaultLoginPolicy(ctx, req.(*DefaultLoginPolicyRequest)) } return interceptor(ctx, in, info, handler) } @@ -7554,6 +9417,114 @@ func _AdminService_RemoveIdpProviderFromDefaultLoginPolicy_Handler(srv interface return interceptor(ctx, in, info, handler) } +func _AdminService_GetDefaultPasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).GetDefaultPasswordComplexityPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordComplexityPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).GetDefaultPasswordComplexityPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_UpdateDefaultPasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DefaultPasswordComplexityPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).UpdateDefaultPasswordComplexityPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordComplexityPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).UpdateDefaultPasswordComplexityPolicy(ctx, req.(*DefaultPasswordComplexityPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_GetDefaultPasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).GetDefaultPasswordAgePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordAgePolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).GetDefaultPasswordAgePolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_UpdateDefaultPasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DefaultPasswordAgePolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).UpdateDefaultPasswordAgePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordAgePolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).UpdateDefaultPasswordAgePolicy(ctx, req.(*DefaultPasswordAgePolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_GetDefaultPasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).GetDefaultPasswordLockoutPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/GetDefaultPasswordLockoutPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).GetDefaultPasswordLockoutPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AdminService_UpdateDefaultPasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DefaultPasswordLockoutPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AdminServiceServer).UpdateDefaultPasswordLockoutPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.admin.api.v1.AdminService/UpdateDefaultPasswordLockoutPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AdminServiceServer).UpdateDefaultPasswordLockoutPolicy(ctx, req.(*DefaultPasswordLockoutPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _AdminService_serviceDesc = grpc.ServiceDesc{ ServiceName: "caos.zitadel.admin.api.v1.AdminService", HandlerType: (*AdminServiceServer)(nil), @@ -7586,6 +9557,14 @@ var _AdminService_serviceDesc = grpc.ServiceDesc{ MethodName: "SetUpOrg", Handler: _AdminService_SetUpOrg_Handler, }, + { + MethodName: "GetDefaultOrgIamPolicy", + Handler: _AdminService_GetDefaultOrgIamPolicy_Handler, + }, + { + MethodName: "UpdateDefaultOrgIamPolicy", + Handler: _AdminService_UpdateDefaultOrgIamPolicy_Handler, + }, { MethodName: "GetOrgIamPolicy", Handler: _AdminService_GetOrgIamPolicy_Handler, @@ -7599,8 +9578,8 @@ var _AdminService_serviceDesc = grpc.ServiceDesc{ Handler: _AdminService_UpdateOrgIamPolicy_Handler, }, { - MethodName: "DeleteOrgIamPolicy", - Handler: _AdminService_DeleteOrgIamPolicy_Handler, + MethodName: "RemoveOrgIamPolicy", + Handler: _AdminService_RemoveOrgIamPolicy_Handler, }, { MethodName: "GetIamMemberRoles", @@ -7670,6 +9649,14 @@ var _AdminService_serviceDesc = grpc.ServiceDesc{ MethodName: "SearchIdps", Handler: _AdminService_SearchIdps_Handler, }, + { + MethodName: "GetDefaultLabelPolicy", + Handler: _AdminService_GetDefaultLabelPolicy_Handler, + }, + { + MethodName: "UpdateDefaultLabelPolicy", + Handler: _AdminService_UpdateDefaultLabelPolicy_Handler, + }, { MethodName: "GetDefaultLoginPolicy", Handler: _AdminService_GetDefaultLoginPolicy_Handler, @@ -7690,6 +9677,30 @@ var _AdminService_serviceDesc = grpc.ServiceDesc{ MethodName: "RemoveIdpProviderFromDefaultLoginPolicy", Handler: _AdminService_RemoveIdpProviderFromDefaultLoginPolicy_Handler, }, + { + MethodName: "GetDefaultPasswordComplexityPolicy", + Handler: _AdminService_GetDefaultPasswordComplexityPolicy_Handler, + }, + { + MethodName: "UpdateDefaultPasswordComplexityPolicy", + Handler: _AdminService_UpdateDefaultPasswordComplexityPolicy_Handler, + }, + { + MethodName: "GetDefaultPasswordAgePolicy", + Handler: _AdminService_GetDefaultPasswordAgePolicy_Handler, + }, + { + MethodName: "UpdateDefaultPasswordAgePolicy", + Handler: _AdminService_UpdateDefaultPasswordAgePolicy_Handler, + }, + { + MethodName: "GetDefaultPasswordLockoutPolicy", + Handler: _AdminService_GetDefaultPasswordLockoutPolicy_Handler, + }, + { + MethodName: "UpdateDefaultPasswordLockoutPolicy", + Handler: _AdminService_UpdateDefaultPasswordLockoutPolicy_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "admin.proto", diff --git a/pkg/grpc/admin/admin.pb.gw.go b/pkg/grpc/admin/admin.pb.gw.go index 48ded0b111..5c8943e764 100644 --- a/pkg/grpc/admin/admin.pb.gw.go +++ b/pkg/grpc/admin/admin.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/golang/protobuf/ptypes/empty" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -20,14 +21,18 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join func request_AdminService_Healthz_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty @@ -38,6 +43,15 @@ func request_AdminService_Healthz_0(ctx context.Context, marshaler runtime.Marsh } +func local_request_AdminService_Healthz_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.Healthz(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_Ready_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -47,6 +61,15 @@ func request_AdminService_Ready_0(ctx context.Context, marshaler runtime.Marshal } +func local_request_AdminService_Ready_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.Ready(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_Validate_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -56,6 +79,15 @@ func request_AdminService_Validate_0(ctx context.Context, marshaler runtime.Mars } +func local_request_AdminService_Validate_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.Validate(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_AdminService_IsOrgUnique_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -64,7 +96,10 @@ func request_AdminService_IsOrgUnique_0(ctx context.Context, marshaler runtime.M var protoReq UniqueOrgRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_AdminService_IsOrgUnique_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AdminService_IsOrgUnique_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -73,6 +108,22 @@ func request_AdminService_IsOrgUnique_0(ctx context.Context, marshaler runtime.M } +func local_request_AdminService_IsOrgUnique_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UniqueOrgRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AdminService_IsOrgUnique_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.IsOrgUnique(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_GetOrgByID_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgID var metadata runtime.ServerMetadata @@ -100,6 +151,33 @@ func request_AdminService_GetOrgByID_0(ctx context.Context, marshaler runtime.Ma } +func local_request_AdminService_GetOrgByID_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.GetOrgByID(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_SearchOrgs_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgSearchRequest var metadata runtime.ServerMetadata @@ -117,6 +195,23 @@ func request_AdminService_SearchOrgs_0(ctx context.Context, marshaler runtime.Ma } +func local_request_AdminService_SearchOrgs_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SearchOrgs(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_SetUpOrg_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgSetUpRequest var metadata runtime.ServerMetadata @@ -134,6 +229,75 @@ func request_AdminService_SetUpOrg_0(ctx context.Context, marshaler runtime.Mars } +func local_request_AdminService_SetUpOrg_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgSetUpRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SetUpOrg(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_GetDefaultOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultOrgIamPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_GetDefaultOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultOrgIamPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_UpdateDefaultOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgIamPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdateDefaultOrgIamPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_UpdateDefaultOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgIamPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateDefaultOrgIamPolicy(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_GetOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgIamPolicyID var metadata runtime.ServerMetadata @@ -161,6 +325,33 @@ func request_AdminService_GetOrgIamPolicy_0(ctx context.Context, marshaler runti } +func local_request_AdminService_GetOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgIamPolicyID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["org_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "org_id") + } + + protoReq.OrgId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "org_id", err) + } + + msg, err := server.GetOrgIamPolicy(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_CreateOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgIamPolicyRequest var metadata runtime.ServerMetadata @@ -196,6 +387,41 @@ func request_AdminService_CreateOrgIamPolicy_0(ctx context.Context, marshaler ru } +func local_request_AdminService_CreateOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgIamPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["org_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "org_id") + } + + protoReq.OrgId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "org_id", err) + } + + msg, err := server.CreateOrgIamPolicy(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_UpdateOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgIamPolicyRequest var metadata runtime.ServerMetadata @@ -231,7 +457,42 @@ func request_AdminService_UpdateOrgIamPolicy_0(ctx context.Context, marshaler ru } -func request_AdminService_DeleteOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_AdminService_UpdateOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgIamPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["org_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "org_id") + } + + protoReq.OrgId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "org_id", err) + } + + msg, err := server.UpdateOrgIamPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_RemoveOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgIamPolicyID var metadata runtime.ServerMetadata @@ -253,7 +514,34 @@ func request_AdminService_DeleteOrgIamPolicy_0(ctx context.Context, marshaler ru return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "org_id", err) } - msg, err := client.DeleteOrgIamPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.RemoveOrgIamPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_RemoveOrgIamPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OrgIamPolicyID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["org_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "org_id") + } + + protoReq.OrgId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "org_id", err) + } + + msg, err := server.RemoveOrgIamPolicy(ctx, &protoReq) return msg, metadata, err } @@ -267,6 +555,15 @@ func request_AdminService_GetIamMemberRoles_0(ctx context.Context, marshaler run } +func local_request_AdminService_GetIamMemberRoles_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetIamMemberRoles(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_AddIamMember_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq AddIamMemberRequest var metadata runtime.ServerMetadata @@ -284,6 +581,23 @@ func request_AdminService_AddIamMember_0(ctx context.Context, marshaler runtime. } +func local_request_AdminService_AddIamMember_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddIamMemberRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AddIamMember(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_ChangeIamMember_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ChangeIamMemberRequest var metadata runtime.ServerMetadata @@ -319,6 +633,41 @@ func request_AdminService_ChangeIamMember_0(ctx context.Context, marshaler runti } +func local_request_AdminService_ChangeIamMember_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChangeIamMemberRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["user_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") + } + + protoReq.UserId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) + } + + msg, err := server.ChangeIamMember(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_RemoveIamMember_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RemoveIamMemberRequest var metadata runtime.ServerMetadata @@ -346,6 +695,33 @@ func request_AdminService_RemoveIamMember_0(ctx context.Context, marshaler runti } +func local_request_AdminService_RemoveIamMember_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RemoveIamMemberRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["user_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_id") + } + + protoReq.UserId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user_id", err) + } + + msg, err := server.RemoveIamMember(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_SearchIamMembers_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IamMemberSearchRequest var metadata runtime.ServerMetadata @@ -363,6 +739,23 @@ func request_AdminService_SearchIamMembers_0(ctx context.Context, marshaler runt } +func local_request_AdminService_SearchIamMembers_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IamMemberSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SearchIamMembers(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_GetViews_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -372,6 +765,15 @@ func request_AdminService_GetViews_0(ctx context.Context, marshaler runtime.Mars } +func local_request_AdminService_GetViews_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetViews(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_ClearView_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ViewID var metadata runtime.ServerMetadata @@ -410,6 +812,44 @@ func request_AdminService_ClearView_0(ctx context.Context, marshaler runtime.Mar } +func local_request_AdminService_ClearView_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ViewID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["database"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "database") + } + + protoReq.Database, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "database", err) + } + + val, ok = pathParams["view_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "view_name") + } + + protoReq.ViewName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "view_name", err) + } + + msg, err := server.ClearView(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_GetFailedEvents_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -419,6 +859,15 @@ func request_AdminService_GetFailedEvents_0(ctx context.Context, marshaler runti } +func local_request_AdminService_GetFailedEvents_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetFailedEvents(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_RemoveFailedEvent_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq FailedEventID var metadata runtime.ServerMetadata @@ -468,6 +917,55 @@ func request_AdminService_RemoveFailedEvent_0(ctx context.Context, marshaler run } +func local_request_AdminService_RemoveFailedEvent_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq FailedEventID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["database"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "database") + } + + protoReq.Database, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "database", err) + } + + val, ok = pathParams["view_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "view_name") + } + + protoReq.ViewName, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "view_name", err) + } + + val, ok = pathParams["failed_sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "failed_sequence") + } + + protoReq.FailedSequence, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "failed_sequence", err) + } + + msg, err := server.RemoveFailedEvent(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_IdpByID_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpID var metadata runtime.ServerMetadata @@ -495,6 +993,33 @@ func request_AdminService_IdpByID_0(ctx context.Context, marshaler runtime.Marsh } +func local_request_AdminService_IdpByID_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.IdpByID(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_CreateOidcIdp_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OidcIdpConfigCreate var metadata runtime.ServerMetadata @@ -512,6 +1037,23 @@ func request_AdminService_CreateOidcIdp_0(ctx context.Context, marshaler runtime } +func local_request_AdminService_CreateOidcIdp_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OidcIdpConfigCreate + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreateOidcIdp(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_UpdateIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpUpdate var metadata runtime.ServerMetadata @@ -547,6 +1089,41 @@ func request_AdminService_UpdateIdpConfig_0(ctx context.Context, marshaler runti } +func local_request_AdminService_UpdateIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpUpdate + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.UpdateIdpConfig(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_DeactivateIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpID var metadata runtime.ServerMetadata @@ -582,6 +1159,41 @@ func request_AdminService_DeactivateIdpConfig_0(ctx context.Context, marshaler r } +func local_request_AdminService_DeactivateIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpID + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.DeactivateIdpConfig(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_ReactivateIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpID var metadata runtime.ServerMetadata @@ -617,6 +1229,41 @@ func request_AdminService_ReactivateIdpConfig_0(ctx context.Context, marshaler r } +func local_request_AdminService_ReactivateIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpID + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.ReactivateIdpConfig(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_RemoveIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpID var metadata runtime.ServerMetadata @@ -644,6 +1291,33 @@ func request_AdminService_RemoveIdpConfig_0(ctx context.Context, marshaler runti } +func local_request_AdminService_RemoveIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") + } + + protoReq.Id, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) + } + + msg, err := server.RemoveIdpConfig(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_UpdateOidcIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OidcIdpConfigUpdate var metadata runtime.ServerMetadata @@ -679,6 +1353,41 @@ func request_AdminService_UpdateOidcIdpConfig_0(ctx context.Context, marshaler r } +func local_request_AdminService_UpdateOidcIdpConfig_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OidcIdpConfigUpdate + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["idp_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "idp_id") + } + + protoReq.IdpId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "idp_id", err) + } + + msg, err := server.UpdateOidcIdpConfig(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_SearchIdps_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpSearchRequest var metadata runtime.ServerMetadata @@ -696,6 +1405,75 @@ func request_AdminService_SearchIdps_0(ctx context.Context, marshaler runtime.Ma } +func local_request_AdminService_SearchIdps_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SearchIdps(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_GetDefaultLabelPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultLabelPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_GetDefaultLabelPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultLabelPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_UpdateDefaultLabelPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultLabelPolicyUpdate + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdateDefaultLabelPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_UpdateDefaultLabelPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultLabelPolicyUpdate + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateDefaultLabelPolicy(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_GetDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty var metadata runtime.ServerMetadata @@ -705,8 +1483,17 @@ func request_AdminService_GetDefaultLoginPolicy_0(ctx context.Context, marshaler } +func local_request_AdminService_GetDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultLoginPolicy(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_UpdateDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DefaultLoginPolicy + var protoReq DefaultLoginPolicyRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -722,6 +1509,23 @@ func request_AdminService_UpdateDefaultLoginPolicy_0(ctx context.Context, marsha } +func local_request_AdminService_UpdateDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultLoginPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateDefaultLoginPolicy(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_GetDefaultLoginPolicyIdpProviders_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpProviderSearchRequest var metadata runtime.ServerMetadata @@ -739,6 +1543,23 @@ func request_AdminService_GetDefaultLoginPolicyIdpProviders_0(ctx context.Contex } +func local_request_AdminService_GetDefaultLoginPolicyIdpProviders_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpProviderSearchRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetDefaultLoginPolicyIdpProviders(ctx, &protoReq) + return msg, metadata, err + +} + func request_AdminService_AddIdpProviderToDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpProviderID var metadata runtime.ServerMetadata @@ -756,7 +1577,7 @@ func request_AdminService_AddIdpProviderToDefaultLoginPolicy_0(ctx context.Conte } -func request_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_AdminService_AddIdpProviderToDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq IdpProviderID var metadata runtime.ServerMetadata @@ -768,6 +1589,15 @@ func request_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0(ctx context. return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + msg, err := server.AddIdpProviderToDefaultLoginPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpProviderID + var metadata runtime.ServerMetadata + var ( val string ok bool @@ -791,6 +1621,1187 @@ func request_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0(ctx context. } +func local_request_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq IdpProviderID + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["idp_config_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "idp_config_id") + } + + protoReq.IdpConfigId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "idp_config_id", err) + } + + msg, err := server.RemoveIdpProviderFromDefaultLoginPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_GetDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultPasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_GetDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultPasswordComplexityPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_UpdateDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultPasswordComplexityPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdateDefaultPasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_UpdateDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultPasswordComplexityPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateDefaultPasswordComplexityPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_GetDefaultPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultPasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_GetDefaultPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultPasswordAgePolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_UpdateDefaultPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultPasswordAgePolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdateDefaultPasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_UpdateDefaultPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultPasswordAgePolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateDefaultPasswordAgePolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_GetDefaultPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultPasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_GetDefaultPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultPasswordLockoutPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_AdminService_UpdateDefaultPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client AdminServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultPasswordLockoutPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdateDefaultPasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_AdminService_UpdateDefaultPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server AdminServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DefaultPasswordLockoutPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateDefaultPasswordLockoutPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterAdminServiceHandlerServer registers the http handlers for service AdminService to "mux". +// UnaryRPC :call AdminServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAdminServiceHandlerFromEndpoint instead. +func RegisterAdminServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AdminServiceServer) error { + + mux.Handle("GET", pattern_AdminService_Healthz_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_Healthz_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_Healthz_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_Ready_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_Ready_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_Ready_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_Validate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_Validate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_Validate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_IsOrgUnique_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_IsOrgUnique_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_IsOrgUnique_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetOrgByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetOrgByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetOrgByID_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_SearchOrgs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_SearchOrgs_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_SearchOrgs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_SetUpOrg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_SetUpOrg_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_SetUpOrg_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDefaultOrgIamPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateDefaultOrgIamPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetOrgIamPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_CreateOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_CreateOrgIamPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_CreateOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateOrgIamPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_AdminService_RemoveOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_RemoveOrgIamPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_RemoveOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetIamMemberRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetIamMemberRoles_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetIamMemberRoles_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_AddIamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_AddIamMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_AddIamMember_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_ChangeIamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_ChangeIamMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_ChangeIamMember_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_AdminService_RemoveIamMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_RemoveIamMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_RemoveIamMember_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_SearchIamMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_SearchIamMembers_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_SearchIamMembers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetViews_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetViews_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetViews_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_ClearView_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_ClearView_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_ClearView_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetFailedEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetFailedEvents_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetFailedEvents_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_AdminService_RemoveFailedEvent_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_RemoveFailedEvent_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_RemoveFailedEvent_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_IdpByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_IdpByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_IdpByID_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_CreateOidcIdp_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_CreateOidcIdp_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_CreateOidcIdp_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateIdpConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_DeactivateIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_DeactivateIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_DeactivateIdpConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_ReactivateIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_ReactivateIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_ReactivateIdpConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_AdminService_RemoveIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_RemoveIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_RemoveIdpConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateOidcIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateOidcIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateOidcIdpConfig_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_SearchIdps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_SearchIdps_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_SearchIdps_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultLabelPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDefaultLabelPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultLabelPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultLabelPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateDefaultLabelPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultLabelPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDefaultLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultLoginPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateDefaultLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultLoginPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_GetDefaultLoginPolicyIdpProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDefaultLoginPolicyIdpProviders_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultLoginPolicyIdpProviders_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_AdminService_AddIdpProviderToDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_AddIdpProviderToDefaultLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_AddIdpProviderToDefaultLoginPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDefaultPasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateDefaultPasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_GetDefaultPasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AdminService_UpdateDefaultPasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterAdminServiceHandlerFromEndpoint is same as RegisterAdminServiceHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterAdminServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { @@ -969,6 +2980,46 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("GET", pattern_AdminService_GetDefaultOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_GetDefaultOrgIamPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_UpdateDefaultOrgIamPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_AdminService_GetOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1029,7 +3080,7 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) - mux.Handle("DELETE", pattern_AdminService_DeleteOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_AdminService_RemoveOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1038,14 +3089,14 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_AdminService_DeleteOrgIamPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_AdminService_RemoveOrgIamPolicy_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_AdminService_DeleteOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_AdminService_RemoveOrgIamPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1389,6 +3440,46 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("GET", pattern_AdminService_GetDefaultLabelPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_GetDefaultLabelPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultLabelPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultLabelPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_UpdateDefaultLabelPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultLabelPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_AdminService_GetDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1469,7 +3560,7 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) - mux.Handle("POST", pattern_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -1489,75 +3580,215 @@ func RegisterAdminServiceHandlerClient(ctx context.Context, mux *runtime.ServeMu }) + mux.Handle("GET", pattern_AdminService_GetDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_GetDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_UpdateDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_GetDefaultPasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_UpdateDefaultPasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_AdminService_GetDefaultPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_GetDefaultPasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_GetDefaultPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_AdminService_UpdateDefaultPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AdminService_UpdateDefaultPasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_AdminService_UpdateDefaultPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } var ( - pattern_AdminService_Healthz_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"healthz"}, "")) + pattern_AdminService_Healthz_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"healthz"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_Ready_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"ready"}, "")) + pattern_AdminService_Ready_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"ready"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_Validate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"validate"}, "")) + pattern_AdminService_Validate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"validate"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_IsOrgUnique_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"orgs", "_isunique"}, "")) + pattern_AdminService_IsOrgUnique_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"orgs", "_isunique"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_GetOrgByID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"orgs", "id"}, "")) + pattern_AdminService_GetOrgByID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"orgs", "id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_SearchOrgs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"orgs", "_search"}, "")) + pattern_AdminService_SearchOrgs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"orgs", "_search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_SetUpOrg_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"orgs", "_setup"}, "")) + pattern_AdminService_SetUpOrg_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"orgs", "_setup"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_GetOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"orgs", "org_id", "iampolicy"}, "")) + pattern_AdminService_GetDefaultOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"orgs", "default", "policies", "orgiam"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_CreateOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"orgs", "org_id", "iampolicy"}, "")) + pattern_AdminService_UpdateDefaultOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"orgs", "default", "policies", "orgiam"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_UpdateOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"orgs", "org_id", "iampolicy"}, "")) + pattern_AdminService_GetOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"orgs", "org_id", "policies", "orgiam"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_DeleteOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"orgs", "org_id", "iampolicy"}, "")) + pattern_AdminService_CreateOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"orgs", "org_id", "policies", "orgiam"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_GetIamMemberRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"members", "roles"}, "")) + pattern_AdminService_UpdateOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"orgs", "org_id", "policies", "orgiam"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_AddIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"members"}, "")) + pattern_AdminService_RemoveOrgIamPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"orgs", "org_id", "policies", "orgiam"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_ChangeIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "user_id"}, "")) + pattern_AdminService_GetIamMemberRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"members", "roles"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_RemoveIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "user_id"}, "")) + pattern_AdminService_AddIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"members"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_SearchIamMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"members", "_search"}, "")) + pattern_AdminService_ChangeIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "user_id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_GetViews_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"views"}, "")) + pattern_AdminService_RemoveIamMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "user_id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_ClearView_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 1, 0, 4, 1, 5, 2}, []string{"views", "database", "view_name"}, "")) + pattern_AdminService_SearchIamMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"members", "_search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_GetFailedEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"failedevents"}, "")) + pattern_AdminService_GetViews_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"views"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_RemoveFailedEvent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"failedevents", "database", "view_name", "failed_sequence"}, "")) + pattern_AdminService_ClearView_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 1, 0, 4, 1, 5, 2}, []string{"views", "database", "view_name"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_IdpByID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"idps", "id"}, "")) + pattern_AdminService_GetFailedEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"failedevents"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_CreateOidcIdp_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"idps", "oidc"}, "")) + pattern_AdminService_RemoveFailedEvent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"failedevents", "database", "view_name", "failed_sequence"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_UpdateIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"idps", "id"}, "")) + pattern_AdminService_IdpByID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"idps", "id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_DeactivateIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"idps", "id", "_deactivate"}, "")) + pattern_AdminService_CreateOidcIdp_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"idps", "oidc"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_ReactivateIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"idps", "id", "_reactivate"}, "")) + pattern_AdminService_UpdateIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"idps", "id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_RemoveIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"idps", "id"}, "")) + pattern_AdminService_DeactivateIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"idps", "id", "_deactivate"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_UpdateOidcIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"idps", "idp_id", "oidcconfig"}, "")) + pattern_AdminService_ReactivateIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"idps", "id", "_reactivate"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_SearchIdps_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"idps", "_search"}, "")) + pattern_AdminService_RemoveIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"idps", "id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_GetDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"policies", "login"}, "")) + pattern_AdminService_UpdateOidcIdpConfig_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"idps", "idp_id", "oidcconfig"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_UpdateDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"policies", "login"}, "")) + pattern_AdminService_SearchIdps_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"idps", "_search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_GetDefaultLoginPolicyIdpProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"policies", "login", "idpproviders", "_search"}, "")) + pattern_AdminService_GetDefaultLabelPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"policies", "label"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_AddIdpProviderToDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "login", "idpproviders"}, "")) + pattern_AdminService_UpdateDefaultLabelPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"policies", "label"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"policies", "login", "idpproviders", "idp_config_id"}, "")) + pattern_AdminService_GetDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"policies", "login"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_UpdateDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"policies", "login"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_GetDefaultLoginPolicyIdpProviders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"policies", "login", "idpproviders", "_search"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_AddIdpProviderToDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "login", "idpproviders"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"policies", "login", "idpproviders", "idp_config_id"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_GetDefaultPasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "password", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_UpdateDefaultPasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "password", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_GetDefaultPasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "password", "age"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_UpdateDefaultPasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "password", "age"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_GetDefaultPasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "password", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_AdminService_UpdateDefaultPasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "password", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1575,13 +3806,17 @@ var ( forward_AdminService_SetUpOrg_0 = runtime.ForwardResponseMessage + forward_AdminService_GetDefaultOrgIamPolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_UpdateDefaultOrgIamPolicy_0 = runtime.ForwardResponseMessage + forward_AdminService_GetOrgIamPolicy_0 = runtime.ForwardResponseMessage forward_AdminService_CreateOrgIamPolicy_0 = runtime.ForwardResponseMessage forward_AdminService_UpdateOrgIamPolicy_0 = runtime.ForwardResponseMessage - forward_AdminService_DeleteOrgIamPolicy_0 = runtime.ForwardResponseMessage + forward_AdminService_RemoveOrgIamPolicy_0 = runtime.ForwardResponseMessage forward_AdminService_GetIamMemberRoles_0 = runtime.ForwardResponseMessage @@ -1617,6 +3852,10 @@ var ( forward_AdminService_SearchIdps_0 = runtime.ForwardResponseMessage + forward_AdminService_GetDefaultLabelPolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_UpdateDefaultLabelPolicy_0 = runtime.ForwardResponseMessage + forward_AdminService_GetDefaultLoginPolicy_0 = runtime.ForwardResponseMessage forward_AdminService_UpdateDefaultLoginPolicy_0 = runtime.ForwardResponseMessage @@ -1626,4 +3865,16 @@ var ( forward_AdminService_AddIdpProviderToDefaultLoginPolicy_0 = runtime.ForwardResponseMessage forward_AdminService_RemoveIdpProviderFromDefaultLoginPolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_GetDefaultPasswordComplexityPolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_UpdateDefaultPasswordComplexityPolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_GetDefaultPasswordAgePolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_UpdateDefaultPasswordAgePolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_GetDefaultPasswordLockoutPolicy_0 = runtime.ForwardResponseMessage + + forward_AdminService_UpdateDefaultPasswordLockoutPolicy_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/grpc/admin/admin.pb.validate.go b/pkg/grpc/admin/admin.pb.validate.go index 6f0501ecc4..2dbe519cdc 100644 --- a/pkg/grpc/admin/admin.pb.validate.go +++ b/pkg/grpc/admin/admin.pb.validate.go @@ -1697,8 +1697,6 @@ func (m *OrgIamPolicy) Validate() error { // no validation rules for OrgId - // no validation rules for Description - // no validation rules for UserLoginMustBeDomain // no validation rules for Default @@ -1782,6 +1780,99 @@ var _ interface { ErrorName() string } = OrgIamPolicyValidationError{} +// Validate checks the field values on OrgIamPolicyView with the rules defined +// in the proto definition for this message. If any rules are violated, an +// error is returned. +func (m *OrgIamPolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for OrgId + + // no validation rules for UserLoginMustBeDomain + + // no validation rules for Default + + // no validation rules for Sequence + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return OrgIamPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return OrgIamPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// OrgIamPolicyViewValidationError is the validation error returned by +// OrgIamPolicyView.Validate if the designated constraints aren't met. +type OrgIamPolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e OrgIamPolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e OrgIamPolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e OrgIamPolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e OrgIamPolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e OrgIamPolicyViewValidationError) ErrorName() string { return "OrgIamPolicyViewValidationError" } + +// Error satisfies the builtin error interface +func (e OrgIamPolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sOrgIamPolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = OrgIamPolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = OrgIamPolicyViewValidationError{} + // Validate checks the field values on OrgIamPolicyRequest with the rules // defined in the proto definition for this message. If any rules are // violated, an error is returned. @@ -3251,7 +3342,7 @@ func (m *Idp) Validate() error { // no validation rules for Name - // no validation rules for LogoSrc + // no validation rules for StylingType // no validation rules for Sequence @@ -3344,7 +3435,7 @@ func (m *IdpUpdate) Validate() error { // no validation rules for Name - // no validation rules for LogoSrc + // no validation rules for StylingType return nil } @@ -3489,7 +3580,7 @@ func (m *OidcIdpConfigCreate) Validate() error { } } - // no validation rules for LogoSrc + // no validation rules for StylingType if l := utf8.RuneCountInString(m.GetClientId()); l < 1 || l > 200 { return OidcIdpConfigCreateValidationError{ @@ -3802,7 +3893,7 @@ func (m *IdpView) Validate() error { // no validation rules for Name - // no validation rules for LogoSrc + // no validation rules for StylingType // no validation rules for Sequence @@ -4118,6 +4209,259 @@ var _IdpSearchQuery_Key_NotInLookup = map[IdpSearchKey]struct{}{ 0: {}, } +// Validate checks the field values on DefaultLabelPolicy with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultLabelPolicy) Validate() error { + if m == nil { + return nil + } + + // no validation rules for PrimaryColor + + // no validation rules for SecondaryColor + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLabelPolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLabelPolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultLabelPolicyValidationError is the validation error returned by +// DefaultLabelPolicy.Validate if the designated constraints aren't met. +type DefaultLabelPolicyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultLabelPolicyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultLabelPolicyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultLabelPolicyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultLabelPolicyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultLabelPolicyValidationError) ErrorName() string { + return "DefaultLabelPolicyValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultLabelPolicyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultLabelPolicy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultLabelPolicyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultLabelPolicyValidationError{} + +// Validate checks the field values on DefaultLabelPolicyUpdate with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultLabelPolicyUpdate) Validate() error { + if m == nil { + return nil + } + + // no validation rules for PrimaryColor + + // no validation rules for SecondaryColor + + return nil +} + +// DefaultLabelPolicyUpdateValidationError is the validation error returned by +// DefaultLabelPolicyUpdate.Validate if the designated constraints aren't met. +type DefaultLabelPolicyUpdateValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultLabelPolicyUpdateValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultLabelPolicyUpdateValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultLabelPolicyUpdateValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultLabelPolicyUpdateValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultLabelPolicyUpdateValidationError) ErrorName() string { + return "DefaultLabelPolicyUpdateValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultLabelPolicyUpdateValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultLabelPolicyUpdate.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultLabelPolicyUpdateValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultLabelPolicyUpdateValidationError{} + +// Validate checks the field values on DefaultLabelPolicyView with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultLabelPolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for PrimaryColor + + // no validation rules for SecondaryColor + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLabelPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLabelPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultLabelPolicyViewValidationError is the validation error returned by +// DefaultLabelPolicyView.Validate if the designated constraints aren't met. +type DefaultLabelPolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultLabelPolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultLabelPolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultLabelPolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultLabelPolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultLabelPolicyViewValidationError) ErrorName() string { + return "DefaultLabelPolicyViewValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultLabelPolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultLabelPolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultLabelPolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultLabelPolicyViewValidationError{} + // Validate checks the field values on DefaultLoginPolicy with the rules // defined in the proto definition for this message. If any rules are // violated, an error is returned. @@ -4132,6 +4476,26 @@ func (m *DefaultLoginPolicy) Validate() error { // no validation rules for AllowExternalIdp + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLoginPolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLoginPolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + return nil } @@ -4191,6 +4555,79 @@ var _ interface { ErrorName() string } = DefaultLoginPolicyValidationError{} +// Validate checks the field values on DefaultLoginPolicyRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultLoginPolicyRequest) Validate() error { + if m == nil { + return nil + } + + // no validation rules for AllowUsernamePassword + + // no validation rules for AllowRegister + + // no validation rules for AllowExternalIdp + + return nil +} + +// DefaultLoginPolicyRequestValidationError is the validation error returned by +// DefaultLoginPolicyRequest.Validate if the designated constraints aren't met. +type DefaultLoginPolicyRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultLoginPolicyRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultLoginPolicyRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultLoginPolicyRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultLoginPolicyRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultLoginPolicyRequestValidationError) ErrorName() string { + return "DefaultLoginPolicyRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultLoginPolicyRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultLoginPolicyRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultLoginPolicyRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultLoginPolicyRequestValidationError{} + // Validate checks the field values on IdpProviderID with the rules defined in // the proto definition for this message. If any rules are violated, an error // is returned. @@ -4277,6 +4714,26 @@ func (m *DefaultLoginPolicyView) Validate() error { // no validation rules for AllowExternalIdp + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLoginPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultLoginPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + return nil } @@ -4577,3 +5034,788 @@ var _ interface { Cause() error ErrorName() string } = IdpProviderSearchRequestValidationError{} + +// Validate checks the field values on DefaultPasswordComplexityPolicy with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultPasswordComplexityPolicy) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MinLength + + // no validation rules for HasUppercase + + // no validation rules for HasLowercase + + // no validation rules for HasNumber + + // no validation rules for HasSymbol + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordComplexityPolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordComplexityPolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultPasswordComplexityPolicyValidationError is the validation error +// returned by DefaultPasswordComplexityPolicy.Validate if the designated +// constraints aren't met. +type DefaultPasswordComplexityPolicyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordComplexityPolicyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordComplexityPolicyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordComplexityPolicyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordComplexityPolicyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordComplexityPolicyValidationError) ErrorName() string { + return "DefaultPasswordComplexityPolicyValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordComplexityPolicyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordComplexityPolicy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordComplexityPolicyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordComplexityPolicyValidationError{} + +// Validate checks the field values on DefaultPasswordComplexityPolicyRequest +// with the rules defined in the proto definition for this message. If any +// rules are violated, an error is returned. +func (m *DefaultPasswordComplexityPolicyRequest) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MinLength + + // no validation rules for HasUppercase + + // no validation rules for HasLowercase + + // no validation rules for HasNumber + + // no validation rules for HasSymbol + + return nil +} + +// DefaultPasswordComplexityPolicyRequestValidationError is the validation +// error returned by DefaultPasswordComplexityPolicyRequest.Validate if the +// designated constraints aren't met. +type DefaultPasswordComplexityPolicyRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordComplexityPolicyRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordComplexityPolicyRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordComplexityPolicyRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordComplexityPolicyRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordComplexityPolicyRequestValidationError) ErrorName() string { + return "DefaultPasswordComplexityPolicyRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordComplexityPolicyRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordComplexityPolicyRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordComplexityPolicyRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordComplexityPolicyRequestValidationError{} + +// Validate checks the field values on DefaultPasswordComplexityPolicyView with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *DefaultPasswordComplexityPolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MinLength + + // no validation rules for HasUppercase + + // no validation rules for HasLowercase + + // no validation rules for HasNumber + + // no validation rules for HasSymbol + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordComplexityPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordComplexityPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultPasswordComplexityPolicyViewValidationError is the validation error +// returned by DefaultPasswordComplexityPolicyView.Validate if the designated +// constraints aren't met. +type DefaultPasswordComplexityPolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordComplexityPolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordComplexityPolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordComplexityPolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordComplexityPolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordComplexityPolicyViewValidationError) ErrorName() string { + return "DefaultPasswordComplexityPolicyViewValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordComplexityPolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordComplexityPolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordComplexityPolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordComplexityPolicyViewValidationError{} + +// Validate checks the field values on DefaultPasswordAgePolicy with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultPasswordAgePolicy) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAgeDays + + // no validation rules for ExpireWarnDays + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordAgePolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordAgePolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultPasswordAgePolicyValidationError is the validation error returned by +// DefaultPasswordAgePolicy.Validate if the designated constraints aren't met. +type DefaultPasswordAgePolicyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordAgePolicyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordAgePolicyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordAgePolicyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordAgePolicyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordAgePolicyValidationError) ErrorName() string { + return "DefaultPasswordAgePolicyValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordAgePolicyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordAgePolicy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordAgePolicyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordAgePolicyValidationError{} + +// Validate checks the field values on DefaultPasswordAgePolicyRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultPasswordAgePolicyRequest) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAgeDays + + // no validation rules for ExpireWarnDays + + return nil +} + +// DefaultPasswordAgePolicyRequestValidationError is the validation error +// returned by DefaultPasswordAgePolicyRequest.Validate if the designated +// constraints aren't met. +type DefaultPasswordAgePolicyRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordAgePolicyRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordAgePolicyRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordAgePolicyRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordAgePolicyRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordAgePolicyRequestValidationError) ErrorName() string { + return "DefaultPasswordAgePolicyRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordAgePolicyRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordAgePolicyRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordAgePolicyRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordAgePolicyRequestValidationError{} + +// Validate checks the field values on DefaultPasswordAgePolicyView with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultPasswordAgePolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAgeDays + + // no validation rules for ExpireWarnDays + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordAgePolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordAgePolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultPasswordAgePolicyViewValidationError is the validation error returned +// by DefaultPasswordAgePolicyView.Validate if the designated constraints +// aren't met. +type DefaultPasswordAgePolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordAgePolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordAgePolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordAgePolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordAgePolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordAgePolicyViewValidationError) ErrorName() string { + return "DefaultPasswordAgePolicyViewValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordAgePolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordAgePolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordAgePolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordAgePolicyViewValidationError{} + +// Validate checks the field values on DefaultPasswordLockoutPolicy with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *DefaultPasswordLockoutPolicy) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAttempts + + // no validation rules for ShowLockoutFailure + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordLockoutPolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordLockoutPolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultPasswordLockoutPolicyValidationError is the validation error returned +// by DefaultPasswordLockoutPolicy.Validate if the designated constraints +// aren't met. +type DefaultPasswordLockoutPolicyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordLockoutPolicyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordLockoutPolicyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordLockoutPolicyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordLockoutPolicyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordLockoutPolicyValidationError) ErrorName() string { + return "DefaultPasswordLockoutPolicyValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordLockoutPolicyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordLockoutPolicy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordLockoutPolicyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordLockoutPolicyValidationError{} + +// Validate checks the field values on DefaultPasswordLockoutPolicyRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *DefaultPasswordLockoutPolicyRequest) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAttempts + + // no validation rules for ShowLockoutFailure + + return nil +} + +// DefaultPasswordLockoutPolicyRequestValidationError is the validation error +// returned by DefaultPasswordLockoutPolicyRequest.Validate if the designated +// constraints aren't met. +type DefaultPasswordLockoutPolicyRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordLockoutPolicyRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordLockoutPolicyRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordLockoutPolicyRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordLockoutPolicyRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordLockoutPolicyRequestValidationError) ErrorName() string { + return "DefaultPasswordLockoutPolicyRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordLockoutPolicyRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordLockoutPolicyRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordLockoutPolicyRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordLockoutPolicyRequestValidationError{} + +// Validate checks the field values on DefaultPasswordLockoutPolicyView with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *DefaultPasswordLockoutPolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAttempts + + // no validation rules for ShowLockoutFailure + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordLockoutPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DefaultPasswordLockoutPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// DefaultPasswordLockoutPolicyViewValidationError is the validation error +// returned by DefaultPasswordLockoutPolicyView.Validate if the designated +// constraints aren't met. +type DefaultPasswordLockoutPolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DefaultPasswordLockoutPolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DefaultPasswordLockoutPolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DefaultPasswordLockoutPolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DefaultPasswordLockoutPolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DefaultPasswordLockoutPolicyViewValidationError) ErrorName() string { + return "DefaultPasswordLockoutPolicyViewValidationError" +} + +// Error satisfies the builtin error interface +func (e DefaultPasswordLockoutPolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDefaultPasswordLockoutPolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DefaultPasswordLockoutPolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DefaultPasswordLockoutPolicyViewValidationError{} diff --git a/pkg/grpc/admin/admin.swagger.json b/pkg/grpc/admin/admin.swagger.json index 0ef879600a..2668968a54 100644 --- a/pkg/grpc/admin/admin.swagger.json +++ b/pkg/grpc/admin/admin.swagger.json @@ -21,13 +21,19 @@ "paths": { "/failedevents": { "get": { - "operationId": "GetFailedEvents", + "operationId": "AdminService_GetFailedEvents", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1FailedEvents" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -37,13 +43,19 @@ }, "/failedevents/{database}/{view_name}/{failed_sequence}": { "delete": { - "operationId": "RemoveFailedEvent", + "operationId": "AdminService_RemoveFailedEvent", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -75,13 +87,19 @@ "/healthz": { "get": { "summary": "Healthz returns status OK as soon as the service started", - "operationId": "Healthz", + "operationId": "AdminService_Healthz", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -91,13 +109,19 @@ }, "/idps/_search": { "post": { - "operationId": "SearchIdps", + "operationId": "AdminService_SearchIdps", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IdpSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -117,13 +141,19 @@ }, "/idps/oidc": { "post": { - "operationId": "CreateOidcIdp", + "operationId": "AdminService_CreateOidcIdp", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Idp" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -143,13 +173,19 @@ }, "/idps/{idp_id}/oidcconfig": { "put": { - "operationId": "UpdateOidcIdpConfig", + "operationId": "AdminService_UpdateOidcIdpConfig", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OidcIdpConfig" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -175,13 +211,19 @@ }, "/idps/{id}": { "get": { - "operationId": "IdpByID", + "operationId": "AdminService_IdpByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IdpView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -197,13 +239,19 @@ ] }, "delete": { - "operationId": "RemoveIdpConfig", + "operationId": "AdminService_RemoveIdpConfig", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -219,13 +267,19 @@ ] }, "put": { - "operationId": "UpdateIdpConfig", + "operationId": "AdminService_UpdateIdpConfig", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Idp" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -251,13 +305,19 @@ }, "/idps/{id}/_deactivate": { "put": { - "operationId": "DeactivateIdpConfig", + "operationId": "AdminService_DeactivateIdpConfig", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Idp" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -283,13 +343,19 @@ }, "/idps/{id}/_reactivate": { "put": { - "operationId": "ReactivateIdpConfig", + "operationId": "AdminService_ReactivateIdpConfig", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Idp" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -315,13 +381,19 @@ }, "/members": { "post": { - "operationId": "AddIamMember", + "operationId": "AdminService_AddIamMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IamMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -341,13 +413,19 @@ }, "/members/_search": { "post": { - "operationId": "SearchIamMembers", + "operationId": "AdminService_SearchIamMembers", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IamMemberSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -367,13 +445,19 @@ }, "/members/roles": { "get": { - "operationId": "GetIamMemberRoles", + "operationId": "AdminService_GetIamMemberRoles", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IamMemberRoles" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -383,13 +467,19 @@ }, "/members/{user_id}": { "delete": { - "operationId": "RemoveIamMember", + "operationId": "AdminService_RemoveIamMember", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -405,13 +495,19 @@ ] }, "put": { - "operationId": "ChangeIamMember", + "operationId": "AdminService_ChangeIamMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IamMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -438,13 +534,19 @@ "/orgs/_isunique": { "get": { "summary": "ORG", - "operationId": "IsOrgUnique", + "operationId": "AdminService_IsOrgUnique", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UniqueOrgResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -468,13 +570,19 @@ }, "/orgs/_search": { "post": { - "operationId": "SearchOrgs", + "operationId": "AdminService_SearchOrgs", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -494,13 +602,19 @@ }, "/orgs/_setup": { "post": { - "operationId": "SetUpOrg", + "operationId": "AdminService_SetUpOrg", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgSetUpResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -518,15 +632,74 @@ ] } }, + "/orgs/default/policies/orgiam": { + "get": { + "summary": "ORG_IAM_POLICY", + "operationId": "AdminService_GetDefaultOrgIamPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1OrgIamPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "AdminService" + ] + }, + "put": { + "operationId": "AdminService_UpdateDefaultOrgIamPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1OrgIamPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OrgIamPolicyRequest" + } + } + ], + "tags": [ + "AdminService" + ] + } + }, "/orgs/{id}": { "get": { - "operationId": "GetOrgByID", + "operationId": "AdminService_GetOrgByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Org" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -542,15 +715,20 @@ ] } }, - "/orgs/{org_id}/iampolicy": { + "/orgs/{org_id}/policies/orgiam": { "get": { - "summary": "ORG_IAM_POLICY", - "operationId": "GetOrgIamPolicy", + "operationId": "AdminService_GetOrgIamPolicy", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1OrgIamPolicy" + "$ref": "#/definitions/v1OrgIamPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -567,13 +745,19 @@ ] }, "delete": { - "operationId": "DeleteOrgIamPolicy", + "operationId": "AdminService_RemoveOrgIamPolicy", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -589,13 +773,19 @@ ] }, "post": { - "operationId": "CreateOrgIamPolicy", + "operationId": "AdminService_CreateOrgIamPolicy", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgIamPolicy" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -619,13 +809,19 @@ ] }, "put": { - "operationId": "UpdateOrgIamPolicy", + "operationId": "AdminService_UpdateOrgIamPolicy", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgIamPolicy" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -649,15 +845,73 @@ ] } }, + "/policies/label": { + "get": { + "operationId": "AdminService_GetDefaultLabelPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultLabelPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "AdminService" + ] + }, + "put": { + "operationId": "AdminService_UpdateDefaultLabelPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultLabelPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DefaultLabelPolicyUpdate" + } + } + ], + "tags": [ + "AdminService" + ] + } + }, "/policies/login": { "get": { - "operationId": "GetDefaultLoginPolicy", + "operationId": "AdminService_GetDefaultLoginPolicy", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1DefaultLoginPolicyView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -665,13 +919,19 @@ ] }, "put": { - "operationId": "UpdateDefaultLoginPolicy", + "operationId": "AdminService_UpdateDefaultLoginPolicy", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1DefaultLoginPolicy" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -680,7 +940,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1DefaultLoginPolicy" + "$ref": "#/definitions/v1DefaultLoginPolicyRequest" } } ], @@ -691,13 +951,19 @@ }, "/policies/login/idpproviders": { "post": { - "operationId": "AddIdpProviderToDefaultLoginPolicy", + "operationId": "AdminService_AddIdpProviderToDefaultLoginPolicy", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IdpProviderID" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -717,13 +983,19 @@ }, "/policies/login/idpproviders/_search": { "post": { - "operationId": "GetDefaultLoginPolicyIdpProviders", + "operationId": "AdminService_GetDefaultLoginPolicyIdpProviders", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1IdpProviderSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -742,14 +1014,20 @@ } }, "/policies/login/idpproviders/{idp_config_id}": { - "post": { - "operationId": "RemoveIdpProviderFromDefaultLoginPolicy", + "delete": { + "operationId": "AdminService_RemoveIdpProviderFromDefaultLoginPolicy", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -758,13 +1036,161 @@ "in": "path", "required": true, "type": "string" + } + ], + "tags": [ + "AdminService" + ] + } + }, + "/policies/password/age": { + "get": { + "operationId": "AdminService_GetDefaultPasswordAgePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultPasswordAgePolicyView" + } }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "AdminService" + ] + }, + "put": { + "operationId": "AdminService_UpdateDefaultPasswordAgePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultPasswordAgePolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ { "name": "body", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v1IdpProviderID" + "$ref": "#/definitions/v1DefaultPasswordAgePolicyRequest" + } + } + ], + "tags": [ + "AdminService" + ] + } + }, + "/policies/password/complexity": { + "get": { + "operationId": "AdminService_GetDefaultPasswordComplexityPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultPasswordComplexityPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "AdminService" + ] + }, + "put": { + "operationId": "AdminService_UpdateDefaultPasswordComplexityPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultPasswordComplexityPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DefaultPasswordComplexityPolicyRequest" + } + } + ], + "tags": [ + "AdminService" + ] + } + }, + "/policies/password/lockout": { + "get": { + "operationId": "AdminService_GetDefaultPasswordLockoutPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultPasswordLockoutPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "AdminService" + ] + }, + "put": { + "operationId": "AdminService_UpdateDefaultPasswordLockoutPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1DefaultPasswordLockoutPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1DefaultPasswordLockoutPolicyRequest" } } ], @@ -776,13 +1202,19 @@ "/ready": { "get": { "summary": "Ready returns status OK as soon as all dependent services are available", - "operationId": "Ready", + "operationId": "AdminService_Ready", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -792,12 +1224,18 @@ }, "/validate": { "get": { - "operationId": "Validate", + "operationId": "AdminService_Validate", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/protobufStruct" + "type": "object" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -808,13 +1246,19 @@ }, "/views": { "get": { - "operationId": "GetViews", + "operationId": "AdminService_GetViews", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Views" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -824,13 +1268,19 @@ }, "/views/{database}/{view_name}": { "post": { - "operationId": "ClearView", + "operationId": "AdminService_ClearView", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -854,18 +1304,20 @@ } }, "definitions": { - "protobufListValue": { + "protobufAny": { "type": "object", "properties": { - "values": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufValue" - }, - "description": "Repeated field of dynamically typed values." + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`ListValue` is a wrapper around a repeated field of values.\n\nThe JSON representation for `ListValue` is JSON array." + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", @@ -875,50 +1327,26 @@ "default": "NULL_VALUE", "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." }, - "protobufStruct": { + "runtimeError": { "type": "object", "properties": { - "fields": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/protobufValue" - }, - "description": "Unordered map of dynamically typed values." + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } } - }, - "description": "`Struct` represents a structured data value, consisting of fields\nwhich map to dynamically typed values. In some languages, `Struct`\nmight be supported by a native representation. For example, in\nscripting languages like JS a struct is represented as an\nobject. The details of that representation are described together\nwith the proto support for the language.\n\nThe JSON representation for `Struct` is JSON object." - }, - "protobufValue": { - "type": "object", - "properties": { - "null_value": { - "$ref": "#/definitions/protobufNullValue", - "description": "Represents a null value." - }, - "number_value": { - "type": "number", - "format": "double", - "description": "Represents a double value." - }, - "string_value": { - "type": "string", - "description": "Represents a string value." - }, - "bool_value": { - "type": "boolean", - "format": "boolean", - "description": "Represents a boolean value." - }, - "struct_value": { - "$ref": "#/definitions/protobufStruct", - "description": "Represents a structured value." - }, - "list_value": { - "$ref": "#/definitions/protobufListValue", - "description": "Represents a repeated `Value`." - } - }, - "description": "`Value` represents a dynamically typed value which can be either\nnull, a number, a string, a boolean, a recursive struct value, or a\nlist of values. A producer of value is expected to set one of that\nvariants, absence of any variant indicates an error.\n\nThe JSON representation for `Value` is JSON value." + } }, "v1AddIamMemberRequest": { "type": "object", @@ -970,15 +1398,13 @@ "type": "string" }, "is_email_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "phone": { "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "country": { "type": "string" @@ -1036,20 +1462,88 @@ } } }, + "v1DefaultLabelPolicy": { + "type": "object", + "properties": { + "primary_color": { + "type": "string" + }, + "secondary_color": { + "type": "string" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultLabelPolicyUpdate": { + "type": "object", + "properties": { + "primary_color": { + "type": "string" + }, + "secondary_color": { + "type": "string" + } + } + }, + "v1DefaultLabelPolicyView": { + "type": "object", + "properties": { + "primary_color": { + "type": "string" + }, + "secondary_color": { + "type": "string" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, "v1DefaultLoginPolicy": { "type": "object", "properties": { "allow_username_password": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "allow_register": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "allow_external_idp": { - "type": "boolean", - "format": "boolean" + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultLoginPolicyRequest": { + "type": "object", + "properties": { + "allow_username_password": { + "type": "boolean" + }, + "allow_register": { + "type": "boolean" + }, + "allow_external_idp": { + "type": "boolean" } } }, @@ -1057,16 +1551,207 @@ "type": "object", "properties": { "allow_username_password": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "allow_register": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "allow_external_idp": { - "type": "boolean", - "format": "boolean" + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultPasswordAgePolicy": { + "type": "object", + "properties": { + "max_age_days": { + "type": "string", + "format": "uint64" + }, + "expire_warn_days": { + "type": "string", + "format": "uint64" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultPasswordAgePolicyRequest": { + "type": "object", + "properties": { + "max_age_days": { + "type": "string", + "format": "uint64" + }, + "expire_warn_days": { + "type": "string", + "format": "uint64" + } + } + }, + "v1DefaultPasswordAgePolicyView": { + "type": "object", + "properties": { + "max_age_days": { + "type": "string", + "format": "uint64" + }, + "expire_warn_days": { + "type": "string", + "format": "uint64" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultPasswordComplexityPolicy": { + "type": "object", + "properties": { + "min_length": { + "type": "string", + "format": "uint64" + }, + "has_uppercase": { + "type": "boolean" + }, + "has_lowercase": { + "type": "boolean" + }, + "has_number": { + "type": "boolean" + }, + "has_symbol": { + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultPasswordComplexityPolicyRequest": { + "type": "object", + "properties": { + "min_length": { + "type": "string", + "format": "uint64" + }, + "has_uppercase": { + "type": "boolean" + }, + "has_lowercase": { + "type": "boolean" + }, + "has_number": { + "type": "boolean" + }, + "has_symbol": { + "type": "boolean" + } + } + }, + "v1DefaultPasswordComplexityPolicyView": { + "type": "object", + "properties": { + "min_length": { + "type": "string", + "format": "uint64" + }, + "has_uppercase": { + "type": "boolean" + }, + "has_lowercase": { + "type": "boolean" + }, + "has_number": { + "type": "boolean" + }, + "has_symbol": { + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultPasswordLockoutPolicy": { + "type": "object", + "properties": { + "max_attempts": { + "type": "string", + "format": "uint64" + }, + "show_lockout_failure": { + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1DefaultPasswordLockoutPolicyRequest": { + "type": "object", + "properties": { + "max_attempts": { + "type": "string", + "format": "uint64" + }, + "show_lockout_failure": { + "type": "boolean" + } + } + }, + "v1DefaultPasswordLockoutPolicyView": { + "type": "object", + "properties": { + "max_attempts": { + "type": "string", + "format": "uint64" + }, + "show_lockout_failure": { + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" } } }, @@ -1138,15 +1823,13 @@ "type": "string" }, "is_email_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "phone": { "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "country": { "type": "string" @@ -1338,9 +2021,8 @@ "name": { "type": "string" }, - "logo_src": { - "type": "string", - "format": "byte" + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" }, "oidc_config": { "$ref": "#/definitions/v1OidcIdpConfig" @@ -1507,6 +2189,14 @@ ], "default": "IDPCONFIGSTATE_UNSPECIFIED" }, + "v1IdpStylingType": { + "type": "string", + "enum": [ + "IDPSTYLINGTYPE_UNSPECIFIED", + "IDPSTYLINGTYPE_GOOGLE" + ], + "default": "IDPSTYLINGTYPE_UNSPECIFIED" + }, "v1IdpType": { "type": "string", "enum": [ @@ -1525,9 +2215,8 @@ "name": { "type": "string" }, - "logo_src": { - "type": "string", - "format": "byte" + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" } } }, @@ -1551,9 +2240,8 @@ "name": { "type": "string" }, - "logo_src": { - "type": "string", - "format": "byte" + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" }, "oidc_config": { "$ref": "#/definitions/v1OidcIdpConfigView" @@ -1647,9 +2335,8 @@ "name": { "type": "string" }, - "logo_src": { - "type": "string", - "format": "byte" + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" }, "client_id": { "type": "string" @@ -1757,16 +2444,11 @@ "org_id": { "type": "string" }, - "description": { - "type": "string" - }, "user_login_must_be_domain": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "default": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -1792,8 +2474,33 @@ "type": "string" }, "user_login_must_be_domain": { - "type": "boolean", - "format": "boolean" + "type": "boolean" + } + } + }, + "v1OrgIamPolicyView": { + "type": "object", + "properties": { + "org_id": { + "type": "string" + }, + "user_login_must_be_domain": { + "type": "boolean" + }, + "default": { + "type": "boolean" + }, + "sequence": { + "type": "string", + "format": "uint64" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" } } }, @@ -1845,8 +2552,7 @@ "$ref": "#/definitions/v1OrgSearchKey" }, "asc": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "queries": { "type": "array", @@ -1939,8 +2645,7 @@ "type": "object", "properties": { "is_unique": { - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, diff --git a/pkg/grpc/admin/mock/admin.proto.mock.go b/pkg/grpc/admin/mock/admin.proto.mock.go index b4c8a030ee..3b9cc99dd2 100644 --- a/pkg/grpc/admin/mock/admin.proto.mock.go +++ b/pkg/grpc/admin/mock/admin.proto.mock.go @@ -177,24 +177,24 @@ func (mr *MockAdminServiceClientMockRecorder) DeactivateIdpConfig(arg0, arg1 int return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeactivateIdpConfig", reflect.TypeOf((*MockAdminServiceClient)(nil).DeactivateIdpConfig), varargs...) } -// DeleteOrgIamPolicy mocks base method -func (m *MockAdminServiceClient) DeleteOrgIamPolicy(arg0 context.Context, arg1 *admin.OrgIamPolicyID, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { +// GetDefaultLabelPolicy mocks base method +func (m *MockAdminServiceClient) GetDefaultLabelPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*admin.DefaultLabelPolicyView, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } - ret := m.ctrl.Call(m, "DeleteOrgIamPolicy", varargs...) - ret0, _ := ret[0].(*emptypb.Empty) + ret := m.ctrl.Call(m, "GetDefaultLabelPolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultLabelPolicyView) ret1, _ := ret[1].(error) return ret0, ret1 } -// DeleteOrgIamPolicy indicates an expected call of DeleteOrgIamPolicy -func (mr *MockAdminServiceClientMockRecorder) DeleteOrgIamPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { +// GetDefaultLabelPolicy indicates an expected call of GetDefaultLabelPolicy +func (mr *MockAdminServiceClientMockRecorder) GetDefaultLabelPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteOrgIamPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).DeleteOrgIamPolicy), varargs...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultLabelPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).GetDefaultLabelPolicy), varargs...) } // GetDefaultLoginPolicy mocks base method @@ -237,6 +237,86 @@ func (mr *MockAdminServiceClientMockRecorder) GetDefaultLoginPolicyIdpProviders( return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultLoginPolicyIdpProviders", reflect.TypeOf((*MockAdminServiceClient)(nil).GetDefaultLoginPolicyIdpProviders), varargs...) } +// GetDefaultOrgIamPolicy mocks base method +func (m *MockAdminServiceClient) GetDefaultOrgIamPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*admin.OrgIamPolicyView, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDefaultOrgIamPolicy", varargs...) + ret0, _ := ret[0].(*admin.OrgIamPolicyView) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDefaultOrgIamPolicy indicates an expected call of GetDefaultOrgIamPolicy +func (mr *MockAdminServiceClientMockRecorder) GetDefaultOrgIamPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultOrgIamPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).GetDefaultOrgIamPolicy), varargs...) +} + +// GetDefaultPasswordAgePolicy mocks base method +func (m *MockAdminServiceClient) GetDefaultPasswordAgePolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*admin.DefaultPasswordAgePolicyView, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDefaultPasswordAgePolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultPasswordAgePolicyView) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDefaultPasswordAgePolicy indicates an expected call of GetDefaultPasswordAgePolicy +func (mr *MockAdminServiceClientMockRecorder) GetDefaultPasswordAgePolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultPasswordAgePolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).GetDefaultPasswordAgePolicy), varargs...) +} + +// GetDefaultPasswordComplexityPolicy mocks base method +func (m *MockAdminServiceClient) GetDefaultPasswordComplexityPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*admin.DefaultPasswordComplexityPolicyView, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDefaultPasswordComplexityPolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultPasswordComplexityPolicyView) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDefaultPasswordComplexityPolicy indicates an expected call of GetDefaultPasswordComplexityPolicy +func (mr *MockAdminServiceClientMockRecorder) GetDefaultPasswordComplexityPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultPasswordComplexityPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).GetDefaultPasswordComplexityPolicy), varargs...) +} + +// GetDefaultPasswordLockoutPolicy mocks base method +func (m *MockAdminServiceClient) GetDefaultPasswordLockoutPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*admin.DefaultPasswordLockoutPolicyView, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDefaultPasswordLockoutPolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultPasswordLockoutPolicyView) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDefaultPasswordLockoutPolicy indicates an expected call of GetDefaultPasswordLockoutPolicy +func (mr *MockAdminServiceClientMockRecorder) GetDefaultPasswordLockoutPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultPasswordLockoutPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).GetDefaultPasswordLockoutPolicy), varargs...) +} + // GetFailedEvents mocks base method func (m *MockAdminServiceClient) GetFailedEvents(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*admin.FailedEvents, error) { m.ctrl.T.Helper() @@ -298,14 +378,14 @@ func (mr *MockAdminServiceClientMockRecorder) GetOrgByID(arg0, arg1 interface{}, } // GetOrgIamPolicy mocks base method -func (m *MockAdminServiceClient) GetOrgIamPolicy(arg0 context.Context, arg1 *admin.OrgIamPolicyID, arg2 ...grpc.CallOption) (*admin.OrgIamPolicy, error) { +func (m *MockAdminServiceClient) GetOrgIamPolicy(arg0 context.Context, arg1 *admin.OrgIamPolicyID, arg2 ...grpc.CallOption) (*admin.OrgIamPolicyView, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetOrgIamPolicy", varargs...) - ret0, _ := ret[0].(*admin.OrgIamPolicy) + ret0, _ := ret[0].(*admin.OrgIamPolicyView) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -517,6 +597,26 @@ func (mr *MockAdminServiceClientMockRecorder) RemoveIdpProviderFromDefaultLoginP return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveIdpProviderFromDefaultLoginPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).RemoveIdpProviderFromDefaultLoginPolicy), varargs...) } +// RemoveOrgIamPolicy mocks base method +func (m *MockAdminServiceClient) RemoveOrgIamPolicy(arg0 context.Context, arg1 *admin.OrgIamPolicyID, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "RemoveOrgIamPolicy", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemoveOrgIamPolicy indicates an expected call of RemoveOrgIamPolicy +func (mr *MockAdminServiceClientMockRecorder) RemoveOrgIamPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveOrgIamPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).RemoveOrgIamPolicy), varargs...) +} + // SearchIamMembers mocks base method func (m *MockAdminServiceClient) SearchIamMembers(arg0 context.Context, arg1 *admin.IamMemberSearchRequest, arg2 ...grpc.CallOption) (*admin.IamMemberSearchResponse, error) { m.ctrl.T.Helper() @@ -597,8 +697,28 @@ func (mr *MockAdminServiceClientMockRecorder) SetUpOrg(arg0, arg1 interface{}, a return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetUpOrg", reflect.TypeOf((*MockAdminServiceClient)(nil).SetUpOrg), varargs...) } +// UpdateDefaultLabelPolicy mocks base method +func (m *MockAdminServiceClient) UpdateDefaultLabelPolicy(arg0 context.Context, arg1 *admin.DefaultLabelPolicyUpdate, arg2 ...grpc.CallOption) (*admin.DefaultLabelPolicy, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateDefaultLabelPolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultLabelPolicy) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDefaultLabelPolicy indicates an expected call of UpdateDefaultLabelPolicy +func (mr *MockAdminServiceClientMockRecorder) UpdateDefaultLabelPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDefaultLabelPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).UpdateDefaultLabelPolicy), varargs...) +} + // UpdateDefaultLoginPolicy mocks base method -func (m *MockAdminServiceClient) UpdateDefaultLoginPolicy(arg0 context.Context, arg1 *admin.DefaultLoginPolicy, arg2 ...grpc.CallOption) (*admin.DefaultLoginPolicy, error) { +func (m *MockAdminServiceClient) UpdateDefaultLoginPolicy(arg0 context.Context, arg1 *admin.DefaultLoginPolicyRequest, arg2 ...grpc.CallOption) (*admin.DefaultLoginPolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -617,6 +737,86 @@ func (mr *MockAdminServiceClientMockRecorder) UpdateDefaultLoginPolicy(arg0, arg return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDefaultLoginPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).UpdateDefaultLoginPolicy), varargs...) } +// UpdateDefaultOrgIamPolicy mocks base method +func (m *MockAdminServiceClient) UpdateDefaultOrgIamPolicy(arg0 context.Context, arg1 *admin.OrgIamPolicyRequest, arg2 ...grpc.CallOption) (*admin.OrgIamPolicy, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateDefaultOrgIamPolicy", varargs...) + ret0, _ := ret[0].(*admin.OrgIamPolicy) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDefaultOrgIamPolicy indicates an expected call of UpdateDefaultOrgIamPolicy +func (mr *MockAdminServiceClientMockRecorder) UpdateDefaultOrgIamPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDefaultOrgIamPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).UpdateDefaultOrgIamPolicy), varargs...) +} + +// UpdateDefaultPasswordAgePolicy mocks base method +func (m *MockAdminServiceClient) UpdateDefaultPasswordAgePolicy(arg0 context.Context, arg1 *admin.DefaultPasswordAgePolicyRequest, arg2 ...grpc.CallOption) (*admin.DefaultPasswordAgePolicy, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateDefaultPasswordAgePolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultPasswordAgePolicy) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDefaultPasswordAgePolicy indicates an expected call of UpdateDefaultPasswordAgePolicy +func (mr *MockAdminServiceClientMockRecorder) UpdateDefaultPasswordAgePolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDefaultPasswordAgePolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).UpdateDefaultPasswordAgePolicy), varargs...) +} + +// UpdateDefaultPasswordComplexityPolicy mocks base method +func (m *MockAdminServiceClient) UpdateDefaultPasswordComplexityPolicy(arg0 context.Context, arg1 *admin.DefaultPasswordComplexityPolicyRequest, arg2 ...grpc.CallOption) (*admin.DefaultPasswordComplexityPolicy, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateDefaultPasswordComplexityPolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultPasswordComplexityPolicy) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDefaultPasswordComplexityPolicy indicates an expected call of UpdateDefaultPasswordComplexityPolicy +func (mr *MockAdminServiceClientMockRecorder) UpdateDefaultPasswordComplexityPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDefaultPasswordComplexityPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).UpdateDefaultPasswordComplexityPolicy), varargs...) +} + +// UpdateDefaultPasswordLockoutPolicy mocks base method +func (m *MockAdminServiceClient) UpdateDefaultPasswordLockoutPolicy(arg0 context.Context, arg1 *admin.DefaultPasswordLockoutPolicyRequest, arg2 ...grpc.CallOption) (*admin.DefaultPasswordLockoutPolicy, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "UpdateDefaultPasswordLockoutPolicy", varargs...) + ret0, _ := ret[0].(*admin.DefaultPasswordLockoutPolicy) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateDefaultPasswordLockoutPolicy indicates an expected call of UpdateDefaultPasswordLockoutPolicy +func (mr *MockAdminServiceClientMockRecorder) UpdateDefaultPasswordLockoutPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDefaultPasswordLockoutPolicy", reflect.TypeOf((*MockAdminServiceClient)(nil).UpdateDefaultPasswordLockoutPolicy), varargs...) +} + // UpdateIdpConfig mocks base method func (m *MockAdminServiceClient) UpdateIdpConfig(arg0 context.Context, arg1 *admin.IdpUpdate, arg2 ...grpc.CallOption) (*admin.Idp, error) { m.ctrl.T.Helper() diff --git a/pkg/grpc/admin/proto/admin.proto b/pkg/grpc/admin/proto/admin.proto index e4a75ffa71..8dc4514ec5 100644 --- a/pkg/grpc/admin/proto/admin.proto +++ b/pkg/grpc/admin/proto/admin.proto @@ -100,9 +100,30 @@ service AdminService { } //ORG_IAM_POLICY - rpc GetOrgIamPolicy(OrgIamPolicyID) returns (OrgIamPolicy) { + rpc GetDefaultOrgIamPolicy(google.protobuf.Empty) returns (OrgIamPolicyView) { option (google.api.http) = { - get: "/orgs/{org_id}/iampolicy" + get: "/orgs/default/policies/orgiam" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.read" + }; + } + + rpc UpdateDefaultOrgIamPolicy(OrgIamPolicyRequest) returns (OrgIamPolicy) { + option (google.api.http) = { + put: "/orgs/default/policies/orgiam" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.write" + }; + } + + rpc GetOrgIamPolicy(OrgIamPolicyID) returns (OrgIamPolicyView) { + option (google.api.http) = { + get: "/orgs/{org_id}/policies/orgiam" }; option (caos.zitadel.utils.v1.auth_option) = { @@ -112,7 +133,7 @@ service AdminService { rpc CreateOrgIamPolicy(OrgIamPolicyRequest) returns (OrgIamPolicy) { option (google.api.http) = { - post: "/orgs/{org_id}/iampolicy" + post: "/orgs/{org_id}/policies/orgiam" body: "*" }; @@ -123,7 +144,7 @@ service AdminService { rpc UpdateOrgIamPolicy(OrgIamPolicyRequest) returns (OrgIamPolicy) { option (google.api.http) = { - put: "/orgs/{org_id}/iampolicy" + put: "/orgs/{org_id}/policies/orgiam" body: "*" }; @@ -132,9 +153,9 @@ service AdminService { }; } - rpc DeleteOrgIamPolicy(OrgIamPolicyID) returns (google.protobuf.Empty) { + rpc RemoveOrgIamPolicy(OrgIamPolicyID) returns (google.protobuf.Empty) { option (google.api.http) = { - delete: "/orgs/{org_id}/iampolicy" + delete: "/orgs/{org_id}/policies/orgiam" }; option (caos.zitadel.utils.v1.auth_option) = { @@ -321,6 +342,27 @@ service AdminService { }; } + rpc GetDefaultLabelPolicy(google.protobuf.Empty) returns (DefaultLabelPolicyView) { + option (google.api.http) = { + get: "/policies/label" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.read" + }; + } + + rpc UpdateDefaultLabelPolicy(DefaultLabelPolicyUpdate) returns (DefaultLabelPolicy) { + option (google.api.http) = { + put: "/policies/label" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.write" + }; + } + rpc GetDefaultLoginPolicy(google.protobuf.Empty) returns (DefaultLoginPolicyView) { option (google.api.http) = { get: "/policies/login" @@ -331,7 +373,7 @@ service AdminService { }; } - rpc UpdateDefaultLoginPolicy(DefaultLoginPolicy) returns (DefaultLoginPolicy) { + rpc UpdateDefaultLoginPolicy(DefaultLoginPolicyRequest) returns (DefaultLoginPolicy) { option (google.api.http) = { put: "/policies/login" body: "*" @@ -366,7 +408,69 @@ service AdminService { rpc RemoveIdpProviderFromDefaultLoginPolicy(IdpProviderID) returns (google.protobuf.Empty) { option (google.api.http) = { - post: "/policies/login/idpproviders/{idp_config_id}" + delete: "/policies/login/idpproviders/{idp_config_id}" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.write" + }; + } + + rpc GetDefaultPasswordComplexityPolicy(google.protobuf.Empty) returns (DefaultPasswordComplexityPolicyView) { + option (google.api.http) = { + get: "/policies/password/complexity" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.read" + }; + } + + rpc UpdateDefaultPasswordComplexityPolicy(DefaultPasswordComplexityPolicyRequest) returns (DefaultPasswordComplexityPolicy) { + option (google.api.http) = { + put: "/policies/password/complexity" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.write" + }; + } + + rpc GetDefaultPasswordAgePolicy(google.protobuf.Empty) returns (DefaultPasswordAgePolicyView) { + option (google.api.http) = { + get: "/policies/password/age" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.read" + }; + } + + rpc UpdateDefaultPasswordAgePolicy(DefaultPasswordAgePolicyRequest) returns (DefaultPasswordAgePolicy) { + option (google.api.http) = { + put: "/policies/password/age" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.write" + }; + } + + rpc GetDefaultPasswordLockoutPolicy(google.protobuf.Empty) returns (DefaultPasswordLockoutPolicyView) { + option (google.api.http) = { + get: "/policies/password/lockout" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "iam.policy.read" + }; + } + + rpc UpdateDefaultPasswordLockoutPolicy(DefaultPasswordLockoutPolicyRequest) returns (DefaultPasswordLockoutPolicy) { + option (google.api.http) = { + put: "/policies/password/lockout" body: "*" }; @@ -562,12 +666,20 @@ message CreateOrgRequest { message OrgIamPolicy { string org_id = 1; - string description = 2; - bool user_login_must_be_domain = 3; - bool default = 4; - uint64 sequence = 5; - google.protobuf.Timestamp creation_date = 6; - google.protobuf.Timestamp change_date = 7; + bool user_login_must_be_domain = 2; + bool default = 3; + uint64 sequence = 4; + google.protobuf.Timestamp creation_date = 5; + google.protobuf.Timestamp change_date = 6; +} + +message OrgIamPolicyView { + string org_id = 1; + bool user_login_must_be_domain = 2; + bool default = 3; + uint64 sequence = 4; + google.protobuf.Timestamp creation_date = 5; + google.protobuf.Timestamp change_date = 6; } message OrgIamPolicyRequest { @@ -706,7 +818,7 @@ message Idp { google.protobuf.Timestamp creation_date = 3; google.protobuf.Timestamp change_date = 4; string name = 5; - bytes logo_src = 6; + IdpStylingType styling_type = 6; oneof idp_config { OidcIdpConfig oidc_config = 7; } @@ -716,7 +828,7 @@ message Idp { message IdpUpdate { string id = 1 [(validate.rules).string = {min_len: 1}]; string name = 2; - bytes logo_src = 3; + IdpStylingType styling_type = 3; } message OidcIdpConfig { @@ -726,6 +838,11 @@ message OidcIdpConfig { repeated string scopes = 4; } +enum IdpStylingType { + IDPSTYLINGTYPE_UNSPECIFIED = 0; + IDPSTYLINGTYPE_GOOGLE = 1; +} + enum IdpState { IDPCONFIGSTATE_UNSPECIFIED = 0; IDPCONFIGSTATE_ACTIVE = 1; @@ -740,7 +857,7 @@ enum OIDCMappingField { message OidcIdpConfigCreate { string name = 1 [(validate.rules).string = {min_len: 1, max_len: 200}]; - bytes logo_src = 2; + IdpStylingType styling_type = 2; string client_id = 3 [(validate.rules).string = {min_len: 1, max_len: 200}]; string client_secret = 4 [(validate.rules).string = {min_len: 1, max_len: 200}]; string issuer = 5 [(validate.rules).string = {min_len: 1, max_len: 200}]; @@ -774,7 +891,7 @@ message IdpView { google.protobuf.Timestamp creation_date = 3; google.protobuf.Timestamp change_date = 4; string name = 5; - bytes logo_src = 6; + IdpStylingType styling_type = 6; oneof idp_config_view { OidcIdpConfigView oidc_config = 7; } @@ -807,10 +924,37 @@ enum IdpSearchKey { IDPSEARCHKEY_NAME = 2; } +message DefaultLabelPolicy { + string primary_color = 1; + string secondary_color = 2; + google.protobuf.Timestamp creation_date = 3; + google.protobuf.Timestamp change_date = 4; +} + +message DefaultLabelPolicyUpdate { + string primary_color = 1; + string secondary_color = 2; +} + +message DefaultLabelPolicyView { + string primary_color = 1; + string secondary_color = 2; + google.protobuf.Timestamp creation_date = 3; + google.protobuf.Timestamp change_date = 4; +} + message DefaultLoginPolicy { bool allow_username_password = 1; bool allow_register = 2; bool allow_external_idp = 3; + google.protobuf.Timestamp creation_date = 4; + google.protobuf.Timestamp change_date = 5; +} + +message DefaultLoginPolicyRequest { + bool allow_username_password = 1; + bool allow_register = 2; + bool allow_external_idp = 3; } message IdpProviderID { @@ -821,6 +965,8 @@ message DefaultLoginPolicyView { bool allow_username_password = 1; bool allow_register = 2; bool allow_external_idp = 3; + google.protobuf.Timestamp creation_date = 4; + google.protobuf.Timestamp change_date = 5; } message IdpProviderView { @@ -848,3 +994,69 @@ message IdpProviderSearchRequest { uint64 offset = 1; uint64 limit = 2; } + +message DefaultPasswordComplexityPolicy { + uint64 min_length = 1; + bool has_uppercase = 2; + bool has_lowercase = 3; + bool has_number = 4; + bool has_symbol = 5; + google.protobuf.Timestamp creation_date = 6; + google.protobuf.Timestamp change_date = 7; +} + +message DefaultPasswordComplexityPolicyRequest { + uint64 min_length = 1; + bool has_uppercase = 2; + bool has_lowercase = 3; + bool has_number = 4; + bool has_symbol = 5; +} + +message DefaultPasswordComplexityPolicyView { + uint64 min_length = 1; + bool has_uppercase = 2; + bool has_lowercase = 3; + bool has_number = 4; + bool has_symbol = 5; + google.protobuf.Timestamp creation_date = 6; + google.protobuf.Timestamp change_date = 7; +} + +message DefaultPasswordAgePolicy { + uint64 max_age_days = 1; + uint64 expire_warn_days = 2; + google.protobuf.Timestamp creation_date = 3; + google.protobuf.Timestamp change_date = 4; +} + +message DefaultPasswordAgePolicyRequest { + uint64 max_age_days = 1; + uint64 expire_warn_days = 2; +} + +message DefaultPasswordAgePolicyView { + uint64 max_age_days = 1; + uint64 expire_warn_days = 2; + google.protobuf.Timestamp creation_date = 3; + google.protobuf.Timestamp change_date = 4; +} + +message DefaultPasswordLockoutPolicy { + uint64 max_attempts = 1; + bool show_lockout_failure = 2; + google.protobuf.Timestamp creation_date = 3; + google.protobuf.Timestamp change_date = 4; +} + +message DefaultPasswordLockoutPolicyRequest { + uint64 max_attempts = 1; + bool show_lockout_failure = 2; +} + +message DefaultPasswordLockoutPolicyView { + uint64 max_attempts = 1; + bool show_lockout_failure = 2; + google.protobuf.Timestamp creation_date = 3; + google.protobuf.Timestamp change_date = 4; +} \ No newline at end of file diff --git a/pkg/grpc/auth/auth.pb.go b/pkg/grpc/auth/auth.pb.go index e5442d37f8..e8f76a5afd 100644 --- a/pkg/grpc/auth/auth.pb.go +++ b/pkg/grpc/auth/auth.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.11.3 +// protoc v3.13.0 // source: auth.proto package auth diff --git a/pkg/grpc/auth/auth.pb.gw.go b/pkg/grpc/auth/auth.pb.gw.go index ed7359ce12..1939105835 100644 --- a/pkg/grpc/auth/auth.pb.gw.go +++ b/pkg/grpc/auth/auth.pb.gw.go @@ -21,6 +21,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" ) @@ -31,6 +32,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_AuthService_Healthz_0(ctx context.Context, marshaler runtime.Marshaler, client AuthServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty @@ -927,11 +929,14 @@ func local_request_AuthService_GetMyProjectPermissions_0(ctx context.Context, ma // RegisterAuthServiceHandlerServer registers the http handlers for service AuthService to "mux". // UnaryRPC :call AuthServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthServiceHandlerFromEndpoint instead. func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AuthServiceServer) error { mux.Handle("GET", pattern_AuthService_Healthz_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -939,6 +944,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_Healthz_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -952,6 +958,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_Ready_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -959,6 +967,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_Ready_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -972,6 +981,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_Validate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -979,6 +990,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_Validate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -992,6 +1004,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyUserSessions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -999,6 +1013,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyUserSessions_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1012,6 +1027,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1019,6 +1036,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyUser_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1032,6 +1050,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyUserProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1039,6 +1059,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyUserProfile_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1052,6 +1073,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("PUT", pattern_AuthService_UpdateMyUserProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1059,6 +1082,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_UpdateMyUserProfile_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1072,6 +1096,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("PUT", pattern_AuthService_ChangeMyUserName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1079,6 +1105,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_ChangeMyUserName_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1092,6 +1119,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyUserEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1099,6 +1128,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyUserEmail_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1112,6 +1142,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("PUT", pattern_AuthService_ChangeMyUserEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1119,6 +1151,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_ChangeMyUserEmail_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1132,6 +1165,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_VerifyMyUserEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1139,6 +1174,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_VerifyMyUserEmail_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1152,6 +1188,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_ResendMyEmailVerificationMail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1159,6 +1197,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_ResendMyEmailVerificationMail_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1172,6 +1211,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyUserPhone_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1179,6 +1220,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyUserPhone_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1192,6 +1234,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("PUT", pattern_AuthService_ChangeMyUserPhone_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1199,6 +1243,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_ChangeMyUserPhone_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1212,6 +1257,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("DELETE", pattern_AuthService_RemoveMyUserPhone_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1219,6 +1266,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_RemoveMyUserPhone_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1232,6 +1280,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_VerifyMyUserPhone_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1239,6 +1289,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_VerifyMyUserPhone_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1252,6 +1303,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_ResendMyPhoneVerificationCode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1259,6 +1312,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_ResendMyPhoneVerificationCode_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1272,6 +1326,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyUserAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1279,6 +1335,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyUserAddress_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1292,6 +1349,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyUserChanges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1299,6 +1358,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyUserChanges_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1312,6 +1372,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("PUT", pattern_AuthService_UpdateMyUserAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1319,6 +1381,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_UpdateMyUserAddress_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1332,6 +1395,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyMfas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1339,6 +1404,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyMfas_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1352,6 +1418,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("PUT", pattern_AuthService_ChangeMyPassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1359,6 +1427,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_ChangeMyPassword_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1372,6 +1441,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1379,6 +1450,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyPasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1392,6 +1464,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_SearchMyExternalIDPs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1399,6 +1473,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_SearchMyExternalIDPs_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1412,6 +1487,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("DELETE", pattern_AuthService_RemoveMyExternalIDP_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1419,6 +1496,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_RemoveMyExternalIDP_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1432,6 +1510,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_AddMfaOTP_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1439,6 +1519,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_AddMfaOTP_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1452,6 +1533,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("PUT", pattern_AuthService_VerifyMfaOTP_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1459,6 +1542,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_VerifyMfaOTP_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1472,6 +1556,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("DELETE", pattern_AuthService_RemoveMfaOTP_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1479,6 +1565,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_RemoveMfaOTP_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1492,6 +1579,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_SearchMyUserGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1499,6 +1588,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_SearchMyUserGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1512,6 +1602,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("POST", pattern_AuthService_SearchMyProjectOrgs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1519,6 +1611,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_SearchMyProjectOrgs_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1532,6 +1625,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyZitadelPermissions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1539,6 +1634,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyZitadelPermissions_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -1552,6 +1648,8 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux mux.Handle("GET", pattern_AuthService_GetMyProjectPermissions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -1559,6 +1657,7 @@ func RegisterAuthServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux return } resp, md, err := local_request_AuthService_GetMyProjectPermissions_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) diff --git a/pkg/grpc/auth/auth.swagger.json b/pkg/grpc/auth/auth.swagger.json index ee34ce79dd..382796a003 100644 --- a/pkg/grpc/auth/auth.swagger.json +++ b/pkg/grpc/auth/auth.swagger.json @@ -30,7 +30,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -63,7 +63,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -85,7 +85,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -108,7 +108,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -130,7 +130,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -152,7 +152,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -174,7 +174,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -207,7 +207,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -229,7 +229,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -249,7 +249,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -281,7 +281,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -306,8 +306,7 @@ "name": "asc", "in": "query", "required": false, - "type": "boolean", - "format": "boolean" + "type": "boolean" } ], "tags": [ @@ -326,7 +325,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -346,7 +345,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -378,7 +377,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -410,7 +409,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -443,7 +442,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -475,7 +474,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -511,7 +510,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -533,7 +532,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -554,7 +553,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -586,7 +585,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -619,7 +618,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -651,7 +650,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -671,7 +670,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -691,7 +690,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -723,7 +722,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -755,7 +754,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -787,7 +786,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -807,7 +806,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -840,7 +839,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -862,7 +861,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -894,7 +893,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1114,15 +1113,13 @@ "type": "string" }, "is_email_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "phone": { "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "country": { "type": "string" @@ -1270,8 +1267,7 @@ "format": "uint64" }, "asc": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "queries": { "type": "array", @@ -1348,28 +1344,23 @@ "format": "uint64" }, "has_lowercase": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "has_uppercase": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "has_number": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "has_symbol": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", "format": "uint64" }, "is_default": { - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -1521,8 +1512,7 @@ "type": "string" }, "isEmailVerified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -1548,8 +1538,7 @@ "type": "string" }, "isEmailVerified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -1603,8 +1592,7 @@ "$ref": "#/definitions/v1UserGrantSearchKey" }, "asc": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "queries": { "type": "array", @@ -1681,8 +1669,7 @@ "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -1708,8 +1695,7 @@ "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", diff --git a/pkg/grpc/management/management.pb.authoptions.go b/pkg/grpc/management/management.pb.authoptions.go index a98e2f810c..a6832c7cbb 100644 --- a/pkg/grpc/management/management.pb.authoptions.go +++ b/pkg/grpc/management/management.pb.authoptions.go @@ -189,71 +189,6 @@ var ManagementService_AuthMethods = authz.MethodMapping{ CheckParam: "", }, - "/caos.zitadel.management.api.v1.ManagementService/GetPasswordComplexityPolicy": authz.Option{ - Permission: "policy.read", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordComplexityPolicy": authz.Option{ - Permission: "policy.read", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordComplexityPolicy": authz.Option{ - Permission: "policy.write", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordComplexityPolicy": authz.Option{ - Permission: "policy.write", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordComplexityPolicy": authz.Option{ - Permission: "policy.delete", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/GetPasswordAgePolicy": authz.Option{ - Permission: "policy.read", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordAgePolicy": authz.Option{ - Permission: "policy.write", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordAgePolicy": authz.Option{ - Permission: "policy.write", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordAgePolicy": authz.Option{ - Permission: "policy.delete", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/GetPasswordLockoutPolicy": authz.Option{ - Permission: "policy.read", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordLockoutPolicy": authz.Option{ - Permission: "policy.write", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordLockoutPolicy": authz.Option{ - Permission: "policy.write", - CheckParam: "", - }, - - "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordLockoutPolicy": authz.Option{ - Permission: "policy.delete", - CheckParam: "", - }, - "/caos.zitadel.management.api.v1.ManagementService/CreateOrg": authz.Option{ Permission: "org.create", CheckParam: "", @@ -639,6 +574,11 @@ var ManagementService_AuthMethods = authz.MethodMapping{ CheckParam: "", }, + "/caos.zitadel.management.api.v1.ManagementService/GetDefaultLoginPolicy": authz.Option{ + Permission: "policy.read", + CheckParam: "", + }, + "/caos.zitadel.management.api.v1.ManagementService/CreateLoginPolicy": authz.Option{ Permission: "policy.write", CheckParam: "", @@ -668,4 +608,79 @@ var ManagementService_AuthMethods = authz.MethodMapping{ Permission: "policy.write", CheckParam: "", }, + + "/caos.zitadel.management.api.v1.ManagementService/GetPasswordComplexityPolicy": authz.Option{ + Permission: "policy.read", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordComplexityPolicy": authz.Option{ + Permission: "policy.read", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordComplexityPolicy": authz.Option{ + Permission: "policy.write", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordComplexityPolicy": authz.Option{ + Permission: "policy.write", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordComplexityPolicy": authz.Option{ + Permission: "policy.delete", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/GetPasswordAgePolicy": authz.Option{ + Permission: "policy.read", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordAgePolicy": authz.Option{ + Permission: "policy.read", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordAgePolicy": authz.Option{ + Permission: "policy.write", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordAgePolicy": authz.Option{ + Permission: "policy.write", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordAgePolicy": authz.Option{ + Permission: "policy.delete", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/GetPasswordLockoutPolicy": authz.Option{ + Permission: "policy.read", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordLockoutPolicy": authz.Option{ + Permission: "policy.read", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordLockoutPolicy": authz.Option{ + Permission: "policy.write", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordLockoutPolicy": authz.Option{ + Permission: "policy.write", + CheckParam: "", + }, + + "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordLockoutPolicy": authz.Option{ + Permission: "policy.delete", + CheckParam: "", + }, } diff --git a/pkg/grpc/management/management.pb.go b/pkg/grpc/management/management.pb.go index dd735c4b9e..de4c69c7d3 100644 --- a/pkg/grpc/management/management.pb.go +++ b/pkg/grpc/management/management.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.11.3 +// protoc v3.13.0 // source: management.proto package management @@ -37,6 +37,55 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 +type IamSetupStep int32 + +const ( + IamSetupStep_iam_setup_step_UNDEFINED IamSetupStep = 0 + IamSetupStep_iam_setup_step_1 IamSetupStep = 1 + IamSetupStep_iam_setup_step_2 IamSetupStep = 2 +) + +// Enum value maps for IamSetupStep. +var ( + IamSetupStep_name = map[int32]string{ + 0: "iam_setup_step_UNDEFINED", + 1: "iam_setup_step_1", + 2: "iam_setup_step_2", + } + IamSetupStep_value = map[string]int32{ + "iam_setup_step_UNDEFINED": 0, + "iam_setup_step_1": 1, + "iam_setup_step_2": 2, + } +) + +func (x IamSetupStep) Enum() *IamSetupStep { + p := new(IamSetupStep) + *p = x + return p +} + +func (x IamSetupStep) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IamSetupStep) Descriptor() protoreflect.EnumDescriptor { + return file_management_proto_enumTypes[0].Descriptor() +} + +func (IamSetupStep) Type() protoreflect.EnumType { + return &file_management_proto_enumTypes[0] +} + +func (x IamSetupStep) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use IamSetupStep.Descriptor instead. +func (IamSetupStep) EnumDescriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{0} +} + type UserState int32 const ( @@ -82,11 +131,11 @@ func (x UserState) String() string { } func (UserState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[0].Descriptor() + return file_management_proto_enumTypes[1].Descriptor() } func (UserState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[0] + return &file_management_proto_enumTypes[1] } func (x UserState) Number() protoreflect.EnumNumber { @@ -95,7 +144,7 @@ func (x UserState) Number() protoreflect.EnumNumber { // Deprecated: Use UserState.Descriptor instead. func (UserState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{0} + return file_management_proto_rawDescGZIP(), []int{1} } type Gender int32 @@ -134,11 +183,11 @@ func (x Gender) String() string { } func (Gender) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[1].Descriptor() + return file_management_proto_enumTypes[2].Descriptor() } func (Gender) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[1] + return &file_management_proto_enumTypes[2] } func (x Gender) Number() protoreflect.EnumNumber { @@ -147,7 +196,7 @@ func (x Gender) Number() protoreflect.EnumNumber { // Deprecated: Use Gender.Descriptor instead. func (Gender) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{1} + return file_management_proto_rawDescGZIP(), []int{2} } type MachineKeyType int32 @@ -180,11 +229,11 @@ func (x MachineKeyType) String() string { } func (MachineKeyType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[2].Descriptor() + return file_management_proto_enumTypes[3].Descriptor() } func (MachineKeyType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[2] + return &file_management_proto_enumTypes[3] } func (x MachineKeyType) Number() protoreflect.EnumNumber { @@ -193,7 +242,7 @@ func (x MachineKeyType) Number() protoreflect.EnumNumber { // Deprecated: Use MachineKeyType.Descriptor instead. func (MachineKeyType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{2} + return file_management_proto_rawDescGZIP(), []int{3} } type UserSearchKey int32 @@ -247,11 +296,11 @@ func (x UserSearchKey) String() string { } func (UserSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[3].Descriptor() + return file_management_proto_enumTypes[4].Descriptor() } func (UserSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[3] + return &file_management_proto_enumTypes[4] } func (x UserSearchKey) Number() protoreflect.EnumNumber { @@ -260,7 +309,7 @@ func (x UserSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use UserSearchKey.Descriptor instead. func (UserSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{3} + return file_management_proto_rawDescGZIP(), []int{4} } type SearchMethod int32 @@ -320,11 +369,11 @@ func (x SearchMethod) String() string { } func (SearchMethod) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[4].Descriptor() + return file_management_proto_enumTypes[5].Descriptor() } func (SearchMethod) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[4] + return &file_management_proto_enumTypes[5] } func (x SearchMethod) Number() protoreflect.EnumNumber { @@ -333,7 +382,7 @@ func (x SearchMethod) Number() protoreflect.EnumNumber { // Deprecated: Use SearchMethod.Descriptor instead. func (SearchMethod) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{4} + return file_management_proto_rawDescGZIP(), []int{5} } type MfaType int32 @@ -369,11 +418,11 @@ func (x MfaType) String() string { } func (MfaType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[5].Descriptor() + return file_management_proto_enumTypes[6].Descriptor() } func (MfaType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[5] + return &file_management_proto_enumTypes[6] } func (x MfaType) Number() protoreflect.EnumNumber { @@ -382,7 +431,7 @@ func (x MfaType) Number() protoreflect.EnumNumber { // Deprecated: Use MfaType.Descriptor instead. func (MfaType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{5} + return file_management_proto_rawDescGZIP(), []int{6} } type MFAState int32 @@ -421,11 +470,11 @@ func (x MFAState) String() string { } func (MFAState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[6].Descriptor() + return file_management_proto_enumTypes[7].Descriptor() } func (MFAState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[6] + return &file_management_proto_enumTypes[7] } func (x MFAState) Number() protoreflect.EnumNumber { @@ -434,7 +483,7 @@ func (x MFAState) Number() protoreflect.EnumNumber { // Deprecated: Use MFAState.Descriptor instead. func (MFAState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{6} + return file_management_proto_rawDescGZIP(), []int{7} } type NotificationType int32 @@ -467,11 +516,11 @@ func (x NotificationType) String() string { } func (NotificationType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[7].Descriptor() + return file_management_proto_enumTypes[8].Descriptor() } func (NotificationType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[7] + return &file_management_proto_enumTypes[8] } func (x NotificationType) Number() protoreflect.EnumNumber { @@ -480,7 +529,7 @@ func (x NotificationType) Number() protoreflect.EnumNumber { // Deprecated: Use NotificationType.Descriptor instead. func (NotificationType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{7} + return file_management_proto_rawDescGZIP(), []int{8} } type PolicyState int32 @@ -519,11 +568,11 @@ func (x PolicyState) String() string { } func (PolicyState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[8].Descriptor() + return file_management_proto_enumTypes[9].Descriptor() } func (PolicyState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[8] + return &file_management_proto_enumTypes[9] } func (x PolicyState) Number() protoreflect.EnumNumber { @@ -532,7 +581,7 @@ func (x PolicyState) Number() protoreflect.EnumNumber { // Deprecated: Use PolicyState.Descriptor instead. func (PolicyState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{8} + return file_management_proto_rawDescGZIP(), []int{9} } type OrgState int32 @@ -568,11 +617,11 @@ func (x OrgState) String() string { } func (OrgState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[9].Descriptor() + return file_management_proto_enumTypes[10].Descriptor() } func (OrgState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[9] + return &file_management_proto_enumTypes[10] } func (x OrgState) Number() protoreflect.EnumNumber { @@ -581,7 +630,7 @@ func (x OrgState) Number() protoreflect.EnumNumber { // Deprecated: Use OrgState.Descriptor instead. func (OrgState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{9} + return file_management_proto_rawDescGZIP(), []int{10} } type OrgDomainValidationType int32 @@ -617,11 +666,11 @@ func (x OrgDomainValidationType) String() string { } func (OrgDomainValidationType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[10].Descriptor() + return file_management_proto_enumTypes[11].Descriptor() } func (OrgDomainValidationType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[10] + return &file_management_proto_enumTypes[11] } func (x OrgDomainValidationType) Number() protoreflect.EnumNumber { @@ -630,7 +679,7 @@ func (x OrgDomainValidationType) Number() protoreflect.EnumNumber { // Deprecated: Use OrgDomainValidationType.Descriptor instead. func (OrgDomainValidationType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{10} + return file_management_proto_rawDescGZIP(), []int{11} } type OrgDomainSearchKey int32 @@ -663,11 +712,11 @@ func (x OrgDomainSearchKey) String() string { } func (OrgDomainSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[11].Descriptor() + return file_management_proto_enumTypes[12].Descriptor() } func (OrgDomainSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[11] + return &file_management_proto_enumTypes[12] } func (x OrgDomainSearchKey) Number() protoreflect.EnumNumber { @@ -676,7 +725,7 @@ func (x OrgDomainSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use OrgDomainSearchKey.Descriptor instead. func (OrgDomainSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{11} + return file_management_proto_rawDescGZIP(), []int{12} } type OrgMemberSearchKey int32 @@ -718,11 +767,11 @@ func (x OrgMemberSearchKey) String() string { } func (OrgMemberSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[12].Descriptor() + return file_management_proto_enumTypes[13].Descriptor() } func (OrgMemberSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[12] + return &file_management_proto_enumTypes[13] } func (x OrgMemberSearchKey) Number() protoreflect.EnumNumber { @@ -731,7 +780,7 @@ func (x OrgMemberSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use OrgMemberSearchKey.Descriptor instead. func (OrgMemberSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{12} + return file_management_proto_rawDescGZIP(), []int{13} } type ProjectSearchKey int32 @@ -764,11 +813,11 @@ func (x ProjectSearchKey) String() string { } func (ProjectSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[13].Descriptor() + return file_management_proto_enumTypes[14].Descriptor() } func (ProjectSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[13] + return &file_management_proto_enumTypes[14] } func (x ProjectSearchKey) Number() protoreflect.EnumNumber { @@ -777,7 +826,7 @@ func (x ProjectSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectSearchKey.Descriptor instead. func (ProjectSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{13} + return file_management_proto_rawDescGZIP(), []int{14} } type ProjectState int32 @@ -813,11 +862,11 @@ func (x ProjectState) String() string { } func (ProjectState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[14].Descriptor() + return file_management_proto_enumTypes[15].Descriptor() } func (ProjectState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[14] + return &file_management_proto_enumTypes[15] } func (x ProjectState) Number() protoreflect.EnumNumber { @@ -826,7 +875,7 @@ func (x ProjectState) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectState.Descriptor instead. func (ProjectState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{14} + return file_management_proto_rawDescGZIP(), []int{15} } type ProjectRoleSearchKey int32 @@ -862,11 +911,11 @@ func (x ProjectRoleSearchKey) String() string { } func (ProjectRoleSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[15].Descriptor() + return file_management_proto_enumTypes[16].Descriptor() } func (ProjectRoleSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[15] + return &file_management_proto_enumTypes[16] } func (x ProjectRoleSearchKey) Number() protoreflect.EnumNumber { @@ -875,7 +924,7 @@ func (x ProjectRoleSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectRoleSearchKey.Descriptor instead. func (ProjectRoleSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{15} + return file_management_proto_rawDescGZIP(), []int{16} } type ProjectMemberSearchKey int32 @@ -920,11 +969,11 @@ func (x ProjectMemberSearchKey) String() string { } func (ProjectMemberSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[16].Descriptor() + return file_management_proto_enumTypes[17].Descriptor() } func (ProjectMemberSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[16] + return &file_management_proto_enumTypes[17] } func (x ProjectMemberSearchKey) Number() protoreflect.EnumNumber { @@ -933,7 +982,7 @@ func (x ProjectMemberSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectMemberSearchKey.Descriptor instead. func (ProjectMemberSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{16} + return file_management_proto_rawDescGZIP(), []int{17} } type AppState int32 @@ -969,11 +1018,11 @@ func (x AppState) String() string { } func (AppState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[17].Descriptor() + return file_management_proto_enumTypes[18].Descriptor() } func (AppState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[17] + return &file_management_proto_enumTypes[18] } func (x AppState) Number() protoreflect.EnumNumber { @@ -982,7 +1031,7 @@ func (x AppState) Number() protoreflect.EnumNumber { // Deprecated: Use AppState.Descriptor instead. func (AppState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{17} + return file_management_proto_rawDescGZIP(), []int{18} } type OIDCVersion int32 @@ -1012,11 +1061,11 @@ func (x OIDCVersion) String() string { } func (OIDCVersion) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[18].Descriptor() + return file_management_proto_enumTypes[19].Descriptor() } func (OIDCVersion) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[18] + return &file_management_proto_enumTypes[19] } func (x OIDCVersion) Number() protoreflect.EnumNumber { @@ -1025,7 +1074,53 @@ func (x OIDCVersion) Number() protoreflect.EnumNumber { // Deprecated: Use OIDCVersion.Descriptor instead. func (OIDCVersion) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{18} + return file_management_proto_rawDescGZIP(), []int{19} +} + +type OIDCTokenType int32 + +const ( + OIDCTokenType_OIDCTokenType_Bearer OIDCTokenType = 0 + OIDCTokenType_OIDCTokenType_JWT OIDCTokenType = 1 +) + +// Enum value maps for OIDCTokenType. +var ( + OIDCTokenType_name = map[int32]string{ + 0: "OIDCTokenType_Bearer", + 1: "OIDCTokenType_JWT", + } + OIDCTokenType_value = map[string]int32{ + "OIDCTokenType_Bearer": 0, + "OIDCTokenType_JWT": 1, + } +) + +func (x OIDCTokenType) Enum() *OIDCTokenType { + p := new(OIDCTokenType) + *p = x + return p +} + +func (x OIDCTokenType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (OIDCTokenType) Descriptor() protoreflect.EnumDescriptor { + return file_management_proto_enumTypes[20].Descriptor() +} + +func (OIDCTokenType) Type() protoreflect.EnumType { + return &file_management_proto_enumTypes[20] +} + +func (x OIDCTokenType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use OIDCTokenType.Descriptor instead. +func (OIDCTokenType) EnumDescriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{20} } type OIDCResponseType int32 @@ -1061,11 +1156,11 @@ func (x OIDCResponseType) String() string { } func (OIDCResponseType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[19].Descriptor() + return file_management_proto_enumTypes[21].Descriptor() } func (OIDCResponseType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[19] + return &file_management_proto_enumTypes[21] } func (x OIDCResponseType) Number() protoreflect.EnumNumber { @@ -1074,7 +1169,7 @@ func (x OIDCResponseType) Number() protoreflect.EnumNumber { // Deprecated: Use OIDCResponseType.Descriptor instead. func (OIDCResponseType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{19} + return file_management_proto_rawDescGZIP(), []int{21} } type OIDCGrantType int32 @@ -1110,11 +1205,11 @@ func (x OIDCGrantType) String() string { } func (OIDCGrantType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[20].Descriptor() + return file_management_proto_enumTypes[22].Descriptor() } func (OIDCGrantType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[20] + return &file_management_proto_enumTypes[22] } func (x OIDCGrantType) Number() protoreflect.EnumNumber { @@ -1123,7 +1218,7 @@ func (x OIDCGrantType) Number() protoreflect.EnumNumber { // Deprecated: Use OIDCGrantType.Descriptor instead. func (OIDCGrantType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{20} + return file_management_proto_rawDescGZIP(), []int{22} } type OIDCApplicationType int32 @@ -1159,11 +1254,11 @@ func (x OIDCApplicationType) String() string { } func (OIDCApplicationType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[21].Descriptor() + return file_management_proto_enumTypes[23].Descriptor() } func (OIDCApplicationType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[21] + return &file_management_proto_enumTypes[23] } func (x OIDCApplicationType) Number() protoreflect.EnumNumber { @@ -1172,7 +1267,7 @@ func (x OIDCApplicationType) Number() protoreflect.EnumNumber { // Deprecated: Use OIDCApplicationType.Descriptor instead. func (OIDCApplicationType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{21} + return file_management_proto_rawDescGZIP(), []int{23} } type OIDCAuthMethodType int32 @@ -1208,11 +1303,11 @@ func (x OIDCAuthMethodType) String() string { } func (OIDCAuthMethodType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[22].Descriptor() + return file_management_proto_enumTypes[24].Descriptor() } func (OIDCAuthMethodType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[22] + return &file_management_proto_enumTypes[24] } func (x OIDCAuthMethodType) Number() protoreflect.EnumNumber { @@ -1221,7 +1316,7 @@ func (x OIDCAuthMethodType) Number() protoreflect.EnumNumber { // Deprecated: Use OIDCAuthMethodType.Descriptor instead. func (OIDCAuthMethodType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{22} + return file_management_proto_rawDescGZIP(), []int{24} } type ApplicationSearchKey int32 @@ -1254,11 +1349,11 @@ func (x ApplicationSearchKey) String() string { } func (ApplicationSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[23].Descriptor() + return file_management_proto_enumTypes[25].Descriptor() } func (ApplicationSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[23] + return &file_management_proto_enumTypes[25] } func (x ApplicationSearchKey) Number() protoreflect.EnumNumber { @@ -1267,7 +1362,7 @@ func (x ApplicationSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use ApplicationSearchKey.Descriptor instead. func (ApplicationSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{23} + return file_management_proto_rawDescGZIP(), []int{25} } type ProjectGrantState int32 @@ -1303,11 +1398,11 @@ func (x ProjectGrantState) String() string { } func (ProjectGrantState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[24].Descriptor() + return file_management_proto_enumTypes[26].Descriptor() } func (ProjectGrantState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[24] + return &file_management_proto_enumTypes[26] } func (x ProjectGrantState) Number() protoreflect.EnumNumber { @@ -1316,7 +1411,7 @@ func (x ProjectGrantState) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectGrantState.Descriptor instead. func (ProjectGrantState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{24} + return file_management_proto_rawDescGZIP(), []int{26} } type ProjectGrantSearchKey int32 @@ -1352,11 +1447,11 @@ func (x ProjectGrantSearchKey) String() string { } func (ProjectGrantSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[25].Descriptor() + return file_management_proto_enumTypes[27].Descriptor() } func (ProjectGrantSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[25] + return &file_management_proto_enumTypes[27] } func (x ProjectGrantSearchKey) Number() protoreflect.EnumNumber { @@ -1365,7 +1460,7 @@ func (x ProjectGrantSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectGrantSearchKey.Descriptor instead. func (ProjectGrantSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{25} + return file_management_proto_rawDescGZIP(), []int{27} } type ProjectGrantMemberSearchKey int32 @@ -1410,11 +1505,11 @@ func (x ProjectGrantMemberSearchKey) String() string { } func (ProjectGrantMemberSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[26].Descriptor() + return file_management_proto_enumTypes[28].Descriptor() } func (ProjectGrantMemberSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[26] + return &file_management_proto_enumTypes[28] } func (x ProjectGrantMemberSearchKey) Number() protoreflect.EnumNumber { @@ -1423,7 +1518,7 @@ func (x ProjectGrantMemberSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectGrantMemberSearchKey.Descriptor instead. func (ProjectGrantMemberSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{26} + return file_management_proto_rawDescGZIP(), []int{28} } type UserGrantState int32 @@ -1459,11 +1554,11 @@ func (x UserGrantState) String() string { } func (UserGrantState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[27].Descriptor() + return file_management_proto_enumTypes[29].Descriptor() } func (UserGrantState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[27] + return &file_management_proto_enumTypes[29] } func (x UserGrantState) Number() protoreflect.EnumNumber { @@ -1472,7 +1567,7 @@ func (x UserGrantState) Number() protoreflect.EnumNumber { // Deprecated: Use UserGrantState.Descriptor instead. func (UserGrantState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{27} + return file_management_proto_rawDescGZIP(), []int{29} } type UserGrantSearchKey int32 @@ -1517,11 +1612,11 @@ func (x UserGrantSearchKey) String() string { } func (UserGrantSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[28].Descriptor() + return file_management_proto_enumTypes[30].Descriptor() } func (UserGrantSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[28] + return &file_management_proto_enumTypes[30] } func (x UserGrantSearchKey) Number() protoreflect.EnumNumber { @@ -1530,7 +1625,7 @@ func (x UserGrantSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use UserGrantSearchKey.Descriptor instead. func (UserGrantSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{28} + return file_management_proto_rawDescGZIP(), []int{30} } type UserMembershipSearchKey int32 @@ -1566,11 +1661,11 @@ func (x UserMembershipSearchKey) String() string { } func (UserMembershipSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[29].Descriptor() + return file_management_proto_enumTypes[31].Descriptor() } func (UserMembershipSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[29] + return &file_management_proto_enumTypes[31] } func (x UserMembershipSearchKey) Number() protoreflect.EnumNumber { @@ -1579,7 +1674,7 @@ func (x UserMembershipSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use UserMembershipSearchKey.Descriptor instead. func (UserMembershipSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{29} + return file_management_proto_rawDescGZIP(), []int{31} } type MemberType int32 @@ -1618,11 +1713,11 @@ func (x MemberType) String() string { } func (MemberType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[30].Descriptor() + return file_management_proto_enumTypes[32].Descriptor() } func (MemberType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[30] + return &file_management_proto_enumTypes[32] } func (x MemberType) Number() protoreflect.EnumNumber { @@ -1631,7 +1726,53 @@ func (x MemberType) Number() protoreflect.EnumNumber { // Deprecated: Use MemberType.Descriptor instead. func (MemberType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{30} + return file_management_proto_rawDescGZIP(), []int{32} +} + +type IdpStylingType int32 + +const ( + IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED IdpStylingType = 0 + IdpStylingType_IDPSTYLINGTYPE_GOOGLE IdpStylingType = 1 +) + +// Enum value maps for IdpStylingType. +var ( + IdpStylingType_name = map[int32]string{ + 0: "IDPSTYLINGTYPE_UNSPECIFIED", + 1: "IDPSTYLINGTYPE_GOOGLE", + } + IdpStylingType_value = map[string]int32{ + "IDPSTYLINGTYPE_UNSPECIFIED": 0, + "IDPSTYLINGTYPE_GOOGLE": 1, + } +) + +func (x IdpStylingType) Enum() *IdpStylingType { + p := new(IdpStylingType) + *p = x + return p +} + +func (x IdpStylingType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IdpStylingType) Descriptor() protoreflect.EnumDescriptor { + return file_management_proto_enumTypes[33].Descriptor() +} + +func (IdpStylingType) Type() protoreflect.EnumType { + return &file_management_proto_enumTypes[33] +} + +func (x IdpStylingType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use IdpStylingType.Descriptor instead. +func (IdpStylingType) EnumDescriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{33} } type IdpState int32 @@ -1667,11 +1808,11 @@ func (x IdpState) String() string { } func (IdpState) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[31].Descriptor() + return file_management_proto_enumTypes[34].Descriptor() } func (IdpState) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[31] + return &file_management_proto_enumTypes[34] } func (x IdpState) Number() protoreflect.EnumNumber { @@ -1680,7 +1821,7 @@ func (x IdpState) Number() protoreflect.EnumNumber { // Deprecated: Use IdpState.Descriptor instead. func (IdpState) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{31} + return file_management_proto_rawDescGZIP(), []int{34} } type OIDCMappingField int32 @@ -1716,11 +1857,11 @@ func (x OIDCMappingField) String() string { } func (OIDCMappingField) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[32].Descriptor() + return file_management_proto_enumTypes[35].Descriptor() } func (OIDCMappingField) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[32] + return &file_management_proto_enumTypes[35] } func (x OIDCMappingField) Number() protoreflect.EnumNumber { @@ -1729,7 +1870,7 @@ func (x OIDCMappingField) Number() protoreflect.EnumNumber { // Deprecated: Use OIDCMappingField.Descriptor instead. func (OIDCMappingField) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{32} + return file_management_proto_rawDescGZIP(), []int{35} } type IdpSearchKey int32 @@ -1768,11 +1909,11 @@ func (x IdpSearchKey) String() string { } func (IdpSearchKey) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[33].Descriptor() + return file_management_proto_enumTypes[36].Descriptor() } func (IdpSearchKey) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[33] + return &file_management_proto_enumTypes[36] } func (x IdpSearchKey) Number() protoreflect.EnumNumber { @@ -1781,7 +1922,7 @@ func (x IdpSearchKey) Number() protoreflect.EnumNumber { // Deprecated: Use IdpSearchKey.Descriptor instead. func (IdpSearchKey) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{33} + return file_management_proto_rawDescGZIP(), []int{36} } type IdpType int32 @@ -1817,11 +1958,11 @@ func (x IdpType) String() string { } func (IdpType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[34].Descriptor() + return file_management_proto_enumTypes[37].Descriptor() } func (IdpType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[34] + return &file_management_proto_enumTypes[37] } func (x IdpType) Number() protoreflect.EnumNumber { @@ -1830,7 +1971,7 @@ func (x IdpType) Number() protoreflect.EnumNumber { // Deprecated: Use IdpType.Descriptor instead. func (IdpType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{34} + return file_management_proto_rawDescGZIP(), []int{37} } type IdpProviderType int32 @@ -1866,11 +2007,11 @@ func (x IdpProviderType) String() string { } func (IdpProviderType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[35].Descriptor() + return file_management_proto_enumTypes[38].Descriptor() } func (IdpProviderType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[35] + return &file_management_proto_enumTypes[38] } func (x IdpProviderType) Number() protoreflect.EnumNumber { @@ -1879,7 +2020,7 @@ func (x IdpProviderType) Number() protoreflect.EnumNumber { // Deprecated: Use IdpProviderType.Descriptor instead. func (IdpProviderType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{35} + return file_management_proto_rawDescGZIP(), []int{38} } //ProjectType is deprecated, remove as soon as console is ready @@ -1916,11 +2057,11 @@ func (x ProjectType) String() string { } func (ProjectType) Descriptor() protoreflect.EnumDescriptor { - return file_management_proto_enumTypes[36].Descriptor() + return file_management_proto_enumTypes[39].Descriptor() } func (ProjectType) Type() protoreflect.EnumType { - return &file_management_proto_enumTypes[36] + return &file_management_proto_enumTypes[39] } func (x ProjectType) Number() protoreflect.EnumNumber { @@ -1929,7 +2070,7 @@ func (x ProjectType) Number() protoreflect.EnumNumber { // Deprecated: Use ProjectType.Descriptor instead. func (ProjectType) EnumDescriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{36} + return file_management_proto_rawDescGZIP(), []int{39} } type ZitadelDocs struct { @@ -1992,10 +2133,10 @@ type Iam struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - GlobalOrgId string `protobuf:"bytes,1,opt,name=global_org_id,json=globalOrgId,proto3" json:"global_org_id,omitempty"` - IamProjectId string `protobuf:"bytes,2,opt,name=iam_project_id,json=iamProjectId,proto3" json:"iam_project_id,omitempty"` - SetUpDone bool `protobuf:"varint,3,opt,name=set_up_done,json=setUpDone,proto3" json:"set_up_done,omitempty"` - SetUpStarted bool `protobuf:"varint,4,opt,name=set_up_started,json=setUpStarted,proto3" json:"set_up_started,omitempty"` + GlobalOrgId string `protobuf:"bytes,1,opt,name=global_org_id,json=globalOrgId,proto3" json:"global_org_id,omitempty"` + IamProjectId string `protobuf:"bytes,2,opt,name=iam_project_id,json=iamProjectId,proto3" json:"iam_project_id,omitempty"` + SetUpDone IamSetupStep `protobuf:"varint,3,opt,name=set_up_done,json=setUpDone,proto3,enum=caos.zitadel.management.api.v1.IamSetupStep" json:"set_up_done,omitempty"` + SetUpStarted IamSetupStep `protobuf:"varint,4,opt,name=set_up_started,json=setUpStarted,proto3,enum=caos.zitadel.management.api.v1.IamSetupStep" json:"set_up_started,omitempty"` } func (x *Iam) Reset() { @@ -2044,18 +2185,18 @@ func (x *Iam) GetIamProjectId() string { return "" } -func (x *Iam) GetSetUpDone() bool { +func (x *Iam) GetSetUpDone() IamSetupStep { if x != nil { return x.SetUpDone } - return false + return IamSetupStep_iam_setup_step_UNDEFINED } -func (x *Iam) GetSetUpStarted() bool { +func (x *Iam) GetSetUpStarted() IamSetupStep { if x != nil { return x.SetUpStarted } - return false + return IamSetupStep_iam_setup_step_UNDEFINED } type ChangeRequest struct { @@ -5736,16 +5877,17 @@ func (x *SetPasswordNotificationRequest) GetType() NotificationType { return NotificationType_NOTIFICATIONTYPE_EMAIL } -type PasswordComplexityPolicyID struct { +type OrgIamPolicyView struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + UserLoginMustBeDomain bool `protobuf:"varint,1,opt,name=user_login_must_be_domain,json=userLoginMustBeDomain,proto3" json:"user_login_must_be_domain,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` } -func (x *PasswordComplexityPolicyID) Reset() { - *x = PasswordComplexityPolicyID{} +func (x *OrgIamPolicyView) Reset() { + *x = OrgIamPolicyView{} if protoimpl.UnsafeEnabled { mi := &file_management_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -5753,13 +5895,13 @@ func (x *PasswordComplexityPolicyID) Reset() { } } -func (x *PasswordComplexityPolicyID) String() string { +func (x *OrgIamPolicyView) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PasswordComplexityPolicyID) ProtoMessage() {} +func (*OrgIamPolicyView) ProtoMessage() {} -func (x *PasswordComplexityPolicyID) ProtoReflect() protoreflect.Message { +func (x *OrgIamPolicyView) ProtoReflect() protoreflect.Message { mi := &file_management_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -5771,984 +5913,19 @@ func (x *PasswordComplexityPolicyID) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PasswordComplexityPolicyID.ProtoReflect.Descriptor instead. -func (*PasswordComplexityPolicyID) Descriptor() ([]byte, []int) { +// Deprecated: Use OrgIamPolicyView.ProtoReflect.Descriptor instead. +func (*OrgIamPolicyView) Descriptor() ([]byte, []int) { return file_management_proto_rawDescGZIP(), []int{47} } -func (x *PasswordComplexityPolicyID) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type PasswordComplexityPolicy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - State PolicyState `protobuf:"varint,3,opt,name=state,proto3,enum=caos.zitadel.management.api.v1.PolicyState" json:"state,omitempty"` - CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` - ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` - MinLength uint64 `protobuf:"varint,6,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` - HasLowercase bool `protobuf:"varint,7,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` - HasUppercase bool `protobuf:"varint,8,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` - HasNumber bool `protobuf:"varint,9,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` - HasSymbol bool `protobuf:"varint,10,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` - Sequence uint64 `protobuf:"varint,11,opt,name=sequence,proto3" json:"sequence,omitempty"` - IsDefault bool `protobuf:"varint,12,opt,name=is_default,json=isDefault,proto3" json:"is_default,omitempty"` -} - -func (x *PasswordComplexityPolicy) Reset() { - *x = PasswordComplexityPolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordComplexityPolicy) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordComplexityPolicy) ProtoMessage() {} - -func (x *PasswordComplexityPolicy) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordComplexityPolicy.ProtoReflect.Descriptor instead. -func (*PasswordComplexityPolicy) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{48} -} - -func (x *PasswordComplexityPolicy) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PasswordComplexityPolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordComplexityPolicy) GetState() PolicyState { - if x != nil { - return x.State - } - return PolicyState_POLICYSTATE_UNSPECIFIED -} - -func (x *PasswordComplexityPolicy) GetCreationDate() *timestamp.Timestamp { - if x != nil { - return x.CreationDate - } - return nil -} - -func (x *PasswordComplexityPolicy) GetChangeDate() *timestamp.Timestamp { - if x != nil { - return x.ChangeDate - } - return nil -} - -func (x *PasswordComplexityPolicy) GetMinLength() uint64 { - if x != nil { - return x.MinLength - } - return 0 -} - -func (x *PasswordComplexityPolicy) GetHasLowercase() bool { - if x != nil { - return x.HasLowercase - } - return false -} - -func (x *PasswordComplexityPolicy) GetHasUppercase() bool { - if x != nil { - return x.HasUppercase - } - return false -} - -func (x *PasswordComplexityPolicy) GetHasNumber() bool { - if x != nil { - return x.HasNumber - } - return false -} - -func (x *PasswordComplexityPolicy) GetHasSymbol() bool { - if x != nil { - return x.HasSymbol - } - return false -} - -func (x *PasswordComplexityPolicy) GetSequence() uint64 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PasswordComplexityPolicy) GetIsDefault() bool { - if x != nil { - return x.IsDefault - } - return false -} - -type PasswordComplexityPolicyCreate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` - MinLength uint64 `protobuf:"varint,2,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` - HasLowercase bool `protobuf:"varint,3,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` - HasUppercase bool `protobuf:"varint,4,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` - HasNumber bool `protobuf:"varint,5,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` - HasSymbol bool `protobuf:"varint,6,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` -} - -func (x *PasswordComplexityPolicyCreate) Reset() { - *x = PasswordComplexityPolicyCreate{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordComplexityPolicyCreate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordComplexityPolicyCreate) ProtoMessage() {} - -func (x *PasswordComplexityPolicyCreate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordComplexityPolicyCreate.ProtoReflect.Descriptor instead. -func (*PasswordComplexityPolicyCreate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{49} -} - -func (x *PasswordComplexityPolicyCreate) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordComplexityPolicyCreate) GetMinLength() uint64 { - if x != nil { - return x.MinLength - } - return 0 -} - -func (x *PasswordComplexityPolicyCreate) GetHasLowercase() bool { - if x != nil { - return x.HasLowercase - } - return false -} - -func (x *PasswordComplexityPolicyCreate) GetHasUppercase() bool { - if x != nil { - return x.HasUppercase - } - return false -} - -func (x *PasswordComplexityPolicyCreate) GetHasNumber() bool { - if x != nil { - return x.HasNumber - } - return false -} - -func (x *PasswordComplexityPolicyCreate) GetHasSymbol() bool { - if x != nil { - return x.HasSymbol - } - return false -} - -type PasswordComplexityPolicyUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //TODO: do we need id? - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - MinLength uint64 `protobuf:"varint,3,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` - HasLowercase bool `protobuf:"varint,4,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` - HasUppercase bool `protobuf:"varint,5,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` - HasNumber bool `protobuf:"varint,6,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` - HasSymbol bool `protobuf:"varint,7,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` -} - -func (x *PasswordComplexityPolicyUpdate) Reset() { - *x = PasswordComplexityPolicyUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordComplexityPolicyUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordComplexityPolicyUpdate) ProtoMessage() {} - -func (x *PasswordComplexityPolicyUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordComplexityPolicyUpdate.ProtoReflect.Descriptor instead. -func (*PasswordComplexityPolicyUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{50} -} - -func (x *PasswordComplexityPolicyUpdate) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PasswordComplexityPolicyUpdate) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordComplexityPolicyUpdate) GetMinLength() uint64 { - if x != nil { - return x.MinLength - } - return 0 -} - -func (x *PasswordComplexityPolicyUpdate) GetHasLowercase() bool { - if x != nil { - return x.HasLowercase - } - return false -} - -func (x *PasswordComplexityPolicyUpdate) GetHasUppercase() bool { - if x != nil { - return x.HasUppercase - } - return false -} - -func (x *PasswordComplexityPolicyUpdate) GetHasNumber() bool { - if x != nil { - return x.HasNumber - } - return false -} - -func (x *PasswordComplexityPolicyUpdate) GetHasSymbol() bool { - if x != nil { - return x.HasSymbol - } - return false -} - -type PasswordAgePolicyID struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *PasswordAgePolicyID) Reset() { - *x = PasswordAgePolicyID{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordAgePolicyID) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordAgePolicyID) ProtoMessage() {} - -func (x *PasswordAgePolicyID) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordAgePolicyID.ProtoReflect.Descriptor instead. -func (*PasswordAgePolicyID) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{51} -} - -func (x *PasswordAgePolicyID) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type PasswordAgePolicy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //TODO: do we need id? - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - State PolicyState `protobuf:"varint,3,opt,name=state,proto3,enum=caos.zitadel.management.api.v1.PolicyState" json:"state,omitempty"` - CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` - ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` - MaxAgeDays uint64 `protobuf:"varint,6,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` - ExpireWarnDays uint64 `protobuf:"varint,7,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` - Sequence uint64 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - IsDefault bool `protobuf:"varint,9,opt,name=is_default,json=isDefault,proto3" json:"is_default,omitempty"` -} - -func (x *PasswordAgePolicy) Reset() { - *x = PasswordAgePolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordAgePolicy) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordAgePolicy) ProtoMessage() {} - -func (x *PasswordAgePolicy) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordAgePolicy.ProtoReflect.Descriptor instead. -func (*PasswordAgePolicy) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{52} -} - -func (x *PasswordAgePolicy) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PasswordAgePolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordAgePolicy) GetState() PolicyState { - if x != nil { - return x.State - } - return PolicyState_POLICYSTATE_UNSPECIFIED -} - -func (x *PasswordAgePolicy) GetCreationDate() *timestamp.Timestamp { - if x != nil { - return x.CreationDate - } - return nil -} - -func (x *PasswordAgePolicy) GetChangeDate() *timestamp.Timestamp { - if x != nil { - return x.ChangeDate - } - return nil -} - -func (x *PasswordAgePolicy) GetMaxAgeDays() uint64 { - if x != nil { - return x.MaxAgeDays - } - return 0 -} - -func (x *PasswordAgePolicy) GetExpireWarnDays() uint64 { - if x != nil { - return x.ExpireWarnDays - } - return 0 -} - -func (x *PasswordAgePolicy) GetSequence() uint64 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PasswordAgePolicy) GetIsDefault() bool { - if x != nil { - return x.IsDefault - } - return false -} - -type PasswordAgePolicyCreate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` - MaxAgeDays uint64 `protobuf:"varint,2,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` - ExpireWarnDays uint64 `protobuf:"varint,3,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` -} - -func (x *PasswordAgePolicyCreate) Reset() { - *x = PasswordAgePolicyCreate{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordAgePolicyCreate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordAgePolicyCreate) ProtoMessage() {} - -func (x *PasswordAgePolicyCreate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordAgePolicyCreate.ProtoReflect.Descriptor instead. -func (*PasswordAgePolicyCreate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{53} -} - -func (x *PasswordAgePolicyCreate) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordAgePolicyCreate) GetMaxAgeDays() uint64 { - if x != nil { - return x.MaxAgeDays - } - return 0 -} - -func (x *PasswordAgePolicyCreate) GetExpireWarnDays() uint64 { - if x != nil { - return x.ExpireWarnDays - } - return 0 -} - -type PasswordAgePolicyUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //TODO: do we need id? - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - MaxAgeDays uint64 `protobuf:"varint,3,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` - ExpireWarnDays uint64 `protobuf:"varint,4,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` -} - -func (x *PasswordAgePolicyUpdate) Reset() { - *x = PasswordAgePolicyUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordAgePolicyUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordAgePolicyUpdate) ProtoMessage() {} - -func (x *PasswordAgePolicyUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordAgePolicyUpdate.ProtoReflect.Descriptor instead. -func (*PasswordAgePolicyUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{54} -} - -func (x *PasswordAgePolicyUpdate) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PasswordAgePolicyUpdate) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordAgePolicyUpdate) GetMaxAgeDays() uint64 { - if x != nil { - return x.MaxAgeDays - } - return 0 -} - -func (x *PasswordAgePolicyUpdate) GetExpireWarnDays() uint64 { - if x != nil { - return x.ExpireWarnDays - } - return 0 -} - -type PasswordLockoutPolicyID struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //TODO: why do we need this? -} - -func (x *PasswordLockoutPolicyID) Reset() { - *x = PasswordLockoutPolicyID{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordLockoutPolicyID) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordLockoutPolicyID) ProtoMessage() {} - -func (x *PasswordLockoutPolicyID) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordLockoutPolicyID.ProtoReflect.Descriptor instead. -func (*PasswordLockoutPolicyID) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{55} -} - -func (x *PasswordLockoutPolicyID) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type PasswordLockoutPolicy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //TODO: why do we need this? - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - State PolicyState `protobuf:"varint,3,opt,name=state,proto3,enum=caos.zitadel.management.api.v1.PolicyState" json:"state,omitempty"` - CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` - ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` - MaxAttempts uint64 `protobuf:"varint,6,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` - ShowLockOutFailures bool `protobuf:"varint,7,opt,name=show_lock_out_failures,json=showLockOutFailures,proto3" json:"show_lock_out_failures,omitempty"` - Sequence uint64 `protobuf:"varint,8,opt,name=sequence,proto3" json:"sequence,omitempty"` - IsDefault bool `protobuf:"varint,9,opt,name=is_default,json=isDefault,proto3" json:"is_default,omitempty"` -} - -func (x *PasswordLockoutPolicy) Reset() { - *x = PasswordLockoutPolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordLockoutPolicy) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordLockoutPolicy) ProtoMessage() {} - -func (x *PasswordLockoutPolicy) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordLockoutPolicy.ProtoReflect.Descriptor instead. -func (*PasswordLockoutPolicy) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{56} -} - -func (x *PasswordLockoutPolicy) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PasswordLockoutPolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordLockoutPolicy) GetState() PolicyState { - if x != nil { - return x.State - } - return PolicyState_POLICYSTATE_UNSPECIFIED -} - -func (x *PasswordLockoutPolicy) GetCreationDate() *timestamp.Timestamp { - if x != nil { - return x.CreationDate - } - return nil -} - -func (x *PasswordLockoutPolicy) GetChangeDate() *timestamp.Timestamp { - if x != nil { - return x.ChangeDate - } - return nil -} - -func (x *PasswordLockoutPolicy) GetMaxAttempts() uint64 { - if x != nil { - return x.MaxAttempts - } - return 0 -} - -func (x *PasswordLockoutPolicy) GetShowLockOutFailures() bool { - if x != nil { - return x.ShowLockOutFailures - } - return false -} - -func (x *PasswordLockoutPolicy) GetSequence() uint64 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PasswordLockoutPolicy) GetIsDefault() bool { - if x != nil { - return x.IsDefault - } - return false -} - -type PasswordLockoutPolicyCreate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` - MaxAttempts uint64 `protobuf:"varint,2,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` - ShowLockOutFailures bool `protobuf:"varint,3,opt,name=show_lock_out_failures,json=showLockOutFailures,proto3" json:"show_lock_out_failures,omitempty"` -} - -func (x *PasswordLockoutPolicyCreate) Reset() { - *x = PasswordLockoutPolicyCreate{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordLockoutPolicyCreate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordLockoutPolicyCreate) ProtoMessage() {} - -func (x *PasswordLockoutPolicyCreate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordLockoutPolicyCreate.ProtoReflect.Descriptor instead. -func (*PasswordLockoutPolicyCreate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{57} -} - -func (x *PasswordLockoutPolicyCreate) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordLockoutPolicyCreate) GetMaxAttempts() uint64 { - if x != nil { - return x.MaxAttempts - } - return 0 -} - -func (x *PasswordLockoutPolicyCreate) GetShowLockOutFailures() bool { - if x != nil { - return x.ShowLockOutFailures - } - return false -} - -type PasswordLockoutPolicyUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //TODO: do we need id? - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - MaxAttempts uint64 `protobuf:"varint,3,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` - ShowLockOutFailures bool `protobuf:"varint,4,opt,name=show_lock_out_failures,json=showLockOutFailures,proto3" json:"show_lock_out_failures,omitempty"` -} - -func (x *PasswordLockoutPolicyUpdate) Reset() { - *x = PasswordLockoutPolicyUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PasswordLockoutPolicyUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PasswordLockoutPolicyUpdate) ProtoMessage() {} - -func (x *PasswordLockoutPolicyUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PasswordLockoutPolicyUpdate.ProtoReflect.Descriptor instead. -func (*PasswordLockoutPolicyUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{58} -} - -func (x *PasswordLockoutPolicyUpdate) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PasswordLockoutPolicyUpdate) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *PasswordLockoutPolicyUpdate) GetMaxAttempts() uint64 { - if x != nil { - return x.MaxAttempts - } - return 0 -} - -func (x *PasswordLockoutPolicyUpdate) GetShowLockOutFailures() bool { - if x != nil { - return x.ShowLockOutFailures - } - return false -} - -type OrgIamPolicy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` //TODO: do we need id? - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - UserLoginMustBeDomain bool `protobuf:"varint,3,opt,name=user_login_must_be_domain,json=userLoginMustBeDomain,proto3" json:"user_login_must_be_domain,omitempty"` - Default bool `protobuf:"varint,4,opt,name=default,proto3" json:"default,omitempty"` -} - -func (x *OrgIamPolicy) Reset() { - *x = OrgIamPolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OrgIamPolicy) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OrgIamPolicy) ProtoMessage() {} - -func (x *OrgIamPolicy) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OrgIamPolicy.ProtoReflect.Descriptor instead. -func (*OrgIamPolicy) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{59} -} - -func (x *OrgIamPolicy) GetOrgId() string { - if x != nil { - return x.OrgId - } - return "" -} - -func (x *OrgIamPolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *OrgIamPolicy) GetUserLoginMustBeDomain() bool { +func (x *OrgIamPolicyView) GetUserLoginMustBeDomain() bool { if x != nil { return x.UserLoginMustBeDomain } return false } -func (x *OrgIamPolicy) GetDefault() bool { +func (x *OrgIamPolicyView) GetDefault() bool { if x != nil { return x.Default } @@ -6766,7 +5943,7 @@ type OrgCreateRequest struct { func (x *OrgCreateRequest) Reset() { *x = OrgCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[60] + mi := &file_management_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6779,7 +5956,7 @@ func (x *OrgCreateRequest) String() string { func (*OrgCreateRequest) ProtoMessage() {} func (x *OrgCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[60] + mi := &file_management_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6792,7 +5969,7 @@ func (x *OrgCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgCreateRequest.ProtoReflect.Descriptor instead. func (*OrgCreateRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{60} + return file_management_proto_rawDescGZIP(), []int{48} } func (x *OrgCreateRequest) GetName() string { @@ -6818,7 +5995,7 @@ type Org struct { func (x *Org) Reset() { *x = Org{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[61] + mi := &file_management_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6831,7 +6008,7 @@ func (x *Org) String() string { func (*Org) ProtoMessage() {} func (x *Org) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[61] + mi := &file_management_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6844,7 +6021,7 @@ func (x *Org) ProtoReflect() protoreflect.Message { // Deprecated: Use Org.ProtoReflect.Descriptor instead. func (*Org) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{61} + return file_management_proto_rawDescGZIP(), []int{49} } func (x *Org) GetId() string { @@ -6905,7 +6082,7 @@ type OrgView struct { func (x *OrgView) Reset() { *x = OrgView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[62] + mi := &file_management_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6918,7 +6095,7 @@ func (x *OrgView) String() string { func (*OrgView) ProtoMessage() {} func (x *OrgView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[62] + mi := &file_management_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6931,7 +6108,7 @@ func (x *OrgView) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgView.ProtoReflect.Descriptor instead. func (*OrgView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{62} + return file_management_proto_rawDescGZIP(), []int{50} } func (x *OrgView) GetId() string { @@ -6987,7 +6164,7 @@ type Domain struct { func (x *Domain) Reset() { *x = Domain{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[63] + mi := &file_management_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7000,7 +6177,7 @@ func (x *Domain) String() string { func (*Domain) ProtoMessage() {} func (x *Domain) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[63] + mi := &file_management_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7013,7 +6190,7 @@ func (x *Domain) ProtoReflect() protoreflect.Message { // Deprecated: Use Domain.ProtoReflect.Descriptor instead. func (*Domain) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{63} + return file_management_proto_rawDescGZIP(), []int{51} } func (x *Domain) GetDomain() string { @@ -7040,7 +6217,7 @@ type OrgDomain struct { func (x *OrgDomain) Reset() { *x = OrgDomain{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[64] + mi := &file_management_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7053,7 +6230,7 @@ func (x *OrgDomain) String() string { func (*OrgDomain) ProtoMessage() {} func (x *OrgDomain) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[64] + mi := &file_management_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7066,7 +6243,7 @@ func (x *OrgDomain) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgDomain.ProtoReflect.Descriptor instead. func (*OrgDomain) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{64} + return file_management_proto_rawDescGZIP(), []int{52} } func (x *OrgDomain) GetOrgId() string { @@ -7136,7 +6313,7 @@ type OrgDomainView struct { func (x *OrgDomainView) Reset() { *x = OrgDomainView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[65] + mi := &file_management_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7149,7 +6326,7 @@ func (x *OrgDomainView) String() string { func (*OrgDomainView) ProtoMessage() {} func (x *OrgDomainView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[65] + mi := &file_management_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7162,7 +6339,7 @@ func (x *OrgDomainView) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgDomainView.ProtoReflect.Descriptor instead. func (*OrgDomainView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{65} + return file_management_proto_rawDescGZIP(), []int{53} } func (x *OrgDomainView) GetOrgId() string { @@ -7232,7 +6409,7 @@ type AddOrgDomainRequest struct { func (x *AddOrgDomainRequest) Reset() { *x = AddOrgDomainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[66] + mi := &file_management_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7245,7 +6422,7 @@ func (x *AddOrgDomainRequest) String() string { func (*AddOrgDomainRequest) ProtoMessage() {} func (x *AddOrgDomainRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[66] + mi := &file_management_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7258,7 +6435,7 @@ func (x *AddOrgDomainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddOrgDomainRequest.ProtoReflect.Descriptor instead. func (*AddOrgDomainRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{66} + return file_management_proto_rawDescGZIP(), []int{54} } func (x *AddOrgDomainRequest) GetDomain() string { @@ -7280,7 +6457,7 @@ type OrgDomainValidationRequest struct { func (x *OrgDomainValidationRequest) Reset() { *x = OrgDomainValidationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[67] + mi := &file_management_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7293,7 +6470,7 @@ func (x *OrgDomainValidationRequest) String() string { func (*OrgDomainValidationRequest) ProtoMessage() {} func (x *OrgDomainValidationRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[67] + mi := &file_management_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7306,7 +6483,7 @@ func (x *OrgDomainValidationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgDomainValidationRequest.ProtoReflect.Descriptor instead. func (*OrgDomainValidationRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{67} + return file_management_proto_rawDescGZIP(), []int{55} } func (x *OrgDomainValidationRequest) GetDomain() string { @@ -7335,7 +6512,7 @@ type OrgDomainValidationResponse struct { func (x *OrgDomainValidationResponse) Reset() { *x = OrgDomainValidationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[68] + mi := &file_management_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7348,7 +6525,7 @@ func (x *OrgDomainValidationResponse) String() string { func (*OrgDomainValidationResponse) ProtoMessage() {} func (x *OrgDomainValidationResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[68] + mi := &file_management_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7361,7 +6538,7 @@ func (x *OrgDomainValidationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgDomainValidationResponse.ProtoReflect.Descriptor instead. func (*OrgDomainValidationResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{68} + return file_management_proto_rawDescGZIP(), []int{56} } func (x *OrgDomainValidationResponse) GetToken() string { @@ -7389,7 +6566,7 @@ type ValidateOrgDomainRequest struct { func (x *ValidateOrgDomainRequest) Reset() { *x = ValidateOrgDomainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[69] + mi := &file_management_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7402,7 +6579,7 @@ func (x *ValidateOrgDomainRequest) String() string { func (*ValidateOrgDomainRequest) ProtoMessage() {} func (x *ValidateOrgDomainRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[69] + mi := &file_management_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7415,7 +6592,7 @@ func (x *ValidateOrgDomainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateOrgDomainRequest.ProtoReflect.Descriptor instead. func (*ValidateOrgDomainRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{69} + return file_management_proto_rawDescGZIP(), []int{57} } func (x *ValidateOrgDomainRequest) GetDomain() string { @@ -7436,7 +6613,7 @@ type PrimaryOrgDomainRequest struct { func (x *PrimaryOrgDomainRequest) Reset() { *x = PrimaryOrgDomainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[70] + mi := &file_management_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7449,7 +6626,7 @@ func (x *PrimaryOrgDomainRequest) String() string { func (*PrimaryOrgDomainRequest) ProtoMessage() {} func (x *PrimaryOrgDomainRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[70] + mi := &file_management_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7462,7 +6639,7 @@ func (x *PrimaryOrgDomainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PrimaryOrgDomainRequest.ProtoReflect.Descriptor instead. func (*PrimaryOrgDomainRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{70} + return file_management_proto_rawDescGZIP(), []int{58} } func (x *PrimaryOrgDomainRequest) GetDomain() string { @@ -7483,7 +6660,7 @@ type RemoveOrgDomainRequest struct { func (x *RemoveOrgDomainRequest) Reset() { *x = RemoveOrgDomainRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[71] + mi := &file_management_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7496,7 +6673,7 @@ func (x *RemoveOrgDomainRequest) String() string { func (*RemoveOrgDomainRequest) ProtoMessage() {} func (x *RemoveOrgDomainRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[71] + mi := &file_management_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7509,7 +6686,7 @@ func (x *RemoveOrgDomainRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveOrgDomainRequest.ProtoReflect.Descriptor instead. func (*RemoveOrgDomainRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{71} + return file_management_proto_rawDescGZIP(), []int{59} } func (x *RemoveOrgDomainRequest) GetDomain() string { @@ -7535,7 +6712,7 @@ type OrgDomainSearchResponse struct { func (x *OrgDomainSearchResponse) Reset() { *x = OrgDomainSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[72] + mi := &file_management_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7548,7 +6725,7 @@ func (x *OrgDomainSearchResponse) String() string { func (*OrgDomainSearchResponse) ProtoMessage() {} func (x *OrgDomainSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[72] + mi := &file_management_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7561,7 +6738,7 @@ func (x *OrgDomainSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgDomainSearchResponse.ProtoReflect.Descriptor instead. func (*OrgDomainSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{72} + return file_management_proto_rawDescGZIP(), []int{60} } func (x *OrgDomainSearchResponse) GetOffset() uint64 { @@ -7619,7 +6796,7 @@ type OrgDomainSearchRequest struct { func (x *OrgDomainSearchRequest) Reset() { *x = OrgDomainSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[73] + mi := &file_management_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7632,7 +6809,7 @@ func (x *OrgDomainSearchRequest) String() string { func (*OrgDomainSearchRequest) ProtoMessage() {} func (x *OrgDomainSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[73] + mi := &file_management_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7645,7 +6822,7 @@ func (x *OrgDomainSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgDomainSearchRequest.ProtoReflect.Descriptor instead. func (*OrgDomainSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{73} + return file_management_proto_rawDescGZIP(), []int{61} } func (x *OrgDomainSearchRequest) GetOffset() uint64 { @@ -7682,7 +6859,7 @@ type OrgDomainSearchQuery struct { func (x *OrgDomainSearchQuery) Reset() { *x = OrgDomainSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[74] + mi := &file_management_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7695,7 +6872,7 @@ func (x *OrgDomainSearchQuery) String() string { func (*OrgDomainSearchQuery) ProtoMessage() {} func (x *OrgDomainSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[74] + mi := &file_management_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7708,7 +6885,7 @@ func (x *OrgDomainSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgDomainSearchQuery.ProtoReflect.Descriptor instead. func (*OrgDomainSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{74} + return file_management_proto_rawDescGZIP(), []int{62} } func (x *OrgDomainSearchQuery) GetKey() OrgDomainSearchKey { @@ -7743,7 +6920,7 @@ type OrgMemberRoles struct { func (x *OrgMemberRoles) Reset() { *x = OrgMemberRoles{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[75] + mi := &file_management_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7756,7 +6933,7 @@ func (x *OrgMemberRoles) String() string { func (*OrgMemberRoles) ProtoMessage() {} func (x *OrgMemberRoles) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[75] + mi := &file_management_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7769,7 +6946,7 @@ func (x *OrgMemberRoles) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMemberRoles.ProtoReflect.Descriptor instead. func (*OrgMemberRoles) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{75} + return file_management_proto_rawDescGZIP(), []int{63} } func (x *OrgMemberRoles) GetRoles() []string { @@ -7794,7 +6971,7 @@ type OrgMember struct { func (x *OrgMember) Reset() { *x = OrgMember{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[76] + mi := &file_management_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7807,7 +6984,7 @@ func (x *OrgMember) String() string { func (*OrgMember) ProtoMessage() {} func (x *OrgMember) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[76] + mi := &file_management_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7820,7 +6997,7 @@ func (x *OrgMember) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMember.ProtoReflect.Descriptor instead. func (*OrgMember) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{76} + return file_management_proto_rawDescGZIP(), []int{64} } func (x *OrgMember) GetUserId() string { @@ -7870,7 +7047,7 @@ type AddOrgMemberRequest struct { func (x *AddOrgMemberRequest) Reset() { *x = AddOrgMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[77] + mi := &file_management_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7883,7 +7060,7 @@ func (x *AddOrgMemberRequest) String() string { func (*AddOrgMemberRequest) ProtoMessage() {} func (x *AddOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[77] + mi := &file_management_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7896,7 +7073,7 @@ func (x *AddOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddOrgMemberRequest.ProtoReflect.Descriptor instead. func (*AddOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{77} + return file_management_proto_rawDescGZIP(), []int{65} } func (x *AddOrgMemberRequest) GetUserId() string { @@ -7925,7 +7102,7 @@ type ChangeOrgMemberRequest struct { func (x *ChangeOrgMemberRequest) Reset() { *x = ChangeOrgMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[78] + mi := &file_management_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7938,7 +7115,7 @@ func (x *ChangeOrgMemberRequest) String() string { func (*ChangeOrgMemberRequest) ProtoMessage() {} func (x *ChangeOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[78] + mi := &file_management_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7951,7 +7128,7 @@ func (x *ChangeOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeOrgMemberRequest.ProtoReflect.Descriptor instead. func (*ChangeOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{78} + return file_management_proto_rawDescGZIP(), []int{66} } func (x *ChangeOrgMemberRequest) GetUserId() string { @@ -7979,7 +7156,7 @@ type RemoveOrgMemberRequest struct { func (x *RemoveOrgMemberRequest) Reset() { *x = RemoveOrgMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[79] + mi := &file_management_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7992,7 +7169,7 @@ func (x *RemoveOrgMemberRequest) String() string { func (*RemoveOrgMemberRequest) ProtoMessage() {} func (x *RemoveOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[79] + mi := &file_management_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8005,7 +7182,7 @@ func (x *RemoveOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveOrgMemberRequest.ProtoReflect.Descriptor instead. func (*RemoveOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{79} + return file_management_proto_rawDescGZIP(), []int{67} } func (x *RemoveOrgMemberRequest) GetUserId() string { @@ -8031,7 +7208,7 @@ type OrgMemberSearchResponse struct { func (x *OrgMemberSearchResponse) Reset() { *x = OrgMemberSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[80] + mi := &file_management_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8044,7 +7221,7 @@ func (x *OrgMemberSearchResponse) String() string { func (*OrgMemberSearchResponse) ProtoMessage() {} func (x *OrgMemberSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[80] + mi := &file_management_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8057,7 +7234,7 @@ func (x *OrgMemberSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMemberSearchResponse.ProtoReflect.Descriptor instead. func (*OrgMemberSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{80} + return file_management_proto_rawDescGZIP(), []int{68} } func (x *OrgMemberSearchResponse) GetOffset() uint64 { @@ -8122,7 +7299,7 @@ type OrgMemberView struct { func (x *OrgMemberView) Reset() { *x = OrgMemberView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[81] + mi := &file_management_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8135,7 +7312,7 @@ func (x *OrgMemberView) String() string { func (*OrgMemberView) ProtoMessage() {} func (x *OrgMemberView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[81] + mi := &file_management_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8148,7 +7325,7 @@ func (x *OrgMemberView) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMemberView.ProtoReflect.Descriptor instead. func (*OrgMemberView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{81} + return file_management_proto_rawDescGZIP(), []int{69} } func (x *OrgMemberView) GetUserId() string { @@ -8234,7 +7411,7 @@ type OrgMemberSearchRequest struct { func (x *OrgMemberSearchRequest) Reset() { *x = OrgMemberSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[82] + mi := &file_management_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8247,7 +7424,7 @@ func (x *OrgMemberSearchRequest) String() string { func (*OrgMemberSearchRequest) ProtoMessage() {} func (x *OrgMemberSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[82] + mi := &file_management_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8260,7 +7437,7 @@ func (x *OrgMemberSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMemberSearchRequest.ProtoReflect.Descriptor instead. func (*OrgMemberSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{82} + return file_management_proto_rawDescGZIP(), []int{70} } func (x *OrgMemberSearchRequest) GetOffset() uint64 { @@ -8297,7 +7474,7 @@ type OrgMemberSearchQuery struct { func (x *OrgMemberSearchQuery) Reset() { *x = OrgMemberSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[83] + mi := &file_management_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8310,7 +7487,7 @@ func (x *OrgMemberSearchQuery) String() string { func (*OrgMemberSearchQuery) ProtoMessage() {} func (x *OrgMemberSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[83] + mi := &file_management_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8323,7 +7500,7 @@ func (x *OrgMemberSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMemberSearchQuery.ProtoReflect.Descriptor instead. func (*OrgMemberSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{83} + return file_management_proto_rawDescGZIP(), []int{71} } func (x *OrgMemberSearchQuery) GetKey() OrgMemberSearchKey { @@ -8352,13 +7529,15 @@ type ProjectCreateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProjectRoleAssertion bool `protobuf:"varint,2,opt,name=project_role_assertion,json=projectRoleAssertion,proto3" json:"project_role_assertion,omitempty"` + ProjectRoleCheck bool `protobuf:"varint,3,opt,name=project_role_check,json=projectRoleCheck,proto3" json:"project_role_check,omitempty"` } func (x *ProjectCreateRequest) Reset() { *x = ProjectCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[84] + mi := &file_management_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8371,7 +7550,7 @@ func (x *ProjectCreateRequest) String() string { func (*ProjectCreateRequest) ProtoMessage() {} func (x *ProjectCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[84] + mi := &file_management_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8384,7 +7563,7 @@ func (x *ProjectCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectCreateRequest.ProtoReflect.Descriptor instead. func (*ProjectCreateRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{84} + return file_management_proto_rawDescGZIP(), []int{72} } func (x *ProjectCreateRequest) GetName() string { @@ -8394,19 +7573,35 @@ func (x *ProjectCreateRequest) GetName() string { return "" } +func (x *ProjectCreateRequest) GetProjectRoleAssertion() bool { + if x != nil { + return x.ProjectRoleAssertion + } + return false +} + +func (x *ProjectCreateRequest) GetProjectRoleCheck() bool { + if x != nil { + return x.ProjectRoleCheck + } + return false +} + type ProjectUpdateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + ProjectRoleAssertion bool `protobuf:"varint,3,opt,name=project_role_assertion,json=projectRoleAssertion,proto3" json:"project_role_assertion,omitempty"` + ProjectRoleCheck bool `protobuf:"varint,4,opt,name=project_role_check,json=projectRoleCheck,proto3" json:"project_role_check,omitempty"` } func (x *ProjectUpdateRequest) Reset() { *x = ProjectUpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[85] + mi := &file_management_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8419,7 +7614,7 @@ func (x *ProjectUpdateRequest) String() string { func (*ProjectUpdateRequest) ProtoMessage() {} func (x *ProjectUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[85] + mi := &file_management_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8432,7 +7627,7 @@ func (x *ProjectUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectUpdateRequest.ProtoReflect.Descriptor instead. func (*ProjectUpdateRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{85} + return file_management_proto_rawDescGZIP(), []int{73} } func (x *ProjectUpdateRequest) GetId() string { @@ -8449,6 +7644,20 @@ func (x *ProjectUpdateRequest) GetName() string { return "" } +func (x *ProjectUpdateRequest) GetProjectRoleAssertion() bool { + if x != nil { + return x.ProjectRoleAssertion + } + return false +} + +func (x *ProjectUpdateRequest) GetProjectRoleCheck() bool { + if x != nil { + return x.ProjectRoleCheck + } + return false +} + type ProjectSearchResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8465,7 +7674,7 @@ type ProjectSearchResponse struct { func (x *ProjectSearchResponse) Reset() { *x = ProjectSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[86] + mi := &file_management_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8478,7 +7687,7 @@ func (x *ProjectSearchResponse) String() string { func (*ProjectSearchResponse) ProtoMessage() {} func (x *ProjectSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[86] + mi := &file_management_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8491,7 +7700,7 @@ func (x *ProjectSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectSearchResponse.ProtoReflect.Descriptor instead. func (*ProjectSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{86} + return file_management_proto_rawDescGZIP(), []int{74} } func (x *ProjectSearchResponse) GetOffset() uint64 { @@ -8541,19 +7750,21 @@ type ProjectView struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - State ProjectState `protobuf:"varint,3,opt,name=state,proto3,enum=caos.zitadel.management.api.v1.ProjectState" json:"state,omitempty"` - ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` - CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` - ResourceOwner string `protobuf:"bytes,6,opt,name=resource_owner,json=resourceOwner,proto3" json:"resource_owner,omitempty"` - Sequence uint64 `protobuf:"varint,7,opt,name=sequence,proto3" json:"sequence,omitempty"` + ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + State ProjectState `protobuf:"varint,3,opt,name=state,proto3,enum=caos.zitadel.management.api.v1.ProjectState" json:"state,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ResourceOwner string `protobuf:"bytes,6,opt,name=resource_owner,json=resourceOwner,proto3" json:"resource_owner,omitempty"` + Sequence uint64 `protobuf:"varint,7,opt,name=sequence,proto3" json:"sequence,omitempty"` + ProjectRoleAssertion bool `protobuf:"varint,8,opt,name=project_role_assertion,json=projectRoleAssertion,proto3" json:"project_role_assertion,omitempty"` + ProjectRoleCheck bool `protobuf:"varint,9,opt,name=project_role_check,json=projectRoleCheck,proto3" json:"project_role_check,omitempty"` } func (x *ProjectView) Reset() { *x = ProjectView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[87] + mi := &file_management_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8566,7 +7777,7 @@ func (x *ProjectView) String() string { func (*ProjectView) ProtoMessage() {} func (x *ProjectView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[87] + mi := &file_management_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8579,7 +7790,7 @@ func (x *ProjectView) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectView.ProtoReflect.Descriptor instead. func (*ProjectView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{87} + return file_management_proto_rawDescGZIP(), []int{75} } func (x *ProjectView) GetProjectId() string { @@ -8631,6 +7842,20 @@ func (x *ProjectView) GetSequence() uint64 { return 0 } +func (x *ProjectView) GetProjectRoleAssertion() bool { + if x != nil { + return x.ProjectRoleAssertion + } + return false +} + +func (x *ProjectView) GetProjectRoleCheck() bool { + if x != nil { + return x.ProjectRoleCheck + } + return false +} + type ProjectSearchRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8644,7 +7869,7 @@ type ProjectSearchRequest struct { func (x *ProjectSearchRequest) Reset() { *x = ProjectSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[88] + mi := &file_management_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8657,7 +7882,7 @@ func (x *ProjectSearchRequest) String() string { func (*ProjectSearchRequest) ProtoMessage() {} func (x *ProjectSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[88] + mi := &file_management_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8670,7 +7895,7 @@ func (x *ProjectSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectSearchRequest.ProtoReflect.Descriptor instead. func (*ProjectSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{88} + return file_management_proto_rawDescGZIP(), []int{76} } func (x *ProjectSearchRequest) GetOffset() uint64 { @@ -8707,7 +7932,7 @@ type ProjectSearchQuery struct { func (x *ProjectSearchQuery) Reset() { *x = ProjectSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[89] + mi := &file_management_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8720,7 +7945,7 @@ func (x *ProjectSearchQuery) String() string { func (*ProjectSearchQuery) ProtoMessage() {} func (x *ProjectSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[89] + mi := &file_management_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8733,7 +7958,7 @@ func (x *ProjectSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectSearchQuery.ProtoReflect.Descriptor instead. func (*ProjectSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{89} + return file_management_proto_rawDescGZIP(), []int{77} } func (x *ProjectSearchQuery) GetKey() ProjectSearchKey { @@ -8768,7 +7993,7 @@ type Projects struct { func (x *Projects) Reset() { *x = Projects{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[90] + mi := &file_management_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8781,7 +8006,7 @@ func (x *Projects) String() string { func (*Projects) ProtoMessage() {} func (x *Projects) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[90] + mi := &file_management_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8794,7 +8019,7 @@ func (x *Projects) ProtoReflect() protoreflect.Message { // Deprecated: Use Projects.ProtoReflect.Descriptor instead. func (*Projects) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{90} + return file_management_proto_rawDescGZIP(), []int{78} } func (x *Projects) GetProjects() []*Project { @@ -8809,18 +8034,20 @@ type Project struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - State ProjectState `protobuf:"varint,3,opt,name=state,proto3,enum=caos.zitadel.management.api.v1.ProjectState" json:"state,omitempty"` - ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` - CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` - Sequence uint64 `protobuf:"varint,6,opt,name=sequence,proto3" json:"sequence,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + State ProjectState `protobuf:"varint,3,opt,name=state,proto3,enum=caos.zitadel.management.api.v1.ProjectState" json:"state,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + Sequence uint64 `protobuf:"varint,6,opt,name=sequence,proto3" json:"sequence,omitempty"` + ProjectRoleAssertion bool `protobuf:"varint,7,opt,name=project_role_assertion,json=projectRoleAssertion,proto3" json:"project_role_assertion,omitempty"` + ProjectRoleCheck bool `protobuf:"varint,8,opt,name=project_role_check,json=projectRoleCheck,proto3" json:"project_role_check,omitempty"` } func (x *Project) Reset() { *x = Project{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[91] + mi := &file_management_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8833,7 +8060,7 @@ func (x *Project) String() string { func (*Project) ProtoMessage() {} func (x *Project) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[91] + mi := &file_management_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8846,7 +8073,7 @@ func (x *Project) ProtoReflect() protoreflect.Message { // Deprecated: Use Project.ProtoReflect.Descriptor instead. func (*Project) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{91} + return file_management_proto_rawDescGZIP(), []int{79} } func (x *Project) GetId() string { @@ -8891,6 +8118,20 @@ func (x *Project) GetSequence() uint64 { return 0 } +func (x *Project) GetProjectRoleAssertion() bool { + if x != nil { + return x.ProjectRoleAssertion + } + return false +} + +func (x *Project) GetProjectRoleCheck() bool { + if x != nil { + return x.ProjectRoleCheck + } + return false +} + type ProjectMemberRoles struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8902,7 +8143,7 @@ type ProjectMemberRoles struct { func (x *ProjectMemberRoles) Reset() { *x = ProjectMemberRoles{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[92] + mi := &file_management_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8915,7 +8156,7 @@ func (x *ProjectMemberRoles) String() string { func (*ProjectMemberRoles) ProtoMessage() {} func (x *ProjectMemberRoles) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[92] + mi := &file_management_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8928,7 +8169,7 @@ func (x *ProjectMemberRoles) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberRoles.ProtoReflect.Descriptor instead. func (*ProjectMemberRoles) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{92} + return file_management_proto_rawDescGZIP(), []int{80} } func (x *ProjectMemberRoles) GetRoles() []string { @@ -8953,7 +8194,7 @@ type ProjectMember struct { func (x *ProjectMember) Reset() { *x = ProjectMember{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[93] + mi := &file_management_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8966,7 +8207,7 @@ func (x *ProjectMember) String() string { func (*ProjectMember) ProtoMessage() {} func (x *ProjectMember) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[93] + mi := &file_management_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8979,7 +8220,7 @@ func (x *ProjectMember) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMember.ProtoReflect.Descriptor instead. func (*ProjectMember) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{93} + return file_management_proto_rawDescGZIP(), []int{81} } func (x *ProjectMember) GetUserId() string { @@ -9030,7 +8271,7 @@ type ProjectMemberAdd struct { func (x *ProjectMemberAdd) Reset() { *x = ProjectMemberAdd{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[94] + mi := &file_management_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9043,7 +8284,7 @@ func (x *ProjectMemberAdd) String() string { func (*ProjectMemberAdd) ProtoMessage() {} func (x *ProjectMemberAdd) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[94] + mi := &file_management_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9056,7 +8297,7 @@ func (x *ProjectMemberAdd) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberAdd.ProtoReflect.Descriptor instead. func (*ProjectMemberAdd) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{94} + return file_management_proto_rawDescGZIP(), []int{82} } func (x *ProjectMemberAdd) GetId() string { @@ -9093,7 +8334,7 @@ type ProjectMemberChange struct { func (x *ProjectMemberChange) Reset() { *x = ProjectMemberChange{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[95] + mi := &file_management_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9106,7 +8347,7 @@ func (x *ProjectMemberChange) String() string { func (*ProjectMemberChange) ProtoMessage() {} func (x *ProjectMemberChange) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[95] + mi := &file_management_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9119,7 +8360,7 @@ func (x *ProjectMemberChange) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberChange.ProtoReflect.Descriptor instead. func (*ProjectMemberChange) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{95} + return file_management_proto_rawDescGZIP(), []int{83} } func (x *ProjectMemberChange) GetId() string { @@ -9155,7 +8396,7 @@ type ProjectMemberRemove struct { func (x *ProjectMemberRemove) Reset() { *x = ProjectMemberRemove{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[96] + mi := &file_management_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9168,7 +8409,7 @@ func (x *ProjectMemberRemove) String() string { func (*ProjectMemberRemove) ProtoMessage() {} func (x *ProjectMemberRemove) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[96] + mi := &file_management_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9181,7 +8422,7 @@ func (x *ProjectMemberRemove) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberRemove.ProtoReflect.Descriptor instead. func (*ProjectMemberRemove) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{96} + return file_management_proto_rawDescGZIP(), []int{84} } func (x *ProjectMemberRemove) GetId() string { @@ -9212,7 +8453,7 @@ type ProjectRoleAdd struct { func (x *ProjectRoleAdd) Reset() { *x = ProjectRoleAdd{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[97] + mi := &file_management_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9225,7 +8466,7 @@ func (x *ProjectRoleAdd) String() string { func (*ProjectRoleAdd) ProtoMessage() {} func (x *ProjectRoleAdd) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[97] + mi := &file_management_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9238,7 +8479,7 @@ func (x *ProjectRoleAdd) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleAdd.ProtoReflect.Descriptor instead. func (*ProjectRoleAdd) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{97} + return file_management_proto_rawDescGZIP(), []int{85} } func (x *ProjectRoleAdd) GetId() string { @@ -9281,7 +8522,7 @@ type ProjectRoleAddBulk struct { func (x *ProjectRoleAddBulk) Reset() { *x = ProjectRoleAddBulk{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[98] + mi := &file_management_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9294,7 +8535,7 @@ func (x *ProjectRoleAddBulk) String() string { func (*ProjectRoleAddBulk) ProtoMessage() {} func (x *ProjectRoleAddBulk) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[98] + mi := &file_management_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9307,7 +8548,7 @@ func (x *ProjectRoleAddBulk) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleAddBulk.ProtoReflect.Descriptor instead. func (*ProjectRoleAddBulk) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{98} + return file_management_proto_rawDescGZIP(), []int{86} } func (x *ProjectRoleAddBulk) GetId() string { @@ -9338,7 +8579,7 @@ type ProjectRoleChange struct { func (x *ProjectRoleChange) Reset() { *x = ProjectRoleChange{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[99] + mi := &file_management_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9351,7 +8592,7 @@ func (x *ProjectRoleChange) String() string { func (*ProjectRoleChange) ProtoMessage() {} func (x *ProjectRoleChange) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[99] + mi := &file_management_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9364,7 +8605,7 @@ func (x *ProjectRoleChange) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleChange.ProtoReflect.Descriptor instead. func (*ProjectRoleChange) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{99} + return file_management_proto_rawDescGZIP(), []int{87} } func (x *ProjectRoleChange) GetId() string { @@ -9412,7 +8653,7 @@ type ProjectRole struct { func (x *ProjectRole) Reset() { *x = ProjectRole{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[100] + mi := &file_management_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9425,7 +8666,7 @@ func (x *ProjectRole) String() string { func (*ProjectRole) ProtoMessage() {} func (x *ProjectRole) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[100] + mi := &file_management_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9438,7 +8679,7 @@ func (x *ProjectRole) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRole.ProtoReflect.Descriptor instead. func (*ProjectRole) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{100} + return file_management_proto_rawDescGZIP(), []int{88} } func (x *ProjectRole) GetProjectId() string { @@ -9506,7 +8747,7 @@ type ProjectRoleView struct { func (x *ProjectRoleView) Reset() { *x = ProjectRoleView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[101] + mi := &file_management_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9519,7 +8760,7 @@ func (x *ProjectRoleView) String() string { func (*ProjectRoleView) ProtoMessage() {} func (x *ProjectRoleView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[101] + mi := &file_management_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9532,7 +8773,7 @@ func (x *ProjectRoleView) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleView.ProtoReflect.Descriptor instead. func (*ProjectRoleView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{101} + return file_management_proto_rawDescGZIP(), []int{89} } func (x *ProjectRoleView) GetProjectId() string { @@ -9589,7 +8830,7 @@ type ProjectRoleRemove struct { func (x *ProjectRoleRemove) Reset() { *x = ProjectRoleRemove{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[102] + mi := &file_management_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9602,7 +8843,7 @@ func (x *ProjectRoleRemove) String() string { func (*ProjectRoleRemove) ProtoMessage() {} func (x *ProjectRoleRemove) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[102] + mi := &file_management_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9615,7 +8856,7 @@ func (x *ProjectRoleRemove) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleRemove.ProtoReflect.Descriptor instead. func (*ProjectRoleRemove) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{102} + return file_management_proto_rawDescGZIP(), []int{90} } func (x *ProjectRoleRemove) GetId() string { @@ -9648,7 +8889,7 @@ type ProjectRoleSearchResponse struct { func (x *ProjectRoleSearchResponse) Reset() { *x = ProjectRoleSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[103] + mi := &file_management_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9661,7 +8902,7 @@ func (x *ProjectRoleSearchResponse) String() string { func (*ProjectRoleSearchResponse) ProtoMessage() {} func (x *ProjectRoleSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[103] + mi := &file_management_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9674,7 +8915,7 @@ func (x *ProjectRoleSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleSearchResponse.ProtoReflect.Descriptor instead. func (*ProjectRoleSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{103} + return file_management_proto_rawDescGZIP(), []int{91} } func (x *ProjectRoleSearchResponse) GetOffset() uint64 { @@ -9733,7 +8974,7 @@ type ProjectRoleSearchRequest struct { func (x *ProjectRoleSearchRequest) Reset() { *x = ProjectRoleSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[104] + mi := &file_management_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9746,7 +8987,7 @@ func (x *ProjectRoleSearchRequest) String() string { func (*ProjectRoleSearchRequest) ProtoMessage() {} func (x *ProjectRoleSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[104] + mi := &file_management_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9759,7 +9000,7 @@ func (x *ProjectRoleSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleSearchRequest.ProtoReflect.Descriptor instead. func (*ProjectRoleSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{104} + return file_management_proto_rawDescGZIP(), []int{92} } func (x *ProjectRoleSearchRequest) GetProjectId() string { @@ -9803,7 +9044,7 @@ type ProjectRoleSearchQuery struct { func (x *ProjectRoleSearchQuery) Reset() { *x = ProjectRoleSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[105] + mi := &file_management_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9816,7 +9057,7 @@ func (x *ProjectRoleSearchQuery) String() string { func (*ProjectRoleSearchQuery) ProtoMessage() {} func (x *ProjectRoleSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[105] + mi := &file_management_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9829,7 +9070,7 @@ func (x *ProjectRoleSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectRoleSearchQuery.ProtoReflect.Descriptor instead. func (*ProjectRoleSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{105} + return file_management_proto_rawDescGZIP(), []int{93} } func (x *ProjectRoleSearchQuery) GetKey() ProjectRoleSearchKey { @@ -9873,7 +9114,7 @@ type ProjectMemberView struct { func (x *ProjectMemberView) Reset() { *x = ProjectMemberView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[106] + mi := &file_management_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9886,7 +9127,7 @@ func (x *ProjectMemberView) String() string { func (*ProjectMemberView) ProtoMessage() {} func (x *ProjectMemberView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[106] + mi := &file_management_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9899,7 +9140,7 @@ func (x *ProjectMemberView) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberView.ProtoReflect.Descriptor instead. func (*ProjectMemberView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{106} + return file_management_proto_rawDescGZIP(), []int{94} } func (x *ProjectMemberView) GetUserId() string { @@ -9988,7 +9229,7 @@ type ProjectMemberSearchResponse struct { func (x *ProjectMemberSearchResponse) Reset() { *x = ProjectMemberSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[107] + mi := &file_management_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10001,7 +9242,7 @@ func (x *ProjectMemberSearchResponse) String() string { func (*ProjectMemberSearchResponse) ProtoMessage() {} func (x *ProjectMemberSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[107] + mi := &file_management_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10014,7 +9255,7 @@ func (x *ProjectMemberSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberSearchResponse.ProtoReflect.Descriptor instead. func (*ProjectMemberSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{107} + return file_management_proto_rawDescGZIP(), []int{95} } func (x *ProjectMemberSearchResponse) GetOffset() uint64 { @@ -10073,7 +9314,7 @@ type ProjectMemberSearchRequest struct { func (x *ProjectMemberSearchRequest) Reset() { *x = ProjectMemberSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[108] + mi := &file_management_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10086,7 +9327,7 @@ func (x *ProjectMemberSearchRequest) String() string { func (*ProjectMemberSearchRequest) ProtoMessage() {} func (x *ProjectMemberSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[108] + mi := &file_management_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10099,7 +9340,7 @@ func (x *ProjectMemberSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberSearchRequest.ProtoReflect.Descriptor instead. func (*ProjectMemberSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{108} + return file_management_proto_rawDescGZIP(), []int{96} } func (x *ProjectMemberSearchRequest) GetProjectId() string { @@ -10143,7 +9384,7 @@ type ProjectMemberSearchQuery struct { func (x *ProjectMemberSearchQuery) Reset() { *x = ProjectMemberSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[109] + mi := &file_management_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10156,7 +9397,7 @@ func (x *ProjectMemberSearchQuery) String() string { func (*ProjectMemberSearchQuery) ProtoMessage() {} func (x *ProjectMemberSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[109] + mi := &file_management_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10169,7 +9410,7 @@ func (x *ProjectMemberSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectMemberSearchQuery.ProtoReflect.Descriptor instead. func (*ProjectMemberSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{109} + return file_management_proto_rawDescGZIP(), []int{97} } func (x *ProjectMemberSearchQuery) GetKey() ProjectMemberSearchKey { @@ -10212,7 +9453,7 @@ type Application struct { func (x *Application) Reset() { *x = Application{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[110] + mi := &file_management_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10225,7 +9466,7 @@ func (x *Application) String() string { func (*Application) ProtoMessage() {} func (x *Application) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[110] + mi := &file_management_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10238,7 +9479,7 @@ func (x *Application) ProtoReflect() protoreflect.Message { // Deprecated: Use Application.ProtoReflect.Descriptor instead. func (*Application) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{110} + return file_management_proto_rawDescGZIP(), []int{98} } func (x *Application) GetId() string { @@ -10320,7 +9561,7 @@ type ApplicationUpdate struct { func (x *ApplicationUpdate) Reset() { *x = ApplicationUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[111] + mi := &file_management_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10333,7 +9574,7 @@ func (x *ApplicationUpdate) String() string { func (*ApplicationUpdate) ProtoMessage() {} func (x *ApplicationUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[111] + mi := &file_management_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10346,7 +9587,7 @@ func (x *ApplicationUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplicationUpdate.ProtoReflect.Descriptor instead. func (*ApplicationUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{111} + return file_management_proto_rawDescGZIP(), []int{99} } func (x *ApplicationUpdate) GetProjectId() string { @@ -10375,24 +9616,27 @@ type OIDCConfig struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RedirectUris []string `protobuf:"bytes,1,rep,name=redirect_uris,json=redirectUris,proto3" json:"redirect_uris,omitempty"` - ResponseTypes []OIDCResponseType `protobuf:"varint,2,rep,packed,name=response_types,json=responseTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCResponseType" json:"response_types,omitempty"` - GrantTypes []OIDCGrantType `protobuf:"varint,3,rep,packed,name=grant_types,json=grantTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCGrantType" json:"grant_types,omitempty"` - ApplicationType OIDCApplicationType `protobuf:"varint,4,opt,name=application_type,json=applicationType,proto3,enum=caos.zitadel.management.api.v1.OIDCApplicationType" json:"application_type,omitempty"` - ClientId string `protobuf:"bytes,5,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` - ClientSecret string `protobuf:"bytes,6,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` - AuthMethodType OIDCAuthMethodType `protobuf:"varint,7,opt,name=auth_method_type,json=authMethodType,proto3,enum=caos.zitadel.management.api.v1.OIDCAuthMethodType" json:"auth_method_type,omitempty"` - PostLogoutRedirectUris []string `protobuf:"bytes,8,rep,name=post_logout_redirect_uris,json=postLogoutRedirectUris,proto3" json:"post_logout_redirect_uris,omitempty"` - Version OIDCVersion `protobuf:"varint,9,opt,name=version,proto3,enum=caos.zitadel.management.api.v1.OIDCVersion" json:"version,omitempty"` - NoneCompliant bool `protobuf:"varint,10,opt,name=none_compliant,json=noneCompliant,proto3" json:"none_compliant,omitempty"` - ComplianceProblems []*message.LocalizedMessage `protobuf:"bytes,11,rep,name=compliance_problems,json=complianceProblems,proto3" json:"compliance_problems,omitempty"` - DevMode bool `protobuf:"varint,12,opt,name=dev_mode,json=devMode,proto3" json:"dev_mode,omitempty"` + RedirectUris []string `protobuf:"bytes,1,rep,name=redirect_uris,json=redirectUris,proto3" json:"redirect_uris,omitempty"` + ResponseTypes []OIDCResponseType `protobuf:"varint,2,rep,packed,name=response_types,json=responseTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCResponseType" json:"response_types,omitempty"` + GrantTypes []OIDCGrantType `protobuf:"varint,3,rep,packed,name=grant_types,json=grantTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCGrantType" json:"grant_types,omitempty"` + ApplicationType OIDCApplicationType `protobuf:"varint,4,opt,name=application_type,json=applicationType,proto3,enum=caos.zitadel.management.api.v1.OIDCApplicationType" json:"application_type,omitempty"` + ClientId string `protobuf:"bytes,5,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + ClientSecret string `protobuf:"bytes,6,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` + AuthMethodType OIDCAuthMethodType `protobuf:"varint,7,opt,name=auth_method_type,json=authMethodType,proto3,enum=caos.zitadel.management.api.v1.OIDCAuthMethodType" json:"auth_method_type,omitempty"` + PostLogoutRedirectUris []string `protobuf:"bytes,8,rep,name=post_logout_redirect_uris,json=postLogoutRedirectUris,proto3" json:"post_logout_redirect_uris,omitempty"` + Version OIDCVersion `protobuf:"varint,9,opt,name=version,proto3,enum=caos.zitadel.management.api.v1.OIDCVersion" json:"version,omitempty"` + NoneCompliant bool `protobuf:"varint,10,opt,name=none_compliant,json=noneCompliant,proto3" json:"none_compliant,omitempty"` + ComplianceProblems []*message.LocalizedMessage `protobuf:"bytes,11,rep,name=compliance_problems,json=complianceProblems,proto3" json:"compliance_problems,omitempty"` + DevMode bool `protobuf:"varint,12,opt,name=dev_mode,json=devMode,proto3" json:"dev_mode,omitempty"` + AccessTokenType OIDCTokenType `protobuf:"varint,13,opt,name=access_token_type,json=accessTokenType,proto3,enum=caos.zitadel.management.api.v1.OIDCTokenType" json:"access_token_type,omitempty"` + AccessTokenRoleAssertion bool `protobuf:"varint,14,opt,name=access_token_role_assertion,json=accessTokenRoleAssertion,proto3" json:"access_token_role_assertion,omitempty"` + IdTokenRoleAssertion bool `protobuf:"varint,15,opt,name=id_token_role_assertion,json=idTokenRoleAssertion,proto3" json:"id_token_role_assertion,omitempty"` } func (x *OIDCConfig) Reset() { *x = OIDCConfig{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[112] + mi := &file_management_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10405,7 +9649,7 @@ func (x *OIDCConfig) String() string { func (*OIDCConfig) ProtoMessage() {} func (x *OIDCConfig) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[112] + mi := &file_management_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10418,7 +9662,7 @@ func (x *OIDCConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use OIDCConfig.ProtoReflect.Descriptor instead. func (*OIDCConfig) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{112} + return file_management_proto_rawDescGZIP(), []int{100} } func (x *OIDCConfig) GetRedirectUris() []string { @@ -10505,27 +9749,51 @@ func (x *OIDCConfig) GetDevMode() bool { return false } +func (x *OIDCConfig) GetAccessTokenType() OIDCTokenType { + if x != nil { + return x.AccessTokenType + } + return OIDCTokenType_OIDCTokenType_Bearer +} + +func (x *OIDCConfig) GetAccessTokenRoleAssertion() bool { + if x != nil { + return x.AccessTokenRoleAssertion + } + return false +} + +func (x *OIDCConfig) GetIdTokenRoleAssertion() bool { + if x != nil { + return x.IdTokenRoleAssertion + } + return false +} + type OIDCApplicationCreate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - RedirectUris []string `protobuf:"bytes,3,rep,name=redirect_uris,json=redirectUris,proto3" json:"redirect_uris,omitempty"` - ResponseTypes []OIDCResponseType `protobuf:"varint,4,rep,packed,name=response_types,json=responseTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCResponseType" json:"response_types,omitempty"` - GrantTypes []OIDCGrantType `protobuf:"varint,5,rep,packed,name=grant_types,json=grantTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCGrantType" json:"grant_types,omitempty"` - ApplicationType OIDCApplicationType `protobuf:"varint,6,opt,name=application_type,json=applicationType,proto3,enum=caos.zitadel.management.api.v1.OIDCApplicationType" json:"application_type,omitempty"` - AuthMethodType OIDCAuthMethodType `protobuf:"varint,7,opt,name=auth_method_type,json=authMethodType,proto3,enum=caos.zitadel.management.api.v1.OIDCAuthMethodType" json:"auth_method_type,omitempty"` - PostLogoutRedirectUris []string `protobuf:"bytes,8,rep,name=post_logout_redirect_uris,json=postLogoutRedirectUris,proto3" json:"post_logout_redirect_uris,omitempty"` - Version OIDCVersion `protobuf:"varint,9,opt,name=version,proto3,enum=caos.zitadel.management.api.v1.OIDCVersion" json:"version,omitempty"` - DevMode bool `protobuf:"varint,10,opt,name=dev_mode,json=devMode,proto3" json:"dev_mode,omitempty"` + ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + RedirectUris []string `protobuf:"bytes,3,rep,name=redirect_uris,json=redirectUris,proto3" json:"redirect_uris,omitempty"` + ResponseTypes []OIDCResponseType `protobuf:"varint,4,rep,packed,name=response_types,json=responseTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCResponseType" json:"response_types,omitempty"` + GrantTypes []OIDCGrantType `protobuf:"varint,5,rep,packed,name=grant_types,json=grantTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCGrantType" json:"grant_types,omitempty"` + ApplicationType OIDCApplicationType `protobuf:"varint,6,opt,name=application_type,json=applicationType,proto3,enum=caos.zitadel.management.api.v1.OIDCApplicationType" json:"application_type,omitempty"` + AuthMethodType OIDCAuthMethodType `protobuf:"varint,7,opt,name=auth_method_type,json=authMethodType,proto3,enum=caos.zitadel.management.api.v1.OIDCAuthMethodType" json:"auth_method_type,omitempty"` + PostLogoutRedirectUris []string `protobuf:"bytes,8,rep,name=post_logout_redirect_uris,json=postLogoutRedirectUris,proto3" json:"post_logout_redirect_uris,omitempty"` + Version OIDCVersion `protobuf:"varint,9,opt,name=version,proto3,enum=caos.zitadel.management.api.v1.OIDCVersion" json:"version,omitempty"` + DevMode bool `protobuf:"varint,10,opt,name=dev_mode,json=devMode,proto3" json:"dev_mode,omitempty"` + AccessTokenType OIDCTokenType `protobuf:"varint,11,opt,name=access_token_type,json=accessTokenType,proto3,enum=caos.zitadel.management.api.v1.OIDCTokenType" json:"access_token_type,omitempty"` + AccessTokenRoleAssertion bool `protobuf:"varint,12,opt,name=access_token_role_assertion,json=accessTokenRoleAssertion,proto3" json:"access_token_role_assertion,omitempty"` + IdTokenRoleAssertion bool `protobuf:"varint,13,opt,name=id_token_role_assertion,json=idTokenRoleAssertion,proto3" json:"id_token_role_assertion,omitempty"` } func (x *OIDCApplicationCreate) Reset() { *x = OIDCApplicationCreate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[113] + mi := &file_management_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10538,7 +9806,7 @@ func (x *OIDCApplicationCreate) String() string { func (*OIDCApplicationCreate) ProtoMessage() {} func (x *OIDCApplicationCreate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[113] + mi := &file_management_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10551,7 +9819,7 @@ func (x *OIDCApplicationCreate) ProtoReflect() protoreflect.Message { // Deprecated: Use OIDCApplicationCreate.ProtoReflect.Descriptor instead. func (*OIDCApplicationCreate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{113} + return file_management_proto_rawDescGZIP(), []int{101} } func (x *OIDCApplicationCreate) GetProjectId() string { @@ -10624,26 +9892,50 @@ func (x *OIDCApplicationCreate) GetDevMode() bool { return false } +func (x *OIDCApplicationCreate) GetAccessTokenType() OIDCTokenType { + if x != nil { + return x.AccessTokenType + } + return OIDCTokenType_OIDCTokenType_Bearer +} + +func (x *OIDCApplicationCreate) GetAccessTokenRoleAssertion() bool { + if x != nil { + return x.AccessTokenRoleAssertion + } + return false +} + +func (x *OIDCApplicationCreate) GetIdTokenRoleAssertion() bool { + if x != nil { + return x.IdTokenRoleAssertion + } + return false +} + type OIDCConfigUpdate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - ApplicationId string `protobuf:"bytes,2,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"` - RedirectUris []string `protobuf:"bytes,3,rep,name=redirect_uris,json=redirectUris,proto3" json:"redirect_uris,omitempty"` - ResponseTypes []OIDCResponseType `protobuf:"varint,4,rep,packed,name=response_types,json=responseTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCResponseType" json:"response_types,omitempty"` - GrantTypes []OIDCGrantType `protobuf:"varint,5,rep,packed,name=grant_types,json=grantTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCGrantType" json:"grant_types,omitempty"` - ApplicationType OIDCApplicationType `protobuf:"varint,6,opt,name=application_type,json=applicationType,proto3,enum=caos.zitadel.management.api.v1.OIDCApplicationType" json:"application_type,omitempty"` - AuthMethodType OIDCAuthMethodType `protobuf:"varint,7,opt,name=auth_method_type,json=authMethodType,proto3,enum=caos.zitadel.management.api.v1.OIDCAuthMethodType" json:"auth_method_type,omitempty"` - PostLogoutRedirectUris []string `protobuf:"bytes,8,rep,name=post_logout_redirect_uris,json=postLogoutRedirectUris,proto3" json:"post_logout_redirect_uris,omitempty"` - DevMode bool `protobuf:"varint,9,opt,name=dev_mode,json=devMode,proto3" json:"dev_mode,omitempty"` + ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + ApplicationId string `protobuf:"bytes,2,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"` + RedirectUris []string `protobuf:"bytes,3,rep,name=redirect_uris,json=redirectUris,proto3" json:"redirect_uris,omitempty"` + ResponseTypes []OIDCResponseType `protobuf:"varint,4,rep,packed,name=response_types,json=responseTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCResponseType" json:"response_types,omitempty"` + GrantTypes []OIDCGrantType `protobuf:"varint,5,rep,packed,name=grant_types,json=grantTypes,proto3,enum=caos.zitadel.management.api.v1.OIDCGrantType" json:"grant_types,omitempty"` + ApplicationType OIDCApplicationType `protobuf:"varint,6,opt,name=application_type,json=applicationType,proto3,enum=caos.zitadel.management.api.v1.OIDCApplicationType" json:"application_type,omitempty"` + AuthMethodType OIDCAuthMethodType `protobuf:"varint,7,opt,name=auth_method_type,json=authMethodType,proto3,enum=caos.zitadel.management.api.v1.OIDCAuthMethodType" json:"auth_method_type,omitempty"` + PostLogoutRedirectUris []string `protobuf:"bytes,8,rep,name=post_logout_redirect_uris,json=postLogoutRedirectUris,proto3" json:"post_logout_redirect_uris,omitempty"` + DevMode bool `protobuf:"varint,9,opt,name=dev_mode,json=devMode,proto3" json:"dev_mode,omitempty"` + AccessTokenType OIDCTokenType `protobuf:"varint,10,opt,name=access_token_type,json=accessTokenType,proto3,enum=caos.zitadel.management.api.v1.OIDCTokenType" json:"access_token_type,omitempty"` + AccessTokenRoleAssertion bool `protobuf:"varint,11,opt,name=access_token_role_assertion,json=accessTokenRoleAssertion,proto3" json:"access_token_role_assertion,omitempty"` + IdTokenRoleAssertion bool `protobuf:"varint,12,opt,name=id_token_role_assertion,json=idTokenRoleAssertion,proto3" json:"id_token_role_assertion,omitempty"` } func (x *OIDCConfigUpdate) Reset() { *x = OIDCConfigUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[114] + mi := &file_management_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10656,7 +9948,7 @@ func (x *OIDCConfigUpdate) String() string { func (*OIDCConfigUpdate) ProtoMessage() {} func (x *OIDCConfigUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[114] + mi := &file_management_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10669,7 +9961,7 @@ func (x *OIDCConfigUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use OIDCConfigUpdate.ProtoReflect.Descriptor instead. func (*OIDCConfigUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{114} + return file_management_proto_rawDescGZIP(), []int{102} } func (x *OIDCConfigUpdate) GetProjectId() string { @@ -10735,6 +10027,27 @@ func (x *OIDCConfigUpdate) GetDevMode() bool { return false } +func (x *OIDCConfigUpdate) GetAccessTokenType() OIDCTokenType { + if x != nil { + return x.AccessTokenType + } + return OIDCTokenType_OIDCTokenType_Bearer +} + +func (x *OIDCConfigUpdate) GetAccessTokenRoleAssertion() bool { + if x != nil { + return x.AccessTokenRoleAssertion + } + return false +} + +func (x *OIDCConfigUpdate) GetIdTokenRoleAssertion() bool { + if x != nil { + return x.IdTokenRoleAssertion + } + return false +} + type ClientSecret struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -10746,7 +10059,7 @@ type ClientSecret struct { func (x *ClientSecret) Reset() { *x = ClientSecret{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[115] + mi := &file_management_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10759,7 +10072,7 @@ func (x *ClientSecret) String() string { func (*ClientSecret) ProtoMessage() {} func (x *ClientSecret) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[115] + mi := &file_management_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10772,7 +10085,7 @@ func (x *ClientSecret) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientSecret.ProtoReflect.Descriptor instead. func (*ClientSecret) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{115} + return file_management_proto_rawDescGZIP(), []int{103} } func (x *ClientSecret) GetClientSecret() string { @@ -10801,7 +10114,7 @@ type ApplicationView struct { func (x *ApplicationView) Reset() { *x = ApplicationView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[116] + mi := &file_management_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10814,7 +10127,7 @@ func (x *ApplicationView) String() string { func (*ApplicationView) ProtoMessage() {} func (x *ApplicationView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[116] + mi := &file_management_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10827,7 +10140,7 @@ func (x *ApplicationView) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplicationView.ProtoReflect.Descriptor instead. func (*ApplicationView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{116} + return file_management_proto_rawDescGZIP(), []int{104} } func (x *ApplicationView) GetId() string { @@ -10912,7 +10225,7 @@ type ApplicationSearchResponse struct { func (x *ApplicationSearchResponse) Reset() { *x = ApplicationSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[117] + mi := &file_management_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10925,7 +10238,7 @@ func (x *ApplicationSearchResponse) String() string { func (*ApplicationSearchResponse) ProtoMessage() {} func (x *ApplicationSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[117] + mi := &file_management_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10938,7 +10251,7 @@ func (x *ApplicationSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplicationSearchResponse.ProtoReflect.Descriptor instead. func (*ApplicationSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{117} + return file_management_proto_rawDescGZIP(), []int{105} } func (x *ApplicationSearchResponse) GetOffset() uint64 { @@ -10997,7 +10310,7 @@ type ApplicationSearchRequest struct { func (x *ApplicationSearchRequest) Reset() { *x = ApplicationSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[118] + mi := &file_management_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11010,7 +10323,7 @@ func (x *ApplicationSearchRequest) String() string { func (*ApplicationSearchRequest) ProtoMessage() {} func (x *ApplicationSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[118] + mi := &file_management_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11023,7 +10336,7 @@ func (x *ApplicationSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplicationSearchRequest.ProtoReflect.Descriptor instead. func (*ApplicationSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{118} + return file_management_proto_rawDescGZIP(), []int{106} } func (x *ApplicationSearchRequest) GetProjectId() string { @@ -11067,7 +10380,7 @@ type ApplicationSearchQuery struct { func (x *ApplicationSearchQuery) Reset() { *x = ApplicationSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[119] + mi := &file_management_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11080,7 +10393,7 @@ func (x *ApplicationSearchQuery) String() string { func (*ApplicationSearchQuery) ProtoMessage() {} func (x *ApplicationSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[119] + mi := &file_management_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11093,7 +10406,7 @@ func (x *ApplicationSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplicationSearchQuery.ProtoReflect.Descriptor instead. func (*ApplicationSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{119} + return file_management_proto_rawDescGZIP(), []int{107} } func (x *ApplicationSearchQuery) GetKey() ApplicationSearchKey { @@ -11135,7 +10448,7 @@ type ProjectGrant struct { func (x *ProjectGrant) Reset() { *x = ProjectGrant{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[120] + mi := &file_management_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11148,7 +10461,7 @@ func (x *ProjectGrant) String() string { func (*ProjectGrant) ProtoMessage() {} func (x *ProjectGrant) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[120] + mi := &file_management_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11161,7 +10474,7 @@ func (x *ProjectGrant) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrant.ProtoReflect.Descriptor instead. func (*ProjectGrant) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{120} + return file_management_proto_rawDescGZIP(), []int{108} } func (x *ProjectGrant) GetId() string { @@ -11233,7 +10546,7 @@ type ProjectGrantCreate struct { func (x *ProjectGrantCreate) Reset() { *x = ProjectGrantCreate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[121] + mi := &file_management_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11246,7 +10559,7 @@ func (x *ProjectGrantCreate) String() string { func (*ProjectGrantCreate) ProtoMessage() {} func (x *ProjectGrantCreate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[121] + mi := &file_management_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11259,7 +10572,7 @@ func (x *ProjectGrantCreate) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantCreate.ProtoReflect.Descriptor instead. func (*ProjectGrantCreate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{121} + return file_management_proto_rawDescGZIP(), []int{109} } func (x *ProjectGrantCreate) GetProjectId() string { @@ -11296,7 +10609,7 @@ type ProjectGrantUpdate struct { func (x *ProjectGrantUpdate) Reset() { *x = ProjectGrantUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[122] + mi := &file_management_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11309,7 +10622,7 @@ func (x *ProjectGrantUpdate) String() string { func (*ProjectGrantUpdate) ProtoMessage() {} func (x *ProjectGrantUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[122] + mi := &file_management_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11322,7 +10635,7 @@ func (x *ProjectGrantUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantUpdate.ProtoReflect.Descriptor instead. func (*ProjectGrantUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{122} + return file_management_proto_rawDescGZIP(), []int{110} } func (x *ProjectGrantUpdate) GetProjectId() string { @@ -11358,7 +10671,7 @@ type ProjectGrantID struct { func (x *ProjectGrantID) Reset() { *x = ProjectGrantID{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[123] + mi := &file_management_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11371,7 +10684,7 @@ func (x *ProjectGrantID) String() string { func (*ProjectGrantID) ProtoMessage() {} func (x *ProjectGrantID) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[123] + mi := &file_management_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11384,7 +10697,7 @@ func (x *ProjectGrantID) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantID.ProtoReflect.Descriptor instead. func (*ProjectGrantID) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{123} + return file_management_proto_rawDescGZIP(), []int{111} } func (x *ProjectGrantID) GetProjectId() string { @@ -11423,7 +10736,7 @@ type ProjectGrantView struct { func (x *ProjectGrantView) Reset() { *x = ProjectGrantView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[124] + mi := &file_management_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11436,7 +10749,7 @@ func (x *ProjectGrantView) String() string { func (*ProjectGrantView) ProtoMessage() {} func (x *ProjectGrantView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[124] + mi := &file_management_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11449,7 +10762,7 @@ func (x *ProjectGrantView) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantView.ProtoReflect.Descriptor instead. func (*ProjectGrantView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{124} + return file_management_proto_rawDescGZIP(), []int{112} } func (x *ProjectGrantView) GetId() string { @@ -11552,7 +10865,7 @@ type ProjectGrantSearchResponse struct { func (x *ProjectGrantSearchResponse) Reset() { *x = ProjectGrantSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[125] + mi := &file_management_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11565,7 +10878,7 @@ func (x *ProjectGrantSearchResponse) String() string { func (*ProjectGrantSearchResponse) ProtoMessage() {} func (x *ProjectGrantSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[125] + mi := &file_management_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11578,7 +10891,7 @@ func (x *ProjectGrantSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantSearchResponse.ProtoReflect.Descriptor instead. func (*ProjectGrantSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{125} + return file_management_proto_rawDescGZIP(), []int{113} } func (x *ProjectGrantSearchResponse) GetOffset() uint64 { @@ -11636,7 +10949,7 @@ type GrantedProjectSearchRequest struct { func (x *GrantedProjectSearchRequest) Reset() { *x = GrantedProjectSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[126] + mi := &file_management_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11649,7 +10962,7 @@ func (x *GrantedProjectSearchRequest) String() string { func (*GrantedProjectSearchRequest) ProtoMessage() {} func (x *GrantedProjectSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[126] + mi := &file_management_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11662,7 +10975,7 @@ func (x *GrantedProjectSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GrantedProjectSearchRequest.ProtoReflect.Descriptor instead. func (*GrantedProjectSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{126} + return file_management_proto_rawDescGZIP(), []int{114} } func (x *GrantedProjectSearchRequest) GetOffset() uint64 { @@ -11700,7 +11013,7 @@ type ProjectGrantSearchRequest struct { func (x *ProjectGrantSearchRequest) Reset() { *x = ProjectGrantSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[127] + mi := &file_management_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11713,7 +11026,7 @@ func (x *ProjectGrantSearchRequest) String() string { func (*ProjectGrantSearchRequest) ProtoMessage() {} func (x *ProjectGrantSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[127] + mi := &file_management_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11726,7 +11039,7 @@ func (x *ProjectGrantSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantSearchRequest.ProtoReflect.Descriptor instead. func (*ProjectGrantSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{127} + return file_management_proto_rawDescGZIP(), []int{115} } func (x *ProjectGrantSearchRequest) GetProjectId() string { @@ -11770,7 +11083,7 @@ type ProjectGrantSearchQuery struct { func (x *ProjectGrantSearchQuery) Reset() { *x = ProjectGrantSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[128] + mi := &file_management_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11783,7 +11096,7 @@ func (x *ProjectGrantSearchQuery) String() string { func (*ProjectGrantSearchQuery) ProtoMessage() {} func (x *ProjectGrantSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[128] + mi := &file_management_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11796,7 +11109,7 @@ func (x *ProjectGrantSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantSearchQuery.ProtoReflect.Descriptor instead. func (*ProjectGrantSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{128} + return file_management_proto_rawDescGZIP(), []int{116} } func (x *ProjectGrantSearchQuery) GetKey() ProjectGrantSearchKey { @@ -11831,7 +11144,7 @@ type ProjectGrantMemberRoles struct { func (x *ProjectGrantMemberRoles) Reset() { *x = ProjectGrantMemberRoles{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[129] + mi := &file_management_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11844,7 +11157,7 @@ func (x *ProjectGrantMemberRoles) String() string { func (*ProjectGrantMemberRoles) ProtoMessage() {} func (x *ProjectGrantMemberRoles) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[129] + mi := &file_management_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11857,7 +11170,7 @@ func (x *ProjectGrantMemberRoles) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberRoles.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberRoles) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{129} + return file_management_proto_rawDescGZIP(), []int{117} } func (x *ProjectGrantMemberRoles) GetRoles() []string { @@ -11882,7 +11195,7 @@ type ProjectGrantMember struct { func (x *ProjectGrantMember) Reset() { *x = ProjectGrantMember{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[130] + mi := &file_management_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11895,7 +11208,7 @@ func (x *ProjectGrantMember) String() string { func (*ProjectGrantMember) ProtoMessage() {} func (x *ProjectGrantMember) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[130] + mi := &file_management_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11908,7 +11221,7 @@ func (x *ProjectGrantMember) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMember.ProtoReflect.Descriptor instead. func (*ProjectGrantMember) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{130} + return file_management_proto_rawDescGZIP(), []int{118} } func (x *ProjectGrantMember) GetUserId() string { @@ -11960,7 +11273,7 @@ type ProjectGrantMemberAdd struct { func (x *ProjectGrantMemberAdd) Reset() { *x = ProjectGrantMemberAdd{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[131] + mi := &file_management_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11973,7 +11286,7 @@ func (x *ProjectGrantMemberAdd) String() string { func (*ProjectGrantMemberAdd) ProtoMessage() {} func (x *ProjectGrantMemberAdd) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[131] + mi := &file_management_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11986,7 +11299,7 @@ func (x *ProjectGrantMemberAdd) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberAdd.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberAdd) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{131} + return file_management_proto_rawDescGZIP(), []int{119} } func (x *ProjectGrantMemberAdd) GetProjectId() string { @@ -12031,7 +11344,7 @@ type ProjectGrantMemberChange struct { func (x *ProjectGrantMemberChange) Reset() { *x = ProjectGrantMemberChange{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[132] + mi := &file_management_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12044,7 +11357,7 @@ func (x *ProjectGrantMemberChange) String() string { func (*ProjectGrantMemberChange) ProtoMessage() {} func (x *ProjectGrantMemberChange) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[132] + mi := &file_management_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12057,7 +11370,7 @@ func (x *ProjectGrantMemberChange) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberChange.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberChange) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{132} + return file_management_proto_rawDescGZIP(), []int{120} } func (x *ProjectGrantMemberChange) GetProjectId() string { @@ -12101,7 +11414,7 @@ type ProjectGrantMemberRemove struct { func (x *ProjectGrantMemberRemove) Reset() { *x = ProjectGrantMemberRemove{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[133] + mi := &file_management_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12114,7 +11427,7 @@ func (x *ProjectGrantMemberRemove) String() string { func (*ProjectGrantMemberRemove) ProtoMessage() {} func (x *ProjectGrantMemberRemove) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[133] + mi := &file_management_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12127,7 +11440,7 @@ func (x *ProjectGrantMemberRemove) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberRemove.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberRemove) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{133} + return file_management_proto_rawDescGZIP(), []int{121} } func (x *ProjectGrantMemberRemove) GetProjectId() string { @@ -12171,7 +11484,7 @@ type ProjectGrantMemberView struct { func (x *ProjectGrantMemberView) Reset() { *x = ProjectGrantMemberView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[134] + mi := &file_management_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12184,7 +11497,7 @@ func (x *ProjectGrantMemberView) String() string { func (*ProjectGrantMemberView) ProtoMessage() {} func (x *ProjectGrantMemberView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[134] + mi := &file_management_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12197,7 +11510,7 @@ func (x *ProjectGrantMemberView) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberView.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{134} + return file_management_proto_rawDescGZIP(), []int{122} } func (x *ProjectGrantMemberView) GetUserId() string { @@ -12286,7 +11599,7 @@ type ProjectGrantMemberSearchResponse struct { func (x *ProjectGrantMemberSearchResponse) Reset() { *x = ProjectGrantMemberSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[135] + mi := &file_management_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12299,7 +11612,7 @@ func (x *ProjectGrantMemberSearchResponse) String() string { func (*ProjectGrantMemberSearchResponse) ProtoMessage() {} func (x *ProjectGrantMemberSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[135] + mi := &file_management_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12312,7 +11625,7 @@ func (x *ProjectGrantMemberSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberSearchResponse.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{135} + return file_management_proto_rawDescGZIP(), []int{123} } func (x *ProjectGrantMemberSearchResponse) GetOffset() uint64 { @@ -12372,7 +11685,7 @@ type ProjectGrantMemberSearchRequest struct { func (x *ProjectGrantMemberSearchRequest) Reset() { *x = ProjectGrantMemberSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[136] + mi := &file_management_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12385,7 +11698,7 @@ func (x *ProjectGrantMemberSearchRequest) String() string { func (*ProjectGrantMemberSearchRequest) ProtoMessage() {} func (x *ProjectGrantMemberSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[136] + mi := &file_management_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12398,7 +11711,7 @@ func (x *ProjectGrantMemberSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberSearchRequest.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{136} + return file_management_proto_rawDescGZIP(), []int{124} } func (x *ProjectGrantMemberSearchRequest) GetProjectId() string { @@ -12449,7 +11762,7 @@ type ProjectGrantMemberSearchQuery struct { func (x *ProjectGrantMemberSearchQuery) Reset() { *x = ProjectGrantMemberSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[137] + mi := &file_management_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12462,7 +11775,7 @@ func (x *ProjectGrantMemberSearchQuery) String() string { func (*ProjectGrantMemberSearchQuery) ProtoMessage() {} func (x *ProjectGrantMemberSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[137] + mi := &file_management_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12475,7 +11788,7 @@ func (x *ProjectGrantMemberSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectGrantMemberSearchQuery.ProtoReflect.Descriptor instead. func (*ProjectGrantMemberSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{137} + return file_management_proto_rawDescGZIP(), []int{125} } func (x *ProjectGrantMemberSearchQuery) GetKey() ProjectGrantMemberSearchKey { @@ -12519,7 +11832,7 @@ type UserGrant struct { func (x *UserGrant) Reset() { *x = UserGrant{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[138] + mi := &file_management_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12532,7 +11845,7 @@ func (x *UserGrant) String() string { func (*UserGrant) ProtoMessage() {} func (x *UserGrant) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[138] + mi := &file_management_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12545,7 +11858,7 @@ func (x *UserGrant) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrant.ProtoReflect.Descriptor instead. func (*UserGrant) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{138} + return file_management_proto_rawDescGZIP(), []int{126} } func (x *UserGrant) GetId() string { @@ -12632,7 +11945,7 @@ type UserGrantCreate struct { func (x *UserGrantCreate) Reset() { *x = UserGrantCreate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[139] + mi := &file_management_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12645,7 +11958,7 @@ func (x *UserGrantCreate) String() string { func (*UserGrantCreate) ProtoMessage() {} func (x *UserGrantCreate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[139] + mi := &file_management_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12658,7 +11971,7 @@ func (x *UserGrantCreate) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantCreate.ProtoReflect.Descriptor instead. func (*UserGrantCreate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{139} + return file_management_proto_rawDescGZIP(), []int{127} } func (x *UserGrantCreate) GetUserId() string { @@ -12702,7 +12015,7 @@ type UserGrantUpdate struct { func (x *UserGrantUpdate) Reset() { *x = UserGrantUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[140] + mi := &file_management_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12715,7 +12028,7 @@ func (x *UserGrantUpdate) String() string { func (*UserGrantUpdate) ProtoMessage() {} func (x *UserGrantUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[140] + mi := &file_management_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12728,7 +12041,7 @@ func (x *UserGrantUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantUpdate.ProtoReflect.Descriptor instead. func (*UserGrantUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{140} + return file_management_proto_rawDescGZIP(), []int{128} } func (x *UserGrantUpdate) GetUserId() string { @@ -12763,7 +12076,7 @@ type UserGrantRemoveBulk struct { func (x *UserGrantRemoveBulk) Reset() { *x = UserGrantRemoveBulk{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[141] + mi := &file_management_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12776,7 +12089,7 @@ func (x *UserGrantRemoveBulk) String() string { func (*UserGrantRemoveBulk) ProtoMessage() {} func (x *UserGrantRemoveBulk) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[141] + mi := &file_management_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12789,7 +12102,7 @@ func (x *UserGrantRemoveBulk) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantRemoveBulk.ProtoReflect.Descriptor instead. func (*UserGrantRemoveBulk) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{141} + return file_management_proto_rawDescGZIP(), []int{129} } func (x *UserGrantRemoveBulk) GetIds() []string { @@ -12811,7 +12124,7 @@ type UserGrantID struct { func (x *UserGrantID) Reset() { *x = UserGrantID{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[142] + mi := &file_management_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12824,7 +12137,7 @@ func (x *UserGrantID) String() string { func (*UserGrantID) ProtoMessage() {} func (x *UserGrantID) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[142] + mi := &file_management_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12837,7 +12150,7 @@ func (x *UserGrantID) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantID.ProtoReflect.Descriptor instead. func (*UserGrantID) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{142} + return file_management_proto_rawDescGZIP(), []int{130} } func (x *UserGrantID) GetUserId() string { @@ -12883,7 +12196,7 @@ type UserGrantView struct { func (x *UserGrantView) Reset() { *x = UserGrantView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[143] + mi := &file_management_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12896,7 +12209,7 @@ func (x *UserGrantView) String() string { func (*UserGrantView) ProtoMessage() {} func (x *UserGrantView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[143] + mi := &file_management_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12909,7 +12222,7 @@ func (x *UserGrantView) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantView.ProtoReflect.Descriptor instead. func (*UserGrantView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{143} + return file_management_proto_rawDescGZIP(), []int{131} } func (x *UserGrantView) GetId() string { @@ -13061,7 +12374,7 @@ type UserGrantSearchResponse struct { func (x *UserGrantSearchResponse) Reset() { *x = UserGrantSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[144] + mi := &file_management_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13074,7 +12387,7 @@ func (x *UserGrantSearchResponse) String() string { func (*UserGrantSearchResponse) ProtoMessage() {} func (x *UserGrantSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[144] + mi := &file_management_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13087,7 +12400,7 @@ func (x *UserGrantSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantSearchResponse.ProtoReflect.Descriptor instead. func (*UserGrantSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{144} + return file_management_proto_rawDescGZIP(), []int{132} } func (x *UserGrantSearchResponse) GetOffset() uint64 { @@ -13145,7 +12458,7 @@ type UserGrantSearchRequest struct { func (x *UserGrantSearchRequest) Reset() { *x = UserGrantSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[145] + mi := &file_management_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13158,7 +12471,7 @@ func (x *UserGrantSearchRequest) String() string { func (*UserGrantSearchRequest) ProtoMessage() {} func (x *UserGrantSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[145] + mi := &file_management_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13171,7 +12484,7 @@ func (x *UserGrantSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantSearchRequest.ProtoReflect.Descriptor instead. func (*UserGrantSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{145} + return file_management_proto_rawDescGZIP(), []int{133} } func (x *UserGrantSearchRequest) GetOffset() uint64 { @@ -13208,7 +12521,7 @@ type UserGrantSearchQuery struct { func (x *UserGrantSearchQuery) Reset() { *x = UserGrantSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[146] + mi := &file_management_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13221,7 +12534,7 @@ func (x *UserGrantSearchQuery) String() string { func (*UserGrantSearchQuery) ProtoMessage() {} func (x *UserGrantSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[146] + mi := &file_management_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13234,7 +12547,7 @@ func (x *UserGrantSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use UserGrantSearchQuery.ProtoReflect.Descriptor instead. func (*UserGrantSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{146} + return file_management_proto_rawDescGZIP(), []int{134} } func (x *UserGrantSearchQuery) GetKey() UserGrantSearchKey { @@ -13274,7 +12587,7 @@ type UserMembershipSearchResponse struct { func (x *UserMembershipSearchResponse) Reset() { *x = UserMembershipSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[147] + mi := &file_management_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13287,7 +12600,7 @@ func (x *UserMembershipSearchResponse) String() string { func (*UserMembershipSearchResponse) ProtoMessage() {} func (x *UserMembershipSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[147] + mi := &file_management_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13300,7 +12613,7 @@ func (x *UserMembershipSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMembershipSearchResponse.ProtoReflect.Descriptor instead. func (*UserMembershipSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{147} + return file_management_proto_rawDescGZIP(), []int{135} } func (x *UserMembershipSearchResponse) GetOffset() uint64 { @@ -13359,7 +12672,7 @@ type UserMembershipSearchRequest struct { func (x *UserMembershipSearchRequest) Reset() { *x = UserMembershipSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[148] + mi := &file_management_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13372,7 +12685,7 @@ func (x *UserMembershipSearchRequest) String() string { func (*UserMembershipSearchRequest) ProtoMessage() {} func (x *UserMembershipSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[148] + mi := &file_management_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13385,7 +12698,7 @@ func (x *UserMembershipSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMembershipSearchRequest.ProtoReflect.Descriptor instead. func (*UserMembershipSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{148} + return file_management_proto_rawDescGZIP(), []int{136} } func (x *UserMembershipSearchRequest) GetUserId() string { @@ -13429,7 +12742,7 @@ type UserMembershipSearchQuery struct { func (x *UserMembershipSearchQuery) Reset() { *x = UserMembershipSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[149] + mi := &file_management_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13442,7 +12755,7 @@ func (x *UserMembershipSearchQuery) String() string { func (*UserMembershipSearchQuery) ProtoMessage() {} func (x *UserMembershipSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[149] + mi := &file_management_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13455,7 +12768,7 @@ func (x *UserMembershipSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMembershipSearchQuery.ProtoReflect.Descriptor instead. func (*UserMembershipSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{149} + return file_management_proto_rawDescGZIP(), []int{137} } func (x *UserMembershipSearchQuery) GetKey() UserMembershipSearchKey { @@ -13499,7 +12812,7 @@ type UserMembershipView struct { func (x *UserMembershipView) Reset() { *x = UserMembershipView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[150] + mi := &file_management_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13512,7 +12825,7 @@ func (x *UserMembershipView) String() string { func (*UserMembershipView) ProtoMessage() {} func (x *UserMembershipView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[150] + mi := &file_management_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13525,7 +12838,7 @@ func (x *UserMembershipView) ProtoReflect() protoreflect.Message { // Deprecated: Use UserMembershipView.ProtoReflect.Descriptor instead. func (*UserMembershipView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{150} + return file_management_proto_rawDescGZIP(), []int{138} } func (x *UserMembershipView) GetUserId() string { @@ -13609,7 +12922,7 @@ type IdpID struct { func (x *IdpID) Reset() { *x = IdpID{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[151] + mi := &file_management_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13622,7 +12935,7 @@ func (x *IdpID) String() string { func (*IdpID) ProtoMessage() {} func (x *IdpID) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[151] + mi := &file_management_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13635,7 +12948,7 @@ func (x *IdpID) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpID.ProtoReflect.Descriptor instead. func (*IdpID) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{151} + return file_management_proto_rawDescGZIP(), []int{139} } func (x *IdpID) GetId() string { @@ -13655,7 +12968,7 @@ type Idp struct { CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,6,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + StylingType IdpStylingType `protobuf:"varint,6,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.management.api.v1.IdpStylingType" json:"styling_type,omitempty"` // Types that are assignable to IdpConfig: // *Idp_OidcConfig IdpConfig isIdp_IdpConfig `protobuf_oneof:"idp_config"` @@ -13665,7 +12978,7 @@ type Idp struct { func (x *Idp) Reset() { *x = Idp{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[152] + mi := &file_management_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13678,7 +12991,7 @@ func (x *Idp) String() string { func (*Idp) ProtoMessage() {} func (x *Idp) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[152] + mi := &file_management_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13691,7 +13004,7 @@ func (x *Idp) ProtoReflect() protoreflect.Message { // Deprecated: Use Idp.ProtoReflect.Descriptor instead. func (*Idp) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{152} + return file_management_proto_rawDescGZIP(), []int{140} } func (x *Idp) GetId() string { @@ -13729,11 +13042,11 @@ func (x *Idp) GetName() string { return "" } -func (x *Idp) GetLogoSrc() []byte { +func (x *Idp) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } func (m *Idp) GetIdpConfig() isIdp_IdpConfig { @@ -13772,15 +13085,15 @@ type IdpUpdate struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,3,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + StylingType IdpStylingType `protobuf:"varint,3,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.management.api.v1.IdpStylingType" json:"styling_type,omitempty"` } func (x *IdpUpdate) Reset() { *x = IdpUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[153] + mi := &file_management_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13793,7 +13106,7 @@ func (x *IdpUpdate) String() string { func (*IdpUpdate) ProtoMessage() {} func (x *IdpUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[153] + mi := &file_management_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13806,7 +13119,7 @@ func (x *IdpUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpUpdate.ProtoReflect.Descriptor instead. func (*IdpUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{153} + return file_management_proto_rawDescGZIP(), []int{141} } func (x *IdpUpdate) GetId() string { @@ -13823,11 +13136,11 @@ func (x *IdpUpdate) GetName() string { return "" } -func (x *IdpUpdate) GetLogoSrc() []byte { +func (x *IdpUpdate) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } type OidcIdpConfig struct { @@ -13846,7 +13159,7 @@ type OidcIdpConfig struct { func (x *OidcIdpConfig) Reset() { *x = OidcIdpConfig{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[154] + mi := &file_management_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13859,7 +13172,7 @@ func (x *OidcIdpConfig) String() string { func (*OidcIdpConfig) ProtoMessage() {} func (x *OidcIdpConfig) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[154] + mi := &file_management_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13872,7 +13185,7 @@ func (x *OidcIdpConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfig.ProtoReflect.Descriptor instead. func (*OidcIdpConfig) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{154} + return file_management_proto_rawDescGZIP(), []int{142} } func (x *OidcIdpConfig) GetClientId() string { @@ -13923,7 +13236,7 @@ type OidcIdpConfigCreate struct { unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,2,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + StylingType IdpStylingType `protobuf:"varint,2,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.management.api.v1.IdpStylingType" json:"styling_type,omitempty"` ClientId string `protobuf:"bytes,3,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` ClientSecret string `protobuf:"bytes,4,opt,name=client_secret,json=clientSecret,proto3" json:"client_secret,omitempty"` Issuer string `protobuf:"bytes,5,opt,name=issuer,proto3" json:"issuer,omitempty"` @@ -13935,7 +13248,7 @@ type OidcIdpConfigCreate struct { func (x *OidcIdpConfigCreate) Reset() { *x = OidcIdpConfigCreate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[155] + mi := &file_management_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13948,7 +13261,7 @@ func (x *OidcIdpConfigCreate) String() string { func (*OidcIdpConfigCreate) ProtoMessage() {} func (x *OidcIdpConfigCreate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[155] + mi := &file_management_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13961,7 +13274,7 @@ func (x *OidcIdpConfigCreate) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfigCreate.ProtoReflect.Descriptor instead. func (*OidcIdpConfigCreate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{155} + return file_management_proto_rawDescGZIP(), []int{143} } func (x *OidcIdpConfigCreate) GetName() string { @@ -13971,11 +13284,11 @@ func (x *OidcIdpConfigCreate) GetName() string { return "" } -func (x *OidcIdpConfigCreate) GetLogoSrc() []byte { +func (x *OidcIdpConfigCreate) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } func (x *OidcIdpConfigCreate) GetClientId() string { @@ -14037,7 +13350,7 @@ type OidcIdpConfigUpdate struct { func (x *OidcIdpConfigUpdate) Reset() { *x = OidcIdpConfigUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[156] + mi := &file_management_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14050,7 +13363,7 @@ func (x *OidcIdpConfigUpdate) String() string { func (*OidcIdpConfigUpdate) ProtoMessage() {} func (x *OidcIdpConfigUpdate) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[156] + mi := &file_management_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14063,7 +13376,7 @@ func (x *OidcIdpConfigUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfigUpdate.ProtoReflect.Descriptor instead. func (*OidcIdpConfigUpdate) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{156} + return file_management_proto_rawDescGZIP(), []int{144} } func (x *OidcIdpConfigUpdate) GetIdpId() string { @@ -14131,7 +13444,7 @@ type IdpSearchResponse struct { func (x *IdpSearchResponse) Reset() { *x = IdpSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[157] + mi := &file_management_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14144,7 +13457,7 @@ func (x *IdpSearchResponse) String() string { func (*IdpSearchResponse) ProtoMessage() {} func (x *IdpSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[157] + mi := &file_management_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14157,7 +13470,7 @@ func (x *IdpSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpSearchResponse.ProtoReflect.Descriptor instead. func (*IdpSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{157} + return file_management_proto_rawDescGZIP(), []int{145} } func (x *IdpSearchResponse) GetOffset() uint64 { @@ -14212,7 +13525,7 @@ type IdpView struct { CreationDate *timestamp.Timestamp `protobuf:"bytes,3,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` ChangeDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - LogoSrc []byte `protobuf:"bytes,6,opt,name=logo_src,json=logoSrc,proto3" json:"logo_src,omitempty"` + StylingType IdpStylingType `protobuf:"varint,6,opt,name=styling_type,json=stylingType,proto3,enum=caos.zitadel.management.api.v1.IdpStylingType" json:"styling_type,omitempty"` ProviderType IdpProviderType `protobuf:"varint,7,opt,name=provider_type,json=providerType,proto3,enum=caos.zitadel.management.api.v1.IdpProviderType" json:"provider_type,omitempty"` // Types that are assignable to IdpConfigView: // *IdpView_OidcConfig @@ -14223,7 +13536,7 @@ type IdpView struct { func (x *IdpView) Reset() { *x = IdpView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[158] + mi := &file_management_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14236,7 +13549,7 @@ func (x *IdpView) String() string { func (*IdpView) ProtoMessage() {} func (x *IdpView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[158] + mi := &file_management_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14249,7 +13562,7 @@ func (x *IdpView) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpView.ProtoReflect.Descriptor instead. func (*IdpView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{158} + return file_management_proto_rawDescGZIP(), []int{146} } func (x *IdpView) GetId() string { @@ -14287,11 +13600,11 @@ func (x *IdpView) GetName() string { return "" } -func (x *IdpView) GetLogoSrc() []byte { +func (x *IdpView) GetStylingType() IdpStylingType { if x != nil { - return x.LogoSrc + return x.StylingType } - return nil + return IdpStylingType_IDPSTYLINGTYPE_UNSPECIFIED } func (x *IdpView) GetProviderType() IdpProviderType { @@ -14347,7 +13660,7 @@ type OidcIdpConfigView struct { func (x *OidcIdpConfigView) Reset() { *x = OidcIdpConfigView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[159] + mi := &file_management_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14360,7 +13673,7 @@ func (x *OidcIdpConfigView) String() string { func (*OidcIdpConfigView) ProtoMessage() {} func (x *OidcIdpConfigView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[159] + mi := &file_management_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14373,7 +13686,7 @@ func (x *OidcIdpConfigView) ProtoReflect() protoreflect.Message { // Deprecated: Use OidcIdpConfigView.ProtoReflect.Descriptor instead. func (*OidcIdpConfigView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{159} + return file_management_proto_rawDescGZIP(), []int{147} } func (x *OidcIdpConfigView) GetClientId() string { @@ -14424,7 +13737,7 @@ type IdpSearchRequest struct { func (x *IdpSearchRequest) Reset() { *x = IdpSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[160] + mi := &file_management_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14437,7 +13750,7 @@ func (x *IdpSearchRequest) String() string { func (*IdpSearchRequest) ProtoMessage() {} func (x *IdpSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[160] + mi := &file_management_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14450,7 +13763,7 @@ func (x *IdpSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpSearchRequest.ProtoReflect.Descriptor instead. func (*IdpSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{160} + return file_management_proto_rawDescGZIP(), []int{148} } func (x *IdpSearchRequest) GetOffset() uint64 { @@ -14487,7 +13800,7 @@ type IdpSearchQuery struct { func (x *IdpSearchQuery) Reset() { *x = IdpSearchQuery{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[161] + mi := &file_management_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14500,7 +13813,7 @@ func (x *IdpSearchQuery) String() string { func (*IdpSearchQuery) ProtoMessage() {} func (x *IdpSearchQuery) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[161] + mi := &file_management_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14513,7 +13826,7 @@ func (x *IdpSearchQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpSearchQuery.ProtoReflect.Descriptor instead. func (*IdpSearchQuery) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{161} + return file_management_proto_rawDescGZIP(), []int{149} } func (x *IdpSearchQuery) GetKey() IdpSearchKey { @@ -14542,15 +13855,17 @@ type LoginPolicy struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AllowUsernamePassword bool `protobuf:"varint,1,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` - AllowRegister bool `protobuf:"varint,2,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` - AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + AllowUsernamePassword bool `protobuf:"varint,1,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` + AllowRegister bool `protobuf:"varint,2,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` + AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` } func (x *LoginPolicy) Reset() { *x = LoginPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[162] + mi := &file_management_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14563,7 +13878,7 @@ func (x *LoginPolicy) String() string { func (*LoginPolicy) ProtoMessage() {} func (x *LoginPolicy) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[162] + mi := &file_management_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14576,7 +13891,7 @@ func (x *LoginPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginPolicy.ProtoReflect.Descriptor instead. func (*LoginPolicy) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{162} + return file_management_proto_rawDescGZIP(), []int{150} } func (x *LoginPolicy) GetAllowUsernamePassword() bool { @@ -14600,7 +13915,21 @@ func (x *LoginPolicy) GetAllowExternalIdp() bool { return false } -type LoginPolicyAdd struct { +func (x *LoginPolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *LoginPolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type LoginPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -14610,23 +13939,23 @@ type LoginPolicyAdd struct { AllowExternalIdp bool `protobuf:"varint,3,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` } -func (x *LoginPolicyAdd) Reset() { - *x = LoginPolicyAdd{} +func (x *LoginPolicyRequest) Reset() { + *x = LoginPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[163] + mi := &file_management_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LoginPolicyAdd) String() string { +func (x *LoginPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LoginPolicyAdd) ProtoMessage() {} +func (*LoginPolicyRequest) ProtoMessage() {} -func (x *LoginPolicyAdd) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[163] +func (x *LoginPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[151] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14637,26 +13966,26 @@ func (x *LoginPolicyAdd) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LoginPolicyAdd.ProtoReflect.Descriptor instead. -func (*LoginPolicyAdd) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{163} +// Deprecated: Use LoginPolicyRequest.ProtoReflect.Descriptor instead. +func (*LoginPolicyRequest) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{151} } -func (x *LoginPolicyAdd) GetAllowUsernamePassword() bool { +func (x *LoginPolicyRequest) GetAllowUsernamePassword() bool { if x != nil { return x.AllowUsernamePassword } return false } -func (x *LoginPolicyAdd) GetAllowRegister() bool { +func (x *LoginPolicyRequest) GetAllowRegister() bool { if x != nil { return x.AllowRegister } return false } -func (x *LoginPolicyAdd) GetAllowExternalIdp() bool { +func (x *LoginPolicyRequest) GetAllowExternalIdp() bool { if x != nil { return x.AllowExternalIdp } @@ -14674,7 +14003,7 @@ type IdpProviderID struct { func (x *IdpProviderID) Reset() { *x = IdpProviderID{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[164] + mi := &file_management_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14687,7 +14016,7 @@ func (x *IdpProviderID) String() string { func (*IdpProviderID) ProtoMessage() {} func (x *IdpProviderID) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[164] + mi := &file_management_proto_msgTypes[152] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14700,7 +14029,7 @@ func (x *IdpProviderID) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderID.ProtoReflect.Descriptor instead. func (*IdpProviderID) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{164} + return file_management_proto_rawDescGZIP(), []int{152} } func (x *IdpProviderID) GetIdpConfigId() string { @@ -14722,7 +14051,7 @@ type IdpProviderAdd struct { func (x *IdpProviderAdd) Reset() { *x = IdpProviderAdd{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[165] + mi := &file_management_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14735,7 +14064,7 @@ func (x *IdpProviderAdd) String() string { func (*IdpProviderAdd) ProtoMessage() {} func (x *IdpProviderAdd) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[165] + mi := &file_management_proto_msgTypes[153] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14748,7 +14077,7 @@ func (x *IdpProviderAdd) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderAdd.ProtoReflect.Descriptor instead. func (*IdpProviderAdd) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{165} + return file_management_proto_rawDescGZIP(), []int{153} } func (x *IdpProviderAdd) GetIdpConfigId() string { @@ -14777,7 +14106,7 @@ type IdpProvider struct { func (x *IdpProvider) Reset() { *x = IdpProvider{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[166] + mi := &file_management_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14790,7 +14119,7 @@ func (x *IdpProvider) String() string { func (*IdpProvider) ProtoMessage() {} func (x *IdpProvider) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[166] + mi := &file_management_proto_msgTypes[154] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14803,7 +14132,7 @@ func (x *IdpProvider) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProvider.ProtoReflect.Descriptor instead. func (*IdpProvider) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{166} + return file_management_proto_rawDescGZIP(), []int{154} } func (x *IdpProvider) GetIdpConfigId() string { @@ -14825,16 +14154,18 @@ type LoginPolicyView struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Default bool `protobuf:"varint,1,opt,name=default,proto3" json:"default,omitempty"` - AllowUsernamePassword bool `protobuf:"varint,2,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` - AllowRegister bool `protobuf:"varint,3,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` - AllowExternalIdp bool `protobuf:"varint,4,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + Default bool `protobuf:"varint,1,opt,name=default,proto3" json:"default,omitempty"` + AllowUsernamePassword bool `protobuf:"varint,2,opt,name=allow_username_password,json=allowUsernamePassword,proto3" json:"allow_username_password,omitempty"` + AllowRegister bool `protobuf:"varint,3,opt,name=allow_register,json=allowRegister,proto3" json:"allow_register,omitempty"` + AllowExternalIdp bool `protobuf:"varint,4,opt,name=allow_external_idp,json=allowExternalIdp,proto3" json:"allow_external_idp,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` } func (x *LoginPolicyView) Reset() { *x = LoginPolicyView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[167] + mi := &file_management_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14847,7 +14178,7 @@ func (x *LoginPolicyView) String() string { func (*LoginPolicyView) ProtoMessage() {} func (x *LoginPolicyView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[167] + mi := &file_management_proto_msgTypes[155] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14860,7 +14191,7 @@ func (x *LoginPolicyView) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginPolicyView.ProtoReflect.Descriptor instead. func (*LoginPolicyView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{167} + return file_management_proto_rawDescGZIP(), []int{155} } func (x *LoginPolicyView) GetDefault() bool { @@ -14891,6 +14222,20 @@ func (x *LoginPolicyView) GetAllowExternalIdp() bool { return false } +func (x *LoginPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *LoginPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + type IdpProviderView struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -14904,7 +14249,7 @@ type IdpProviderView struct { func (x *IdpProviderView) Reset() { *x = IdpProviderView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[168] + mi := &file_management_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14917,7 +14262,7 @@ func (x *IdpProviderView) String() string { func (*IdpProviderView) ProtoMessage() {} func (x *IdpProviderView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[168] + mi := &file_management_proto_msgTypes[156] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14930,7 +14275,7 @@ func (x *IdpProviderView) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderView.ProtoReflect.Descriptor instead. func (*IdpProviderView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{168} + return file_management_proto_rawDescGZIP(), []int{156} } func (x *IdpProviderView) GetIdpConfigId() string { @@ -14970,7 +14315,7 @@ type IdpProviderSearchResponse struct { func (x *IdpProviderSearchResponse) Reset() { *x = IdpProviderSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[169] + mi := &file_management_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14983,7 +14328,7 @@ func (x *IdpProviderSearchResponse) String() string { func (*IdpProviderSearchResponse) ProtoMessage() {} func (x *IdpProviderSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[169] + mi := &file_management_proto_msgTypes[157] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14996,7 +14341,7 @@ func (x *IdpProviderSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderSearchResponse.ProtoReflect.Descriptor instead. func (*IdpProviderSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{169} + return file_management_proto_rawDescGZIP(), []int{157} } func (x *IdpProviderSearchResponse) GetOffset() uint64 { @@ -15053,7 +14398,7 @@ type IdpProviderSearchRequest struct { func (x *IdpProviderSearchRequest) Reset() { *x = IdpProviderSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[170] + mi := &file_management_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15066,7 +14411,7 @@ func (x *IdpProviderSearchRequest) String() string { func (*IdpProviderSearchRequest) ProtoMessage() {} func (x *IdpProviderSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[170] + mi := &file_management_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15079,7 +14424,7 @@ func (x *IdpProviderSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IdpProviderSearchRequest.ProtoReflect.Descriptor instead. func (*IdpProviderSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{170} + return file_management_proto_rawDescGZIP(), []int{158} } func (x *IdpProviderSearchRequest) GetOffset() uint64 { @@ -15109,7 +14454,7 @@ type ExternalIDPSearchRequest struct { func (x *ExternalIDPSearchRequest) Reset() { *x = ExternalIDPSearchRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[171] + mi := &file_management_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15122,7 +14467,7 @@ func (x *ExternalIDPSearchRequest) String() string { func (*ExternalIDPSearchRequest) ProtoMessage() {} func (x *ExternalIDPSearchRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[171] + mi := &file_management_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15135,7 +14480,7 @@ func (x *ExternalIDPSearchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalIDPSearchRequest.ProtoReflect.Descriptor instead. func (*ExternalIDPSearchRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{171} + return file_management_proto_rawDescGZIP(), []int{159} } func (x *ExternalIDPSearchRequest) GetOffset() uint64 { @@ -15175,7 +14520,7 @@ type ExternalIDPSearchResponse struct { func (x *ExternalIDPSearchResponse) Reset() { *x = ExternalIDPSearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[172] + mi := &file_management_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15188,7 +14533,7 @@ func (x *ExternalIDPSearchResponse) String() string { func (*ExternalIDPSearchResponse) ProtoMessage() {} func (x *ExternalIDPSearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[172] + mi := &file_management_proto_msgTypes[160] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15201,7 +14546,7 @@ func (x *ExternalIDPSearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalIDPSearchResponse.ProtoReflect.Descriptor instead. func (*ExternalIDPSearchResponse) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{172} + return file_management_proto_rawDescGZIP(), []int{160} } func (x *ExternalIDPSearchResponse) GetOffset() uint64 { @@ -15263,7 +14608,7 @@ type ExternalIDPView struct { func (x *ExternalIDPView) Reset() { *x = ExternalIDPView{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[173] + mi := &file_management_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15276,7 +14621,7 @@ func (x *ExternalIDPView) String() string { func (*ExternalIDPView) ProtoMessage() {} func (x *ExternalIDPView) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[173] + mi := &file_management_proto_msgTypes[161] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15289,7 +14634,7 @@ func (x *ExternalIDPView) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalIDPView.ProtoReflect.Descriptor instead. func (*ExternalIDPView) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{173} + return file_management_proto_rawDescGZIP(), []int{161} } func (x *ExternalIDPView) GetUserId() string { @@ -15354,7 +14699,7 @@ type ExternalIDPRemoveRequest struct { func (x *ExternalIDPRemoveRequest) Reset() { *x = ExternalIDPRemoveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_management_proto_msgTypes[174] + mi := &file_management_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15367,7 +14712,7 @@ func (x *ExternalIDPRemoveRequest) String() string { func (*ExternalIDPRemoveRequest) ProtoMessage() {} func (x *ExternalIDPRemoveRequest) ProtoReflect() protoreflect.Message { - mi := &file_management_proto_msgTypes[174] + mi := &file_management_proto_msgTypes[162] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15380,7 +14725,7 @@ func (x *ExternalIDPRemoveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalIDPRemoveRequest.ProtoReflect.Descriptor instead. func (*ExternalIDPRemoveRequest) Descriptor() ([]byte, []int) { - return file_management_proto_rawDescGZIP(), []int{174} + return file_management_proto_rawDescGZIP(), []int{162} } func (x *ExternalIDPRemoveRequest) GetUserId() string { @@ -15404,6 +14749,741 @@ func (x *ExternalIDPRemoveRequest) GetExternalUserId() string { return "" } +type PasswordComplexityPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinLength uint64 `protobuf:"varint,1,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + HasLowercase bool `protobuf:"varint,2,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` + HasUppercase bool `protobuf:"varint,3,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` + HasNumber bool `protobuf:"varint,4,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` + HasSymbol bool `protobuf:"varint,5,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` + Sequence uint64 `protobuf:"varint,6,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,7,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,8,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *PasswordComplexityPolicy) Reset() { + *x = PasswordComplexityPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[163] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordComplexityPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordComplexityPolicy) ProtoMessage() {} + +func (x *PasswordComplexityPolicy) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[163] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordComplexityPolicy.ProtoReflect.Descriptor instead. +func (*PasswordComplexityPolicy) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{163} +} + +func (x *PasswordComplexityPolicy) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *PasswordComplexityPolicy) GetHasLowercase() bool { + if x != nil { + return x.HasLowercase + } + return false +} + +func (x *PasswordComplexityPolicy) GetHasUppercase() bool { + if x != nil { + return x.HasUppercase + } + return false +} + +func (x *PasswordComplexityPolicy) GetHasNumber() bool { + if x != nil { + return x.HasNumber + } + return false +} + +func (x *PasswordComplexityPolicy) GetHasSymbol() bool { + if x != nil { + return x.HasSymbol + } + return false +} + +func (x *PasswordComplexityPolicy) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PasswordComplexityPolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *PasswordComplexityPolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type PasswordComplexityPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinLength uint64 `protobuf:"varint,1,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + HasLowercase bool `protobuf:"varint,2,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` + HasUppercase bool `protobuf:"varint,3,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` + HasNumber bool `protobuf:"varint,4,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` + HasSymbol bool `protobuf:"varint,5,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` +} + +func (x *PasswordComplexityPolicyRequest) Reset() { + *x = PasswordComplexityPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[164] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordComplexityPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordComplexityPolicyRequest) ProtoMessage() {} + +func (x *PasswordComplexityPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[164] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordComplexityPolicyRequest.ProtoReflect.Descriptor instead. +func (*PasswordComplexityPolicyRequest) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{164} +} + +func (x *PasswordComplexityPolicyRequest) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *PasswordComplexityPolicyRequest) GetHasLowercase() bool { + if x != nil { + return x.HasLowercase + } + return false +} + +func (x *PasswordComplexityPolicyRequest) GetHasUppercase() bool { + if x != nil { + return x.HasUppercase + } + return false +} + +func (x *PasswordComplexityPolicyRequest) GetHasNumber() bool { + if x != nil { + return x.HasNumber + } + return false +} + +func (x *PasswordComplexityPolicyRequest) GetHasSymbol() bool { + if x != nil { + return x.HasSymbol + } + return false +} + +type PasswordComplexityPolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Default bool `protobuf:"varint,1,opt,name=default,proto3" json:"default,omitempty"` + MinLength uint64 `protobuf:"varint,2,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + HasLowercase bool `protobuf:"varint,3,opt,name=has_lowercase,json=hasLowercase,proto3" json:"has_lowercase,omitempty"` + HasUppercase bool `protobuf:"varint,4,opt,name=has_uppercase,json=hasUppercase,proto3" json:"has_uppercase,omitempty"` + HasNumber bool `protobuf:"varint,5,opt,name=has_number,json=hasNumber,proto3" json:"has_number,omitempty"` + HasSymbol bool `protobuf:"varint,6,opt,name=has_symbol,json=hasSymbol,proto3" json:"has_symbol,omitempty"` + Sequence uint64 `protobuf:"varint,7,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,8,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,9,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *PasswordComplexityPolicyView) Reset() { + *x = PasswordComplexityPolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[165] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordComplexityPolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordComplexityPolicyView) ProtoMessage() {} + +func (x *PasswordComplexityPolicyView) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[165] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordComplexityPolicyView.ProtoReflect.Descriptor instead. +func (*PasswordComplexityPolicyView) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{165} +} + +func (x *PasswordComplexityPolicyView) GetDefault() bool { + if x != nil { + return x.Default + } + return false +} + +func (x *PasswordComplexityPolicyView) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *PasswordComplexityPolicyView) GetHasLowercase() bool { + if x != nil { + return x.HasLowercase + } + return false +} + +func (x *PasswordComplexityPolicyView) GetHasUppercase() bool { + if x != nil { + return x.HasUppercase + } + return false +} + +func (x *PasswordComplexityPolicyView) GetHasNumber() bool { + if x != nil { + return x.HasNumber + } + return false +} + +func (x *PasswordComplexityPolicyView) GetHasSymbol() bool { + if x != nil { + return x.HasSymbol + } + return false +} + +func (x *PasswordComplexityPolicyView) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PasswordComplexityPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *PasswordComplexityPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type PasswordAgePolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAgeDays uint64 `protobuf:"varint,1,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` + ExpireWarnDays uint64 `protobuf:"varint,2,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` + Sequence uint64 `protobuf:"varint,3,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *PasswordAgePolicy) Reset() { + *x = PasswordAgePolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[166] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordAgePolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordAgePolicy) ProtoMessage() {} + +func (x *PasswordAgePolicy) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[166] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordAgePolicy.ProtoReflect.Descriptor instead. +func (*PasswordAgePolicy) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{166} +} + +func (x *PasswordAgePolicy) GetMaxAgeDays() uint64 { + if x != nil { + return x.MaxAgeDays + } + return 0 +} + +func (x *PasswordAgePolicy) GetExpireWarnDays() uint64 { + if x != nil { + return x.ExpireWarnDays + } + return 0 +} + +func (x *PasswordAgePolicy) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PasswordAgePolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *PasswordAgePolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type PasswordAgePolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAgeDays uint64 `protobuf:"varint,1,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` + ExpireWarnDays uint64 `protobuf:"varint,2,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` +} + +func (x *PasswordAgePolicyRequest) Reset() { + *x = PasswordAgePolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[167] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordAgePolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordAgePolicyRequest) ProtoMessage() {} + +func (x *PasswordAgePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[167] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordAgePolicyRequest.ProtoReflect.Descriptor instead. +func (*PasswordAgePolicyRequest) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{167} +} + +func (x *PasswordAgePolicyRequest) GetMaxAgeDays() uint64 { + if x != nil { + return x.MaxAgeDays + } + return 0 +} + +func (x *PasswordAgePolicyRequest) GetExpireWarnDays() uint64 { + if x != nil { + return x.ExpireWarnDays + } + return 0 +} + +type PasswordAgePolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Default bool `protobuf:"varint,1,opt,name=default,proto3" json:"default,omitempty"` + MaxAgeDays uint64 `protobuf:"varint,2,opt,name=max_age_days,json=maxAgeDays,proto3" json:"max_age_days,omitempty"` + ExpireWarnDays uint64 `protobuf:"varint,3,opt,name=expire_warn_days,json=expireWarnDays,proto3" json:"expire_warn_days,omitempty"` + Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *PasswordAgePolicyView) Reset() { + *x = PasswordAgePolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[168] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordAgePolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordAgePolicyView) ProtoMessage() {} + +func (x *PasswordAgePolicyView) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[168] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordAgePolicyView.ProtoReflect.Descriptor instead. +func (*PasswordAgePolicyView) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{168} +} + +func (x *PasswordAgePolicyView) GetDefault() bool { + if x != nil { + return x.Default + } + return false +} + +func (x *PasswordAgePolicyView) GetMaxAgeDays() uint64 { + if x != nil { + return x.MaxAgeDays + } + return 0 +} + +func (x *PasswordAgePolicyView) GetExpireWarnDays() uint64 { + if x != nil { + return x.ExpireWarnDays + } + return 0 +} + +func (x *PasswordAgePolicyView) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PasswordAgePolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *PasswordAgePolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type PasswordLockoutPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAttempts uint64 `protobuf:"varint,1,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` + ShowLockoutFailure bool `protobuf:"varint,2,opt,name=show_lockout_failure,json=showLockoutFailure,proto3" json:"show_lockout_failure,omitempty"` + Sequence uint64 `protobuf:"varint,3,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,4,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *PasswordLockoutPolicy) Reset() { + *x = PasswordLockoutPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[169] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordLockoutPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordLockoutPolicy) ProtoMessage() {} + +func (x *PasswordLockoutPolicy) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[169] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordLockoutPolicy.ProtoReflect.Descriptor instead. +func (*PasswordLockoutPolicy) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{169} +} + +func (x *PasswordLockoutPolicy) GetMaxAttempts() uint64 { + if x != nil { + return x.MaxAttempts + } + return 0 +} + +func (x *PasswordLockoutPolicy) GetShowLockoutFailure() bool { + if x != nil { + return x.ShowLockoutFailure + } + return false +} + +func (x *PasswordLockoutPolicy) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PasswordLockoutPolicy) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *PasswordLockoutPolicy) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + +type PasswordLockoutPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MaxAttempts uint64 `protobuf:"varint,1,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` + ShowLockoutFailure bool `protobuf:"varint,2,opt,name=show_lockout_failure,json=showLockoutFailure,proto3" json:"show_lockout_failure,omitempty"` +} + +func (x *PasswordLockoutPolicyRequest) Reset() { + *x = PasswordLockoutPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[170] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordLockoutPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordLockoutPolicyRequest) ProtoMessage() {} + +func (x *PasswordLockoutPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[170] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordLockoutPolicyRequest.ProtoReflect.Descriptor instead. +func (*PasswordLockoutPolicyRequest) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{170} +} + +func (x *PasswordLockoutPolicyRequest) GetMaxAttempts() uint64 { + if x != nil { + return x.MaxAttempts + } + return 0 +} + +func (x *PasswordLockoutPolicyRequest) GetShowLockoutFailure() bool { + if x != nil { + return x.ShowLockoutFailure + } + return false +} + +type PasswordLockoutPolicyView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Default bool `protobuf:"varint,1,opt,name=default,proto3" json:"default,omitempty"` + MaxAttempts uint64 `protobuf:"varint,2,opt,name=max_attempts,json=maxAttempts,proto3" json:"max_attempts,omitempty"` + ShowLockoutFailure bool `protobuf:"varint,3,opt,name=show_lockout_failure,json=showLockoutFailure,proto3" json:"show_lockout_failure,omitempty"` + Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` + CreationDate *timestamp.Timestamp `protobuf:"bytes,5,opt,name=creation_date,json=creationDate,proto3" json:"creation_date,omitempty"` + ChangeDate *timestamp.Timestamp `protobuf:"bytes,6,opt,name=change_date,json=changeDate,proto3" json:"change_date,omitempty"` +} + +func (x *PasswordLockoutPolicyView) Reset() { + *x = PasswordLockoutPolicyView{} + if protoimpl.UnsafeEnabled { + mi := &file_management_proto_msgTypes[171] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PasswordLockoutPolicyView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PasswordLockoutPolicyView) ProtoMessage() {} + +func (x *PasswordLockoutPolicyView) ProtoReflect() protoreflect.Message { + mi := &file_management_proto_msgTypes[171] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PasswordLockoutPolicyView.ProtoReflect.Descriptor instead. +func (*PasswordLockoutPolicyView) Descriptor() ([]byte, []int) { + return file_management_proto_rawDescGZIP(), []int{171} +} + +func (x *PasswordLockoutPolicyView) GetDefault() bool { + if x != nil { + return x.Default + } + return false +} + +func (x *PasswordLockoutPolicyView) GetMaxAttempts() uint64 { + if x != nil { + return x.MaxAttempts + } + return 0 +} + +func (x *PasswordLockoutPolicyView) GetShowLockoutFailure() bool { + if x != nil { + return x.ShowLockoutFailure + } + return false +} + +func (x *PasswordLockoutPolicyView) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PasswordLockoutPolicyView) GetCreationDate() *timestamp.Timestamp { + if x != nil { + return x.CreationDate + } + return nil +} + +func (x *PasswordLockoutPolicyView) GetChangeDate() *timestamp.Timestamp { + if x != nil { + return x.ChangeDate + } + return nil +} + var File_management_proto protoreflect.FileDescriptor var file_management_proto_rawDesc = []byte{ @@ -15430,579 +15510,606 @@ var file_management_proto_rawDesc = []byte{ 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x03, 0x49, 0x61, 0x6d, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xf1, 0x01, 0x0a, 0x03, 0x49, 0x61, 0x6d, 0x12, 0x22, 0x0a, 0x0d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x61, - 0x6d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x73, 0x65, - 0x74, 0x5f, 0x75, 0x70, 0x5f, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x73, 0x65, 0x74, 0x55, 0x70, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x65, - 0x74, 0x5f, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x55, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, - 0x22, 0x87, 0x01, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x65, 0x63, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x63, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x73, 0x63, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, - 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, - 0x69, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x50, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x22, 0x24, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, - 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x21, 0x0a, 0x06, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x33, 0x0a, 0x09, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, - 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x70, 0x0a, 0x11, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, - 0x32, 0x15, 0x5e, 0x5b, 0x5e, 0x5b, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x5d, 0x5d, 0x7b, - 0x31, 0x2c, 0x32, 0x30, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x05, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x22, 0x31, 0x0a, 0x12, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, - 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, 0x32, 0x15, 0x5e, 0x5b, 0x5e, 0x5b, 0x3a, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x3a, 0x5d, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x30, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x75, - 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x05, 0x68, 0x75, - 0x6d, 0x61, 0x6e, 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, 0x0b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x03, 0xf8, - 0x42, 0x01, 0x22, 0x90, 0x05, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x75, 0x6d, - 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0a, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, - 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, - 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, - 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, - 0x64, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, - 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xfa, 0x42, - 0x09, 0x72, 0x07, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, - 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, - 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x18, 0x14, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, - 0x69, 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, - 0x18, 0xc8, 0x01, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x08, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x29, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, - 0x01, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, - 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, - 0x2f, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, - 0x01, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x23, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x48, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x62, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, - 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xf4, 0x03, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb7, 0x03, 0x0a, 0x0c, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x6d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x0b, 0x73, 0x65, + 0x74, 0x5f, 0x75, 0x70, 0x5f, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x53, 0x74, 0x65, 0x70, 0x52, 0x09, 0x73, + 0x65, 0x74, 0x55, 0x70, 0x44, 0x6f, 0x6e, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x73, 0x65, 0x74, 0x5f, + 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x53, 0x74, 0x65, 0x70, 0x52, 0x0c, + 0x73, 0x65, 0x74, 0x55, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0x87, 0x01, 0x0a, + 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, + 0x0a, 0x06, 0x73, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x65, 0x63, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x03, 0x61, 0x73, 0x63, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x12, 0x40, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x12, 0x4b, 0x0a, 0x07, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, 0x0b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x03, - 0xf8, 0x42, 0x01, 0x22, 0xe0, 0x04, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, - 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, - 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x75, - 0x6d, 0x61, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, - 0x12, 0x47, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, - 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, 0x0b, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0x94, 0x04, 0x0a, 0x0d, 0x48, 0x75, 0x6d, 0x61, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, - 0x64, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, - 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, - 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xd7, 0x04, - 0x0a, 0x09, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x45, 0x0a, 0x10, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, - 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, - 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, - 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, - 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, - 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x47, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x85, 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, - 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, - 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, + 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x64, 0x69, 0x74, + 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, + 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x50, 0x0a, + 0x0d, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x17, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x22, + 0x24, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, 0x12, 0x17, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x21, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, + 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x33, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x70, 0x0a, + 0x11, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, 0x32, 0x15, 0x5e, 0x5b, + 0x5e, 0x5b, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x5d, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x30, + 0x30, 0x7d, 0x24, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, + 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, + 0x31, 0x0a, 0x12, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, + 0x72, 0x17, 0x32, 0x15, 0x5e, 0x5b, 0x5e, 0x5b, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x5d, + 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x30, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x12, + 0x50, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x42, 0x0b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0x90, + 0x05, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, + 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x27, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, + 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x09, 0x6e, 0x69, 0x63, + 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x37, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0x72, 0x07, 0x10, + 0x01, 0x18, 0xc8, 0x01, 0x60, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, + 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x70, 0x68, 0x6f, + 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, + 0x14, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, + 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, + 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x29, + 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0a, 0x70, + 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, + 0x18, 0xc8, 0x01, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0e, 0x73, + 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0d, 0x73, + 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x48, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x22, 0x62, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, + 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xf4, 0x03, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcb, 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x4c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, - 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x65, 0x22, 0xae, 0x02, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb7, 0x03, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, + 0x0a, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x05, + 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x12, 0x4b, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x42, 0x0b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, + 0xe0, 0x04, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, + 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, + 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6f, + 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x68, 0x75, 0x6d, + 0x61, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, - 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x22, 0x57, 0x0a, 0x13, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, - 0x65, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, - 0x06, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x22, 0x86, 0x02, - 0x0a, 0x0e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x56, 0x69, 0x65, 0x77, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x22, 0x7b, 0x0a, 0x17, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x61, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x73, - 0x63, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x22, 0xa5, 0x02, 0x0a, 0x18, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, - 0x65, 0x79, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x56, + 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x05, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x12, 0x47, 0x0a, 0x07, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x42, 0x0b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x03, 0xf8, + 0x42, 0x01, 0x22, 0x94, 0x04, 0x0a, 0x0d, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, + 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x73, + 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, + 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xd7, 0x04, 0x0a, 0x09, 0x48, 0x75, + 0x6d, 0x61, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x45, 0x0a, 0x10, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, + 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, + 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, + 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x47, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, + 0x0b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, 0x12, 0x40, 0x0a, 0x0e, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, + 0x03, 0x18, 0xf4, 0x03, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xcb, 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x4c, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, + 0x01, 0x02, 0x20, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x22, + 0xae, 0x02, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6b, 0x65, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0x57, 0x0a, 0x13, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x49, 0x44, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x06, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x22, 0x86, 0x02, 0x0a, 0x0e, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x42, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, + 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x65, 0x22, 0x7b, 0x0a, 0x17, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x73, 0x63, 0x12, 0x20, 0x0a, + 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, + 0xa5, 0x02, 0x0a, 0x18, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x46, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xf4, 0x01, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x73, + 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x65, 0x79, 0x52, 0x0d, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, + 0x61, 0x73, 0x63, 0x12, 0x49, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb8, + 0x01, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x49, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x99, 0x02, 0x0a, 0x12, 0x55, 0x73, + 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x46, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x74, 0x12, 0x40, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x56, 0x69, 0x65, - 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, - 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xf4, 0x01, 0x0a, 0x11, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x54, 0x0a, 0x0e, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x03, 0x61, 0x73, 0x63, 0x12, 0x49, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x49, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, - 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, - 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x99, 0x02, - 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xa2, 0x03, 0x0a, 0x0b, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xf9, - 0x03, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x56, 0x69, - 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xa2, 0x03, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, + 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xf9, 0x03, 0x0a, 0x0f, 0x55, + 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x69, + 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x9e, 0x02, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, + 0x18, 0xc8, 0x01, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, + 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6c, + 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x09, 0x6e, 0x69, 0x63, 0x6b, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, + 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, - 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x75, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, + 0x03, 0x18, 0xc8, 0x01, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, + 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, 0x32, 0x15, + 0x5e, 0x5b, 0x5e, 0x5b, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x5d, 0x5d, 0x7b, 0x31, 0x2c, + 0x32, 0x30, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0xf7, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xfb, 0x01, 0x0a, 0x0d, 0x55, 0x73, + 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, + 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6f, - 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, - 0x64, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x9e, 0x02, 0x0a, 0x18, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, - 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, - 0x01, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x09, 0x6e, - 0x69, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, - 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x11, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x67, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x19, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, - 0x72, 0x17, 0x32, 0x15, 0x5e, 0x5b, 0x5e, 0x5b, 0x3a, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x5d, - 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x30, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xf7, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xfb, 0x01, - 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x76, 0x0a, 0x16, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, - 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x22, 0xf7, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, - 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xfb, 0x01, - 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, - 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x7e, 0x0a, 0x16, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, - 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, - 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x14, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, - 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, - 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0xcd, 0x02, 0x0a, 0x0b, - 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x76, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, + 0xf7, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xfb, 0x01, 0x0a, 0x0d, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, + 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, + 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x7e, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x05, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, + 0x10, 0x01, 0x18, 0x14, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0xcd, 0x02, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xd1, 0x02, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, @@ -16022,786 +16129,65 @@ var file_management_proto_rawDesc = []byte{ 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xd1, 0x02, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, - 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x25, - 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, - 0xfb, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, - 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, - 0x29, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0a, - 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, - 0x03, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0e, - 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0d, - 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x4f, 0x0a, - 0x0c, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x3f, 0x0a, - 0x04, 0x6d, 0x66, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6d, 0x66, 0x61, 0x73, 0x22, 0x8a, - 0x01, 0x0a, 0x0b, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3b, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x66, - 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x46, 0x41, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x51, 0x0a, 0x0f, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, - 0x10, 0x01, 0x18, 0x48, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x7f, - 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xfb, 0x01, 0x0a, 0x18, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x22, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x07, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, + 0x01, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x0b, 0x70, + 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, + 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, + 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x65, + 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x72, 0x65, + 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x4f, 0x0a, 0x0c, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x04, 0x6d, 0x66, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x2c, 0x0a, 0x1a, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xef, 0x03, - 0x0a, 0x18, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, - 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, - 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, 0x70, - 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x79, 0x6d, - 0x62, 0x6f, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x53, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, - 0xf3, 0x01, 0x0a, 0x1e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xf4, - 0x03, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, - 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, - 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, - 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, - 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, - 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x79, - 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x53, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x83, 0x02, 0x0a, 0x1e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x72, 0x03, 0x18, 0xf4, 0x03, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, - 0x63, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x4c, - 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, - 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, - 0x68, 0x61, 0x73, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x25, 0x0a, 0x13, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x8d, 0x03, 0x0a, 0x11, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, - 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x6d, - 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, 0x12, 0x28, 0x0a, - 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x57, - 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x17, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, - 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xf4, 0x03, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x61, - 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x57, 0x61, - 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x17, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xf4, - 0x03, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, - 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, - 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, - 0x64, 0x61, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x22, 0x29, 0x0a, 0x17, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9d, 0x03, 0x0a, 0x15, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x41, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, - 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x1b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, - 0x03, 0x18, 0xf4, 0x03, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x6b, 0x4f, 0x75, - 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x1b, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x72, 0x03, 0x18, 0xf4, 0x03, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, - 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x68, 0x6f, 0x77, - 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x6f, - 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x22, 0x9b, 0x01, - 0x0a, 0x0c, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x15, - 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x5f, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4d, 0x75, 0x73, 0x74, 0x42, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x32, 0x0a, 0x10, 0x4f, - 0x72, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, - 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x83, 0x02, 0x0a, 0x03, 0x4f, 0x72, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x6d, 0x66, 0x61, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x0b, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x66, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x07, 0x4f, 0x72, 0x67, 0x56, 0x69, 0x65, - 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, - 0x29, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x8a, 0x02, 0x0a, 0x09, 0x4f, - 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, - 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xf0, 0x02, 0x0a, 0x0d, 0x4f, 0x72, 0x67, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, - 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x60, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x39, 0x0a, 0x13, 0x41, 0x64, - 0x64, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x97, 0x01, 0x0a, 0x1a, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, - 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x55, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x45, 0x0a, 0x1b, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x3e, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3a, 0x0a, 0x17, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x22, 0x39, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa3, 0x02, - 0x0a, 0x17, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x96, 0x01, 0x0a, 0x16, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4e, 0x0a, 0x07, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc2, 0x01, 0x0a, - 0x14, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x4e, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x09, 0x4f, 0x72, - 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x22, 0x4d, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x46, 0x41, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x51, 0x0a, 0x0f, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x48, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x7f, 0x0a, 0x1e, 0x53, 0x65, + 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, - 0x50, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, - 0x73, 0x22, 0x3a, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xa3, 0x02, - 0x0a, 0x17, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0xea, 0x02, 0x0a, 0x0d, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x96, 0x01, 0x0a, 0x16, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x14, 0x4f, 0x72, - 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x4e, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x36, - 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, - 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9f, 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x43, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x69, 0x65, 0x77, 0x52, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc5, 0x02, 0x0a, 0x0b, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x22, 0x92, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xbe, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x4c, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x8b, 0x02, 0x0a, 0x07, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x2a, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x22, 0xd8, 0x01, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, - 0x10, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x13, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x74, 0x0a, 0x0e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x22, 0x82, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x41, 0x64, 0x64, 0x42, 0x75, 0x6c, 0x6b, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x17, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x91, 0x02, 0x0a, 0x0b, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, - 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, - 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xd8, - 0x01, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, - 0x65, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x47, 0x0a, 0x11, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x22, 0xa7, 0x02, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x47, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, - 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, - 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, - 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc2, 0x01, 0x0a, - 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x50, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x16, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x50, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, - 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xee, 0x02, 0x0a, 0x11, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, - 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xab, 0x02, 0x0a, 0x1b, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x49, 0x0a, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc6, 0x01, 0x0a, 0x1a, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x52, - 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x22, 0xca, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x52, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0xe8, 0x02, 0x0a, 0x0b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x66, 0x0a, 0x10, 0x4f, + 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, + 0x38, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x75, + 0x73, 0x74, 0x5f, 0x62, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4d, 0x75, 0x73, + 0x74, 0x42, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x32, 0x0a, 0x10, 0x4f, 0x72, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, + 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x03, 0x4f, 0x72, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x4f, 0x72, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, @@ -16811,94 +16197,604 @@ var file_management_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x4d, 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0c, 0x0a, 0x0a, - 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x74, 0x0a, 0x11, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, - 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0xf6, 0x05, 0x0a, 0x0a, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x55, 0x72, 0x69, 0x73, 0x12, 0x57, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, - 0x44, 0x43, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4e, 0x0a, - 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0a, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x5e, 0x0a, - 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, - 0x5c, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, - 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x61, - 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, - 0x19, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x16, 0x70, 0x6f, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, 0x12, 0x45, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x25, 0x0a, 0x0e, 0x6e, 0x6f, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, - 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x56, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, - 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x12, 0x19, - 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x64, 0x65, 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x88, 0x05, 0x0a, 0x15, 0x4f, 0x49, - 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, - 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, - 0x12, 0x57, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x87, 0x02, + 0x0a, 0x07, 0x4f, 0x72, 0x67, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x0b, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2d, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x29, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x22, 0x8a, 0x02, 0x0a, 0x09, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, + 0xf0, 0x02, 0x0a, 0x0d, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x69, 0x65, + 0x77, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x60, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x39, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, + 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x97, 0x01, + 0x0a, 0x1a, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x06, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, + 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x12, 0x55, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x49, 0x44, 0x43, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x10, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, + 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x4f, 0x72, 0x67, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x3e, + 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, + 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3a, + 0x0a, 0x17, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x39, 0x0a, 0x16, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa3, 0x02, 0x0a, 0x17, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x69, 0x65, + 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, + 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x96, 0x01, 0x0a, 0x16, + 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x14, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x4e, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x67, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x09, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, + 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x4f, + 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x16, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x17, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, + 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, + 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xea, 0x02, 0x0a, 0x0d, + 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, + 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x16, 0x4f, 0x72, 0x67, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x14, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x4e, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, + 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x9f, 0x02, 0x0a, 0x15, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x43, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x69, 0x65, + 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, + 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xa9, 0x03, 0x0a, 0x0b, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, + 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x92, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4c, + 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xbe, 0x01, 0x0a, + 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x4c, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x08, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0xef, + 0x02, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x22, 0x2a, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xd8, 0x01, 0x0a, + 0x0d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, + 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x63, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x13, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x07, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x74, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x82, 0x01, 0x0a, + 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x42, + 0x75, 0x6c, 0x6b, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x53, 0x0a, 0x0d, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x61, 0x75, 0x74, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x41, 0x64, 0x64, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x22, 0x80, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x19, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x22, 0x91, 0x02, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xd8, 0x01, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, + 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x22, 0x47, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x19, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xa7, 0x02, 0x0a, + 0x19, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc2, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x50, 0x0a, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x16, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x50, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, + 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0xee, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xab, 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x49, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0xc6, 0x01, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x52, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xca, 0x01, 0x0a, + 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x52, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe8, 0x02, 0x0a, 0x0b, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0b, 0x6f, + 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, + 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0x74, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, + 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x07, 0x0a, 0x0a, 0x4f, + 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, 0x12, 0x57, + 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, + 0x44, 0x43, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x67, 0x72, 0x61, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x5c, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, @@ -16912,463 +16808,170 @@ var file_management_proto_rawDesc = []byte{ 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x76, - 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xcc, 0x04, 0x0a, 0x10, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0x2e, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, - 0x69, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, 0x12, 0x57, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x30, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x6f, 0x6e, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x6e, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x74, + 0x12, 0x56, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x76, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x49, 0x44, 0x43, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x4e, 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x0a, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x5e, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x5c, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, - 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x61, - 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, - 0x19, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x16, 0x70, 0x6f, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x76, 0x4d, - 0x6f, 0x64, 0x65, 0x22, 0x33, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0xec, 0x02, 0x0a, 0x0f, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, - 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4d, - 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, - 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x61, 0x70, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa7, 0x02, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, - 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0xc2, 0x01, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, + 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, + 0x0a, 0x1b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x72, + 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, + 0x17, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x06, 0x0a, 0x15, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x50, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x50, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, + 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, 0x12, 0x57, 0x0a, 0x0e, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0xe3, 0x02, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, - 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, - 0x4f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, - 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x4f, 0x72, - 0x67, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x22, 0x72, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x22, 0x51, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x8b, 0x04, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x4f, 0x72, 0x67, 0x49, - 0x64, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x65, 0x64, 0x4f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, - 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x48, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, - 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0x99, 0x01, 0x0a, 0x1b, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x4c, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc4, 0x01, - 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x12, 0x51, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x22, 0xc8, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x51, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x2f, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x22, 0xdd, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x22, 0x9b, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x9e, - 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, - 0x88, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf3, 0x02, 0x0a, 0x16, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, - 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0xb5, 0x02, 0x0a, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4e, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xf4, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x57, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, - 0xd4, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x57, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, + 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, + 0x4f, 0x49, 0x44, 0x43, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, + 0x74, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x70, 0x6f, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x6f, 0x75, + 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x73, 0x12, 0x45, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x49, 0x44, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x59, 0x0a, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x82, 0x03, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x15, 0x0a, - 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, - 0x72, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x93, 0x01, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, - 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, - 0x64, 0x22, 0x69, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x31, 0x0a, 0x13, - 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, - 0x75, 0x6c, 0x6b, 0x12, 0x1a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, - 0x48, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, - 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x05, 0x0a, 0x0d, 0x55, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, - 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, - 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, - 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, - 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x72, 0x67, 0x5f, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x72, 0x67, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x17, 0x55, 0x73, 0x65, - 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x18, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x6f, 0x6c, 0x65, + 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x17, 0x69, 0x64, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x64, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x9d, 0x06, 0x0a, 0x10, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, + 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0d, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, + 0x69, 0x73, 0x12, 0x57, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x0b, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0a, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x10, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x75, 0x74, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x6f, 0x73, + 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x70, 0x6f, + 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x55, 0x72, 0x69, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x76, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x59, 0x0a, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x18, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x6f, 0x6c, 0x65, + 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x17, 0x69, 0x64, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x64, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x33, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0xec, 0x02, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0b, 0x6f, + 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, + 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa7, 0x02, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, @@ -17376,90 +16979,341 @@ var file_management_proto_rawDesc = []byte{ 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x96, - 0x01, 0x0a, 0x16, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x14, 0x55, 0x73, 0x65, 0x72, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x4e, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, + 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc2, + 0x01, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x50, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x50, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x4e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x18, 0x00, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xad, 0x02, 0x0a, 0x1c, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc2, 0x01, 0x0a, 0x1b, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x19, - 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x53, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4e, - 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, + 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe3, 0x02, 0x0a, + 0x0c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x4f, 0x72, 0x67, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, + 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x18, 0x00, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb4, 0x03, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x2d, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x4f, 0x72, 0x67, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x72, 0x0a, + 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x22, 0x51, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x8b, 0x04, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x4f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x28, + 0x0a, 0x10, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x64, 0x4f, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, + 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, + 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x48, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, + 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x99, + 0x01, 0x0a, 0x1b, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4c, 0x0a, 0x07, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xc4, 0x01, 0x0a, 0x19, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x51, + 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x22, 0xc8, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x51, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, + 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2f, 0x0a, 0x17, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xdd, 0x01, + 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x9b, 0x01, + 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, + 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x18, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, + 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x72, 0x61, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x88, 0x01, 0x0a, + 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf3, 0x02, 0x0a, 0x16, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, + 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, + 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, + 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x02, + 0x0a, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x4e, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xf4, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x22, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x57, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd4, 0x01, 0x0a, + 0x1d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x57, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x82, 0x03, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, + 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x44, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x55, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x07, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x69, + 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x31, 0x0a, 0x13, 0x55, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x75, 0x6c, 0x6b, + 0x12, 0x1a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x48, 0x0a, 0x0b, + 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x05, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, @@ -17467,214 +17321,366 @@ var file_management_proto_rawDesc = []byte{ 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x20, 0x0a, 0x05, 0x49, - 0x64, 0x70, 0x49, 0x44, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0xfe, 0x02, - 0x0a, 0x03, 0x49, 0x64, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, - 0x73, 0x72, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x53, - 0x72, 0x63, 0x12, 0x50, 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x5f, - 0x0a, 0x09, 0x49, 0x64, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x73, 0x72, 0x63, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x53, 0x72, 0x63, 0x22, - 0xc9, 0x02, 0x0a, 0x0d, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x67, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x72, 0x67, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, + 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, + 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x96, 0x01, 0x0a, 0x16, + 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x5b, - 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xae, 0x03, 0x0a, 0x13, - 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x73, 0x72, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x53, 0x72, 0x63, 0x12, 0x27, - 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, - 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x14, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x4e, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4e, 0x0a, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x82, 0x01, 0x02, 0x18, 0x00, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0xad, 0x02, 0x0a, 0x1c, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0xc2, 0x01, 0x0a, 0x1b, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x53, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x19, 0x55, 0x73, 0x65, + 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x53, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x82, 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4e, 0x0a, 0x06, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, + 0x02, 0x18, 0x00, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0xb4, 0x03, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x4b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x49, + 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x20, 0x0a, 0x05, 0x49, 0x64, 0x70, 0x49, + 0x44, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0xb6, 0x03, 0x0a, 0x03, 0x49, + 0x64, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, + 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, + 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x50, 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, + 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, 0x6f, + 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0x97, 0x01, 0x0a, 0x09, 0x49, 0x64, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, + 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x73, 0x74, + 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc9, 0x02, + 0x0a, 0x0d, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x12, 0x69, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x10, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xe6, 0x03, 0x0a, 0x13, 0x4f, 0x69, + 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, 0x6c, + 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, + 0x18, 0xc8, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2f, 0x0a, + 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, + 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, + 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, + 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x18, 0x69, 0x64, + 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, + 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, + 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x22, 0x87, 0x03, 0x0a, 0x13, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x06, 0x69, 0x64, + 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x05, 0x69, 0x64, 0x70, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x09, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, + 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x87, 0x03, 0x0a, - 0x13, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x06, 0x69, 0x64, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x69, - 0x64, 0x70, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, - 0x18, 0xc8, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x12, 0x22, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xc8, 0x01, 0x52, 0x06, - 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x69, - 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x10, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x97, 0x02, 0x0a, + 0x11, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x97, 0x02, 0x0a, 0x11, 0x49, 0x64, 0x70, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, - 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3f, 0x0a, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x64, 0x70, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, - 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, - 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0xe1, 0x03, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x56, 0x69, 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, - 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x53, 0x72, 0x63, 0x12, 0x54, 0x0a, 0x0d, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x54, 0x0a, 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, - 0x76, 0x69, 0x65, 0x77, 0x22, 0xa8, 0x02, 0x0a, 0x11, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, - 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, - 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, - 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0f, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, - 0x8a, 0x01, 0x0a, 0x10, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x48, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb6, 0x01, 0x0a, - 0x0e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x48, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, - 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, - 0x64, 0x70, 0x22, 0x9d, 0x01, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x41, 0x64, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x99, 0x04, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x56, 0x69, + 0x65, 0x77, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x73, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, + 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x79, 0x6c, + 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x54, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x54, 0x0a, + 0x0b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x56, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, + 0x11, 0x0a, 0x0f, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x69, + 0x65, 0x77, 0x22, 0xa8, 0x02, 0x0a, 0x11, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x56, 0x69, 0x65, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x69, 0x0a, 0x18, 0x69, 0x64, 0x70, 0x5f, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x15, 0x69, 0x64, 0x70, 0x44, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x12, 0x5b, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0f, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x8a, 0x01, + 0x0a, 0x10, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x48, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x0e, 0x49, + 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x48, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x20, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x98, 0x02, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, + 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xa1, + 0x01, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x25, 0x0a, @@ -17706,7 +17712,7 @@ var file_management_proto_rawDesc = []byte{ 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x69, 0x64, 0x70, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x0f, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, 0xb6, 0x02, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, @@ -17718,93 +17724,247 @@ var file_management_proto_rawDesc = []byte{ 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, 0x22, 0x86, 0x01, 0x0a, 0x0f, 0x49, 0x64, 0x70, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x64, - 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x49, 0x64, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0xa7, 0x02, 0x0a, 0x19, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x47, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x70, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x44, 0x61, 0x74, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x0f, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x64, 0x70, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x3b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x48, 0x0a, 0x18, 0x49, 0x64, 0x70, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x22, 0x61, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, - 0x44, 0x50, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xa7, 0x02, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, - 0x44, 0x50, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, - 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, - 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0xce, 0x02, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, - 0x56, 0x69, 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, - 0x0d, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, - 0x64, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, - 0x64, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, - 0x64, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x49, 0x64, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa7, 0x02, + 0x0a, 0x19, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x47, 0x0a, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, + 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x48, 0x0a, 0x18, 0x49, 0x64, 0x70, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x22, 0x61, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x22, 0xa7, 0x02, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x44, 0x50, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, + 0x56, 0x69, 0x65, 0x77, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2d, 0x0a, 0x12, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x76, + 0x69, 0x65, 0x77, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0d, 0x76, 0x69, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xce, + 0x02, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, 0x56, 0x69, + 0x65, 0x77, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x69, + 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, + 0x28, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x64, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x64, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, + 0x81, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, + 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x22, 0xdb, 0x02, 0x0a, 0x18, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, + 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, + 0x63, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, + 0x55, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, + 0x61, 0x73, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, + 0x73, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, - 0x65, 0x22, 0x81, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, - 0x50, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x64, 0x70, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x69, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x2a, 0xaf, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, + 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x1f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, + 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, + 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, + 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, + 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0xf9, 0x02, 0x0a, + 0x1c, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, + 0x61, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, + 0x61, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x55, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xf9, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x20, + 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, + 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, + 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x44, 0x61, 0x74, 0x65, 0x22, 0x66, 0x0a, 0x18, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, 0x61, + 0x79, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, 0x72, + 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x22, 0x97, 0x02, 0x0a, + 0x15, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x67, 0x65, 0x44, 0x61, + 0x79, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x77, 0x61, 0x72, + 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x86, 0x02, 0x0a, 0x15, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, + 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, + 0x73, 0x0a, 0x1c, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, + 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, + 0x75, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x12, 0x73, 0x68, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x22, 0xa4, 0x02, 0x0a, 0x19, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, + 0x65, 0x77, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, + 0x30, 0x0a, 0x14, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x5f, + 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, + 0x68, 0x6f, 0x77, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3f, 0x0a, + 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x3b, + 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x65, 0x2a, 0x58, 0x0a, 0x0c, 0x49, + 0x61, 0x6d, 0x53, 0x65, 0x74, 0x75, 0x70, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1c, 0x0a, 0x18, 0x69, + 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x55, 0x4e, + 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x69, 0x61, 0x6d, + 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x31, 0x10, 0x01, 0x12, + 0x14, 0x0a, 0x10, 0x69, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x65, + 0x70, 0x5f, 0x32, 0x10, 0x02, 0x2a, 0xaf, 0x01, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x53, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, @@ -17961,1488 +18121,1337 @@ var file_management_proto_rawDesc = []byte{ 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x50, 0x50, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x1b, 0x0a, 0x0b, 0x4f, 0x49, 0x44, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0c, 0x0a, - 0x08, 0x4f, 0x49, 0x44, 0x43, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x00, 0x2a, 0x71, 0x0a, 0x10, 0x4f, - 0x49, 0x44, 0x43, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x19, 0x0a, 0x15, 0x4f, 0x49, 0x44, 0x43, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x49, - 0x44, 0x43, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, - 0x44, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x49, 0x44, - 0x43, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x44, - 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x02, 0x2a, 0x72, - 0x0a, 0x0d, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x24, 0x0a, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, - 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x52, 0x41, - 0x4e, 0x54, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, - 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, - 0x10, 0x02, 0x2a, 0x76, 0x0a, 0x13, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x49, 0x44, - 0x43, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x57, 0x45, 0x42, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x50, - 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, - 0x45, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x49, - 0x44, 0x43, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4e, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x6c, 0x0a, 0x12, 0x4f, 0x49, - 0x44, 0x43, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x55, 0x54, 0x48, 0x4d, 0x45, 0x54, 0x48, - 0x4f, 0x44, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x00, 0x12, 0x1b, - 0x0a, 0x17, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x55, 0x54, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x4f, - 0x49, 0x44, 0x43, 0x41, 0x55, 0x54, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0x5f, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, - 0x12, 0x24, 0x0a, 0x20, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, - 0x45, 0x52, 0x41, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x41, - 0x50, 0x50, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x2a, 0x74, 0x0a, 0x11, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, - 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, - 0x54, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, - 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, - 0x8a, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, - 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, - 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x4a, - 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, - 0x59, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, 0x2a, 0x9c, 0x02, 0x0a, - 0x1b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x27, - 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, - 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x50, 0x52, 0x4f, - 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x4e, - 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, - 0x47, 0x52, 0x41, 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, - 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x02, - 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, - 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, - 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x12, 0x27, 0x0a, 0x23, 0x50, 0x52, 0x4f, 0x4a, 0x45, + 0x08, 0x4f, 0x49, 0x44, 0x43, 0x56, 0x31, 0x5f, 0x30, 0x10, 0x00, 0x2a, 0x40, 0x0a, 0x0d, 0x4f, + 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, + 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x4a, 0x57, 0x54, 0x10, 0x01, 0x2a, 0x71, 0x0a, + 0x10, 0x4f, 0x49, 0x44, 0x43, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x49, 0x44, 0x43, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, + 0x45, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, + 0x4f, 0x49, 0x44, 0x43, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x49, 0x44, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x4f, + 0x49, 0x44, 0x43, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x49, 0x44, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x02, + 0x2a, 0x72, 0x0a, 0x0d, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x24, 0x0a, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x49, 0x44, 0x43, 0x47, + 0x52, 0x41, 0x4e, 0x54, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, + 0x54, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x49, 0x44, 0x43, 0x47, 0x52, 0x41, 0x4e, 0x54, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x54, 0x4f, 0x4b, + 0x45, 0x4e, 0x10, 0x02, 0x2a, 0x76, 0x0a, 0x13, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4f, + 0x49, 0x44, 0x43, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x57, 0x45, 0x42, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x49, 0x44, 0x43, + 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, + 0x4f, 0x49, 0x44, 0x43, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x6c, 0x0a, 0x12, + 0x4f, 0x49, 0x44, 0x43, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x55, 0x54, 0x48, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x00, + 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x55, 0x54, 0x48, 0x4d, 0x45, 0x54, 0x48, + 0x4f, 0x44, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, + 0x17, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x55, 0x54, 0x48, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0x5f, 0x0a, 0x14, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x65, 0x79, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x45, 0x52, 0x41, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x50, 0x50, 0x4c, + 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, + 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x2a, 0x74, 0x0a, 0x11, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, + 0x41, 0x4e, 0x54, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, + 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, + 0x54, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, + 0x02, 0x2a, 0x8a, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x50, + 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, + 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, + 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, + 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, 0x2a, 0x9c, + 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x2b, + 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x4d, 0x45, + 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x50, + 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, 0x45, + 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, + 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, - 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x10, 0x04, - 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, - 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, - 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x05, 0x2a, 0x68, 0x0a, 0x0e, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, - 0x1a, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, - 0x15, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x52, - 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, - 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0xdc, 0x01, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x1e, - 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, - 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x21, 0x0a, 0x1d, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x45, 0x41, - 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, - 0x44, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, - 0x44, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4f, 0x52, 0x47, 0x5f, 0x49, 0x44, - 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4b, 0x45, - 0x59, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, - 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x5f, - 0x49, 0x44, 0x10, 0x05, 0x2a, 0x8b, 0x01, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, - 0x12, 0x27, 0x0a, 0x23, 0x55, 0x53, 0x45, 0x52, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x48, - 0x49, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x53, 0x45, - 0x52, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x48, 0x49, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, - 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x55, + 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, + 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, + 0x59, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x12, 0x27, 0x0a, 0x23, 0x50, 0x52, 0x4f, + 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, + 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x49, 0x44, + 0x10, 0x04, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, + 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x05, 0x2a, 0x68, 0x0a, + 0x0e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x1e, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, + 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0xdc, 0x01, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x22, + 0x0a, 0x1e, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, + 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x53, + 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, + 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x53, 0x45, 0x52, + 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4f, 0x52, 0x47, 0x5f, + 0x49, 0x44, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, 0x4e, + 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, + 0x4b, 0x45, 0x59, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x53, 0x45, 0x52, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x47, 0x52, 0x41, 0x4e, + 0x54, 0x5f, 0x49, 0x44, 0x10, 0x05, 0x2a, 0x8b, 0x01, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x65, 0x79, 0x12, 0x27, 0x0a, 0x23, 0x55, 0x53, 0x45, 0x52, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, + 0x53, 0x48, 0x49, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x53, 0x45, 0x52, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x48, 0x49, 0x50, 0x53, 0x45, 0x41, - 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x44, - 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, - 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, - 0x49, 0x53, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4d, 0x45, 0x4d, - 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x10, - 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, 0x03, 0x2a, - 0x62, 0x0a, 0x08, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x49, - 0x44, 0x50, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, - 0x44, 0x50, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x44, 0x50, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, - 0x45, 0x10, 0x02, 0x2a, 0x79, 0x0a, 0x10, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x49, 0x44, 0x43, 0x4d, - 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x49, 0x44, - 0x43, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x52, - 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x4e, 0x41, 0x4d, 0x45, - 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, - 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x2a, 0x83, - 0x01, 0x0a, 0x0c, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, - 0x1c, 0x0a, 0x18, 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, - 0x1a, 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x49, 0x44, - 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, - 0x11, 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x41, - 0x4d, 0x45, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, - 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x10, 0x03, 0x2a, 0x46, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x17, 0x0a, 0x13, 0x49, 0x44, 0x50, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, 0x50, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, - 0x50, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x4c, 0x10, 0x02, 0x2a, 0x67, 0x0a, 0x0f, - 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1f, 0x0a, 0x1b, 0x49, 0x44, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x54, 0x59, + 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x12, 0x25, 0x0a, + 0x21, 0x55, 0x53, 0x45, 0x52, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, 0x48, 0x49, 0x50, 0x53, + 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, + 0x49, 0x44, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, + 0x0a, 0x17, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x47, + 0x41, 0x4e, 0x49, 0x53, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4d, + 0x45, 0x4d, 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, + 0x54, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x10, + 0x03, 0x2a, 0x4b, 0x0a, 0x0e, 0x49, 0x64, 0x70, 0x53, 0x74, 0x79, 0x6c, 0x69, 0x6e, 0x67, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x44, 0x50, 0x53, 0x54, 0x59, 0x4c, 0x49, 0x4e, + 0x47, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x44, 0x50, 0x53, 0x54, 0x59, 0x4c, 0x49, 0x4e, + 0x47, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0x62, + 0x0a, 0x08, 0x49, 0x64, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x44, + 0x50, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x44, + 0x50, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x44, 0x50, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, + 0x10, 0x02, 0x2a, 0x79, 0x0a, 0x10, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x41, + 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x49, 0x44, 0x43, + 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x52, 0x45, + 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x4e, 0x41, 0x4d, 0x45, 0x10, + 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4f, 0x49, 0x44, 0x43, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, + 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x2a, 0x83, 0x01, + 0x0a, 0x0c, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1c, + 0x0a, 0x18, 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, + 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x49, 0x44, 0x50, + 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, + 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x41, 0x4d, + 0x45, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x49, 0x44, 0x50, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, + 0x4b, 0x45, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x10, 0x03, 0x2a, 0x46, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, + 0x0a, 0x13, 0x49, 0x44, 0x50, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, 0x50, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x44, 0x50, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x4c, 0x10, 0x02, 0x2a, 0x67, 0x0a, 0x0f, 0x49, + 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x1b, 0x49, 0x44, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x1a, 0x0a, 0x16, 0x49, 0x44, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x49, + 0x44, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, + 0x52, 0x47, 0x10, 0x02, 0x2a, 0x5a, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x44, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, - 0x49, 0x44, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4f, 0x52, 0x47, 0x10, 0x02, 0x2a, 0x5a, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4a, - 0x45, 0x43, 0x54, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, 0x44, 0x10, - 0x02, 0x32, 0xac, 0xb5, 0x01, 0x0a, 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x7a, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x68, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x47, 0x0a, 0x05, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x4e, - 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4a, 0x45, + 0x43, 0x54, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x02, + 0x32, 0xc4, 0xb9, 0x01, 0x0a, 0x11, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4b, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x7a, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x6c, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x5a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x44, 0x6f, 0x63, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x5a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x12, 0x66, 0x0a, 0x06, - 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x61, 0x6d, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x06, 0x12, 0x04, 0x2f, 0x69, 0x61, - 0x6d, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x9e, 0x01, 0x0a, 0x0c, 0x49, 0x73, 0x55, 0x73, 0x65, 0x72, 0x55, - 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x69, 0x73, - 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x83, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x42, 0x79, 0x49, 0x44, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x28, 0x2e, + 0x74, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x7a, 0x12, 0x47, 0x0a, 0x05, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x08, 0x12, 0x06, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x4e, 0x0a, + 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x6c, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x5a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x5a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x44, 0x6f, 0x63, 0x73, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x12, 0x66, 0x0a, 0x06, 0x47, + 0x65, 0x74, 0x49, 0x61, 0x6d, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x61, 0x6d, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x06, 0x12, 0x04, 0x2f, 0x69, 0x61, 0x6d, + 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x9e, 0x01, 0x0a, 0x0c, 0x49, 0x73, 0x55, 0x73, 0x65, 0x72, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x69, 0x73, 0x75, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x83, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x42, 0x79, 0x49, 0x44, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x28, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, + 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa9, 0x01, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x79, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x1a, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x22, 0x38, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x62, 0x79, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, + 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x9e, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x90, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, + 0x06, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x44, + 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, - 0x0b, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0b, - 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa9, 0x01, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x79, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x1a, 0x17, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x1a, 0x17, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x6b, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, + 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x6c, 0x6f, + 0x63, 0x6b, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x0a, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, + 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x72, 0x0a, 0x0a, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x1a, 0x28, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x69, 0x65, 0x77, 0x22, 0x38, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2f, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x62, 0x79, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x6e, 0x61, 0x6d, - 0x65, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x9e, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x5f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x90, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, - 0x22, 0x06, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, - 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x0e, - 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, + 0x2a, 0x0b, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, + 0x0d, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x91, + 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0xae, 0x01, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x73, + 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x4b, 0x65, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x2a, 0x1e, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, + 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xbf, 0x01, + 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x1d, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, + 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, + 0xab, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, + 0x79, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x49, 0x44, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x1a, 0x17, 0x2f, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, + 0x65, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, + 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x95, 0x01, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x12, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x38, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x3a, + 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x1a, 0x17, 0x2f, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x6b, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, - 0x1a, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x6c, - 0x6f, 0x63, 0x6b, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x0a, 0x55, 0x6e, 0x6c, 0x6f, 0x63, - 0x6b, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, + 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x13, 0x12, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x95, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xb5, 0x18, 0x0c, + 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa2, 0x01, 0x0a, + 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, + 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, + 0x6c, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2f, 0x5f, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x64, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50, + 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2d, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, 0x22, 0x28, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x2f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa2, 0x01, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x2f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x7c, 0x0a, 0x0f, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x2f, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, - 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x72, 0x0a, 0x0a, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x29, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x2f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, + 0x65, 0x6e, 0x64, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, + 0x22, 0x25, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x2f, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, + 0xaa, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, + 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xce, 0x01, 0x0a, + 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, 0x73, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x44, 0x50, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, + 0x64, 0x70, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, + 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbf, 0x01, + 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x44, 0x50, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x2a, 0x40, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x82, + 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, + 0x8c, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x66, 0x61, 0x73, 0x12, + 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x66, 0x61, 0x73, 0x82, + 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbb, + 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x22, 0x29, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x73, 0x65, 0x74, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, + 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9a, 0x01, 0x0a, + 0x12, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xdd, 0x01, 0x0a, 0x15, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x73, 0x12, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x16, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x09, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0d, 0x2a, 0x0b, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, - 0x18, 0x0d, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x91, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x3a, 0x01, 0x2a, + 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x6f, 0x72, 0x67, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x8e, 0x01, 0x0a, 0x0a, 0x4f, 0x72, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, - 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x12, 0xae, 0x01, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x65, 0x79, - 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x2a, 0x1e, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, - 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xbf, - 0x01, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, - 0x1d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0xab, 0x01, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, 0x49, 0x44, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x4b, 0x65, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, - 0x1e, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x82, - 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x95, - 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x12, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x38, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, - 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x45, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2d, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x22, 0x28, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x95, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xb5, 0x18, - 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa2, 0x01, - 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, - 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, - 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x3a, - 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x45, 0x6d, 0x61, - 0x69, 0x6c, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, - 0x69, 0x6c, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x2f, 0x5f, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x64, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2d, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x69, 0x65, 0x77, 0x22, 0x28, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x2f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa2, 0x01, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x1a, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x2f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, - 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x7c, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x26, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x29, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x2a, 0x11, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x1b, 0x52, 0x65, - 0x73, 0x65, 0x6e, 0x64, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2a, 0x22, 0x25, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, - 0x68, 0x6f, 0x6e, 0x65, 0x2f, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, - 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x95, 0x01, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, - 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x13, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xce, 0x01, - 0x0a, 0x16, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, 0x73, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x49, 0x44, 0x50, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, 0x50, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x69, 0x64, 0x70, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, - 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbf, - 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x44, 0x50, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x44, - 0x50, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x2a, 0x40, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, - 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x66, 0x61, 0x73, - 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x46, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x66, 0x61, 0x73, - 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, - 0xbb, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x22, - 0x29, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x73, 0x65, 0x74, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x0c, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9a, 0x01, - 0x0a, 0x12, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x5f, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xdd, 0x01, 0x0a, 0x15, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x73, 0x12, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x68, 0x69, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, - 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, - 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x68, 0x69, 0x70, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x16, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x68, 0x69, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa8, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x37, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x78, 0x69, 0x74, 0x79, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xb7, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x82, 0xb5, - 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, - 0xd7, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x3e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x1a, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x78, 0x69, 0x74, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xd7, 0x01, 0x0a, 0x1e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3e, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x38, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x1a, 0x1e, - 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x12, 0xaf, 0x01, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x20, 0x2a, 0x1e, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, - 0x74, 0x79, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x19, 0x12, 0x17, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x61, 0x67, 0x65, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbb, 0x01, 0x0a, 0x17, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, 0x2f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, - 0x2f, 0x61, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xbb, 0x01, 0x0a, 0x17, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, - 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x31, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x1a, 0x17, 0x2f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x61, - 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9a, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x2a, 0x17, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x61, 0x67, - 0x65, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x6c, 0x6f, - 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xcb, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, - 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x3a, - 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x12, 0xcb, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, - 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, - 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x1a, 0x1b, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, - 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x2a, 0x1b, 0x2f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, - 0x2f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x84, 0x01, 0x0a, 0x09, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x22, 0x05, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x3a, - 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0c, 0x0a, 0x0a, 0x6f, 0x72, 0x67, 0x2e, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x0a, 0x4f, 0x72, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x12, 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x12, 0x6b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x56, 0x69, 0x65, 0x77, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, - 0x6d, 0x65, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0x9c, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x42, 0x79, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x56, 0x69, 0x65, 0x77, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x18, 0x12, 0x16, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2f, 0x6f, 0x72, 0x67, 0x73, - 0x2f, 0x5f, 0x62, 0x79, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, - 0x6f, 0x72, 0x67, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, - 0x7e, 0x0a, 0x0f, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, - 0x72, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x1a, 0x14, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, - 0x65, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, - 0x7e, 0x0a, 0x0f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, - 0x72, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x1a, 0x14, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, - 0x65, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, - 0xb8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, - 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0a, - 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x9c, 0x01, 0x0a, 0x0e, 0x41, - 0x64, 0x64, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x33, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x64, 0x64, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x2a, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, - 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xdf, 0x01, 0x0a, 0x1d, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2b, 0x2f, 0x6f, - 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, 0x7b, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, - 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xad, 0x01, 0x0a, 0x13, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, + 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x2e, 0x72, 0x65, 0x61, + 0x64, 0x12, 0x6b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x22, 0x2a, 0x2f, - 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, - 0x7b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, - 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa3, 0x01, 0x0a, 0x15, - 0x53, 0x65, 0x74, 0x4d, 0x79, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4f, 0x72, 0x67, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4f, 0x72, - 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x22, 0x22, - 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x2f, 0x7b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x12, 0x95, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x79, 0x4f, 0x72, - 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x56, 0x69, 0x65, 0x77, 0x22, 0x1e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, + 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, 0x6f, 0x72, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x9c, + 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x42, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x12, 0x26, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, - 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x2a, - 0x19, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x73, 0x2f, 0x7b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, - 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, - 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x8d, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x6f, 0x72, 0x67, - 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x82, - 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, - 0x72, 0x65, 0x61, 0x64, 0x12, 0xa3, 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x4f, 0x72, - 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x72, 0x67, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x1a, + 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x72, 0x67, 0x56, 0x69, 0x65, 0x77, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x12, 0x16, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x5f, + 0x62, 0x79, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x6f, 0x72, + 0x67, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x7e, 0x0a, + 0x0f, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x22, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x1a, 0x14, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, + 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, + 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x7e, 0x0a, + 0x0f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x22, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x1a, 0x14, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, + 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, + 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb8, 0x01, + 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, - 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, - 0x10, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb3, 0x01, 0x0a, 0x11, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, + 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, + 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0a, 0x0a, 0x08, + 0x6f, 0x72, 0x67, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x9c, 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, + 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x33, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, 0x2f, 0x6f, 0x72, - 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, - 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x9e, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, - 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a, 0x1a, - 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, - 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0xbf, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x79, 0x4f, 0x72, - 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1d, 0x22, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, - 0x18, 0x11, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x2a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, + 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xdf, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x30, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x82, 0xb5, - 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0xad, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2b, 0x2f, 0x6f, 0x72, 0x67, + 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, 0x7b, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, + 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xad, 0x01, 0x0a, 0x13, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x22, 0x2a, 0x2f, 0x6f, 0x72, + 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, 0x7b, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, + 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa3, 0x01, 0x0a, 0x15, 0x53, 0x65, + 0x74, 0x4d, 0x79, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4f, 0x72, 0x67, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x12, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, - 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0x93, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x79, 0x49, 0x44, - 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, 0x1a, 0x2b, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, - 0x12, 0x0e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x65, - 0x61, 0x64, 0x12, 0x02, 0x49, 0x64, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x22, - 0x09, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x10, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0xa0, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x1a, 0x0e, 0x2f, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x13, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x02, 0x49, 0x64, 0x12, 0xa5, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x44, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4f, 0x72, 0x67, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x22, 0x22, 0x2f, 0x6f, + 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, 0x7b, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, + 0x95, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3c, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xa5, 0x01, 0x0a, - 0x11, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, 0x1a, 0x27, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, - 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, - 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x13, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x02, 0x49, 0x64, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x2a, 0x0e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x82, 0xb5, 0x18, 0x14, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xc7, 0x01, 0x0a, 0x15, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x12, 0xbe, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x79, 0x49, 0x44, 0x12, 0x2e, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x30, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x22, - 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, - 0x64, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, - 0x72, 0x65, 0x61, 0x64, 0x12, 0x9d, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x15, 0x0a, - 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, - 0x72, 0x65, 0x61, 0x64, 0x12, 0xe6, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x22, 0x26, - 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x5f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x20, 0x0a, 0x13, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x72, 0x65, - 0x61, 0x64, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xb4, 0x01, - 0x0a, 0x10, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x41, 0x64, 0x64, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1a, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x02, 0x49, 0x64, 0x12, 0xc4, 0x01, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x1a, 0x20, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x1a, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xab, 0x01, 0x0a, 0x13, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x2a, 0x20, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x1b, 0x0a, 0x15, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xdc, 0x01, 0x0a, 0x12, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x09, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2e, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x1a, 0x2b, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, - 0x22, 0x14, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x18, 0x0a, 0x12, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xa3, 0x01, 0x0a, 0x12, 0x42, 0x75, 0x6c, 0x6b, 0x41, 0x64, - 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x32, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x42, 0x75, 0x6c, 0x6b, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, - 0x22, 0x1a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x5f, 0x62, 0x75, 0x6c, 0x6b, 0x3a, 0x01, 0x2a, 0x82, - 0xb5, 0x18, 0x18, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, - 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xb6, 0x01, 0x0a, 0x11, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, - 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x18, 0x0a, 0x12, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x02, 0x49, 0x64, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x72, 0x67, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a, 0x1a, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x82, 0xb5, 0x18, 0x19, 0x0a, 0x13, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xe2, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2b, 0x2f, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1d, 0x0a, 0x10, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xc4, 0x01, 0x0a, 0x0f, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x49, 0x44, 0x12, - 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x1a, 0x2f, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x2a, 0x19, 0x2f, + 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, + 0x7b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x82, 0xb5, 0x18, 0x0b, 0x0a, 0x09, 0x6f, 0x72, + 0x67, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, + 0x79, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, + 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x61, 0x6d, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x8d, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x72, + 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x6f, + 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa3, 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x4d, 0x79, + 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x72, + 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x22, - 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x82, 0xb5, 0x18, 0x1d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, - 0x70, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0xb8, 0x01, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x15, 0x22, 0x10, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x6f, 0x72, 0x67, 0x2e, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb3, 0x01, 0x0a, + 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, 0x2f, + 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, + 0x0a, 0x10, 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x79, 0x4f, + 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x2a, 0x1a, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x13, + 0x0a, 0x11, 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0xbf, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x79, + 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, + 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xd2, 0x01, - 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x2b, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0xad, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, + 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0x93, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x79, + 0x49, 0x44, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, 0x1a, 0x2b, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x69, 0x65, 0x77, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x02, 0x49, 0x64, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x0e, 0x22, 0x09, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x10, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0xa0, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x34, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x1a, 0x0e, 0x2f, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x13, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xa5, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x0d, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xa5, + 0x01, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, 0x1a, + 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, + 0x1a, 0x1a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x13, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0x82, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x2a, 0x0e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x14, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xc7, 0x01, 0x0a, 0x15, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x18, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbe, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x79, 0x49, 0x44, 0x12, + 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, + 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, + 0x77, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x9d, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x38, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x82, 0xb5, 0x18, + 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xe6, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, + 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, + 0x22, 0x26, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x20, 0x0a, + 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, + 0xb4, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x41, 0x64, 0x64, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1a, 0x0a, 0x14, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xc4, 0x01, 0x0a, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x2d, 0x22, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x3a, 0x01, 0x2a, - 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, - 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x12, 0xca, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2b, 0x2e, 0x63, 0x61, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x1a, 0x20, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x1a, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xab, 0x01, + 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x2a, 0x20, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x1b, + 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xdc, 0x01, 0x0a, 0x12, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, + 0x24, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x5f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, + 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x0e, 0x41, + 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2e, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x1a, 0x2b, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x19, 0x22, 0x14, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x18, 0x0a, + 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xa3, 0x01, 0x0a, 0x12, 0x42, 0x75, 0x6c, 0x6b, + 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x32, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x42, 0x75, + 0x6c, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x5f, 0x62, 0x75, 0x6c, 0x6b, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x18, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, + 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xb6, 0x01, + 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x1a, 0x1a, 0x2f, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x18, 0x0a, 0x12, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0x9f, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a, + 0x1a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x82, 0xb5, 0x18, 0x19, 0x0a, + 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x02, 0x49, 0x64, 0x12, 0xe2, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, 0x2b, 0x2f, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1d, + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xc4, 0x01, + 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x49, + 0x44, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, + 0x77, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x1d, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x64, 0x12, 0xb8, 0x01, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x73, 0x65, 0x63, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, + 0xd2, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x49, 0x44, 0x43, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x22, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x3a, + 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x61, 0x70, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x64, 0x12, 0xca, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2b, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2d, 0x1a, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, + 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, + 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, + 0x64, 0x12, 0xd6, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, - 0x1a, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, - 0xd6, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, + 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, + 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xd6, 0x01, 0x0a, 0x15, 0x52, + 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x61, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, + 0x70, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x64, 0x12, 0xaf, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xd6, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x1a, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, - 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0xaf, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x53, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x2a, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x82, 0xb5, 0x18, 0x1f, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, - 0x70, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x64, 0x12, 0xe9, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x2a, 0x28, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x1f, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x61, 0x70, 0x70, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xe9, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x49, 0x44, 0x43, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x1a, 0x3f, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x6f, 0x69, 0x64, 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, - 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, - 0xef, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4f, 0x49, - 0x44, 0x43, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2d, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x1a, 0x2c, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x74, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x4c, 0x1a, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x69, - 0x64, 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x82, + 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x1a, 0x3f, 0x2f, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x64, 0x12, 0xe1, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, - 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, - 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1f, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xb8, 0x01, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x44, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x30, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x22, 0x42, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x14, 0x0a, 0x12, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0xb9, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x2c, 0x2e, 0x63, 0x61, + 0x64, 0x12, 0xef, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x1a, + 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x74, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x1a, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, + 0x6f, 0x69, 0x64, 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x1e, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, + 0x70, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x09, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x49, 0x64, 0x12, 0xe1, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x22, 0x22, 0x1d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, - 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xbe, 0x01, 0x0a, - 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x12, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x1a, 0x22, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xca, 0x01, - 0x0a, 0x16, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x1a, 0x2e, - 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xca, 0x01, 0x0a, 0x16, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x1a, 0x2e, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, - 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, - 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa2, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2e, - 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x2a, 0x22, - 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, - 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x16, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xb4, 0x01, 0x0a, - 0x1a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x45, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x1b, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x72, - 0x65, 0x61, 0x64, 0x12, 0x82, 0x02, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x12, 0x3f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, 0x2f, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x5f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1b, 0x0a, 0x19, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xdf, 0x01, 0x0a, 0x15, 0x41, 0x64, 0x64, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x41, 0x64, 0x64, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1f, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x09, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0xb8, 0x01, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x44, 0x12, 0x2e, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x30, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x22, 0x42, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x14, 0x0a, 0x12, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0xb9, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x5b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x22, 0x30, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, - 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1c, 0x0a, 0x1a, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xef, 0x01, 0x0a, 0x18, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x2c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x41, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x22, 0x22, 0x1d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xbe, + 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x1a, + 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, + 0xca, 0x01, 0x0a, 0x16, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, + 0x1a, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xca, 0x01, 0x0a, + 0x16, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x1a, 0x3a, 0x2f, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x2c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x52, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x1a, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x67, 0x72, - 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, - 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1c, + 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, + 0x82, 0xb5, 0x18, 0x15, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa2, 0x01, 0x0a, 0x12, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, + 0x2a, 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x16, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xb4, + 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x45, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x82, 0xb5, 0x18, 0x1b, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x82, 0x02, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x12, 0x3f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x22, 0x38, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1b, 0x0a, + 0x19, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xdf, 0x01, 0x0a, 0x15, 0x41, + 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x41, 0x64, 0x64, 0x1a, 0x32, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x22, 0x30, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x1c, 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xd1, 0x01, 0x0a, - 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xef, 0x01, 0x0a, + 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x63, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x3c, 0x2a, 0x3a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x82, - 0xb5, 0x18, 0x1d, 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0xba, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x5f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa6, 0x01, - 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x44, 0x12, - 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x2d, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x22, 0x39, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa7, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x63, 0x61, 0x6f, - 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x29, 0x2e, 0x63, 0x61, + 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x1a, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x1a, + 0x3a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, + 0x18, 0x1c, 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xd1, + 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x1a, 0x1c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, - 0xb8, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x63, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x2a, 0x3a, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x7d, 0x82, 0xb5, 0x18, 0x1d, 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0xba, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, - 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, - 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x1a, 0x28, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, - 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, - 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, - 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x37, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2d, 0x1a, 0x28, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, - 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, + 0x22, 0x15, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, + 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, + 0xa6, 0x01, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x79, 0x49, + 0x44, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x2d, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x65, 0x77, 0x22, 0x39, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x11, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa7, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x29, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x22, 0x17, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, + 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x1a, 0x1c, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, + 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, + 0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x12, 0xb8, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3b, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x2a, 0x1c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x13, - 0x42, 0x75, 0x6c, 0x6b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x1a, 0x28, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb8, 0x01, 0x0a, + 0x13, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, + 0x44, 0x1a, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0x49, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2d, 0x1a, 0x28, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x12, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x2a, 0x12, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x5f, 0x62, 0x75, 0x6c, 0x6b, 0x3a, 0x01, 0x2a, 0x82, - 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x07, 0x49, 0x64, 0x70, 0x42, 0x79, - 0x49, 0x44, 0x12, 0x25, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x27, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x2a, 0x1c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, + 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x98, 0x01, + 0x0a, 0x13, 0x42, 0x75, 0x6c, 0x6b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x2a, 0x12, 0x2f, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x5f, 0x62, 0x75, 0x6c, 0x6b, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x13, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x07, 0x49, 0x64, 0x70, + 0x42, 0x79, 0x49, 0x44, 0x12, 0x25, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x27, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, + 0x56, 0x69, 0x65, 0x77, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x6f, + 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x12, 0x9b, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x69, 0x64, + 0x63, 0x49, 0x64, 0x70, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x56, 0x69, - 0x65, 0x77, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x6f, 0x72, 0x67, - 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, - 0x18, 0x0e, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, - 0x12, 0x9b, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x69, 0x64, 0x63, 0x49, - 0x64, 0x70, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x30, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, - 0x64, 0x70, 0x73, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, - 0x0d, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x93, - 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x23, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x64, 0x70, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x6f, 0x72, 0x67, - 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x2e, 0x63, - 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x70, 0x49, 0x44, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, - 0x1a, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, + 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, + 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x12, 0x93, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, + 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x64, 0x70, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x1a, 0x12, 0x2f, 0x6f, + 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x63, 0x74, + 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, @@ -19450,128 +19459,321 @@ var file_management_proto_rawDesc = []byte{ 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x1a, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, + 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x64, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x2e, 0x69, - 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x7f, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x2e, 0x63, 0x61, - 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, - 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, - 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x2e, - 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xba, 0x01, 0x0a, 0x13, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, - 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x1a, 0x21, 0x2f, - 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, - 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa5, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x49, 0x64, 0x70, 0x73, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, - 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x25, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x64, 0x70, 0x49, 0x44, 0x1a, 0x23, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x22, 0x3c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x23, 0x1a, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, + 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, + 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x7f, 0x0a, 0x0f, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x64, 0x70, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, + 0x64, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, + 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xba, 0x01, 0x0a, 0x13, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x33, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, + 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x49, 0x64, + 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x1a, + 0x21, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x2e, 0x69, + 0x64, 0x70, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa5, 0x01, 0x0a, 0x0a, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0x70, 0x73, 0x12, 0x30, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, 0x64, 0x70, - 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, - 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x8b, - 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x19, 0x12, 0x17, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x82, 0xb5, 0x18, 0x0d, 0x0a, - 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xa6, 0x01, 0x0a, - 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, - 0x64, 0x64, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x15, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x69, + 0x64, 0x70, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, + 0x18, 0x0e, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x2e, 0x69, 0x64, 0x70, 0x2e, 0x72, 0x65, 0x61, 0x64, + 0x12, 0x8b, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x2f, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x30, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x19, 0x12, 0x17, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x82, 0xb5, 0x18, + 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0x97, + 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x2f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, + 0x77, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x6f, 0x72, 0x67, 0x73, + 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xa3, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x2e, 0x63, 0x61, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xaa, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, - 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x1a, 0x17, 0x2f, - 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x11, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x2a, 0x17, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, - 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, - 0x6e, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0xdb, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, - 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, - 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, - 0x22, 0x2c, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, - 0x2a, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, - 0x61, 0x64, 0x12, 0xbd, 0x01, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, - 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, - 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, - 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, + 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x34, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1c, 0x1a, 0x17, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x12, 0xbc, 0x01, 0x0a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x64, 0x70, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x72, 0x6f, 0x6d, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, - 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x51, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x22, 0x34, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, - 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, - 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x82, + 0x74, 0x65, 0x12, 0x77, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x2a, + 0x17, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xdb, 0x01, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, + 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, + 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x22, 0x2c, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, + 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x5f, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbd, 0x01, 0x0a, 0x1b, 0x41, 0x64, + 0x64, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x6f, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x1a, 0x2b, 0x2e, 0x63, 0x61, 0x6f, 0x73, + 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x70, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, 0x24, + 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x20, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, + 0x72, 0x6f, 0x6d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, + 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x44, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x2a, 0x34, 0x2f, + 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x2f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x2f, 0x69, 0x64, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x69, 0x64, 0x7d, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xb3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x3c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, + 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x3e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x27, 0x12, 0x25, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbf, 0x01, 0x0a, 0x22, + 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x3c, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, + 0x12, 0x2a, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x82, 0xb5, 0x18, 0x0d, + 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xdf, 0x01, + 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x3f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x42, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, + 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, + 0xdf, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x3f, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x42, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x1a, 0x25, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x42, 0xc5, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, - 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x92, 0x41, 0x94, 0x01, 0x12, 0x47, 0x0a, 0x0e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x41, 0x50, 0x49, 0x22, 0x30, 0x12, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x73, - 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, - 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x32, 0x03, 0x30, 0x2e, 0x31, 0x2a, 0x01, - 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, - 0x73, 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x67, 0x72, 0x70, 0x63, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x12, 0x92, 0x01, 0x0a, 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x2a, 0x25, 0x2f, 0x6f, + 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, + 0x69, 0x74, 0x79, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, + 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x37, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, + 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x2f, 0x61, 0x67, 0x65, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xaa, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, + 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, + 0x61, 0x67, 0x65, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0xc3, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, + 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x22, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x2f, 0x61, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xc3, 0x01, 0x0a, 0x17, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x38, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, + 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x31, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x1a, 0x1e, 0x2f, 0x6f, 0x72, + 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x61, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x82, 0xb5, + 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x12, 0x84, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x41, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x39, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x20, 0x2a, 0x1e, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x2f, 0x61, 0x67, 0x65, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xaa, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x63, + 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, + 0x22, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x6c, 0x6f, 0x63, 0x6b, + 0x6f, 0x75, 0x74, 0x82, 0xb5, 0x18, 0x0d, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x72, 0x65, 0x61, 0x64, 0x12, 0xb6, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, + 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x39, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x69, 0x65, 0x77, 0x22, 0x40, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x82, 0xb5, 0x18, 0x0d, + 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x12, 0xd3, 0x01, + 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3c, 0x2e, + 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x61, + 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x6f, 0x72, 0x67, + 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x6c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x3a, 0x01, + 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x12, 0xd3, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x3c, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, + 0x65, 0x6c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, + 0x6b, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x35, 0x2e, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, 0x6f, + 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, + 0x1a, 0x22, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x6c, 0x6f, 0x63, + 0x6b, 0x6f, 0x75, 0x74, 0x3a, 0x01, 0x2a, 0x82, 0xb5, 0x18, 0x0e, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x8c, 0x01, 0x0a, 0x1b, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x63, 0x6b, + 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x24, 0x2a, 0x22, 0x2f, 0x6f, 0x72, 0x67, 0x73, 0x2f, 0x6d, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x2f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2f, 0x6c, 0x6f, + 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0xc5, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, + 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x92, 0x41, 0x94, 0x01, 0x12, 0x47, 0x0a, 0x0e, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x50, 0x49, 0x22, 0x30, + 0x12, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, + 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x32, 0x03, 0x30, 0x2e, 0x31, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x3a, 0x10, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -19586,727 +19788,749 @@ func file_management_proto_rawDescGZIP() []byte { return file_management_proto_rawDescData } -var file_management_proto_enumTypes = make([]protoimpl.EnumInfo, 37) -var file_management_proto_msgTypes = make([]protoimpl.MessageInfo, 175) +var file_management_proto_enumTypes = make([]protoimpl.EnumInfo, 40) +var file_management_proto_msgTypes = make([]protoimpl.MessageInfo, 172) var file_management_proto_goTypes = []interface{}{ - (UserState)(0), // 0: caos.zitadel.management.api.v1.UserState - (Gender)(0), // 1: caos.zitadel.management.api.v1.Gender - (MachineKeyType)(0), // 2: caos.zitadel.management.api.v1.MachineKeyType - (UserSearchKey)(0), // 3: caos.zitadel.management.api.v1.UserSearchKey - (SearchMethod)(0), // 4: caos.zitadel.management.api.v1.SearchMethod - (MfaType)(0), // 5: caos.zitadel.management.api.v1.MfaType - (MFAState)(0), // 6: caos.zitadel.management.api.v1.MFAState - (NotificationType)(0), // 7: caos.zitadel.management.api.v1.NotificationType - (PolicyState)(0), // 8: caos.zitadel.management.api.v1.PolicyState - (OrgState)(0), // 9: caos.zitadel.management.api.v1.OrgState - (OrgDomainValidationType)(0), // 10: caos.zitadel.management.api.v1.OrgDomainValidationType - (OrgDomainSearchKey)(0), // 11: caos.zitadel.management.api.v1.OrgDomainSearchKey - (OrgMemberSearchKey)(0), // 12: caos.zitadel.management.api.v1.OrgMemberSearchKey - (ProjectSearchKey)(0), // 13: caos.zitadel.management.api.v1.ProjectSearchKey - (ProjectState)(0), // 14: caos.zitadel.management.api.v1.ProjectState - (ProjectRoleSearchKey)(0), // 15: caos.zitadel.management.api.v1.ProjectRoleSearchKey - (ProjectMemberSearchKey)(0), // 16: caos.zitadel.management.api.v1.ProjectMemberSearchKey - (AppState)(0), // 17: caos.zitadel.management.api.v1.AppState - (OIDCVersion)(0), // 18: caos.zitadel.management.api.v1.OIDCVersion - (OIDCResponseType)(0), // 19: caos.zitadel.management.api.v1.OIDCResponseType - (OIDCGrantType)(0), // 20: caos.zitadel.management.api.v1.OIDCGrantType - (OIDCApplicationType)(0), // 21: caos.zitadel.management.api.v1.OIDCApplicationType - (OIDCAuthMethodType)(0), // 22: caos.zitadel.management.api.v1.OIDCAuthMethodType - (ApplicationSearchKey)(0), // 23: caos.zitadel.management.api.v1.ApplicationSearchKey - (ProjectGrantState)(0), // 24: caos.zitadel.management.api.v1.ProjectGrantState - (ProjectGrantSearchKey)(0), // 25: caos.zitadel.management.api.v1.ProjectGrantSearchKey - (ProjectGrantMemberSearchKey)(0), // 26: caos.zitadel.management.api.v1.ProjectGrantMemberSearchKey - (UserGrantState)(0), // 27: caos.zitadel.management.api.v1.UserGrantState - (UserGrantSearchKey)(0), // 28: caos.zitadel.management.api.v1.UserGrantSearchKey - (UserMembershipSearchKey)(0), // 29: caos.zitadel.management.api.v1.UserMembershipSearchKey - (MemberType)(0), // 30: caos.zitadel.management.api.v1.MemberType - (IdpState)(0), // 31: caos.zitadel.management.api.v1.IdpState - (OIDCMappingField)(0), // 32: caos.zitadel.management.api.v1.OIDCMappingField - (IdpSearchKey)(0), // 33: caos.zitadel.management.api.v1.IdpSearchKey - (IdpType)(0), // 34: caos.zitadel.management.api.v1.IdpType - (IdpProviderType)(0), // 35: caos.zitadel.management.api.v1.IdpProviderType - (ProjectType)(0), // 36: caos.zitadel.management.api.v1.ProjectType - (*ZitadelDocs)(nil), // 37: caos.zitadel.management.api.v1.ZitadelDocs - (*Iam)(nil), // 38: caos.zitadel.management.api.v1.Iam - (*ChangeRequest)(nil), // 39: caos.zitadel.management.api.v1.ChangeRequest - (*Changes)(nil), // 40: caos.zitadel.management.api.v1.Changes - (*Change)(nil), // 41: caos.zitadel.management.api.v1.Change - (*ApplicationID)(nil), // 42: caos.zitadel.management.api.v1.ApplicationID - (*ProjectID)(nil), // 43: caos.zitadel.management.api.v1.ProjectID - (*UserID)(nil), // 44: caos.zitadel.management.api.v1.UserID - (*LoginName)(nil), // 45: caos.zitadel.management.api.v1.LoginName - (*UniqueUserRequest)(nil), // 46: caos.zitadel.management.api.v1.UniqueUserRequest - (*UniqueUserResponse)(nil), // 47: caos.zitadel.management.api.v1.UniqueUserResponse - (*CreateUserRequest)(nil), // 48: caos.zitadel.management.api.v1.CreateUserRequest - (*CreateHumanRequest)(nil), // 49: caos.zitadel.management.api.v1.CreateHumanRequest - (*CreateMachineRequest)(nil), // 50: caos.zitadel.management.api.v1.CreateMachineRequest - (*UserResponse)(nil), // 51: caos.zitadel.management.api.v1.UserResponse - (*UserView)(nil), // 52: caos.zitadel.management.api.v1.UserView - (*HumanResponse)(nil), // 53: caos.zitadel.management.api.v1.HumanResponse - (*HumanView)(nil), // 54: caos.zitadel.management.api.v1.HumanView - (*MachineResponse)(nil), // 55: caos.zitadel.management.api.v1.MachineResponse - (*MachineView)(nil), // 56: caos.zitadel.management.api.v1.MachineView - (*UpdateMachineRequest)(nil), // 57: caos.zitadel.management.api.v1.UpdateMachineRequest - (*AddMachineKeyRequest)(nil), // 58: caos.zitadel.management.api.v1.AddMachineKeyRequest - (*AddMachineKeyResponse)(nil), // 59: caos.zitadel.management.api.v1.AddMachineKeyResponse - (*MachineKeyIDRequest)(nil), // 60: caos.zitadel.management.api.v1.MachineKeyIDRequest - (*MachineKeyView)(nil), // 61: caos.zitadel.management.api.v1.MachineKeyView - (*MachineKeySearchRequest)(nil), // 62: caos.zitadel.management.api.v1.MachineKeySearchRequest - (*MachineKeySearchResponse)(nil), // 63: caos.zitadel.management.api.v1.MachineKeySearchResponse - (*UserSearchRequest)(nil), // 64: caos.zitadel.management.api.v1.UserSearchRequest - (*UserSearchQuery)(nil), // 65: caos.zitadel.management.api.v1.UserSearchQuery - (*UserSearchResponse)(nil), // 66: caos.zitadel.management.api.v1.UserSearchResponse - (*UserProfile)(nil), // 67: caos.zitadel.management.api.v1.UserProfile - (*UserProfileView)(nil), // 68: caos.zitadel.management.api.v1.UserProfileView - (*UpdateUserProfileRequest)(nil), // 69: caos.zitadel.management.api.v1.UpdateUserProfileRequest - (*UpdateUserUserNameRequest)(nil), // 70: caos.zitadel.management.api.v1.UpdateUserUserNameRequest - (*UserEmail)(nil), // 71: caos.zitadel.management.api.v1.UserEmail - (*UserEmailView)(nil), // 72: caos.zitadel.management.api.v1.UserEmailView - (*UpdateUserEmailRequest)(nil), // 73: caos.zitadel.management.api.v1.UpdateUserEmailRequest - (*UserPhone)(nil), // 74: caos.zitadel.management.api.v1.UserPhone - (*UserPhoneView)(nil), // 75: caos.zitadel.management.api.v1.UserPhoneView - (*UpdateUserPhoneRequest)(nil), // 76: caos.zitadel.management.api.v1.UpdateUserPhoneRequest - (*UserAddress)(nil), // 77: caos.zitadel.management.api.v1.UserAddress - (*UserAddressView)(nil), // 78: caos.zitadel.management.api.v1.UserAddressView - (*UpdateUserAddressRequest)(nil), // 79: caos.zitadel.management.api.v1.UpdateUserAddressRequest - (*MultiFactors)(nil), // 80: caos.zitadel.management.api.v1.MultiFactors - (*MultiFactor)(nil), // 81: caos.zitadel.management.api.v1.MultiFactor - (*PasswordRequest)(nil), // 82: caos.zitadel.management.api.v1.PasswordRequest - (*SetPasswordNotificationRequest)(nil), // 83: caos.zitadel.management.api.v1.SetPasswordNotificationRequest - (*PasswordComplexityPolicyID)(nil), // 84: caos.zitadel.management.api.v1.PasswordComplexityPolicyID - (*PasswordComplexityPolicy)(nil), // 85: caos.zitadel.management.api.v1.PasswordComplexityPolicy - (*PasswordComplexityPolicyCreate)(nil), // 86: caos.zitadel.management.api.v1.PasswordComplexityPolicyCreate - (*PasswordComplexityPolicyUpdate)(nil), // 87: caos.zitadel.management.api.v1.PasswordComplexityPolicyUpdate - (*PasswordAgePolicyID)(nil), // 88: caos.zitadel.management.api.v1.PasswordAgePolicyID - (*PasswordAgePolicy)(nil), // 89: caos.zitadel.management.api.v1.PasswordAgePolicy - (*PasswordAgePolicyCreate)(nil), // 90: caos.zitadel.management.api.v1.PasswordAgePolicyCreate - (*PasswordAgePolicyUpdate)(nil), // 91: caos.zitadel.management.api.v1.PasswordAgePolicyUpdate - (*PasswordLockoutPolicyID)(nil), // 92: caos.zitadel.management.api.v1.PasswordLockoutPolicyID - (*PasswordLockoutPolicy)(nil), // 93: caos.zitadel.management.api.v1.PasswordLockoutPolicy - (*PasswordLockoutPolicyCreate)(nil), // 94: caos.zitadel.management.api.v1.PasswordLockoutPolicyCreate - (*PasswordLockoutPolicyUpdate)(nil), // 95: caos.zitadel.management.api.v1.PasswordLockoutPolicyUpdate - (*OrgIamPolicy)(nil), // 96: caos.zitadel.management.api.v1.OrgIamPolicy - (*OrgCreateRequest)(nil), // 97: caos.zitadel.management.api.v1.OrgCreateRequest - (*Org)(nil), // 98: caos.zitadel.management.api.v1.Org - (*OrgView)(nil), // 99: caos.zitadel.management.api.v1.OrgView - (*Domain)(nil), // 100: caos.zitadel.management.api.v1.Domain - (*OrgDomain)(nil), // 101: caos.zitadel.management.api.v1.OrgDomain - (*OrgDomainView)(nil), // 102: caos.zitadel.management.api.v1.OrgDomainView - (*AddOrgDomainRequest)(nil), // 103: caos.zitadel.management.api.v1.AddOrgDomainRequest - (*OrgDomainValidationRequest)(nil), // 104: caos.zitadel.management.api.v1.OrgDomainValidationRequest - (*OrgDomainValidationResponse)(nil), // 105: caos.zitadel.management.api.v1.OrgDomainValidationResponse - (*ValidateOrgDomainRequest)(nil), // 106: caos.zitadel.management.api.v1.ValidateOrgDomainRequest - (*PrimaryOrgDomainRequest)(nil), // 107: caos.zitadel.management.api.v1.PrimaryOrgDomainRequest - (*RemoveOrgDomainRequest)(nil), // 108: caos.zitadel.management.api.v1.RemoveOrgDomainRequest - (*OrgDomainSearchResponse)(nil), // 109: caos.zitadel.management.api.v1.OrgDomainSearchResponse - (*OrgDomainSearchRequest)(nil), // 110: caos.zitadel.management.api.v1.OrgDomainSearchRequest - (*OrgDomainSearchQuery)(nil), // 111: caos.zitadel.management.api.v1.OrgDomainSearchQuery - (*OrgMemberRoles)(nil), // 112: caos.zitadel.management.api.v1.OrgMemberRoles - (*OrgMember)(nil), // 113: caos.zitadel.management.api.v1.OrgMember - (*AddOrgMemberRequest)(nil), // 114: caos.zitadel.management.api.v1.AddOrgMemberRequest - (*ChangeOrgMemberRequest)(nil), // 115: caos.zitadel.management.api.v1.ChangeOrgMemberRequest - (*RemoveOrgMemberRequest)(nil), // 116: caos.zitadel.management.api.v1.RemoveOrgMemberRequest - (*OrgMemberSearchResponse)(nil), // 117: caos.zitadel.management.api.v1.OrgMemberSearchResponse - (*OrgMemberView)(nil), // 118: caos.zitadel.management.api.v1.OrgMemberView - (*OrgMemberSearchRequest)(nil), // 119: caos.zitadel.management.api.v1.OrgMemberSearchRequest - (*OrgMemberSearchQuery)(nil), // 120: caos.zitadel.management.api.v1.OrgMemberSearchQuery - (*ProjectCreateRequest)(nil), // 121: caos.zitadel.management.api.v1.ProjectCreateRequest - (*ProjectUpdateRequest)(nil), // 122: caos.zitadel.management.api.v1.ProjectUpdateRequest - (*ProjectSearchResponse)(nil), // 123: caos.zitadel.management.api.v1.ProjectSearchResponse - (*ProjectView)(nil), // 124: caos.zitadel.management.api.v1.ProjectView - (*ProjectSearchRequest)(nil), // 125: caos.zitadel.management.api.v1.ProjectSearchRequest - (*ProjectSearchQuery)(nil), // 126: caos.zitadel.management.api.v1.ProjectSearchQuery - (*Projects)(nil), // 127: caos.zitadel.management.api.v1.Projects - (*Project)(nil), // 128: caos.zitadel.management.api.v1.Project - (*ProjectMemberRoles)(nil), // 129: caos.zitadel.management.api.v1.ProjectMemberRoles - (*ProjectMember)(nil), // 130: caos.zitadel.management.api.v1.ProjectMember - (*ProjectMemberAdd)(nil), // 131: caos.zitadel.management.api.v1.ProjectMemberAdd - (*ProjectMemberChange)(nil), // 132: caos.zitadel.management.api.v1.ProjectMemberChange - (*ProjectMemberRemove)(nil), // 133: caos.zitadel.management.api.v1.ProjectMemberRemove - (*ProjectRoleAdd)(nil), // 134: caos.zitadel.management.api.v1.ProjectRoleAdd - (*ProjectRoleAddBulk)(nil), // 135: caos.zitadel.management.api.v1.ProjectRoleAddBulk - (*ProjectRoleChange)(nil), // 136: caos.zitadel.management.api.v1.ProjectRoleChange - (*ProjectRole)(nil), // 137: caos.zitadel.management.api.v1.ProjectRole - (*ProjectRoleView)(nil), // 138: caos.zitadel.management.api.v1.ProjectRoleView - (*ProjectRoleRemove)(nil), // 139: caos.zitadel.management.api.v1.ProjectRoleRemove - (*ProjectRoleSearchResponse)(nil), // 140: caos.zitadel.management.api.v1.ProjectRoleSearchResponse - (*ProjectRoleSearchRequest)(nil), // 141: caos.zitadel.management.api.v1.ProjectRoleSearchRequest - (*ProjectRoleSearchQuery)(nil), // 142: caos.zitadel.management.api.v1.ProjectRoleSearchQuery - (*ProjectMemberView)(nil), // 143: caos.zitadel.management.api.v1.ProjectMemberView - (*ProjectMemberSearchResponse)(nil), // 144: caos.zitadel.management.api.v1.ProjectMemberSearchResponse - (*ProjectMemberSearchRequest)(nil), // 145: caos.zitadel.management.api.v1.ProjectMemberSearchRequest - (*ProjectMemberSearchQuery)(nil), // 146: caos.zitadel.management.api.v1.ProjectMemberSearchQuery - (*Application)(nil), // 147: caos.zitadel.management.api.v1.Application - (*ApplicationUpdate)(nil), // 148: caos.zitadel.management.api.v1.ApplicationUpdate - (*OIDCConfig)(nil), // 149: caos.zitadel.management.api.v1.OIDCConfig - (*OIDCApplicationCreate)(nil), // 150: caos.zitadel.management.api.v1.OIDCApplicationCreate - (*OIDCConfigUpdate)(nil), // 151: caos.zitadel.management.api.v1.OIDCConfigUpdate - (*ClientSecret)(nil), // 152: caos.zitadel.management.api.v1.ClientSecret - (*ApplicationView)(nil), // 153: caos.zitadel.management.api.v1.ApplicationView - (*ApplicationSearchResponse)(nil), // 154: caos.zitadel.management.api.v1.ApplicationSearchResponse - (*ApplicationSearchRequest)(nil), // 155: caos.zitadel.management.api.v1.ApplicationSearchRequest - (*ApplicationSearchQuery)(nil), // 156: caos.zitadel.management.api.v1.ApplicationSearchQuery - (*ProjectGrant)(nil), // 157: caos.zitadel.management.api.v1.ProjectGrant - (*ProjectGrantCreate)(nil), // 158: caos.zitadel.management.api.v1.ProjectGrantCreate - (*ProjectGrantUpdate)(nil), // 159: caos.zitadel.management.api.v1.ProjectGrantUpdate - (*ProjectGrantID)(nil), // 160: caos.zitadel.management.api.v1.ProjectGrantID - (*ProjectGrantView)(nil), // 161: caos.zitadel.management.api.v1.ProjectGrantView - (*ProjectGrantSearchResponse)(nil), // 162: caos.zitadel.management.api.v1.ProjectGrantSearchResponse - (*GrantedProjectSearchRequest)(nil), // 163: caos.zitadel.management.api.v1.GrantedProjectSearchRequest - (*ProjectGrantSearchRequest)(nil), // 164: caos.zitadel.management.api.v1.ProjectGrantSearchRequest - (*ProjectGrantSearchQuery)(nil), // 165: caos.zitadel.management.api.v1.ProjectGrantSearchQuery - (*ProjectGrantMemberRoles)(nil), // 166: caos.zitadel.management.api.v1.ProjectGrantMemberRoles - (*ProjectGrantMember)(nil), // 167: caos.zitadel.management.api.v1.ProjectGrantMember - (*ProjectGrantMemberAdd)(nil), // 168: caos.zitadel.management.api.v1.ProjectGrantMemberAdd - (*ProjectGrantMemberChange)(nil), // 169: caos.zitadel.management.api.v1.ProjectGrantMemberChange - (*ProjectGrantMemberRemove)(nil), // 170: caos.zitadel.management.api.v1.ProjectGrantMemberRemove - (*ProjectGrantMemberView)(nil), // 171: caos.zitadel.management.api.v1.ProjectGrantMemberView - (*ProjectGrantMemberSearchResponse)(nil), // 172: caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse - (*ProjectGrantMemberSearchRequest)(nil), // 173: caos.zitadel.management.api.v1.ProjectGrantMemberSearchRequest - (*ProjectGrantMemberSearchQuery)(nil), // 174: caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery - (*UserGrant)(nil), // 175: caos.zitadel.management.api.v1.UserGrant - (*UserGrantCreate)(nil), // 176: caos.zitadel.management.api.v1.UserGrantCreate - (*UserGrantUpdate)(nil), // 177: caos.zitadel.management.api.v1.UserGrantUpdate - (*UserGrantRemoveBulk)(nil), // 178: caos.zitadel.management.api.v1.UserGrantRemoveBulk - (*UserGrantID)(nil), // 179: caos.zitadel.management.api.v1.UserGrantID - (*UserGrantView)(nil), // 180: caos.zitadel.management.api.v1.UserGrantView - (*UserGrantSearchResponse)(nil), // 181: caos.zitadel.management.api.v1.UserGrantSearchResponse - (*UserGrantSearchRequest)(nil), // 182: caos.zitadel.management.api.v1.UserGrantSearchRequest - (*UserGrantSearchQuery)(nil), // 183: caos.zitadel.management.api.v1.UserGrantSearchQuery - (*UserMembershipSearchResponse)(nil), // 184: caos.zitadel.management.api.v1.UserMembershipSearchResponse - (*UserMembershipSearchRequest)(nil), // 185: caos.zitadel.management.api.v1.UserMembershipSearchRequest - (*UserMembershipSearchQuery)(nil), // 186: caos.zitadel.management.api.v1.UserMembershipSearchQuery - (*UserMembershipView)(nil), // 187: caos.zitadel.management.api.v1.UserMembershipView - (*IdpID)(nil), // 188: caos.zitadel.management.api.v1.IdpID - (*Idp)(nil), // 189: caos.zitadel.management.api.v1.Idp - (*IdpUpdate)(nil), // 190: caos.zitadel.management.api.v1.IdpUpdate - (*OidcIdpConfig)(nil), // 191: caos.zitadel.management.api.v1.OidcIdpConfig - (*OidcIdpConfigCreate)(nil), // 192: caos.zitadel.management.api.v1.OidcIdpConfigCreate - (*OidcIdpConfigUpdate)(nil), // 193: caos.zitadel.management.api.v1.OidcIdpConfigUpdate - (*IdpSearchResponse)(nil), // 194: caos.zitadel.management.api.v1.IdpSearchResponse - (*IdpView)(nil), // 195: caos.zitadel.management.api.v1.IdpView - (*OidcIdpConfigView)(nil), // 196: caos.zitadel.management.api.v1.OidcIdpConfigView - (*IdpSearchRequest)(nil), // 197: caos.zitadel.management.api.v1.IdpSearchRequest - (*IdpSearchQuery)(nil), // 198: caos.zitadel.management.api.v1.IdpSearchQuery - (*LoginPolicy)(nil), // 199: caos.zitadel.management.api.v1.LoginPolicy - (*LoginPolicyAdd)(nil), // 200: caos.zitadel.management.api.v1.LoginPolicyAdd - (*IdpProviderID)(nil), // 201: caos.zitadel.management.api.v1.IdpProviderID - (*IdpProviderAdd)(nil), // 202: caos.zitadel.management.api.v1.IdpProviderAdd - (*IdpProvider)(nil), // 203: caos.zitadel.management.api.v1.IdpProvider - (*LoginPolicyView)(nil), // 204: caos.zitadel.management.api.v1.LoginPolicyView - (*IdpProviderView)(nil), // 205: caos.zitadel.management.api.v1.IdpProviderView - (*IdpProviderSearchResponse)(nil), // 206: caos.zitadel.management.api.v1.IdpProviderSearchResponse - (*IdpProviderSearchRequest)(nil), // 207: caos.zitadel.management.api.v1.IdpProviderSearchRequest - (*ExternalIDPSearchRequest)(nil), // 208: caos.zitadel.management.api.v1.ExternalIDPSearchRequest - (*ExternalIDPSearchResponse)(nil), // 209: caos.zitadel.management.api.v1.ExternalIDPSearchResponse - (*ExternalIDPView)(nil), // 210: caos.zitadel.management.api.v1.ExternalIDPView - (*ExternalIDPRemoveRequest)(nil), // 211: caos.zitadel.management.api.v1.ExternalIDPRemoveRequest + (IamSetupStep)(0), // 0: caos.zitadel.management.api.v1.IamSetupStep + (UserState)(0), // 1: caos.zitadel.management.api.v1.UserState + (Gender)(0), // 2: caos.zitadel.management.api.v1.Gender + (MachineKeyType)(0), // 3: caos.zitadel.management.api.v1.MachineKeyType + (UserSearchKey)(0), // 4: caos.zitadel.management.api.v1.UserSearchKey + (SearchMethod)(0), // 5: caos.zitadel.management.api.v1.SearchMethod + (MfaType)(0), // 6: caos.zitadel.management.api.v1.MfaType + (MFAState)(0), // 7: caos.zitadel.management.api.v1.MFAState + (NotificationType)(0), // 8: caos.zitadel.management.api.v1.NotificationType + (PolicyState)(0), // 9: caos.zitadel.management.api.v1.PolicyState + (OrgState)(0), // 10: caos.zitadel.management.api.v1.OrgState + (OrgDomainValidationType)(0), // 11: caos.zitadel.management.api.v1.OrgDomainValidationType + (OrgDomainSearchKey)(0), // 12: caos.zitadel.management.api.v1.OrgDomainSearchKey + (OrgMemberSearchKey)(0), // 13: caos.zitadel.management.api.v1.OrgMemberSearchKey + (ProjectSearchKey)(0), // 14: caos.zitadel.management.api.v1.ProjectSearchKey + (ProjectState)(0), // 15: caos.zitadel.management.api.v1.ProjectState + (ProjectRoleSearchKey)(0), // 16: caos.zitadel.management.api.v1.ProjectRoleSearchKey + (ProjectMemberSearchKey)(0), // 17: caos.zitadel.management.api.v1.ProjectMemberSearchKey + (AppState)(0), // 18: caos.zitadel.management.api.v1.AppState + (OIDCVersion)(0), // 19: caos.zitadel.management.api.v1.OIDCVersion + (OIDCTokenType)(0), // 20: caos.zitadel.management.api.v1.OIDCTokenType + (OIDCResponseType)(0), // 21: caos.zitadel.management.api.v1.OIDCResponseType + (OIDCGrantType)(0), // 22: caos.zitadel.management.api.v1.OIDCGrantType + (OIDCApplicationType)(0), // 23: caos.zitadel.management.api.v1.OIDCApplicationType + (OIDCAuthMethodType)(0), // 24: caos.zitadel.management.api.v1.OIDCAuthMethodType + (ApplicationSearchKey)(0), // 25: caos.zitadel.management.api.v1.ApplicationSearchKey + (ProjectGrantState)(0), // 26: caos.zitadel.management.api.v1.ProjectGrantState + (ProjectGrantSearchKey)(0), // 27: caos.zitadel.management.api.v1.ProjectGrantSearchKey + (ProjectGrantMemberSearchKey)(0), // 28: caos.zitadel.management.api.v1.ProjectGrantMemberSearchKey + (UserGrantState)(0), // 29: caos.zitadel.management.api.v1.UserGrantState + (UserGrantSearchKey)(0), // 30: caos.zitadel.management.api.v1.UserGrantSearchKey + (UserMembershipSearchKey)(0), // 31: caos.zitadel.management.api.v1.UserMembershipSearchKey + (MemberType)(0), // 32: caos.zitadel.management.api.v1.MemberType + (IdpStylingType)(0), // 33: caos.zitadel.management.api.v1.IdpStylingType + (IdpState)(0), // 34: caos.zitadel.management.api.v1.IdpState + (OIDCMappingField)(0), // 35: caos.zitadel.management.api.v1.OIDCMappingField + (IdpSearchKey)(0), // 36: caos.zitadel.management.api.v1.IdpSearchKey + (IdpType)(0), // 37: caos.zitadel.management.api.v1.IdpType + (IdpProviderType)(0), // 38: caos.zitadel.management.api.v1.IdpProviderType + (ProjectType)(0), // 39: caos.zitadel.management.api.v1.ProjectType + (*ZitadelDocs)(nil), // 40: caos.zitadel.management.api.v1.ZitadelDocs + (*Iam)(nil), // 41: caos.zitadel.management.api.v1.Iam + (*ChangeRequest)(nil), // 42: caos.zitadel.management.api.v1.ChangeRequest + (*Changes)(nil), // 43: caos.zitadel.management.api.v1.Changes + (*Change)(nil), // 44: caos.zitadel.management.api.v1.Change + (*ApplicationID)(nil), // 45: caos.zitadel.management.api.v1.ApplicationID + (*ProjectID)(nil), // 46: caos.zitadel.management.api.v1.ProjectID + (*UserID)(nil), // 47: caos.zitadel.management.api.v1.UserID + (*LoginName)(nil), // 48: caos.zitadel.management.api.v1.LoginName + (*UniqueUserRequest)(nil), // 49: caos.zitadel.management.api.v1.UniqueUserRequest + (*UniqueUserResponse)(nil), // 50: caos.zitadel.management.api.v1.UniqueUserResponse + (*CreateUserRequest)(nil), // 51: caos.zitadel.management.api.v1.CreateUserRequest + (*CreateHumanRequest)(nil), // 52: caos.zitadel.management.api.v1.CreateHumanRequest + (*CreateMachineRequest)(nil), // 53: caos.zitadel.management.api.v1.CreateMachineRequest + (*UserResponse)(nil), // 54: caos.zitadel.management.api.v1.UserResponse + (*UserView)(nil), // 55: caos.zitadel.management.api.v1.UserView + (*HumanResponse)(nil), // 56: caos.zitadel.management.api.v1.HumanResponse + (*HumanView)(nil), // 57: caos.zitadel.management.api.v1.HumanView + (*MachineResponse)(nil), // 58: caos.zitadel.management.api.v1.MachineResponse + (*MachineView)(nil), // 59: caos.zitadel.management.api.v1.MachineView + (*UpdateMachineRequest)(nil), // 60: caos.zitadel.management.api.v1.UpdateMachineRequest + (*AddMachineKeyRequest)(nil), // 61: caos.zitadel.management.api.v1.AddMachineKeyRequest + (*AddMachineKeyResponse)(nil), // 62: caos.zitadel.management.api.v1.AddMachineKeyResponse + (*MachineKeyIDRequest)(nil), // 63: caos.zitadel.management.api.v1.MachineKeyIDRequest + (*MachineKeyView)(nil), // 64: caos.zitadel.management.api.v1.MachineKeyView + (*MachineKeySearchRequest)(nil), // 65: caos.zitadel.management.api.v1.MachineKeySearchRequest + (*MachineKeySearchResponse)(nil), // 66: caos.zitadel.management.api.v1.MachineKeySearchResponse + (*UserSearchRequest)(nil), // 67: caos.zitadel.management.api.v1.UserSearchRequest + (*UserSearchQuery)(nil), // 68: caos.zitadel.management.api.v1.UserSearchQuery + (*UserSearchResponse)(nil), // 69: caos.zitadel.management.api.v1.UserSearchResponse + (*UserProfile)(nil), // 70: caos.zitadel.management.api.v1.UserProfile + (*UserProfileView)(nil), // 71: caos.zitadel.management.api.v1.UserProfileView + (*UpdateUserProfileRequest)(nil), // 72: caos.zitadel.management.api.v1.UpdateUserProfileRequest + (*UpdateUserUserNameRequest)(nil), // 73: caos.zitadel.management.api.v1.UpdateUserUserNameRequest + (*UserEmail)(nil), // 74: caos.zitadel.management.api.v1.UserEmail + (*UserEmailView)(nil), // 75: caos.zitadel.management.api.v1.UserEmailView + (*UpdateUserEmailRequest)(nil), // 76: caos.zitadel.management.api.v1.UpdateUserEmailRequest + (*UserPhone)(nil), // 77: caos.zitadel.management.api.v1.UserPhone + (*UserPhoneView)(nil), // 78: caos.zitadel.management.api.v1.UserPhoneView + (*UpdateUserPhoneRequest)(nil), // 79: caos.zitadel.management.api.v1.UpdateUserPhoneRequest + (*UserAddress)(nil), // 80: caos.zitadel.management.api.v1.UserAddress + (*UserAddressView)(nil), // 81: caos.zitadel.management.api.v1.UserAddressView + (*UpdateUserAddressRequest)(nil), // 82: caos.zitadel.management.api.v1.UpdateUserAddressRequest + (*MultiFactors)(nil), // 83: caos.zitadel.management.api.v1.MultiFactors + (*MultiFactor)(nil), // 84: caos.zitadel.management.api.v1.MultiFactor + (*PasswordRequest)(nil), // 85: caos.zitadel.management.api.v1.PasswordRequest + (*SetPasswordNotificationRequest)(nil), // 86: caos.zitadel.management.api.v1.SetPasswordNotificationRequest + (*OrgIamPolicyView)(nil), // 87: caos.zitadel.management.api.v1.OrgIamPolicyView + (*OrgCreateRequest)(nil), // 88: caos.zitadel.management.api.v1.OrgCreateRequest + (*Org)(nil), // 89: caos.zitadel.management.api.v1.Org + (*OrgView)(nil), // 90: caos.zitadel.management.api.v1.OrgView + (*Domain)(nil), // 91: caos.zitadel.management.api.v1.Domain + (*OrgDomain)(nil), // 92: caos.zitadel.management.api.v1.OrgDomain + (*OrgDomainView)(nil), // 93: caos.zitadel.management.api.v1.OrgDomainView + (*AddOrgDomainRequest)(nil), // 94: caos.zitadel.management.api.v1.AddOrgDomainRequest + (*OrgDomainValidationRequest)(nil), // 95: caos.zitadel.management.api.v1.OrgDomainValidationRequest + (*OrgDomainValidationResponse)(nil), // 96: caos.zitadel.management.api.v1.OrgDomainValidationResponse + (*ValidateOrgDomainRequest)(nil), // 97: caos.zitadel.management.api.v1.ValidateOrgDomainRequest + (*PrimaryOrgDomainRequest)(nil), // 98: caos.zitadel.management.api.v1.PrimaryOrgDomainRequest + (*RemoveOrgDomainRequest)(nil), // 99: caos.zitadel.management.api.v1.RemoveOrgDomainRequest + (*OrgDomainSearchResponse)(nil), // 100: caos.zitadel.management.api.v1.OrgDomainSearchResponse + (*OrgDomainSearchRequest)(nil), // 101: caos.zitadel.management.api.v1.OrgDomainSearchRequest + (*OrgDomainSearchQuery)(nil), // 102: caos.zitadel.management.api.v1.OrgDomainSearchQuery + (*OrgMemberRoles)(nil), // 103: caos.zitadel.management.api.v1.OrgMemberRoles + (*OrgMember)(nil), // 104: caos.zitadel.management.api.v1.OrgMember + (*AddOrgMemberRequest)(nil), // 105: caos.zitadel.management.api.v1.AddOrgMemberRequest + (*ChangeOrgMemberRequest)(nil), // 106: caos.zitadel.management.api.v1.ChangeOrgMemberRequest + (*RemoveOrgMemberRequest)(nil), // 107: caos.zitadel.management.api.v1.RemoveOrgMemberRequest + (*OrgMemberSearchResponse)(nil), // 108: caos.zitadel.management.api.v1.OrgMemberSearchResponse + (*OrgMemberView)(nil), // 109: caos.zitadel.management.api.v1.OrgMemberView + (*OrgMemberSearchRequest)(nil), // 110: caos.zitadel.management.api.v1.OrgMemberSearchRequest + (*OrgMemberSearchQuery)(nil), // 111: caos.zitadel.management.api.v1.OrgMemberSearchQuery + (*ProjectCreateRequest)(nil), // 112: caos.zitadel.management.api.v1.ProjectCreateRequest + (*ProjectUpdateRequest)(nil), // 113: caos.zitadel.management.api.v1.ProjectUpdateRequest + (*ProjectSearchResponse)(nil), // 114: caos.zitadel.management.api.v1.ProjectSearchResponse + (*ProjectView)(nil), // 115: caos.zitadel.management.api.v1.ProjectView + (*ProjectSearchRequest)(nil), // 116: caos.zitadel.management.api.v1.ProjectSearchRequest + (*ProjectSearchQuery)(nil), // 117: caos.zitadel.management.api.v1.ProjectSearchQuery + (*Projects)(nil), // 118: caos.zitadel.management.api.v1.Projects + (*Project)(nil), // 119: caos.zitadel.management.api.v1.Project + (*ProjectMemberRoles)(nil), // 120: caos.zitadel.management.api.v1.ProjectMemberRoles + (*ProjectMember)(nil), // 121: caos.zitadel.management.api.v1.ProjectMember + (*ProjectMemberAdd)(nil), // 122: caos.zitadel.management.api.v1.ProjectMemberAdd + (*ProjectMemberChange)(nil), // 123: caos.zitadel.management.api.v1.ProjectMemberChange + (*ProjectMemberRemove)(nil), // 124: caos.zitadel.management.api.v1.ProjectMemberRemove + (*ProjectRoleAdd)(nil), // 125: caos.zitadel.management.api.v1.ProjectRoleAdd + (*ProjectRoleAddBulk)(nil), // 126: caos.zitadel.management.api.v1.ProjectRoleAddBulk + (*ProjectRoleChange)(nil), // 127: caos.zitadel.management.api.v1.ProjectRoleChange + (*ProjectRole)(nil), // 128: caos.zitadel.management.api.v1.ProjectRole + (*ProjectRoleView)(nil), // 129: caos.zitadel.management.api.v1.ProjectRoleView + (*ProjectRoleRemove)(nil), // 130: caos.zitadel.management.api.v1.ProjectRoleRemove + (*ProjectRoleSearchResponse)(nil), // 131: caos.zitadel.management.api.v1.ProjectRoleSearchResponse + (*ProjectRoleSearchRequest)(nil), // 132: caos.zitadel.management.api.v1.ProjectRoleSearchRequest + (*ProjectRoleSearchQuery)(nil), // 133: caos.zitadel.management.api.v1.ProjectRoleSearchQuery + (*ProjectMemberView)(nil), // 134: caos.zitadel.management.api.v1.ProjectMemberView + (*ProjectMemberSearchResponse)(nil), // 135: caos.zitadel.management.api.v1.ProjectMemberSearchResponse + (*ProjectMemberSearchRequest)(nil), // 136: caos.zitadel.management.api.v1.ProjectMemberSearchRequest + (*ProjectMemberSearchQuery)(nil), // 137: caos.zitadel.management.api.v1.ProjectMemberSearchQuery + (*Application)(nil), // 138: caos.zitadel.management.api.v1.Application + (*ApplicationUpdate)(nil), // 139: caos.zitadel.management.api.v1.ApplicationUpdate + (*OIDCConfig)(nil), // 140: caos.zitadel.management.api.v1.OIDCConfig + (*OIDCApplicationCreate)(nil), // 141: caos.zitadel.management.api.v1.OIDCApplicationCreate + (*OIDCConfigUpdate)(nil), // 142: caos.zitadel.management.api.v1.OIDCConfigUpdate + (*ClientSecret)(nil), // 143: caos.zitadel.management.api.v1.ClientSecret + (*ApplicationView)(nil), // 144: caos.zitadel.management.api.v1.ApplicationView + (*ApplicationSearchResponse)(nil), // 145: caos.zitadel.management.api.v1.ApplicationSearchResponse + (*ApplicationSearchRequest)(nil), // 146: caos.zitadel.management.api.v1.ApplicationSearchRequest + (*ApplicationSearchQuery)(nil), // 147: caos.zitadel.management.api.v1.ApplicationSearchQuery + (*ProjectGrant)(nil), // 148: caos.zitadel.management.api.v1.ProjectGrant + (*ProjectGrantCreate)(nil), // 149: caos.zitadel.management.api.v1.ProjectGrantCreate + (*ProjectGrantUpdate)(nil), // 150: caos.zitadel.management.api.v1.ProjectGrantUpdate + (*ProjectGrantID)(nil), // 151: caos.zitadel.management.api.v1.ProjectGrantID + (*ProjectGrantView)(nil), // 152: caos.zitadel.management.api.v1.ProjectGrantView + (*ProjectGrantSearchResponse)(nil), // 153: caos.zitadel.management.api.v1.ProjectGrantSearchResponse + (*GrantedProjectSearchRequest)(nil), // 154: caos.zitadel.management.api.v1.GrantedProjectSearchRequest + (*ProjectGrantSearchRequest)(nil), // 155: caos.zitadel.management.api.v1.ProjectGrantSearchRequest + (*ProjectGrantSearchQuery)(nil), // 156: caos.zitadel.management.api.v1.ProjectGrantSearchQuery + (*ProjectGrantMemberRoles)(nil), // 157: caos.zitadel.management.api.v1.ProjectGrantMemberRoles + (*ProjectGrantMember)(nil), // 158: caos.zitadel.management.api.v1.ProjectGrantMember + (*ProjectGrantMemberAdd)(nil), // 159: caos.zitadel.management.api.v1.ProjectGrantMemberAdd + (*ProjectGrantMemberChange)(nil), // 160: caos.zitadel.management.api.v1.ProjectGrantMemberChange + (*ProjectGrantMemberRemove)(nil), // 161: caos.zitadel.management.api.v1.ProjectGrantMemberRemove + (*ProjectGrantMemberView)(nil), // 162: caos.zitadel.management.api.v1.ProjectGrantMemberView + (*ProjectGrantMemberSearchResponse)(nil), // 163: caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse + (*ProjectGrantMemberSearchRequest)(nil), // 164: caos.zitadel.management.api.v1.ProjectGrantMemberSearchRequest + (*ProjectGrantMemberSearchQuery)(nil), // 165: caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery + (*UserGrant)(nil), // 166: caos.zitadel.management.api.v1.UserGrant + (*UserGrantCreate)(nil), // 167: caos.zitadel.management.api.v1.UserGrantCreate + (*UserGrantUpdate)(nil), // 168: caos.zitadel.management.api.v1.UserGrantUpdate + (*UserGrantRemoveBulk)(nil), // 169: caos.zitadel.management.api.v1.UserGrantRemoveBulk + (*UserGrantID)(nil), // 170: caos.zitadel.management.api.v1.UserGrantID + (*UserGrantView)(nil), // 171: caos.zitadel.management.api.v1.UserGrantView + (*UserGrantSearchResponse)(nil), // 172: caos.zitadel.management.api.v1.UserGrantSearchResponse + (*UserGrantSearchRequest)(nil), // 173: caos.zitadel.management.api.v1.UserGrantSearchRequest + (*UserGrantSearchQuery)(nil), // 174: caos.zitadel.management.api.v1.UserGrantSearchQuery + (*UserMembershipSearchResponse)(nil), // 175: caos.zitadel.management.api.v1.UserMembershipSearchResponse + (*UserMembershipSearchRequest)(nil), // 176: caos.zitadel.management.api.v1.UserMembershipSearchRequest + (*UserMembershipSearchQuery)(nil), // 177: caos.zitadel.management.api.v1.UserMembershipSearchQuery + (*UserMembershipView)(nil), // 178: caos.zitadel.management.api.v1.UserMembershipView + (*IdpID)(nil), // 179: caos.zitadel.management.api.v1.IdpID + (*Idp)(nil), // 180: caos.zitadel.management.api.v1.Idp + (*IdpUpdate)(nil), // 181: caos.zitadel.management.api.v1.IdpUpdate + (*OidcIdpConfig)(nil), // 182: caos.zitadel.management.api.v1.OidcIdpConfig + (*OidcIdpConfigCreate)(nil), // 183: caos.zitadel.management.api.v1.OidcIdpConfigCreate + (*OidcIdpConfigUpdate)(nil), // 184: caos.zitadel.management.api.v1.OidcIdpConfigUpdate + (*IdpSearchResponse)(nil), // 185: caos.zitadel.management.api.v1.IdpSearchResponse + (*IdpView)(nil), // 186: caos.zitadel.management.api.v1.IdpView + (*OidcIdpConfigView)(nil), // 187: caos.zitadel.management.api.v1.OidcIdpConfigView + (*IdpSearchRequest)(nil), // 188: caos.zitadel.management.api.v1.IdpSearchRequest + (*IdpSearchQuery)(nil), // 189: caos.zitadel.management.api.v1.IdpSearchQuery + (*LoginPolicy)(nil), // 190: caos.zitadel.management.api.v1.LoginPolicy + (*LoginPolicyRequest)(nil), // 191: caos.zitadel.management.api.v1.LoginPolicyRequest + (*IdpProviderID)(nil), // 192: caos.zitadel.management.api.v1.IdpProviderID + (*IdpProviderAdd)(nil), // 193: caos.zitadel.management.api.v1.IdpProviderAdd + (*IdpProvider)(nil), // 194: caos.zitadel.management.api.v1.IdpProvider + (*LoginPolicyView)(nil), // 195: caos.zitadel.management.api.v1.LoginPolicyView + (*IdpProviderView)(nil), // 196: caos.zitadel.management.api.v1.IdpProviderView + (*IdpProviderSearchResponse)(nil), // 197: caos.zitadel.management.api.v1.IdpProviderSearchResponse + (*IdpProviderSearchRequest)(nil), // 198: caos.zitadel.management.api.v1.IdpProviderSearchRequest + (*ExternalIDPSearchRequest)(nil), // 199: caos.zitadel.management.api.v1.ExternalIDPSearchRequest + (*ExternalIDPSearchResponse)(nil), // 200: caos.zitadel.management.api.v1.ExternalIDPSearchResponse + (*ExternalIDPView)(nil), // 201: caos.zitadel.management.api.v1.ExternalIDPView + (*ExternalIDPRemoveRequest)(nil), // 202: caos.zitadel.management.api.v1.ExternalIDPRemoveRequest + (*PasswordComplexityPolicy)(nil), // 203: caos.zitadel.management.api.v1.PasswordComplexityPolicy + (*PasswordComplexityPolicyRequest)(nil), // 204: caos.zitadel.management.api.v1.PasswordComplexityPolicyRequest + (*PasswordComplexityPolicyView)(nil), // 205: caos.zitadel.management.api.v1.PasswordComplexityPolicyView + (*PasswordAgePolicy)(nil), // 206: caos.zitadel.management.api.v1.PasswordAgePolicy + (*PasswordAgePolicyRequest)(nil), // 207: caos.zitadel.management.api.v1.PasswordAgePolicyRequest + (*PasswordAgePolicyView)(nil), // 208: caos.zitadel.management.api.v1.PasswordAgePolicyView + (*PasswordLockoutPolicy)(nil), // 209: caos.zitadel.management.api.v1.PasswordLockoutPolicy + (*PasswordLockoutPolicyRequest)(nil), // 210: caos.zitadel.management.api.v1.PasswordLockoutPolicyRequest + (*PasswordLockoutPolicyView)(nil), // 211: caos.zitadel.management.api.v1.PasswordLockoutPolicyView (*timestamp.Timestamp)(nil), // 212: google.protobuf.Timestamp (*message.LocalizedMessage)(nil), // 213: caos.zitadel.api.v1.LocalizedMessage (*_struct.Struct)(nil), // 214: google.protobuf.Struct (*empty.Empty)(nil), // 215: google.protobuf.Empty } var file_management_proto_depIdxs = []int32{ - 41, // 0: caos.zitadel.management.api.v1.Changes.changes:type_name -> caos.zitadel.management.api.v1.Change - 212, // 1: caos.zitadel.management.api.v1.Change.change_date:type_name -> google.protobuf.Timestamp - 213, // 2: caos.zitadel.management.api.v1.Change.event_type:type_name -> caos.zitadel.api.v1.LocalizedMessage - 214, // 3: caos.zitadel.management.api.v1.Change.data:type_name -> google.protobuf.Struct - 49, // 4: caos.zitadel.management.api.v1.CreateUserRequest.human:type_name -> caos.zitadel.management.api.v1.CreateHumanRequest - 50, // 5: caos.zitadel.management.api.v1.CreateUserRequest.machine:type_name -> caos.zitadel.management.api.v1.CreateMachineRequest - 1, // 6: caos.zitadel.management.api.v1.CreateHumanRequest.gender:type_name -> caos.zitadel.management.api.v1.Gender - 0, // 7: caos.zitadel.management.api.v1.UserResponse.state:type_name -> caos.zitadel.management.api.v1.UserState - 212, // 8: caos.zitadel.management.api.v1.UserResponse.creation_date:type_name -> google.protobuf.Timestamp - 212, // 9: caos.zitadel.management.api.v1.UserResponse.change_date:type_name -> google.protobuf.Timestamp - 53, // 10: caos.zitadel.management.api.v1.UserResponse.human:type_name -> caos.zitadel.management.api.v1.HumanResponse - 55, // 11: caos.zitadel.management.api.v1.UserResponse.machine:type_name -> caos.zitadel.management.api.v1.MachineResponse - 0, // 12: caos.zitadel.management.api.v1.UserView.state:type_name -> caos.zitadel.management.api.v1.UserState - 212, // 13: caos.zitadel.management.api.v1.UserView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 14: caos.zitadel.management.api.v1.UserView.change_date:type_name -> google.protobuf.Timestamp - 212, // 15: caos.zitadel.management.api.v1.UserView.last_login:type_name -> google.protobuf.Timestamp - 54, // 16: caos.zitadel.management.api.v1.UserView.human:type_name -> caos.zitadel.management.api.v1.HumanView - 56, // 17: caos.zitadel.management.api.v1.UserView.machine:type_name -> caos.zitadel.management.api.v1.MachineView - 1, // 18: caos.zitadel.management.api.v1.HumanResponse.gender:type_name -> caos.zitadel.management.api.v1.Gender - 212, // 19: caos.zitadel.management.api.v1.HumanView.password_changed:type_name -> google.protobuf.Timestamp - 1, // 20: caos.zitadel.management.api.v1.HumanView.gender:type_name -> caos.zitadel.management.api.v1.Gender - 212, // 21: caos.zitadel.management.api.v1.MachineView.last_key_added:type_name -> google.protobuf.Timestamp - 2, // 22: caos.zitadel.management.api.v1.AddMachineKeyRequest.type:type_name -> caos.zitadel.management.api.v1.MachineKeyType - 212, // 23: caos.zitadel.management.api.v1.AddMachineKeyRequest.expiration_date:type_name -> google.protobuf.Timestamp - 212, // 24: caos.zitadel.management.api.v1.AddMachineKeyResponse.creation_date:type_name -> google.protobuf.Timestamp - 2, // 25: caos.zitadel.management.api.v1.AddMachineKeyResponse.type:type_name -> caos.zitadel.management.api.v1.MachineKeyType - 212, // 26: caos.zitadel.management.api.v1.AddMachineKeyResponse.expiration_date:type_name -> google.protobuf.Timestamp - 2, // 27: caos.zitadel.management.api.v1.MachineKeyView.type:type_name -> caos.zitadel.management.api.v1.MachineKeyType - 212, // 28: caos.zitadel.management.api.v1.MachineKeyView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 29: caos.zitadel.management.api.v1.MachineKeyView.expiration_date:type_name -> google.protobuf.Timestamp - 61, // 30: caos.zitadel.management.api.v1.MachineKeySearchResponse.result:type_name -> caos.zitadel.management.api.v1.MachineKeyView - 212, // 31: caos.zitadel.management.api.v1.MachineKeySearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 3, // 32: caos.zitadel.management.api.v1.UserSearchRequest.sorting_column:type_name -> caos.zitadel.management.api.v1.UserSearchKey - 65, // 33: caos.zitadel.management.api.v1.UserSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.UserSearchQuery - 3, // 34: caos.zitadel.management.api.v1.UserSearchQuery.key:type_name -> caos.zitadel.management.api.v1.UserSearchKey - 4, // 35: caos.zitadel.management.api.v1.UserSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 52, // 36: caos.zitadel.management.api.v1.UserSearchResponse.result:type_name -> caos.zitadel.management.api.v1.UserView - 212, // 37: caos.zitadel.management.api.v1.UserSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 1, // 38: caos.zitadel.management.api.v1.UserProfile.gender:type_name -> caos.zitadel.management.api.v1.Gender - 212, // 39: caos.zitadel.management.api.v1.UserProfile.creation_date:type_name -> google.protobuf.Timestamp - 212, // 40: caos.zitadel.management.api.v1.UserProfile.change_date:type_name -> google.protobuf.Timestamp - 1, // 41: caos.zitadel.management.api.v1.UserProfileView.gender:type_name -> caos.zitadel.management.api.v1.Gender - 212, // 42: caos.zitadel.management.api.v1.UserProfileView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 43: caos.zitadel.management.api.v1.UserProfileView.change_date:type_name -> google.protobuf.Timestamp - 1, // 44: caos.zitadel.management.api.v1.UpdateUserProfileRequest.gender:type_name -> caos.zitadel.management.api.v1.Gender - 212, // 45: caos.zitadel.management.api.v1.UserEmail.creation_date:type_name -> google.protobuf.Timestamp - 212, // 46: caos.zitadel.management.api.v1.UserEmail.change_date:type_name -> google.protobuf.Timestamp - 212, // 47: caos.zitadel.management.api.v1.UserEmailView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 48: caos.zitadel.management.api.v1.UserEmailView.change_date:type_name -> google.protobuf.Timestamp - 212, // 49: caos.zitadel.management.api.v1.UserPhone.creation_date:type_name -> google.protobuf.Timestamp - 212, // 50: caos.zitadel.management.api.v1.UserPhone.change_date:type_name -> google.protobuf.Timestamp - 212, // 51: caos.zitadel.management.api.v1.UserPhoneView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 52: caos.zitadel.management.api.v1.UserPhoneView.change_date:type_name -> google.protobuf.Timestamp - 212, // 53: caos.zitadel.management.api.v1.UserAddress.creation_date:type_name -> google.protobuf.Timestamp - 212, // 54: caos.zitadel.management.api.v1.UserAddress.change_date:type_name -> google.protobuf.Timestamp - 212, // 55: caos.zitadel.management.api.v1.UserAddressView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 56: caos.zitadel.management.api.v1.UserAddressView.change_date:type_name -> google.protobuf.Timestamp - 81, // 57: caos.zitadel.management.api.v1.MultiFactors.mfas:type_name -> caos.zitadel.management.api.v1.MultiFactor - 5, // 58: caos.zitadel.management.api.v1.MultiFactor.type:type_name -> caos.zitadel.management.api.v1.MfaType - 6, // 59: caos.zitadel.management.api.v1.MultiFactor.state:type_name -> caos.zitadel.management.api.v1.MFAState - 7, // 60: caos.zitadel.management.api.v1.SetPasswordNotificationRequest.type:type_name -> caos.zitadel.management.api.v1.NotificationType - 8, // 61: caos.zitadel.management.api.v1.PasswordComplexityPolicy.state:type_name -> caos.zitadel.management.api.v1.PolicyState - 212, // 62: caos.zitadel.management.api.v1.PasswordComplexityPolicy.creation_date:type_name -> google.protobuf.Timestamp - 212, // 63: caos.zitadel.management.api.v1.PasswordComplexityPolicy.change_date:type_name -> google.protobuf.Timestamp - 8, // 64: caos.zitadel.management.api.v1.PasswordAgePolicy.state:type_name -> caos.zitadel.management.api.v1.PolicyState - 212, // 65: caos.zitadel.management.api.v1.PasswordAgePolicy.creation_date:type_name -> google.protobuf.Timestamp - 212, // 66: caos.zitadel.management.api.v1.PasswordAgePolicy.change_date:type_name -> google.protobuf.Timestamp - 8, // 67: caos.zitadel.management.api.v1.PasswordLockoutPolicy.state:type_name -> caos.zitadel.management.api.v1.PolicyState - 212, // 68: caos.zitadel.management.api.v1.PasswordLockoutPolicy.creation_date:type_name -> google.protobuf.Timestamp - 212, // 69: caos.zitadel.management.api.v1.PasswordLockoutPolicy.change_date:type_name -> google.protobuf.Timestamp - 9, // 70: caos.zitadel.management.api.v1.Org.state:type_name -> caos.zitadel.management.api.v1.OrgState - 212, // 71: caos.zitadel.management.api.v1.Org.creation_date:type_name -> google.protobuf.Timestamp - 212, // 72: caos.zitadel.management.api.v1.Org.change_date:type_name -> google.protobuf.Timestamp - 9, // 73: caos.zitadel.management.api.v1.OrgView.state:type_name -> caos.zitadel.management.api.v1.OrgState - 212, // 74: caos.zitadel.management.api.v1.OrgView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 75: caos.zitadel.management.api.v1.OrgView.change_date:type_name -> google.protobuf.Timestamp - 212, // 76: caos.zitadel.management.api.v1.OrgDomain.creation_date:type_name -> google.protobuf.Timestamp - 212, // 77: caos.zitadel.management.api.v1.OrgDomain.change_date:type_name -> google.protobuf.Timestamp - 212, // 78: caos.zitadel.management.api.v1.OrgDomainView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 79: caos.zitadel.management.api.v1.OrgDomainView.change_date:type_name -> google.protobuf.Timestamp - 10, // 80: caos.zitadel.management.api.v1.OrgDomainView.validation_type:type_name -> caos.zitadel.management.api.v1.OrgDomainValidationType - 10, // 81: caos.zitadel.management.api.v1.OrgDomainValidationRequest.type:type_name -> caos.zitadel.management.api.v1.OrgDomainValidationType - 102, // 82: caos.zitadel.management.api.v1.OrgDomainSearchResponse.result:type_name -> caos.zitadel.management.api.v1.OrgDomainView - 212, // 83: caos.zitadel.management.api.v1.OrgDomainSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 111, // 84: caos.zitadel.management.api.v1.OrgDomainSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.OrgDomainSearchQuery - 11, // 85: caos.zitadel.management.api.v1.OrgDomainSearchQuery.key:type_name -> caos.zitadel.management.api.v1.OrgDomainSearchKey - 4, // 86: caos.zitadel.management.api.v1.OrgDomainSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 212, // 87: caos.zitadel.management.api.v1.OrgMember.change_date:type_name -> google.protobuf.Timestamp - 212, // 88: caos.zitadel.management.api.v1.OrgMember.creation_date:type_name -> google.protobuf.Timestamp - 118, // 89: caos.zitadel.management.api.v1.OrgMemberSearchResponse.result:type_name -> caos.zitadel.management.api.v1.OrgMemberView - 212, // 90: caos.zitadel.management.api.v1.OrgMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 212, // 91: caos.zitadel.management.api.v1.OrgMemberView.change_date:type_name -> google.protobuf.Timestamp - 212, // 92: caos.zitadel.management.api.v1.OrgMemberView.creation_date:type_name -> google.protobuf.Timestamp - 120, // 93: caos.zitadel.management.api.v1.OrgMemberSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.OrgMemberSearchQuery - 12, // 94: caos.zitadel.management.api.v1.OrgMemberSearchQuery.key:type_name -> caos.zitadel.management.api.v1.OrgMemberSearchKey - 4, // 95: caos.zitadel.management.api.v1.OrgMemberSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 124, // 96: caos.zitadel.management.api.v1.ProjectSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectView - 212, // 97: caos.zitadel.management.api.v1.ProjectSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 14, // 98: caos.zitadel.management.api.v1.ProjectView.state:type_name -> caos.zitadel.management.api.v1.ProjectState - 212, // 99: caos.zitadel.management.api.v1.ProjectView.change_date:type_name -> google.protobuf.Timestamp - 212, // 100: caos.zitadel.management.api.v1.ProjectView.creation_date:type_name -> google.protobuf.Timestamp - 126, // 101: caos.zitadel.management.api.v1.ProjectSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectSearchQuery - 13, // 102: caos.zitadel.management.api.v1.ProjectSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectSearchKey - 4, // 103: caos.zitadel.management.api.v1.ProjectSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 128, // 104: caos.zitadel.management.api.v1.Projects.projects:type_name -> caos.zitadel.management.api.v1.Project - 14, // 105: caos.zitadel.management.api.v1.Project.state:type_name -> caos.zitadel.management.api.v1.ProjectState - 212, // 106: caos.zitadel.management.api.v1.Project.change_date:type_name -> google.protobuf.Timestamp - 212, // 107: caos.zitadel.management.api.v1.Project.creation_date:type_name -> google.protobuf.Timestamp - 212, // 108: caos.zitadel.management.api.v1.ProjectMember.change_date:type_name -> google.protobuf.Timestamp - 212, // 109: caos.zitadel.management.api.v1.ProjectMember.creation_date:type_name -> google.protobuf.Timestamp - 134, // 110: caos.zitadel.management.api.v1.ProjectRoleAddBulk.project_roles:type_name -> caos.zitadel.management.api.v1.ProjectRoleAdd - 212, // 111: caos.zitadel.management.api.v1.ProjectRole.creation_date:type_name -> google.protobuf.Timestamp - 212, // 112: caos.zitadel.management.api.v1.ProjectRole.change_date:type_name -> google.protobuf.Timestamp - 212, // 113: caos.zitadel.management.api.v1.ProjectRoleView.creation_date:type_name -> google.protobuf.Timestamp - 138, // 114: caos.zitadel.management.api.v1.ProjectRoleSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectRoleView - 212, // 115: caos.zitadel.management.api.v1.ProjectRoleSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 142, // 116: caos.zitadel.management.api.v1.ProjectRoleSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectRoleSearchQuery - 15, // 117: caos.zitadel.management.api.v1.ProjectRoleSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectRoleSearchKey - 4, // 118: caos.zitadel.management.api.v1.ProjectRoleSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 212, // 119: caos.zitadel.management.api.v1.ProjectMemberView.change_date:type_name -> google.protobuf.Timestamp - 212, // 120: caos.zitadel.management.api.v1.ProjectMemberView.creation_date:type_name -> google.protobuf.Timestamp - 143, // 121: caos.zitadel.management.api.v1.ProjectMemberSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectMemberView - 212, // 122: caos.zitadel.management.api.v1.ProjectMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 146, // 123: caos.zitadel.management.api.v1.ProjectMemberSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectMemberSearchQuery - 16, // 124: caos.zitadel.management.api.v1.ProjectMemberSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectMemberSearchKey - 4, // 125: caos.zitadel.management.api.v1.ProjectMemberSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 17, // 126: caos.zitadel.management.api.v1.Application.state:type_name -> caos.zitadel.management.api.v1.AppState - 212, // 127: caos.zitadel.management.api.v1.Application.creation_date:type_name -> google.protobuf.Timestamp - 212, // 128: caos.zitadel.management.api.v1.Application.change_date:type_name -> google.protobuf.Timestamp - 149, // 129: caos.zitadel.management.api.v1.Application.oidc_config:type_name -> caos.zitadel.management.api.v1.OIDCConfig - 19, // 130: caos.zitadel.management.api.v1.OIDCConfig.response_types:type_name -> caos.zitadel.management.api.v1.OIDCResponseType - 20, // 131: caos.zitadel.management.api.v1.OIDCConfig.grant_types:type_name -> caos.zitadel.management.api.v1.OIDCGrantType - 21, // 132: caos.zitadel.management.api.v1.OIDCConfig.application_type:type_name -> caos.zitadel.management.api.v1.OIDCApplicationType - 22, // 133: caos.zitadel.management.api.v1.OIDCConfig.auth_method_type:type_name -> caos.zitadel.management.api.v1.OIDCAuthMethodType - 18, // 134: caos.zitadel.management.api.v1.OIDCConfig.version:type_name -> caos.zitadel.management.api.v1.OIDCVersion - 213, // 135: caos.zitadel.management.api.v1.OIDCConfig.compliance_problems:type_name -> caos.zitadel.api.v1.LocalizedMessage - 19, // 136: caos.zitadel.management.api.v1.OIDCApplicationCreate.response_types:type_name -> caos.zitadel.management.api.v1.OIDCResponseType - 20, // 137: caos.zitadel.management.api.v1.OIDCApplicationCreate.grant_types:type_name -> caos.zitadel.management.api.v1.OIDCGrantType - 21, // 138: caos.zitadel.management.api.v1.OIDCApplicationCreate.application_type:type_name -> caos.zitadel.management.api.v1.OIDCApplicationType - 22, // 139: caos.zitadel.management.api.v1.OIDCApplicationCreate.auth_method_type:type_name -> caos.zitadel.management.api.v1.OIDCAuthMethodType - 18, // 140: caos.zitadel.management.api.v1.OIDCApplicationCreate.version:type_name -> caos.zitadel.management.api.v1.OIDCVersion - 19, // 141: caos.zitadel.management.api.v1.OIDCConfigUpdate.response_types:type_name -> caos.zitadel.management.api.v1.OIDCResponseType - 20, // 142: caos.zitadel.management.api.v1.OIDCConfigUpdate.grant_types:type_name -> caos.zitadel.management.api.v1.OIDCGrantType - 21, // 143: caos.zitadel.management.api.v1.OIDCConfigUpdate.application_type:type_name -> caos.zitadel.management.api.v1.OIDCApplicationType - 22, // 144: caos.zitadel.management.api.v1.OIDCConfigUpdate.auth_method_type:type_name -> caos.zitadel.management.api.v1.OIDCAuthMethodType - 17, // 145: caos.zitadel.management.api.v1.ApplicationView.state:type_name -> caos.zitadel.management.api.v1.AppState - 212, // 146: caos.zitadel.management.api.v1.ApplicationView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 147: caos.zitadel.management.api.v1.ApplicationView.change_date:type_name -> google.protobuf.Timestamp - 149, // 148: caos.zitadel.management.api.v1.ApplicationView.oidc_config:type_name -> caos.zitadel.management.api.v1.OIDCConfig - 153, // 149: caos.zitadel.management.api.v1.ApplicationSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ApplicationView - 212, // 150: caos.zitadel.management.api.v1.ApplicationSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 156, // 151: caos.zitadel.management.api.v1.ApplicationSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ApplicationSearchQuery - 23, // 152: caos.zitadel.management.api.v1.ApplicationSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ApplicationSearchKey - 4, // 153: caos.zitadel.management.api.v1.ApplicationSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 24, // 154: caos.zitadel.management.api.v1.ProjectGrant.state:type_name -> caos.zitadel.management.api.v1.ProjectGrantState - 212, // 155: caos.zitadel.management.api.v1.ProjectGrant.creation_date:type_name -> google.protobuf.Timestamp - 212, // 156: caos.zitadel.management.api.v1.ProjectGrant.change_date:type_name -> google.protobuf.Timestamp - 24, // 157: caos.zitadel.management.api.v1.ProjectGrantView.state:type_name -> caos.zitadel.management.api.v1.ProjectGrantState - 212, // 158: caos.zitadel.management.api.v1.ProjectGrantView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 159: caos.zitadel.management.api.v1.ProjectGrantView.change_date:type_name -> google.protobuf.Timestamp - 161, // 160: caos.zitadel.management.api.v1.ProjectGrantSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectGrantView - 212, // 161: caos.zitadel.management.api.v1.ProjectGrantSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 126, // 162: caos.zitadel.management.api.v1.GrantedProjectSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectSearchQuery - 165, // 163: caos.zitadel.management.api.v1.ProjectGrantSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectGrantSearchQuery - 25, // 164: caos.zitadel.management.api.v1.ProjectGrantSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectGrantSearchKey - 4, // 165: caos.zitadel.management.api.v1.ProjectGrantSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 212, // 166: caos.zitadel.management.api.v1.ProjectGrantMember.change_date:type_name -> google.protobuf.Timestamp - 212, // 167: caos.zitadel.management.api.v1.ProjectGrantMember.creation_date:type_name -> google.protobuf.Timestamp - 212, // 168: caos.zitadel.management.api.v1.ProjectGrantMemberView.change_date:type_name -> google.protobuf.Timestamp - 212, // 169: caos.zitadel.management.api.v1.ProjectGrantMemberView.creation_date:type_name -> google.protobuf.Timestamp - 171, // 170: caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectGrantMemberView - 212, // 171: caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 174, // 172: caos.zitadel.management.api.v1.ProjectGrantMemberSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery - 26, // 173: caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchKey - 4, // 174: caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 27, // 175: caos.zitadel.management.api.v1.UserGrant.state:type_name -> caos.zitadel.management.api.v1.UserGrantState - 212, // 176: caos.zitadel.management.api.v1.UserGrant.creation_date:type_name -> google.protobuf.Timestamp - 212, // 177: caos.zitadel.management.api.v1.UserGrant.change_date:type_name -> google.protobuf.Timestamp - 27, // 178: caos.zitadel.management.api.v1.UserGrantView.state:type_name -> caos.zitadel.management.api.v1.UserGrantState - 212, // 179: caos.zitadel.management.api.v1.UserGrantView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 180: caos.zitadel.management.api.v1.UserGrantView.change_date:type_name -> google.protobuf.Timestamp - 180, // 181: caos.zitadel.management.api.v1.UserGrantSearchResponse.result:type_name -> caos.zitadel.management.api.v1.UserGrantView - 212, // 182: caos.zitadel.management.api.v1.UserGrantSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 183, // 183: caos.zitadel.management.api.v1.UserGrantSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.UserGrantSearchQuery - 28, // 184: caos.zitadel.management.api.v1.UserGrantSearchQuery.key:type_name -> caos.zitadel.management.api.v1.UserGrantSearchKey - 4, // 185: caos.zitadel.management.api.v1.UserGrantSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 187, // 186: caos.zitadel.management.api.v1.UserMembershipSearchResponse.result:type_name -> caos.zitadel.management.api.v1.UserMembershipView - 212, // 187: caos.zitadel.management.api.v1.UserMembershipSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 186, // 188: caos.zitadel.management.api.v1.UserMembershipSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.UserMembershipSearchQuery - 29, // 189: caos.zitadel.management.api.v1.UserMembershipSearchQuery.key:type_name -> caos.zitadel.management.api.v1.UserMembershipSearchKey - 4, // 190: caos.zitadel.management.api.v1.UserMembershipSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 30, // 191: caos.zitadel.management.api.v1.UserMembershipView.member_type:type_name -> caos.zitadel.management.api.v1.MemberType - 212, // 192: caos.zitadel.management.api.v1.UserMembershipView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 193: caos.zitadel.management.api.v1.UserMembershipView.change_date:type_name -> google.protobuf.Timestamp - 31, // 194: caos.zitadel.management.api.v1.Idp.state:type_name -> caos.zitadel.management.api.v1.IdpState - 212, // 195: caos.zitadel.management.api.v1.Idp.creation_date:type_name -> google.protobuf.Timestamp - 212, // 196: caos.zitadel.management.api.v1.Idp.change_date:type_name -> google.protobuf.Timestamp - 191, // 197: caos.zitadel.management.api.v1.Idp.oidc_config:type_name -> caos.zitadel.management.api.v1.OidcIdpConfig - 32, // 198: caos.zitadel.management.api.v1.OidcIdpConfig.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 32, // 199: caos.zitadel.management.api.v1.OidcIdpConfig.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 32, // 200: caos.zitadel.management.api.v1.OidcIdpConfigCreate.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 32, // 201: caos.zitadel.management.api.v1.OidcIdpConfigCreate.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 32, // 202: caos.zitadel.management.api.v1.OidcIdpConfigUpdate.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 32, // 203: caos.zitadel.management.api.v1.OidcIdpConfigUpdate.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 195, // 204: caos.zitadel.management.api.v1.IdpSearchResponse.result:type_name -> caos.zitadel.management.api.v1.IdpView - 212, // 205: caos.zitadel.management.api.v1.IdpSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 31, // 206: caos.zitadel.management.api.v1.IdpView.state:type_name -> caos.zitadel.management.api.v1.IdpState - 212, // 207: caos.zitadel.management.api.v1.IdpView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 208: caos.zitadel.management.api.v1.IdpView.change_date:type_name -> google.protobuf.Timestamp - 35, // 209: caos.zitadel.management.api.v1.IdpView.provider_type:type_name -> caos.zitadel.management.api.v1.IdpProviderType - 196, // 210: caos.zitadel.management.api.v1.IdpView.oidc_config:type_name -> caos.zitadel.management.api.v1.OidcIdpConfigView - 32, // 211: caos.zitadel.management.api.v1.OidcIdpConfigView.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 32, // 212: caos.zitadel.management.api.v1.OidcIdpConfigView.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField - 198, // 213: caos.zitadel.management.api.v1.IdpSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.IdpSearchQuery - 33, // 214: caos.zitadel.management.api.v1.IdpSearchQuery.key:type_name -> caos.zitadel.management.api.v1.IdpSearchKey - 4, // 215: caos.zitadel.management.api.v1.IdpSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod - 35, // 216: caos.zitadel.management.api.v1.IdpProviderAdd.idp_provider_type:type_name -> caos.zitadel.management.api.v1.IdpProviderType - 35, // 217: caos.zitadel.management.api.v1.IdpProvider.idp_provider_Type:type_name -> caos.zitadel.management.api.v1.IdpProviderType - 34, // 218: caos.zitadel.management.api.v1.IdpProviderView.type:type_name -> caos.zitadel.management.api.v1.IdpType - 205, // 219: caos.zitadel.management.api.v1.IdpProviderSearchResponse.result:type_name -> caos.zitadel.management.api.v1.IdpProviderView - 212, // 220: caos.zitadel.management.api.v1.IdpProviderSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 210, // 221: caos.zitadel.management.api.v1.ExternalIDPSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ExternalIDPView - 212, // 222: caos.zitadel.management.api.v1.ExternalIDPSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp - 212, // 223: caos.zitadel.management.api.v1.ExternalIDPView.creation_date:type_name -> google.protobuf.Timestamp - 212, // 224: caos.zitadel.management.api.v1.ExternalIDPView.change_date:type_name -> google.protobuf.Timestamp - 215, // 225: caos.zitadel.management.api.v1.ManagementService.Healthz:input_type -> google.protobuf.Empty - 215, // 226: caos.zitadel.management.api.v1.ManagementService.Ready:input_type -> google.protobuf.Empty - 215, // 227: caos.zitadel.management.api.v1.ManagementService.Validate:input_type -> google.protobuf.Empty - 215, // 228: caos.zitadel.management.api.v1.ManagementService.GetZitadelDocs:input_type -> google.protobuf.Empty - 215, // 229: caos.zitadel.management.api.v1.ManagementService.GetIam:input_type -> google.protobuf.Empty - 46, // 230: caos.zitadel.management.api.v1.ManagementService.IsUserUnique:input_type -> caos.zitadel.management.api.v1.UniqueUserRequest - 44, // 231: caos.zitadel.management.api.v1.ManagementService.GetUserByID:input_type -> caos.zitadel.management.api.v1.UserID - 45, // 232: caos.zitadel.management.api.v1.ManagementService.GetUserByLoginNameGlobal:input_type -> caos.zitadel.management.api.v1.LoginName - 64, // 233: caos.zitadel.management.api.v1.ManagementService.SearchUsers:input_type -> caos.zitadel.management.api.v1.UserSearchRequest - 48, // 234: caos.zitadel.management.api.v1.ManagementService.CreateUser:input_type -> caos.zitadel.management.api.v1.CreateUserRequest - 44, // 235: caos.zitadel.management.api.v1.ManagementService.DeactivateUser:input_type -> caos.zitadel.management.api.v1.UserID - 44, // 236: caos.zitadel.management.api.v1.ManagementService.ReactivateUser:input_type -> caos.zitadel.management.api.v1.UserID - 44, // 237: caos.zitadel.management.api.v1.ManagementService.LockUser:input_type -> caos.zitadel.management.api.v1.UserID - 44, // 238: caos.zitadel.management.api.v1.ManagementService.UnlockUser:input_type -> caos.zitadel.management.api.v1.UserID - 44, // 239: caos.zitadel.management.api.v1.ManagementService.DeleteUser:input_type -> caos.zitadel.management.api.v1.UserID - 39, // 240: caos.zitadel.management.api.v1.ManagementService.UserChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest - 58, // 241: caos.zitadel.management.api.v1.ManagementService.AddMachineKey:input_type -> caos.zitadel.management.api.v1.AddMachineKeyRequest - 60, // 242: caos.zitadel.management.api.v1.ManagementService.DeleteMachineKey:input_type -> caos.zitadel.management.api.v1.MachineKeyIDRequest - 62, // 243: caos.zitadel.management.api.v1.ManagementService.SearchMachineKeys:input_type -> caos.zitadel.management.api.v1.MachineKeySearchRequest - 60, // 244: caos.zitadel.management.api.v1.ManagementService.GetMachineKey:input_type -> caos.zitadel.management.api.v1.MachineKeyIDRequest - 44, // 245: caos.zitadel.management.api.v1.ManagementService.GetUserProfile:input_type -> caos.zitadel.management.api.v1.UserID - 69, // 246: caos.zitadel.management.api.v1.ManagementService.UpdateUserProfile:input_type -> caos.zitadel.management.api.v1.UpdateUserProfileRequest - 44, // 247: caos.zitadel.management.api.v1.ManagementService.GetUserEmail:input_type -> caos.zitadel.management.api.v1.UserID - 70, // 248: caos.zitadel.management.api.v1.ManagementService.ChangeUserUserName:input_type -> caos.zitadel.management.api.v1.UpdateUserUserNameRequest - 73, // 249: caos.zitadel.management.api.v1.ManagementService.ChangeUserEmail:input_type -> caos.zitadel.management.api.v1.UpdateUserEmailRequest - 44, // 250: caos.zitadel.management.api.v1.ManagementService.ResendEmailVerificationMail:input_type -> caos.zitadel.management.api.v1.UserID - 44, // 251: caos.zitadel.management.api.v1.ManagementService.GetUserPhone:input_type -> caos.zitadel.management.api.v1.UserID - 76, // 252: caos.zitadel.management.api.v1.ManagementService.ChangeUserPhone:input_type -> caos.zitadel.management.api.v1.UpdateUserPhoneRequest - 44, // 253: caos.zitadel.management.api.v1.ManagementService.RemoveUserPhone:input_type -> caos.zitadel.management.api.v1.UserID - 44, // 254: caos.zitadel.management.api.v1.ManagementService.ResendPhoneVerificationCode:input_type -> caos.zitadel.management.api.v1.UserID - 44, // 255: caos.zitadel.management.api.v1.ManagementService.GetUserAddress:input_type -> caos.zitadel.management.api.v1.UserID - 79, // 256: caos.zitadel.management.api.v1.ManagementService.UpdateUserAddress:input_type -> caos.zitadel.management.api.v1.UpdateUserAddressRequest - 57, // 257: caos.zitadel.management.api.v1.ManagementService.UpdateUserMachine:input_type -> caos.zitadel.management.api.v1.UpdateMachineRequest - 208, // 258: caos.zitadel.management.api.v1.ManagementService.SearchUserExternalIDPs:input_type -> caos.zitadel.management.api.v1.ExternalIDPSearchRequest - 211, // 259: caos.zitadel.management.api.v1.ManagementService.RemoveExternalIDP:input_type -> caos.zitadel.management.api.v1.ExternalIDPRemoveRequest - 44, // 260: caos.zitadel.management.api.v1.ManagementService.GetUserMfas:input_type -> caos.zitadel.management.api.v1.UserID - 83, // 261: caos.zitadel.management.api.v1.ManagementService.SendSetPasswordNotification:input_type -> caos.zitadel.management.api.v1.SetPasswordNotificationRequest - 82, // 262: caos.zitadel.management.api.v1.ManagementService.SetInitialPassword:input_type -> caos.zitadel.management.api.v1.PasswordRequest - 185, // 263: caos.zitadel.management.api.v1.ManagementService.SearchUserMemberships:input_type -> caos.zitadel.management.api.v1.UserMembershipSearchRequest - 215, // 264: caos.zitadel.management.api.v1.ManagementService.GetPasswordComplexityPolicy:input_type -> google.protobuf.Empty - 215, // 265: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordComplexityPolicy:input_type -> google.protobuf.Empty - 86, // 266: caos.zitadel.management.api.v1.ManagementService.CreatePasswordComplexityPolicy:input_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicyCreate - 87, // 267: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordComplexityPolicy:input_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicyUpdate - 84, // 268: caos.zitadel.management.api.v1.ManagementService.DeletePasswordComplexityPolicy:input_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicyID - 215, // 269: caos.zitadel.management.api.v1.ManagementService.GetPasswordAgePolicy:input_type -> google.protobuf.Empty - 90, // 270: caos.zitadel.management.api.v1.ManagementService.CreatePasswordAgePolicy:input_type -> caos.zitadel.management.api.v1.PasswordAgePolicyCreate - 91, // 271: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordAgePolicy:input_type -> caos.zitadel.management.api.v1.PasswordAgePolicyUpdate - 88, // 272: caos.zitadel.management.api.v1.ManagementService.DeletePasswordAgePolicy:input_type -> caos.zitadel.management.api.v1.PasswordAgePolicyID - 215, // 273: caos.zitadel.management.api.v1.ManagementService.GetPasswordLockoutPolicy:input_type -> google.protobuf.Empty - 94, // 274: caos.zitadel.management.api.v1.ManagementService.CreatePasswordLockoutPolicy:input_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicyCreate - 95, // 275: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordLockoutPolicy:input_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicyUpdate - 92, // 276: caos.zitadel.management.api.v1.ManagementService.DeletePasswordLockoutPolicy:input_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicyID - 97, // 277: caos.zitadel.management.api.v1.ManagementService.CreateOrg:input_type -> caos.zitadel.management.api.v1.OrgCreateRequest - 39, // 278: caos.zitadel.management.api.v1.ManagementService.OrgChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest - 215, // 279: caos.zitadel.management.api.v1.ManagementService.GetMyOrg:input_type -> google.protobuf.Empty - 100, // 280: caos.zitadel.management.api.v1.ManagementService.GetOrgByDomainGlobal:input_type -> caos.zitadel.management.api.v1.Domain - 215, // 281: caos.zitadel.management.api.v1.ManagementService.DeactivateMyOrg:input_type -> google.protobuf.Empty - 215, // 282: caos.zitadel.management.api.v1.ManagementService.ReactivateMyOrg:input_type -> google.protobuf.Empty - 110, // 283: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgDomains:input_type -> caos.zitadel.management.api.v1.OrgDomainSearchRequest - 103, // 284: caos.zitadel.management.api.v1.ManagementService.AddMyOrgDomain:input_type -> caos.zitadel.management.api.v1.AddOrgDomainRequest - 104, // 285: caos.zitadel.management.api.v1.ManagementService.GenerateMyOrgDomainValidation:input_type -> caos.zitadel.management.api.v1.OrgDomainValidationRequest - 106, // 286: caos.zitadel.management.api.v1.ManagementService.ValidateMyOrgDomain:input_type -> caos.zitadel.management.api.v1.ValidateOrgDomainRequest - 107, // 287: caos.zitadel.management.api.v1.ManagementService.SetMyPrimaryOrgDomain:input_type -> caos.zitadel.management.api.v1.PrimaryOrgDomainRequest - 108, // 288: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgDomain:input_type -> caos.zitadel.management.api.v1.RemoveOrgDomainRequest - 215, // 289: caos.zitadel.management.api.v1.ManagementService.GetMyOrgIamPolicy:input_type -> google.protobuf.Empty - 215, // 290: caos.zitadel.management.api.v1.ManagementService.GetOrgMemberRoles:input_type -> google.protobuf.Empty - 114, // 291: caos.zitadel.management.api.v1.ManagementService.AddMyOrgMember:input_type -> caos.zitadel.management.api.v1.AddOrgMemberRequest - 115, // 292: caos.zitadel.management.api.v1.ManagementService.ChangeMyOrgMember:input_type -> caos.zitadel.management.api.v1.ChangeOrgMemberRequest - 116, // 293: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgMember:input_type -> caos.zitadel.management.api.v1.RemoveOrgMemberRequest - 119, // 294: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgMembers:input_type -> caos.zitadel.management.api.v1.OrgMemberSearchRequest - 39, // 295: caos.zitadel.management.api.v1.ManagementService.ProjectChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest - 125, // 296: caos.zitadel.management.api.v1.ManagementService.SearchProjects:input_type -> caos.zitadel.management.api.v1.ProjectSearchRequest - 43, // 297: caos.zitadel.management.api.v1.ManagementService.ProjectByID:input_type -> caos.zitadel.management.api.v1.ProjectID - 121, // 298: caos.zitadel.management.api.v1.ManagementService.CreateProject:input_type -> caos.zitadel.management.api.v1.ProjectCreateRequest - 122, // 299: caos.zitadel.management.api.v1.ManagementService.UpdateProject:input_type -> caos.zitadel.management.api.v1.ProjectUpdateRequest - 43, // 300: caos.zitadel.management.api.v1.ManagementService.DeactivateProject:input_type -> caos.zitadel.management.api.v1.ProjectID - 43, // 301: caos.zitadel.management.api.v1.ManagementService.ReactivateProject:input_type -> caos.zitadel.management.api.v1.ProjectID - 43, // 302: caos.zitadel.management.api.v1.ManagementService.RemoveProject:input_type -> caos.zitadel.management.api.v1.ProjectID - 163, // 303: caos.zitadel.management.api.v1.ManagementService.SearchGrantedProjects:input_type -> caos.zitadel.management.api.v1.GrantedProjectSearchRequest - 160, // 304: caos.zitadel.management.api.v1.ManagementService.GetGrantedProjectByID:input_type -> caos.zitadel.management.api.v1.ProjectGrantID - 215, // 305: caos.zitadel.management.api.v1.ManagementService.GetProjectMemberRoles:input_type -> google.protobuf.Empty - 145, // 306: caos.zitadel.management.api.v1.ManagementService.SearchProjectMembers:input_type -> caos.zitadel.management.api.v1.ProjectMemberSearchRequest - 131, // 307: caos.zitadel.management.api.v1.ManagementService.AddProjectMember:input_type -> caos.zitadel.management.api.v1.ProjectMemberAdd - 132, // 308: caos.zitadel.management.api.v1.ManagementService.ChangeProjectMember:input_type -> caos.zitadel.management.api.v1.ProjectMemberChange - 133, // 309: caos.zitadel.management.api.v1.ManagementService.RemoveProjectMember:input_type -> caos.zitadel.management.api.v1.ProjectMemberRemove - 141, // 310: caos.zitadel.management.api.v1.ManagementService.SearchProjectRoles:input_type -> caos.zitadel.management.api.v1.ProjectRoleSearchRequest - 134, // 311: caos.zitadel.management.api.v1.ManagementService.AddProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleAdd - 135, // 312: caos.zitadel.management.api.v1.ManagementService.BulkAddProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleAddBulk - 136, // 313: caos.zitadel.management.api.v1.ManagementService.ChangeProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleChange - 139, // 314: caos.zitadel.management.api.v1.ManagementService.RemoveProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleRemove - 155, // 315: caos.zitadel.management.api.v1.ManagementService.SearchApplications:input_type -> caos.zitadel.management.api.v1.ApplicationSearchRequest - 42, // 316: caos.zitadel.management.api.v1.ManagementService.ApplicationByID:input_type -> caos.zitadel.management.api.v1.ApplicationID - 39, // 317: caos.zitadel.management.api.v1.ManagementService.ApplicationChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest - 150, // 318: caos.zitadel.management.api.v1.ManagementService.CreateOIDCApplication:input_type -> caos.zitadel.management.api.v1.OIDCApplicationCreate - 148, // 319: caos.zitadel.management.api.v1.ManagementService.UpdateApplication:input_type -> caos.zitadel.management.api.v1.ApplicationUpdate - 42, // 320: caos.zitadel.management.api.v1.ManagementService.DeactivateApplication:input_type -> caos.zitadel.management.api.v1.ApplicationID - 42, // 321: caos.zitadel.management.api.v1.ManagementService.ReactivateApplication:input_type -> caos.zitadel.management.api.v1.ApplicationID - 42, // 322: caos.zitadel.management.api.v1.ManagementService.RemoveApplication:input_type -> caos.zitadel.management.api.v1.ApplicationID - 151, // 323: caos.zitadel.management.api.v1.ManagementService.UpdateApplicationOIDCConfig:input_type -> caos.zitadel.management.api.v1.OIDCConfigUpdate - 42, // 324: caos.zitadel.management.api.v1.ManagementService.RegenerateOIDCClientSecret:input_type -> caos.zitadel.management.api.v1.ApplicationID - 164, // 325: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrants:input_type -> caos.zitadel.management.api.v1.ProjectGrantSearchRequest - 160, // 326: caos.zitadel.management.api.v1.ManagementService.ProjectGrantByID:input_type -> caos.zitadel.management.api.v1.ProjectGrantID - 158, // 327: caos.zitadel.management.api.v1.ManagementService.CreateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantCreate - 159, // 328: caos.zitadel.management.api.v1.ManagementService.UpdateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantUpdate - 160, // 329: caos.zitadel.management.api.v1.ManagementService.DeactivateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantID - 160, // 330: caos.zitadel.management.api.v1.ManagementService.ReactivateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantID - 160, // 331: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantID - 215, // 332: caos.zitadel.management.api.v1.ManagementService.GetProjectGrantMemberRoles:input_type -> google.protobuf.Empty - 173, // 333: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrantMembers:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchRequest - 168, // 334: caos.zitadel.management.api.v1.ManagementService.AddProjectGrantMember:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberAdd - 169, // 335: caos.zitadel.management.api.v1.ManagementService.ChangeProjectGrantMember:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberChange - 170, // 336: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrantMember:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberRemove - 182, // 337: caos.zitadel.management.api.v1.ManagementService.SearchUserGrants:input_type -> caos.zitadel.management.api.v1.UserGrantSearchRequest - 179, // 338: caos.zitadel.management.api.v1.ManagementService.UserGrantByID:input_type -> caos.zitadel.management.api.v1.UserGrantID - 176, // 339: caos.zitadel.management.api.v1.ManagementService.CreateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantCreate - 177, // 340: caos.zitadel.management.api.v1.ManagementService.UpdateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantUpdate - 179, // 341: caos.zitadel.management.api.v1.ManagementService.DeactivateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantID - 179, // 342: caos.zitadel.management.api.v1.ManagementService.ReactivateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantID - 179, // 343: caos.zitadel.management.api.v1.ManagementService.RemoveUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantID - 178, // 344: caos.zitadel.management.api.v1.ManagementService.BulkRemoveUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantRemoveBulk - 188, // 345: caos.zitadel.management.api.v1.ManagementService.IdpByID:input_type -> caos.zitadel.management.api.v1.IdpID - 192, // 346: caos.zitadel.management.api.v1.ManagementService.CreateOidcIdp:input_type -> caos.zitadel.management.api.v1.OidcIdpConfigCreate - 190, // 347: caos.zitadel.management.api.v1.ManagementService.UpdateIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpUpdate - 188, // 348: caos.zitadel.management.api.v1.ManagementService.DeactivateIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpID - 188, // 349: caos.zitadel.management.api.v1.ManagementService.ReactivateIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpID - 188, // 350: caos.zitadel.management.api.v1.ManagementService.RemoveIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpID - 193, // 351: caos.zitadel.management.api.v1.ManagementService.UpdateOidcIdpConfig:input_type -> caos.zitadel.management.api.v1.OidcIdpConfigUpdate - 197, // 352: caos.zitadel.management.api.v1.ManagementService.SearchIdps:input_type -> caos.zitadel.management.api.v1.IdpSearchRequest - 215, // 353: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicy:input_type -> google.protobuf.Empty - 200, // 354: caos.zitadel.management.api.v1.ManagementService.CreateLoginPolicy:input_type -> caos.zitadel.management.api.v1.LoginPolicyAdd - 199, // 355: caos.zitadel.management.api.v1.ManagementService.UpdateLoginPolicy:input_type -> caos.zitadel.management.api.v1.LoginPolicy - 215, // 356: caos.zitadel.management.api.v1.ManagementService.RemoveLoginPolicy:input_type -> google.protobuf.Empty - 207, // 357: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicyIdpProviders:input_type -> caos.zitadel.management.api.v1.IdpProviderSearchRequest - 202, // 358: caos.zitadel.management.api.v1.ManagementService.AddIdpProviderToLoginPolicy:input_type -> caos.zitadel.management.api.v1.IdpProviderAdd - 201, // 359: caos.zitadel.management.api.v1.ManagementService.RemoveIdpProviderFromLoginPolicy:input_type -> caos.zitadel.management.api.v1.IdpProviderID - 215, // 360: caos.zitadel.management.api.v1.ManagementService.Healthz:output_type -> google.protobuf.Empty - 215, // 361: caos.zitadel.management.api.v1.ManagementService.Ready:output_type -> google.protobuf.Empty - 214, // 362: caos.zitadel.management.api.v1.ManagementService.Validate:output_type -> google.protobuf.Struct - 37, // 363: caos.zitadel.management.api.v1.ManagementService.GetZitadelDocs:output_type -> caos.zitadel.management.api.v1.ZitadelDocs - 38, // 364: caos.zitadel.management.api.v1.ManagementService.GetIam:output_type -> caos.zitadel.management.api.v1.Iam - 47, // 365: caos.zitadel.management.api.v1.ManagementService.IsUserUnique:output_type -> caos.zitadel.management.api.v1.UniqueUserResponse - 52, // 366: caos.zitadel.management.api.v1.ManagementService.GetUserByID:output_type -> caos.zitadel.management.api.v1.UserView - 52, // 367: caos.zitadel.management.api.v1.ManagementService.GetUserByLoginNameGlobal:output_type -> caos.zitadel.management.api.v1.UserView - 66, // 368: caos.zitadel.management.api.v1.ManagementService.SearchUsers:output_type -> caos.zitadel.management.api.v1.UserSearchResponse - 51, // 369: caos.zitadel.management.api.v1.ManagementService.CreateUser:output_type -> caos.zitadel.management.api.v1.UserResponse - 51, // 370: caos.zitadel.management.api.v1.ManagementService.DeactivateUser:output_type -> caos.zitadel.management.api.v1.UserResponse - 51, // 371: caos.zitadel.management.api.v1.ManagementService.ReactivateUser:output_type -> caos.zitadel.management.api.v1.UserResponse - 51, // 372: caos.zitadel.management.api.v1.ManagementService.LockUser:output_type -> caos.zitadel.management.api.v1.UserResponse - 51, // 373: caos.zitadel.management.api.v1.ManagementService.UnlockUser:output_type -> caos.zitadel.management.api.v1.UserResponse - 215, // 374: caos.zitadel.management.api.v1.ManagementService.DeleteUser:output_type -> google.protobuf.Empty - 40, // 375: caos.zitadel.management.api.v1.ManagementService.UserChanges:output_type -> caos.zitadel.management.api.v1.Changes - 59, // 376: caos.zitadel.management.api.v1.ManagementService.AddMachineKey:output_type -> caos.zitadel.management.api.v1.AddMachineKeyResponse - 215, // 377: caos.zitadel.management.api.v1.ManagementService.DeleteMachineKey:output_type -> google.protobuf.Empty - 63, // 378: caos.zitadel.management.api.v1.ManagementService.SearchMachineKeys:output_type -> caos.zitadel.management.api.v1.MachineKeySearchResponse - 61, // 379: caos.zitadel.management.api.v1.ManagementService.GetMachineKey:output_type -> caos.zitadel.management.api.v1.MachineKeyView - 68, // 380: caos.zitadel.management.api.v1.ManagementService.GetUserProfile:output_type -> caos.zitadel.management.api.v1.UserProfileView - 67, // 381: caos.zitadel.management.api.v1.ManagementService.UpdateUserProfile:output_type -> caos.zitadel.management.api.v1.UserProfile - 72, // 382: caos.zitadel.management.api.v1.ManagementService.GetUserEmail:output_type -> caos.zitadel.management.api.v1.UserEmailView - 215, // 383: caos.zitadel.management.api.v1.ManagementService.ChangeUserUserName:output_type -> google.protobuf.Empty - 71, // 384: caos.zitadel.management.api.v1.ManagementService.ChangeUserEmail:output_type -> caos.zitadel.management.api.v1.UserEmail - 215, // 385: caos.zitadel.management.api.v1.ManagementService.ResendEmailVerificationMail:output_type -> google.protobuf.Empty - 75, // 386: caos.zitadel.management.api.v1.ManagementService.GetUserPhone:output_type -> caos.zitadel.management.api.v1.UserPhoneView - 74, // 387: caos.zitadel.management.api.v1.ManagementService.ChangeUserPhone:output_type -> caos.zitadel.management.api.v1.UserPhone - 215, // 388: caos.zitadel.management.api.v1.ManagementService.RemoveUserPhone:output_type -> google.protobuf.Empty - 215, // 389: caos.zitadel.management.api.v1.ManagementService.ResendPhoneVerificationCode:output_type -> google.protobuf.Empty - 78, // 390: caos.zitadel.management.api.v1.ManagementService.GetUserAddress:output_type -> caos.zitadel.management.api.v1.UserAddressView - 77, // 391: caos.zitadel.management.api.v1.ManagementService.UpdateUserAddress:output_type -> caos.zitadel.management.api.v1.UserAddress - 55, // 392: caos.zitadel.management.api.v1.ManagementService.UpdateUserMachine:output_type -> caos.zitadel.management.api.v1.MachineResponse - 209, // 393: caos.zitadel.management.api.v1.ManagementService.SearchUserExternalIDPs:output_type -> caos.zitadel.management.api.v1.ExternalIDPSearchResponse - 215, // 394: caos.zitadel.management.api.v1.ManagementService.RemoveExternalIDP:output_type -> google.protobuf.Empty - 80, // 395: caos.zitadel.management.api.v1.ManagementService.GetUserMfas:output_type -> caos.zitadel.management.api.v1.MultiFactors - 215, // 396: caos.zitadel.management.api.v1.ManagementService.SendSetPasswordNotification:output_type -> google.protobuf.Empty - 215, // 397: caos.zitadel.management.api.v1.ManagementService.SetInitialPassword:output_type -> google.protobuf.Empty - 184, // 398: caos.zitadel.management.api.v1.ManagementService.SearchUserMemberships:output_type -> caos.zitadel.management.api.v1.UserMembershipSearchResponse - 85, // 399: caos.zitadel.management.api.v1.ManagementService.GetPasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicy - 85, // 400: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicy - 85, // 401: caos.zitadel.management.api.v1.ManagementService.CreatePasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicy - 85, // 402: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicy - 215, // 403: caos.zitadel.management.api.v1.ManagementService.DeletePasswordComplexityPolicy:output_type -> google.protobuf.Empty - 89, // 404: caos.zitadel.management.api.v1.ManagementService.GetPasswordAgePolicy:output_type -> caos.zitadel.management.api.v1.PasswordAgePolicy - 89, // 405: caos.zitadel.management.api.v1.ManagementService.CreatePasswordAgePolicy:output_type -> caos.zitadel.management.api.v1.PasswordAgePolicy - 89, // 406: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordAgePolicy:output_type -> caos.zitadel.management.api.v1.PasswordAgePolicy - 215, // 407: caos.zitadel.management.api.v1.ManagementService.DeletePasswordAgePolicy:output_type -> google.protobuf.Empty - 93, // 408: caos.zitadel.management.api.v1.ManagementService.GetPasswordLockoutPolicy:output_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicy - 93, // 409: caos.zitadel.management.api.v1.ManagementService.CreatePasswordLockoutPolicy:output_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicy - 93, // 410: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordLockoutPolicy:output_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicy - 215, // 411: caos.zitadel.management.api.v1.ManagementService.DeletePasswordLockoutPolicy:output_type -> google.protobuf.Empty - 98, // 412: caos.zitadel.management.api.v1.ManagementService.CreateOrg:output_type -> caos.zitadel.management.api.v1.Org - 40, // 413: caos.zitadel.management.api.v1.ManagementService.OrgChanges:output_type -> caos.zitadel.management.api.v1.Changes - 99, // 414: caos.zitadel.management.api.v1.ManagementService.GetMyOrg:output_type -> caos.zitadel.management.api.v1.OrgView - 99, // 415: caos.zitadel.management.api.v1.ManagementService.GetOrgByDomainGlobal:output_type -> caos.zitadel.management.api.v1.OrgView - 98, // 416: caos.zitadel.management.api.v1.ManagementService.DeactivateMyOrg:output_type -> caos.zitadel.management.api.v1.Org - 98, // 417: caos.zitadel.management.api.v1.ManagementService.ReactivateMyOrg:output_type -> caos.zitadel.management.api.v1.Org - 109, // 418: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgDomains:output_type -> caos.zitadel.management.api.v1.OrgDomainSearchResponse - 101, // 419: caos.zitadel.management.api.v1.ManagementService.AddMyOrgDomain:output_type -> caos.zitadel.management.api.v1.OrgDomain - 105, // 420: caos.zitadel.management.api.v1.ManagementService.GenerateMyOrgDomainValidation:output_type -> caos.zitadel.management.api.v1.OrgDomainValidationResponse - 215, // 421: caos.zitadel.management.api.v1.ManagementService.ValidateMyOrgDomain:output_type -> google.protobuf.Empty - 215, // 422: caos.zitadel.management.api.v1.ManagementService.SetMyPrimaryOrgDomain:output_type -> google.protobuf.Empty - 215, // 423: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgDomain:output_type -> google.protobuf.Empty - 96, // 424: caos.zitadel.management.api.v1.ManagementService.GetMyOrgIamPolicy:output_type -> caos.zitadel.management.api.v1.OrgIamPolicy - 112, // 425: caos.zitadel.management.api.v1.ManagementService.GetOrgMemberRoles:output_type -> caos.zitadel.management.api.v1.OrgMemberRoles - 113, // 426: caos.zitadel.management.api.v1.ManagementService.AddMyOrgMember:output_type -> caos.zitadel.management.api.v1.OrgMember - 113, // 427: caos.zitadel.management.api.v1.ManagementService.ChangeMyOrgMember:output_type -> caos.zitadel.management.api.v1.OrgMember - 215, // 428: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgMember:output_type -> google.protobuf.Empty - 117, // 429: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgMembers:output_type -> caos.zitadel.management.api.v1.OrgMemberSearchResponse - 40, // 430: caos.zitadel.management.api.v1.ManagementService.ProjectChanges:output_type -> caos.zitadel.management.api.v1.Changes - 123, // 431: caos.zitadel.management.api.v1.ManagementService.SearchProjects:output_type -> caos.zitadel.management.api.v1.ProjectSearchResponse - 124, // 432: caos.zitadel.management.api.v1.ManagementService.ProjectByID:output_type -> caos.zitadel.management.api.v1.ProjectView - 128, // 433: caos.zitadel.management.api.v1.ManagementService.CreateProject:output_type -> caos.zitadel.management.api.v1.Project - 128, // 434: caos.zitadel.management.api.v1.ManagementService.UpdateProject:output_type -> caos.zitadel.management.api.v1.Project - 128, // 435: caos.zitadel.management.api.v1.ManagementService.DeactivateProject:output_type -> caos.zitadel.management.api.v1.Project - 128, // 436: caos.zitadel.management.api.v1.ManagementService.ReactivateProject:output_type -> caos.zitadel.management.api.v1.Project - 215, // 437: caos.zitadel.management.api.v1.ManagementService.RemoveProject:output_type -> google.protobuf.Empty - 162, // 438: caos.zitadel.management.api.v1.ManagementService.SearchGrantedProjects:output_type -> caos.zitadel.management.api.v1.ProjectGrantSearchResponse - 161, // 439: caos.zitadel.management.api.v1.ManagementService.GetGrantedProjectByID:output_type -> caos.zitadel.management.api.v1.ProjectGrantView - 129, // 440: caos.zitadel.management.api.v1.ManagementService.GetProjectMemberRoles:output_type -> caos.zitadel.management.api.v1.ProjectMemberRoles - 144, // 441: caos.zitadel.management.api.v1.ManagementService.SearchProjectMembers:output_type -> caos.zitadel.management.api.v1.ProjectMemberSearchResponse - 130, // 442: caos.zitadel.management.api.v1.ManagementService.AddProjectMember:output_type -> caos.zitadel.management.api.v1.ProjectMember - 130, // 443: caos.zitadel.management.api.v1.ManagementService.ChangeProjectMember:output_type -> caos.zitadel.management.api.v1.ProjectMember - 215, // 444: caos.zitadel.management.api.v1.ManagementService.RemoveProjectMember:output_type -> google.protobuf.Empty - 140, // 445: caos.zitadel.management.api.v1.ManagementService.SearchProjectRoles:output_type -> caos.zitadel.management.api.v1.ProjectRoleSearchResponse - 137, // 446: caos.zitadel.management.api.v1.ManagementService.AddProjectRole:output_type -> caos.zitadel.management.api.v1.ProjectRole - 215, // 447: caos.zitadel.management.api.v1.ManagementService.BulkAddProjectRole:output_type -> google.protobuf.Empty - 137, // 448: caos.zitadel.management.api.v1.ManagementService.ChangeProjectRole:output_type -> caos.zitadel.management.api.v1.ProjectRole - 215, // 449: caos.zitadel.management.api.v1.ManagementService.RemoveProjectRole:output_type -> google.protobuf.Empty - 154, // 450: caos.zitadel.management.api.v1.ManagementService.SearchApplications:output_type -> caos.zitadel.management.api.v1.ApplicationSearchResponse - 153, // 451: caos.zitadel.management.api.v1.ManagementService.ApplicationByID:output_type -> caos.zitadel.management.api.v1.ApplicationView - 40, // 452: caos.zitadel.management.api.v1.ManagementService.ApplicationChanges:output_type -> caos.zitadel.management.api.v1.Changes - 147, // 453: caos.zitadel.management.api.v1.ManagementService.CreateOIDCApplication:output_type -> caos.zitadel.management.api.v1.Application - 147, // 454: caos.zitadel.management.api.v1.ManagementService.UpdateApplication:output_type -> caos.zitadel.management.api.v1.Application - 147, // 455: caos.zitadel.management.api.v1.ManagementService.DeactivateApplication:output_type -> caos.zitadel.management.api.v1.Application - 147, // 456: caos.zitadel.management.api.v1.ManagementService.ReactivateApplication:output_type -> caos.zitadel.management.api.v1.Application - 215, // 457: caos.zitadel.management.api.v1.ManagementService.RemoveApplication:output_type -> google.protobuf.Empty - 149, // 458: caos.zitadel.management.api.v1.ManagementService.UpdateApplicationOIDCConfig:output_type -> caos.zitadel.management.api.v1.OIDCConfig - 152, // 459: caos.zitadel.management.api.v1.ManagementService.RegenerateOIDCClientSecret:output_type -> caos.zitadel.management.api.v1.ClientSecret - 162, // 460: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrants:output_type -> caos.zitadel.management.api.v1.ProjectGrantSearchResponse - 161, // 461: caos.zitadel.management.api.v1.ManagementService.ProjectGrantByID:output_type -> caos.zitadel.management.api.v1.ProjectGrantView - 157, // 462: caos.zitadel.management.api.v1.ManagementService.CreateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant - 157, // 463: caos.zitadel.management.api.v1.ManagementService.UpdateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant - 157, // 464: caos.zitadel.management.api.v1.ManagementService.DeactivateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant - 157, // 465: caos.zitadel.management.api.v1.ManagementService.ReactivateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant - 215, // 466: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrant:output_type -> google.protobuf.Empty - 166, // 467: caos.zitadel.management.api.v1.ManagementService.GetProjectGrantMemberRoles:output_type -> caos.zitadel.management.api.v1.ProjectGrantMemberRoles - 172, // 468: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrantMembers:output_type -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse - 167, // 469: caos.zitadel.management.api.v1.ManagementService.AddProjectGrantMember:output_type -> caos.zitadel.management.api.v1.ProjectGrantMember - 167, // 470: caos.zitadel.management.api.v1.ManagementService.ChangeProjectGrantMember:output_type -> caos.zitadel.management.api.v1.ProjectGrantMember - 215, // 471: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrantMember:output_type -> google.protobuf.Empty - 181, // 472: caos.zitadel.management.api.v1.ManagementService.SearchUserGrants:output_type -> caos.zitadel.management.api.v1.UserGrantSearchResponse - 180, // 473: caos.zitadel.management.api.v1.ManagementService.UserGrantByID:output_type -> caos.zitadel.management.api.v1.UserGrantView - 175, // 474: caos.zitadel.management.api.v1.ManagementService.CreateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant - 175, // 475: caos.zitadel.management.api.v1.ManagementService.UpdateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant - 175, // 476: caos.zitadel.management.api.v1.ManagementService.DeactivateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant - 175, // 477: caos.zitadel.management.api.v1.ManagementService.ReactivateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant - 215, // 478: caos.zitadel.management.api.v1.ManagementService.RemoveUserGrant:output_type -> google.protobuf.Empty - 215, // 479: caos.zitadel.management.api.v1.ManagementService.BulkRemoveUserGrant:output_type -> google.protobuf.Empty - 195, // 480: caos.zitadel.management.api.v1.ManagementService.IdpByID:output_type -> caos.zitadel.management.api.v1.IdpView - 189, // 481: caos.zitadel.management.api.v1.ManagementService.CreateOidcIdp:output_type -> caos.zitadel.management.api.v1.Idp - 189, // 482: caos.zitadel.management.api.v1.ManagementService.UpdateIdpConfig:output_type -> caos.zitadel.management.api.v1.Idp - 189, // 483: caos.zitadel.management.api.v1.ManagementService.DeactivateIdpConfig:output_type -> caos.zitadel.management.api.v1.Idp - 189, // 484: caos.zitadel.management.api.v1.ManagementService.ReactivateIdpConfig:output_type -> caos.zitadel.management.api.v1.Idp - 215, // 485: caos.zitadel.management.api.v1.ManagementService.RemoveIdpConfig:output_type -> google.protobuf.Empty - 191, // 486: caos.zitadel.management.api.v1.ManagementService.UpdateOidcIdpConfig:output_type -> caos.zitadel.management.api.v1.OidcIdpConfig - 194, // 487: caos.zitadel.management.api.v1.ManagementService.SearchIdps:output_type -> caos.zitadel.management.api.v1.IdpSearchResponse - 204, // 488: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicy:output_type -> caos.zitadel.management.api.v1.LoginPolicyView - 199, // 489: caos.zitadel.management.api.v1.ManagementService.CreateLoginPolicy:output_type -> caos.zitadel.management.api.v1.LoginPolicy - 199, // 490: caos.zitadel.management.api.v1.ManagementService.UpdateLoginPolicy:output_type -> caos.zitadel.management.api.v1.LoginPolicy - 215, // 491: caos.zitadel.management.api.v1.ManagementService.RemoveLoginPolicy:output_type -> google.protobuf.Empty - 206, // 492: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicyIdpProviders:output_type -> caos.zitadel.management.api.v1.IdpProviderSearchResponse - 203, // 493: caos.zitadel.management.api.v1.ManagementService.AddIdpProviderToLoginPolicy:output_type -> caos.zitadel.management.api.v1.IdpProvider - 215, // 494: caos.zitadel.management.api.v1.ManagementService.RemoveIdpProviderFromLoginPolicy:output_type -> google.protobuf.Empty - 360, // [360:495] is the sub-list for method output_type - 225, // [225:360] is the sub-list for method input_type - 225, // [225:225] is the sub-list for extension type_name - 225, // [225:225] is the sub-list for extension extendee - 0, // [0:225] is the sub-list for field type_name + 0, // 0: caos.zitadel.management.api.v1.Iam.set_up_done:type_name -> caos.zitadel.management.api.v1.IamSetupStep + 0, // 1: caos.zitadel.management.api.v1.Iam.set_up_started:type_name -> caos.zitadel.management.api.v1.IamSetupStep + 44, // 2: caos.zitadel.management.api.v1.Changes.changes:type_name -> caos.zitadel.management.api.v1.Change + 212, // 3: caos.zitadel.management.api.v1.Change.change_date:type_name -> google.protobuf.Timestamp + 213, // 4: caos.zitadel.management.api.v1.Change.event_type:type_name -> caos.zitadel.api.v1.LocalizedMessage + 214, // 5: caos.zitadel.management.api.v1.Change.data:type_name -> google.protobuf.Struct + 52, // 6: caos.zitadel.management.api.v1.CreateUserRequest.human:type_name -> caos.zitadel.management.api.v1.CreateHumanRequest + 53, // 7: caos.zitadel.management.api.v1.CreateUserRequest.machine:type_name -> caos.zitadel.management.api.v1.CreateMachineRequest + 2, // 8: caos.zitadel.management.api.v1.CreateHumanRequest.gender:type_name -> caos.zitadel.management.api.v1.Gender + 1, // 9: caos.zitadel.management.api.v1.UserResponse.state:type_name -> caos.zitadel.management.api.v1.UserState + 212, // 10: caos.zitadel.management.api.v1.UserResponse.creation_date:type_name -> google.protobuf.Timestamp + 212, // 11: caos.zitadel.management.api.v1.UserResponse.change_date:type_name -> google.protobuf.Timestamp + 56, // 12: caos.zitadel.management.api.v1.UserResponse.human:type_name -> caos.zitadel.management.api.v1.HumanResponse + 58, // 13: caos.zitadel.management.api.v1.UserResponse.machine:type_name -> caos.zitadel.management.api.v1.MachineResponse + 1, // 14: caos.zitadel.management.api.v1.UserView.state:type_name -> caos.zitadel.management.api.v1.UserState + 212, // 15: caos.zitadel.management.api.v1.UserView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 16: caos.zitadel.management.api.v1.UserView.change_date:type_name -> google.protobuf.Timestamp + 212, // 17: caos.zitadel.management.api.v1.UserView.last_login:type_name -> google.protobuf.Timestamp + 57, // 18: caos.zitadel.management.api.v1.UserView.human:type_name -> caos.zitadel.management.api.v1.HumanView + 59, // 19: caos.zitadel.management.api.v1.UserView.machine:type_name -> caos.zitadel.management.api.v1.MachineView + 2, // 20: caos.zitadel.management.api.v1.HumanResponse.gender:type_name -> caos.zitadel.management.api.v1.Gender + 212, // 21: caos.zitadel.management.api.v1.HumanView.password_changed:type_name -> google.protobuf.Timestamp + 2, // 22: caos.zitadel.management.api.v1.HumanView.gender:type_name -> caos.zitadel.management.api.v1.Gender + 212, // 23: caos.zitadel.management.api.v1.MachineView.last_key_added:type_name -> google.protobuf.Timestamp + 3, // 24: caos.zitadel.management.api.v1.AddMachineKeyRequest.type:type_name -> caos.zitadel.management.api.v1.MachineKeyType + 212, // 25: caos.zitadel.management.api.v1.AddMachineKeyRequest.expiration_date:type_name -> google.protobuf.Timestamp + 212, // 26: caos.zitadel.management.api.v1.AddMachineKeyResponse.creation_date:type_name -> google.protobuf.Timestamp + 3, // 27: caos.zitadel.management.api.v1.AddMachineKeyResponse.type:type_name -> caos.zitadel.management.api.v1.MachineKeyType + 212, // 28: caos.zitadel.management.api.v1.AddMachineKeyResponse.expiration_date:type_name -> google.protobuf.Timestamp + 3, // 29: caos.zitadel.management.api.v1.MachineKeyView.type:type_name -> caos.zitadel.management.api.v1.MachineKeyType + 212, // 30: caos.zitadel.management.api.v1.MachineKeyView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 31: caos.zitadel.management.api.v1.MachineKeyView.expiration_date:type_name -> google.protobuf.Timestamp + 64, // 32: caos.zitadel.management.api.v1.MachineKeySearchResponse.result:type_name -> caos.zitadel.management.api.v1.MachineKeyView + 212, // 33: caos.zitadel.management.api.v1.MachineKeySearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 4, // 34: caos.zitadel.management.api.v1.UserSearchRequest.sorting_column:type_name -> caos.zitadel.management.api.v1.UserSearchKey + 68, // 35: caos.zitadel.management.api.v1.UserSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.UserSearchQuery + 4, // 36: caos.zitadel.management.api.v1.UserSearchQuery.key:type_name -> caos.zitadel.management.api.v1.UserSearchKey + 5, // 37: caos.zitadel.management.api.v1.UserSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 55, // 38: caos.zitadel.management.api.v1.UserSearchResponse.result:type_name -> caos.zitadel.management.api.v1.UserView + 212, // 39: caos.zitadel.management.api.v1.UserSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 2, // 40: caos.zitadel.management.api.v1.UserProfile.gender:type_name -> caos.zitadel.management.api.v1.Gender + 212, // 41: caos.zitadel.management.api.v1.UserProfile.creation_date:type_name -> google.protobuf.Timestamp + 212, // 42: caos.zitadel.management.api.v1.UserProfile.change_date:type_name -> google.protobuf.Timestamp + 2, // 43: caos.zitadel.management.api.v1.UserProfileView.gender:type_name -> caos.zitadel.management.api.v1.Gender + 212, // 44: caos.zitadel.management.api.v1.UserProfileView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 45: caos.zitadel.management.api.v1.UserProfileView.change_date:type_name -> google.protobuf.Timestamp + 2, // 46: caos.zitadel.management.api.v1.UpdateUserProfileRequest.gender:type_name -> caos.zitadel.management.api.v1.Gender + 212, // 47: caos.zitadel.management.api.v1.UserEmail.creation_date:type_name -> google.protobuf.Timestamp + 212, // 48: caos.zitadel.management.api.v1.UserEmail.change_date:type_name -> google.protobuf.Timestamp + 212, // 49: caos.zitadel.management.api.v1.UserEmailView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 50: caos.zitadel.management.api.v1.UserEmailView.change_date:type_name -> google.protobuf.Timestamp + 212, // 51: caos.zitadel.management.api.v1.UserPhone.creation_date:type_name -> google.protobuf.Timestamp + 212, // 52: caos.zitadel.management.api.v1.UserPhone.change_date:type_name -> google.protobuf.Timestamp + 212, // 53: caos.zitadel.management.api.v1.UserPhoneView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 54: caos.zitadel.management.api.v1.UserPhoneView.change_date:type_name -> google.protobuf.Timestamp + 212, // 55: caos.zitadel.management.api.v1.UserAddress.creation_date:type_name -> google.protobuf.Timestamp + 212, // 56: caos.zitadel.management.api.v1.UserAddress.change_date:type_name -> google.protobuf.Timestamp + 212, // 57: caos.zitadel.management.api.v1.UserAddressView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 58: caos.zitadel.management.api.v1.UserAddressView.change_date:type_name -> google.protobuf.Timestamp + 84, // 59: caos.zitadel.management.api.v1.MultiFactors.mfas:type_name -> caos.zitadel.management.api.v1.MultiFactor + 6, // 60: caos.zitadel.management.api.v1.MultiFactor.type:type_name -> caos.zitadel.management.api.v1.MfaType + 7, // 61: caos.zitadel.management.api.v1.MultiFactor.state:type_name -> caos.zitadel.management.api.v1.MFAState + 8, // 62: caos.zitadel.management.api.v1.SetPasswordNotificationRequest.type:type_name -> caos.zitadel.management.api.v1.NotificationType + 10, // 63: caos.zitadel.management.api.v1.Org.state:type_name -> caos.zitadel.management.api.v1.OrgState + 212, // 64: caos.zitadel.management.api.v1.Org.creation_date:type_name -> google.protobuf.Timestamp + 212, // 65: caos.zitadel.management.api.v1.Org.change_date:type_name -> google.protobuf.Timestamp + 10, // 66: caos.zitadel.management.api.v1.OrgView.state:type_name -> caos.zitadel.management.api.v1.OrgState + 212, // 67: caos.zitadel.management.api.v1.OrgView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 68: caos.zitadel.management.api.v1.OrgView.change_date:type_name -> google.protobuf.Timestamp + 212, // 69: caos.zitadel.management.api.v1.OrgDomain.creation_date:type_name -> google.protobuf.Timestamp + 212, // 70: caos.zitadel.management.api.v1.OrgDomain.change_date:type_name -> google.protobuf.Timestamp + 212, // 71: caos.zitadel.management.api.v1.OrgDomainView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 72: caos.zitadel.management.api.v1.OrgDomainView.change_date:type_name -> google.protobuf.Timestamp + 11, // 73: caos.zitadel.management.api.v1.OrgDomainView.validation_type:type_name -> caos.zitadel.management.api.v1.OrgDomainValidationType + 11, // 74: caos.zitadel.management.api.v1.OrgDomainValidationRequest.type:type_name -> caos.zitadel.management.api.v1.OrgDomainValidationType + 93, // 75: caos.zitadel.management.api.v1.OrgDomainSearchResponse.result:type_name -> caos.zitadel.management.api.v1.OrgDomainView + 212, // 76: caos.zitadel.management.api.v1.OrgDomainSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 102, // 77: caos.zitadel.management.api.v1.OrgDomainSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.OrgDomainSearchQuery + 12, // 78: caos.zitadel.management.api.v1.OrgDomainSearchQuery.key:type_name -> caos.zitadel.management.api.v1.OrgDomainSearchKey + 5, // 79: caos.zitadel.management.api.v1.OrgDomainSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 212, // 80: caos.zitadel.management.api.v1.OrgMember.change_date:type_name -> google.protobuf.Timestamp + 212, // 81: caos.zitadel.management.api.v1.OrgMember.creation_date:type_name -> google.protobuf.Timestamp + 109, // 82: caos.zitadel.management.api.v1.OrgMemberSearchResponse.result:type_name -> caos.zitadel.management.api.v1.OrgMemberView + 212, // 83: caos.zitadel.management.api.v1.OrgMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 212, // 84: caos.zitadel.management.api.v1.OrgMemberView.change_date:type_name -> google.protobuf.Timestamp + 212, // 85: caos.zitadel.management.api.v1.OrgMemberView.creation_date:type_name -> google.protobuf.Timestamp + 111, // 86: caos.zitadel.management.api.v1.OrgMemberSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.OrgMemberSearchQuery + 13, // 87: caos.zitadel.management.api.v1.OrgMemberSearchQuery.key:type_name -> caos.zitadel.management.api.v1.OrgMemberSearchKey + 5, // 88: caos.zitadel.management.api.v1.OrgMemberSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 115, // 89: caos.zitadel.management.api.v1.ProjectSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectView + 212, // 90: caos.zitadel.management.api.v1.ProjectSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 15, // 91: caos.zitadel.management.api.v1.ProjectView.state:type_name -> caos.zitadel.management.api.v1.ProjectState + 212, // 92: caos.zitadel.management.api.v1.ProjectView.change_date:type_name -> google.protobuf.Timestamp + 212, // 93: caos.zitadel.management.api.v1.ProjectView.creation_date:type_name -> google.protobuf.Timestamp + 117, // 94: caos.zitadel.management.api.v1.ProjectSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectSearchQuery + 14, // 95: caos.zitadel.management.api.v1.ProjectSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectSearchKey + 5, // 96: caos.zitadel.management.api.v1.ProjectSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 119, // 97: caos.zitadel.management.api.v1.Projects.projects:type_name -> caos.zitadel.management.api.v1.Project + 15, // 98: caos.zitadel.management.api.v1.Project.state:type_name -> caos.zitadel.management.api.v1.ProjectState + 212, // 99: caos.zitadel.management.api.v1.Project.change_date:type_name -> google.protobuf.Timestamp + 212, // 100: caos.zitadel.management.api.v1.Project.creation_date:type_name -> google.protobuf.Timestamp + 212, // 101: caos.zitadel.management.api.v1.ProjectMember.change_date:type_name -> google.protobuf.Timestamp + 212, // 102: caos.zitadel.management.api.v1.ProjectMember.creation_date:type_name -> google.protobuf.Timestamp + 125, // 103: caos.zitadel.management.api.v1.ProjectRoleAddBulk.project_roles:type_name -> caos.zitadel.management.api.v1.ProjectRoleAdd + 212, // 104: caos.zitadel.management.api.v1.ProjectRole.creation_date:type_name -> google.protobuf.Timestamp + 212, // 105: caos.zitadel.management.api.v1.ProjectRole.change_date:type_name -> google.protobuf.Timestamp + 212, // 106: caos.zitadel.management.api.v1.ProjectRoleView.creation_date:type_name -> google.protobuf.Timestamp + 129, // 107: caos.zitadel.management.api.v1.ProjectRoleSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectRoleView + 212, // 108: caos.zitadel.management.api.v1.ProjectRoleSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 133, // 109: caos.zitadel.management.api.v1.ProjectRoleSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectRoleSearchQuery + 16, // 110: caos.zitadel.management.api.v1.ProjectRoleSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectRoleSearchKey + 5, // 111: caos.zitadel.management.api.v1.ProjectRoleSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 212, // 112: caos.zitadel.management.api.v1.ProjectMemberView.change_date:type_name -> google.protobuf.Timestamp + 212, // 113: caos.zitadel.management.api.v1.ProjectMemberView.creation_date:type_name -> google.protobuf.Timestamp + 134, // 114: caos.zitadel.management.api.v1.ProjectMemberSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectMemberView + 212, // 115: caos.zitadel.management.api.v1.ProjectMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 137, // 116: caos.zitadel.management.api.v1.ProjectMemberSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectMemberSearchQuery + 17, // 117: caos.zitadel.management.api.v1.ProjectMemberSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectMemberSearchKey + 5, // 118: caos.zitadel.management.api.v1.ProjectMemberSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 18, // 119: caos.zitadel.management.api.v1.Application.state:type_name -> caos.zitadel.management.api.v1.AppState + 212, // 120: caos.zitadel.management.api.v1.Application.creation_date:type_name -> google.protobuf.Timestamp + 212, // 121: caos.zitadel.management.api.v1.Application.change_date:type_name -> google.protobuf.Timestamp + 140, // 122: caos.zitadel.management.api.v1.Application.oidc_config:type_name -> caos.zitadel.management.api.v1.OIDCConfig + 21, // 123: caos.zitadel.management.api.v1.OIDCConfig.response_types:type_name -> caos.zitadel.management.api.v1.OIDCResponseType + 22, // 124: caos.zitadel.management.api.v1.OIDCConfig.grant_types:type_name -> caos.zitadel.management.api.v1.OIDCGrantType + 23, // 125: caos.zitadel.management.api.v1.OIDCConfig.application_type:type_name -> caos.zitadel.management.api.v1.OIDCApplicationType + 24, // 126: caos.zitadel.management.api.v1.OIDCConfig.auth_method_type:type_name -> caos.zitadel.management.api.v1.OIDCAuthMethodType + 19, // 127: caos.zitadel.management.api.v1.OIDCConfig.version:type_name -> caos.zitadel.management.api.v1.OIDCVersion + 213, // 128: caos.zitadel.management.api.v1.OIDCConfig.compliance_problems:type_name -> caos.zitadel.api.v1.LocalizedMessage + 20, // 129: caos.zitadel.management.api.v1.OIDCConfig.access_token_type:type_name -> caos.zitadel.management.api.v1.OIDCTokenType + 21, // 130: caos.zitadel.management.api.v1.OIDCApplicationCreate.response_types:type_name -> caos.zitadel.management.api.v1.OIDCResponseType + 22, // 131: caos.zitadel.management.api.v1.OIDCApplicationCreate.grant_types:type_name -> caos.zitadel.management.api.v1.OIDCGrantType + 23, // 132: caos.zitadel.management.api.v1.OIDCApplicationCreate.application_type:type_name -> caos.zitadel.management.api.v1.OIDCApplicationType + 24, // 133: caos.zitadel.management.api.v1.OIDCApplicationCreate.auth_method_type:type_name -> caos.zitadel.management.api.v1.OIDCAuthMethodType + 19, // 134: caos.zitadel.management.api.v1.OIDCApplicationCreate.version:type_name -> caos.zitadel.management.api.v1.OIDCVersion + 20, // 135: caos.zitadel.management.api.v1.OIDCApplicationCreate.access_token_type:type_name -> caos.zitadel.management.api.v1.OIDCTokenType + 21, // 136: caos.zitadel.management.api.v1.OIDCConfigUpdate.response_types:type_name -> caos.zitadel.management.api.v1.OIDCResponseType + 22, // 137: caos.zitadel.management.api.v1.OIDCConfigUpdate.grant_types:type_name -> caos.zitadel.management.api.v1.OIDCGrantType + 23, // 138: caos.zitadel.management.api.v1.OIDCConfigUpdate.application_type:type_name -> caos.zitadel.management.api.v1.OIDCApplicationType + 24, // 139: caos.zitadel.management.api.v1.OIDCConfigUpdate.auth_method_type:type_name -> caos.zitadel.management.api.v1.OIDCAuthMethodType + 20, // 140: caos.zitadel.management.api.v1.OIDCConfigUpdate.access_token_type:type_name -> caos.zitadel.management.api.v1.OIDCTokenType + 18, // 141: caos.zitadel.management.api.v1.ApplicationView.state:type_name -> caos.zitadel.management.api.v1.AppState + 212, // 142: caos.zitadel.management.api.v1.ApplicationView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 143: caos.zitadel.management.api.v1.ApplicationView.change_date:type_name -> google.protobuf.Timestamp + 140, // 144: caos.zitadel.management.api.v1.ApplicationView.oidc_config:type_name -> caos.zitadel.management.api.v1.OIDCConfig + 144, // 145: caos.zitadel.management.api.v1.ApplicationSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ApplicationView + 212, // 146: caos.zitadel.management.api.v1.ApplicationSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 147, // 147: caos.zitadel.management.api.v1.ApplicationSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ApplicationSearchQuery + 25, // 148: caos.zitadel.management.api.v1.ApplicationSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ApplicationSearchKey + 5, // 149: caos.zitadel.management.api.v1.ApplicationSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 26, // 150: caos.zitadel.management.api.v1.ProjectGrant.state:type_name -> caos.zitadel.management.api.v1.ProjectGrantState + 212, // 151: caos.zitadel.management.api.v1.ProjectGrant.creation_date:type_name -> google.protobuf.Timestamp + 212, // 152: caos.zitadel.management.api.v1.ProjectGrant.change_date:type_name -> google.protobuf.Timestamp + 26, // 153: caos.zitadel.management.api.v1.ProjectGrantView.state:type_name -> caos.zitadel.management.api.v1.ProjectGrantState + 212, // 154: caos.zitadel.management.api.v1.ProjectGrantView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 155: caos.zitadel.management.api.v1.ProjectGrantView.change_date:type_name -> google.protobuf.Timestamp + 152, // 156: caos.zitadel.management.api.v1.ProjectGrantSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectGrantView + 212, // 157: caos.zitadel.management.api.v1.ProjectGrantSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 117, // 158: caos.zitadel.management.api.v1.GrantedProjectSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectSearchQuery + 156, // 159: caos.zitadel.management.api.v1.ProjectGrantSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectGrantSearchQuery + 27, // 160: caos.zitadel.management.api.v1.ProjectGrantSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectGrantSearchKey + 5, // 161: caos.zitadel.management.api.v1.ProjectGrantSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 212, // 162: caos.zitadel.management.api.v1.ProjectGrantMember.change_date:type_name -> google.protobuf.Timestamp + 212, // 163: caos.zitadel.management.api.v1.ProjectGrantMember.creation_date:type_name -> google.protobuf.Timestamp + 212, // 164: caos.zitadel.management.api.v1.ProjectGrantMemberView.change_date:type_name -> google.protobuf.Timestamp + 212, // 165: caos.zitadel.management.api.v1.ProjectGrantMemberView.creation_date:type_name -> google.protobuf.Timestamp + 162, // 166: caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ProjectGrantMemberView + 212, // 167: caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 165, // 168: caos.zitadel.management.api.v1.ProjectGrantMemberSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery + 28, // 169: caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery.key:type_name -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchKey + 5, // 170: caos.zitadel.management.api.v1.ProjectGrantMemberSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 29, // 171: caos.zitadel.management.api.v1.UserGrant.state:type_name -> caos.zitadel.management.api.v1.UserGrantState + 212, // 172: caos.zitadel.management.api.v1.UserGrant.creation_date:type_name -> google.protobuf.Timestamp + 212, // 173: caos.zitadel.management.api.v1.UserGrant.change_date:type_name -> google.protobuf.Timestamp + 29, // 174: caos.zitadel.management.api.v1.UserGrantView.state:type_name -> caos.zitadel.management.api.v1.UserGrantState + 212, // 175: caos.zitadel.management.api.v1.UserGrantView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 176: caos.zitadel.management.api.v1.UserGrantView.change_date:type_name -> google.protobuf.Timestamp + 171, // 177: caos.zitadel.management.api.v1.UserGrantSearchResponse.result:type_name -> caos.zitadel.management.api.v1.UserGrantView + 212, // 178: caos.zitadel.management.api.v1.UserGrantSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 174, // 179: caos.zitadel.management.api.v1.UserGrantSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.UserGrantSearchQuery + 30, // 180: caos.zitadel.management.api.v1.UserGrantSearchQuery.key:type_name -> caos.zitadel.management.api.v1.UserGrantSearchKey + 5, // 181: caos.zitadel.management.api.v1.UserGrantSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 178, // 182: caos.zitadel.management.api.v1.UserMembershipSearchResponse.result:type_name -> caos.zitadel.management.api.v1.UserMembershipView + 212, // 183: caos.zitadel.management.api.v1.UserMembershipSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 177, // 184: caos.zitadel.management.api.v1.UserMembershipSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.UserMembershipSearchQuery + 31, // 185: caos.zitadel.management.api.v1.UserMembershipSearchQuery.key:type_name -> caos.zitadel.management.api.v1.UserMembershipSearchKey + 5, // 186: caos.zitadel.management.api.v1.UserMembershipSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 32, // 187: caos.zitadel.management.api.v1.UserMembershipView.member_type:type_name -> caos.zitadel.management.api.v1.MemberType + 212, // 188: caos.zitadel.management.api.v1.UserMembershipView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 189: caos.zitadel.management.api.v1.UserMembershipView.change_date:type_name -> google.protobuf.Timestamp + 34, // 190: caos.zitadel.management.api.v1.Idp.state:type_name -> caos.zitadel.management.api.v1.IdpState + 212, // 191: caos.zitadel.management.api.v1.Idp.creation_date:type_name -> google.protobuf.Timestamp + 212, // 192: caos.zitadel.management.api.v1.Idp.change_date:type_name -> google.protobuf.Timestamp + 33, // 193: caos.zitadel.management.api.v1.Idp.styling_type:type_name -> caos.zitadel.management.api.v1.IdpStylingType + 182, // 194: caos.zitadel.management.api.v1.Idp.oidc_config:type_name -> caos.zitadel.management.api.v1.OidcIdpConfig + 33, // 195: caos.zitadel.management.api.v1.IdpUpdate.styling_type:type_name -> caos.zitadel.management.api.v1.IdpStylingType + 35, // 196: caos.zitadel.management.api.v1.OidcIdpConfig.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 35, // 197: caos.zitadel.management.api.v1.OidcIdpConfig.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 33, // 198: caos.zitadel.management.api.v1.OidcIdpConfigCreate.styling_type:type_name -> caos.zitadel.management.api.v1.IdpStylingType + 35, // 199: caos.zitadel.management.api.v1.OidcIdpConfigCreate.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 35, // 200: caos.zitadel.management.api.v1.OidcIdpConfigCreate.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 35, // 201: caos.zitadel.management.api.v1.OidcIdpConfigUpdate.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 35, // 202: caos.zitadel.management.api.v1.OidcIdpConfigUpdate.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 186, // 203: caos.zitadel.management.api.v1.IdpSearchResponse.result:type_name -> caos.zitadel.management.api.v1.IdpView + 212, // 204: caos.zitadel.management.api.v1.IdpSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 34, // 205: caos.zitadel.management.api.v1.IdpView.state:type_name -> caos.zitadel.management.api.v1.IdpState + 212, // 206: caos.zitadel.management.api.v1.IdpView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 207: caos.zitadel.management.api.v1.IdpView.change_date:type_name -> google.protobuf.Timestamp + 33, // 208: caos.zitadel.management.api.v1.IdpView.styling_type:type_name -> caos.zitadel.management.api.v1.IdpStylingType + 38, // 209: caos.zitadel.management.api.v1.IdpView.provider_type:type_name -> caos.zitadel.management.api.v1.IdpProviderType + 187, // 210: caos.zitadel.management.api.v1.IdpView.oidc_config:type_name -> caos.zitadel.management.api.v1.OidcIdpConfigView + 35, // 211: caos.zitadel.management.api.v1.OidcIdpConfigView.idp_display_name_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 35, // 212: caos.zitadel.management.api.v1.OidcIdpConfigView.username_mapping:type_name -> caos.zitadel.management.api.v1.OIDCMappingField + 189, // 213: caos.zitadel.management.api.v1.IdpSearchRequest.queries:type_name -> caos.zitadel.management.api.v1.IdpSearchQuery + 36, // 214: caos.zitadel.management.api.v1.IdpSearchQuery.key:type_name -> caos.zitadel.management.api.v1.IdpSearchKey + 5, // 215: caos.zitadel.management.api.v1.IdpSearchQuery.method:type_name -> caos.zitadel.management.api.v1.SearchMethod + 212, // 216: caos.zitadel.management.api.v1.LoginPolicy.creation_date:type_name -> google.protobuf.Timestamp + 212, // 217: caos.zitadel.management.api.v1.LoginPolicy.change_date:type_name -> google.protobuf.Timestamp + 38, // 218: caos.zitadel.management.api.v1.IdpProviderAdd.idp_provider_type:type_name -> caos.zitadel.management.api.v1.IdpProviderType + 38, // 219: caos.zitadel.management.api.v1.IdpProvider.idp_provider_Type:type_name -> caos.zitadel.management.api.v1.IdpProviderType + 212, // 220: caos.zitadel.management.api.v1.LoginPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 221: caos.zitadel.management.api.v1.LoginPolicyView.change_date:type_name -> google.protobuf.Timestamp + 37, // 222: caos.zitadel.management.api.v1.IdpProviderView.type:type_name -> caos.zitadel.management.api.v1.IdpType + 196, // 223: caos.zitadel.management.api.v1.IdpProviderSearchResponse.result:type_name -> caos.zitadel.management.api.v1.IdpProviderView + 212, // 224: caos.zitadel.management.api.v1.IdpProviderSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 201, // 225: caos.zitadel.management.api.v1.ExternalIDPSearchResponse.result:type_name -> caos.zitadel.management.api.v1.ExternalIDPView + 212, // 226: caos.zitadel.management.api.v1.ExternalIDPSearchResponse.view_timestamp:type_name -> google.protobuf.Timestamp + 212, // 227: caos.zitadel.management.api.v1.ExternalIDPView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 228: caos.zitadel.management.api.v1.ExternalIDPView.change_date:type_name -> google.protobuf.Timestamp + 212, // 229: caos.zitadel.management.api.v1.PasswordComplexityPolicy.creation_date:type_name -> google.protobuf.Timestamp + 212, // 230: caos.zitadel.management.api.v1.PasswordComplexityPolicy.change_date:type_name -> google.protobuf.Timestamp + 212, // 231: caos.zitadel.management.api.v1.PasswordComplexityPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 232: caos.zitadel.management.api.v1.PasswordComplexityPolicyView.change_date:type_name -> google.protobuf.Timestamp + 212, // 233: caos.zitadel.management.api.v1.PasswordAgePolicy.creation_date:type_name -> google.protobuf.Timestamp + 212, // 234: caos.zitadel.management.api.v1.PasswordAgePolicy.change_date:type_name -> google.protobuf.Timestamp + 212, // 235: caos.zitadel.management.api.v1.PasswordAgePolicyView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 236: caos.zitadel.management.api.v1.PasswordAgePolicyView.change_date:type_name -> google.protobuf.Timestamp + 212, // 237: caos.zitadel.management.api.v1.PasswordLockoutPolicy.creation_date:type_name -> google.protobuf.Timestamp + 212, // 238: caos.zitadel.management.api.v1.PasswordLockoutPolicy.change_date:type_name -> google.protobuf.Timestamp + 212, // 239: caos.zitadel.management.api.v1.PasswordLockoutPolicyView.creation_date:type_name -> google.protobuf.Timestamp + 212, // 240: caos.zitadel.management.api.v1.PasswordLockoutPolicyView.change_date:type_name -> google.protobuf.Timestamp + 215, // 241: caos.zitadel.management.api.v1.ManagementService.Healthz:input_type -> google.protobuf.Empty + 215, // 242: caos.zitadel.management.api.v1.ManagementService.Ready:input_type -> google.protobuf.Empty + 215, // 243: caos.zitadel.management.api.v1.ManagementService.Validate:input_type -> google.protobuf.Empty + 215, // 244: caos.zitadel.management.api.v1.ManagementService.GetZitadelDocs:input_type -> google.protobuf.Empty + 215, // 245: caos.zitadel.management.api.v1.ManagementService.GetIam:input_type -> google.protobuf.Empty + 49, // 246: caos.zitadel.management.api.v1.ManagementService.IsUserUnique:input_type -> caos.zitadel.management.api.v1.UniqueUserRequest + 47, // 247: caos.zitadel.management.api.v1.ManagementService.GetUserByID:input_type -> caos.zitadel.management.api.v1.UserID + 48, // 248: caos.zitadel.management.api.v1.ManagementService.GetUserByLoginNameGlobal:input_type -> caos.zitadel.management.api.v1.LoginName + 67, // 249: caos.zitadel.management.api.v1.ManagementService.SearchUsers:input_type -> caos.zitadel.management.api.v1.UserSearchRequest + 51, // 250: caos.zitadel.management.api.v1.ManagementService.CreateUser:input_type -> caos.zitadel.management.api.v1.CreateUserRequest + 47, // 251: caos.zitadel.management.api.v1.ManagementService.DeactivateUser:input_type -> caos.zitadel.management.api.v1.UserID + 47, // 252: caos.zitadel.management.api.v1.ManagementService.ReactivateUser:input_type -> caos.zitadel.management.api.v1.UserID + 47, // 253: caos.zitadel.management.api.v1.ManagementService.LockUser:input_type -> caos.zitadel.management.api.v1.UserID + 47, // 254: caos.zitadel.management.api.v1.ManagementService.UnlockUser:input_type -> caos.zitadel.management.api.v1.UserID + 47, // 255: caos.zitadel.management.api.v1.ManagementService.DeleteUser:input_type -> caos.zitadel.management.api.v1.UserID + 42, // 256: caos.zitadel.management.api.v1.ManagementService.UserChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest + 61, // 257: caos.zitadel.management.api.v1.ManagementService.AddMachineKey:input_type -> caos.zitadel.management.api.v1.AddMachineKeyRequest + 63, // 258: caos.zitadel.management.api.v1.ManagementService.DeleteMachineKey:input_type -> caos.zitadel.management.api.v1.MachineKeyIDRequest + 65, // 259: caos.zitadel.management.api.v1.ManagementService.SearchMachineKeys:input_type -> caos.zitadel.management.api.v1.MachineKeySearchRequest + 63, // 260: caos.zitadel.management.api.v1.ManagementService.GetMachineKey:input_type -> caos.zitadel.management.api.v1.MachineKeyIDRequest + 47, // 261: caos.zitadel.management.api.v1.ManagementService.GetUserProfile:input_type -> caos.zitadel.management.api.v1.UserID + 72, // 262: caos.zitadel.management.api.v1.ManagementService.UpdateUserProfile:input_type -> caos.zitadel.management.api.v1.UpdateUserProfileRequest + 47, // 263: caos.zitadel.management.api.v1.ManagementService.GetUserEmail:input_type -> caos.zitadel.management.api.v1.UserID + 73, // 264: caos.zitadel.management.api.v1.ManagementService.ChangeUserUserName:input_type -> caos.zitadel.management.api.v1.UpdateUserUserNameRequest + 76, // 265: caos.zitadel.management.api.v1.ManagementService.ChangeUserEmail:input_type -> caos.zitadel.management.api.v1.UpdateUserEmailRequest + 47, // 266: caos.zitadel.management.api.v1.ManagementService.ResendEmailVerificationMail:input_type -> caos.zitadel.management.api.v1.UserID + 47, // 267: caos.zitadel.management.api.v1.ManagementService.GetUserPhone:input_type -> caos.zitadel.management.api.v1.UserID + 79, // 268: caos.zitadel.management.api.v1.ManagementService.ChangeUserPhone:input_type -> caos.zitadel.management.api.v1.UpdateUserPhoneRequest + 47, // 269: caos.zitadel.management.api.v1.ManagementService.RemoveUserPhone:input_type -> caos.zitadel.management.api.v1.UserID + 47, // 270: caos.zitadel.management.api.v1.ManagementService.ResendPhoneVerificationCode:input_type -> caos.zitadel.management.api.v1.UserID + 47, // 271: caos.zitadel.management.api.v1.ManagementService.GetUserAddress:input_type -> caos.zitadel.management.api.v1.UserID + 82, // 272: caos.zitadel.management.api.v1.ManagementService.UpdateUserAddress:input_type -> caos.zitadel.management.api.v1.UpdateUserAddressRequest + 60, // 273: caos.zitadel.management.api.v1.ManagementService.UpdateUserMachine:input_type -> caos.zitadel.management.api.v1.UpdateMachineRequest + 199, // 274: caos.zitadel.management.api.v1.ManagementService.SearchUserExternalIDPs:input_type -> caos.zitadel.management.api.v1.ExternalIDPSearchRequest + 202, // 275: caos.zitadel.management.api.v1.ManagementService.RemoveExternalIDP:input_type -> caos.zitadel.management.api.v1.ExternalIDPRemoveRequest + 47, // 276: caos.zitadel.management.api.v1.ManagementService.GetUserMfas:input_type -> caos.zitadel.management.api.v1.UserID + 86, // 277: caos.zitadel.management.api.v1.ManagementService.SendSetPasswordNotification:input_type -> caos.zitadel.management.api.v1.SetPasswordNotificationRequest + 85, // 278: caos.zitadel.management.api.v1.ManagementService.SetInitialPassword:input_type -> caos.zitadel.management.api.v1.PasswordRequest + 176, // 279: caos.zitadel.management.api.v1.ManagementService.SearchUserMemberships:input_type -> caos.zitadel.management.api.v1.UserMembershipSearchRequest + 88, // 280: caos.zitadel.management.api.v1.ManagementService.CreateOrg:input_type -> caos.zitadel.management.api.v1.OrgCreateRequest + 42, // 281: caos.zitadel.management.api.v1.ManagementService.OrgChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest + 215, // 282: caos.zitadel.management.api.v1.ManagementService.GetMyOrg:input_type -> google.protobuf.Empty + 91, // 283: caos.zitadel.management.api.v1.ManagementService.GetOrgByDomainGlobal:input_type -> caos.zitadel.management.api.v1.Domain + 215, // 284: caos.zitadel.management.api.v1.ManagementService.DeactivateMyOrg:input_type -> google.protobuf.Empty + 215, // 285: caos.zitadel.management.api.v1.ManagementService.ReactivateMyOrg:input_type -> google.protobuf.Empty + 101, // 286: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgDomains:input_type -> caos.zitadel.management.api.v1.OrgDomainSearchRequest + 94, // 287: caos.zitadel.management.api.v1.ManagementService.AddMyOrgDomain:input_type -> caos.zitadel.management.api.v1.AddOrgDomainRequest + 95, // 288: caos.zitadel.management.api.v1.ManagementService.GenerateMyOrgDomainValidation:input_type -> caos.zitadel.management.api.v1.OrgDomainValidationRequest + 97, // 289: caos.zitadel.management.api.v1.ManagementService.ValidateMyOrgDomain:input_type -> caos.zitadel.management.api.v1.ValidateOrgDomainRequest + 98, // 290: caos.zitadel.management.api.v1.ManagementService.SetMyPrimaryOrgDomain:input_type -> caos.zitadel.management.api.v1.PrimaryOrgDomainRequest + 99, // 291: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgDomain:input_type -> caos.zitadel.management.api.v1.RemoveOrgDomainRequest + 215, // 292: caos.zitadel.management.api.v1.ManagementService.GetMyOrgIamPolicy:input_type -> google.protobuf.Empty + 215, // 293: caos.zitadel.management.api.v1.ManagementService.GetOrgMemberRoles:input_type -> google.protobuf.Empty + 105, // 294: caos.zitadel.management.api.v1.ManagementService.AddMyOrgMember:input_type -> caos.zitadel.management.api.v1.AddOrgMemberRequest + 106, // 295: caos.zitadel.management.api.v1.ManagementService.ChangeMyOrgMember:input_type -> caos.zitadel.management.api.v1.ChangeOrgMemberRequest + 107, // 296: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgMember:input_type -> caos.zitadel.management.api.v1.RemoveOrgMemberRequest + 110, // 297: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgMembers:input_type -> caos.zitadel.management.api.v1.OrgMemberSearchRequest + 42, // 298: caos.zitadel.management.api.v1.ManagementService.ProjectChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest + 116, // 299: caos.zitadel.management.api.v1.ManagementService.SearchProjects:input_type -> caos.zitadel.management.api.v1.ProjectSearchRequest + 46, // 300: caos.zitadel.management.api.v1.ManagementService.ProjectByID:input_type -> caos.zitadel.management.api.v1.ProjectID + 112, // 301: caos.zitadel.management.api.v1.ManagementService.CreateProject:input_type -> caos.zitadel.management.api.v1.ProjectCreateRequest + 113, // 302: caos.zitadel.management.api.v1.ManagementService.UpdateProject:input_type -> caos.zitadel.management.api.v1.ProjectUpdateRequest + 46, // 303: caos.zitadel.management.api.v1.ManagementService.DeactivateProject:input_type -> caos.zitadel.management.api.v1.ProjectID + 46, // 304: caos.zitadel.management.api.v1.ManagementService.ReactivateProject:input_type -> caos.zitadel.management.api.v1.ProjectID + 46, // 305: caos.zitadel.management.api.v1.ManagementService.RemoveProject:input_type -> caos.zitadel.management.api.v1.ProjectID + 154, // 306: caos.zitadel.management.api.v1.ManagementService.SearchGrantedProjects:input_type -> caos.zitadel.management.api.v1.GrantedProjectSearchRequest + 151, // 307: caos.zitadel.management.api.v1.ManagementService.GetGrantedProjectByID:input_type -> caos.zitadel.management.api.v1.ProjectGrantID + 215, // 308: caos.zitadel.management.api.v1.ManagementService.GetProjectMemberRoles:input_type -> google.protobuf.Empty + 136, // 309: caos.zitadel.management.api.v1.ManagementService.SearchProjectMembers:input_type -> caos.zitadel.management.api.v1.ProjectMemberSearchRequest + 122, // 310: caos.zitadel.management.api.v1.ManagementService.AddProjectMember:input_type -> caos.zitadel.management.api.v1.ProjectMemberAdd + 123, // 311: caos.zitadel.management.api.v1.ManagementService.ChangeProjectMember:input_type -> caos.zitadel.management.api.v1.ProjectMemberChange + 124, // 312: caos.zitadel.management.api.v1.ManagementService.RemoveProjectMember:input_type -> caos.zitadel.management.api.v1.ProjectMemberRemove + 132, // 313: caos.zitadel.management.api.v1.ManagementService.SearchProjectRoles:input_type -> caos.zitadel.management.api.v1.ProjectRoleSearchRequest + 125, // 314: caos.zitadel.management.api.v1.ManagementService.AddProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleAdd + 126, // 315: caos.zitadel.management.api.v1.ManagementService.BulkAddProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleAddBulk + 127, // 316: caos.zitadel.management.api.v1.ManagementService.ChangeProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleChange + 130, // 317: caos.zitadel.management.api.v1.ManagementService.RemoveProjectRole:input_type -> caos.zitadel.management.api.v1.ProjectRoleRemove + 146, // 318: caos.zitadel.management.api.v1.ManagementService.SearchApplications:input_type -> caos.zitadel.management.api.v1.ApplicationSearchRequest + 45, // 319: caos.zitadel.management.api.v1.ManagementService.ApplicationByID:input_type -> caos.zitadel.management.api.v1.ApplicationID + 42, // 320: caos.zitadel.management.api.v1.ManagementService.ApplicationChanges:input_type -> caos.zitadel.management.api.v1.ChangeRequest + 141, // 321: caos.zitadel.management.api.v1.ManagementService.CreateOIDCApplication:input_type -> caos.zitadel.management.api.v1.OIDCApplicationCreate + 139, // 322: caos.zitadel.management.api.v1.ManagementService.UpdateApplication:input_type -> caos.zitadel.management.api.v1.ApplicationUpdate + 45, // 323: caos.zitadel.management.api.v1.ManagementService.DeactivateApplication:input_type -> caos.zitadel.management.api.v1.ApplicationID + 45, // 324: caos.zitadel.management.api.v1.ManagementService.ReactivateApplication:input_type -> caos.zitadel.management.api.v1.ApplicationID + 45, // 325: caos.zitadel.management.api.v1.ManagementService.RemoveApplication:input_type -> caos.zitadel.management.api.v1.ApplicationID + 142, // 326: caos.zitadel.management.api.v1.ManagementService.UpdateApplicationOIDCConfig:input_type -> caos.zitadel.management.api.v1.OIDCConfigUpdate + 45, // 327: caos.zitadel.management.api.v1.ManagementService.RegenerateOIDCClientSecret:input_type -> caos.zitadel.management.api.v1.ApplicationID + 155, // 328: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrants:input_type -> caos.zitadel.management.api.v1.ProjectGrantSearchRequest + 151, // 329: caos.zitadel.management.api.v1.ManagementService.ProjectGrantByID:input_type -> caos.zitadel.management.api.v1.ProjectGrantID + 149, // 330: caos.zitadel.management.api.v1.ManagementService.CreateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantCreate + 150, // 331: caos.zitadel.management.api.v1.ManagementService.UpdateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantUpdate + 151, // 332: caos.zitadel.management.api.v1.ManagementService.DeactivateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantID + 151, // 333: caos.zitadel.management.api.v1.ManagementService.ReactivateProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantID + 151, // 334: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrant:input_type -> caos.zitadel.management.api.v1.ProjectGrantID + 215, // 335: caos.zitadel.management.api.v1.ManagementService.GetProjectGrantMemberRoles:input_type -> google.protobuf.Empty + 164, // 336: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrantMembers:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchRequest + 159, // 337: caos.zitadel.management.api.v1.ManagementService.AddProjectGrantMember:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberAdd + 160, // 338: caos.zitadel.management.api.v1.ManagementService.ChangeProjectGrantMember:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberChange + 161, // 339: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrantMember:input_type -> caos.zitadel.management.api.v1.ProjectGrantMemberRemove + 173, // 340: caos.zitadel.management.api.v1.ManagementService.SearchUserGrants:input_type -> caos.zitadel.management.api.v1.UserGrantSearchRequest + 170, // 341: caos.zitadel.management.api.v1.ManagementService.UserGrantByID:input_type -> caos.zitadel.management.api.v1.UserGrantID + 167, // 342: caos.zitadel.management.api.v1.ManagementService.CreateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantCreate + 168, // 343: caos.zitadel.management.api.v1.ManagementService.UpdateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantUpdate + 170, // 344: caos.zitadel.management.api.v1.ManagementService.DeactivateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantID + 170, // 345: caos.zitadel.management.api.v1.ManagementService.ReactivateUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantID + 170, // 346: caos.zitadel.management.api.v1.ManagementService.RemoveUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantID + 169, // 347: caos.zitadel.management.api.v1.ManagementService.BulkRemoveUserGrant:input_type -> caos.zitadel.management.api.v1.UserGrantRemoveBulk + 179, // 348: caos.zitadel.management.api.v1.ManagementService.IdpByID:input_type -> caos.zitadel.management.api.v1.IdpID + 183, // 349: caos.zitadel.management.api.v1.ManagementService.CreateOidcIdp:input_type -> caos.zitadel.management.api.v1.OidcIdpConfigCreate + 181, // 350: caos.zitadel.management.api.v1.ManagementService.UpdateIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpUpdate + 179, // 351: caos.zitadel.management.api.v1.ManagementService.DeactivateIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpID + 179, // 352: caos.zitadel.management.api.v1.ManagementService.ReactivateIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpID + 179, // 353: caos.zitadel.management.api.v1.ManagementService.RemoveIdpConfig:input_type -> caos.zitadel.management.api.v1.IdpID + 184, // 354: caos.zitadel.management.api.v1.ManagementService.UpdateOidcIdpConfig:input_type -> caos.zitadel.management.api.v1.OidcIdpConfigUpdate + 188, // 355: caos.zitadel.management.api.v1.ManagementService.SearchIdps:input_type -> caos.zitadel.management.api.v1.IdpSearchRequest + 215, // 356: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicy:input_type -> google.protobuf.Empty + 215, // 357: caos.zitadel.management.api.v1.ManagementService.GetDefaultLoginPolicy:input_type -> google.protobuf.Empty + 191, // 358: caos.zitadel.management.api.v1.ManagementService.CreateLoginPolicy:input_type -> caos.zitadel.management.api.v1.LoginPolicyRequest + 191, // 359: caos.zitadel.management.api.v1.ManagementService.UpdateLoginPolicy:input_type -> caos.zitadel.management.api.v1.LoginPolicyRequest + 215, // 360: caos.zitadel.management.api.v1.ManagementService.RemoveLoginPolicy:input_type -> google.protobuf.Empty + 198, // 361: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicyIdpProviders:input_type -> caos.zitadel.management.api.v1.IdpProviderSearchRequest + 193, // 362: caos.zitadel.management.api.v1.ManagementService.AddIdpProviderToLoginPolicy:input_type -> caos.zitadel.management.api.v1.IdpProviderAdd + 192, // 363: caos.zitadel.management.api.v1.ManagementService.RemoveIdpProviderFromLoginPolicy:input_type -> caos.zitadel.management.api.v1.IdpProviderID + 215, // 364: caos.zitadel.management.api.v1.ManagementService.GetPasswordComplexityPolicy:input_type -> google.protobuf.Empty + 215, // 365: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordComplexityPolicy:input_type -> google.protobuf.Empty + 204, // 366: caos.zitadel.management.api.v1.ManagementService.CreatePasswordComplexityPolicy:input_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicyRequest + 204, // 367: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordComplexityPolicy:input_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicyRequest + 215, // 368: caos.zitadel.management.api.v1.ManagementService.RemovePasswordComplexityPolicy:input_type -> google.protobuf.Empty + 215, // 369: caos.zitadel.management.api.v1.ManagementService.GetPasswordAgePolicy:input_type -> google.protobuf.Empty + 215, // 370: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordAgePolicy:input_type -> google.protobuf.Empty + 207, // 371: caos.zitadel.management.api.v1.ManagementService.CreatePasswordAgePolicy:input_type -> caos.zitadel.management.api.v1.PasswordAgePolicyRequest + 207, // 372: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordAgePolicy:input_type -> caos.zitadel.management.api.v1.PasswordAgePolicyRequest + 215, // 373: caos.zitadel.management.api.v1.ManagementService.RemovePasswordAgePolicy:input_type -> google.protobuf.Empty + 215, // 374: caos.zitadel.management.api.v1.ManagementService.GetPasswordLockoutPolicy:input_type -> google.protobuf.Empty + 215, // 375: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordLockoutPolicy:input_type -> google.protobuf.Empty + 210, // 376: caos.zitadel.management.api.v1.ManagementService.CreatePasswordLockoutPolicy:input_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicyRequest + 210, // 377: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordLockoutPolicy:input_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicyRequest + 215, // 378: caos.zitadel.management.api.v1.ManagementService.RemovePasswordLockoutPolicy:input_type -> google.protobuf.Empty + 215, // 379: caos.zitadel.management.api.v1.ManagementService.Healthz:output_type -> google.protobuf.Empty + 215, // 380: caos.zitadel.management.api.v1.ManagementService.Ready:output_type -> google.protobuf.Empty + 214, // 381: caos.zitadel.management.api.v1.ManagementService.Validate:output_type -> google.protobuf.Struct + 40, // 382: caos.zitadel.management.api.v1.ManagementService.GetZitadelDocs:output_type -> caos.zitadel.management.api.v1.ZitadelDocs + 41, // 383: caos.zitadel.management.api.v1.ManagementService.GetIam:output_type -> caos.zitadel.management.api.v1.Iam + 50, // 384: caos.zitadel.management.api.v1.ManagementService.IsUserUnique:output_type -> caos.zitadel.management.api.v1.UniqueUserResponse + 55, // 385: caos.zitadel.management.api.v1.ManagementService.GetUserByID:output_type -> caos.zitadel.management.api.v1.UserView + 55, // 386: caos.zitadel.management.api.v1.ManagementService.GetUserByLoginNameGlobal:output_type -> caos.zitadel.management.api.v1.UserView + 69, // 387: caos.zitadel.management.api.v1.ManagementService.SearchUsers:output_type -> caos.zitadel.management.api.v1.UserSearchResponse + 54, // 388: caos.zitadel.management.api.v1.ManagementService.CreateUser:output_type -> caos.zitadel.management.api.v1.UserResponse + 54, // 389: caos.zitadel.management.api.v1.ManagementService.DeactivateUser:output_type -> caos.zitadel.management.api.v1.UserResponse + 54, // 390: caos.zitadel.management.api.v1.ManagementService.ReactivateUser:output_type -> caos.zitadel.management.api.v1.UserResponse + 54, // 391: caos.zitadel.management.api.v1.ManagementService.LockUser:output_type -> caos.zitadel.management.api.v1.UserResponse + 54, // 392: caos.zitadel.management.api.v1.ManagementService.UnlockUser:output_type -> caos.zitadel.management.api.v1.UserResponse + 215, // 393: caos.zitadel.management.api.v1.ManagementService.DeleteUser:output_type -> google.protobuf.Empty + 43, // 394: caos.zitadel.management.api.v1.ManagementService.UserChanges:output_type -> caos.zitadel.management.api.v1.Changes + 62, // 395: caos.zitadel.management.api.v1.ManagementService.AddMachineKey:output_type -> caos.zitadel.management.api.v1.AddMachineKeyResponse + 215, // 396: caos.zitadel.management.api.v1.ManagementService.DeleteMachineKey:output_type -> google.protobuf.Empty + 66, // 397: caos.zitadel.management.api.v1.ManagementService.SearchMachineKeys:output_type -> caos.zitadel.management.api.v1.MachineKeySearchResponse + 64, // 398: caos.zitadel.management.api.v1.ManagementService.GetMachineKey:output_type -> caos.zitadel.management.api.v1.MachineKeyView + 71, // 399: caos.zitadel.management.api.v1.ManagementService.GetUserProfile:output_type -> caos.zitadel.management.api.v1.UserProfileView + 70, // 400: caos.zitadel.management.api.v1.ManagementService.UpdateUserProfile:output_type -> caos.zitadel.management.api.v1.UserProfile + 75, // 401: caos.zitadel.management.api.v1.ManagementService.GetUserEmail:output_type -> caos.zitadel.management.api.v1.UserEmailView + 215, // 402: caos.zitadel.management.api.v1.ManagementService.ChangeUserUserName:output_type -> google.protobuf.Empty + 74, // 403: caos.zitadel.management.api.v1.ManagementService.ChangeUserEmail:output_type -> caos.zitadel.management.api.v1.UserEmail + 215, // 404: caos.zitadel.management.api.v1.ManagementService.ResendEmailVerificationMail:output_type -> google.protobuf.Empty + 78, // 405: caos.zitadel.management.api.v1.ManagementService.GetUserPhone:output_type -> caos.zitadel.management.api.v1.UserPhoneView + 77, // 406: caos.zitadel.management.api.v1.ManagementService.ChangeUserPhone:output_type -> caos.zitadel.management.api.v1.UserPhone + 215, // 407: caos.zitadel.management.api.v1.ManagementService.RemoveUserPhone:output_type -> google.protobuf.Empty + 215, // 408: caos.zitadel.management.api.v1.ManagementService.ResendPhoneVerificationCode:output_type -> google.protobuf.Empty + 81, // 409: caos.zitadel.management.api.v1.ManagementService.GetUserAddress:output_type -> caos.zitadel.management.api.v1.UserAddressView + 80, // 410: caos.zitadel.management.api.v1.ManagementService.UpdateUserAddress:output_type -> caos.zitadel.management.api.v1.UserAddress + 58, // 411: caos.zitadel.management.api.v1.ManagementService.UpdateUserMachine:output_type -> caos.zitadel.management.api.v1.MachineResponse + 200, // 412: caos.zitadel.management.api.v1.ManagementService.SearchUserExternalIDPs:output_type -> caos.zitadel.management.api.v1.ExternalIDPSearchResponse + 215, // 413: caos.zitadel.management.api.v1.ManagementService.RemoveExternalIDP:output_type -> google.protobuf.Empty + 83, // 414: caos.zitadel.management.api.v1.ManagementService.GetUserMfas:output_type -> caos.zitadel.management.api.v1.MultiFactors + 215, // 415: caos.zitadel.management.api.v1.ManagementService.SendSetPasswordNotification:output_type -> google.protobuf.Empty + 215, // 416: caos.zitadel.management.api.v1.ManagementService.SetInitialPassword:output_type -> google.protobuf.Empty + 175, // 417: caos.zitadel.management.api.v1.ManagementService.SearchUserMemberships:output_type -> caos.zitadel.management.api.v1.UserMembershipSearchResponse + 89, // 418: caos.zitadel.management.api.v1.ManagementService.CreateOrg:output_type -> caos.zitadel.management.api.v1.Org + 43, // 419: caos.zitadel.management.api.v1.ManagementService.OrgChanges:output_type -> caos.zitadel.management.api.v1.Changes + 90, // 420: caos.zitadel.management.api.v1.ManagementService.GetMyOrg:output_type -> caos.zitadel.management.api.v1.OrgView + 90, // 421: caos.zitadel.management.api.v1.ManagementService.GetOrgByDomainGlobal:output_type -> caos.zitadel.management.api.v1.OrgView + 89, // 422: caos.zitadel.management.api.v1.ManagementService.DeactivateMyOrg:output_type -> caos.zitadel.management.api.v1.Org + 89, // 423: caos.zitadel.management.api.v1.ManagementService.ReactivateMyOrg:output_type -> caos.zitadel.management.api.v1.Org + 100, // 424: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgDomains:output_type -> caos.zitadel.management.api.v1.OrgDomainSearchResponse + 92, // 425: caos.zitadel.management.api.v1.ManagementService.AddMyOrgDomain:output_type -> caos.zitadel.management.api.v1.OrgDomain + 96, // 426: caos.zitadel.management.api.v1.ManagementService.GenerateMyOrgDomainValidation:output_type -> caos.zitadel.management.api.v1.OrgDomainValidationResponse + 215, // 427: caos.zitadel.management.api.v1.ManagementService.ValidateMyOrgDomain:output_type -> google.protobuf.Empty + 215, // 428: caos.zitadel.management.api.v1.ManagementService.SetMyPrimaryOrgDomain:output_type -> google.protobuf.Empty + 215, // 429: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgDomain:output_type -> google.protobuf.Empty + 87, // 430: caos.zitadel.management.api.v1.ManagementService.GetMyOrgIamPolicy:output_type -> caos.zitadel.management.api.v1.OrgIamPolicyView + 103, // 431: caos.zitadel.management.api.v1.ManagementService.GetOrgMemberRoles:output_type -> caos.zitadel.management.api.v1.OrgMemberRoles + 104, // 432: caos.zitadel.management.api.v1.ManagementService.AddMyOrgMember:output_type -> caos.zitadel.management.api.v1.OrgMember + 104, // 433: caos.zitadel.management.api.v1.ManagementService.ChangeMyOrgMember:output_type -> caos.zitadel.management.api.v1.OrgMember + 215, // 434: caos.zitadel.management.api.v1.ManagementService.RemoveMyOrgMember:output_type -> google.protobuf.Empty + 108, // 435: caos.zitadel.management.api.v1.ManagementService.SearchMyOrgMembers:output_type -> caos.zitadel.management.api.v1.OrgMemberSearchResponse + 43, // 436: caos.zitadel.management.api.v1.ManagementService.ProjectChanges:output_type -> caos.zitadel.management.api.v1.Changes + 114, // 437: caos.zitadel.management.api.v1.ManagementService.SearchProjects:output_type -> caos.zitadel.management.api.v1.ProjectSearchResponse + 115, // 438: caos.zitadel.management.api.v1.ManagementService.ProjectByID:output_type -> caos.zitadel.management.api.v1.ProjectView + 119, // 439: caos.zitadel.management.api.v1.ManagementService.CreateProject:output_type -> caos.zitadel.management.api.v1.Project + 119, // 440: caos.zitadel.management.api.v1.ManagementService.UpdateProject:output_type -> caos.zitadel.management.api.v1.Project + 119, // 441: caos.zitadel.management.api.v1.ManagementService.DeactivateProject:output_type -> caos.zitadel.management.api.v1.Project + 119, // 442: caos.zitadel.management.api.v1.ManagementService.ReactivateProject:output_type -> caos.zitadel.management.api.v1.Project + 215, // 443: caos.zitadel.management.api.v1.ManagementService.RemoveProject:output_type -> google.protobuf.Empty + 153, // 444: caos.zitadel.management.api.v1.ManagementService.SearchGrantedProjects:output_type -> caos.zitadel.management.api.v1.ProjectGrantSearchResponse + 152, // 445: caos.zitadel.management.api.v1.ManagementService.GetGrantedProjectByID:output_type -> caos.zitadel.management.api.v1.ProjectGrantView + 120, // 446: caos.zitadel.management.api.v1.ManagementService.GetProjectMemberRoles:output_type -> caos.zitadel.management.api.v1.ProjectMemberRoles + 135, // 447: caos.zitadel.management.api.v1.ManagementService.SearchProjectMembers:output_type -> caos.zitadel.management.api.v1.ProjectMemberSearchResponse + 121, // 448: caos.zitadel.management.api.v1.ManagementService.AddProjectMember:output_type -> caos.zitadel.management.api.v1.ProjectMember + 121, // 449: caos.zitadel.management.api.v1.ManagementService.ChangeProjectMember:output_type -> caos.zitadel.management.api.v1.ProjectMember + 215, // 450: caos.zitadel.management.api.v1.ManagementService.RemoveProjectMember:output_type -> google.protobuf.Empty + 131, // 451: caos.zitadel.management.api.v1.ManagementService.SearchProjectRoles:output_type -> caos.zitadel.management.api.v1.ProjectRoleSearchResponse + 128, // 452: caos.zitadel.management.api.v1.ManagementService.AddProjectRole:output_type -> caos.zitadel.management.api.v1.ProjectRole + 215, // 453: caos.zitadel.management.api.v1.ManagementService.BulkAddProjectRole:output_type -> google.protobuf.Empty + 128, // 454: caos.zitadel.management.api.v1.ManagementService.ChangeProjectRole:output_type -> caos.zitadel.management.api.v1.ProjectRole + 215, // 455: caos.zitadel.management.api.v1.ManagementService.RemoveProjectRole:output_type -> google.protobuf.Empty + 145, // 456: caos.zitadel.management.api.v1.ManagementService.SearchApplications:output_type -> caos.zitadel.management.api.v1.ApplicationSearchResponse + 144, // 457: caos.zitadel.management.api.v1.ManagementService.ApplicationByID:output_type -> caos.zitadel.management.api.v1.ApplicationView + 43, // 458: caos.zitadel.management.api.v1.ManagementService.ApplicationChanges:output_type -> caos.zitadel.management.api.v1.Changes + 138, // 459: caos.zitadel.management.api.v1.ManagementService.CreateOIDCApplication:output_type -> caos.zitadel.management.api.v1.Application + 138, // 460: caos.zitadel.management.api.v1.ManagementService.UpdateApplication:output_type -> caos.zitadel.management.api.v1.Application + 138, // 461: caos.zitadel.management.api.v1.ManagementService.DeactivateApplication:output_type -> caos.zitadel.management.api.v1.Application + 138, // 462: caos.zitadel.management.api.v1.ManagementService.ReactivateApplication:output_type -> caos.zitadel.management.api.v1.Application + 215, // 463: caos.zitadel.management.api.v1.ManagementService.RemoveApplication:output_type -> google.protobuf.Empty + 140, // 464: caos.zitadel.management.api.v1.ManagementService.UpdateApplicationOIDCConfig:output_type -> caos.zitadel.management.api.v1.OIDCConfig + 143, // 465: caos.zitadel.management.api.v1.ManagementService.RegenerateOIDCClientSecret:output_type -> caos.zitadel.management.api.v1.ClientSecret + 153, // 466: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrants:output_type -> caos.zitadel.management.api.v1.ProjectGrantSearchResponse + 152, // 467: caos.zitadel.management.api.v1.ManagementService.ProjectGrantByID:output_type -> caos.zitadel.management.api.v1.ProjectGrantView + 148, // 468: caos.zitadel.management.api.v1.ManagementService.CreateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant + 148, // 469: caos.zitadel.management.api.v1.ManagementService.UpdateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant + 148, // 470: caos.zitadel.management.api.v1.ManagementService.DeactivateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant + 148, // 471: caos.zitadel.management.api.v1.ManagementService.ReactivateProjectGrant:output_type -> caos.zitadel.management.api.v1.ProjectGrant + 215, // 472: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrant:output_type -> google.protobuf.Empty + 157, // 473: caos.zitadel.management.api.v1.ManagementService.GetProjectGrantMemberRoles:output_type -> caos.zitadel.management.api.v1.ProjectGrantMemberRoles + 163, // 474: caos.zitadel.management.api.v1.ManagementService.SearchProjectGrantMembers:output_type -> caos.zitadel.management.api.v1.ProjectGrantMemberSearchResponse + 158, // 475: caos.zitadel.management.api.v1.ManagementService.AddProjectGrantMember:output_type -> caos.zitadel.management.api.v1.ProjectGrantMember + 158, // 476: caos.zitadel.management.api.v1.ManagementService.ChangeProjectGrantMember:output_type -> caos.zitadel.management.api.v1.ProjectGrantMember + 215, // 477: caos.zitadel.management.api.v1.ManagementService.RemoveProjectGrantMember:output_type -> google.protobuf.Empty + 172, // 478: caos.zitadel.management.api.v1.ManagementService.SearchUserGrants:output_type -> caos.zitadel.management.api.v1.UserGrantSearchResponse + 171, // 479: caos.zitadel.management.api.v1.ManagementService.UserGrantByID:output_type -> caos.zitadel.management.api.v1.UserGrantView + 166, // 480: caos.zitadel.management.api.v1.ManagementService.CreateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant + 166, // 481: caos.zitadel.management.api.v1.ManagementService.UpdateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant + 166, // 482: caos.zitadel.management.api.v1.ManagementService.DeactivateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant + 166, // 483: caos.zitadel.management.api.v1.ManagementService.ReactivateUserGrant:output_type -> caos.zitadel.management.api.v1.UserGrant + 215, // 484: caos.zitadel.management.api.v1.ManagementService.RemoveUserGrant:output_type -> google.protobuf.Empty + 215, // 485: caos.zitadel.management.api.v1.ManagementService.BulkRemoveUserGrant:output_type -> google.protobuf.Empty + 186, // 486: caos.zitadel.management.api.v1.ManagementService.IdpByID:output_type -> caos.zitadel.management.api.v1.IdpView + 180, // 487: caos.zitadel.management.api.v1.ManagementService.CreateOidcIdp:output_type -> caos.zitadel.management.api.v1.Idp + 180, // 488: caos.zitadel.management.api.v1.ManagementService.UpdateIdpConfig:output_type -> caos.zitadel.management.api.v1.Idp + 180, // 489: caos.zitadel.management.api.v1.ManagementService.DeactivateIdpConfig:output_type -> caos.zitadel.management.api.v1.Idp + 180, // 490: caos.zitadel.management.api.v1.ManagementService.ReactivateIdpConfig:output_type -> caos.zitadel.management.api.v1.Idp + 215, // 491: caos.zitadel.management.api.v1.ManagementService.RemoveIdpConfig:output_type -> google.protobuf.Empty + 182, // 492: caos.zitadel.management.api.v1.ManagementService.UpdateOidcIdpConfig:output_type -> caos.zitadel.management.api.v1.OidcIdpConfig + 185, // 493: caos.zitadel.management.api.v1.ManagementService.SearchIdps:output_type -> caos.zitadel.management.api.v1.IdpSearchResponse + 195, // 494: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicy:output_type -> caos.zitadel.management.api.v1.LoginPolicyView + 195, // 495: caos.zitadel.management.api.v1.ManagementService.GetDefaultLoginPolicy:output_type -> caos.zitadel.management.api.v1.LoginPolicyView + 190, // 496: caos.zitadel.management.api.v1.ManagementService.CreateLoginPolicy:output_type -> caos.zitadel.management.api.v1.LoginPolicy + 190, // 497: caos.zitadel.management.api.v1.ManagementService.UpdateLoginPolicy:output_type -> caos.zitadel.management.api.v1.LoginPolicy + 215, // 498: caos.zitadel.management.api.v1.ManagementService.RemoveLoginPolicy:output_type -> google.protobuf.Empty + 197, // 499: caos.zitadel.management.api.v1.ManagementService.GetLoginPolicyIdpProviders:output_type -> caos.zitadel.management.api.v1.IdpProviderSearchResponse + 194, // 500: caos.zitadel.management.api.v1.ManagementService.AddIdpProviderToLoginPolicy:output_type -> caos.zitadel.management.api.v1.IdpProvider + 215, // 501: caos.zitadel.management.api.v1.ManagementService.RemoveIdpProviderFromLoginPolicy:output_type -> google.protobuf.Empty + 205, // 502: caos.zitadel.management.api.v1.ManagementService.GetPasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicyView + 205, // 503: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicyView + 203, // 504: caos.zitadel.management.api.v1.ManagementService.CreatePasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicy + 203, // 505: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordComplexityPolicy:output_type -> caos.zitadel.management.api.v1.PasswordComplexityPolicy + 215, // 506: caos.zitadel.management.api.v1.ManagementService.RemovePasswordComplexityPolicy:output_type -> google.protobuf.Empty + 208, // 507: caos.zitadel.management.api.v1.ManagementService.GetPasswordAgePolicy:output_type -> caos.zitadel.management.api.v1.PasswordAgePolicyView + 208, // 508: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordAgePolicy:output_type -> caos.zitadel.management.api.v1.PasswordAgePolicyView + 206, // 509: caos.zitadel.management.api.v1.ManagementService.CreatePasswordAgePolicy:output_type -> caos.zitadel.management.api.v1.PasswordAgePolicy + 206, // 510: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordAgePolicy:output_type -> caos.zitadel.management.api.v1.PasswordAgePolicy + 215, // 511: caos.zitadel.management.api.v1.ManagementService.RemovePasswordAgePolicy:output_type -> google.protobuf.Empty + 211, // 512: caos.zitadel.management.api.v1.ManagementService.GetPasswordLockoutPolicy:output_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicyView + 211, // 513: caos.zitadel.management.api.v1.ManagementService.GetDefaultPasswordLockoutPolicy:output_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicyView + 209, // 514: caos.zitadel.management.api.v1.ManagementService.CreatePasswordLockoutPolicy:output_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicy + 209, // 515: caos.zitadel.management.api.v1.ManagementService.UpdatePasswordLockoutPolicy:output_type -> caos.zitadel.management.api.v1.PasswordLockoutPolicy + 215, // 516: caos.zitadel.management.api.v1.ManagementService.RemovePasswordLockoutPolicy:output_type -> google.protobuf.Empty + 379, // [379:517] is the sub-list for method output_type + 241, // [241:379] is the sub-list for method input_type + 241, // [241:241] is the sub-list for extension type_name + 241, // [241:241] is the sub-list for extension extendee + 0, // [0:241] is the sub-list for field type_name } func init() { file_management_proto_init() } @@ -20880,7 +21104,7 @@ func file_management_proto_init() { } } file_management_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordComplexityPolicyID); i { + switch v := v.(*OrgIamPolicyView); i { case 0: return &v.state case 1: @@ -20892,150 +21116,6 @@ func file_management_proto_init() { } } file_management_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordComplexityPolicy); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordComplexityPolicyCreate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordComplexityPolicyUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordAgePolicyID); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordAgePolicy); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordAgePolicyCreate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordAgePolicyUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordLockoutPolicyID); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordLockoutPolicy); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordLockoutPolicyCreate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PasswordLockoutPolicyUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrgIamPolicy); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_management_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgCreateRequest); i { case 0: return &v.state @@ -21047,7 +21127,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Org); i { case 0: return &v.state @@ -21059,7 +21139,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgView); i { case 0: return &v.state @@ -21071,7 +21151,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Domain); i { case 0: return &v.state @@ -21083,7 +21163,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgDomain); i { case 0: return &v.state @@ -21095,7 +21175,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgDomainView); i { case 0: return &v.state @@ -21107,7 +21187,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddOrgDomainRequest); i { case 0: return &v.state @@ -21119,7 +21199,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgDomainValidationRequest); i { case 0: return &v.state @@ -21131,7 +21211,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgDomainValidationResponse); i { case 0: return &v.state @@ -21143,7 +21223,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateOrgDomainRequest); i { case 0: return &v.state @@ -21155,7 +21235,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PrimaryOrgDomainRequest); i { case 0: return &v.state @@ -21167,7 +21247,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveOrgDomainRequest); i { case 0: return &v.state @@ -21179,7 +21259,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgDomainSearchResponse); i { case 0: return &v.state @@ -21191,7 +21271,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgDomainSearchRequest); i { case 0: return &v.state @@ -21203,7 +21283,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgDomainSearchQuery); i { case 0: return &v.state @@ -21215,7 +21295,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgMemberRoles); i { case 0: return &v.state @@ -21227,7 +21307,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgMember); i { case 0: return &v.state @@ -21239,7 +21319,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddOrgMemberRequest); i { case 0: return &v.state @@ -21251,7 +21331,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChangeOrgMemberRequest); i { case 0: return &v.state @@ -21263,7 +21343,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveOrgMemberRequest); i { case 0: return &v.state @@ -21275,7 +21355,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgMemberSearchResponse); i { case 0: return &v.state @@ -21287,7 +21367,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgMemberView); i { case 0: return &v.state @@ -21299,7 +21379,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgMemberSearchRequest); i { case 0: return &v.state @@ -21311,7 +21391,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrgMemberSearchQuery); i { case 0: return &v.state @@ -21323,7 +21403,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectCreateRequest); i { case 0: return &v.state @@ -21335,7 +21415,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectUpdateRequest); i { case 0: return &v.state @@ -21347,7 +21427,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectSearchResponse); i { case 0: return &v.state @@ -21359,7 +21439,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectView); i { case 0: return &v.state @@ -21371,7 +21451,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectSearchRequest); i { case 0: return &v.state @@ -21383,7 +21463,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectSearchQuery); i { case 0: return &v.state @@ -21395,7 +21475,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Projects); i { case 0: return &v.state @@ -21407,7 +21487,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Project); i { case 0: return &v.state @@ -21419,7 +21499,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberRoles); i { case 0: return &v.state @@ -21431,7 +21511,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMember); i { case 0: return &v.state @@ -21443,7 +21523,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberAdd); i { case 0: return &v.state @@ -21455,7 +21535,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberChange); i { case 0: return &v.state @@ -21467,7 +21547,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberRemove); i { case 0: return &v.state @@ -21479,7 +21559,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleAdd); i { case 0: return &v.state @@ -21491,7 +21571,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleAddBulk); i { case 0: return &v.state @@ -21503,7 +21583,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleChange); i { case 0: return &v.state @@ -21515,7 +21595,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRole); i { case 0: return &v.state @@ -21527,7 +21607,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleView); i { case 0: return &v.state @@ -21539,7 +21619,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleRemove); i { case 0: return &v.state @@ -21551,7 +21631,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleSearchResponse); i { case 0: return &v.state @@ -21563,7 +21643,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleSearchRequest); i { case 0: return &v.state @@ -21575,7 +21655,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectRoleSearchQuery); i { case 0: return &v.state @@ -21587,7 +21667,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberView); i { case 0: return &v.state @@ -21599,7 +21679,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberSearchResponse); i { case 0: return &v.state @@ -21611,7 +21691,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberSearchRequest); i { case 0: return &v.state @@ -21623,7 +21703,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectMemberSearchQuery); i { case 0: return &v.state @@ -21635,7 +21715,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Application); i { case 0: return &v.state @@ -21647,7 +21727,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplicationUpdate); i { case 0: return &v.state @@ -21659,7 +21739,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OIDCConfig); i { case 0: return &v.state @@ -21671,7 +21751,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OIDCApplicationCreate); i { case 0: return &v.state @@ -21683,7 +21763,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OIDCConfigUpdate); i { case 0: return &v.state @@ -21695,7 +21775,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientSecret); i { case 0: return &v.state @@ -21707,7 +21787,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplicationView); i { case 0: return &v.state @@ -21719,7 +21799,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplicationSearchResponse); i { case 0: return &v.state @@ -21731,7 +21811,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplicationSearchRequest); i { case 0: return &v.state @@ -21743,7 +21823,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplicationSearchQuery); i { case 0: return &v.state @@ -21755,7 +21835,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrant); i { case 0: return &v.state @@ -21767,7 +21847,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantCreate); i { case 0: return &v.state @@ -21779,7 +21859,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantUpdate); i { case 0: return &v.state @@ -21791,7 +21871,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantID); i { case 0: return &v.state @@ -21803,7 +21883,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantView); i { case 0: return &v.state @@ -21815,7 +21895,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantSearchResponse); i { case 0: return &v.state @@ -21827,7 +21907,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GrantedProjectSearchRequest); i { case 0: return &v.state @@ -21839,7 +21919,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantSearchRequest); i { case 0: return &v.state @@ -21851,7 +21931,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantSearchQuery); i { case 0: return &v.state @@ -21863,7 +21943,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberRoles); i { case 0: return &v.state @@ -21875,7 +21955,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMember); i { case 0: return &v.state @@ -21887,7 +21967,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberAdd); i { case 0: return &v.state @@ -21899,7 +21979,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberChange); i { case 0: return &v.state @@ -21911,7 +21991,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberRemove); i { case 0: return &v.state @@ -21923,7 +22003,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberView); i { case 0: return &v.state @@ -21935,7 +22015,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberSearchResponse); i { case 0: return &v.state @@ -21947,7 +22027,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberSearchRequest); i { case 0: return &v.state @@ -21959,7 +22039,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProjectGrantMemberSearchQuery); i { case 0: return &v.state @@ -21971,7 +22051,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrant); i { case 0: return &v.state @@ -21983,7 +22063,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantCreate); i { case 0: return &v.state @@ -21995,7 +22075,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantUpdate); i { case 0: return &v.state @@ -22007,7 +22087,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantRemoveBulk); i { case 0: return &v.state @@ -22019,7 +22099,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantID); i { case 0: return &v.state @@ -22031,7 +22111,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantView); i { case 0: return &v.state @@ -22043,7 +22123,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantSearchResponse); i { case 0: return &v.state @@ -22055,7 +22135,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantSearchRequest); i { case 0: return &v.state @@ -22067,7 +22147,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGrantSearchQuery); i { case 0: return &v.state @@ -22079,7 +22159,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserMembershipSearchResponse); i { case 0: return &v.state @@ -22091,7 +22171,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserMembershipSearchRequest); i { case 0: return &v.state @@ -22103,7 +22183,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserMembershipSearchQuery); i { case 0: return &v.state @@ -22115,7 +22195,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserMembershipView); i { case 0: return &v.state @@ -22127,7 +22207,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpID); i { case 0: return &v.state @@ -22139,7 +22219,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Idp); i { case 0: return &v.state @@ -22151,7 +22231,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpUpdate); i { case 0: return &v.state @@ -22163,7 +22243,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OidcIdpConfig); i { case 0: return &v.state @@ -22175,7 +22255,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OidcIdpConfigCreate); i { case 0: return &v.state @@ -22187,7 +22267,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OidcIdpConfigUpdate); i { case 0: return &v.state @@ -22199,7 +22279,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpSearchResponse); i { case 0: return &v.state @@ -22211,7 +22291,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpView); i { case 0: return &v.state @@ -22223,7 +22303,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OidcIdpConfigView); i { case 0: return &v.state @@ -22235,7 +22315,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpSearchRequest); i { case 0: return &v.state @@ -22247,7 +22327,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpSearchQuery); i { case 0: return &v.state @@ -22259,7 +22339,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoginPolicy); i { case 0: return &v.state @@ -22271,8 +22351,8 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginPolicyAdd); i { + file_management_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoginPolicyRequest); i { case 0: return &v.state case 1: @@ -22283,7 +22363,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpProviderID); i { case 0: return &v.state @@ -22295,7 +22375,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpProviderAdd); i { case 0: return &v.state @@ -22307,7 +22387,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpProvider); i { case 0: return &v.state @@ -22319,7 +22399,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoginPolicyView); i { case 0: return &v.state @@ -22331,7 +22411,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpProviderView); i { case 0: return &v.state @@ -22343,7 +22423,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpProviderSearchResponse); i { case 0: return &v.state @@ -22355,7 +22435,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IdpProviderSearchRequest); i { case 0: return &v.state @@ -22367,7 +22447,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalIDPSearchRequest); i { case 0: return &v.state @@ -22379,7 +22459,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalIDPSearchResponse); i { case 0: return &v.state @@ -22391,7 +22471,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalIDPView); i { case 0: return &v.state @@ -22403,7 +22483,7 @@ func file_management_proto_init() { return nil } } - file_management_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { + file_management_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalIDPRemoveRequest); i { case 0: return &v.state @@ -22415,6 +22495,114 @@ func file_management_proto_init() { return nil } } + file_management_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordComplexityPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordComplexityPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordComplexityPolicyView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordAgePolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordAgePolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordAgePolicyView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordLockoutPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordLockoutPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_management_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PasswordLockoutPolicyView); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_management_proto_msgTypes[11].OneofWrappers = []interface{}{ (*CreateUserRequest_Human)(nil), @@ -22428,16 +22616,16 @@ func file_management_proto_init() { (*UserView_Human)(nil), (*UserView_Machine)(nil), } - file_management_proto_msgTypes[110].OneofWrappers = []interface{}{ + file_management_proto_msgTypes[98].OneofWrappers = []interface{}{ (*Application_OidcConfig)(nil), } - file_management_proto_msgTypes[116].OneofWrappers = []interface{}{ + file_management_proto_msgTypes[104].OneofWrappers = []interface{}{ (*ApplicationView_OidcConfig)(nil), } - file_management_proto_msgTypes[152].OneofWrappers = []interface{}{ + file_management_proto_msgTypes[140].OneofWrappers = []interface{}{ (*Idp_OidcConfig)(nil), } - file_management_proto_msgTypes[158].OneofWrappers = []interface{}{ + file_management_proto_msgTypes[146].OneofWrappers = []interface{}{ (*IdpView_OidcConfig)(nil), } type x struct{} @@ -22445,8 +22633,8 @@ func file_management_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_management_proto_rawDesc, - NumEnums: 37, - NumMessages: 175, + NumEnums: 40, + NumMessages: 172, NumExtensions: 0, NumServices: 1, }, @@ -22519,22 +22707,6 @@ type ManagementServiceClient interface { // A Manager is only allowed to set an initial password, on the next login the user has to change his password SetInitialPassword(ctx context.Context, in *PasswordRequest, opts ...grpc.CallOption) (*empty.Empty, error) SearchUserMemberships(ctx context.Context, in *UserMembershipSearchRequest, opts ...grpc.CallOption) (*UserMembershipSearchResponse, error) - // returns default policy if nothing other set on organisation - GetPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) - GetDefaultPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) - CreatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyCreate, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) - UpdatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyUpdate, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) - DeletePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) - // returns default if nothing other set on organisation - GetPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordAgePolicy, error) - CreatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyCreate, opts ...grpc.CallOption) (*PasswordAgePolicy, error) - UpdatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyUpdate, opts ...grpc.CallOption) (*PasswordAgePolicy, error) - DeletePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyID, opts ...grpc.CallOption) (*empty.Empty, error) - // returns default if nothing other set on organisation - GetPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) - CreatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyCreate, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) - UpdatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyUpdate, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) - DeletePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) CreateOrg(ctx context.Context, in *OrgCreateRequest, opts ...grpc.CallOption) (*Org, error) // OrgChanges returns the event stream of the org object OrgChanges(ctx context.Context, in *ChangeRequest, opts ...grpc.CallOption) (*Changes, error) @@ -22549,7 +22721,7 @@ type ManagementServiceClient interface { ValidateMyOrgDomain(ctx context.Context, in *ValidateOrgDomainRequest, opts ...grpc.CallOption) (*empty.Empty, error) SetMyPrimaryOrgDomain(ctx context.Context, in *PrimaryOrgDomainRequest, opts ...grpc.CallOption) (*empty.Empty, error) RemoveMyOrgDomain(ctx context.Context, in *RemoveOrgDomainRequest, opts ...grpc.CallOption) (*empty.Empty, error) - GetMyOrgIamPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*OrgIamPolicy, error) + GetMyOrgIamPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*OrgIamPolicyView, error) GetOrgMemberRoles(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*OrgMemberRoles, error) AddMyOrgMember(ctx context.Context, in *AddOrgMemberRequest, opts ...grpc.CallOption) (*OrgMember, error) ChangeMyOrgMember(ctx context.Context, in *ChangeOrgMemberRequest, opts ...grpc.CallOption) (*OrgMember, error) @@ -22622,12 +22794,28 @@ type ManagementServiceClient interface { UpdateOidcIdpConfig(ctx context.Context, in *OidcIdpConfigUpdate, opts ...grpc.CallOption) (*OidcIdpConfig, error) SearchIdps(ctx context.Context, in *IdpSearchRequest, opts ...grpc.CallOption) (*IdpSearchResponse, error) GetLoginPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*LoginPolicyView, error) - CreateLoginPolicy(ctx context.Context, in *LoginPolicyAdd, opts ...grpc.CallOption) (*LoginPolicy, error) - UpdateLoginPolicy(ctx context.Context, in *LoginPolicy, opts ...grpc.CallOption) (*LoginPolicy, error) + GetDefaultLoginPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*LoginPolicyView, error) + CreateLoginPolicy(ctx context.Context, in *LoginPolicyRequest, opts ...grpc.CallOption) (*LoginPolicy, error) + UpdateLoginPolicy(ctx context.Context, in *LoginPolicyRequest, opts ...grpc.CallOption) (*LoginPolicy, error) RemoveLoginPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) GetLoginPolicyIdpProviders(ctx context.Context, in *IdpProviderSearchRequest, opts ...grpc.CallOption) (*IdpProviderSearchResponse, error) AddIdpProviderToLoginPolicy(ctx context.Context, in *IdpProviderAdd, opts ...grpc.CallOption) (*IdpProvider, error) RemoveIdpProviderFromLoginPolicy(ctx context.Context, in *IdpProviderID, opts ...grpc.CallOption) (*empty.Empty, error) + GetPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicyView, error) + GetDefaultPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicyView, error) + CreatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyRequest, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) + UpdatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyRequest, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) + RemovePasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + GetPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordAgePolicyView, error) + GetDefaultPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordAgePolicyView, error) + CreatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyRequest, opts ...grpc.CallOption) (*PasswordAgePolicy, error) + UpdatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyRequest, opts ...grpc.CallOption) (*PasswordAgePolicy, error) + RemovePasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) + GetPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordLockoutPolicyView, error) + GetDefaultPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordLockoutPolicyView, error) + CreatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyRequest, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) + UpdatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyRequest, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) + RemovePasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) } type managementServiceClient struct { @@ -22989,123 +23177,6 @@ func (c *managementServiceClient) SearchUserMemberships(ctx context.Context, in return out, nil } -func (c *managementServiceClient) GetPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) { - out := new(PasswordComplexityPolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetPasswordComplexityPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) GetDefaultPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) { - out := new(PasswordComplexityPolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordComplexityPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) CreatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyCreate, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) { - out := new(PasswordComplexityPolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordComplexityPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) UpdatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyUpdate, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) { - out := new(PasswordComplexityPolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordComplexityPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) DeletePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordComplexityPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) GetPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordAgePolicy, error) { - out := new(PasswordAgePolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetPasswordAgePolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) CreatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyCreate, opts ...grpc.CallOption) (*PasswordAgePolicy, error) { - out := new(PasswordAgePolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordAgePolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) UpdatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyUpdate, opts ...grpc.CallOption) (*PasswordAgePolicy, error) { - out := new(PasswordAgePolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordAgePolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) DeletePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyID, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordAgePolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) GetPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) { - out := new(PasswordLockoutPolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetPasswordLockoutPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) CreatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyCreate, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) { - out := new(PasswordLockoutPolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordLockoutPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) UpdatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyUpdate, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) { - out := new(PasswordLockoutPolicy) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordLockoutPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *managementServiceClient) DeletePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyID, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordLockoutPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *managementServiceClient) CreateOrg(ctx context.Context, in *OrgCreateRequest, opts ...grpc.CallOption) (*Org, error) { out := new(Org) err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreateOrg", in, out, opts...) @@ -23214,8 +23285,8 @@ func (c *managementServiceClient) RemoveMyOrgDomain(ctx context.Context, in *Rem return out, nil } -func (c *managementServiceClient) GetMyOrgIamPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*OrgIamPolicy, error) { - out := new(OrgIamPolicy) +func (c *managementServiceClient) GetMyOrgIamPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*OrgIamPolicyView, error) { + out := new(OrgIamPolicyView) err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetMyOrgIamPolicy", in, out, opts...) if err != nil { return nil, err @@ -23799,7 +23870,16 @@ func (c *managementServiceClient) GetLoginPolicy(ctx context.Context, in *empty. return out, nil } -func (c *managementServiceClient) CreateLoginPolicy(ctx context.Context, in *LoginPolicyAdd, opts ...grpc.CallOption) (*LoginPolicy, error) { +func (c *managementServiceClient) GetDefaultLoginPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*LoginPolicyView, error) { + out := new(LoginPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetDefaultLoginPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) CreateLoginPolicy(ctx context.Context, in *LoginPolicyRequest, opts ...grpc.CallOption) (*LoginPolicy, error) { out := new(LoginPolicy) err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreateLoginPolicy", in, out, opts...) if err != nil { @@ -23808,7 +23888,7 @@ func (c *managementServiceClient) CreateLoginPolicy(ctx context.Context, in *Log return out, nil } -func (c *managementServiceClient) UpdateLoginPolicy(ctx context.Context, in *LoginPolicy, opts ...grpc.CallOption) (*LoginPolicy, error) { +func (c *managementServiceClient) UpdateLoginPolicy(ctx context.Context, in *LoginPolicyRequest, opts ...grpc.CallOption) (*LoginPolicy, error) { out := new(LoginPolicy) err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/UpdateLoginPolicy", in, out, opts...) if err != nil { @@ -23853,6 +23933,141 @@ func (c *managementServiceClient) RemoveIdpProviderFromLoginPolicy(ctx context.C return out, nil } +func (c *managementServiceClient) GetPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicyView, error) { + out := new(PasswordComplexityPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetPasswordComplexityPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) GetDefaultPasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordComplexityPolicyView, error) { + out := new(PasswordComplexityPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordComplexityPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) CreatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyRequest, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) { + out := new(PasswordComplexityPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordComplexityPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) UpdatePasswordComplexityPolicy(ctx context.Context, in *PasswordComplexityPolicyRequest, opts ...grpc.CallOption) (*PasswordComplexityPolicy, error) { + out := new(PasswordComplexityPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordComplexityPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) RemovePasswordComplexityPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordComplexityPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) GetPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordAgePolicyView, error) { + out := new(PasswordAgePolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetPasswordAgePolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) GetDefaultPasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordAgePolicyView, error) { + out := new(PasswordAgePolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordAgePolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) CreatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyRequest, opts ...grpc.CallOption) (*PasswordAgePolicy, error) { + out := new(PasswordAgePolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordAgePolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) UpdatePasswordAgePolicy(ctx context.Context, in *PasswordAgePolicyRequest, opts ...grpc.CallOption) (*PasswordAgePolicy, error) { + out := new(PasswordAgePolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordAgePolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) RemovePasswordAgePolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordAgePolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) GetPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordLockoutPolicyView, error) { + out := new(PasswordLockoutPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetPasswordLockoutPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) GetDefaultPasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*PasswordLockoutPolicyView, error) { + out := new(PasswordLockoutPolicyView) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordLockoutPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) CreatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyRequest, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) { + out := new(PasswordLockoutPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordLockoutPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) UpdatePasswordLockoutPolicy(ctx context.Context, in *PasswordLockoutPolicyRequest, opts ...grpc.CallOption) (*PasswordLockoutPolicy, error) { + out := new(PasswordLockoutPolicy) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordLockoutPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *managementServiceClient) RemovePasswordLockoutPolicy(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordLockoutPolicy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ManagementServiceServer is the server API for ManagementService service. type ManagementServiceServer interface { //READINESS @@ -23901,22 +24116,6 @@ type ManagementServiceServer interface { // A Manager is only allowed to set an initial password, on the next login the user has to change his password SetInitialPassword(context.Context, *PasswordRequest) (*empty.Empty, error) SearchUserMemberships(context.Context, *UserMembershipSearchRequest) (*UserMembershipSearchResponse, error) - // returns default policy if nothing other set on organisation - GetPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicy, error) - GetDefaultPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicy, error) - CreatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyCreate) (*PasswordComplexityPolicy, error) - UpdatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyUpdate) (*PasswordComplexityPolicy, error) - DeletePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyID) (*empty.Empty, error) - // returns default if nothing other set on organisation - GetPasswordAgePolicy(context.Context, *empty.Empty) (*PasswordAgePolicy, error) - CreatePasswordAgePolicy(context.Context, *PasswordAgePolicyCreate) (*PasswordAgePolicy, error) - UpdatePasswordAgePolicy(context.Context, *PasswordAgePolicyUpdate) (*PasswordAgePolicy, error) - DeletePasswordAgePolicy(context.Context, *PasswordAgePolicyID) (*empty.Empty, error) - // returns default if nothing other set on organisation - GetPasswordLockoutPolicy(context.Context, *empty.Empty) (*PasswordLockoutPolicy, error) - CreatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyCreate) (*PasswordLockoutPolicy, error) - UpdatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyUpdate) (*PasswordLockoutPolicy, error) - DeletePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyID) (*empty.Empty, error) CreateOrg(context.Context, *OrgCreateRequest) (*Org, error) // OrgChanges returns the event stream of the org object OrgChanges(context.Context, *ChangeRequest) (*Changes, error) @@ -23931,7 +24130,7 @@ type ManagementServiceServer interface { ValidateMyOrgDomain(context.Context, *ValidateOrgDomainRequest) (*empty.Empty, error) SetMyPrimaryOrgDomain(context.Context, *PrimaryOrgDomainRequest) (*empty.Empty, error) RemoveMyOrgDomain(context.Context, *RemoveOrgDomainRequest) (*empty.Empty, error) - GetMyOrgIamPolicy(context.Context, *empty.Empty) (*OrgIamPolicy, error) + GetMyOrgIamPolicy(context.Context, *empty.Empty) (*OrgIamPolicyView, error) GetOrgMemberRoles(context.Context, *empty.Empty) (*OrgMemberRoles, error) AddMyOrgMember(context.Context, *AddOrgMemberRequest) (*OrgMember, error) ChangeMyOrgMember(context.Context, *ChangeOrgMemberRequest) (*OrgMember, error) @@ -24004,12 +24203,28 @@ type ManagementServiceServer interface { UpdateOidcIdpConfig(context.Context, *OidcIdpConfigUpdate) (*OidcIdpConfig, error) SearchIdps(context.Context, *IdpSearchRequest) (*IdpSearchResponse, error) GetLoginPolicy(context.Context, *empty.Empty) (*LoginPolicyView, error) - CreateLoginPolicy(context.Context, *LoginPolicyAdd) (*LoginPolicy, error) - UpdateLoginPolicy(context.Context, *LoginPolicy) (*LoginPolicy, error) + GetDefaultLoginPolicy(context.Context, *empty.Empty) (*LoginPolicyView, error) + CreateLoginPolicy(context.Context, *LoginPolicyRequest) (*LoginPolicy, error) + UpdateLoginPolicy(context.Context, *LoginPolicyRequest) (*LoginPolicy, error) RemoveLoginPolicy(context.Context, *empty.Empty) (*empty.Empty, error) GetLoginPolicyIdpProviders(context.Context, *IdpProviderSearchRequest) (*IdpProviderSearchResponse, error) AddIdpProviderToLoginPolicy(context.Context, *IdpProviderAdd) (*IdpProvider, error) RemoveIdpProviderFromLoginPolicy(context.Context, *IdpProviderID) (*empty.Empty, error) + GetPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicyView, error) + GetDefaultPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicyView, error) + CreatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyRequest) (*PasswordComplexityPolicy, error) + UpdatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyRequest) (*PasswordComplexityPolicy, error) + RemovePasswordComplexityPolicy(context.Context, *empty.Empty) (*empty.Empty, error) + GetPasswordAgePolicy(context.Context, *empty.Empty) (*PasswordAgePolicyView, error) + GetDefaultPasswordAgePolicy(context.Context, *empty.Empty) (*PasswordAgePolicyView, error) + CreatePasswordAgePolicy(context.Context, *PasswordAgePolicyRequest) (*PasswordAgePolicy, error) + UpdatePasswordAgePolicy(context.Context, *PasswordAgePolicyRequest) (*PasswordAgePolicy, error) + RemovePasswordAgePolicy(context.Context, *empty.Empty) (*empty.Empty, error) + GetPasswordLockoutPolicy(context.Context, *empty.Empty) (*PasswordLockoutPolicyView, error) + GetDefaultPasswordLockoutPolicy(context.Context, *empty.Empty) (*PasswordLockoutPolicyView, error) + CreatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyRequest) (*PasswordLockoutPolicy, error) + UpdatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyRequest) (*PasswordLockoutPolicy, error) + RemovePasswordLockoutPolicy(context.Context, *empty.Empty) (*empty.Empty, error) } // UnimplementedManagementServiceServer can be embedded to have forward compatible implementations. @@ -24133,45 +24348,6 @@ func (*UnimplementedManagementServiceServer) SetInitialPassword(context.Context, func (*UnimplementedManagementServiceServer) SearchUserMemberships(context.Context, *UserMembershipSearchRequest) (*UserMembershipSearchResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SearchUserMemberships not implemented") } -func (*UnimplementedManagementServiceServer) GetPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetPasswordComplexityPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) GetDefaultPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetDefaultPasswordComplexityPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) CreatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyCreate) (*PasswordComplexityPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreatePasswordComplexityPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) UpdatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyUpdate) (*PasswordComplexityPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdatePasswordComplexityPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) DeletePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyID) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeletePasswordComplexityPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) GetPasswordAgePolicy(context.Context, *empty.Empty) (*PasswordAgePolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetPasswordAgePolicy not implemented") -} -func (*UnimplementedManagementServiceServer) CreatePasswordAgePolicy(context.Context, *PasswordAgePolicyCreate) (*PasswordAgePolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreatePasswordAgePolicy not implemented") -} -func (*UnimplementedManagementServiceServer) UpdatePasswordAgePolicy(context.Context, *PasswordAgePolicyUpdate) (*PasswordAgePolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdatePasswordAgePolicy not implemented") -} -func (*UnimplementedManagementServiceServer) DeletePasswordAgePolicy(context.Context, *PasswordAgePolicyID) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeletePasswordAgePolicy not implemented") -} -func (*UnimplementedManagementServiceServer) GetPasswordLockoutPolicy(context.Context, *empty.Empty) (*PasswordLockoutPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetPasswordLockoutPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) CreatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyCreate) (*PasswordLockoutPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreatePasswordLockoutPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) UpdatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyUpdate) (*PasswordLockoutPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdatePasswordLockoutPolicy not implemented") -} -func (*UnimplementedManagementServiceServer) DeletePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyID) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeletePasswordLockoutPolicy not implemented") -} func (*UnimplementedManagementServiceServer) CreateOrg(context.Context, *OrgCreateRequest) (*Org, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateOrg not implemented") } @@ -24208,7 +24384,7 @@ func (*UnimplementedManagementServiceServer) SetMyPrimaryOrgDomain(context.Conte func (*UnimplementedManagementServiceServer) RemoveMyOrgDomain(context.Context, *RemoveOrgDomainRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveMyOrgDomain not implemented") } -func (*UnimplementedManagementServiceServer) GetMyOrgIamPolicy(context.Context, *empty.Empty) (*OrgIamPolicy, error) { +func (*UnimplementedManagementServiceServer) GetMyOrgIamPolicy(context.Context, *empty.Empty) (*OrgIamPolicyView, error) { return nil, status.Errorf(codes.Unimplemented, "method GetMyOrgIamPolicy not implemented") } func (*UnimplementedManagementServiceServer) GetOrgMemberRoles(context.Context, *empty.Empty) (*OrgMemberRoles, error) { @@ -24403,10 +24579,13 @@ func (*UnimplementedManagementServiceServer) SearchIdps(context.Context, *IdpSea func (*UnimplementedManagementServiceServer) GetLoginPolicy(context.Context, *empty.Empty) (*LoginPolicyView, error) { return nil, status.Errorf(codes.Unimplemented, "method GetLoginPolicy not implemented") } -func (*UnimplementedManagementServiceServer) CreateLoginPolicy(context.Context, *LoginPolicyAdd) (*LoginPolicy, error) { +func (*UnimplementedManagementServiceServer) GetDefaultLoginPolicy(context.Context, *empty.Empty) (*LoginPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultLoginPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) CreateLoginPolicy(context.Context, *LoginPolicyRequest) (*LoginPolicy, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateLoginPolicy not implemented") } -func (*UnimplementedManagementServiceServer) UpdateLoginPolicy(context.Context, *LoginPolicy) (*LoginPolicy, error) { +func (*UnimplementedManagementServiceServer) UpdateLoginPolicy(context.Context, *LoginPolicyRequest) (*LoginPolicy, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateLoginPolicy not implemented") } func (*UnimplementedManagementServiceServer) RemoveLoginPolicy(context.Context, *empty.Empty) (*empty.Empty, error) { @@ -24421,6 +24600,51 @@ func (*UnimplementedManagementServiceServer) AddIdpProviderToLoginPolicy(context func (*UnimplementedManagementServiceServer) RemoveIdpProviderFromLoginPolicy(context.Context, *IdpProviderID) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveIdpProviderFromLoginPolicy not implemented") } +func (*UnimplementedManagementServiceServer) GetPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPasswordComplexityPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) GetDefaultPasswordComplexityPolicy(context.Context, *empty.Empty) (*PasswordComplexityPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultPasswordComplexityPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) CreatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyRequest) (*PasswordComplexityPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreatePasswordComplexityPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) UpdatePasswordComplexityPolicy(context.Context, *PasswordComplexityPolicyRequest) (*PasswordComplexityPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdatePasswordComplexityPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) RemovePasswordComplexityPolicy(context.Context, *empty.Empty) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemovePasswordComplexityPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) GetPasswordAgePolicy(context.Context, *empty.Empty) (*PasswordAgePolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPasswordAgePolicy not implemented") +} +func (*UnimplementedManagementServiceServer) GetDefaultPasswordAgePolicy(context.Context, *empty.Empty) (*PasswordAgePolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultPasswordAgePolicy not implemented") +} +func (*UnimplementedManagementServiceServer) CreatePasswordAgePolicy(context.Context, *PasswordAgePolicyRequest) (*PasswordAgePolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreatePasswordAgePolicy not implemented") +} +func (*UnimplementedManagementServiceServer) UpdatePasswordAgePolicy(context.Context, *PasswordAgePolicyRequest) (*PasswordAgePolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdatePasswordAgePolicy not implemented") +} +func (*UnimplementedManagementServiceServer) RemovePasswordAgePolicy(context.Context, *empty.Empty) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemovePasswordAgePolicy not implemented") +} +func (*UnimplementedManagementServiceServer) GetPasswordLockoutPolicy(context.Context, *empty.Empty) (*PasswordLockoutPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPasswordLockoutPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) GetDefaultPasswordLockoutPolicy(context.Context, *empty.Empty) (*PasswordLockoutPolicyView, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaultPasswordLockoutPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) CreatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyRequest) (*PasswordLockoutPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreatePasswordLockoutPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) UpdatePasswordLockoutPolicy(context.Context, *PasswordLockoutPolicyRequest) (*PasswordLockoutPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdatePasswordLockoutPolicy not implemented") +} +func (*UnimplementedManagementServiceServer) RemovePasswordLockoutPolicy(context.Context, *empty.Empty) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemovePasswordLockoutPolicy not implemented") +} func RegisterManagementServiceServer(s *grpc.Server, srv ManagementServiceServer) { s.RegisterService(&_ManagementService_serviceDesc, srv) @@ -25128,240 +25352,6 @@ func _ManagementService_SearchUserMemberships_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -func _ManagementService_GetPasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).GetPasswordComplexityPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetPasswordComplexityPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).GetPasswordComplexityPolicy(ctx, req.(*empty.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_GetDefaultPasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).GetDefaultPasswordComplexityPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordComplexityPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).GetDefaultPasswordComplexityPolicy(ctx, req.(*empty.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_CreatePasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordComplexityPolicyCreate) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).CreatePasswordComplexityPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordComplexityPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).CreatePasswordComplexityPolicy(ctx, req.(*PasswordComplexityPolicyCreate)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_UpdatePasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordComplexityPolicyUpdate) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).UpdatePasswordComplexityPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordComplexityPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).UpdatePasswordComplexityPolicy(ctx, req.(*PasswordComplexityPolicyUpdate)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_DeletePasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordComplexityPolicyID) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).DeletePasswordComplexityPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordComplexityPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).DeletePasswordComplexityPolicy(ctx, req.(*PasswordComplexityPolicyID)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_GetPasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).GetPasswordAgePolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetPasswordAgePolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).GetPasswordAgePolicy(ctx, req.(*empty.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_CreatePasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordAgePolicyCreate) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).CreatePasswordAgePolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordAgePolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).CreatePasswordAgePolicy(ctx, req.(*PasswordAgePolicyCreate)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_UpdatePasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordAgePolicyUpdate) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).UpdatePasswordAgePolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordAgePolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).UpdatePasswordAgePolicy(ctx, req.(*PasswordAgePolicyUpdate)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_DeletePasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordAgePolicyID) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).DeletePasswordAgePolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordAgePolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).DeletePasswordAgePolicy(ctx, req.(*PasswordAgePolicyID)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_GetPasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).GetPasswordLockoutPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetPasswordLockoutPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).GetPasswordLockoutPolicy(ctx, req.(*empty.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_CreatePasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordLockoutPolicyCreate) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).CreatePasswordLockoutPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordLockoutPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).CreatePasswordLockoutPolicy(ctx, req.(*PasswordLockoutPolicyCreate)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_UpdatePasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordLockoutPolicyUpdate) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).UpdatePasswordLockoutPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordLockoutPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).UpdatePasswordLockoutPolicy(ctx, req.(*PasswordLockoutPolicyUpdate)) - } - return interceptor(ctx, in, info, handler) -} - -func _ManagementService_DeletePasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PasswordLockoutPolicyID) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ManagementServiceServer).DeletePasswordLockoutPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/caos.zitadel.management.api.v1.ManagementService/DeletePasswordLockoutPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).DeletePasswordLockoutPolicy(ctx, req.(*PasswordLockoutPolicyID)) - } - return interceptor(ctx, in, info, handler) -} - func _ManagementService_CreateOrg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(OrgCreateRequest) if err := dec(in); err != nil { @@ -26748,8 +26738,26 @@ func _ManagementService_GetLoginPolicy_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _ManagementService_GetDefaultLoginPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).GetDefaultLoginPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetDefaultLoginPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).GetDefaultLoginPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _ManagementService_CreateLoginPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LoginPolicyAdd) + in := new(LoginPolicyRequest) if err := dec(in); err != nil { return nil, err } @@ -26761,13 +26769,13 @@ func _ManagementService_CreateLoginPolicy_Handler(srv interface{}, ctx context.C FullMethod: "/caos.zitadel.management.api.v1.ManagementService/CreateLoginPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).CreateLoginPolicy(ctx, req.(*LoginPolicyAdd)) + return srv.(ManagementServiceServer).CreateLoginPolicy(ctx, req.(*LoginPolicyRequest)) } return interceptor(ctx, in, info, handler) } func _ManagementService_UpdateLoginPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LoginPolicy) + in := new(LoginPolicyRequest) if err := dec(in); err != nil { return nil, err } @@ -26779,7 +26787,7 @@ func _ManagementService_UpdateLoginPolicy_Handler(srv interface{}, ctx context.C FullMethod: "/caos.zitadel.management.api.v1.ManagementService/UpdateLoginPolicy", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ManagementServiceServer).UpdateLoginPolicy(ctx, req.(*LoginPolicy)) + return srv.(ManagementServiceServer).UpdateLoginPolicy(ctx, req.(*LoginPolicyRequest)) } return interceptor(ctx, in, info, handler) } @@ -26856,6 +26864,276 @@ func _ManagementService_RemoveIdpProviderFromLoginPolicy_Handler(srv interface{} return interceptor(ctx, in, info, handler) } +func _ManagementService_GetPasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).GetPasswordComplexityPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetPasswordComplexityPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).GetPasswordComplexityPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_GetDefaultPasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).GetDefaultPasswordComplexityPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordComplexityPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).GetDefaultPasswordComplexityPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_CreatePasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PasswordComplexityPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).CreatePasswordComplexityPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordComplexityPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).CreatePasswordComplexityPolicy(ctx, req.(*PasswordComplexityPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_UpdatePasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PasswordComplexityPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).UpdatePasswordComplexityPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordComplexityPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).UpdatePasswordComplexityPolicy(ctx, req.(*PasswordComplexityPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_RemovePasswordComplexityPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).RemovePasswordComplexityPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordComplexityPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).RemovePasswordComplexityPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_GetPasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).GetPasswordAgePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetPasswordAgePolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).GetPasswordAgePolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_GetDefaultPasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).GetDefaultPasswordAgePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordAgePolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).GetDefaultPasswordAgePolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_CreatePasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PasswordAgePolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).CreatePasswordAgePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordAgePolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).CreatePasswordAgePolicy(ctx, req.(*PasswordAgePolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_UpdatePasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PasswordAgePolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).UpdatePasswordAgePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordAgePolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).UpdatePasswordAgePolicy(ctx, req.(*PasswordAgePolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_RemovePasswordAgePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).RemovePasswordAgePolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordAgePolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).RemovePasswordAgePolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_GetPasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).GetPasswordLockoutPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetPasswordLockoutPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).GetPasswordLockoutPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_GetDefaultPasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).GetDefaultPasswordLockoutPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/GetDefaultPasswordLockoutPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).GetDefaultPasswordLockoutPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_CreatePasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PasswordLockoutPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).CreatePasswordLockoutPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/CreatePasswordLockoutPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).CreatePasswordLockoutPolicy(ctx, req.(*PasswordLockoutPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_UpdatePasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PasswordLockoutPolicyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).UpdatePasswordLockoutPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/UpdatePasswordLockoutPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).UpdatePasswordLockoutPolicy(ctx, req.(*PasswordLockoutPolicyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ManagementService_RemovePasswordLockoutPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ManagementServiceServer).RemovePasswordLockoutPolicy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/caos.zitadel.management.api.v1.ManagementService/RemovePasswordLockoutPolicy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ManagementServiceServer).RemovePasswordLockoutPolicy(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + var _ManagementService_serviceDesc = grpc.ServiceDesc{ ServiceName: "caos.zitadel.management.api.v1.ManagementService", HandlerType: (*ManagementServiceServer)(nil), @@ -27016,58 +27294,6 @@ var _ManagementService_serviceDesc = grpc.ServiceDesc{ MethodName: "SearchUserMemberships", Handler: _ManagementService_SearchUserMemberships_Handler, }, - { - MethodName: "GetPasswordComplexityPolicy", - Handler: _ManagementService_GetPasswordComplexityPolicy_Handler, - }, - { - MethodName: "GetDefaultPasswordComplexityPolicy", - Handler: _ManagementService_GetDefaultPasswordComplexityPolicy_Handler, - }, - { - MethodName: "CreatePasswordComplexityPolicy", - Handler: _ManagementService_CreatePasswordComplexityPolicy_Handler, - }, - { - MethodName: "UpdatePasswordComplexityPolicy", - Handler: _ManagementService_UpdatePasswordComplexityPolicy_Handler, - }, - { - MethodName: "DeletePasswordComplexityPolicy", - Handler: _ManagementService_DeletePasswordComplexityPolicy_Handler, - }, - { - MethodName: "GetPasswordAgePolicy", - Handler: _ManagementService_GetPasswordAgePolicy_Handler, - }, - { - MethodName: "CreatePasswordAgePolicy", - Handler: _ManagementService_CreatePasswordAgePolicy_Handler, - }, - { - MethodName: "UpdatePasswordAgePolicy", - Handler: _ManagementService_UpdatePasswordAgePolicy_Handler, - }, - { - MethodName: "DeletePasswordAgePolicy", - Handler: _ManagementService_DeletePasswordAgePolicy_Handler, - }, - { - MethodName: "GetPasswordLockoutPolicy", - Handler: _ManagementService_GetPasswordLockoutPolicy_Handler, - }, - { - MethodName: "CreatePasswordLockoutPolicy", - Handler: _ManagementService_CreatePasswordLockoutPolicy_Handler, - }, - { - MethodName: "UpdatePasswordLockoutPolicy", - Handler: _ManagementService_UpdatePasswordLockoutPolicy_Handler, - }, - { - MethodName: "DeletePasswordLockoutPolicy", - Handler: _ManagementService_DeletePasswordLockoutPolicy_Handler, - }, { MethodName: "CreateOrg", Handler: _ManagementService_CreateOrg_Handler, @@ -27376,6 +27602,10 @@ var _ManagementService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetLoginPolicy", Handler: _ManagementService_GetLoginPolicy_Handler, }, + { + MethodName: "GetDefaultLoginPolicy", + Handler: _ManagementService_GetDefaultLoginPolicy_Handler, + }, { MethodName: "CreateLoginPolicy", Handler: _ManagementService_CreateLoginPolicy_Handler, @@ -27400,6 +27630,66 @@ var _ManagementService_serviceDesc = grpc.ServiceDesc{ MethodName: "RemoveIdpProviderFromLoginPolicy", Handler: _ManagementService_RemoveIdpProviderFromLoginPolicy_Handler, }, + { + MethodName: "GetPasswordComplexityPolicy", + Handler: _ManagementService_GetPasswordComplexityPolicy_Handler, + }, + { + MethodName: "GetDefaultPasswordComplexityPolicy", + Handler: _ManagementService_GetDefaultPasswordComplexityPolicy_Handler, + }, + { + MethodName: "CreatePasswordComplexityPolicy", + Handler: _ManagementService_CreatePasswordComplexityPolicy_Handler, + }, + { + MethodName: "UpdatePasswordComplexityPolicy", + Handler: _ManagementService_UpdatePasswordComplexityPolicy_Handler, + }, + { + MethodName: "RemovePasswordComplexityPolicy", + Handler: _ManagementService_RemovePasswordComplexityPolicy_Handler, + }, + { + MethodName: "GetPasswordAgePolicy", + Handler: _ManagementService_GetPasswordAgePolicy_Handler, + }, + { + MethodName: "GetDefaultPasswordAgePolicy", + Handler: _ManagementService_GetDefaultPasswordAgePolicy_Handler, + }, + { + MethodName: "CreatePasswordAgePolicy", + Handler: _ManagementService_CreatePasswordAgePolicy_Handler, + }, + { + MethodName: "UpdatePasswordAgePolicy", + Handler: _ManagementService_UpdatePasswordAgePolicy_Handler, + }, + { + MethodName: "RemovePasswordAgePolicy", + Handler: _ManagementService_RemovePasswordAgePolicy_Handler, + }, + { + MethodName: "GetPasswordLockoutPolicy", + Handler: _ManagementService_GetPasswordLockoutPolicy_Handler, + }, + { + MethodName: "GetDefaultPasswordLockoutPolicy", + Handler: _ManagementService_GetDefaultPasswordLockoutPolicy_Handler, + }, + { + MethodName: "CreatePasswordLockoutPolicy", + Handler: _ManagementService_CreatePasswordLockoutPolicy_Handler, + }, + { + MethodName: "UpdatePasswordLockoutPolicy", + Handler: _ManagementService_UpdatePasswordLockoutPolicy_Handler, + }, + { + MethodName: "RemovePasswordLockoutPolicy", + Handler: _ManagementService_RemovePasswordLockoutPolicy_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "management.proto", diff --git a/pkg/grpc/management/management.pb.gw.go b/pkg/grpc/management/management.pb.gw.go index e8e0fb6cc5..b0c3c0e51c 100644 --- a/pkg/grpc/management/management.pb.gw.go +++ b/pkg/grpc/management/management.pb.gw.go @@ -21,6 +21,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" ) @@ -31,6 +32,7 @@ var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage +var _ = metadata.Join func request_ManagementService_Healthz_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq empty.Empty @@ -2278,390 +2280,6 @@ func local_request_ManagementService_SearchUserMemberships_0(ctx context.Context } -func request_ManagementService_GetPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := client.GetPasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_GetPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := server.GetPasswordComplexityPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := client.GetDefaultPasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := server.GetDefaultPasswordComplexityPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_CreatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordComplexityPolicyCreate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CreatePasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_CreatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordComplexityPolicyCreate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CreatePasswordComplexityPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_UpdatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordComplexityPolicyUpdate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.UpdatePasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_UpdatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordComplexityPolicyUpdate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.UpdatePasswordComplexityPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_ManagementService_DeletePasswordComplexityPolicy_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_ManagementService_DeletePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordComplexityPolicyID - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ManagementService_DeletePasswordComplexityPolicy_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DeletePasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_DeletePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordComplexityPolicyID - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ManagementService_DeletePasswordComplexityPolicy_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DeletePasswordComplexityPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_GetPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := client.GetPasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_GetPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := server.GetPasswordAgePolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_CreatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordAgePolicyCreate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CreatePasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_CreatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordAgePolicyCreate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CreatePasswordAgePolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_UpdatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordAgePolicyUpdate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.UpdatePasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_UpdatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordAgePolicyUpdate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.UpdatePasswordAgePolicy(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_ManagementService_DeletePasswordAgePolicy_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_ManagementService_DeletePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordAgePolicyID - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ManagementService_DeletePasswordAgePolicy_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DeletePasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_DeletePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordAgePolicyID - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ManagementService_DeletePasswordAgePolicy_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DeletePasswordAgePolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_GetPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := client.GetPasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_GetPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq empty.Empty - var metadata runtime.ServerMetadata - - msg, err := server.GetPasswordLockoutPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_CreatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordLockoutPolicyCreate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CreatePasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_CreatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordLockoutPolicyCreate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CreatePasswordLockoutPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -func request_ManagementService_UpdatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordLockoutPolicyUpdate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.UpdatePasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_UpdatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordLockoutPolicyUpdate - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.UpdatePasswordLockoutPolicy(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_ManagementService_DeletePasswordLockoutPolicy_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_ManagementService_DeletePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordLockoutPolicyID - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ManagementService_DeletePasswordLockoutPolicy_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DeletePasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_ManagementService_DeletePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PasswordLockoutPolicyID - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ManagementService_DeletePasswordLockoutPolicy_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DeletePasswordLockoutPolicy(ctx, &protoReq) - return msg, metadata, err - -} - func request_ManagementService_CreateOrg_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OrgCreateRequest var metadata runtime.ServerMetadata @@ -7574,8 +7192,26 @@ func local_request_ManagementService_GetLoginPolicy_0(ctx context.Context, marsh } +func request_ManagementService_GetDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultLoginPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_GetDefaultLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultLoginPolicy(ctx, &protoReq) + return msg, metadata, err + +} + func request_ManagementService_CreateLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginPolicyAdd + var protoReq LoginPolicyRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -7592,7 +7228,7 @@ func request_ManagementService_CreateLoginPolicy_0(ctx context.Context, marshale } func local_request_ManagementService_CreateLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginPolicyAdd + var protoReq LoginPolicyRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -7609,7 +7245,7 @@ func local_request_ManagementService_CreateLoginPolicy_0(ctx context.Context, ma } func request_ManagementService_UpdateLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginPolicy + var protoReq LoginPolicyRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -7626,7 +7262,7 @@ func request_ManagementService_UpdateLoginPolicy_0(ctx context.Context, marshale } func local_request_ManagementService_UpdateLoginPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq LoginPolicy + var protoReq LoginPolicyRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -7732,14 +7368,6 @@ func request_ManagementService_RemoveIdpProviderFromLoginPolicy_0(ctx context.Co var protoReq IdpProviderID var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( val string ok bool @@ -7767,14 +7395,6 @@ func local_request_ManagementService_RemoveIdpProviderFromLoginPolicy_0(ctx cont var protoReq IdpProviderID var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - var ( val string ok bool @@ -7798,14 +7418,383 @@ func local_request_ManagementService_RemoveIdpProviderFromLoginPolicy_0(ctx cont } +func request_ManagementService_GetPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetPasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_GetPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetPasswordComplexityPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultPasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultPasswordComplexityPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_CreatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordComplexityPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CreatePasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_CreatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordComplexityPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreatePasswordComplexityPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_UpdatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordComplexityPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdatePasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_UpdatePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordComplexityPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdatePasswordComplexityPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_RemovePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.RemovePasswordComplexityPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_RemovePasswordComplexityPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.RemovePasswordComplexityPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_GetPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetPasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_GetPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetPasswordAgePolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_GetDefaultPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultPasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_GetDefaultPasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultPasswordAgePolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_CreatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordAgePolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CreatePasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_CreatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordAgePolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreatePasswordAgePolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_UpdatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordAgePolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdatePasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_UpdatePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordAgePolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdatePasswordAgePolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_RemovePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.RemovePasswordAgePolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_RemovePasswordAgePolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.RemovePasswordAgePolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_GetPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetPasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_GetPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetPasswordLockoutPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_GetDefaultPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.GetDefaultPasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_GetDefaultPasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.GetDefaultPasswordLockoutPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_CreatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordLockoutPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CreatePasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_CreatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordLockoutPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreatePasswordLockoutPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_UpdatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordLockoutPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdatePasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_UpdatePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PasswordLockoutPolicyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdatePasswordLockoutPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_ManagementService_RemovePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client ManagementServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := client.RemovePasswordLockoutPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ManagementService_RemovePasswordLockoutPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server ManagementServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq empty.Empty + var metadata runtime.ServerMetadata + + msg, err := server.RemovePasswordLockoutPolicy(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterManagementServiceHandlerServer registers the http handlers for service ManagementService to "mux". // UnaryRPC :call ManagementServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterManagementServiceHandlerFromEndpoint instead. func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ManagementServiceServer) error { mux.Handle("GET", pattern_ManagementService_Healthz_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7813,6 +7802,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_Healthz_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7826,6 +7816,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_Ready_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7833,6 +7825,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_Ready_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7846,6 +7839,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_Validate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7853,6 +7848,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_Validate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7866,6 +7862,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetZitadelDocs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7873,6 +7871,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetZitadelDocs_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7886,6 +7885,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetIam_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7893,6 +7894,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetIam_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7906,6 +7908,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_IsUserUnique_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7913,6 +7917,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_IsUserUnique_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7926,6 +7931,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetUserByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7933,6 +7940,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetUserByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7946,6 +7954,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetUserByLoginNameGlobal_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7953,6 +7963,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetUserByLoginNameGlobal_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7966,6 +7977,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7973,6 +7986,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchUsers_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -7986,6 +8000,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -7993,6 +8009,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateUser_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8006,6 +8023,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_DeactivateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8013,6 +8032,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeactivateUser_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8026,6 +8046,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ReactivateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8033,6 +8055,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ReactivateUser_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8046,6 +8069,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_LockUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8053,6 +8078,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_LockUser_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8066,6 +8092,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UnlockUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8073,6 +8101,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UnlockUser_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8086,6 +8115,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_DeleteUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8093,6 +8124,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeleteUser_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8106,6 +8138,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_UserChanges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8113,6 +8147,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UserChanges_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8126,6 +8161,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_AddMachineKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8133,6 +8170,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_AddMachineKey_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8146,6 +8184,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_DeleteMachineKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8153,6 +8193,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeleteMachineKey_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8166,6 +8207,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchMachineKeys_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8173,6 +8216,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchMachineKeys_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8186,6 +8230,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetMachineKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8193,6 +8239,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetMachineKey_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8206,6 +8253,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetUserProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8213,6 +8262,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetUserProfile_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8226,6 +8276,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateUserProfile_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8233,6 +8285,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateUserProfile_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8246,6 +8299,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetUserEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8253,6 +8308,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetUserEmail_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8266,6 +8322,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_ChangeUserUserName_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8273,6 +8331,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ChangeUserUserName_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8286,6 +8345,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ChangeUserEmail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8293,6 +8354,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ChangeUserEmail_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8306,6 +8368,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_ResendEmailVerificationMail_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8313,6 +8377,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ResendEmailVerificationMail_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8326,6 +8391,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetUserPhone_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8333,6 +8400,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetUserPhone_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8346,6 +8414,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ChangeUserPhone_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8353,6 +8423,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ChangeUserPhone_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8366,6 +8437,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveUserPhone_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8373,6 +8446,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveUserPhone_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8386,6 +8460,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_ResendPhoneVerificationCode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8393,6 +8469,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ResendPhoneVerificationCode_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8406,6 +8483,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetUserAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8413,6 +8492,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetUserAddress_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8426,6 +8506,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateUserAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8433,6 +8515,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateUserAddress_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8446,6 +8529,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateUserMachine_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8453,6 +8538,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateUserMachine_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8466,6 +8552,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchUserExternalIDPs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8473,6 +8561,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchUserExternalIDPs_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8486,6 +8575,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveExternalIDP_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8493,6 +8584,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveExternalIDP_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8506,6 +8598,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetUserMfas_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8513,6 +8607,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetUserMfas_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8526,6 +8621,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SendSetPasswordNotification_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8533,6 +8630,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SendSetPasswordNotification_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8546,6 +8644,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SetInitialPassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8553,6 +8653,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SetInitialPassword_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8566,6 +8667,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchUserMemberships_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8573,6 +8676,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchUserMemberships_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8583,269 +8687,11 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se }) - mux.Handle("GET", pattern_ManagementService_GetPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_GetPasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_GetDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ManagementService_CreatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_CreatePasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_CreatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ManagementService_UpdatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_UpdatePasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_UpdatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ManagementService_DeletePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_DeletePasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_DeletePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ManagementService_GetPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_GetPasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ManagementService_CreatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_CreatePasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_CreatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ManagementService_UpdatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_UpdatePasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_UpdatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ManagementService_DeletePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_DeletePasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_DeletePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ManagementService_GetPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_GetPasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ManagementService_CreatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_CreatePasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_CreatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ManagementService_UpdatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_UpdatePasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_UpdatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ManagementService_DeletePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_ManagementService_DeletePasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_DeletePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_ManagementService_CreateOrg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8853,6 +8699,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateOrg_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8866,6 +8713,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_OrgChanges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8873,6 +8722,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_OrgChanges_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8886,6 +8736,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetMyOrg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8893,6 +8745,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetMyOrg_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8906,6 +8759,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetOrgByDomainGlobal_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8913,6 +8768,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetOrgByDomainGlobal_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8926,6 +8782,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_DeactivateMyOrg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8933,6 +8791,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeactivateMyOrg_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8946,6 +8805,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ReactivateMyOrg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8953,6 +8814,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ReactivateMyOrg_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8966,6 +8828,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchMyOrgDomains_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8973,6 +8837,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchMyOrgDomains_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -8986,6 +8851,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_AddMyOrgDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -8993,6 +8860,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_AddMyOrgDomain_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9006,6 +8874,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_GenerateMyOrgDomainValidation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9013,6 +8883,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GenerateMyOrgDomainValidation_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9026,6 +8897,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_ValidateMyOrgDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9033,6 +8906,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ValidateMyOrgDomain_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9046,6 +8920,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SetMyPrimaryOrgDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9053,6 +8929,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SetMyPrimaryOrgDomain_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9066,6 +8943,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveMyOrgDomain_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9073,6 +8952,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveMyOrgDomain_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9086,6 +8966,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetMyOrgIamPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9093,6 +8975,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetMyOrgIamPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9106,6 +8989,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetOrgMemberRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9113,6 +8998,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetOrgMemberRoles_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9126,6 +9012,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_AddMyOrgMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9133,6 +9021,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_AddMyOrgMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9146,6 +9035,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ChangeMyOrgMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9153,6 +9044,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ChangeMyOrgMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9166,6 +9058,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveMyOrgMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9173,6 +9067,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveMyOrgMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9186,6 +9081,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchMyOrgMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9193,6 +9090,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchMyOrgMembers_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9206,6 +9104,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_ProjectChanges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9213,6 +9113,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ProjectChanges_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9226,6 +9127,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9233,6 +9136,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchProjects_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9246,6 +9150,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_ProjectByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9253,6 +9159,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ProjectByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9266,6 +9173,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_CreateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9273,6 +9182,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateProject_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9286,6 +9196,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9293,6 +9205,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateProject_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9306,6 +9219,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_DeactivateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9313,6 +9228,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeactivateProject_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9326,6 +9242,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ReactivateProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9333,6 +9251,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ReactivateProject_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9346,6 +9265,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveProject_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9353,6 +9274,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveProject_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9366,6 +9288,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchGrantedProjects_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9373,6 +9297,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchGrantedProjects_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9386,6 +9311,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetGrantedProjectByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9393,6 +9320,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetGrantedProjectByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9406,6 +9334,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetProjectMemberRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9413,6 +9343,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetProjectMemberRoles_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9426,6 +9357,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchProjectMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9433,6 +9366,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchProjectMembers_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9446,6 +9380,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_AddProjectMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9453,6 +9389,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_AddProjectMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9466,6 +9403,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ChangeProjectMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9473,6 +9412,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ChangeProjectMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9486,6 +9426,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveProjectMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9493,6 +9435,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveProjectMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9506,6 +9449,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchProjectRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9513,6 +9458,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchProjectRoles_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9526,6 +9472,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_AddProjectRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9533,6 +9481,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_AddProjectRole_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9546,6 +9495,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_BulkAddProjectRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9553,6 +9504,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_BulkAddProjectRole_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9566,6 +9518,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ChangeProjectRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9573,6 +9527,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ChangeProjectRole_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9586,6 +9541,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveProjectRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9593,6 +9550,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveProjectRole_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9606,6 +9564,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchApplications_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9613,6 +9573,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchApplications_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9626,6 +9587,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_ApplicationByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9633,6 +9596,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ApplicationByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9646,6 +9610,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_ApplicationChanges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9653,6 +9619,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ApplicationChanges_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9666,6 +9633,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_CreateOIDCApplication_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9673,6 +9642,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateOIDCApplication_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9686,6 +9656,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateApplication_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9693,6 +9665,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateApplication_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9706,6 +9679,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_DeactivateApplication_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9713,6 +9688,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeactivateApplication_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9726,6 +9702,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ReactivateApplication_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9733,6 +9711,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ReactivateApplication_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9746,6 +9725,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveApplication_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9753,6 +9734,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveApplication_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9766,6 +9748,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateApplicationOIDCConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9773,6 +9757,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateApplicationOIDCConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9786,6 +9771,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_RegenerateOIDCClientSecret_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9793,6 +9780,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RegenerateOIDCClientSecret_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9806,6 +9794,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchProjectGrants_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9813,6 +9803,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchProjectGrants_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9826,6 +9817,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_ProjectGrantByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9833,6 +9826,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ProjectGrantByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9846,6 +9840,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_CreateProjectGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9853,6 +9849,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateProjectGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9866,6 +9863,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateProjectGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9873,6 +9872,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateProjectGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9886,6 +9886,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_DeactivateProjectGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9893,6 +9895,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeactivateProjectGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9906,6 +9909,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ReactivateProjectGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9913,6 +9918,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ReactivateProjectGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9926,6 +9932,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveProjectGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9933,6 +9941,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveProjectGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9946,6 +9955,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetProjectGrantMemberRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9953,6 +9964,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetProjectGrantMemberRoles_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9966,6 +9978,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchProjectGrantMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9973,6 +9987,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchProjectGrantMembers_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -9986,6 +10001,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_AddProjectGrantMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -9993,6 +10010,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_AddProjectGrantMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10006,6 +10024,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ChangeProjectGrantMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10013,6 +10033,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ChangeProjectGrantMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10026,6 +10047,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveProjectGrantMember_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10033,6 +10056,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveProjectGrantMember_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10046,6 +10070,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchUserGrants_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10053,6 +10079,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchUserGrants_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10066,6 +10093,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_UserGrantByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10073,6 +10102,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UserGrantByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10086,6 +10116,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_CreateUserGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10093,6 +10125,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateUserGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10106,6 +10139,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateUserGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10113,6 +10148,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateUserGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10126,6 +10162,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_DeactivateUserGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10133,6 +10171,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeactivateUserGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10146,6 +10185,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ReactivateUserGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10153,6 +10194,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ReactivateUserGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10166,6 +10208,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveUserGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10173,6 +10217,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveUserGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10186,6 +10231,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_BulkRemoveUserGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10193,6 +10240,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_BulkRemoveUserGrant_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10206,6 +10254,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_IdpByID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10213,6 +10263,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_IdpByID_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10226,6 +10277,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_CreateOidcIdp_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10233,6 +10286,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateOidcIdp_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10246,6 +10300,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10253,6 +10309,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10266,6 +10323,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_DeactivateIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10273,6 +10332,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_DeactivateIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10286,6 +10346,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_ReactivateIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10293,6 +10355,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_ReactivateIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10306,6 +10369,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10313,6 +10378,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10326,6 +10392,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateOidcIdpConfig_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10333,6 +10401,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateOidcIdpConfig_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10346,6 +10415,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_SearchIdps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10353,6 +10424,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_SearchIdps_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10366,6 +10438,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("GET", pattern_ManagementService_GetLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10373,6 +10447,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10383,9 +10458,34 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_ManagementService_GetDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_GetDefaultLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultLoginPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_ManagementService_CreateLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10393,6 +10493,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_CreateLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10406,6 +10507,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("PUT", pattern_ManagementService_UpdateLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10413,6 +10516,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_UpdateLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10426,6 +10530,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("DELETE", pattern_ManagementService_RemoveLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10433,6 +10539,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10446,6 +10553,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_GetLoginPolicyIdpProviders_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10453,6 +10562,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_GetLoginPolicyIdpProviders_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10466,6 +10576,8 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se mux.Handle("POST", pattern_ManagementService_AddIdpProviderToLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10473,6 +10585,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_AddIdpProviderToLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10483,9 +10596,11 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se }) - mux.Handle("POST", pattern_ManagementService_RemoveIdpProviderFromLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_ManagementService_RemoveIdpProviderFromLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) if err != nil { @@ -10493,6 +10608,7 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se return } resp, md, err := local_request_ManagementService_RemoveIdpProviderFromLoginPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) @@ -10503,6 +10619,351 @@ func RegisterManagementServiceHandlerServer(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_ManagementService_GetPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_GetPasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_GetDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_CreatePasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_ManagementService_UpdatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_UpdatePasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_UpdatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ManagementService_RemovePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_RemovePasswordComplexityPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RemovePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_GetPasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_GetDefaultPasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_CreatePasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_ManagementService_UpdatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_UpdatePasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_UpdatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ManagementService_RemovePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_RemovePasswordAgePolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RemovePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_GetPasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_GetDefaultPasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_CreatePasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_ManagementService_UpdatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_UpdatePasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_UpdatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ManagementService_RemovePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ManagementService_RemovePasswordLockoutPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RemovePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -11324,266 +11785,6 @@ func RegisterManagementServiceHandlerClient(ctx context.Context, mux *runtime.Se }) - mux.Handle("GET", pattern_ManagementService_GetPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_GetPasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_GetDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ManagementService_CreatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_CreatePasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_CreatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ManagementService_UpdatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_UpdatePasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_UpdatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ManagementService_DeletePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_DeletePasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_DeletePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ManagementService_GetPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_GetPasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ManagementService_CreatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_CreatePasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_CreatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ManagementService_UpdatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_UpdatePasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_UpdatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ManagementService_DeletePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_DeletePasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_DeletePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_ManagementService_GetPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_GetPasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_GetPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_ManagementService_CreatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_CreatePasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_CreatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("PUT", pattern_ManagementService_UpdatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_UpdatePasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_UpdatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("DELETE", pattern_ManagementService_DeletePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_ManagementService_DeletePasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_ManagementService_DeletePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_ManagementService_CreateOrg_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -13124,6 +13325,26 @@ func RegisterManagementServiceHandlerClient(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_ManagementService_GetDefaultLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_GetDefaultLoginPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultLoginPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_ManagementService_CreateLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -13224,7 +13445,7 @@ func RegisterManagementServiceHandlerClient(ctx context.Context, mux *runtime.Se }) - mux.Handle("POST", pattern_ManagementService_RemoveIdpProviderFromLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("DELETE", pattern_ManagementService_RemoveIdpProviderFromLoginPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -13244,6 +13465,306 @@ func RegisterManagementServiceHandlerClient(ctx context.Context, mux *runtime.Se }) + mux.Handle("GET", pattern_ManagementService_GetPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_GetPasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_GetDefaultPasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultPasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_CreatePasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_ManagementService_UpdatePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_UpdatePasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_UpdatePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ManagementService_RemovePasswordComplexityPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_RemovePasswordComplexityPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RemovePasswordComplexityPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_GetPasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_GetDefaultPasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultPasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_CreatePasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_ManagementService_UpdatePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_UpdatePasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_UpdatePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ManagementService_RemovePasswordAgePolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_RemovePasswordAgePolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RemovePasswordAgePolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_GetPasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ManagementService_GetDefaultPasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_GetDefaultPasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_GetDefaultPasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ManagementService_CreatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_CreatePasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_CreatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_ManagementService_UpdatePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_UpdatePasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_UpdatePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_ManagementService_RemovePasswordLockoutPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ManagementService_RemovePasswordLockoutPolicy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ManagementService_RemovePasswordLockoutPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -13326,32 +13847,6 @@ var ( pattern_ManagementService_SearchUserMemberships_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2, 2, 3}, []string{"users", "user_id", "memberships", "_search"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ManagementService_GetPasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_GetDefaultPasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"policies", "passwords", "complexity", "default"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_CreatePasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_UpdatePasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_DeletePasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_GetPasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "age"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_CreatePasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "age"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_UpdatePasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "age"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_DeletePasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "age"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_GetPasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_CreatePasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_UpdatePasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) - - pattern_ManagementService_DeletePasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"policies", "passwords", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_ManagementService_CreateOrg_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"orgs"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ManagementService_OrgChanges_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 2, 2}, []string{"orgs", "id", "changes"}, "", runtime.AssumeColonVerbOpt(true))) @@ -13506,6 +14001,8 @@ var ( pattern_ManagementService_GetLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"orgs", "me", "policies", "login"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ManagementService_GetDefaultLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"orgs", "default", "policies", "login"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ManagementService_CreateLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"orgs", "me", "policies", "login"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ManagementService_UpdateLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"orgs", "me", "policies", "login"}, "", runtime.AssumeColonVerbOpt(true))) @@ -13517,6 +14014,36 @@ var ( pattern_ManagementService_AddIdpProviderToLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "login", "idpproviders"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ManagementService_RemoveIdpProviderFromLoginPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"orgs", "me", "policies", "login", "idpproviders", "idp_config_id"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_GetPasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_GetDefaultPasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "default", "policies", "password", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_CreatePasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_UpdatePasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_RemovePasswordComplexityPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "complexity"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_GetPasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "age"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_GetDefaultPasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "default", "policies", "password", "age"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_CreatePasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "age"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_UpdatePasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "age"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_RemovePasswordAgePolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "age"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_GetPasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_GetDefaultPasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "default", "policies", "password", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_CreatePasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_UpdatePasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ManagementService_RemovePasswordLockoutPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"orgs", "me", "policies", "password", "lockout"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -13598,32 +14125,6 @@ var ( forward_ManagementService_SearchUserMemberships_0 = runtime.ForwardResponseMessage - forward_ManagementService_GetPasswordComplexityPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_GetDefaultPasswordComplexityPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_CreatePasswordComplexityPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_UpdatePasswordComplexityPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_DeletePasswordComplexityPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_GetPasswordAgePolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_CreatePasswordAgePolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_UpdatePasswordAgePolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_DeletePasswordAgePolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_GetPasswordLockoutPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_CreatePasswordLockoutPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_UpdatePasswordLockoutPolicy_0 = runtime.ForwardResponseMessage - - forward_ManagementService_DeletePasswordLockoutPolicy_0 = runtime.ForwardResponseMessage - forward_ManagementService_CreateOrg_0 = runtime.ForwardResponseMessage forward_ManagementService_OrgChanges_0 = runtime.ForwardResponseMessage @@ -13778,6 +14279,8 @@ var ( forward_ManagementService_GetLoginPolicy_0 = runtime.ForwardResponseMessage + forward_ManagementService_GetDefaultLoginPolicy_0 = runtime.ForwardResponseMessage + forward_ManagementService_CreateLoginPolicy_0 = runtime.ForwardResponseMessage forward_ManagementService_UpdateLoginPolicy_0 = runtime.ForwardResponseMessage @@ -13789,4 +14292,34 @@ var ( forward_ManagementService_AddIdpProviderToLoginPolicy_0 = runtime.ForwardResponseMessage forward_ManagementService_RemoveIdpProviderFromLoginPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_GetPasswordComplexityPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_GetDefaultPasswordComplexityPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_CreatePasswordComplexityPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_UpdatePasswordComplexityPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_RemovePasswordComplexityPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_GetPasswordAgePolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_GetDefaultPasswordAgePolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_CreatePasswordAgePolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_UpdatePasswordAgePolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_RemovePasswordAgePolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_GetPasswordLockoutPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_GetDefaultPasswordLockoutPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_CreatePasswordLockoutPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_UpdatePasswordLockoutPolicy_0 = runtime.ForwardResponseMessage + + forward_ManagementService_RemovePasswordLockoutPolicy_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/grpc/management/management.pb.validate.go b/pkg/grpc/management/management.pb.validate.go index e9eb7cc68d..e5c9733774 100644 --- a/pkg/grpc/management/management.pb.validate.go +++ b/pkg/grpc/management/management.pb.validate.go @@ -4316,1024 +4316,14 @@ var _ interface { ErrorName() string } = SetPasswordNotificationRequestValidationError{} -// Validate checks the field values on PasswordComplexityPolicyID with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordComplexityPolicyID) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - return nil -} - -// PasswordComplexityPolicyIDValidationError is the validation error returned -// by PasswordComplexityPolicyID.Validate if the designated constraints aren't met. -type PasswordComplexityPolicyIDValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordComplexityPolicyIDValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordComplexityPolicyIDValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordComplexityPolicyIDValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordComplexityPolicyIDValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordComplexityPolicyIDValidationError) ErrorName() string { - return "PasswordComplexityPolicyIDValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordComplexityPolicyIDValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordComplexityPolicyID.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordComplexityPolicyIDValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordComplexityPolicyIDValidationError{} - -// Validate checks the field values on PasswordComplexityPolicy with the rules -// defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordComplexityPolicy) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - // no validation rules for Description - - // no validation rules for State - - if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PasswordComplexityPolicyValidationError{ - field: "CreationDate", - reason: "embedded message failed validation", - cause: err, - } - } - } - - if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PasswordComplexityPolicyValidationError{ - field: "ChangeDate", - reason: "embedded message failed validation", - cause: err, - } - } - } - - // no validation rules for MinLength - - // no validation rules for HasLowercase - - // no validation rules for HasUppercase - - // no validation rules for HasNumber - - // no validation rules for HasSymbol - - // no validation rules for Sequence - - // no validation rules for IsDefault - - return nil -} - -// PasswordComplexityPolicyValidationError is the validation error returned by -// PasswordComplexityPolicy.Validate if the designated constraints aren't met. -type PasswordComplexityPolicyValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordComplexityPolicyValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordComplexityPolicyValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordComplexityPolicyValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordComplexityPolicyValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordComplexityPolicyValidationError) ErrorName() string { - return "PasswordComplexityPolicyValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordComplexityPolicyValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordComplexityPolicy.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordComplexityPolicyValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordComplexityPolicyValidationError{} - -// Validate checks the field values on PasswordComplexityPolicyCreate with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordComplexityPolicyCreate) Validate() error { - if m == nil { - return nil - } - - if utf8.RuneCountInString(m.GetDescription()) > 500 { - return PasswordComplexityPolicyCreateValidationError{ - field: "Description", - reason: "value length must be at most 500 runes", - } - } - - // no validation rules for MinLength - - // no validation rules for HasLowercase - - // no validation rules for HasUppercase - - // no validation rules for HasNumber - - // no validation rules for HasSymbol - - return nil -} - -// PasswordComplexityPolicyCreateValidationError is the validation error -// returned by PasswordComplexityPolicyCreate.Validate if the designated -// constraints aren't met. -type PasswordComplexityPolicyCreateValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordComplexityPolicyCreateValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordComplexityPolicyCreateValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordComplexityPolicyCreateValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordComplexityPolicyCreateValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordComplexityPolicyCreateValidationError) ErrorName() string { - return "PasswordComplexityPolicyCreateValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordComplexityPolicyCreateValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordComplexityPolicyCreate.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordComplexityPolicyCreateValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordComplexityPolicyCreateValidationError{} - -// Validate checks the field values on PasswordComplexityPolicyUpdate with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordComplexityPolicyUpdate) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - if utf8.RuneCountInString(m.GetDescription()) > 500 { - return PasswordComplexityPolicyUpdateValidationError{ - field: "Description", - reason: "value length must be at most 500 runes", - } - } - - // no validation rules for MinLength - - // no validation rules for HasLowercase - - // no validation rules for HasUppercase - - // no validation rules for HasNumber - - // no validation rules for HasSymbol - - return nil -} - -// PasswordComplexityPolicyUpdateValidationError is the validation error -// returned by PasswordComplexityPolicyUpdate.Validate if the designated -// constraints aren't met. -type PasswordComplexityPolicyUpdateValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordComplexityPolicyUpdateValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordComplexityPolicyUpdateValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordComplexityPolicyUpdateValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordComplexityPolicyUpdateValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordComplexityPolicyUpdateValidationError) ErrorName() string { - return "PasswordComplexityPolicyUpdateValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordComplexityPolicyUpdateValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordComplexityPolicyUpdate.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordComplexityPolicyUpdateValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordComplexityPolicyUpdateValidationError{} - -// Validate checks the field values on PasswordAgePolicyID with the rules -// defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordAgePolicyID) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - return nil -} - -// PasswordAgePolicyIDValidationError is the validation error returned by -// PasswordAgePolicyID.Validate if the designated constraints aren't met. -type PasswordAgePolicyIDValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordAgePolicyIDValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordAgePolicyIDValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordAgePolicyIDValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordAgePolicyIDValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordAgePolicyIDValidationError) ErrorName() string { - return "PasswordAgePolicyIDValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordAgePolicyIDValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordAgePolicyID.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordAgePolicyIDValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordAgePolicyIDValidationError{} - -// Validate checks the field values on PasswordAgePolicy with the rules defined +// Validate checks the field values on OrgIamPolicyView with the rules defined // in the proto definition for this message. If any rules are violated, an // error is returned. -func (m *PasswordAgePolicy) Validate() error { +func (m *OrgIamPolicyView) Validate() error { if m == nil { return nil } - // no validation rules for Id - - // no validation rules for Description - - // no validation rules for State - - if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PasswordAgePolicyValidationError{ - field: "CreationDate", - reason: "embedded message failed validation", - cause: err, - } - } - } - - if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PasswordAgePolicyValidationError{ - field: "ChangeDate", - reason: "embedded message failed validation", - cause: err, - } - } - } - - // no validation rules for MaxAgeDays - - // no validation rules for ExpireWarnDays - - // no validation rules for Sequence - - // no validation rules for IsDefault - - return nil -} - -// PasswordAgePolicyValidationError is the validation error returned by -// PasswordAgePolicy.Validate if the designated constraints aren't met. -type PasswordAgePolicyValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordAgePolicyValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordAgePolicyValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordAgePolicyValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordAgePolicyValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordAgePolicyValidationError) ErrorName() string { - return "PasswordAgePolicyValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordAgePolicyValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordAgePolicy.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordAgePolicyValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordAgePolicyValidationError{} - -// Validate checks the field values on PasswordAgePolicyCreate with the rules -// defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordAgePolicyCreate) Validate() error { - if m == nil { - return nil - } - - if utf8.RuneCountInString(m.GetDescription()) > 500 { - return PasswordAgePolicyCreateValidationError{ - field: "Description", - reason: "value length must be at most 500 runes", - } - } - - // no validation rules for MaxAgeDays - - // no validation rules for ExpireWarnDays - - return nil -} - -// PasswordAgePolicyCreateValidationError is the validation error returned by -// PasswordAgePolicyCreate.Validate if the designated constraints aren't met. -type PasswordAgePolicyCreateValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordAgePolicyCreateValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordAgePolicyCreateValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordAgePolicyCreateValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordAgePolicyCreateValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordAgePolicyCreateValidationError) ErrorName() string { - return "PasswordAgePolicyCreateValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordAgePolicyCreateValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordAgePolicyCreate.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordAgePolicyCreateValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordAgePolicyCreateValidationError{} - -// Validate checks the field values on PasswordAgePolicyUpdate with the rules -// defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordAgePolicyUpdate) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - if utf8.RuneCountInString(m.GetDescription()) > 500 { - return PasswordAgePolicyUpdateValidationError{ - field: "Description", - reason: "value length must be at most 500 runes", - } - } - - // no validation rules for MaxAgeDays - - // no validation rules for ExpireWarnDays - - return nil -} - -// PasswordAgePolicyUpdateValidationError is the validation error returned by -// PasswordAgePolicyUpdate.Validate if the designated constraints aren't met. -type PasswordAgePolicyUpdateValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordAgePolicyUpdateValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordAgePolicyUpdateValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordAgePolicyUpdateValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordAgePolicyUpdateValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordAgePolicyUpdateValidationError) ErrorName() string { - return "PasswordAgePolicyUpdateValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordAgePolicyUpdateValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordAgePolicyUpdate.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordAgePolicyUpdateValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordAgePolicyUpdateValidationError{} - -// Validate checks the field values on PasswordLockoutPolicyID with the rules -// defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordLockoutPolicyID) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - return nil -} - -// PasswordLockoutPolicyIDValidationError is the validation error returned by -// PasswordLockoutPolicyID.Validate if the designated constraints aren't met. -type PasswordLockoutPolicyIDValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordLockoutPolicyIDValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordLockoutPolicyIDValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordLockoutPolicyIDValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordLockoutPolicyIDValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordLockoutPolicyIDValidationError) ErrorName() string { - return "PasswordLockoutPolicyIDValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordLockoutPolicyIDValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordLockoutPolicyID.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordLockoutPolicyIDValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordLockoutPolicyIDValidationError{} - -// Validate checks the field values on PasswordLockoutPolicy with the rules -// defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordLockoutPolicy) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - // no validation rules for Description - - // no validation rules for State - - if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PasswordLockoutPolicyValidationError{ - field: "CreationDate", - reason: "embedded message failed validation", - cause: err, - } - } - } - - if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PasswordLockoutPolicyValidationError{ - field: "ChangeDate", - reason: "embedded message failed validation", - cause: err, - } - } - } - - // no validation rules for MaxAttempts - - // no validation rules for ShowLockOutFailures - - // no validation rules for Sequence - - // no validation rules for IsDefault - - return nil -} - -// PasswordLockoutPolicyValidationError is the validation error returned by -// PasswordLockoutPolicy.Validate if the designated constraints aren't met. -type PasswordLockoutPolicyValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordLockoutPolicyValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordLockoutPolicyValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordLockoutPolicyValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordLockoutPolicyValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordLockoutPolicyValidationError) ErrorName() string { - return "PasswordLockoutPolicyValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordLockoutPolicyValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordLockoutPolicy.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordLockoutPolicyValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordLockoutPolicyValidationError{} - -// Validate checks the field values on PasswordLockoutPolicyCreate with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordLockoutPolicyCreate) Validate() error { - if m == nil { - return nil - } - - if utf8.RuneCountInString(m.GetDescription()) > 500 { - return PasswordLockoutPolicyCreateValidationError{ - field: "Description", - reason: "value length must be at most 500 runes", - } - } - - // no validation rules for MaxAttempts - - // no validation rules for ShowLockOutFailures - - return nil -} - -// PasswordLockoutPolicyCreateValidationError is the validation error returned -// by PasswordLockoutPolicyCreate.Validate if the designated constraints -// aren't met. -type PasswordLockoutPolicyCreateValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordLockoutPolicyCreateValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordLockoutPolicyCreateValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordLockoutPolicyCreateValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordLockoutPolicyCreateValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordLockoutPolicyCreateValidationError) ErrorName() string { - return "PasswordLockoutPolicyCreateValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordLockoutPolicyCreateValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordLockoutPolicyCreate.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordLockoutPolicyCreateValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordLockoutPolicyCreateValidationError{} - -// Validate checks the field values on PasswordLockoutPolicyUpdate with the -// rules defined in the proto definition for this message. If any rules are -// violated, an error is returned. -func (m *PasswordLockoutPolicyUpdate) Validate() error { - if m == nil { - return nil - } - - // no validation rules for Id - - if utf8.RuneCountInString(m.GetDescription()) > 500 { - return PasswordLockoutPolicyUpdateValidationError{ - field: "Description", - reason: "value length must be at most 500 runes", - } - } - - // no validation rules for MaxAttempts - - // no validation rules for ShowLockOutFailures - - return nil -} - -// PasswordLockoutPolicyUpdateValidationError is the validation error returned -// by PasswordLockoutPolicyUpdate.Validate if the designated constraints -// aren't met. -type PasswordLockoutPolicyUpdateValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PasswordLockoutPolicyUpdateValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PasswordLockoutPolicyUpdateValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PasswordLockoutPolicyUpdateValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PasswordLockoutPolicyUpdateValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PasswordLockoutPolicyUpdateValidationError) ErrorName() string { - return "PasswordLockoutPolicyUpdateValidationError" -} - -// Error satisfies the builtin error interface -func (e PasswordLockoutPolicyUpdateValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPasswordLockoutPolicyUpdate.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PasswordLockoutPolicyUpdateValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PasswordLockoutPolicyUpdateValidationError{} - -// Validate checks the field values on OrgIamPolicy with the rules defined in -// the proto definition for this message. If any rules are violated, an error -// is returned. -func (m *OrgIamPolicy) Validate() error { - if m == nil { - return nil - } - - // no validation rules for OrgId - - // no validation rules for Description - // no validation rules for UserLoginMustBeDomain // no validation rules for Default @@ -5341,9 +4331,9 @@ func (m *OrgIamPolicy) Validate() error { return nil } -// OrgIamPolicyValidationError is the validation error returned by -// OrgIamPolicy.Validate if the designated constraints aren't met. -type OrgIamPolicyValidationError struct { +// OrgIamPolicyViewValidationError is the validation error returned by +// OrgIamPolicyView.Validate if the designated constraints aren't met. +type OrgIamPolicyViewValidationError struct { field string reason string cause error @@ -5351,22 +4341,22 @@ type OrgIamPolicyValidationError struct { } // Field function returns field value. -func (e OrgIamPolicyValidationError) Field() string { return e.field } +func (e OrgIamPolicyViewValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e OrgIamPolicyValidationError) Reason() string { return e.reason } +func (e OrgIamPolicyViewValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e OrgIamPolicyValidationError) Cause() error { return e.cause } +func (e OrgIamPolicyViewValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e OrgIamPolicyValidationError) Key() bool { return e.key } +func (e OrgIamPolicyViewValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e OrgIamPolicyValidationError) ErrorName() string { return "OrgIamPolicyValidationError" } +func (e OrgIamPolicyViewValidationError) ErrorName() string { return "OrgIamPolicyViewValidationError" } // Error satisfies the builtin error interface -func (e OrgIamPolicyValidationError) Error() string { +func (e OrgIamPolicyViewValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -5378,14 +4368,14 @@ func (e OrgIamPolicyValidationError) Error() string { } return fmt.Sprintf( - "invalid %sOrgIamPolicy.%s: %s%s", + "invalid %sOrgIamPolicyView.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = OrgIamPolicyValidationError{} +var _ error = OrgIamPolicyViewValidationError{} var _ interface { Field() string @@ -5393,7 +4383,7 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = OrgIamPolicyValidationError{} +} = OrgIamPolicyViewValidationError{} // Validate checks the field values on OrgCreateRequest with the rules defined // in the proto definition for this message. If any rules are violated, an @@ -7391,6 +6381,10 @@ func (m *ProjectCreateRequest) Validate() error { } } + // no validation rules for ProjectRoleAssertion + + // no validation rules for ProjectRoleCheck + return nil } @@ -7472,6 +6466,10 @@ func (m *ProjectUpdateRequest) Validate() error { } } + // no validation rules for ProjectRoleAssertion + + // no validation rules for ProjectRoleCheck + return nil } @@ -7669,6 +6667,10 @@ func (m *ProjectView) Validate() error { // no validation rules for Sequence + // no validation rules for ProjectRoleAssertion + + // no validation rules for ProjectRoleCheck + return nil } @@ -8008,6 +7010,10 @@ func (m *Project) Validate() error { // no validation rules for Sequence + // no validation rules for ProjectRoleAssertion + + // no validation rules for ProjectRoleCheck + return nil } @@ -9860,6 +8866,12 @@ func (m *OIDCConfig) Validate() error { // no validation rules for DevMode + // no validation rules for AccessTokenType + + // no validation rules for AccessTokenRoleAssertion + + // no validation rules for IdTokenRoleAssertion + return nil } @@ -9947,6 +8959,12 @@ func (m *OIDCApplicationCreate) Validate() error { // no validation rules for DevMode + // no validation rules for AccessTokenType + + // no validation rules for AccessTokenRoleAssertion + + // no validation rules for IdTokenRoleAssertion + return nil } @@ -10034,6 +9052,12 @@ func (m *OIDCConfigUpdate) Validate() error { // no validation rules for DevMode + // no validation rules for AccessTokenType + + // no validation rules for AccessTokenRoleAssertion + + // no validation rules for IdTokenRoleAssertion + return nil } @@ -13447,7 +12471,7 @@ func (m *Idp) Validate() error { // no validation rules for Name - // no validation rules for LogoSrc + // no validation rules for StylingType // no validation rules for Sequence @@ -13545,7 +12569,7 @@ func (m *IdpUpdate) Validate() error { } } - // no validation rules for LogoSrc + // no validation rules for StylingType return nil } @@ -13694,7 +12718,7 @@ func (m *OidcIdpConfigCreate) Validate() error { } } - // no validation rules for LogoSrc + // no validation rules for StylingType if l := utf8.RuneCountInString(m.GetClientId()); l < 1 || l > 200 { return OidcIdpConfigCreateValidationError{ @@ -14007,7 +13031,7 @@ func (m *IdpView) Validate() error { // no validation rules for Name - // no validation rules for LogoSrc + // no validation rules for StylingType // no validation rules for ProviderType @@ -14339,6 +13363,26 @@ func (m *LoginPolicy) Validate() error { // no validation rules for AllowExternalIdp + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return LoginPolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return LoginPolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + return nil } @@ -14396,10 +13440,10 @@ var _ interface { ErrorName() string } = LoginPolicyValidationError{} -// Validate checks the field values on LoginPolicyAdd with the rules defined in -// the proto definition for this message. If any rules are violated, an error -// is returned. -func (m *LoginPolicyAdd) Validate() error { +// Validate checks the field values on LoginPolicyRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *LoginPolicyRequest) Validate() error { if m == nil { return nil } @@ -14413,9 +13457,9 @@ func (m *LoginPolicyAdd) Validate() error { return nil } -// LoginPolicyAddValidationError is the validation error returned by -// LoginPolicyAdd.Validate if the designated constraints aren't met. -type LoginPolicyAddValidationError struct { +// LoginPolicyRequestValidationError is the validation error returned by +// LoginPolicyRequest.Validate if the designated constraints aren't met. +type LoginPolicyRequestValidationError struct { field string reason string cause error @@ -14423,22 +13467,24 @@ type LoginPolicyAddValidationError struct { } // Field function returns field value. -func (e LoginPolicyAddValidationError) Field() string { return e.field } +func (e LoginPolicyRequestValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e LoginPolicyAddValidationError) Reason() string { return e.reason } +func (e LoginPolicyRequestValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e LoginPolicyAddValidationError) Cause() error { return e.cause } +func (e LoginPolicyRequestValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e LoginPolicyAddValidationError) Key() bool { return e.key } +func (e LoginPolicyRequestValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e LoginPolicyAddValidationError) ErrorName() string { return "LoginPolicyAddValidationError" } +func (e LoginPolicyRequestValidationError) ErrorName() string { + return "LoginPolicyRequestValidationError" +} // Error satisfies the builtin error interface -func (e LoginPolicyAddValidationError) Error() string { +func (e LoginPolicyRequestValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -14450,14 +13496,14 @@ func (e LoginPolicyAddValidationError) Error() string { } return fmt.Sprintf( - "invalid %sLoginPolicyAdd.%s: %s%s", + "invalid %sLoginPolicyRequest.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = LoginPolicyAddValidationError{} +var _ error = LoginPolicyRequestValidationError{} var _ interface { Field() string @@ -14465,7 +13511,7 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = LoginPolicyAddValidationError{} +} = LoginPolicyRequestValidationError{} // Validate checks the field values on IdpProviderID with the rules defined in // the proto definition for this message. If any rules are violated, an error @@ -14707,6 +13753,26 @@ func (m *LoginPolicyView) Validate() error { // no validation rules for AllowExternalIdp + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return LoginPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return LoginPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + return nil } @@ -15346,3 +14412,801 @@ var _ interface { Cause() error ErrorName() string } = ExternalIDPRemoveRequestValidationError{} + +// Validate checks the field values on PasswordComplexityPolicy with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordComplexityPolicy) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MinLength + + // no validation rules for HasLowercase + + // no validation rules for HasUppercase + + // no validation rules for HasNumber + + // no validation rules for HasSymbol + + // no validation rules for Sequence + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordComplexityPolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordComplexityPolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// PasswordComplexityPolicyValidationError is the validation error returned by +// PasswordComplexityPolicy.Validate if the designated constraints aren't met. +type PasswordComplexityPolicyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordComplexityPolicyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordComplexityPolicyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordComplexityPolicyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordComplexityPolicyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordComplexityPolicyValidationError) ErrorName() string { + return "PasswordComplexityPolicyValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordComplexityPolicyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordComplexityPolicy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordComplexityPolicyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordComplexityPolicyValidationError{} + +// Validate checks the field values on PasswordComplexityPolicyRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordComplexityPolicyRequest) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MinLength + + // no validation rules for HasLowercase + + // no validation rules for HasUppercase + + // no validation rules for HasNumber + + // no validation rules for HasSymbol + + return nil +} + +// PasswordComplexityPolicyRequestValidationError is the validation error +// returned by PasswordComplexityPolicyRequest.Validate if the designated +// constraints aren't met. +type PasswordComplexityPolicyRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordComplexityPolicyRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordComplexityPolicyRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordComplexityPolicyRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordComplexityPolicyRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordComplexityPolicyRequestValidationError) ErrorName() string { + return "PasswordComplexityPolicyRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordComplexityPolicyRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordComplexityPolicyRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordComplexityPolicyRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordComplexityPolicyRequestValidationError{} + +// Validate checks the field values on PasswordComplexityPolicyView with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordComplexityPolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for Default + + // no validation rules for MinLength + + // no validation rules for HasLowercase + + // no validation rules for HasUppercase + + // no validation rules for HasNumber + + // no validation rules for HasSymbol + + // no validation rules for Sequence + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordComplexityPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordComplexityPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// PasswordComplexityPolicyViewValidationError is the validation error returned +// by PasswordComplexityPolicyView.Validate if the designated constraints +// aren't met. +type PasswordComplexityPolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordComplexityPolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordComplexityPolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordComplexityPolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordComplexityPolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordComplexityPolicyViewValidationError) ErrorName() string { + return "PasswordComplexityPolicyViewValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordComplexityPolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordComplexityPolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordComplexityPolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordComplexityPolicyViewValidationError{} + +// Validate checks the field values on PasswordAgePolicy with the rules defined +// in the proto definition for this message. If any rules are violated, an +// error is returned. +func (m *PasswordAgePolicy) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAgeDays + + // no validation rules for ExpireWarnDays + + // no validation rules for Sequence + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordAgePolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordAgePolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// PasswordAgePolicyValidationError is the validation error returned by +// PasswordAgePolicy.Validate if the designated constraints aren't met. +type PasswordAgePolicyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordAgePolicyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordAgePolicyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordAgePolicyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordAgePolicyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordAgePolicyValidationError) ErrorName() string { + return "PasswordAgePolicyValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordAgePolicyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordAgePolicy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordAgePolicyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordAgePolicyValidationError{} + +// Validate checks the field values on PasswordAgePolicyRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordAgePolicyRequest) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAgeDays + + // no validation rules for ExpireWarnDays + + return nil +} + +// PasswordAgePolicyRequestValidationError is the validation error returned by +// PasswordAgePolicyRequest.Validate if the designated constraints aren't met. +type PasswordAgePolicyRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordAgePolicyRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordAgePolicyRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordAgePolicyRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordAgePolicyRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordAgePolicyRequestValidationError) ErrorName() string { + return "PasswordAgePolicyRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordAgePolicyRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordAgePolicyRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordAgePolicyRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordAgePolicyRequestValidationError{} + +// Validate checks the field values on PasswordAgePolicyView with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordAgePolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for Default + + // no validation rules for MaxAgeDays + + // no validation rules for ExpireWarnDays + + // no validation rules for Sequence + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordAgePolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordAgePolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// PasswordAgePolicyViewValidationError is the validation error returned by +// PasswordAgePolicyView.Validate if the designated constraints aren't met. +type PasswordAgePolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordAgePolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordAgePolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordAgePolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordAgePolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordAgePolicyViewValidationError) ErrorName() string { + return "PasswordAgePolicyViewValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordAgePolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordAgePolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordAgePolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordAgePolicyViewValidationError{} + +// Validate checks the field values on PasswordLockoutPolicy with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordLockoutPolicy) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAttempts + + // no validation rules for ShowLockoutFailure + + // no validation rules for Sequence + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordLockoutPolicyValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordLockoutPolicyValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// PasswordLockoutPolicyValidationError is the validation error returned by +// PasswordLockoutPolicy.Validate if the designated constraints aren't met. +type PasswordLockoutPolicyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordLockoutPolicyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordLockoutPolicyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordLockoutPolicyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordLockoutPolicyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordLockoutPolicyValidationError) ErrorName() string { + return "PasswordLockoutPolicyValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordLockoutPolicyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordLockoutPolicy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordLockoutPolicyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordLockoutPolicyValidationError{} + +// Validate checks the field values on PasswordLockoutPolicyRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordLockoutPolicyRequest) Validate() error { + if m == nil { + return nil + } + + // no validation rules for MaxAttempts + + // no validation rules for ShowLockoutFailure + + return nil +} + +// PasswordLockoutPolicyRequestValidationError is the validation error returned +// by PasswordLockoutPolicyRequest.Validate if the designated constraints +// aren't met. +type PasswordLockoutPolicyRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordLockoutPolicyRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordLockoutPolicyRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordLockoutPolicyRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordLockoutPolicyRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordLockoutPolicyRequestValidationError) ErrorName() string { + return "PasswordLockoutPolicyRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordLockoutPolicyRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordLockoutPolicyRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordLockoutPolicyRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordLockoutPolicyRequestValidationError{} + +// Validate checks the field values on PasswordLockoutPolicyView with the rules +// defined in the proto definition for this message. If any rules are +// violated, an error is returned. +func (m *PasswordLockoutPolicyView) Validate() error { + if m == nil { + return nil + } + + // no validation rules for Default + + // no validation rules for MaxAttempts + + // no validation rules for ShowLockoutFailure + + // no validation rules for Sequence + + if v, ok := interface{}(m.GetCreationDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordLockoutPolicyViewValidationError{ + field: "CreationDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if v, ok := interface{}(m.GetChangeDate()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PasswordLockoutPolicyViewValidationError{ + field: "ChangeDate", + reason: "embedded message failed validation", + cause: err, + } + } + } + + return nil +} + +// PasswordLockoutPolicyViewValidationError is the validation error returned by +// PasswordLockoutPolicyView.Validate if the designated constraints aren't met. +type PasswordLockoutPolicyViewValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PasswordLockoutPolicyViewValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PasswordLockoutPolicyViewValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PasswordLockoutPolicyViewValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PasswordLockoutPolicyViewValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PasswordLockoutPolicyViewValidationError) ErrorName() string { + return "PasswordLockoutPolicyViewValidationError" +} + +// Error satisfies the builtin error interface +func (e PasswordLockoutPolicyViewValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPasswordLockoutPolicyView.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PasswordLockoutPolicyViewValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PasswordLockoutPolicyViewValidationError{} diff --git a/pkg/grpc/management/management.swagger.json b/pkg/grpc/management/management.swagger.json index 27c55b6c34..47ebb9fc93 100644 --- a/pkg/grpc/management/management.swagger.json +++ b/pkg/grpc/management/management.swagger.json @@ -22,13 +22,19 @@ "/global/orgs/_bydomain": { "get": { "summary": "search a organisation by its domain overall organisations", - "operationId": "GetOrgByDomainGlobal", + "operationId": "ManagementService_GetOrgByDomainGlobal", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -44,21 +50,27 @@ ] } }, - "/global/users/_byemail": { + "/global/users/_byloginname": { "get": { - "summary": "GetUserByEmailGlobal returns User, global search is overall organisations", - "operationId": "GetUserByEmailGlobal", + "summary": "GetUserByLoginNameGlobal returns User, global search is overall organisations", + "operationId": "ManagementService_GetUserByLoginNameGlobal", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ { - "name": "email", + "name": "login_name", "in": "query", "required": false, "type": "string" @@ -72,13 +84,19 @@ "/grantedprojects/_search": { "post": { "summary": "returns all projects my organisation got granted from another organisation", - "operationId": "SearchGrantedProjects", + "operationId": "ManagementService_SearchGrantedProjects", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -99,13 +117,19 @@ "/grantedprojects/{project_id}/grants/{id}": { "get": { "summary": "returns a project my organisation got granted from another organisation", - "operationId": "GetGrantedProjectByID", + "operationId": "ManagementService_GetGrantedProjectByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -130,13 +154,19 @@ "/healthz": { "get": { "summary": "READINESS", - "operationId": "Healthz", + "operationId": "ManagementService_Healthz", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -147,13 +177,139 @@ "/iam": { "get": { "summary": "GetIam returns some needed settings of the iam (Global Organisation ID, Zitadel Project ID)", - "operationId": "GetIam", + "operationId": "ManagementService_GetIam", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Iam" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + } + }, + "/orgs": { + "post": { + "operationId": "ManagementService_CreateOrg", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1Org" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OrgCreateRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/default/policies/login": { + "get": { + "operationId": "ManagementService_GetDefaultLoginPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1LoginPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/default/policies/password/age": { + "get": { + "operationId": "ManagementService_GetDefaultPasswordAgePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordAgePolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/default/policies/password/complexity": { + "get": { + "operationId": "ManagementService_GetDefaultPasswordComplexityPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordComplexityPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/default/policies/password/lockout": { + "get": { + "operationId": "ManagementService_GetDefaultPasswordLockoutPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordLockoutPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -163,13 +319,19 @@ }, "/orgs/me": { "get": { - "operationId": "GetMyOrg", + "operationId": "ManagementService_GetMyOrg", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -179,13 +341,19 @@ }, "/orgs/me/_deactivate": { "put": { - "operationId": "DeactivateMyOrg", + "operationId": "ManagementService_DeactivateMyOrg", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Org" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -205,13 +373,19 @@ }, "/orgs/me/_reactivate": { "put": { - "operationId": "ReactivateMyOrg", + "operationId": "ManagementService_ReactivateMyOrg", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Org" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -231,13 +405,19 @@ }, "/orgs/me/domains": { "post": { - "operationId": "AddMyOrgDomain", + "operationId": "ManagementService_AddMyOrgDomain", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgDomain" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -257,13 +437,19 @@ }, "/orgs/me/domains/_search": { "post": { - "operationId": "SearchMyOrgDomains", + "operationId": "ManagementService_SearchMyOrgDomains", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgDomainSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -283,13 +469,19 @@ }, "/orgs/me/domains/{domain}": { "delete": { - "operationId": "RemoveMyOrgDomain", + "operationId": "ManagementService_RemoveMyOrgDomain", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -305,14 +497,126 @@ ] } }, - "/orgs/me/iampolicy": { - "get": { - "operationId": "GetMyOrgIamPolicy", + "/orgs/me/domains/{domain}/_primary": { + "post": { + "operationId": "ManagementService_SetMyPrimaryOrgDomain", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1OrgIamPolicy" + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/domains/{domain}/validation/check": { + "post": { + "operationId": "ManagementService_ValidateMyOrgDomain", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ValidateOrgDomainRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/domains/{domain}/validation/create": { + "post": { + "operationId": "ManagementService_GenerateMyOrgDomainValidation", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1OrgDomainValidationResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OrgDomainValidationRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/iampolicy": { + "get": { + "operationId": "ManagementService_GetMyOrgIamPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1OrgIamPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -321,15 +625,293 @@ ] } }, + "/orgs/me/idps/_search": { + "post": { + "operationId": "ManagementService_SearchIdps", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IdpSearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1IdpSearchRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/idps/oidc": { + "post": { + "operationId": "ManagementService_CreateOidcIdp", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1Idp" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OidcIdpConfigCreate" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/idps/{idp_id}/oidcconfig": { + "put": { + "operationId": "ManagementService_UpdateOidcIdpConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1OidcIdpConfig" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "idp_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OidcIdpConfigUpdate" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/idps/{id}": { + "get": { + "operationId": "ManagementService_IdpByID", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IdpView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + }, + "delete": { + "operationId": "ManagementService_RemoveIdpConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + }, + "put": { + "operationId": "ManagementService_UpdateIdpConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1Idp" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1IdpUpdate" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/idps/{id}/_deactivate": { + "put": { + "operationId": "ManagementService_DeactivateIdpConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1Idp" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1IdpID" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/idps/{id}/_reactivate": { + "put": { + "operationId": "ManagementService_ReactivateIdpConfig", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1Idp" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1IdpID" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, "/orgs/me/members": { "post": { - "operationId": "AddMyOrgMember", + "operationId": "ManagementService_AddMyOrgMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -349,13 +931,19 @@ }, "/orgs/me/members/_search": { "post": { - "operationId": "SearchMyOrgMembers", + "operationId": "ManagementService_SearchMyOrgMembers", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgMemberSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -375,13 +963,19 @@ }, "/orgs/me/members/{user_id}": { "delete": { - "operationId": "RemoveMyOrgMember", + "operationId": "ManagementService_RemoveMyOrgMember", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -397,13 +991,19 @@ ] }, "put": { - "operationId": "ChangeMyOrgMember", + "operationId": "ManagementService_ChangeMyOrgMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -427,15 +1027,523 @@ ] } }, + "/orgs/me/policies/login": { + "get": { + "operationId": "ManagementService_GetLoginPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1LoginPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "delete": { + "operationId": "ManagementService_RemoveLoginPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "post": { + "operationId": "ManagementService_CreateLoginPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1LoginPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1LoginPolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + }, + "put": { + "operationId": "ManagementService_UpdateLoginPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1LoginPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1LoginPolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/policies/login/idpproviders": { + "post": { + "operationId": "ManagementService_AddIdpProviderToLoginPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IdpProvider" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1IdpProviderAdd" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/policies/login/idpproviders/_search": { + "post": { + "operationId": "ManagementService_GetLoginPolicyIdpProviders", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1IdpProviderSearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1IdpProviderSearchRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/policies/login/idpproviders/{idp_config_id}": { + "delete": { + "operationId": "ManagementService_RemoveIdpProviderFromLoginPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "idp_config_id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/policies/password/age": { + "get": { + "operationId": "ManagementService_GetPasswordAgePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordAgePolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "delete": { + "operationId": "ManagementService_RemovePasswordAgePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "post": { + "operationId": "ManagementService_CreatePasswordAgePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordAgePolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1PasswordAgePolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + }, + "put": { + "operationId": "ManagementService_UpdatePasswordAgePolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordAgePolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1PasswordAgePolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/policies/password/complexity": { + "get": { + "operationId": "ManagementService_GetPasswordComplexityPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordComplexityPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "delete": { + "operationId": "ManagementService_RemovePasswordComplexityPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "post": { + "operationId": "ManagementService_CreatePasswordComplexityPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordComplexityPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1PasswordComplexityPolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + }, + "put": { + "operationId": "ManagementService_UpdatePasswordComplexityPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordComplexityPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1PasswordComplexityPolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/orgs/me/policies/password/lockout": { + "get": { + "operationId": "ManagementService_GetPasswordLockoutPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordLockoutPolicyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "delete": { + "operationId": "ManagementService_RemovePasswordLockoutPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + }, + "post": { + "operationId": "ManagementService_CreatePasswordLockoutPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordLockoutPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1PasswordLockoutPolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + }, + "put": { + "operationId": "ManagementService_UpdatePasswordLockoutPolicy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1PasswordLockoutPolicy" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1PasswordLockoutPolicyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, "/orgs/members/roles": { "get": { - "operationId": "GetOrgMemberRoles", + "operationId": "ManagementService_GetOrgMemberRoles", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OrgMemberRoles" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -446,13 +1554,19 @@ "/orgs/{id}/changes": { "get": { "summary": "OrgChanges returns the event stream of the org object", - "operationId": "OrgChanges", + "operationId": "ManagementService_OrgChanges", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Changes" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -486,511 +1600,7 @@ "name": "asc", "in": "query", "required": false, - "type": "boolean", - "format": "boolean" - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/policies/passwords/age": { - "get": { - "summary": "returns default if nothing other set on organisation", - "operationId": "GetPasswordAgePolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordAgePolicy" - } - } - }, - "tags": [ - "ManagementService" - ] - }, - "delete": { - "operationId": "DeletePasswordAgePolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "properties": {} - } - } - }, - "parameters": [ - { - "name": "id", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "ManagementService" - ] - }, - "post": { - "operationId": "CreatePasswordAgePolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordAgePolicy" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1PasswordAgePolicyCreate" - } - } - ], - "tags": [ - "ManagementService" - ] - }, - "put": { - "operationId": "UpdatePasswordAgePolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordAgePolicy" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1PasswordAgePolicyUpdate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/policies/passwords/complexity": { - "get": { - "summary": "returns default policy if nothing other set on organisation", - "operationId": "GetPasswordComplexityPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordComplexityPolicy" - } - } - }, - "tags": [ - "ManagementService" - ] - }, - "delete": { - "operationId": "DeletePasswordComplexityPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "properties": {} - } - } - }, - "parameters": [ - { - "name": "id", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "ManagementService" - ] - }, - "post": { - "operationId": "CreatePasswordComplexityPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordComplexityPolicy" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1PasswordComplexityPolicyCreate" - } - } - ], - "tags": [ - "ManagementService" - ] - }, - "put": { - "operationId": "UpdatePasswordComplexityPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordComplexityPolicy" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1PasswordComplexityPolicyUpdate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/policies/passwords/lockout": { - "get": { - "summary": "returns default if nothing other set on organisation", - "operationId": "GetPasswordLockoutPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordLockoutPolicy" - } - } - }, - "tags": [ - "ManagementService" - ] - }, - "delete": { - "operationId": "DeletePasswordLockoutPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "properties": {} - } - } - }, - "parameters": [ - { - "name": "id", - "in": "query", - "required": false, - "type": "string" - } - ], - "tags": [ - "ManagementService" - ] - }, - "post": { - "operationId": "CreatePasswordLockoutPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordLockoutPolicy" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1PasswordLockoutPolicyCreate" - } - } - ], - "tags": [ - "ManagementService" - ] - }, - "put": { - "operationId": "UpdatePasswordLockoutPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1PasswordLockoutPolicy" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1PasswordLockoutPolicyUpdate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projectgrants/{project_grant_id}/users/grants/_search": { - "post": { - "summary": "search user grants based on a projectgrant\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "SearchProjectGrantUserGrants", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrantSearchResponse" - } - } - }, - "parameters": [ - { - "name": "project_grant_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectGrantUserGrantSearchRequest" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projectgrants/{project_grant_id}/users/{user_id}/grants": { - "post": { - "summary": "create user grant based on a projectgrant\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "CreateProjectGrantUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_grant_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectGrantUserGrantCreate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projectgrants/{project_grant_id}/users/{user_id}/grants/{id}": { - "get": { - "summary": "get user grant based on a projectgrant\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "ProjectGrantUserGrantByID", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrantView" - } - } - }, - "parameters": [ - { - "name": "project_grant_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "ManagementService" - ] - }, - "put": { - "summary": "update user grant based on a projectgrant\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "UpdateProjectGrantUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_grant_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectGrantUserGrantUpdate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projectgrants/{project_grant_id}/users/{user_id}/grants/{id}/_deactivate": { - "put": { - "summary": "deactivate user grant based on a projectgrant\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "DeactivateProjectGrantUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_grant_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectGrantUserGrantID" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projectgrants/{project_grant_id}/users/{user_id}/grants/{id}/_reactivate": { - "put": { - "summary": "reactivate user grant based on a projectgrant\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "ReactivateProjectGrantUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_grant_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectGrantUserGrantID" - } + "type": "boolean" } ], "tags": [ @@ -1000,13 +1610,19 @@ }, "/projects": { "post": { - "operationId": "CreateProject", + "operationId": "ManagementService_CreateProject", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Project" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1026,13 +1642,19 @@ }, "/projects/_search": { "post": { - "operationId": "SearchProjects", + "operationId": "ManagementService_SearchProjects", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1052,13 +1674,19 @@ }, "/projects/grants/members/roles": { "get": { - "operationId": "GetProjectGrantMemberRoles", + "operationId": "ManagementService_GetProjectGrantMemberRoles", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantMemberRoles" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -1068,13 +1696,19 @@ }, "/projects/members/roles": { "get": { - "operationId": "GetProjectMemberRoles", + "operationId": "ManagementService_GetProjectMemberRoles", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectMemberRoles" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -1084,13 +1718,47 @@ }, "/projects/{id}": { "get": { - "operationId": "ProjectByID", + "operationId": "ManagementService_ProjectByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + }, + "delete": { + "operationId": "ManagementService_RemoveProject", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1106,13 +1774,19 @@ ] }, "put": { - "operationId": "UpdateProject", + "operationId": "ManagementService_UpdateProject", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Project" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1138,13 +1812,19 @@ }, "/projects/{id}/_deactivate": { "put": { - "operationId": "DeactivateProject", + "operationId": "ManagementService_DeactivateProject", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Project" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1170,13 +1850,19 @@ }, "/projects/{id}/_reactivate": { "put": { - "operationId": "ReactivateProject", + "operationId": "ManagementService_ReactivateProject", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Project" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1203,13 +1889,19 @@ "/projects/{id}/applications/{sec_id}/changes": { "get": { "summary": "ApplicationChanges returns the event stream of the application object", - "operationId": "ApplicationChanges", + "operationId": "ManagementService_ApplicationChanges", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Changes" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1243,8 +1935,7 @@ "name": "asc", "in": "query", "required": false, - "type": "boolean", - "format": "boolean" + "type": "boolean" } ], "tags": [ @@ -1255,13 +1946,19 @@ "/projects/{id}/changes": { "get": { "summary": "ProjectChanges returns the event stream of the project object", - "operationId": "ProjectChanges", + "operationId": "ManagementService_ProjectChanges", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Changes" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1295,8 +1992,7 @@ "name": "asc", "in": "query", "required": false, - "type": "boolean", - "format": "boolean" + "type": "boolean" } ], "tags": [ @@ -1306,13 +2002,19 @@ }, "/projects/{id}/members": { "post": { - "operationId": "AddProjectMember", + "operationId": "ManagementService_AddProjectMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1338,13 +2040,19 @@ }, "/projects/{id}/members/{user_id}": { "delete": { - "operationId": "RemoveProjectMember", + "operationId": "ManagementService_RemoveProjectMember", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1366,13 +2074,19 @@ ] }, "put": { - "operationId": "ChangeProjectMember", + "operationId": "ManagementService_ChangeProjectMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1404,13 +2118,19 @@ }, "/projects/{id}/roles": { "post": { - "operationId": "AddProjectRole", + "operationId": "ManagementService_AddProjectRole", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectRole" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1437,13 +2157,19 @@ "/projects/{id}/roles/_bulk": { "post": { "summary": "add a list of project roles in one request", - "operationId": "BulkAddProjectRole", + "operationId": "ManagementService_BulkAddProjectRole", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1470,13 +2196,19 @@ "/projects/{id}/roles/{key}": { "delete": { "summary": "RemoveProjectRole removes role from UserGrants, ProjectGrants and from Project", - "operationId": "RemoveProjectRole", + "operationId": "ManagementService_RemoveProjectRole", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1498,13 +2230,19 @@ ] }, "put": { - "operationId": "ChangeProjectRole", + "operationId": "ManagementService_ChangeProjectRole", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectRole" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1536,13 +2274,19 @@ }, "/projects/{project_id}/applications/_search": { "post": { - "operationId": "SearchApplications", + "operationId": "ManagementService_SearchApplications", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ApplicationSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1566,15 +2310,59 @@ ] } }, + "/projects/{project_id}/applications/oidc": { + "post": { + "operationId": "ManagementService_CreateOIDCApplication", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1Application" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1OIDCApplicationCreate" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, "/projects/{project_id}/applications/{application_id}/oidcconfig": { "put": { - "operationId": "UpdateApplicationOIDCConfig", + "operationId": "ManagementService_UpdateApplicationOIDCConfig", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1OIDCConfig" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1606,13 +2394,19 @@ }, "/projects/{project_id}/applications/{id}": { "get": { - "operationId": "ApplicationByID", + "operationId": "ManagementService_ApplicationByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ApplicationView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1634,13 +2428,19 @@ ] }, "delete": { - "operationId": "RemoveApplication", + "operationId": "ManagementService_RemoveApplication", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1662,13 +2462,19 @@ ] }, "put": { - "operationId": "UpdateApplication", + "operationId": "ManagementService_UpdateApplication", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Application" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1700,13 +2506,19 @@ }, "/projects/{project_id}/applications/{id}/_deactivate": { "put": { - "operationId": "DeactivateApplication", + "operationId": "ManagementService_DeactivateApplication", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Application" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1738,13 +2550,19 @@ }, "/projects/{project_id}/applications/{id}/_reactivate": { "put": { - "operationId": "ReactivateApplication", + "operationId": "ManagementService_ReactivateApplication", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Application" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1776,13 +2594,19 @@ }, "/projects/{project_id}/applications/{id}/oidcconfig/_changeclientsecret": { "put": { - "operationId": "RegenerateOIDCClientSecret", + "operationId": "ManagementService_RegenerateOIDCClientSecret", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ClientSecret" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1814,13 +2638,19 @@ }, "/projects/{project_id}/grants": { "post": { - "operationId": "CreateProjectGrant", + "operationId": "ManagementService_CreateProjectGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1846,13 +2676,19 @@ }, "/projects/{project_id}/grants/_search": { "post": { - "operationId": "SearchProjectGrants", + "operationId": "ManagementService_SearchProjectGrants", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1878,13 +2714,19 @@ }, "/projects/{project_id}/grants/{grant_id}/members": { "post": { - "operationId": "AddProjectGrantMember", + "operationId": "ManagementService_AddProjectGrantMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1916,13 +2758,19 @@ }, "/projects/{project_id}/grants/{grant_id}/members/_search": { "post": { - "operationId": "SearchProjectGrantMembers", + "operationId": "ManagementService_SearchProjectGrantMembers", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantMemberSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1954,13 +2802,19 @@ }, "/projects/{project_id}/grants/{grant_id}/members/{user_id}": { "delete": { - "operationId": "RemoveProjectGrantMember", + "operationId": "ManagementService_RemoveProjectGrantMember", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1988,13 +2842,19 @@ ] }, "put": { - "operationId": "ChangeProjectGrantMember", + "operationId": "ManagementService_ChangeProjectGrantMember", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantMember" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2032,13 +2892,19 @@ }, "/projects/{project_id}/grants/{id}": { "get": { - "operationId": "ProjectGrantByID", + "operationId": "ManagementService_ProjectGrantByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrantView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2061,13 +2927,19 @@ }, "delete": { "summary": "RemoveProjectGrant removes project grant and all user grants for this project grant", - "operationId": "RemoveProjectGrant", + "operationId": "ManagementService_RemoveProjectGrant", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2089,13 +2961,19 @@ ] }, "put": { - "operationId": "UpdateProjectGrant", + "operationId": "ManagementService_UpdateProjectGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2127,13 +3005,19 @@ }, "/projects/{project_id}/grants/{id}/_deactivate": { "put": { - "operationId": "DeactivateProjectGrant", + "operationId": "ManagementService_DeactivateProjectGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2165,13 +3049,19 @@ }, "/projects/{project_id}/grants/{id}/_reactivate": { "put": { - "operationId": "ReactivateProjectGrant", + "operationId": "ManagementService_ReactivateProjectGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2203,13 +3093,19 @@ }, "/projects/{project_id}/members/_search": { "post": { - "operationId": "SearchProjectMembers", + "operationId": "ManagementService_SearchProjectMembers", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectMemberSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2233,47 +3129,21 @@ ] } }, - "/projects/{project_id}/oidcapplications": { - "post": { - "operationId": "CreateOIDCApplication", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1Application" - } - } - }, - "parameters": [ - { - "name": "project_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1OIDCApplicationCreate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, "/projects/{project_id}/roles/_search": { "post": { - "operationId": "SearchProjectRoles", + "operationId": "ManagementService_SearchProjectRoles", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1ProjectRoleSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2297,311 +3167,23 @@ ] } }, - "/projects/{project_id}/users/grants/_search": { - "post": { - "summary": "search user grants based on a project\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "SearchProjectUserGrants", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrantSearchResponse" - } - } - }, - "parameters": [ - { - "name": "project_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectUserGrantSearchRequest" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projects/{project_id}/users/{user_id}/grants": { - "post": { - "summary": "create user grant based on a project\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "CreateProjectUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1UserGrantCreate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projects/{project_id}/users/{user_id}/grants/{id}": { - "get": { - "summary": "get user grant based on a project\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "ProjectUserGrantByID", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrantView" - } - } - }, - "parameters": [ - { - "name": "project_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "ManagementService" - ] - }, - "put": { - "summary": "update user grant based on a project\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "UpdateProjectUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectUserGrantUpdate" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projects/{project_id}/users/{user_id}/grants/{id}/_deactivate": { - "put": { - "summary": "deactivate user grant based on a project\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "DeactivateProjectUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectUserGrantID" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, - "/projects/{project_id}/users/{user_id}/grants/{id}/_reactivate": { - "put": { - "summary": "reactivate user grant based on a project\nThis request is required that the user authorizations of zitadel can be differentiated", - "operationId": "ReactivateProjectUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/v1UserGrant" - } - } - }, - "parameters": [ - { - "name": "project_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "user_id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1ProjectUserGrantID" - } - } - ], - "tags": [ - "ManagementService" - ] - } - }, "/ready": { "get": { - "operationId": "Ready", + "operationId": "ManagementService_Ready", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } - } - }, - "tags": [ - "ManagementService" - ] - } - }, - "/usergrants/_bulk": { - "post": { - "summary": "add a list of user grants in one request", - "operationId": "BulkCreateUserGrant", - "responses": { - "200": { - "description": "A successful response.", + }, + "default": { + "description": "An unexpected error response.", "schema": { - "properties": {} + "$ref": "#/definitions/runtimeError" } } }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1UserGrantCreateBulk" - } - } - ], - "tags": [ - "ManagementService" - ] - }, - "put": { - "summary": "update a list of user grants in one request", - "operationId": "BulkUpdateUserGrant", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "properties": {} - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/v1UserGrantUpdateBulk" - } - } - ], "tags": [ "ManagementService" ] @@ -2609,12 +3191,18 @@ }, "/users": { "post": { - "operationId": "CreateUser", + "operationId": "ManagementService_CreateUser", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1User" + "$ref": "#/definitions/v1UserResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -2635,13 +3223,19 @@ }, "/users/_isunique": { "get": { - "operationId": "IsUserUnique", + "operationId": "ManagementService_IsUserUnique", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UniqueUserResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2666,13 +3260,19 @@ "/users/_search": { "post": { "summary": "Limit should always be set, there is a default limit set by the service", - "operationId": "SearchUsers", + "operationId": "ManagementService_SearchUsers", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2692,13 +3292,19 @@ }, "/users/grants/_search": { "post": { - "operationId": "SearchUserGrants", + "operationId": "ManagementService_SearchUserGrants", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserGrantSearchResponse" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2718,13 +3324,19 @@ }, "/users/{id}": { "get": { - "operationId": "GetUserByID", + "operationId": "ManagementService_GetUserByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2740,13 +3352,19 @@ ] }, "delete": { - "operationId": "DeleteUser", + "operationId": "ManagementService_DeleteUser", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2764,12 +3382,18 @@ }, "/users/{id}/_deactivate": { "put": { - "operationId": "DeactivateUser", + "operationId": "ManagementService_DeactivateUser", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1User" + "$ref": "#/definitions/v1UserResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -2796,12 +3420,18 @@ }, "/users/{id}/_lock": { "put": { - "operationId": "LockUser", + "operationId": "ManagementService_LockUser", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1User" + "$ref": "#/definitions/v1UserResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -2828,12 +3458,18 @@ }, "/users/{id}/_reactivate": { "put": { - "operationId": "ReactivateUser", + "operationId": "ManagementService_ReactivateUser", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1User" + "$ref": "#/definitions/v1UserResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -2860,12 +3496,18 @@ }, "/users/{id}/_unlock": { "put": { - "operationId": "UnlockUser", + "operationId": "ManagementService_UnlockUser", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v1User" + "$ref": "#/definitions/v1UserResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -2892,13 +3534,19 @@ }, "/users/{id}/address": { "get": { - "operationId": "GetUserAddress", + "operationId": "ManagementService_GetUserAddress", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserAddressView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2914,13 +3562,19 @@ ] }, "put": { - "operationId": "UpdateUserAddress", + "operationId": "ManagementService_UpdateUserAddress", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserAddress" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2947,13 +3601,19 @@ "/users/{id}/changes": { "get": { "summary": "UserChanges returns the event stream of the user object", - "operationId": "UserChanges", + "operationId": "ManagementService_UserChanges", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1Changes" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2987,8 +3647,7 @@ "name": "asc", "in": "query", "required": false, - "type": "boolean", - "format": "boolean" + "type": "boolean" } ], "tags": [ @@ -2998,13 +3657,19 @@ }, "/users/{id}/email": { "get": { - "operationId": "GetUserEmail", + "operationId": "ManagementService_GetUserEmail", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserEmailView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3020,13 +3685,19 @@ ] }, "put": { - "operationId": "ChangeUserEmail", + "operationId": "ManagementService_ChangeUserEmail", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserEmail" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3052,13 +3723,19 @@ }, "/users/{id}/email/_resendverification": { "post": { - "operationId": "ResendEmailVerificationMail", + "operationId": "ManagementService_ResendEmailVerificationMail", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3082,15 +3759,59 @@ ] } }, + "/users/{id}/machine": { + "put": { + "operationId": "ManagementService_UpdateUserMachine", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1MachineResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UpdateMachineRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, "/users/{id}/mfas": { "get": { - "operationId": "GetUserMfas", + "operationId": "ManagementService_GetUserMfas", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1MultiFactors" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3109,13 +3830,19 @@ "/users/{id}/password/_initialize": { "post": { "summary": "A Manager is only allowed to set an initial password, on the next login the user has to change his password", - "operationId": "SetInitialPassword", + "operationId": "ManagementService_SetInitialPassword", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3142,13 +3869,19 @@ "/users/{id}/password/_sendsetnotification": { "post": { "summary": "Sends an Notification (Email/SMS) with a password reset Link", - "operationId": "SendSetPasswordNotification", + "operationId": "ManagementService_SendSetPasswordNotification", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3174,13 +3907,19 @@ }, "/users/{id}/phone": { "get": { - "operationId": "GetUserPhone", + "operationId": "ManagementService_GetUserPhone", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserPhoneView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3196,13 +3935,19 @@ ] }, "delete": { - "operationId": "RemoveUserPhone", + "operationId": "ManagementService_RemoveUserPhone", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3218,13 +3963,19 @@ ] }, "put": { - "operationId": "ChangeUserPhone", + "operationId": "ManagementService_ChangeUserPhone", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserPhone" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3250,13 +4001,19 @@ }, "/users/{id}/phone/_resendverification": { "post": { - "operationId": "ResendPhoneVerificationCode", + "operationId": "ManagementService_ResendPhoneVerificationCode", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3282,13 +4039,19 @@ }, "/users/{id}/profile": { "get": { - "operationId": "GetUserProfile", + "operationId": "ManagementService_GetUserProfile", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserProfileView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3304,13 +4067,19 @@ ] }, "put": { - "operationId": "UpdateUserProfile", + "operationId": "ManagementService_UpdateUserProfile", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserProfile" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3334,15 +4103,137 @@ ] } }, + "/users/{id}/username": { + "get": { + "operationId": "ManagementService_ChangeUserUserName", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "user_name", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/users/{user_id}/externalidps/_search": { + "post": { + "operationId": "ManagementService_SearchUserExternalIDPs", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ExternalIDPSearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1ExternalIDPSearchRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/users/{user_id}/externalidps/{idp_config_id}/{external_user_id}": { + "delete": { + "operationId": "ManagementService_RemoveExternalIDP", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "idp_config_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "external_user_id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + } + }, "/users/{user_id}/grants": { "post": { - "operationId": "CreateUserGrant", + "operationId": "ManagementService_CreateUserGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3368,13 +4259,19 @@ }, "/users/{user_id}/grants/{id}": { "get": { - "operationId": "UserGrantByID", + "operationId": "ManagementService_UserGrantByID", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserGrantView" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3396,13 +4293,19 @@ ] }, "delete": { - "operationId": "RemoveUserGrant", + "operationId": "ManagementService_RemoveUserGrant", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3424,13 +4327,19 @@ ] }, "put": { - "operationId": "UpdateUserGrant", + "operationId": "ManagementService_UpdateUserGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3462,13 +4371,19 @@ }, "/users/{user_id}/grants/{id}/_deactivate": { "put": { - "operationId": "DeactivateUserGrant", + "operationId": "ManagementService_DeactivateUserGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3500,13 +4415,19 @@ }, "/users/{user_id}/grants/{id}/_reactivate": { "put": { - "operationId": "ReactivateUserGrant", + "operationId": "ManagementService_ReactivateUserGrant", "responses": { "200": { "description": "A successful response.", "schema": { "$ref": "#/definitions/v1UserGrant" } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3536,16 +4457,206 @@ ] } }, - "/usersgrants/_bulk": { + "/users/{user_id}/keys": { + "post": { + "operationId": "ManagementService_AddMachineKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1AddMachineKeyResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1AddMachineKeyRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/users/{user_id}/keys/_search": { + "post": { + "operationId": "ManagementService_SearchMachineKeys", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1MachineKeySearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1MachineKeySearchRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/users/{user_id}/keys/{key_id}": { + "get": { + "operationId": "ManagementService_GetMachineKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1MachineKeyView" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "key_id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + }, "delete": { - "summary": "remove a list of user grants in one request", - "operationId": "BulkRemoveUserGrant", + "operationId": "ManagementService_DeleteMachineKey", "responses": { "200": { "description": "A successful response.", "schema": { "properties": {} } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "key_id", + "in": "path", + "required": true, + "type": "string" + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/users/{user_id}/memberships/_search": { + "post": { + "operationId": "ManagementService_SearchUserMemberships", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1UserMembershipSearchResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1UserMembershipSearchRequest" + } + } + ], + "tags": [ + "ManagementService" + ] + } + }, + "/usersgrants/_bulk": { + "delete": { + "summary": "remove a list of user grants in one request", + "operationId": "ManagementService_BulkRemoveUserGrant", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -3565,12 +4676,40 @@ }, "/validate": { "get": { - "operationId": "Validate", + "operationId": "ManagementService_Validate", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/protobufStruct" + "type": "object" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "ManagementService" + ] + } + }, + "/zitadel/docs": { + "get": { + "operationId": "ManagementService_GetZitadelDocs", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1ZitadelDocs" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -3581,18 +4720,20 @@ } }, "definitions": { - "protobufListValue": { + "protobufAny": { "type": "object", "properties": { - "values": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufValue" - }, - "description": "Repeated field of dynamically typed values." + "type_url": { + "type": "string", + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." + }, + "value": { + "type": "string", + "format": "byte", + "description": "Must be a valid serialized protocol buffer of the above specified type." } }, - "description": "`ListValue` is a wrapper around a repeated field of values.\n\nThe JSON representation for `ListValue` is JSON array." + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" }, "protobufNullValue": { "type": "string", @@ -3602,50 +4743,68 @@ "default": "NULL_VALUE", "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." }, - "protobufStruct": { + "runtimeError": { "type": "object", "properties": { - "fields": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/protobufValue" - }, - "description": "Unordered map of dynamically typed values." + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } } - }, - "description": "`Struct` represents a structured data value, consisting of fields\nwhich map to dynamically typed values. In some languages, `Struct`\nmight be supported by a native representation. For example, in\nscripting languages like JS a struct is represented as an\nobject. The details of that representation are described together\nwith the proto support for the language.\n\nThe JSON representation for `Struct` is JSON object." + } }, - "protobufValue": { + "v1AddMachineKeyRequest": { "type": "object", "properties": { - "null_value": { - "$ref": "#/definitions/protobufNullValue", - "description": "Represents a null value." + "user_id": { + "type": "string" }, - "number_value": { - "type": "number", - "format": "double", - "description": "Represents a double value." + "type": { + "$ref": "#/definitions/v1MachineKeyType" }, - "string_value": { + "expiration_date": { "type": "string", - "description": "Represents a string value." - }, - "bool_value": { - "type": "boolean", - "format": "boolean", - "description": "Represents a boolean value." - }, - "struct_value": { - "$ref": "#/definitions/protobufStruct", - "description": "Represents a structured value." - }, - "list_value": { - "$ref": "#/definitions/protobufListValue", - "description": "Represents a repeated `Value`." + "format": "date-time" } - }, - "description": "`Value` represents a dynamically typed value which can be either\nnull, a number, a string, a boolean, a recursive struct value, or a\nlist of values. A producer of value is expected to set one of that\nvariants, absence of any variant indicates an error.\n\nThe JSON representation for `Value` is JSON value." + } + }, + "v1AddMachineKeyResponse": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "sequence": { + "type": "string", + "format": "uint64" + }, + "type": { + "$ref": "#/definitions/v1MachineKeyType" + }, + "expiration_date": { + "type": "string", + "format": "date-time" + }, + "key_details": { + "type": "string", + "format": "byte" + } + } }, "v1AddOrgDomainRequest": { "type": "object", @@ -3782,6 +4941,14 @@ "items": { "$ref": "#/definitions/v1ApplicationView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -3849,7 +5016,7 @@ "type": "string" }, "data": { - "$ref": "#/definitions/protobufStruct" + "type": "object" } } }, @@ -3894,12 +5061,9 @@ } } }, - "v1CreateUserRequest": { + "v1CreateHumanRequest": { "type": "object", "properties": { - "user_name": { - "type": "string" - }, "first_name": { "type": "string" }, @@ -3919,15 +5083,13 @@ "type": "string" }, "is_email_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "phone": { "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "country": { "type": "string" @@ -3949,6 +5111,106 @@ } } }, + "v1CreateMachineRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "v1CreateUserRequest": { + "type": "object", + "properties": { + "user_name": { + "type": "string" + }, + "human": { + "$ref": "#/definitions/v1CreateHumanRequest" + }, + "machine": { + "$ref": "#/definitions/v1CreateMachineRequest" + } + } + }, + "v1ExternalIDPSearchRequest": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "user_id": { + "type": "string" + } + } + }, + "v1ExternalIDPSearchResponse": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "total_result": { + "type": "string", + "format": "uint64" + }, + "result": { + "type": "array", + "items": { + "$ref": "#/definitions/v1ExternalIDPView" + } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" + } + } + }, + "v1ExternalIDPView": { + "type": "object", + "properties": { + "user_id": { + "type": "string" + }, + "idp_config_id": { + "type": "string" + }, + "external_user_id": { + "type": "string" + }, + "idp_name": { + "type": "string" + }, + "external_user_display_name": { + "type": "string" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, "v1Gender": { "type": "string", "enum": [ @@ -3978,6 +5240,110 @@ } } }, + "v1HumanResponse": { + "type": "object", + "properties": { + "first_name": { + "type": "string" + }, + "last_name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "nick_name": { + "type": "string" + }, + "preferred_language": { + "type": "string" + }, + "gender": { + "$ref": "#/definitions/v1Gender" + }, + "email": { + "type": "string" + }, + "is_email_verified": { + "type": "boolean" + }, + "phone": { + "type": "string" + }, + "is_phone_verified": { + "type": "boolean" + }, + "country": { + "type": "string" + }, + "locality": { + "type": "string" + }, + "postal_code": { + "type": "string" + }, + "region": { + "type": "string" + }, + "street_address": { + "type": "string" + } + } + }, + "v1HumanView": { + "type": "object", + "properties": { + "password_changed": { + "type": "string", + "format": "date-time" + }, + "first_name": { + "type": "string" + }, + "last_name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "nick_name": { + "type": "string" + }, + "preferred_language": { + "type": "string" + }, + "gender": { + "$ref": "#/definitions/v1Gender" + }, + "email": { + "type": "string" + }, + "is_email_verified": { + "type": "boolean" + }, + "phone": { + "type": "string" + }, + "is_phone_verified": { + "type": "boolean" + }, + "country": { + "type": "string" + }, + "locality": { + "type": "string" + }, + "postal_code": { + "type": "string" + }, + "region": { + "type": "string" + }, + "street_address": { + "type": "string" + } + } + }, "v1Iam": { "type": "object", "properties": { @@ -3988,12 +5354,297 @@ "type": "string" }, "set_up_done": { - "type": "boolean", - "format": "boolean" + "$ref": "#/definitions/v1IamSetupStep" }, "set_up_started": { - "type": "boolean", - "format": "boolean" + "$ref": "#/definitions/v1IamSetupStep" + } + } + }, + "v1IamSetupStep": { + "type": "string", + "enum": [ + "iam_setup_step_UNDEFINED", + "iam_setup_step_1", + "iam_setup_step_2" + ], + "default": "iam_setup_step_UNDEFINED" + }, + "v1Idp": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "state": { + "$ref": "#/definitions/v1IdpState" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" + }, + "oidc_config": { + "$ref": "#/definitions/v1OidcIdpConfig" + }, + "sequence": { + "type": "string", + "format": "uint64" + } + } + }, + "v1IdpID": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "v1IdpProvider": { + "type": "object", + "properties": { + "idp_config_id": { + "type": "string" + }, + "idp_provider_Type": { + "$ref": "#/definitions/v1IdpProviderType" + } + } + }, + "v1IdpProviderAdd": { + "type": "object", + "properties": { + "idp_config_id": { + "type": "string" + }, + "idp_provider_type": { + "$ref": "#/definitions/v1IdpProviderType" + } + } + }, + "v1IdpProviderSearchRequest": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + } + } + }, + "v1IdpProviderSearchResponse": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "total_result": { + "type": "string", + "format": "uint64" + }, + "result": { + "type": "array", + "items": { + "$ref": "#/definitions/v1IdpProviderView" + } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" + } + } + }, + "v1IdpProviderType": { + "type": "string", + "enum": [ + "IDPPROVIDERTYPE_UNSPECIFIED", + "IDPPROVIDERTYPE_SYSTEM", + "IDPPROVIDERTYPE_ORG" + ], + "default": "IDPPROVIDERTYPE_UNSPECIFIED" + }, + "v1IdpProviderView": { + "type": "object", + "properties": { + "idp_config_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/v1IdpType" + } + } + }, + "v1IdpSearchKey": { + "type": "string", + "enum": [ + "IDPSEARCHKEY_UNSPECIFIED", + "IDPSEARCHKEY_IDP_CONFIG_ID", + "IDPSEARCHKEY_NAME", + "IDPSEARCHKEY_PROVIDER_TYPE" + ], + "default": "IDPSEARCHKEY_UNSPECIFIED" + }, + "v1IdpSearchQuery": { + "type": "object", + "properties": { + "key": { + "$ref": "#/definitions/v1IdpSearchKey" + }, + "method": { + "$ref": "#/definitions/v1SearchMethod" + }, + "value": { + "type": "string" + } + } + }, + "v1IdpSearchRequest": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "queries": { + "type": "array", + "items": { + "$ref": "#/definitions/v1IdpSearchQuery" + } + } + } + }, + "v1IdpSearchResponse": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "total_result": { + "type": "string", + "format": "uint64" + }, + "result": { + "type": "array", + "items": { + "$ref": "#/definitions/v1IdpView" + } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" + } + } + }, + "v1IdpState": { + "type": "string", + "enum": [ + "IDPCONFIGSTATE_UNSPECIFIED", + "IDPCONFIGSTATE_ACTIVE", + "IDPCONFIGSTATE_INACTIVE" + ], + "default": "IDPCONFIGSTATE_UNSPECIFIED" + }, + "v1IdpStylingType": { + "type": "string", + "enum": [ + "IDPSTYLINGTYPE_UNSPECIFIED", + "IDPSTYLINGTYPE_GOOGLE" + ], + "default": "IDPSTYLINGTYPE_UNSPECIFIED" + }, + "v1IdpType": { + "type": "string", + "enum": [ + "IDPTYPE_UNSPECIFIED", + "IDPTYPE_OIDC", + "IDPTYPE_SAML" + ], + "default": "IDPTYPE_UNSPECIFIED" + }, + "v1IdpUpdate": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" + } + } + }, + "v1IdpView": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "state": { + "$ref": "#/definitions/v1IdpState" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" + }, + "provider_type": { + "$ref": "#/definitions/v1IdpProviderType" + }, + "oidc_config": { + "$ref": "#/definitions/v1OidcIdpConfigView" + }, + "sequence": { + "type": "string", + "format": "uint64" } } }, @@ -4008,6 +5659,67 @@ } } }, + "v1LoginPolicy": { + "type": "object", + "properties": { + "allow_username_password": { + "type": "boolean" + }, + "allow_register": { + "type": "boolean" + }, + "allow_external_idp": { + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1LoginPolicyRequest": { + "type": "object", + "properties": { + "allow_username_password": { + "type": "boolean" + }, + "allow_register": { + "type": "boolean" + }, + "allow_external_idp": { + "type": "boolean" + } + } + }, + "v1LoginPolicyView": { + "type": "object", + "properties": { + "default": { + "type": "boolean" + }, + "allow_username_password": { + "type": "boolean" + }, + "allow_register": { + "type": "boolean" + }, + "allow_external_idp": { + "type": "boolean" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + } + } + }, "v1MFAState": { "type": "string", "enum": [ @@ -4018,6 +5730,123 @@ ], "default": "MFASTATE_UNSPECIFIED" }, + "v1MachineKeySearchRequest": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "asc": { + "type": "boolean" + }, + "user_id": { + "type": "string" + } + } + }, + "v1MachineKeySearchResponse": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "total_result": { + "type": "string", + "format": "uint64" + }, + "result": { + "type": "array", + "items": { + "$ref": "#/definitions/v1MachineKeyView" + } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" + } + } + }, + "v1MachineKeyType": { + "type": "string", + "enum": [ + "MACHINEKEY_UNSPECIFIED", + "MACHINEKEY_JSON" + ], + "default": "MACHINEKEY_UNSPECIFIED" + }, + "v1MachineKeyView": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/v1MachineKeyType" + }, + "sequence": { + "type": "string", + "format": "uint64" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "expiration_date": { + "type": "string", + "format": "date-time" + } + } + }, + "v1MachineResponse": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "v1MachineView": { + "type": "object", + "properties": { + "last_key_added": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "v1MemberType": { + "type": "string", + "enum": [ + "MEMBERTYPE_UNSPECIFIED", + "MEMBERTYPE_ORGANISATION", + "MEMBERTYPE_PROJECT", + "MEMBERTYPE_PROJECT_GRANT" + ], + "default": "MEMBERTYPE_UNSPECIFIED" + }, "v1MfaType": { "type": "string", "enum": [ @@ -4095,6 +5924,21 @@ "items": { "type": "string" } + }, + "version": { + "$ref": "#/definitions/v1OIDCVersion" + }, + "dev_mode": { + "type": "boolean" + }, + "access_token_type": { + "$ref": "#/definitions/v1OIDCTokenType" + }, + "access_token_role_assertion": { + "type": "boolean" + }, + "id_token_role_assertion": { + "type": "boolean" } } }, @@ -4154,6 +5998,30 @@ "items": { "type": "string" } + }, + "version": { + "$ref": "#/definitions/v1OIDCVersion" + }, + "none_compliant": { + "type": "boolean" + }, + "compliance_problems": { + "type": "array", + "items": { + "$ref": "#/definitions/v1LocalizedMessage" + } + }, + "dev_mode": { + "type": "boolean" + }, + "access_token_type": { + "$ref": "#/definitions/v1OIDCTokenType" + }, + "access_token_role_assertion": { + "type": "boolean" + }, + "id_token_role_assertion": { + "type": "boolean" } } }, @@ -4195,6 +6063,18 @@ "items": { "type": "string" } + }, + "dev_mode": { + "type": "boolean" + }, + "access_token_type": { + "$ref": "#/definitions/v1OIDCTokenType" + }, + "access_token_role_assertion": { + "type": "boolean" + }, + "id_token_role_assertion": { + "type": "boolean" } } }, @@ -4207,15 +6087,149 @@ ], "default": "OIDCGRANTTYPE_AUTHORIZATION_CODE" }, + "v1OIDCMappingField": { + "type": "string", + "enum": [ + "OIDCMAPPINGFIELD_UNSPECIFIED", + "OIDCMAPPINGFIELD_PREFERRED_USERNAME", + "OIDCMAPPINGFIELD_EMAIL" + ], + "default": "OIDCMAPPINGFIELD_UNSPECIFIED" + }, "v1OIDCResponseType": { "type": "string", "enum": [ "OIDCRESPONSETYPE_CODE", "OIDCRESPONSETYPE_ID_TOKEN", - "OIDCRESPONSETYPE_TOKEN" + "OIDCRESPONSETYPE_ID_TOKEN_TOKEN" ], "default": "OIDCRESPONSETYPE_CODE" }, + "v1OIDCTokenType": { + "type": "string", + "enum": [ + "OIDCTokenType_Bearer", + "OIDCTokenType_JWT" + ], + "default": "OIDCTokenType_Bearer" + }, + "v1OIDCVersion": { + "type": "string", + "enum": [ + "OIDCV1_0" + ], + "default": "OIDCV1_0" + }, + "v1OidcIdpConfig": { + "type": "object", + "properties": { + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + }, + "issuer": { + "type": "string" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "idp_display_name_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + }, + "username_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + } + } + }, + "v1OidcIdpConfigCreate": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "styling_type": { + "$ref": "#/definitions/v1IdpStylingType" + }, + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + }, + "issuer": { + "type": "string" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "idp_display_name_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + }, + "username_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + } + } + }, + "v1OidcIdpConfigUpdate": { + "type": "object", + "properties": { + "idp_id": { + "type": "string" + }, + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + }, + "issuer": { + "type": "string" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "idp_display_name_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + }, + "username_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + } + } + }, + "v1OidcIdpConfigView": { + "type": "object", + "properties": { + "client_id": { + "type": "string" + }, + "issuer": { + "type": "string" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "idp_display_name_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + }, + "username_mapping": { + "$ref": "#/definitions/v1OIDCMappingField" + } + } + }, "v1Org": { "type": "object", "properties": { @@ -4242,6 +6256,14 @@ } } }, + "v1OrgCreateRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, "v1OrgDomain": { "type": "object", "properties": { @@ -4260,12 +6282,10 @@ "type": "string" }, "verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "primary": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -4334,9 +6354,48 @@ "items": { "$ref": "#/definitions/v1OrgDomainView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, + "v1OrgDomainValidationRequest": { + "type": "object", + "properties": { + "domain": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/v1OrgDomainValidationType" + } + } + }, + "v1OrgDomainValidationResponse": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "v1OrgDomainValidationType": { + "type": "string", + "enum": [ + "ORGDOMAINVALIDATIONTYPE_UNSPECIFIED", + "ORGDOMAINVALIDATIONTYPE_HTTP", + "ORGDOMAINVALIDATIONTYPE_DNS" + ], + "default": "ORGDOMAINVALIDATIONTYPE_UNSPECIFIED" + }, "v1OrgDomainView": { "type": "object", "properties": { @@ -4355,35 +6414,28 @@ "type": "string" }, "verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "primary": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", "format": "uint64" + }, + "validation_type": { + "$ref": "#/definitions/v1OrgDomainValidationType" } } }, - "v1OrgIamPolicy": { + "v1OrgIamPolicyView": { "type": "object", "properties": { - "org_id": { - "type": "string" - }, - "description": { - "type": "string" - }, "user_login_must_be_domain": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "default": { - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -4488,6 +6540,14 @@ "items": { "$ref": "#/definitions/v1OrgMemberView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -4526,6 +6586,9 @@ }, "last_name": { "type": "string" + }, + "display_name": { + "type": "string" } } }, @@ -4567,14 +6630,17 @@ "v1PasswordAgePolicy": { "type": "object", "properties": { - "id": { - "type": "string" + "max_age_days": { + "type": "string", + "format": "uint64" }, - "description": { - "type": "string" + "expire_warn_days": { + "type": "string", + "format": "uint64" }, - "state": { - "$ref": "#/definitions/v1PolicyState" + "sequence": { + "type": "string", + "format": "uint64" }, "creation_date": { "type": "string", @@ -4583,6 +6649,27 @@ "change_date": { "type": "string", "format": "date-time" + } + } + }, + "v1PasswordAgePolicyRequest": { + "type": "object", + "properties": { + "max_age_days": { + "type": "string", + "format": "uint64" + }, + "expire_warn_days": { + "type": "string", + "format": "uint64" + } + } + }, + "v1PasswordAgePolicyView": { + "type": "object", + "properties": { + "default": { + "type": "boolean" }, "max_age_days": { "type": "string", @@ -4596,58 +6683,38 @@ "type": "string", "format": "uint64" }, - "is_default": { - "type": "boolean", - "format": "boolean" - } - } - }, - "v1PasswordAgePolicyCreate": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "max_age_days": { + "creation_date": { "type": "string", - "format": "uint64" + "format": "date-time" }, - "expire_warn_days": { + "change_date": { "type": "string", - "format": "uint64" - } - } - }, - "v1PasswordAgePolicyUpdate": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "description": { - "type": "string" - }, - "max_age_days": { - "type": "string", - "format": "uint64" - }, - "expire_warn_days": { - "type": "string", - "format": "uint64" + "format": "date-time" } } }, "v1PasswordComplexityPolicy": { "type": "object", "properties": { - "id": { - "type": "string" + "min_length": { + "type": "string", + "format": "uint64" }, - "description": { - "type": "string" + "has_lowercase": { + "type": "boolean" }, - "state": { - "$ref": "#/definitions/v1PolicyState" + "has_uppercase": { + "type": "boolean" + }, + "has_number": { + "type": "boolean" + }, + "has_symbol": { + "type": "boolean" + }, + "sequence": { + "type": "string", + "format": "uint64" }, "creation_date": { "type": "string", @@ -4656,107 +6723,79 @@ "change_date": { "type": "string", "format": "date-time" + } + } + }, + "v1PasswordComplexityPolicyRequest": { + "type": "object", + "properties": { + "min_length": { + "type": "string", + "format": "uint64" + }, + "has_lowercase": { + "type": "boolean" + }, + "has_uppercase": { + "type": "boolean" + }, + "has_number": { + "type": "boolean" + }, + "has_symbol": { + "type": "boolean" + } + } + }, + "v1PasswordComplexityPolicyView": { + "type": "object", + "properties": { + "default": { + "type": "boolean" }, "min_length": { "type": "string", "format": "uint64" }, "has_lowercase": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "has_uppercase": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "has_number": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "has_symbol": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", "format": "uint64" }, - "is_default": { - "type": "boolean", - "format": "boolean" - } - } - }, - "v1PasswordComplexityPolicyCreate": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "min_length": { + "creation_date": { "type": "string", - "format": "uint64" + "format": "date-time" }, - "has_lowercase": { - "type": "boolean", - "format": "boolean" - }, - "has_uppercase": { - "type": "boolean", - "format": "boolean" - }, - "has_number": { - "type": "boolean", - "format": "boolean" - }, - "has_symbol": { - "type": "boolean", - "format": "boolean" - } - } - }, - "v1PasswordComplexityPolicyUpdate": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "description": { - "type": "string" - }, - "min_length": { + "change_date": { "type": "string", - "format": "uint64" - }, - "has_lowercase": { - "type": "boolean", - "format": "boolean" - }, - "has_uppercase": { - "type": "boolean", - "format": "boolean" - }, - "has_number": { - "type": "boolean", - "format": "boolean" - }, - "has_symbol": { - "type": "boolean", - "format": "boolean" + "format": "date-time" } } }, "v1PasswordLockoutPolicy": { "type": "object", "properties": { - "id": { - "type": "string" + "max_attempts": { + "type": "string", + "format": "uint64" }, - "description": { - "type": "string" + "show_lockout_failure": { + "type": "boolean" }, - "state": { - "$ref": "#/definitions/v1PolicyState" + "sequence": { + "type": "string", + "format": "uint64" }, "creation_date": { "type": "string", @@ -4765,57 +6804,45 @@ "change_date": { "type": "string", "format": "date-time" + } + } + }, + "v1PasswordLockoutPolicyRequest": { + "type": "object", + "properties": { + "max_attempts": { + "type": "string", + "format": "uint64" + }, + "show_lockout_failure": { + "type": "boolean" + } + } + }, + "v1PasswordLockoutPolicyView": { + "type": "object", + "properties": { + "default": { + "type": "boolean" }, "max_attempts": { "type": "string", "format": "uint64" }, - "show_lock_out_failures": { - "type": "boolean", - "format": "boolean" + "show_lockout_failure": { + "type": "boolean" }, "sequence": { "type": "string", "format": "uint64" }, - "is_default": { - "type": "boolean", - "format": "boolean" - } - } - }, - "v1PasswordLockoutPolicyCreate": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "max_attempts": { + "creation_date": { "type": "string", - "format": "uint64" + "format": "date-time" }, - "show_lock_out_failures": { - "type": "boolean", - "format": "boolean" - } - } - }, - "v1PasswordLockoutPolicyUpdate": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "description": { - "type": "string" - }, - "max_attempts": { + "change_date": { "type": "string", - "format": "uint64" - }, - "show_lock_out_failures": { - "type": "boolean", - "format": "boolean" + "format": "date-time" } } }, @@ -4830,16 +6857,6 @@ } } }, - "v1PolicyState": { - "type": "string", - "enum": [ - "POLICYSTATE_UNSPECIFIED", - "POLICYSTATE_ACTIVE", - "POLICYSTATE_INACTIVE", - "POLICYSTATE_DELETED" - ], - "default": "POLICYSTATE_UNSPECIFIED" - }, "v1Project": { "type": "object", "properties": { @@ -4863,6 +6880,12 @@ "sequence": { "type": "string", "format": "uint64" + }, + "project_role_assertion": { + "type": "boolean" + }, + "project_role_check": { + "type": "boolean" } } }, @@ -4871,6 +6894,12 @@ "properties": { "name": { "type": "string" + }, + "project_role_assertion": { + "type": "boolean" + }, + "project_role_check": { + "type": "boolean" } } }, @@ -5085,6 +7114,14 @@ "items": { "$ref": "#/definitions/v1ProjectGrantMemberView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -5123,6 +7160,9 @@ "sequence": { "type": "string", "format": "uint64" + }, + "display_name": { + "type": "string" } } }, @@ -5191,6 +7231,14 @@ "items": { "$ref": "#/definitions/v1ProjectGrantView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -5220,82 +7268,6 @@ } } }, - "v1ProjectGrantUserGrantCreate": { - "type": "object", - "properties": { - "user_id": { - "type": "string" - }, - "project_grant_id": { - "type": "string" - }, - "project_id": { - "type": "string" - }, - "role_keys": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "v1ProjectGrantUserGrantID": { - "type": "object", - "properties": { - "project_grant_id": { - "type": "string" - }, - "user_id": { - "type": "string" - }, - "id": { - "type": "string" - } - } - }, - "v1ProjectGrantUserGrantSearchRequest": { - "type": "object", - "properties": { - "project_grant_id": { - "type": "string" - }, - "offset": { - "type": "string", - "format": "uint64" - }, - "limit": { - "type": "string", - "format": "uint64" - }, - "queries": { - "type": "array", - "items": { - "$ref": "#/definitions/v1UserGrantSearchQuery" - } - } - } - }, - "v1ProjectGrantUserGrantUpdate": { - "type": "object", - "properties": { - "project_grant_id": { - "type": "string" - }, - "user_id": { - "type": "string" - }, - "id": { - "type": "string" - }, - "role_keys": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, "v1ProjectGrantView": { "type": "object", "properties": { @@ -5490,6 +7462,14 @@ "items": { "$ref": "#/definitions/v1ProjectMemberView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -5528,6 +7508,9 @@ "sequence": { "type": "string", "format": "uint64" + }, + "display_name": { + "type": "string" } } }, @@ -5673,6 +7656,14 @@ "items": { "$ref": "#/definitions/v1ProjectRoleView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -5762,6 +7753,14 @@ "items": { "$ref": "#/definitions/v1ProjectView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -5782,62 +7781,12 @@ }, "name": { "type": "string" - } - } - }, - "v1ProjectUserGrantID": { - "type": "object", - "properties": { - "project_id": { - "type": "string" }, - "user_id": { - "type": "string" + "project_role_assertion": { + "type": "boolean" }, - "id": { - "type": "string" - } - } - }, - "v1ProjectUserGrantSearchRequest": { - "type": "object", - "properties": { - "project_id": { - "type": "string" - }, - "offset": { - "type": "string", - "format": "uint64" - }, - "limit": { - "type": "string", - "format": "uint64" - }, - "queries": { - "type": "array", - "items": { - "$ref": "#/definitions/v1UserGrantSearchQuery" - } - } - } - }, - "v1ProjectUserGrantUpdate": { - "type": "object", - "properties": { - "project_id": { - "type": "string" - }, - "user_id": { - "type": "string" - }, - "id": { - "type": "string" - }, - "role_keys": { - "type": "array", - "items": { - "type": "string" - } + "project_role_check": { + "type": "boolean" } } }, @@ -5867,6 +7816,12 @@ "sequence": { "type": "string", "format": "uint64" + }, + "project_role_assertion": { + "type": "boolean" + }, + "project_role_check": { + "type": "boolean" } } }, @@ -5902,8 +7857,18 @@ "type": "object", "properties": { "is_unique": { - "type": "boolean", - "format": "boolean" + "type": "boolean" + } + } + }, + "v1UpdateMachineRequest": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "description": { + "type": "string" } } }, @@ -5940,8 +7905,7 @@ "type": "string" }, "is_email_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -5955,8 +7919,7 @@ "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -5983,79 +7946,6 @@ } } }, - "v1User": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "state": { - "$ref": "#/definitions/v1UserState" - }, - "creation_date": { - "type": "string", - "format": "date-time" - }, - "change_date": { - "type": "string", - "format": "date-time" - }, - "user_name": { - "type": "string" - }, - "first_name": { - "type": "string" - }, - "last_name": { - "type": "string" - }, - "display_name": { - "type": "string" - }, - "nick_name": { - "type": "string" - }, - "preferred_language": { - "type": "string" - }, - "gender": { - "$ref": "#/definitions/v1Gender" - }, - "email": { - "type": "string" - }, - "is_email_verified": { - "type": "boolean", - "format": "boolean" - }, - "phone": { - "type": "string" - }, - "is_phone_verified": { - "type": "boolean", - "format": "boolean" - }, - "country": { - "type": "string" - }, - "locality": { - "type": "string" - }, - "postal_code": { - "type": "string" - }, - "region": { - "type": "string" - }, - "street_address": { - "type": "string" - }, - "sequence": { - "type": "string", - "format": "uint64" - } - } - }, "v1UserAddress": { "type": "object", "properties": { @@ -6136,8 +8026,7 @@ "type": "string" }, "is_email_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -6163,8 +8052,7 @@ "type": "string" }, "is_email_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -6215,6 +8103,9 @@ "sequence": { "type": "string", "format": "uint64" + }, + "grant_id": { + "type": "string" } } }, @@ -6232,17 +8123,9 @@ "items": { "type": "string" } - } - } - }, - "v1UserGrantCreateBulk": { - "type": "object", - "properties": { - "user_grants": { - "type": "array", - "items": { - "$ref": "#/definitions/v1UserGrantCreate" - } + }, + "grant_id": { + "type": "string" } } }, @@ -6275,7 +8158,8 @@ "USERGRANTSEARCHKEY_PROJECT_ID", "USERGRANTSEARCHKEY_USER_ID", "USERGRANTSEARCHKEY_ORG_ID", - "USERGRANTSEARCHKEY_ROLE_KEY" + "USERGRANTSEARCHKEY_ROLE_KEY", + "USERGRANTSEARCHKEY_GRANT_ID" ], "default": "USERGRANTSEARCHKEY_UNSPECIFIED" }, @@ -6332,6 +8216,14 @@ "items": { "$ref": "#/definitions/v1UserGrantView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -6361,17 +8253,6 @@ } } }, - "v1UserGrantUpdateBulk": { - "type": "object", - "properties": { - "user_grants": { - "type": "array", - "items": { - "$ref": "#/definitions/v1UserGrantUpdate" - } - } - } - }, "v1UserGrantView": { "type": "object", "properties": { @@ -6434,6 +8315,9 @@ }, "display_name": { "type": "string" + }, + "grant_id": { + "type": "string" } } }, @@ -6445,6 +8329,123 @@ } } }, + "v1UserMembershipSearchKey": { + "type": "string", + "enum": [ + "USERMEMBERSHIPSEARCHKEY_UNSPECIFIED", + "USERMEMBERSHIPSEARCHKEY_TYPE", + "USERMEMBERSHIPSEARCHKEY_OBJECT_ID" + ], + "default": "USERMEMBERSHIPSEARCHKEY_UNSPECIFIED" + }, + "v1UserMembershipSearchQuery": { + "type": "object", + "properties": { + "key": { + "$ref": "#/definitions/v1UserMembershipSearchKey" + }, + "method": { + "$ref": "#/definitions/v1SearchMethod" + }, + "value": { + "type": "string" + } + } + }, + "v1UserMembershipSearchRequest": { + "type": "object", + "properties": { + "user_id": { + "type": "string" + }, + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "queries": { + "type": "array", + "items": { + "$ref": "#/definitions/v1UserMembershipSearchQuery" + } + } + } + }, + "v1UserMembershipSearchResponse": { + "type": "object", + "properties": { + "offset": { + "type": "string", + "format": "uint64" + }, + "limit": { + "type": "string", + "format": "uint64" + }, + "total_result": { + "type": "string", + "format": "uint64" + }, + "result": { + "type": "array", + "items": { + "$ref": "#/definitions/v1UserMembershipView" + } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" + } + } + }, + "v1UserMembershipView": { + "type": "object", + "properties": { + "user_id": { + "type": "string" + }, + "member_type": { + "$ref": "#/definitions/v1MemberType" + }, + "aggregate_id": { + "type": "string" + }, + "object_id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "display_name": { + "type": "string" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + }, + "sequence": { + "type": "string", + "format": "uint64" + }, + "resource_owner": { + "type": "string" + } + } + }, "v1UserPhone": { "type": "object", "properties": { @@ -6455,8 +8456,7 @@ "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -6482,8 +8482,7 @@ "type": "string" }, "is_phone_verified": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sequence": { "type": "string", @@ -6523,9 +8522,6 @@ "gender": { "$ref": "#/definitions/v1Gender" }, - "user_name": { - "type": "string" - }, "sequence": { "type": "string", "format": "uint64" @@ -6564,9 +8560,6 @@ "gender": { "$ref": "#/definitions/v1Gender" }, - "user_name": { - "type": "string" - }, "sequence": { "type": "string", "format": "uint64" @@ -6590,6 +8583,38 @@ } } }, + "v1UserResponse": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "state": { + "$ref": "#/definitions/v1UserState" + }, + "creation_date": { + "type": "string", + "format": "date-time" + }, + "change_date": { + "type": "string", + "format": "date-time" + }, + "sequence": { + "type": "string", + "format": "uint64" + }, + "user_name": { + "type": "string" + }, + "human": { + "$ref": "#/definitions/v1HumanResponse" + }, + "machine": { + "$ref": "#/definitions/v1MachineResponse" + } + } + }, "v1UserSearchKey": { "type": "string", "enum": [ @@ -6600,7 +8625,8 @@ "USERSEARCHKEY_NICK_NAME", "USERSEARCHKEY_DISPLAY_NAME", "USERSEARCHKEY_EMAIL", - "USERSEARCHKEY_STATE" + "USERSEARCHKEY_STATE", + "USERSEARCHKEY_TYPE" ], "default": "USERSEARCHKEY_UNSPECIFIED" }, @@ -6633,8 +8659,7 @@ "$ref": "#/definitions/v1UserSearchKey" }, "asc": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "queries": { "type": "array", @@ -6664,6 +8689,14 @@ "items": { "$ref": "#/definitions/v1UserView" } + }, + "processed_sequence": { + "type": "string", + "format": "uint64" + }, + "view_timestamp": { + "type": "string", + "format": "date-time" } } }, @@ -6697,71 +8730,10 @@ "type": "string", "format": "date-time" }, - "last_login": { - "type": "string", - "format": "date-time" - }, - "password_changed": { - "type": "string", - "format": "date-time" - }, - "user_name": { - "type": "string" - }, - "first_name": { - "type": "string" - }, - "last_name": { - "type": "string" - }, - "display_name": { - "type": "string" - }, - "nick_name": { - "type": "string" - }, - "preferred_language": { - "type": "string" - }, - "gender": { - "$ref": "#/definitions/v1Gender" - }, - "email": { - "type": "string" - }, - "is_email_verified": { - "type": "boolean", - "format": "boolean" - }, - "phone": { - "type": "string" - }, - "is_phone_verified": { - "type": "boolean", - "format": "boolean" - }, - "country": { - "type": "string" - }, - "locality": { - "type": "string" - }, - "postal_code": { - "type": "string" - }, - "region": { - "type": "string" - }, - "street_address": { - "type": "string" - }, "sequence": { "type": "string", "format": "uint64" }, - "resource_owner": { - "type": "string" - }, "login_names": { "type": "array", "items": { @@ -6770,6 +8742,41 @@ }, "preferred_login_name": { "type": "string" + }, + "last_login": { + "type": "string", + "format": "date-time" + }, + "resource_owner": { + "type": "string" + }, + "user_name": { + "type": "string" + }, + "human": { + "$ref": "#/definitions/v1HumanView" + }, + "machine": { + "$ref": "#/definitions/v1MachineView" + } + } + }, + "v1ValidateOrgDomainRequest": { + "type": "object", + "properties": { + "domain": { + "type": "string" + } + } + }, + "v1ZitadelDocs": { + "type": "object", + "properties": { + "issuer": { + "type": "string" + }, + "discovery_endpoint": { + "type": "string" } } } diff --git a/pkg/grpc/management/mock/management.proto.mock.go b/pkg/grpc/management/mock/management.proto.mock.go index df4a94be84..65c155cb75 100644 --- a/pkg/grpc/management/mock/management.proto.mock.go +++ b/pkg/grpc/management/mock/management.proto.mock.go @@ -398,7 +398,7 @@ func (mr *MockManagementServiceClientMockRecorder) ChangeUserUserName(arg0, arg1 } // CreateLoginPolicy mocks base method -func (m *MockManagementServiceClient) CreateLoginPolicy(arg0 context.Context, arg1 *management.LoginPolicyAdd, arg2 ...grpc.CallOption) (*management.LoginPolicy, error) { +func (m *MockManagementServiceClient) CreateLoginPolicy(arg0 context.Context, arg1 *management.LoginPolicyRequest, arg2 ...grpc.CallOption) (*management.LoginPolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -478,7 +478,7 @@ func (mr *MockManagementServiceClientMockRecorder) CreateOrg(arg0, arg1 interfac } // CreatePasswordAgePolicy mocks base method -func (m *MockManagementServiceClient) CreatePasswordAgePolicy(arg0 context.Context, arg1 *management.PasswordAgePolicyCreate, arg2 ...grpc.CallOption) (*management.PasswordAgePolicy, error) { +func (m *MockManagementServiceClient) CreatePasswordAgePolicy(arg0 context.Context, arg1 *management.PasswordAgePolicyRequest, arg2 ...grpc.CallOption) (*management.PasswordAgePolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -498,7 +498,7 @@ func (mr *MockManagementServiceClientMockRecorder) CreatePasswordAgePolicy(arg0, } // CreatePasswordComplexityPolicy mocks base method -func (m *MockManagementServiceClient) CreatePasswordComplexityPolicy(arg0 context.Context, arg1 *management.PasswordComplexityPolicyCreate, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicy, error) { +func (m *MockManagementServiceClient) CreatePasswordComplexityPolicy(arg0 context.Context, arg1 *management.PasswordComplexityPolicyRequest, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -518,7 +518,7 @@ func (mr *MockManagementServiceClientMockRecorder) CreatePasswordComplexityPolic } // CreatePasswordLockoutPolicy mocks base method -func (m *MockManagementServiceClient) CreatePasswordLockoutPolicy(arg0 context.Context, arg1 *management.PasswordLockoutPolicyCreate, arg2 ...grpc.CallOption) (*management.PasswordLockoutPolicy, error) { +func (m *MockManagementServiceClient) CreatePasswordLockoutPolicy(arg0 context.Context, arg1 *management.PasswordLockoutPolicyRequest, arg2 ...grpc.CallOption) (*management.PasswordLockoutPolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -777,66 +777,6 @@ func (mr *MockManagementServiceClientMockRecorder) DeleteMachineKey(arg0, arg1 i return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteMachineKey", reflect.TypeOf((*MockManagementServiceClient)(nil).DeleteMachineKey), varargs...) } -// DeletePasswordAgePolicy mocks base method -func (m *MockManagementServiceClient) DeletePasswordAgePolicy(arg0 context.Context, arg1 *management.PasswordAgePolicyID, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "DeletePasswordAgePolicy", varargs...) - ret0, _ := ret[0].(*emptypb.Empty) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeletePasswordAgePolicy indicates an expected call of DeletePasswordAgePolicy -func (mr *MockManagementServiceClientMockRecorder) DeletePasswordAgePolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePasswordAgePolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).DeletePasswordAgePolicy), varargs...) -} - -// DeletePasswordComplexityPolicy mocks base method -func (m *MockManagementServiceClient) DeletePasswordComplexityPolicy(arg0 context.Context, arg1 *management.PasswordComplexityPolicyID, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "DeletePasswordComplexityPolicy", varargs...) - ret0, _ := ret[0].(*emptypb.Empty) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeletePasswordComplexityPolicy indicates an expected call of DeletePasswordComplexityPolicy -func (mr *MockManagementServiceClientMockRecorder) DeletePasswordComplexityPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePasswordComplexityPolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).DeletePasswordComplexityPolicy), varargs...) -} - -// DeletePasswordLockoutPolicy mocks base method -func (m *MockManagementServiceClient) DeletePasswordLockoutPolicy(arg0 context.Context, arg1 *management.PasswordLockoutPolicyID, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { - m.ctrl.T.Helper() - varargs := []interface{}{arg0, arg1} - for _, a := range arg2 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "DeletePasswordLockoutPolicy", varargs...) - ret0, _ := ret[0].(*emptypb.Empty) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeletePasswordLockoutPolicy indicates an expected call of DeletePasswordLockoutPolicy -func (mr *MockManagementServiceClientMockRecorder) DeletePasswordLockoutPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{arg0, arg1}, arg2...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePasswordLockoutPolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).DeletePasswordLockoutPolicy), varargs...) -} - // DeleteUser mocks base method func (m *MockManagementServiceClient) DeleteUser(arg0 context.Context, arg1 *management.UserID, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { m.ctrl.T.Helper() @@ -877,15 +817,55 @@ func (mr *MockManagementServiceClientMockRecorder) GenerateMyOrgDomainValidation return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateMyOrgDomainValidation", reflect.TypeOf((*MockManagementServiceClient)(nil).GenerateMyOrgDomainValidation), varargs...) } +// GetDefaultLoginPolicy mocks base method +func (m *MockManagementServiceClient) GetDefaultLoginPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.LoginPolicyView, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDefaultLoginPolicy", varargs...) + ret0, _ := ret[0].(*management.LoginPolicyView) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDefaultLoginPolicy indicates an expected call of GetDefaultLoginPolicy +func (mr *MockManagementServiceClientMockRecorder) GetDefaultLoginPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultLoginPolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).GetDefaultLoginPolicy), varargs...) +} + +// GetDefaultPasswordAgePolicy mocks base method +func (m *MockManagementServiceClient) GetDefaultPasswordAgePolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordAgePolicyView, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDefaultPasswordAgePolicy", varargs...) + ret0, _ := ret[0].(*management.PasswordAgePolicyView) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDefaultPasswordAgePolicy indicates an expected call of GetDefaultPasswordAgePolicy +func (mr *MockManagementServiceClientMockRecorder) GetDefaultPasswordAgePolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultPasswordAgePolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).GetDefaultPasswordAgePolicy), varargs...) +} + // GetDefaultPasswordComplexityPolicy mocks base method -func (m *MockManagementServiceClient) GetDefaultPasswordComplexityPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicy, error) { +func (m *MockManagementServiceClient) GetDefaultPasswordComplexityPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicyView, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetDefaultPasswordComplexityPolicy", varargs...) - ret0, _ := ret[0].(*management.PasswordComplexityPolicy) + ret0, _ := ret[0].(*management.PasswordComplexityPolicyView) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -897,6 +877,26 @@ func (mr *MockManagementServiceClientMockRecorder) GetDefaultPasswordComplexityP return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultPasswordComplexityPolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).GetDefaultPasswordComplexityPolicy), varargs...) } +// GetDefaultPasswordLockoutPolicy mocks base method +func (m *MockManagementServiceClient) GetDefaultPasswordLockoutPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordLockoutPolicyView, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDefaultPasswordLockoutPolicy", varargs...) + ret0, _ := ret[0].(*management.PasswordLockoutPolicyView) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDefaultPasswordLockoutPolicy indicates an expected call of GetDefaultPasswordLockoutPolicy +func (mr *MockManagementServiceClientMockRecorder) GetDefaultPasswordLockoutPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultPasswordLockoutPolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).GetDefaultPasswordLockoutPolicy), varargs...) +} + // GetGrantedProjectByID mocks base method func (m *MockManagementServiceClient) GetGrantedProjectByID(arg0 context.Context, arg1 *management.ProjectGrantID, arg2 ...grpc.CallOption) (*management.ProjectGrantView, error) { m.ctrl.T.Helper() @@ -1018,14 +1018,14 @@ func (mr *MockManagementServiceClientMockRecorder) GetMyOrg(arg0, arg1 interface } // GetMyOrgIamPolicy mocks base method -func (m *MockManagementServiceClient) GetMyOrgIamPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.OrgIamPolicy, error) { +func (m *MockManagementServiceClient) GetMyOrgIamPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.OrgIamPolicyView, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetMyOrgIamPolicy", varargs...) - ret0, _ := ret[0].(*management.OrgIamPolicy) + ret0, _ := ret[0].(*management.OrgIamPolicyView) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1078,14 +1078,14 @@ func (mr *MockManagementServiceClientMockRecorder) GetOrgMemberRoles(arg0, arg1 } // GetPasswordAgePolicy mocks base method -func (m *MockManagementServiceClient) GetPasswordAgePolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordAgePolicy, error) { +func (m *MockManagementServiceClient) GetPasswordAgePolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordAgePolicyView, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetPasswordAgePolicy", varargs...) - ret0, _ := ret[0].(*management.PasswordAgePolicy) + ret0, _ := ret[0].(*management.PasswordAgePolicyView) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1098,14 +1098,14 @@ func (mr *MockManagementServiceClientMockRecorder) GetPasswordAgePolicy(arg0, ar } // GetPasswordComplexityPolicy mocks base method -func (m *MockManagementServiceClient) GetPasswordComplexityPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicy, error) { +func (m *MockManagementServiceClient) GetPasswordComplexityPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicyView, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetPasswordComplexityPolicy", varargs...) - ret0, _ := ret[0].(*management.PasswordComplexityPolicy) + ret0, _ := ret[0].(*management.PasswordComplexityPolicyView) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1118,14 +1118,14 @@ func (mr *MockManagementServiceClientMockRecorder) GetPasswordComplexityPolicy(a } // GetPasswordLockoutPolicy mocks base method -func (m *MockManagementServiceClient) GetPasswordLockoutPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordLockoutPolicy, error) { +func (m *MockManagementServiceClient) GetPasswordLockoutPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*management.PasswordLockoutPolicyView, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetPasswordLockoutPolicy", varargs...) - ret0, _ := ret[0].(*management.PasswordLockoutPolicy) + ret0, _ := ret[0].(*management.PasswordLockoutPolicyView) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -1817,6 +1817,66 @@ func (mr *MockManagementServiceClientMockRecorder) RemoveMyOrgMember(arg0, arg1 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveMyOrgMember", reflect.TypeOf((*MockManagementServiceClient)(nil).RemoveMyOrgMember), varargs...) } +// RemovePasswordAgePolicy mocks base method +func (m *MockManagementServiceClient) RemovePasswordAgePolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "RemovePasswordAgePolicy", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemovePasswordAgePolicy indicates an expected call of RemovePasswordAgePolicy +func (mr *MockManagementServiceClientMockRecorder) RemovePasswordAgePolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemovePasswordAgePolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).RemovePasswordAgePolicy), varargs...) +} + +// RemovePasswordComplexityPolicy mocks base method +func (m *MockManagementServiceClient) RemovePasswordComplexityPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "RemovePasswordComplexityPolicy", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemovePasswordComplexityPolicy indicates an expected call of RemovePasswordComplexityPolicy +func (mr *MockManagementServiceClientMockRecorder) RemovePasswordComplexityPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemovePasswordComplexityPolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).RemovePasswordComplexityPolicy), varargs...) +} + +// RemovePasswordLockoutPolicy mocks base method +func (m *MockManagementServiceClient) RemovePasswordLockoutPolicy(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "RemovePasswordLockoutPolicy", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RemovePasswordLockoutPolicy indicates an expected call of RemovePasswordLockoutPolicy +func (mr *MockManagementServiceClientMockRecorder) RemovePasswordLockoutPolicy(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemovePasswordLockoutPolicy", reflect.TypeOf((*MockManagementServiceClient)(nil).RemovePasswordLockoutPolicy), varargs...) +} + // RemoveProject mocks base method func (m *MockManagementServiceClient) RemoveProject(arg0 context.Context, arg1 *management.ProjectID, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { m.ctrl.T.Helper() @@ -2438,7 +2498,7 @@ func (mr *MockManagementServiceClientMockRecorder) UpdateIdpConfig(arg0, arg1 in } // UpdateLoginPolicy mocks base method -func (m *MockManagementServiceClient) UpdateLoginPolicy(arg0 context.Context, arg1 *management.LoginPolicy, arg2 ...grpc.CallOption) (*management.LoginPolicy, error) { +func (m *MockManagementServiceClient) UpdateLoginPolicy(arg0 context.Context, arg1 *management.LoginPolicyRequest, arg2 ...grpc.CallOption) (*management.LoginPolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -2478,7 +2538,7 @@ func (mr *MockManagementServiceClientMockRecorder) UpdateOidcIdpConfig(arg0, arg } // UpdatePasswordAgePolicy mocks base method -func (m *MockManagementServiceClient) UpdatePasswordAgePolicy(arg0 context.Context, arg1 *management.PasswordAgePolicyUpdate, arg2 ...grpc.CallOption) (*management.PasswordAgePolicy, error) { +func (m *MockManagementServiceClient) UpdatePasswordAgePolicy(arg0 context.Context, arg1 *management.PasswordAgePolicyRequest, arg2 ...grpc.CallOption) (*management.PasswordAgePolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -2498,7 +2558,7 @@ func (mr *MockManagementServiceClientMockRecorder) UpdatePasswordAgePolicy(arg0, } // UpdatePasswordComplexityPolicy mocks base method -func (m *MockManagementServiceClient) UpdatePasswordComplexityPolicy(arg0 context.Context, arg1 *management.PasswordComplexityPolicyUpdate, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicy, error) { +func (m *MockManagementServiceClient) UpdatePasswordComplexityPolicy(arg0 context.Context, arg1 *management.PasswordComplexityPolicyRequest, arg2 ...grpc.CallOption) (*management.PasswordComplexityPolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -2518,7 +2578,7 @@ func (mr *MockManagementServiceClientMockRecorder) UpdatePasswordComplexityPolic } // UpdatePasswordLockoutPolicy mocks base method -func (m *MockManagementServiceClient) UpdatePasswordLockoutPolicy(arg0 context.Context, arg1 *management.PasswordLockoutPolicyUpdate, arg2 ...grpc.CallOption) (*management.PasswordLockoutPolicy, error) { +func (m *MockManagementServiceClient) UpdatePasswordLockoutPolicy(arg0 context.Context, arg1 *management.PasswordLockoutPolicyRequest, arg2 ...grpc.CallOption) (*management.PasswordLockoutPolicy, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { diff --git a/pkg/grpc/management/proto/generate.go b/pkg/grpc/management/proto/generate.go index 21e94d3e23..d64a5ddfda 100644 --- a/pkg/grpc/management/proto/generate.go +++ b/pkg/grpc/management/proto/generate.go @@ -1,4 +1,4 @@ package proto -//go:generate protoc -I${GOPATH}/src -I../proto -I${GOPATH}/src/github.com/caos/zitadel/pkg/grpc/message -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis -I${GOPATH}/src/github.com/envoyproxy/protoc-gen-validate -I${GOPATH}/src/github.com/caos/zitadel/internal/protoc/protoc-gen-authoption --go_out=plugins=grpc:${GOPATH}/src --grpc-gateway_out=logtostderr=true,allow_delete_body=true:${GOPATH}/src --swagger_out=logtostderr=true,allow_delete_body=true:$GOPATH/src --authoption_out=.. --validate_out=lang=go:${GOPATH}/src management.proto +//go:generate protoc -I${GOPATH}/src -I../proto -I${GOPATH}/src/github.com/caos/zitadel/pkg/grpc/message -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis -I${GOPATH}/src/github.com/envoyproxy/protoc-gen-validate -I${GOPATH}/src/github.com/caos/zitadel/internal/protoc/protoc-gen-authoption --go_out=plugins=grpc:${GOPATH}/src --grpc-gateway_out=logtostderr=true,allow_delete_body=true:${GOPATH}/src --swagger_out=logtostderr=true,allow_delete_body=true:.. --authoption_out=.. --validate_out=lang=go:${GOPATH}/src management.proto //go:generate mockgen -package api -destination ../mock/management.proto.mock.go github.com/caos/zitadel/pkg/grpc/management ManagementServiceClient diff --git a/pkg/grpc/management/proto/management.proto b/pkg/grpc/management/proto/management.proto index 30458fab92..cb6cbef47d 100644 --- a/pkg/grpc/management/proto/management.proto +++ b/pkg/grpc/management/proto/management.proto @@ -435,145 +435,6 @@ rpc GetUserByID(UserID) returns (UserView) { }; } - // returns default policy if nothing other set on organisation - rpc GetPasswordComplexityPolicy(google.protobuf.Empty) returns (PasswordComplexityPolicy) { - option (google.api.http) = { - get: "/policies/passwords/complexity" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.read" - }; - } - - rpc GetDefaultPasswordComplexityPolicy(google.protobuf.Empty) returns (PasswordComplexityPolicy) { - option (google.api.http) = { - get: "/policies/passwords/complexity/default" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.read" - }; - } - - rpc CreatePasswordComplexityPolicy(PasswordComplexityPolicyCreate) returns (PasswordComplexityPolicy) { - option (google.api.http) = { - post: "/policies/passwords/complexity" - body: "*" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.write" - }; - } - - rpc UpdatePasswordComplexityPolicy(PasswordComplexityPolicyUpdate) returns (PasswordComplexityPolicy) { - option (google.api.http) = { - put: "/policies/passwords/complexity" - body: "*" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.write" - }; - } - - rpc DeletePasswordComplexityPolicy(PasswordComplexityPolicyID) returns (google.protobuf.Empty) { - option (google.api.http) = { - delete: "/policies/passwords/complexity" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.delete" - }; - } - - // returns default if nothing other set on organisation - rpc GetPasswordAgePolicy(google.protobuf.Empty) returns (PasswordAgePolicy) { - option (google.api.http) = { - get: "/policies/passwords/age" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.read" - }; - } - - rpc CreatePasswordAgePolicy(PasswordAgePolicyCreate) returns (PasswordAgePolicy) { - option (google.api.http) = { - post: "/policies/passwords/age" - body: "*" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.write" - }; - } - - rpc UpdatePasswordAgePolicy(PasswordAgePolicyUpdate) returns (PasswordAgePolicy) { - option (google.api.http) = { - put: "/policies/passwords/age" - body: "*" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.write" - }; - } - - rpc DeletePasswordAgePolicy(PasswordAgePolicyID) returns (google.protobuf.Empty) { - option (google.api.http) = { - delete: "/policies/passwords/age" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.delete" - }; - } - - // returns default if nothing other set on organisation - rpc GetPasswordLockoutPolicy(google.protobuf.Empty) returns (PasswordLockoutPolicy) { - option (google.api.http) = { - get: "/policies/passwords/lockout" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.read" - }; - } - - rpc CreatePasswordLockoutPolicy(PasswordLockoutPolicyCreate) returns (PasswordLockoutPolicy) { - option (google.api.http) = { - post: "/policies/passwords/lockout" - body: "*" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.write" - }; - } - - rpc UpdatePasswordLockoutPolicy(PasswordLockoutPolicyUpdate) returns (PasswordLockoutPolicy) { - option (google.api.http) = { - put: "/policies/passwords/lockout" - body: "*" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.write" - }; - } - - rpc DeletePasswordLockoutPolicy(PasswordLockoutPolicyID) returns (google.protobuf.Empty) { - option (google.api.http) = { - delete: "/policies/passwords/lockout" - }; - - option (caos.zitadel.utils.v1.auth_option) = { - permission: "policy.delete" - }; - } - rpc CreateOrg(OrgCreateRequest) returns (Org) { option (google.api.http) = { post: "/orgs" @@ -703,7 +564,7 @@ rpc GetUserByID(UserID) returns (UserView) { }; } - rpc GetMyOrgIamPolicy(google.protobuf.Empty) returns (OrgIamPolicy) { + rpc GetMyOrgIamPolicy(google.protobuf.Empty) returns (OrgIamPolicyView) { option (google.api.http) = { get: "/orgs/me/iampolicy" }; @@ -1418,7 +1279,6 @@ rpc GetUserByID(UserID) returns (UserView) { }; } - rpc GetLoginPolicy(google.protobuf.Empty) returns (LoginPolicyView) { option (google.api.http) = { get: "/orgs/me/policies/login" @@ -1429,7 +1289,17 @@ rpc GetUserByID(UserID) returns (UserView) { }; } - rpc CreateLoginPolicy(LoginPolicyAdd) returns (LoginPolicy) { + rpc GetDefaultLoginPolicy(google.protobuf.Empty) returns (LoginPolicyView) { + option (google.api.http) = { + get: "/orgs/default/policies/login" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.read" + }; + } + + rpc CreateLoginPolicy(LoginPolicyRequest) returns (LoginPolicy) { option (google.api.http) = { post: "/orgs/me/policies/login" body: "*" @@ -1440,7 +1310,7 @@ rpc GetUserByID(UserID) returns (UserView) { }; } - rpc UpdateLoginPolicy(LoginPolicy) returns (LoginPolicy) { + rpc UpdateLoginPolicy(LoginPolicyRequest) returns (LoginPolicy) { option (google.api.http) = { put: "/orgs/me/policies/login" body: "*" @@ -1485,7 +1355,37 @@ rpc GetUserByID(UserID) returns (UserView) { rpc RemoveIdpProviderFromLoginPolicy(IdpProviderID) returns (google.protobuf.Empty) { option (google.api.http) = { - post: "/orgs/me/policies/login/idpproviders/{idp_config_id}" + delete: "/orgs/me/policies/login/idpproviders/{idp_config_id}" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.write" + }; + } + + rpc GetPasswordComplexityPolicy(google.protobuf.Empty) returns (PasswordComplexityPolicyView) { + option (google.api.http) = { + get: "/orgs/me/policies/password/complexity" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.read" + }; + } + + rpc GetDefaultPasswordComplexityPolicy(google.protobuf.Empty) returns (PasswordComplexityPolicyView) { + option (google.api.http) = { + get: "/orgs/default/policies/password/complexity" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.read" + }; + } + + rpc CreatePasswordComplexityPolicy(PasswordComplexityPolicyRequest) returns (PasswordComplexityPolicy) { + option (google.api.http) = { + post: "/orgs/me/policies/password/complexity" body: "*" }; @@ -1493,6 +1393,131 @@ rpc GetUserByID(UserID) returns (UserView) { permission: "policy.write" }; } + + rpc UpdatePasswordComplexityPolicy(PasswordComplexityPolicyRequest) returns (PasswordComplexityPolicy) { + option (google.api.http) = { + put: "/orgs/me/policies/password/complexity" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.write" + }; + } + + rpc RemovePasswordComplexityPolicy(google.protobuf.Empty) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/orgs/me/policies/password/complexity" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.delete" + }; + } + + rpc GetPasswordAgePolicy(google.protobuf.Empty) returns (PasswordAgePolicyView) { + option (google.api.http) = { + get: "/orgs/me/policies/password/age" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.read" + }; + } + + rpc GetDefaultPasswordAgePolicy(google.protobuf.Empty) returns (PasswordAgePolicyView) { + option (google.api.http) = { + get: "/orgs/default/policies/password/age" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.read" + }; + } + + rpc CreatePasswordAgePolicy(PasswordAgePolicyRequest) returns (PasswordAgePolicy) { + option (google.api.http) = { + post: "/orgs/me/policies/password/age" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.write" + }; + } + + rpc UpdatePasswordAgePolicy(PasswordAgePolicyRequest) returns (PasswordAgePolicy) { + option (google.api.http) = { + put: "/orgs/me/policies/password/age" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.write" + }; + } + + rpc RemovePasswordAgePolicy(google.protobuf.Empty) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/orgs/me/policies/password/age" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.delete" + }; + } + + rpc GetPasswordLockoutPolicy(google.protobuf.Empty) returns (PasswordLockoutPolicyView) { + option (google.api.http) = { + get: "/orgs/me/policies/password/lockout" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.read" + }; + } + + rpc GetDefaultPasswordLockoutPolicy(google.protobuf.Empty) returns (PasswordLockoutPolicyView) { + option (google.api.http) = { + get: "/orgs/default/policies/password/lockout" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.read" + }; + } + + rpc CreatePasswordLockoutPolicy(PasswordLockoutPolicyRequest) returns (PasswordLockoutPolicy) { + option (google.api.http) = { + post: "/orgs/me/policies/password/lockout" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.write" + }; + } + + rpc UpdatePasswordLockoutPolicy(PasswordLockoutPolicyRequest) returns (PasswordLockoutPolicy) { + option (google.api.http) = { + put: "/orgs/me/policies/password/lockout" + body: "*" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.write" + }; + } + + rpc RemovePasswordLockoutPolicy(google.protobuf.Empty) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/orgs/me/policies/password/lockout" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "policy.delete" + }; + } } message ZitadelDocs { @@ -1503,8 +1528,14 @@ message ZitadelDocs { message Iam { string global_org_id = 1; string iam_project_id = 2; - bool set_up_done = 3; - bool set_up_started = 4; + IamSetupStep set_up_done = 3; + IamSetupStep set_up_started = 4; +} + +enum IamSetupStep { + iam_setup_step_UNDEFINED = 0; + iam_setup_step_1 = 1; + iam_setup_step_2 = 2; } message ChangeRequest { @@ -1956,102 +1987,6 @@ enum NotificationType { NOTIFICATIONTYPE_SMS = 1; } -message PasswordComplexityPolicyID { //TODO: why do we need this? - string id = 1; -} - -message PasswordComplexityPolicy { - string id = 1; - string description = 2; - PolicyState state = 3; - google.protobuf.Timestamp creation_date = 4; - google.protobuf.Timestamp change_date = 5; - uint64 min_length = 6; - bool has_lowercase = 7; - bool has_uppercase = 8; - bool has_number = 9; - bool has_symbol = 10; - uint64 sequence = 11; - bool is_default = 12; -} - -message PasswordComplexityPolicyCreate { - string description = 1 [(validate.rules).string = {max_len: 500}]; - uint64 min_length = 2; - bool has_lowercase = 3; - bool has_uppercase = 4; - bool has_number = 5; - bool has_symbol = 6; -} - -message PasswordComplexityPolicyUpdate { - string id = 1; //TODO: do we need id? - string description = 2 [(validate.rules).string = {max_len: 500}]; - uint64 min_length = 3; - bool has_lowercase = 4; - bool has_uppercase = 5; - bool has_number = 6; - bool has_symbol = 7; -} - -message PasswordAgePolicyID { //TODO: why do we need this? - string id = 1; -} - -message PasswordAgePolicy { - string id = 1; //TODO: do we need id? - string description = 2; - PolicyState state = 3; - google.protobuf.Timestamp creation_date = 4; - google.protobuf.Timestamp change_date = 5; - uint64 max_age_days = 6; - uint64 expire_warn_days = 7; - uint64 sequence = 8; - bool is_default = 9; -} - -message PasswordAgePolicyCreate { - string description = 1 [(validate.rules).string = {max_len: 500}]; - uint64 max_age_days = 2; - uint64 expire_warn_days = 3; -} - -message PasswordAgePolicyUpdate { - string id = 1; //TODO: do we need id? - string description = 2 [(validate.rules).string = {max_len: 500}]; - uint64 max_age_days = 3; - uint64 expire_warn_days = 4; -} - -message PasswordLockoutPolicyID { - string id = 1; //TODO: why do we need this? -} - -message PasswordLockoutPolicy { - string id = 1; //TODO: why do we need this? - string description = 2; - PolicyState state = 3; - google.protobuf.Timestamp creation_date = 4; - google.protobuf.Timestamp change_date = 5; - uint64 max_attempts = 6; - bool show_lock_out_failures = 7; - uint64 sequence = 8; - bool is_default = 9; -} - -message PasswordLockoutPolicyCreate { - string description = 1 [(validate.rules).string = {max_len: 500}]; - uint64 max_attempts = 2; - bool show_lock_out_failures = 3; -} - -message PasswordLockoutPolicyUpdate { - string id = 1; //TODO: do we need id? - string description = 2 [(validate.rules).string = {max_len: 500}]; - uint64 max_attempts = 3; - bool show_lock_out_failures = 4; -} - enum PolicyState { POLICYSTATE_UNSPECIFIED = 0; POLICYSTATE_ACTIVE = 1; @@ -2059,11 +1994,9 @@ enum PolicyState { POLICYSTATE_DELETED = 3; } -message OrgIamPolicy { - string org_id = 1; //TODO: do we need id? - string description = 2; - bool user_login_must_be_domain = 3; - bool default = 4; +message OrgIamPolicyView { + bool user_login_must_be_domain = 1; + bool default = 2; } message OrgCreateRequest { @@ -2247,11 +2180,15 @@ enum OrgMemberSearchKey { message ProjectCreateRequest { string name = 1 [(validate.rules).string = {min_len: 1, max_len: 200}]; + bool project_role_assertion = 2; + bool project_role_check = 3; } message ProjectUpdateRequest { string id = 1 [(validate.rules).string = {min_len: 1}]; string name = 2 [(validate.rules).string = {min_len: 1, max_len: 200}]; + bool project_role_assertion = 3; + bool project_role_check = 4; } message ProjectSearchResponse { @@ -2271,6 +2208,8 @@ message ProjectView { google.protobuf.Timestamp creation_date = 5; string resource_owner = 6; uint64 sequence = 7; + bool project_role_assertion = 8; + bool project_role_check = 9; } message ProjectSearchRequest { @@ -2301,6 +2240,8 @@ message Project { google.protobuf.Timestamp change_date = 4; google.protobuf.Timestamp creation_date = 5; uint64 sequence = 6; + bool project_role_assertion = 7; + bool project_role_check = 8; } enum ProjectState { @@ -2490,6 +2431,9 @@ message OIDCConfig { bool none_compliant = 10; repeated caos.zitadel.api.v1.LocalizedMessage compliance_problems = 11; bool dev_mode = 12; + OIDCTokenType access_token_type = 13; + bool access_token_role_assertion = 14; + bool id_token_role_assertion = 15; } message OIDCApplicationCreate { @@ -2503,12 +2447,20 @@ message OIDCApplicationCreate { repeated string post_logout_redirect_uris = 8; OIDCVersion version = 9; bool dev_mode = 10; + OIDCTokenType access_token_type = 11; + bool access_token_role_assertion = 12; + bool id_token_role_assertion = 13; } enum OIDCVersion { OIDCV1_0 = 0; } +enum OIDCTokenType { + OIDCTokenType_Bearer = 0; + OIDCTokenType_JWT = 1; +} + message OIDCConfigUpdate { string project_id = 1 [(validate.rules).string = {min_len: 1}]; string application_id = 2 [(validate.rules).string = {min_len: 1}]; @@ -2519,6 +2471,9 @@ message OIDCConfigUpdate { OIDCAuthMethodType auth_method_type = 7; repeated string post_logout_redirect_uris = 8; bool dev_mode = 9; + OIDCTokenType access_token_type = 10; + bool access_token_role_assertion = 11; + bool id_token_role_assertion = 12; } enum OIDCResponseType { @@ -2901,7 +2856,7 @@ message Idp { google.protobuf.Timestamp creation_date = 3; google.protobuf.Timestamp change_date = 4; string name = 5; - bytes logo_src = 6; + IdpStylingType styling_type = 6; oneof idp_config { OidcIdpConfig oidc_config = 7; } @@ -2911,7 +2866,7 @@ message Idp { message IdpUpdate { string id = 1 [(validate.rules).string = {min_len: 1}]; string name = 2 [(validate.rules).string = {min_len: 1, max_len: 200}]; - bytes logo_src = 3; + IdpStylingType styling_type = 3; } message OidcIdpConfig { @@ -2923,6 +2878,11 @@ message OidcIdpConfig { OIDCMappingField username_mapping = 6; } +enum IdpStylingType { + IDPSTYLINGTYPE_UNSPECIFIED = 0; + IDPSTYLINGTYPE_GOOGLE = 1; +} + enum IdpState { IDPCONFIGSTATE_UNSPECIFIED = 0; IDPCONFIGSTATE_ACTIVE = 1; @@ -2937,7 +2897,7 @@ enum OIDCMappingField { message OidcIdpConfigCreate { string name = 1 [(validate.rules).string = {min_len: 1, max_len: 200}]; - bytes logo_src = 2; + IdpStylingType styling_type = 2; string client_id = 3 [(validate.rules).string = {min_len: 1, max_len: 200}]; string client_secret = 4 [(validate.rules).string = {min_len: 1, max_len: 200}]; string issuer = 5 [(validate.rules).string = {min_len: 1, max_len: 200}]; @@ -2971,7 +2931,7 @@ message IdpView { google.protobuf.Timestamp creation_date = 3; google.protobuf.Timestamp change_date = 4; string name = 5; - bytes logo_src = 6; + IdpStylingType styling_type = 6; IdpProviderType provider_type = 7; oneof idp_config_view { OidcIdpConfigView oidc_config = 8; @@ -3010,9 +2970,11 @@ message LoginPolicy { bool allow_username_password = 1; bool allow_register = 2; bool allow_external_idp = 3; + google.protobuf.Timestamp creation_date = 4; + google.protobuf.Timestamp change_date = 5; } -message LoginPolicyAdd { +message LoginPolicyRequest { bool allow_username_password = 1; bool allow_register = 2; bool allow_external_idp = 3; @@ -3037,6 +2999,8 @@ message LoginPolicyView { bool allow_username_password = 2; bool allow_register = 3; bool allow_external_idp = 4; + google.protobuf.Timestamp creation_date = 5; + google.protobuf.Timestamp change_date = 6; } message IdpProviderView { @@ -3107,4 +3071,79 @@ message ExternalIDPRemoveRequest { string user_id = 1; string idp_config_id = 2; string external_user_id = 3; -} \ No newline at end of file +} + +message PasswordComplexityPolicy { + uint64 min_length = 1; + bool has_lowercase = 2; + bool has_uppercase = 3; + bool has_number = 4; + bool has_symbol = 5; + uint64 sequence = 6; + google.protobuf.Timestamp creation_date = 7; + google.protobuf.Timestamp change_date = 8; +} + +message PasswordComplexityPolicyRequest { + uint64 min_length = 1; + bool has_lowercase = 2; + bool has_uppercase = 3; + bool has_number = 4; + bool has_symbol = 5; +} + +message PasswordComplexityPolicyView { + bool default = 1; + uint64 min_length = 2; + bool has_lowercase = 3; + bool has_uppercase = 4; + bool has_number = 5; + bool has_symbol = 6; + uint64 sequence = 7; + google.protobuf.Timestamp creation_date = 8; + google.protobuf.Timestamp change_date = 9; +} + +message PasswordAgePolicy { + uint64 max_age_days = 1; + uint64 expire_warn_days = 2; + uint64 sequence = 3; + google.protobuf.Timestamp creation_date = 4; + google.protobuf.Timestamp change_date = 5; +} + +message PasswordAgePolicyRequest { + uint64 max_age_days = 1; + uint64 expire_warn_days = 2; +} + +message PasswordAgePolicyView { + bool default = 1; + uint64 max_age_days = 2; + uint64 expire_warn_days = 3; + uint64 sequence = 4; + google.protobuf.Timestamp creation_date = 5; + google.protobuf.Timestamp change_date = 6; +} + +message PasswordLockoutPolicy { + uint64 max_attempts = 1; + bool show_lockout_failure = 2; + uint64 sequence = 3; + google.protobuf.Timestamp creation_date = 4; + google.protobuf.Timestamp change_date = 5; +} + +message PasswordLockoutPolicyRequest { + uint64 max_attempts = 1; + bool show_lockout_failure = 2; +} + +message PasswordLockoutPolicyView { + bool default = 1; + uint64 max_attempts = 2; + bool show_lockout_failure = 3; + uint64 sequence = 4; + google.protobuf.Timestamp creation_date = 5; + google.protobuf.Timestamp change_date = 6; +} diff --git a/pkg/grpc/message/message.pb.go b/pkg/grpc/message/message.pb.go index 883c3abe97..ad2c816340 100644 --- a/pkg/grpc/message/message.pb.go +++ b/pkg/grpc/message/message.pb.go @@ -1,138 +1,232 @@ // Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.13.0 // source: message.proto package message import ( - fmt "fmt" proto "github.com/golang/protobuf/proto" - math "math" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type ErrorDetail struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` } -func (m *ErrorDetail) Reset() { *m = ErrorDetail{} } -func (m *ErrorDetail) String() string { return proto.CompactTextString(m) } -func (*ErrorDetail) ProtoMessage() {} +func (x *ErrorDetail) Reset() { + *x = ErrorDetail{} + if protoimpl.UnsafeEnabled { + mi := &file_message_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ErrorDetail) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ErrorDetail) ProtoMessage() {} + +func (x *ErrorDetail) ProtoReflect() protoreflect.Message { + mi := &file_message_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ErrorDetail.ProtoReflect.Descriptor instead. func (*ErrorDetail) Descriptor() ([]byte, []int) { - return fileDescriptor_33c57e4bae7b9afd, []int{0} + return file_message_proto_rawDescGZIP(), []int{0} } -func (m *ErrorDetail) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ErrorDetail.Unmarshal(m, b) -} -func (m *ErrorDetail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ErrorDetail.Marshal(b, m, deterministic) -} -func (m *ErrorDetail) XXX_Merge(src proto.Message) { - xxx_messageInfo_ErrorDetail.Merge(m, src) -} -func (m *ErrorDetail) XXX_Size() int { - return xxx_messageInfo_ErrorDetail.Size(m) -} -func (m *ErrorDetail) XXX_DiscardUnknown() { - xxx_messageInfo_ErrorDetail.DiscardUnknown(m) -} - -var xxx_messageInfo_ErrorDetail proto.InternalMessageInfo - -func (m *ErrorDetail) GetId() string { - if m != nil { - return m.Id +func (x *ErrorDetail) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ErrorDetail) GetMessage() string { - if m != nil { - return m.Message +func (x *ErrorDetail) GetMessage() string { + if x != nil { + return x.Message } return "" } type LocalizedMessage struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - LocalizedMessage string `protobuf:"bytes,2,opt,name=localized_message,json=localizedMessage,proto3" json:"localized_message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + LocalizedMessage string `protobuf:"bytes,2,opt,name=localized_message,json=localizedMessage,proto3" json:"localized_message,omitempty"` } -func (m *LocalizedMessage) Reset() { *m = LocalizedMessage{} } -func (m *LocalizedMessage) String() string { return proto.CompactTextString(m) } -func (*LocalizedMessage) ProtoMessage() {} +func (x *LocalizedMessage) Reset() { + *x = LocalizedMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_message_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LocalizedMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LocalizedMessage) ProtoMessage() {} + +func (x *LocalizedMessage) ProtoReflect() protoreflect.Message { + mi := &file_message_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LocalizedMessage.ProtoReflect.Descriptor instead. func (*LocalizedMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_33c57e4bae7b9afd, []int{1} + return file_message_proto_rawDescGZIP(), []int{1} } -func (m *LocalizedMessage) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LocalizedMessage.Unmarshal(m, b) -} -func (m *LocalizedMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LocalizedMessage.Marshal(b, m, deterministic) -} -func (m *LocalizedMessage) XXX_Merge(src proto.Message) { - xxx_messageInfo_LocalizedMessage.Merge(m, src) -} -func (m *LocalizedMessage) XXX_Size() int { - return xxx_messageInfo_LocalizedMessage.Size(m) -} -func (m *LocalizedMessage) XXX_DiscardUnknown() { - xxx_messageInfo_LocalizedMessage.DiscardUnknown(m) -} - -var xxx_messageInfo_LocalizedMessage proto.InternalMessageInfo - -func (m *LocalizedMessage) GetKey() string { - if m != nil { - return m.Key +func (x *LocalizedMessage) GetKey() string { + if x != nil { + return x.Key } return "" } -func (m *LocalizedMessage) GetLocalizedMessage() string { - if m != nil { - return m.LocalizedMessage +func (x *LocalizedMessage) GetLocalizedMessage() string { + if x != nil { + return x.LocalizedMessage } return "" } -func init() { - proto.RegisterType((*ErrorDetail)(nil), "caos.zitadel.api.v1.ErrorDetail") - proto.RegisterType((*LocalizedMessage)(nil), "caos.zitadel.api.v1.LocalizedMessage") +var File_message_proto protoreflect.FileDescriptor + +var file_message_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x13, 0x63, 0x61, 0x6f, 0x73, 0x2e, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x22, 0x37, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x51, 0x0a, + 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x61, 0x6f, 0x73, 0x2f, 0x7a, 0x69, 0x74, 0x61, 0x64, 0x65, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x67, 0x72, 0x70, 0x63, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } -func init() { proto.RegisterFile("message.proto", fileDescriptor_33c57e4bae7b9afd) } +var ( + file_message_proto_rawDescOnce sync.Once + file_message_proto_rawDescData = file_message_proto_rawDesc +) -var fileDescriptor_33c57e4bae7b9afd = []byte{ - // 182 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xcd, 0x4d, 0x2d, 0x2e, - 0x4e, 0x4c, 0x4f, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4e, 0x4e, 0xcc, 0x2f, 0xd6, - 0xab, 0xca, 0x2c, 0x49, 0x4c, 0x49, 0xcd, 0xd1, 0x4b, 0x2c, 0xc8, 0xd4, 0x2b, 0x33, 0x54, 0x32, - 0xe7, 0xe2, 0x76, 0x2d, 0x2a, 0xca, 0x2f, 0x72, 0x49, 0x2d, 0x49, 0xcc, 0xcc, 0x11, 0xe2, 0xe3, - 0x62, 0xca, 0x4c, 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x62, 0xca, 0x4c, 0x11, 0x92, 0xe0, - 0x62, 0x87, 0x1a, 0x22, 0xc1, 0x04, 0x16, 0x84, 0x71, 0x95, 0x02, 0xb9, 0x04, 0x7c, 0xf2, 0x93, - 0x13, 0x73, 0x32, 0xab, 0x52, 0x53, 0x7c, 0x21, 0x62, 0x42, 0x02, 0x5c, 0xcc, 0xd9, 0xa9, 0x95, - 0x50, 0xed, 0x20, 0xa6, 0x90, 0x36, 0x97, 0x60, 0x0e, 0x4c, 0x55, 0x3c, 0xaa, 0x49, 0x02, 0x39, - 0x68, 0xda, 0x9d, 0xb4, 0xa2, 0x34, 0xd2, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, - 0xf5, 0x41, 0xae, 0xd5, 0x87, 0xba, 0x56, 0xbf, 0x20, 0x3b, 0x5d, 0x3f, 0xbd, 0xa8, 0x20, 0x59, - 0x1f, 0x6a, 0x46, 0x12, 0x1b, 0xd8, 0x4f, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x28, - 0x69, 0x83, 0xe4, 0x00, 0x00, 0x00, +func file_message_proto_rawDescGZIP() []byte { + file_message_proto_rawDescOnce.Do(func() { + file_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_message_proto_rawDescData) + }) + return file_message_proto_rawDescData +} + +var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_message_proto_goTypes = []interface{}{ + (*ErrorDetail)(nil), // 0: caos.zitadel.api.v1.ErrorDetail + (*LocalizedMessage)(nil), // 1: caos.zitadel.api.v1.LocalizedMessage +} +var file_message_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_message_proto_init() } +func file_message_proto_init() { + if File_message_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ErrorDetail); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_message_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LocalizedMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_message_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_message_proto_goTypes, + DependencyIndexes: file_message_proto_depIdxs, + MessageInfos: file_message_proto_msgTypes, + }.Build() + File_message_proto = out.File + file_message_proto_rawDesc = nil + file_message_proto_goTypes = nil + file_message_proto_depIdxs = nil } diff --git a/site/CONTRIBUTING.md b/site/CONTRIBUTING.md new file mode 100644 index 0000000000..8ae2c8ba95 --- /dev/null +++ b/site/CONTRIBUTING.md @@ -0,0 +1,69 @@ +# How to contribute to ZITADEL's documentation + +Before you start your editing process please take some time to familiarise yourself with the rules for contributing to the documentation of ZITADEL. + +## File format + +ZITADEL's static site generator uses a Markdown file format. The flavour of the Markdown is specified in the [CAOS Static Site Generator](/docs/cssg.md) document. + +## Using headings + +Make use of headings to structure and organise the document. The static site generator will make sure that the headings are rendered as a means of navigation for the site's content. + +## Headings capitalisation conventions + +In order to keep consistency across the documentation we urge you to only write the very first word of a heading with a capital letter. The styling of the static site generator will then guarantee the consistent rendering of first caps, all caps, word caps or whatever style is chosen for the output. + +## Using captions + +We urge you to always add captions to listings, code snippets, tables, graphics and images, *unless* the image is a logo or icon of any type. Also, inline graphics and images don't require captions due to readability. + +Numbering is **required** for captions. See next section. + +## Numbering of captions + +Numbering has to be continuous using Arabic style numbers. The caption is composed of a prefix and a descriptive text. The prefix is composed of the item type (Listing, Table, Image, Graphic), an incrementing number in Arabic style followed by a period and a description. + +If the description consists of **one term** only you must omit any trailing punctuation. If the description represents a complete sentence you must terminate it with a period. + +Examples: + +* Snippet 3. Example of a protobuf interface deriving ZITADEL's OIDC connector. +* Figure 1. Inside the ESO Atacama Large Millimetre/submillimetre Array. +* Table 21. Representation of all supported quantum-singularity proximation algorithms. +* Image 13. Higgs Boson + +## Inline graphics and images + +Use sparsely. You should always make sure that inline images do not exceed 48 by 48 pixels (or the equivalent scale for HDPI displays). + +## Keyboard shortcuts + +When documenting the usage of UI components don't forget to include the keyboard shortcuts available. Use the `kbd:` macro or `` HTML tag to style the keys accordingly. To ensure platform-independent documentation always include the modifier-keys for **all** supported platforms, i.e. `[kbd:]Ctrl` or `[kbd:]Opt [kbd:]C`, which renders `Ctrl` or `Opt C`. + +## File name conventions + +### File name + +If and when the file name of a Markdown file consist of more than **one** contiguous word you must use a hyphen `-` to separate the word elements. + +Examples: + +* content.md +* distribution-guide.md +* programming-examples.md +* explaining-the-code-snippets.md + +### File extension + +For reasons of consistency the static site generator only accepts Markdown files with the `.md` file extension. + +### Internationalisation (I18N) + +Writing documentation in country specific languages is highly endorsed. The static site generator makes use of a simple naming convention for Markdown files which are available in different languages: + +`{filename}[.{language-id}].md` + +Where `filename` represents the name of the file (see section [File name](#file-name)), `language-id` is an *optional* language identifier (see the list of [ISO 639-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)), and the mandatory file extension `.md`. + +**Note:** If a file name does not specify a language identifier we consider the file name to be implicitly written in English language (defaulting to `.en`). This is also important for the rendering of the language-dependent content navigation as the content navigations always will only include pages in their respective language they represent. This means that Markdown files without language identifier will **only** be rendered in the content navigation of the English documentation variant and will **not be visible at all** in the content navigations of other language variants. diff --git a/site/README.md b/site/README.md index ab7f70f60f..39a375934b 100644 --- a/site/README.md +++ b/site/README.md @@ -1,7 +1,7 @@ -## Getting started +# Getting started -Caos Site is a github action that generates a static page out of markdown files. It uses marked.js in combination with highlight.js to compile and style markdown. -The documentiation is built according to the structure of a docs `folder`[Folder](https://github.com/caos/site/tree/master/docs) located at root of the targeted repository. +CAOS Site is a github action that generates a static page out of markdown files. It uses marked.js in combination with highlight.js to compile and style markdown. +The documentation is built according to the structure of a docs `folder`[Folder](https://github.com/caos/site/tree/master/site/docs) located at root of the targeted repository. ## Running locally @@ -13,6 +13,6 @@ npm i Start the server with `npm run dev`, and navigate to [localhost:3000](http://localhost:3000). -### Honorable Mentions +## Honorable Mentions This project was created with the help of some components from [svelte](https://github.com/sveltejs/svelte)([MIT](https://github.com/sveltejs/svelte/blob/master/LICENSE)) as well as [site-kit](https://github.com/sveltejs/site-kit)([MIT](https://github.com/sveltejs/site-kit/blob/master/LICENSE)). \ No newline at end of file diff --git a/site/docs/administrate/00-overview.de.md b/site/docs/administrate/00-overview.de.md new file mode 100644 index 0000000000..43cac2931e --- /dev/null +++ b/site/docs/administrate/00-overview.de.md @@ -0,0 +1,5 @@ +--- +title: Übersicht +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/00-overview.en.md b/site/docs/administrate/00-overview.en.md new file mode 100644 index 0000000000..b8ac15bdfa --- /dev/null +++ b/site/docs/administrate/00-overview.en.md @@ -0,0 +1,40 @@ +--- +title: Overview +--- + +> All documentations are under active work and subject to change soon! + +### Features + +- Single-Sign On (SSO) and Single-Log Out (SLO) for + - Web applications + - Server Renderer + - Single Page + - Native Clients + - Windows + - MacOS + - Linux + - Mobile Clients + - Android + - iOS / iPadOS +- Bearer Tokens to use with APIs + - REST + - GRPC + - GraphQL +- Role Based Access Control +- OpenID Connect 1.0 (OIDC) support +- OAuth 2.0 support +- Identity Brokering + - Federation with OIDC and OAuth 2.0 Identity Providers + - Social Login +- Management Console for central management of your data +- Multi-factor Authentication + - Support for TOTP/HOTP with any app, like authy, google authenticator, ... +- User self-registration, recover password, email and phone verification, etc. +- Organisation self-registration, domain verification, policy management +- API's for easy integration in your application + +### Concepts + +With ZITADEL there are some key concepts some should be aware of before using it to secure your applications and services. +You find these definitions in the "What is..." heading of each resource. diff --git a/site/docs/administrate/01-console.de.md b/site/docs/administrate/01-console.de.md new file mode 100644 index 0000000000..54759f73ed --- /dev/null +++ b/site/docs/administrate/01-console.de.md @@ -0,0 +1,5 @@ +--- +title: Console +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/01-console.en.md b/site/docs/administrate/01-console.en.md new file mode 100644 index 0000000000..a1bba8a56b --- /dev/null +++ b/site/docs/administrate/01-console.en.md @@ -0,0 +1,30 @@ +--- +title: Console +--- + +### What is Console + +Console is the ZITADEL Graphical User Interface. + +**Users** can manage some information on their own. + +- profile information +- credentials +- external logins + +Users (**org owners**) who manage organisations do this also with Console. + +- Organisation settings (policies, domains, idp's) +- Manage users +- Manage projects, clients and roles +- Give access to users + +For the **IAM Administrators** there is also a section in Console solely intended to manage the system. + +- Check failed events +- Reset read models +- Define system policies + +### Technologies + +Console is built with Angular and interfaces with ZITADEL by utilizing the GRPC APIs over GRPC-web. diff --git a/site/docs/administrate/02-organisations.de.md b/site/docs/administrate/02-organisations.de.md new file mode 100644 index 0000000000..88fc1ffc1d --- /dev/null +++ b/site/docs/administrate/02-organisations.de.md @@ -0,0 +1,5 @@ +--- +title: Organisationen +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/02-organisations.en.md b/site/docs/administrate/02-organisations.en.md new file mode 100644 index 0000000000..c9c3968509 --- /dev/null +++ b/site/docs/administrate/02-organisations.en.md @@ -0,0 +1,114 @@ +--- +title: Organisations +--- + +### What are organisations + +Organisations are comparable to tenants of a system or OU's (organisational units) if we speak of a directory based system. +ZITADEL is organised around the idea that multiple organisations share the same [System](administrate#What_is_meant_by_system) and that they can grant each other rights so self manage certain things. + +#### Global organisation + +ZITADEL provides a global organisation for users who manage their accounts on their own. Think of this like the difference between a "Microsoft Live Login" vs. "AzureAD User" +or if you think of Google "Gmail" vs "Gsuite". + +### Create an organisation without existing login + +ZITADEL allows you to create a new organisation without a pre-existing user. For [ZITADEL.ch](https://zitadel.ch) you can create a org by visiting the [Register organisation](https://accounts.zitadel.ch/register/org) + +> Screenshot here + +For dedicated ZITADEL instances this URL might be different, but in most cases should be something like https://accounts.YOURDOMAIN.TLD/register/org + +### Create an organisation with existing login + +You can simply create a new organisation by visiting the [ZITADEL Console](https://console.zitadel.ch) and clicking "new organisation" in the upper left corner. + +> Screenshot here + +For dedicated ZITADEL instances this URL might be different, but in most cases should be something like `https://console.YOURDOMAIN.TLD` + +### Verify a domain name + +Once you created your organisation you will receive a generated domain name from ZITADEL for your organisation. For example if you call your organisation `ACME` you will receive `acme.zitadel.ch` as name. Furthermore the users you create will be suffixed with this domain name. To improve the user experience you can verify a domain name which you control. If you control acme.ch you can verify the ownership by DNS or HTTP challenge. +After the domain is verified your users can use both domain names to log-in. The user "coyote" can now use "coyote@acme.zitadel.ch" and "coyote@acme.ch". +An organisation can have multiple domain names, but only one of it can be primary. The primary domain defines which login name ZITADEL displays to the user, and also what information gets asserted in access_tokens (preferred_username). + +Browse to your [organisation](administrate#Organisations) by visiting [https://console.zitadel.ch/org](https://console.zitadel.ch/org). + +Add the domain to your [organisation](administrate#Organisations) by clicking the button **Add Domain**. + + +Input the domain in the input field and click **Add** + +To start the domain verification click the domain name and a dialog will appear, where you can choose between DNS or HTTP challenge methods. + +For example, create a TXT record with your DNS provider for the used domain and click verify. **ZITADEL** will then proceed an check your DNS. + + +> Do not delete the verification code **ZITADEL** will recheck the ownership from time to time + +When the verification is successful you have the option to activate the domain by clicking **Set as primary** + + + +> This changes the **preferred loginnames** of your [users](administrate#Users) as indicated [here](administrate#How_ZITADEL_handles_usernames). + +Congratulations your are done! You can check this by visiting [https://console.zitadel.ch/users/me](https://console.zitadel.ch/users/me) + + +> This only works when the [user](administrate#Users) is member of this [organisation](administrate#Organisations) + +### Audit organisation changes + +All changes to the organisation are displayed on the organisation menu within [ZITADEL Console](https://console.zitadel.ch/org) organisation menu. Located on the right hand side under "activity". + +> Screenshot here diff --git a/site/docs/administrate/03-projects.de.md b/site/docs/administrate/03-projects.de.md new file mode 100644 index 0000000000..9421b86c01 --- /dev/null +++ b/site/docs/administrate/03-projects.de.md @@ -0,0 +1,5 @@ +--- +title: Projekte +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/03-projects.en.md b/site/docs/administrate/03-projects.en.md new file mode 100644 index 0000000000..843e84a68c --- /dev/null +++ b/site/docs/administrate/03-projects.en.md @@ -0,0 +1,80 @@ +--- +title: Projects +--- + +### What are projects + +The idea of projects is to have a vessel for all components who are closely related to each other. +In ZITADEL all clients located in the same project share their roles, grants and authorizations. +From an access management perspective you manage who has what role in the project and your application consumes this information. +A project belongs to exactly one organisation. +The attribute project role assertion defines, if the roles should be integrated in the tokens without sending corresponding scope (urn:zitadel:iam:org:project:role:{rolename}) +With the project role check you can define if a user should have a requested role to be able to logon. + +**Clients** + +Clients are described here [What are clients](administrate#What_are_clients) +Basically these are your applications who initiate the authorization flow. + +**Roles** + +[Roles (or Project Roles)](administrate#Roles) is a means of managing users access rights for a certain project. +These [roles](administrate#Roles) are opaque for ZITADEL and have no weight in relation to each other. +So if a [user](administrate#Users) has two roles, admin and user in a certain project, the information will be treated additive. + +**Grants** + +With ZITADEL it is possible to give third parties (other organisations) the possibility to manage certain roles on their own. +To achieve this the owner of a project can grant (some could say delegate) certain roles or all roles to an organisation. +After granting that organisation it can manage on its own which user has what roles. +This feature is especially useful for service providers, because they are able to establish a great self-service culture for their business customers. + +**Authorizations** + +#### Project vs. granted Project + +The simple difference of a project vs a granted project is that a project belongs to your organisation and the granted project belongs to a third party who did grant you some rights to manage certain roles of their project. +To make it more easier to differentiate, ZITADEL Console displays these both as separate menu in the project section. + +### Manage a project + +#### Create a project + +To create your project go to [https://console.zitadel.ch/projects](https://console.zitadel.ch/projects) + + + +Create a new project with a name which explains what's the intended use of this project. + + + +#### RBAC Settings + +- Authorisation Check option (Check if the user at least has one role granted) +- Enable Project_Role Assertion (if this is enabled assert project_roles, with the config of the corresponding client) + +#### Define project specific roles + +> Screenshot here + +### Grant project to a third party + +> Screenshot here + +### Audit project changes + +> Screenshot here diff --git a/site/docs/administrate/04-clients.de.md b/site/docs/administrate/04-clients.de.md new file mode 100644 index 0000000000..b7f53dfa17 --- /dev/null +++ b/site/docs/administrate/04-clients.de.md @@ -0,0 +1,5 @@ +--- +title: Clients +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/04-clients.en.md b/site/docs/administrate/04-clients.en.md new file mode 100644 index 0000000000..d8ac5003b1 --- /dev/null +++ b/site/docs/administrate/04-clients.en.md @@ -0,0 +1,74 @@ +--- +title: Clients +--- + +### What are clients + +Clients are applications who share the same security context and interface with an "authorization server". +For example you could have a software project existing out of a web app and a mobile app, both of these applications might consume the same roles because the end user might use both of them. + +### Manage clients + +Clients might use different protocols for integrating with an IAM. With ZITADEL it is possible to use OpenID Connect 1.0 / OAuth 2.0. In the future SAML 2.0 support is planned as well. + +#### OIDC Configuration + +> Document Settings + +### Create a client + +To make configuration of a client easy we provide a wizard which generates a specification conferment setup. +The wizard can be skipped for people who are needing special settings. + +> For use cases where your configuration is not compliant we provide you a "dev mode" which disables conformance checks. + +To create a new client start by browsing to your [project](administrate#Projects), this is normally something like [https://console.zitadel.ch/projects/78562301657017889](https://console.zitadel.ch/projects/78562301657017889) + + + +Click the **New** button and a wizard will appear which will guide you through the process. + + + +When the wizard is complete, the clients configuration will be displayed and you can now use this client. + + \ No newline at end of file diff --git a/site/docs/administrate/05-roles.de.md b/site/docs/administrate/05-roles.de.md new file mode 100644 index 0000000000..26565011a6 --- /dev/null +++ b/site/docs/administrate/05-roles.de.md @@ -0,0 +1,5 @@ +--- +title: Rollen +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/05-roles.en.md b/site/docs/administrate/05-roles.en.md new file mode 100644 index 0000000000..82028b3311 --- /dev/null +++ b/site/docs/administrate/05-roles.en.md @@ -0,0 +1,41 @@ +--- +title: Roles +--- + +### What are Roles + +With **roles** **ZITADEL** lets [projects](administrate#projects) define there **role based access control**. + +**Roles** can be consumed by the [clients](administrate#clients) which exist within a specific [project](administrate#projects). + +For more information about how **roles** can be consumed, have a look the protocol specific information. + +- [OpenID Connect / OAuth](integrate#How_to_consume_authorizations_in_your_application_or_service) + +### Manage Roles + +Each **role** consist of three fields. + +| Field | Description | Example | +|:-------------|:-----------------------------------------------------------------------------|--------------------------------------------------| +| Key | This is the **Roles** actual name which can be used to verify the users roles. | User | +| Display Name | A descriptive text for the purpose of the **Role** | User is the default role provided to each person | +| Group | The group field allows to group certain roles who belong in the same context | User and Admin in the group **default** | + +### Granting Roles + +To give someone (or somewhat) access to a [projects](administrate#projects) resources and services **ZITADEL** provides to processes. **Roles** can be either granted to [users](administrate#Users) org to [organisations](administrate#Organisations). + +#### Grant Roles to Organisations + +The possibility to grant **roles** to an [organisation](administrate#Organisations) is intended as "delegation" so that a [org](administrate#Organisations) can on their own grant access to [users](administrate#Users). + +For example a **service provider** could grant the **roles** user, and manager to an [org](administrate#Organisations) as soon as they purchases his service. This can be automated by utilising a [service user](administrate#Manage_Service_Users) in the **service providers** business process. + +> Screenshot here + +#### Grant Roles to Users + +By granting **roles** to [users](administrate#Users), be it [humans or machines](administrate#Human_vs_Service_Users), this [user](administrate#Users) receives the authorization to access resources from a service. + +> Screenshot here diff --git a/site/docs/administrate/06-users.de.md b/site/docs/administrate/06-users.de.md new file mode 100644 index 0000000000..ab58e1c2e0 --- /dev/null +++ b/site/docs/administrate/06-users.de.md @@ -0,0 +1,5 @@ +--- +title: Benutzer +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/06-users.en.md b/site/docs/administrate/06-users.en.md new file mode 100644 index 0000000000..770d2750f6 --- /dev/null +++ b/site/docs/administrate/06-users.en.md @@ -0,0 +1,92 @@ +--- +title: Users +--- + +### What are users + +In **ZITADEL** there are different [users](administrate#Users). Some belong to dedicated [organisations](administrate#Organisations) other belong to the global [organisations](administrate#Organisations). Some of them are human [users](administrate#Users) others are machines. +Nonetheless we treat them all the same in regard to [roles](administrate#Roles) management and audit trail. + +#### Human vs. Service Users + +The major difference between human vs. machine [users](administrate#Users) is the type of credentials who can be used. +With machine [users](administrate#Users) there is only a non interactive logon process possible. As such we utilize “JWT as Authorization Grant”. + +> TODO Link to “JWT as Authorization Grant” explanation. + +### How ZITADEL handles usernames + +**ZITADEL** is built around the concept of [organisations](administrate#Organisations). Each [organisation](administrate#Organisations) has its own pool of usernames which include human and service [users](administrate#Users). +For example a [user](administrate#Users) with the username `road.runner` can only exist once the [organisation](administrate#Organisations) `ACME`. **ZITADEL** will automatically generate a "logonname" for each [user](administrate#Users) consisting of `{username}@{domainname}.{zitadeldomain}`. Without verifying the domain name this would result in the logonname `road.runner@acme.zitadel.ch`. If you use a dedicated **ZITADEL** replace `zitadel.ch` with your domain name. + +If someone verifies a domain name within the organisation **ZITADEL** will generate additional logonames for each [user](administrate#Users) with that domain. For example if the domain is `acme.ch` the resulting logonname would be `road.runner@acme.ch` and as well the generated one `road.runner@acme.zitadel.ch`. + +> Domain verification also removes the logonname from all [users](administrate#Users who might have used this combination in the global [organisation](administrate#Organisations). +> Relating to example with `acme.ch` if a user in the global [organisation](administrate#Organisations), let's call him `coyote` used `coyote@acme.ch` this logonname will be replaced with `coyote@randomvalue.tld` +> **ZITADEL** notifies the user about this change + +### Manage Users + +#### Search Users + + + +Image 1: User List Search + +#### Create Users + + + +Image 2: User List + + + +Image 3: User Create Form + + + +Image 4: User Create Done + +#### Set Password + +> Screenshot here + +### Manage Service Users + +> Screenshot here + +### Authorizations + +> Screenshot here + +### Audit user changes + +> Screenshot here diff --git a/site/docs/administrate/07-policies.de.md b/site/docs/administrate/07-policies.de.md new file mode 100644 index 0000000000..f78961becd --- /dev/null +++ b/site/docs/administrate/07-policies.de.md @@ -0,0 +1,5 @@ +--- +title: Richtlinien +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/07-policies.en.md b/site/docs/administrate/07-policies.en.md new file mode 100644 index 0000000000..22120393dd --- /dev/null +++ b/site/docs/administrate/07-policies.en.md @@ -0,0 +1,50 @@ +--- +title: Policies +--- + +### What are policies + +Policies are a means of enforcing certain behaviour of ZITADEL. +ZITADEL defines a default policy on the system level. However an organisation owner can change these aspects within his own organisation. + +Below is a list of available policies + +### Password complexity + +This policy enforces passwords of users within the org. to be compliant. + +- min length +- has number +- has symbol +- has lower case +- has upper case + +> Screenshot here + +### IAM Access Preference + +This policy enforces, when set to true, that usernames are suffixed with the organisations domain. +Under normal operation this policy is only false on the `global` org. so that users can choose their email as their username. +Only available for the `IAM Administrator` + +> Screenshot here + +### Login Options + +With this policy it is possible to define what options a user sees in the login process. + +- Username Password allowed +- Self Register allowed +- External IDP allowed +- List of allowed external IDPs + +> Screenshot here + +### Audit policy changes + +> Screenshot here + +### Upcoming Policies + +- Password age +- Password failure count diff --git a/site/docs/administrate/08-providers.de.md b/site/docs/administrate/08-providers.de.md new file mode 100644 index 0000000000..428e170df5 --- /dev/null +++ b/site/docs/administrate/08-providers.de.md @@ -0,0 +1,5 @@ +--- +title: Identitäts Provider +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/08-providers.en.md b/site/docs/administrate/08-providers.en.md new file mode 100644 index 0000000000..e2a7a8eb4f --- /dev/null +++ b/site/docs/administrate/08-providers.en.md @@ -0,0 +1,72 @@ +--- +title: Identity Providers +--- + +### What are Identity Providers + +Identity providers or in short idps are external systems to which **ZITADEL** can create a **federation** or use their **directory service**. +Normally federation uses protocols like [OpenID Connect 1.0](https://openid.net/connect/), [OAuth 2.0](https://oauth.net/2/) and [SAML 2.0](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html). + +Some examples include: + +#### Social Providers + +- Google Account +- Microsoft Live Account +- Apple ID +- GitHub +- GitLab +- ... + +#### Enterprise Providers** + +- Azure AD Tenant +- Gsuite hosted domain +- ... + +### Generic + +- ADFS +- ADDS +- Keycloak +- LDAP + +### What is Identity Brokering + +ZITADEL supports the usage as identity broker, by linking multiple external idps into one user. +With identity brokering the client which relies on ZITADEL does not need to care about the linking of identity. + +### Manage Identity Providers + +> Screenshot here + +### Federation Protocols + +Currently supported are the following protocols. + +- OpenID Connect 1.0 +- OAuth 2.0 + +SAML 2.0 will follow later on. + +### Storage Federation + +> This is a work in progress. + +Storage federation is a means of integrating existing identity storage like [LDAP](https://tools.ietf.org/html/rfc4511) and [ADDS](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/virtual-dc/active-directory-domain-services-overview). +With this process **ZITADEL** can authenticate users with LDAP Binding and SPNEGO for ADDS. It is also possible to synchronize the users just-in-time or scheduled. + +#### Sync Settings + +Here we will document all the different sync options + +- Read-only +- Writeback +- just-in-time sync +- scheduled sync + +> TBD + +### Audit identity provider changes + +> Screenshot here diff --git a/site/docs/administrate/80-audit.de.md b/site/docs/administrate/80-audit.de.md new file mode 100644 index 0000000000..abb8125fb8 --- /dev/null +++ b/site/docs/administrate/80-audit.de.md @@ -0,0 +1,5 @@ +--- +title: Audit +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/80-audit.en.md b/site/docs/administrate/80-audit.en.md new file mode 100644 index 0000000000..01f9f98e3a --- /dev/null +++ b/site/docs/administrate/80-audit.en.md @@ -0,0 +1,13 @@ +--- +title: Audit +--- + +### What about Audit + +ZITADEL is built upon the concept of Event sourcing. With this ZITADEL can track each operation of all objects it maintains over an infinite amount of time. The only limit is the storage system. + +With these events ZITADEL can provide you with a super detailed audit trail where you can see who changed what and when. + +Over the next few releases we will steadily enhance and build features tailored to reporting and audit. + +> It is important to mention that even if ZITADEL does not yet supply the Graphical User Interface for certain audit aspects it still has all the data to generate these reports later on! diff --git a/site/docs/administrate/90-system.de.md b/site/docs/administrate/90-system.de.md new file mode 100644 index 0000000000..99a0c4ac05 --- /dev/null +++ b/site/docs/administrate/90-system.de.md @@ -0,0 +1,5 @@ +--- +title: System Administration +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/administrate/90-system.en.md b/site/docs/administrate/90-system.en.md new file mode 100644 index 0000000000..b8cfdef97c --- /dev/null +++ b/site/docs/administrate/90-system.en.md @@ -0,0 +1,58 @@ +--- +title: System Administration +--- + +### What is meant by system + +System describes the root of ZITADEL and includes all other elements like organisations, users and so on. Most of the time this part is managed by an user with the role IAM_OWNER. + +### Default Policies + +When ZITADEL is set up for the first time we establish certain default policies for the whole system. + +> TODO Document default policy settings + +### Manage Read Models + +Read Models are a way to normalize data out of the event stream for certain aspects. For example there is a model which consists of logonname and the password hash so that the login process can query that data. + +All read models are eventually consistent by nature and sometimes an administrator would like to verify they are still up-to-date. +In the ZITADEL Console is a section called administration available where the admin can check all read models and their current state. +There is even a possibility to regenerate a read model. + +> When a read model is regenerated it might take up some time to be fully operational again +> Depending on the model which is regenerated this might have a operational impact for the end-users + +> Screenshot here + +### Secret Handling + +ZITADEL stores secrets always encrypted or hashed in it's storage. +Whenever feasible we try to utilize public / private key mechanics to handle secrets. + +**Encryption** +We use `AES256` as default mechanic for storing secrets. + +**Password Hashing** +By default `bcrypt` is used with a salt of `14`. + +> This mechanic is used for user passwords and client secrets + +**Signing Keys** +These keys are randomly generated within ZITADEL and are rotated on a regular basis (e.g all 6h). + +> Signing keys are stored with AES256 encryption + +**TLS** +Under normal operations ZITADEL's API nodes are located behind a reverse proxy. So the TLS Key handling are out of context in this regard. +However ZITADEL can use TLS keys at runtime level. + +> TODO Document TLS config + +### IAM Configuration + +> TODO Document ZITADEL config + +### Audit system changes + +> Screenshot here diff --git a/site/docs/develop/00-overview.de.md b/site/docs/develop/00-overview.de.md new file mode 100644 index 0000000000..ee626691f2 --- /dev/null +++ b/site/docs/develop/00-overview.de.md @@ -0,0 +1,6 @@ +--- +title: Übersicht +description: … +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/develop/00-overview.en.md b/site/docs/develop/00-overview.en.md new file mode 100644 index 0000000000..ec508cc0a8 --- /dev/null +++ b/site/docs/develop/00-overview.en.md @@ -0,0 +1,40 @@ +--- +title: Overview +description: … +--- + +> All documentations are under active work and subject to change soon! + +### APIs + +--- + +ZITADEL provides three API's for different use cases. These API's are built with GRPC and then generate a REST service. +Each service's proto definition is located in the source control on GitHub. +As we generate the REST services and Swagger file out of the proto definition we recommend that you rely on the proto file. +We annotate the corresponding REST methods on each possible call as well as the AuthN and AuthZ requirements. + +See below for an example with the call **GetMyUser**. + +```Go + //User + rpc GetMyUser(google.protobuf.Empty) returns (UserView) { + option (google.api.http) = { + get: "/users/me" + }; + + option (caos.zitadel.utils.v1.auth_option) = { + permission: "authenticated" + }; + } +``` +--- + +As you can see the `GetMyUser` function is also available as a REST service under the path `/users/me`. + +In the table below you can see the URI of those calls. + +| Service | URI | +|:--------|:-----------------------------------------------------------------------------------------------------------------------------------------------| +| REST | [https://api.zitadel.ch/auth/v1/users/me](https://api.zitadel.ch/auth/v1/users/me) | +| GRPC | [https://api.zitadel.ch/caos.zitadel.auth.api.v1.AuthService/GetMyUser](https://api.zitadel.ch/caos.zitadel.auth.api.v1.AuthService/GetMyUser) | diff --git a/site/docs/develop/01-authentication.de.md b/site/docs/develop/01-authentication.de.md new file mode 100644 index 0000000000..ee94e19c7b --- /dev/null +++ b/site/docs/develop/01-authentication.de.md @@ -0,0 +1,6 @@ +--- +title: Authentication API +description: … +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/develop/01-authentication.en.md b/site/docs/develop/01-authentication.en.md new file mode 100644 index 0000000000..421f0fba7e --- /dev/null +++ b/site/docs/develop/01-authentication.en.md @@ -0,0 +1,18 @@ +--- +title: Authentication API +description: … +--- + +### Authentication aka Auth + +The authentication API (aka Auth API) is used for all operations on the currently logged in user. + +| Service | URI | +|:--------|:----------------------------------------------------------------------------------------------------------------------------| +| REST | [https://api.zitadel.ch/auth/v1/](https://api.zitadel.ch/auth/v1/) | +| GRPC | [https://api.zitadel.ch/caos.zitadel.auth.api.v1.AuthService/](https://api.zitadel.ch/caos.zitadel.auth.api.v1.AuthService) | + +> At a later date we might expose functions to build your own login GUI +> You can build your own user Register GUI already by utilizing the [Management API](#management) + +[Latest API Version](https://github.com/caos/zitadel/blob/master/pkg/grpc/auth/proto/auth.proto) diff --git a/site/docs/develop/02-management.de.md b/site/docs/develop/02-management.de.md new file mode 100644 index 0000000000..18adf5bf64 --- /dev/null +++ b/site/docs/develop/02-management.de.md @@ -0,0 +1,6 @@ +--- +title: Management API +description: … +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/develop/02-management.en.md b/site/docs/develop/02-management.en.md new file mode 100644 index 0000000000..a0af334c7a --- /dev/null +++ b/site/docs/develop/02-management.en.md @@ -0,0 +1,15 @@ +--- +title: Management API +description: … +--- + +### Management + +The management API is as the name states the interface where systems can mutate IAM objects like, organisations, projects, clients, users and so on if they have the necessary access rights. + +| Service | URI | +|:--------|:----------------------------------------------------------------------------------------------------------------------------------------------------| +| REST | [https://api.zitadel.ch/management/v1/](https://api.zitadel.ch/management/v1/) | +| GRPC | [https://api.zitadel.ch/caos.zitadel.management.api.v1.ManagementService/](https://api.zitadel.ch/caos.zitadel.management.api.v1.ManagementService) | + +[Latest API Version](https://github.com/caos/zitadel/blob/master/pkg/grpc/management/proto/management.proto) diff --git a/site/docs/develop/03-administration.de.md b/site/docs/develop/03-administration.de.md new file mode 100644 index 0000000000..b6b59725b6 --- /dev/null +++ b/site/docs/develop/03-administration.de.md @@ -0,0 +1,6 @@ +--- +title: Admin API +description: … +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/develop/03-administration.en.md b/site/docs/develop/03-administration.en.md new file mode 100644 index 0000000000..41cbadd14e --- /dev/null +++ b/site/docs/develop/03-administration.en.md @@ -0,0 +1,15 @@ +--- +title: Admin API +description: … +--- + +### Administration aka Admin + +This API is intended to configure and manage the IAM itself. + +| Service | URI | +|:--------|:--------------------------------------------------------------------------------------------------------------------------------| +| REST | [https://api.zitadel.ch/admin/v1/](https://api.zitadel.ch/admin/v1/) | +| GRPC | [https://api.zitadel.ch/caos.zitadel.admin.api.v1.AdminService/](https://api.zitadel.ch/caos.zitadel.admin.api.v1.AdminService) | + +[Latest API Version](https://github.com/caos/zitadel/blob/master/pkg/grpc/admin/proto/admin.proto) diff --git a/site/docs/documentation/00-introduction.de.md b/site/docs/documentation/00-introduction.de.md new file mode 100644 index 0000000000..8a27b82a81 --- /dev/null +++ b/site/docs/documentation/00-introduction.de.md @@ -0,0 +1,3 @@ +--- +title: Einführung +--- diff --git a/site/docs/documentation/00-introduction.en.md b/site/docs/documentation/00-introduction.en.md new file mode 100644 index 0000000000..c4ba3d591d --- /dev/null +++ b/site/docs/documentation/00-introduction.en.md @@ -0,0 +1,13 @@ +--- +title: Introduction +description: This is the place for all things ZITADEL. Whether you are a developer, an integrator or a user of ZITADEL, then the following pages are written for your referral. +--- + +> All documentations are under active work and subject to change soon! + +The documentation for ZITADEL comprises two major subject areas: + +1. Manuals for users, support organisations and administrators. +2. Technical resources for developers and integrators. + +Please be reminded that ZITADEL is open source — and so is the documentation. Should you happen to stumble over an incorrectness, a spelling mistake, a hard-to-understand text passage, please don’t hesitate to leave a comment or propose a corresponding change. diff --git a/site/docs/documentation/01-priciples.de.md b/site/docs/documentation/01-priciples.de.md new file mode 100644 index 0000000000..51456b6b62 --- /dev/null +++ b/site/docs/documentation/01-priciples.de.md @@ -0,0 +1,20 @@ +--- +title: Prinzipien +--- + +- Seien Sie bei Ihren Entscheidungen transparent +- Zustandsloses Anwendungsdesign +- Das System der Aufzeichnungen ist der Ereignisspeicher +- Alles andere muss regeneriert werden können +- Versuchen Sie nicht, komplexe Probleme außerhalb des IAM-Bereichs zu lösen +- Verwenden Sie skalierbaren Speicher für den Ereignisspeicher und die Abfragemodelle +- Versuchen Sie, wenn immer möglich idempotent zu sein +- Reduzieren Sie die Notwendigkeit von System- oder externen Abhängigkeiten so weit wie möglich +- Automatisierung einbeziehen +- Zuerst die Design-API +- Optimieren Sie alle Komponenten für den Betrieb am zweiten Tag +- Verwenden Sie nur Open-Source-Projekte mit permissiven Lizenzen +- Rollen Sie nicht Ihre eigene Krypto +- Standard so weit wie möglich einbeziehen +- Nutzen Sie die Funktionen der Plattform +- Mit einem CDN und einer WAF laufen können diff --git a/site/docs/documentation/01-priciples.en.md b/site/docs/documentation/01-priciples.en.md new file mode 100644 index 0000000000..c9267b939d --- /dev/null +++ b/site/docs/documentation/01-priciples.en.md @@ -0,0 +1,23 @@ +--- +title: Principles +--- + +### ZITADEL engineering and design principles + +- Be transparent about your decisions +- Embrace stateless application design +- System of records is the event store +- Everything else needs to be able to be regenerated +- Try not so solve complex problems outside of the IAM Domain +- Use a scalable storage for the event store and read models +- Try to be idempotent whenever possible +- Reduce necessity of external systems or dependencies as much as possible +- Embrace automation +- Design API first +- Optimize all components for day-two operations +- Use only open source projects with permissive licenses +- Don't roll your own crypto algorithm +- Embrace (industry) standard as much as possible +- Make use of platform features +- Be able to run with a CDN and WAF +- Releases utilized semantic versioning and release whenever feasible diff --git a/site/docs/documentation/02-architecture.de.md b/site/docs/documentation/02-architecture.de.md new file mode 100644 index 0000000000..3f807cab7e --- /dev/null +++ b/site/docs/documentation/02-architecture.de.md @@ -0,0 +1,5 @@ +--- +title: Architektur +--- + +> TBD diff --git a/site/docs/documentation/02-architecture.en.md b/site/docs/documentation/02-architecture.en.md new file mode 100644 index 0000000000..f69616dfe7 --- /dev/null +++ b/site/docs/documentation/02-architecture.en.md @@ -0,0 +1,5 @@ +--- +title: Architecture +--- + +> TBD diff --git a/site/docs/documentation/03-openidoauth.de.md b/site/docs/documentation/03-openidoauth.de.md new file mode 100644 index 0000000000..98d47d61d8 --- /dev/null +++ b/site/docs/documentation/03-openidoauth.de.md @@ -0,0 +1,5 @@ +--- +title: OpenID Connect 1.0 & OAuth 2.0 +--- + +> TBD diff --git a/site/docs/documentation/03-openidoauth.en.md b/site/docs/documentation/03-openidoauth.en.md new file mode 100644 index 0000000000..f37520a7ea --- /dev/null +++ b/site/docs/documentation/03-openidoauth.en.md @@ -0,0 +1,142 @@ +--- +title: OpenID Connect 1.0 & OAuth 2.0 +--- + +### Endpoints and Domains + +This chapter documents the [OpenID Connect 1.0](https://openid.net/connect/) and [OAuth 2.0](https://oauth.net/2/) features provided by **ZITADEL**. + +Under normal circumstances **ZITADEL** need four domain names to operate properly. + +| Domain Name | Example | Description | +|:------------|:--------------------|--------------------------------------------------------------------------------------------------------------------------------------| +| issuer | issuer.zitadel.ch | Provides the [OpenID Connect 1.0 Discovery Endpoint](#openid-connect-10-discovery) | +| api | api.zitadel.ch | All ZITADEL API's are located under this domain see [API explanation](develop#APIs) for details | +| login | accounts.zitadel.ch | The accounts.* page provides server renderer pages like login and register and as well the authorization_endpoint for OpenID Connect | +| console | console.zitadel.ch | With the console.* domain we serve the assets for the management gui | + +#### OpenID Connect 1.0 Discovery + +The OpenID Connect Discovery Endpoint is located within the issuer domain. +For example with [zitadel.ch](zitadel.ch) this would be the domain [issuer.zitadel.ch](issuer.zitadel.ch). This would give us [https://issuer.zitadel.ch/.well-known/openid-configuration](https://issuer.zitadel.ch/.well-known/openid-configuration). + +**Link to spec.** [OpenID Connect Discovery 1.0 incorporating errata set 1](https://openid.net/specs/openid-connect-discovery-1_0.html) + +#### authorization_endpoint + +[https://accounts.zitadel.ch/oauth/v2/authorize](https://accounts.zitadel.ch/oauth/v2/authorize) + +> The authorization_endpoint is located with the login page, due to the need of accessing the same cookie domain + +#### token_endpoint + +[https://api.zitadel.ch/oauth/v2/token](https://api.zitadel.ch/oauth/v2/token) + +#### userinfo_endpoint + +[https://api.zitadel.ch/oauth/v2/userinfo](https://api.zitadel.ch/oauth/v2/userinfo) + +#### end_session_endpoint + +[https://accounts.zitadel.ch/oauth/v2/endsession](https://accounts.zitadel.ch/oauth/v2/endsession) + +> The end_session_endpoint is located with the login page, due to the need of accessing the same cookie domain + +#### jwks_uri + +[https://api.zitadel.ch/oauth/v2/keys](https://api.zitadel.ch/oauth/v2/keys) + +> Be aware that these keys can be rotated without any prior notice. We will however make sure that a proper `kid` is set with each key! + +#### OAuth 2.0 Metadata + +**ZITADEL** does not provide a OAuth 2.0 Metadata endpoint but instead provides a [OpenID Connect Discovery Endpoint](#openid-connect-10-discovery). + +### Scopes + +#### How scopes work + +> TODO describe + +#### Reserved Scopes + +In addition to the standard compliant scopes we utilize the following scopes. + +| Scope | Description | Example | +|:------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------| +| urn:zitadel:iam:org:project:role:{rolename} | By using this scope a [client](administrate#clients) can request the claim urn:zitadel:iam:roles:rolename} to be asserted when possible. As an alternative approach you can enable all [roles](administrate#Roles) to be asserted from the [project](administrate#projects) a [client](administrate#clients) belongs to. See details [here](administrate#RBAC_Settings) | urn:zitadel:iam:org:project:role:user | +| urn:zitadel:iam:org:domain:primary:{domainname} | When requesting this scope **ZITADEL** will enforce that the user is a member of the selected organisation. If the organisation does not exist a failure is displayed | urn:zitadel:iam:org:domain:primary:acme.ch | +| urn:zitadel:iam:role:{rolename} | | | + +### Claims + +> TODO describe + +#### Reserved Claims + +| Claims | Description | Example | +|:------------------------------------------------|:------------|----------------------------------------------------------------------------------| +| urn:zitadel:iam:org:domain:primary:{domainname} | | `{"urn:zitadel:iam:org:domain:primary": "acme.ch"}` | +| urn:zitadel:iam:org:project:roles:{rolename} | | `{"urn:zitadel:iam:org:project:roles": [ {"user": {"id1": "acme.zitade.ch", "id2": "caos.ch"} } ] }` | +| urn:zitadel:iam:roles:{rolename} | | | + +### Grant Types + +For a list of supported or unsupported `Grant Types` please have a look at the table below. + +| Grant Type | Supported | +|:------------------------------------------------------|:--------------------| +| Authorization Code | yes | +| Authorization Code with PKCE | yes | +| Implicit | yes | +| Resource Owner Password Credentials | no | +| Client Credentials | yes | +| Device Authorization | under consideration | +| Refresh Token | work in progress | +| JSON Web Token (JWT) Profile | partially | +| Security Assertion Markup Language (SAML) 2.0 Profile | no | +| Token Exchange | work in progress | + +#### Authorization Code + +**Link to spec.** [The OAuth 2.0 Authorization Framework Section 1.3.1](https://tools.ietf.org/html/rfc6749#section-1.3.1) + +#### Proof Key for Code Exchange + +**Link to spec.** [Proof Key for Code Exchange by OAuth Public Clients](https://tools.ietf.org/html/rfc7636) + +#### Implicit + +**Link to spec.** [The OAuth 2.0 Authorization Framework Section 1.3.2](https://tools.ietf.org/html/rfc6749#section-1.3.2) + +#### Client Credentials + +**Link to spec.** [The OAuth 2.0 Authorization Framework Section 1.3.4](https://tools.ietf.org/html/rfc6749#section-1.3.4) + +#### Refresh Token + +**Link to spec.** [The OAuth 2.0 Authorization Framework Section 1.5](https://tools.ietf.org/html/rfc6749#section-1.5) + +#### JSON Web Token (JWT) Profile + +**Link to spec.** [JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants](https://tools.ietf.org/html/rfc7523) + +#### Token Exchange + +**Link to spec.** [OAuth 2.0 Token Exchange](https://tools.ietf.org/html/rfc8693) + +### Device Authorization + +**Link to spec.** [OAuth 2.0 Device Authorization Grant](https://tools.ietf.org/html/rfc8628) + +### Not Supported Grant Types + +#### Resource Owner Password Credentials + +> Due to growing security concerns we do not support this grant type. With OAuth 2.1 it looks like this grant will be removed. + +**Link to spec.** [OThe OAuth 2.0 Authorization Framework Section 1.3.3](https://tools.ietf.org/html/rfc6749#section-1.3.3) + +#### Security Assertion Markup Language (SAML) 2.0 Profile + +**Link to spec.** [Security Assertion Markup Language (SAML) 2.0 Profile for OAuth 2.0 Client Authentication and Authorization Grants](https://tools.ietf.org/html/rfc7522) diff --git a/site/docs/get_started/00-introduction.de.md b/site/docs/get_started/00-introduction.de.md deleted file mode 100644 index df781a8ca1..0000000000 --- a/site/docs/get_started/00-introduction.de.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Einführung ---- - -### Bevor es los geh't - -> Dies ist eine frühe Version unseres Dokumentgenerators. Es können noch einige Dinge ändern, bis wir Version 1.0 erreichen. - diff --git a/site/docs/get_started/00-introduction.en.md b/site/docs/get_started/00-introduction.en.md deleted file mode 100644 index 23b9959794..0000000000 --- a/site/docs/get_started/00-introduction.en.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Introduction ---- - -### Before we begin - -> This is an early version of our documentation. Some things may change until we hit version 1.0. -> This Documentation is and always will be a WIP, and will therefore be updated frequently. diff --git a/site/docs/get_started/01-capabilities.de.md b/site/docs/get_started/01-capabilities.de.md deleted file mode 100644 index 60d58b9249..0000000000 --- a/site/docs/get_started/01-capabilities.de.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Wie fange ich an? -description: Dieses Dokument beschreibt die Schlüsselfähigkeiten und führt in verschiedene Startszenarien ein ---- - - - -### I already have an authentication system - -Wenn Ihre App bereits über eine Anmeldeimplementierung verfügt und Sie diese zur Authentifizierung für Zitadel-Backend-Diensten verwenden möchten, lesen Sie unsere `Migrationsanleitung`. - -### Ich möchte mein Authentifizierungssystem mit Zitadel erstellen - -Wenn Sie eine neue App erstellen oder einer vorhandenen App eine Anmeldung hinzufügen, verfügt Zitadel über Bibliotheken und Dienste, mit denen Sie die sichere Authentifizierung implementieren können, ohne das Authentifizierungs-Backend selbst erstellen zu müssen. Die Zitadel-Authentifizierung ist eine vollständige Backend-Lösung, die die Anmeldung mit Kennwörtern und weiteren Faktoren zur verbesserten Sicherheit ermöglicht diff --git a/site/docs/get_started/01-capabilities.en.md b/site/docs/get_started/01-capabilities.en.md deleted file mode 100644 index 7aea8917f1..0000000000 --- a/site/docs/get_started/01-capabilities.en.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Where to start? -description: This document explains zitadels key capabilities ---- - - - -### I already have an authentication system - -If your app already has a sign-in implementation and you want to use it to authenticate with Zitadel backend services, read our `migration documentation`. - -### I want to build my authentication system with Zitadel - -If you're building a new app or adding sign-in to an existing app, Zitadel has libraries and services that can help you implement secure authentication without having to build the authentication backend yourself. Zitadel Authentication is a complete backend solution for signing in with passwords and additional Factors for enhanced Security. diff --git a/site/docs/get_started/02-go-structs.de.md b/site/docs/get_started/02-go-structs.de.md deleted file mode 100644 index c76b5559ac..0000000000 --- a/site/docs/get_started/02-go-structs.de.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Go structs ---- - -### Go structures - -You can reference go struct tables from our go struct generator. -Provide a `doc_assets` folder with all generated files in it. -Make sure that the `.md` file consists of no other than the table itself and metadata which defines name and description of the struct - - -| Attribute | Description | Default | Collection | -| --------------------------- | ------------------------------------------------------------------------------- | ------- | ---------- | -| boomVersion | Version of BOOM which should be reconciled | | | -| forceApply | Relative folder path where the currentstate is written to | | | -| currentStatePath | Flag if --force should be used by apply of resources | | | -| preApply | Spec for the yaml-files applied before applications | | | -| postApply | Spec for the yaml-files applied after applicatio | | | -| prometheus-operator | Spec for the Prometheus-Operator , | | | -| logging-operator | Spec for the Banzaicloud Logging-Operator , | | | -| prometheus-node-exporter | Spec for the Prometheus-Node-Exporter , | | | -| prometheus-systemd-exporter | Spec for the Prometheus-Systemd-Exporter , | | | -| grafana | Spec for the Grafana , [ | | | -| ambassador | Spec for the Ambassador , | | | -| kube-state-metrics | Spec for the Kube-State-Metrics , | | | -| argocd | Spec for the Argo-CD , | | | -| prometheus | Spec for the Prometheus instance , | | | -| loki | Spec for the Loki instance , | | | - -#### References - -To reference a table ... \ No newline at end of file diff --git a/site/docs/get_started/02-go-structs.en.md b/site/docs/get_started/02-go-structs.en.md deleted file mode 100644 index c76b5559ac..0000000000 --- a/site/docs/get_started/02-go-structs.en.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Go structs ---- - -### Go structures - -You can reference go struct tables from our go struct generator. -Provide a `doc_assets` folder with all generated files in it. -Make sure that the `.md` file consists of no other than the table itself and metadata which defines name and description of the struct - - -| Attribute | Description | Default | Collection | -| --------------------------- | ------------------------------------------------------------------------------- | ------- | ---------- | -| boomVersion | Version of BOOM which should be reconciled | | | -| forceApply | Relative folder path where the currentstate is written to | | | -| currentStatePath | Flag if --force should be used by apply of resources | | | -| preApply | Spec for the yaml-files applied before applications | | | -| postApply | Spec for the yaml-files applied after applicatio | | | -| prometheus-operator | Spec for the Prometheus-Operator , | | | -| logging-operator | Spec for the Banzaicloud Logging-Operator , | | | -| prometheus-node-exporter | Spec for the Prometheus-Node-Exporter , | | | -| prometheus-systemd-exporter | Spec for the Prometheus-Systemd-Exporter , | | | -| grafana | Spec for the Grafana , [ | | | -| ambassador | Spec for the Ambassador , | | | -| kube-state-metrics | Spec for the Kube-State-Metrics , | | | -| argocd | Spec for the Argo-CD , | | | -| prometheus | Spec for the Prometheus instance , | | | -| loki | Spec for the Loki instance , | | | - -#### References - -To reference a table ... \ No newline at end of file diff --git a/site/docs/get_started/03-concluding.de.md b/site/docs/get_started/03-concluding.de.md deleted file mode 100644 index 4ff3859135..0000000000 --- a/site/docs/get_started/03-concluding.de.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Abschliessendes ---- - -Das war unsere Dokumentation \ No newline at end of file diff --git a/site/docs/get_started/03-concluding.en.md b/site/docs/get_started/03-concluding.en.md deleted file mode 100644 index a39d483f44..0000000000 --- a/site/docs/get_started/03-concluding.en.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Concluding ---- - -This was our documentation \ No newline at end of file diff --git a/site/docs/get_started/seo.json b/site/docs/get_started/seo.json deleted file mode 100644 index 5448c75c4d..0000000000 --- a/site/docs/get_started/seo.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "tags": [ - { - "name": "twitter:title", - "content":"Docs demo page" - }, - { - "name": "twitter:description", - "content":"Docs demo page description" - }, - { - "name": "Description", - "content":"Docs demo page description" - } - ] -} \ No newline at end of file diff --git a/site/docs/integrate/00-overview.de.md b/site/docs/integrate/00-overview.de.md new file mode 100644 index 0000000000..5057e686af --- /dev/null +++ b/site/docs/integrate/00-overview.de.md @@ -0,0 +1,6 @@ +--- +title: Übersicht +description: ... +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/integrate/00-overview.en.md b/site/docs/integrate/00-overview.en.md new file mode 100644 index 0000000000..89dad2c4c0 --- /dev/null +++ b/site/docs/integrate/00-overview.en.md @@ -0,0 +1,10 @@ +--- +title: Overview +description: ... +--- + +> All documentations are under active work and subject to change soon! + +### Application Integration + +### Service Integration diff --git a/site/docs/integrate/01-openidoauth.de.md b/site/docs/integrate/01-openidoauth.de.md new file mode 100644 index 0000000000..6f9f11f3a5 --- /dev/null +++ b/site/docs/integrate/01-openidoauth.de.md @@ -0,0 +1,6 @@ +--- +title: OpenID Connect & OAuth +description: ... +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/integrate/01-openidoauth.en.md b/site/docs/integrate/01-openidoauth.en.md new file mode 100644 index 0000000000..48b2517624 --- /dev/null +++ b/site/docs/integrate/01-openidoauth.en.md @@ -0,0 +1,46 @@ +--- +title: OpenID Connect & OAuth +description: ... +--- + +### Client Types / Profiles + +#### Single Page Application + +If your [client](administrate#Clients) is a single page application (SPA) we recommend that you use [Authorization Code](documentation#Authorization_Code) in combination with [Proof Key for Code Exchange](documentation#Proof_Key_for_Code_Exchange). + +This flow has great support with most modern languages and frameworks and is the recommended default. + +> In the OIDC and OAuth world this **client profile** is called "user-agent-based application" + +#### Server Side Application + +In the OIDC and OAuth world this client profile is called "web application" + +#### Mobile App / Native App + +In the OIDC and OAuth world this client profile is called "native application" + +### How to consume authorizations in your application or service + +--- + +With ZITADEL you can manage the [roles](administrate#Roles) a [project](administrate#Projects) supplies to your users in the form of authorizations. +On the [project](administrate#Projects) it can be configured how **project roles** are supplied to the [clients](administrate#Clients). +By default ZITADEL asserts the claim **urn:zitadel:iam:org:project:roles** to the [Userinfo Endpoint](documentation#userinfo_endpoint) + +- Assert the claim **urn:zitadel:iam:org:project:roles** to **access_token** +- Assert the claim **urn:zitadel:iam:org:project:roles** to **id_token** + +```JSON + "urn:zitadel:iam:org:project:roles": { + "user": { + "id1": "acme.zitadel.ch", + "id2": "caos.ch", + } + } +``` + +--- + +For more details about how **ZITADEL** treats [scopes](documentation#Scopes) and [claims](documentation#Claims) see the [documentations](documentation). diff --git a/site/docs/start/00-quick-start.de.md b/site/docs/start/00-quick-start.de.md new file mode 100644 index 0000000000..8f73dcc2f8 --- /dev/null +++ b/site/docs/start/00-quick-start.de.md @@ -0,0 +1,6 @@ +--- +title: Schnellstart +description: ... +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/start/00-quick-start.en.md b/site/docs/start/00-quick-start.en.md new file mode 100644 index 0000000000..6f2a15e85f --- /dev/null +++ b/site/docs/start/00-quick-start.en.md @@ -0,0 +1,50 @@ +--- +title: Quick-Start +description: A quick-start reference for the impatient reader. +--- + +> All documentations are under active work and subject to change soon! + +### Try ZITADEL + +You can either use [ZITADEL.ch](https://zitadel.ch) or deploy a dedicated **ZITADEL** instance. + +### Use ZITADEL.ch + +To register your free [organisation](administrate#Organisations), visit this link [register organisation](https://accounts.zitadel.ch/register/org). +After accepting the TOS and filling out all the required fields you will receive an email with further instructions. + + + +#### Verify your domain name (optional) + +When you verify your domain you get the benefit that your [organisations](administrate#Organisations) [users](administrate#Users) can use this domain as **preferred logonname**. You find a more detailed explanation [How ZITADEL handles usernames](administrate#How_ZITADEL_handles_usernames). + +The verification process is documented [here](administrate#Verify_a_domain_name) + +#### Add Users to your organisation + +To add new user just follow [this guide](administrate#Create_Users) + +#### Setup an application + +First [create a project](administrate#Create_a_project) + +Then create within this [project](administrate#Projects) a [new client](administrate#Create_a_client) + +The wizard should provide some guidance what client is the proper for you. If you are still unsure consult our [Integration Guide](integrate#Overview) + +### Use ORBOS to install ZITADEL + +> This will be added later on + +### Install ZITADEL with static manifest + +> This will be added later on diff --git a/site/docs/use/00-user.de.md b/site/docs/use/00-user.de.md new file mode 100644 index 0000000000..2fee90e9dd --- /dev/null +++ b/site/docs/use/00-user.de.md @@ -0,0 +1,5 @@ +--- +title: Benutzerhandbuch +--- + +> This Language is not yet translated. Please consult the English version. diff --git a/site/docs/use/00-user.en.md b/site/docs/use/00-user.en.md new file mode 100644 index 0000000000..b4556372ce --- /dev/null +++ b/site/docs/use/00-user.en.md @@ -0,0 +1,44 @@ +--- +title: User Manual +--- + +> All documentations are under active work and subject to change soon! + +### Self Register User + +### Verify EMail + +### Verify Phone + +### Change Password + +### Manage Multi Factor + +### Federation + +#### Auto Register + +#### Manage Account Linking + +### Login User + + diff --git a/site/package-lock.json b/site/package-lock.json index 54a024e83a..37d3815838 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -30,19 +30,19 @@ } }, "@babel/core": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.0.tgz", - "integrity": "sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.1.tgz", + "integrity": "sha512-6bGmltqzIJrinwRRdczQsMhruSi9Sqty9Te+/5hudn4Izx/JYRhW1QELpR+CIL0gC/c9A7WroH6FmkDGxmWx3w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.0", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.1", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -63,12 +63,12 @@ } }, "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -94,35 +94,37 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -136,25 +138,24 @@ } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -184,9 +185,9 @@ } }, "@babel/parser": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz", - "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==", + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", "dev": true }, "@babel/template": { @@ -201,26 +202,26 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -229,20 +230,14 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -490,14 +485,14 @@ } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" }, "dependencies": { "@babel/code-frame": { @@ -510,12 +505,12 @@ } }, "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -567,9 +562,9 @@ } }, "@babel/parser": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz", - "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==", + "version": "7.12.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", + "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", "dev": true }, "@babel/template": { @@ -584,26 +579,26 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -612,20 +607,14 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1103,15 +1092,49 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz", - "integrity": "sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-shorthand-properties": { @@ -1354,18 +1377,26 @@ "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==" }, "@rollup/plugin-commonjs": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz", - "integrity": "sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz", + "integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.8", + "@rollup/pluginutils": "^3.1.0", "commondir": "^1.0.1", - "estree-walker": "^1.0.1", - "glob": "^7.1.2", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0" + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "dependencies": { + "estree-walker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz", + "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==", + "dev": true + } } }, "@rollup/plugin-json": { @@ -1378,18 +1409,17 @@ } }, "@rollup/plugin-node-resolve": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.1.tgz", - "integrity": "sha512-KIeAmueDDaYMqMBnUngLVVZhURwxA12nq/YB6nGm5/JpVyOMwI1fCVU3oL/dAnnLBG7oiPXntO5LHOiMrfNXCA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz", + "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==", "dev": true, "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", "builtin-modules": "^3.1.0", - "deep-freeze": "^0.0.1", "deepmerge": "^4.2.2", "is-module": "^1.0.0", - "resolve": "^1.14.2" + "resolve": "^1.17.0" } }, "@rollup/pluginutils": { @@ -1448,9 +1478,9 @@ "dev": true }, "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "requires": { "@types/node": "*" @@ -1506,9 +1536,9 @@ "dev": true }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, "brace-expansion": { @@ -1587,9 +1617,9 @@ } }, "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -1599,7 +1629,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "clean-css": { @@ -1722,12 +1752,6 @@ "ms": "2.0.0" } }, - "deep-freeze": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", - "dev": true - }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -1927,9 +1951,9 @@ "dev": true }, "highlight.js": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.1.2.tgz", - "integrity": "sha512-Q39v/Mn5mfBlMff9r+zzA+gWxRsCRKwEMvYTiisLr/XUiFI/4puWt0Ojdko3R3JCNWGdOWaA5g/Yxqa23kC5AA==" + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.2.1.tgz", + "integrity": "sha512-A+sckVPIb9zQTUydC9lpRX1qRFO/N0OKEh0NwIr65ckvWA/oMY8v9P3+kGRK3w2ULSh9E8v5MszXafodQ6039g==" }, "hosted-git-info": { "version": "2.8.8", @@ -1953,9 +1977,9 @@ } }, "http-link-header": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.0.2.tgz", - "integrity": "sha512-z6YOZ8ZEnejkcCWlGZzYXNa6i+ZaTfiTg3WhlV/YvnNya3W/RbX1bMVUMTuCrg/DrtTCQxaFCkXCz4FtLpcebg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.0.3.tgz", + "integrity": "sha512-nARK1wSKoBBrtcoESlHBx36c1Ln/gnbNQi1eB6MeTUefJIT3NvUOsV15bClga0k38f0q/kN5xxrGSDS3EFnm9w==", "dev": true }, "inflight": { @@ -2093,9 +2117,9 @@ "dev": true }, "jest-worker": { - "version": "26.2.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.2.1.tgz", - "integrity": "sha512-+XcGMMJDTeEGncRb5M5Zq9P7K4sQ1sirhjdOxsN1462h6lFo9w59bl2LVQmdGEEeU3m+maZCkS2Tcc9SfCHO4A==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", "dev": true, "requires": { "@types/node": "*", @@ -2110,9 +2134,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -2175,9 +2199,9 @@ } }, "livereload-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz", - "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz", + "integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==", "dev": true }, "load-json-file": { @@ -2400,9 +2424,9 @@ } }, "opts": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz", - "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", "dev": true }, "p-limit": { @@ -2544,9 +2568,9 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -2642,9 +2666,9 @@ } }, "rollup": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.23.0.tgz", - "integrity": "sha512-vLNmZFUGVwrnqNAJ/BvuLk1MtWzu4IuoqsH9UWK5AIdO3rt8/CSiJNvPvCIvfzrbNsqKbNzPAG1V2O4eTe2XZg==", + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.1.tgz", + "integrity": "sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -2661,9 +2685,9 @@ } }, "rollup-plugin-livereload": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.3.0.tgz", - "integrity": "sha512-abyqXaB21+nFHo+vJULBqfzNx6zXABC19UyvqgDfdoxR/8pFAd041GO+GIUe8ZYC2DbuMUmioh1Lvbk14YLZgw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", + "integrity": "sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==", "dev": true, "requires": { "livereload": "^0.9.1" @@ -2680,9 +2704,9 @@ } }, "rollup-plugin-svelte": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.2.tgz", - "integrity": "sha512-I+TJ2T+VLKGbKQcpeMJ4AR2ciROqTZNjxbiMiH4Cn1yByaB9OEuy3CnrgHHuWatQcPuF3yIViyKX7OlETWDKOQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-6.0.1.tgz", + "integrity": "sha512-kS9/JZMBNgpKTqVKlwV8mhmGwxu8NiNf6+n5ZzdZ8yDp3+ADqjf8Au+JNEpoOn6kLlh1hLS2Gsa76k9RP57HDQ==", "dev": true, "requires": { "require-relative": "^0.8.7", @@ -2691,15 +2715,43 @@ } }, "rollup-plugin-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz", - "integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "jest-worker": "^26.0.0", - "serialize-javascript": "^3.0.0", - "terser": "^4.7.0" + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, "rollup-pluginutils": { @@ -2725,16 +2777,25 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "sapper": { - "version": "0.27.16", - "resolved": "https://registry.npmjs.org/sapper/-/sapper-0.27.16.tgz", - "integrity": "sha512-q8dohkbhga6xO+0a8h84odFyoilQ0D0vJtF8NHra/DQmSeN2R2MXUfwhw3EyvLms3T1x8H3v+qw642Qf5JXA9g==", + "version": "0.28.10", + "resolved": "https://registry.npmjs.org/sapper/-/sapper-0.28.10.tgz", + "integrity": "sha512-Z6OpuDOHxiRHKd7JCjHaDe8uOM2fFZxpTLsj/0Ib4sM034xstEvNNUtdY7Pg/a85kP3cFCnkNiM1v7W37vzDGg==", "dev": true, "requires": { "html-minifier": "^4.0.0", "http-link-header": "^1.0.2", - "shimport": "^1.0.1", + "shimport": "^2.0.4", + "source-map": "^0.6.1", "sourcemap-codec": "^1.4.6", "string-hash": "^1.1.3" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "semver": { @@ -2744,9 +2805,9 @@ "dev": true }, "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -2774,9 +2835,9 @@ "dev": true }, "shimport": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/shimport/-/shimport-1.0.1.tgz", - "integrity": "sha512-Imf4gH+8WQmT1GvxS/x79qpmfnE6m50hyN1ucatX+7oMCgmaF8obZWCPIzSUe6+P+YmXM46lkP2pxiV2/lt9Og==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/shimport/-/shimport-2.0.4.tgz", + "integrity": "sha512-5YOyQqYkOFSkPFnpS87De6BYzDiZBc8FS4/aTuGZiST+WmXSwWRoaNRHqyVOeEpSx9wlgYWg9WYfCuzD/11/qA==", "dev": true }, "sirv": { @@ -2924,9 +2985,9 @@ } }, "svelte": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.24.0.tgz", - "integrity": "sha512-VFXom6EP2DK83kxy4ZlBbaZklSbZIrpNH3oNXlPYHJUuW4q1OuAr3ZoYbfIVTVYPDgrI7Yq0gQcOhDlAtO4qfw==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.29.4.tgz", + "integrity": "sha512-oW0fGHlyFFMvzRtIvOs84b0fOc0gmZNQcL5Is3hxuTpvaYX3pfd8oHy4KnOvbq4Ca6SG6AHdRMk7OhApTo0NqA==", "dev": true }, "svelte-i18n": { @@ -2953,20 +3014,20 @@ } }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.5.tgz", + "integrity": "sha512-Qw3CZAMmmfU824AoGKalx+riwocSI5Cs0PoGp9RdSLfmxkmJgyBxqLBP/isDNtFyhHnitikvRMZzyVgeq+U+Tg==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } @@ -3004,9 +3065,9 @@ } }, "uglify-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", - "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.4.tgz", + "integrity": "sha512-FyYnoxVL1D6+jDGQpbK5jW6y/2JlVfRfEeQ67BPCUg5wfCjaKOpr2XeceE4QL+MkhxliLtf5EbrMDZgzpt2CNw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { diff --git a/site/package.json b/site/package.json index 261e4f7e60..3b069ebf63 100644 --- a/site/package.json +++ b/site/package.json @@ -28,17 +28,17 @@ "@babel/plugin-transform-runtime": "^7.9.0", "@babel/preset-env": "^7.9.0", "@babel/runtime": "^7.9.2", - "@rollup/plugin-commonjs": "^14.0.0", + "@rollup/plugin-commonjs": "^15.1.0", "@rollup/plugin-json": "^4.0.3", - "@rollup/plugin-node-resolve": "^8.0.1", + "@rollup/plugin-node-resolve": "^9.0.0", "npm-run-all": "^4.1.5", - "rollup": "^2.15.0", + "rollup": "^2.32.1", "rollup-plugin-babel": "^4.4.0", - "rollup-plugin-livereload": "^1.3.0", + "rollup-plugin-livereload": "^2.0.0", "rollup-plugin-replace": "^2.2.0", - "rollup-plugin-svelte": "^5.2.0", - "rollup-plugin-terser": "^6.1.0", - "sapper": "^0.27.14", - "svelte": "^3.20.1" + "rollup-plugin-svelte": "^6.0.1", + "rollup-plugin-terser": "^7.0.2", + "sapper": "^0.28.10", + "svelte": "^3.29.4" } } diff --git a/site/rollup.config.js b/site/rollup.config.js index f738ee7c27..7b0c2b6e04 100644 --- a/site/rollup.config.js +++ b/site/rollup.config.js @@ -13,7 +13,20 @@ const mode = process.env.NODE_ENV; const dev = mode === 'development'; const legacy = !!process.env.SAPPER_LEGACY_BUILD; -const onwarn = (warning, onwarn) => (warning.code === 'CIRCULAR_DEPENDENCY' && /[/\\]@sapper[/\\]/.test(warning.message)) || onwarn(warning); +const onwarn = (warning, onwarn) => { + if ( + (warning.code === 'CIRCULAR_DEPENDENCY' && + /[/\\]@sapper[/\\]/.test(warning.message)) + ) { + return; + } + + if (warning.code === 'THIS_IS_UNDEFINED') { + return; + } + + onwarn(warning); +}; export default { client: { diff --git a/site/src/client.js b/site/src/client.js index 4be221b4ba..fb03b5816a 100644 --- a/site/src/client.js +++ b/site/src/client.js @@ -3,9 +3,12 @@ import '../static/base.css'; import * as sapper from '@sapper/app'; import { startClient } from './i18n.js'; +import { initPhotoSwipeFromDOM } from './utils/photoswipe.js'; startClient(); +initPhotoSwipeFromDOM('.zitadel-gallery'); + sapper.start({ target: document.querySelector('#sapper') }); diff --git a/site/src/components/Docs.svelte b/site/src/components/Docs.svelte index 3f9f0c7f91..5f4cbc7d37 100644 --- a/site/src/components/Docs.svelte +++ b/site/src/components/Docs.svelte @@ -4,8 +4,8 @@ import Icon from "./Icon.svelte"; import manifest from '../../static/manifest.json'; export let owner = "caos"; - export let project = "zitadel/site"; - export let path = "/docs"; + export let project = "zitadel"; + export let path = "site/docs"; export let dir = ""; export let edit_title = "edit this section"; export let sections; @@ -177,7 +177,7 @@ } .sidebar { - padding: var(--top-offset) 0 6.4rem 3.2rem; + padding: var(--top-offset) 0 6.4rem 0; font-family: var(--font); overflow-y: auto; height: 100%; @@ -201,10 +201,10 @@ } .content h2 { - margin-top: 8rem; + margin-top: 4rem; padding: 2rem 1.6rem 4rem 0.2rem; border-top: var(--border-w) solid #6767785b; /* based on --second */ - color: var(--text); + color: var(--heading); line-height: 1; font-size: var(--h3); letter-spacing: 0.05em; @@ -265,9 +265,9 @@ .content :global(h3), .content :global(h3 > code) { - margin: 6.4rem 0 0 0; - padding: 2rem 1.6rem 5.6rem 0.2rem; - color: var(--text); + margin: 2.0rem 0 0 0; + padding: 2rem 1.6rem 2.0rem 0.2rem; + color: var(--heading); border-top: var(--border-w) solid #6767781f; /* based on --second */ background: transparent; line-height: 1; @@ -291,8 +291,8 @@ font-family: inherit; font-weight: 500; font-size: 2.4rem; - color: var(--text); - margin: 6.4rem 0 1.6rem 0; + color: var(--heading); + margin: 2.0rem 0 1.6rem 0; padding-left: 0; background: transparent; line-height: 1; @@ -383,13 +383,14 @@ } section :global(blockquote) { - color: #e91e63; - border: 2px solid var(--flash); + color: #85d996; + border: 2px solid var(--grey-text); + background: #2a2f45; } section :global(blockquote) :global(code) { - background: hsl(204, 100%, 95%) !important; - color: #e91e63; + /* background: hsl(204, 100%, 95%) !important; */ + color: var(--prime); } diff --git a/site/src/components/GuideContents.svelte b/site/src/components/GuideContents.svelte index ad1aba0242..2b486249c2 100644 --- a/site/src/components/GuideContents.svelte +++ b/site/src/components/GuideContents.svelte @@ -57,7 +57,7 @@ .section { display: block; - padding: 0 0 .8rem 0; + padding: .8rem 0 .8rem 0; font-size: var(--h6); text-transform: uppercase; letter-spacing: 0.1em; @@ -65,28 +65,42 @@ } .subsection { - display: block; - font-size: 1.6rem; - font-family: var(--font); - padding: 0 0 0.6em 0; - } + display: block; + font-family: var(--font); + font-size: 14px; + padding: 0.4em 0 0.4em 0; + color: #a3acb9; + } + + .section, + .subsection { + border-top-right-radius: 50vw; + border-bottom-right-radius: 50vw; + padding-left: 2rem; + display: flex; + justify-content: space-between; + align-items: center; + } .section:hover, .subsection:hover, .active { color: var(--flash); font-weight: 500; + color: #6c8eef; + background-color: rgba(82,130,193,.1); + padding-right: 1rem; } .subsection[data-level="4"] { - padding-left: 1.2rem; + padding-left: 3.2rem; } .icon-container { - position: absolute; - top: -.2rem; - right: 2.4rem; - } + margin-right: 1rem; + margin-left: .5rem; + color: white; + } @media (min-width: 832px) { a { @@ -99,7 +113,7 @@ .active { color: #5282c1; } - } + }
    \ No newline at end of file diff --git a/site/src/components/Section.svelte b/site/src/components/Section.svelte index fc7836eb1a..4a243f5519 100644 --- a/site/src/components/Section.svelte +++ b/site/src/components/Section.svelte @@ -6,7 +6,7 @@ max-width: 120rem; } section :global(h3) { - color: var(--text); + color: var(--heading); } diff --git a/site/src/messages/de.json b/site/src/messages/de.json index e88a1ffd63..5db2a45b8e 100644 --- a/site/src/messages/de.json +++ b/site/src/messages/de.json @@ -1,8 +1,16 @@ { - "title": "Zitadel Identity and Access Management", - "description":"Die meisten Apps müssen die Identität eines Benutzers kennen. Wenn Sie die Identität eines Benutzers kennen, kann eine App Benutzerdaten sicher speichern und auf allen Geräten des Benutzers dieselbe personalisierte Erfahrung bieten.", - "description2":"Die Zitadel-Authentifizierung bietet Backend-Dienste, benutzerfreundliche SDKs und vorgefertigte UI-Bibliotheken zur Authentifizierung von Benutzern bei Ihrer App. Es unterstützt die Authentifizierung mithilfe von Passwörtern und bietet weitere Sicherheitsmechanismen, wie einen zweiten Faktor über OTP um einen sicheren Zugang zu gewährleisten.", - "description3":"Zitadel nutzt Industriestandards wie OAuth 2.0 und OpenID Connect, sodass sie problemlos in Ihr benutzerdefiniertes Backend integriert werden kann.", - "button":"Erfahren Sie wie sie starten", - "toconsole":"Zur Zitadel Konsole" -} \ No newline at end of file + "title": "ZITADEL Identity and Access Management", + "description":"Die meisten Applikationen müssen die Identität eines Benutzers kennen, um Benutzerdaten sicher zu speichern und auf allen Geräten des Benutzers dieselbe personalisierte Erfahrung zu bieten.", + "description2":"Die Authentifizierung von ZITADEL bietet Backend-Dienste, benutzerfreundliche SDKs und vorgefertigte UI-Bibliotheken zur Authentifizierung von Benutzern in Ihrer Applikation. Es unterstützt die Authentifizierung mithilfe von Passwörtern und bietet weitere Sicherheitsmechanismen, wie einen zweiten Faktor beispielsweise über OTP, um einen sicheren Zugang zu gewährleisten.", + "description3":"ZITADEL nutzt Industriestandards wie OAuth 2.0 und OpenID Connect, die leicht in Ihr benutzerdefiniertes Backend integriert werden können.", + "startlink": "Erfahren Sie hier, wie Sie starten", + "integratelink": "Sichern Sie Ihre Applikationen und Schnittstellen", + "administratelink": "Administrieren", + "developlink":"Entwickeln", + "docslink":"Dokumentation", + "uselink":"Benutzer Handbuch", + "toconsole":"ZITADEL Console öffnen" +} + + + diff --git a/site/src/messages/en.json b/site/src/messages/en.json index c611fdc373..9b6adedbc8 100644 --- a/site/src/messages/en.json +++ b/site/src/messages/en.json @@ -1,8 +1,15 @@ { - "title": "Zitadel Identity and Access Management", - "description":"Most apps need to know the identity of a user. Knowing a user's identity allows an app to securely save user data in the cloud and provide the same personalized experience across all of the user's devices.", - "description2":"Zitadel Authentication provides backend services, easy-to-use SDKs, and ready-made UI libraries to authenticate users to your app. It supports authentication using passwords and uses additional Security, like a second Factor over OTP ensure a safe access.", - "description3":"Zitadel Authentication leverages industry standards like OAuth 2.0 and OpenID Connect, so it can be easily integrated with your custom backend.", - "button":"Learn how to get started", - "toconsole":"Go to zitadel console" -} \ No newline at end of file + "title": "ZITADEL Identity and Access Management", + "description":"Most applications need to know the identity of a user allowing to securely store user data in the cloud and provide the same personalised experience across all of the user's devices.", + "description2":"ZITADEL's authentication provides backend services, easy-to-use SDKs, and ready-made UI libraries to authenticate users in your applicqtion. It supports authentication using passwords and applies additional security wirh the help of a second factor, for example OTP, to ensure a safe and secure access.", + "description3":"ZITADEL's authentication leverages industry standards like OAuth 2.0 and OpenID Connect so that it can be easily integrated in your custom backend.", + "startlink": "Start using ZITADEL", + "integratelink": "Secure your applications and apis with ZITADEL", + "administratelink": "Administrate ZITADEL", + "developlink":"Develop with the ZITADEL api's", + "docslink":"ZITADEL Documentations", + "uselink":"User Manuals", + "toconsole":"Open ZITADEL Console" +} + + diff --git a/site/src/routes/[slug].svelte b/site/src/routes/[slug].svelte index e61d2182cc..309ae841e1 100644 --- a/site/src/routes/[slug].svelte +++ b/site/src/routes/[slug].svelte @@ -12,7 +12,13 @@ import Docs from "../components/Docs.svelte"; export let slug; export let sections; + import { onMount } from 'svelte'; export let tags; + import { initPhotoSwipeFromDOM } from '../utils/photoswipe.js'; + + onMount(() => { + initPhotoSwipeFromDOM('.zitadel-gallery'); + }); diff --git a/site/src/routes/_layout.svelte b/site/src/routes/_layout.svelte index 35a59ef769..0239765c2b 100644 --- a/site/src/routes/_layout.svelte +++ b/site/src/routes/_layout.svelte @@ -4,6 +4,7 @@ import Nav from "../components/Nav.svelte"; import NavItem from "../components/NavItem.svelte"; import manifest from '../../static/manifest.json'; + import PhotoSwipe from '../components/PhotoSwipe.svelte'; export let segment; const { page } = stores(); @@ -22,4 +23,5 @@
    +
    diff --git a/site/src/routes/index.svelte b/site/src/routes/index.svelte index 5be943b4f2..3ef965344e 100644 --- a/site/src/routes/index.svelte +++ b/site/src/routes/index.svelte @@ -18,6 +18,7 @@ position: absolute; top: 80px; height: 60vh; + max-height: 500px; right: 0; } .section { @@ -39,7 +40,7 @@ - Caos • Documentation + ZITADEL • Documentation @@ -51,7 +52,15 @@

    {$_('description')}

    {$_('description2')}

    {$_('description3')}

    - - {$_('button')} + + +
diff --git a/site/src/template.html b/site/src/template.html index e8a3611a6e..448f83a55d 100644 --- a/site/src/template.html +++ b/site/src/template.html @@ -13,6 +13,12 @@ + + + + + +