feat: Custom text login (#1925)

* feat: default custom message text

* feat: org custom message text

* feat: org custom message text

* feat: custom messages query side

* feat: default messages

* feat: message text user fields

* feat: check for inactive user

* feat: fix send password reset

* feat: fix custom org text

* feat: add variables to docs

* feat: custom text tests

* feat: fix notifications

* feat: add custom text feature

* feat: add custom text feature

* feat: feature in custom message texts

* feat: add custom text feature in frontend

* feat: merge main

* feat: feature tests

* feat: change phone message in setup

* fix: remove unused code, add event translation

* fix: merge main and fix problems

* fix: english translation file

* fix: migration versions

* fix: setup

* fix: custom login text

* feat: add all possible custom texts for login

* feat: iam login texts

* feat: org login texts

* feat: protos

* fix: custom text in admin api

* fix: add success login text

* fix: docs

* fix: add custom login texts to management api

* fix: add sub messages to custom login texts

* fix: setup custom texts

* feat: get org login texts

* feat: get org login texts

* feat: handler in adminapi

* feat: handlers in auth and admin

* feat: render login texts

* feat: custom login text

* feat: add all login text keys

* feat: handle correct login texts

* feat: custom login texts in command side

* feat: custom login texts in command side

* feat: fix yaml file

* feat: merge master and add confirmation text

* feat: fix html

* feat: read default login texts

* feat: get default text files

* feat: get custom texts org

* feat: tests

* feat: change translator handling

* fix translator from authReq

* feat: change h1 on login screens

* feat: add custom login text for remove

* feat: add custom login text for remove

* feat: cache translation files

* feat: cache translation files

* feat: zitadel user in env var

* feat: add registration user description

* feat: better func naming

* feat: tests

* feat: add mutex to read file

* feat: add mutex to read file

* fix mutex for accessing translation map

* fix: translation key

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Fabi
2021-07-05 15:10:49 +02:00
committed by GitHub
parent 7c0bc8f63d
commit 99b2c33ccb
124 changed files with 21023 additions and 474 deletions

View File

@@ -1641,6 +1641,41 @@ service AdminService {
};
}
//Returns the default custom texts for login ui
rpc GetDefaultLoginTexts(GetDefaultLoginTextsRequest) returns (GetDefaultLoginTextsResponse) {
option (google.api.http) = {
get: "/text/default/login/{language}";
};
option (zitadel.v1.auth_option) = {
permission: "iam.policy.read";
};
}
//Returns the custom texts for login ui
rpc GetCustomLoginTexts(GetCustomLoginTextsRequest) returns (GetCustomLoginTextsResponse) {
option (google.api.http) = {
get: "/text/login/{language}";
};
option (zitadel.v1.auth_option) = {
permission: "iam.policy.read";
};
}
//Sets the custom text for login ui
//it impacts all organisations without customized login ui texts
rpc SetCustomLoginText(SetCustomLoginTextsRequest) returns (SetCustomLoginTextsResponse) {
option (google.api.http) = {
put: "/text/login/{language}";
body: "*";
};
option (zitadel.v1.auth_option) = {
permission: "iam.policy.write";
};
}
//Returns the IAM roles visible for the requested user
rpc ListIAMMemberRoles(ListIAMMemberRolesRequest) returns (ListIAMMemberRolesResponse) {
option (google.api.http) = {
@@ -3108,6 +3143,65 @@ message SetDefaultDomainClaimedMessageTextResponse {
zitadel.v1.ObjectDetails details = 1;
}
message GetDefaultLoginTextsRequest {
string language = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
}
message GetDefaultLoginTextsResponse {
zitadel.text.v1.LoginCustomText custom_text = 1;
}
message GetCustomLoginTextsRequest {
string language = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
}
message GetCustomLoginTextsResponse {
zitadel.text.v1.LoginCustomText custom_text = 1;
}
message SetCustomLoginTextsRequest {
string language = 1 [
(validate.rules).string = {min_len: 1, max_len: 200},
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "\"de\""
}
];
zitadel.text.v1.SelectAccountScreenText select_account_text = 2;
zitadel.text.v1.LoginScreenText login_text = 3;
zitadel.text.v1.PasswordScreenText password_text = 4;
zitadel.text.v1.UsernameChangeScreenText username_change_text = 5;
zitadel.text.v1.UsernameChangeDoneScreenText username_change_done_text = 6;
zitadel.text.v1.InitPasswordScreenText init_password_text = 7;
zitadel.text.v1.InitPasswordDoneScreenText init_password_done_text = 8;
zitadel.text.v1.EmailVerificationScreenText email_verification_text = 9;
zitadel.text.v1.EmailVerificationDoneScreenText email_verification_done_text = 10;
zitadel.text.v1.InitializeUserScreenText initialize_user_text = 11;
zitadel.text.v1.InitializeUserDoneScreenText initialize_done_text = 12;
zitadel.text.v1.InitMFAPromptScreenText init_mfa_prompt_text = 13;
zitadel.text.v1.InitMFAOTPScreenText init_mfa_otp_text = 14;
zitadel.text.v1.InitMFAU2FScreenText init_mfa_u2f_text = 15;
zitadel.text.v1.InitMFADoneScreenText init_mfa_done_text = 16;
zitadel.text.v1.MFAProvidersText mfa_providers_text = 17;
zitadel.text.v1.VerifyMFAOTPScreenText verify_mfa_otp_text = 18;
zitadel.text.v1.VerifyMFAU2FScreenText verify_mfa_u2f_text = 19;
zitadel.text.v1.PasswordlessScreenText passwordless_text = 20;
zitadel.text.v1.PasswordChangeScreenText password_change_text = 21;
zitadel.text.v1.PasswordChangeDoneScreenText password_change_done_text = 22;
zitadel.text.v1.PasswordResetDoneScreenText password_reset_done_text = 23;
zitadel.text.v1.RegistrationOptionScreenText registration_option_text = 24;
zitadel.text.v1.RegistrationUserScreenText registration_user_text = 25;
zitadel.text.v1.RegistrationOrgScreenText registration_org_text = 26;
zitadel.text.v1.LinkingUserDoneScreenText linking_user_done_text = 27;
zitadel.text.v1.ExternalUserNotFoundScreenText external_user_not_found_text = 28;
zitadel.text.v1.SuccessLoginScreenText success_login_text = 29;
zitadel.text.v1.LogoutDoneScreenText logout_text = 30;
zitadel.text.v1.FooterText footer_text = 31;
}
message SetCustomLoginTextsResponse {
zitadel.v1.ObjectDetails details = 1;
}
message AddIAMMemberRequest {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {

View File

@@ -2391,6 +2391,54 @@ service ManagementService {
};
}
//Returns the custom texts for login ui
rpc GetCustomLoginTexts(GetCustomLoginTextsRequest) returns (GetCustomLoginTextsResponse) {
option (google.api.http) = {
get: "/text/login/{language}";
};
option (zitadel.v1.auth_option) = {
permission: "policy.read";
};
}
//Returns the custom texts for login ui
rpc GetDefaultLoginTexts(GetDefaultLoginTextsRequest) returns (GetDefaultLoginTextsResponse) {
option (google.api.http) = {
get: "/text/default/login/{language}";
};
option (zitadel.v1.auth_option) = {
permission: "policy.read";
};
}
//Sets the default custom text for login ui
//it impacts all organisations without customized login ui texts
rpc SetCustomLoginText(SetCustomLoginTextsRequest) returns (SetCustomLoginTextsResponse) {
option (google.api.http) = {
put: "/text/login/{language}";
body: "*";
};
option (zitadel.v1.auth_option) = {
permission: "policy.write";
feature: "custom_text"
};
}
// Removes the custom login text of the organisation
// The default text of the IAM will trigger after
rpc ResetCustomLoginTextToDefault(ResetCustomLoginTextsToDefaultRequest) returns (ResetCustomLoginTextsToDefaultResponse) {
option (google.api.http) = {
delete: "/text/login/{language}"
};
option (zitadel.v1.auth_option) = {
permission: "policy.delete"
};
}
// Returns a identity provider configuration of the organisation
rpc GetOrgIDPByID(GetOrgIDPByIDRequest) returns (GetOrgIDPByIDResponse) {
option (google.api.http) = {
@@ -4235,6 +4283,72 @@ message ResetCustomInitMessageTextToDefaultResponse {
zitadel.v1.ObjectDetails details = 1;
}
message GetDefaultLoginTextsRequest {
string language = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
}
message GetDefaultLoginTextsResponse {
zitadel.text.v1.LoginCustomText custom_text = 1;
}
message GetCustomLoginTextsRequest {
string language = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
}
message GetCustomLoginTextsResponse {
zitadel.text.v1.LoginCustomText custom_text = 1;
}
message SetCustomLoginTextsRequest {
string language = 1 [
(validate.rules).string = {min_len: 1, max_len: 200},
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "\"de\""
}
];
zitadel.text.v1.SelectAccountScreenText select_account_text = 2;
zitadel.text.v1.LoginScreenText login_text = 3;
zitadel.text.v1.PasswordScreenText password_text = 4;
zitadel.text.v1.UsernameChangeScreenText username_change_text = 5;
zitadel.text.v1.UsernameChangeDoneScreenText username_change_done_text = 6;
zitadel.text.v1.InitPasswordScreenText init_password_text = 7;
zitadel.text.v1.InitPasswordDoneScreenText init_password_done_text = 8;
zitadel.text.v1.EmailVerificationScreenText email_verification_text = 9;
zitadel.text.v1.EmailVerificationDoneScreenText email_verification_done_text = 10;
zitadel.text.v1.InitializeUserScreenText initialize_user_text = 11;
zitadel.text.v1.InitializeUserDoneScreenText initialize_done_text = 12;
zitadel.text.v1.InitMFAPromptScreenText init_mfa_prompt_text = 13;
zitadel.text.v1.InitMFAOTPScreenText init_mfa_otp_text = 14;
zitadel.text.v1.InitMFAU2FScreenText init_mfa_u2f_text = 15;
zitadel.text.v1.InitMFADoneScreenText init_mfa_done_text = 16;
zitadel.text.v1.MFAProvidersText mfa_providers_text = 17;
zitadel.text.v1.VerifyMFAOTPScreenText verify_mfa_otp_text = 18;
zitadel.text.v1.VerifyMFAU2FScreenText verify_mfa_u2f_text = 19;
zitadel.text.v1.PasswordlessScreenText passwordless_text = 20;
zitadel.text.v1.PasswordChangeScreenText password_change_text = 21;
zitadel.text.v1.PasswordChangeDoneScreenText password_change_done_text = 22;
zitadel.text.v1.PasswordResetDoneScreenText password_reset_done_text = 23;
zitadel.text.v1.RegistrationOptionScreenText registration_option_text = 24;
zitadel.text.v1.RegistrationUserScreenText registration_user_text = 25;
zitadel.text.v1.RegistrationOrgScreenText registration_org_text = 26;
zitadel.text.v1.LinkingUserDoneScreenText linking_user_done_text = 27;
zitadel.text.v1.ExternalUserNotFoundScreenText external_user_not_found_text = 28;
zitadel.text.v1.SuccessLoginScreenText success_login_text = 29;
zitadel.text.v1.LogoutDoneScreenText logout_text = 30;
zitadel.text.v1.FooterText footer_text = 31;
}
message SetCustomLoginTextsResponse {
zitadel.v1.ObjectDetails details = 1;
}
message ResetCustomLoginTextsToDefaultRequest {
string language = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
}
message ResetCustomLoginTextsToDefaultResponse {
zitadel.v1.ObjectDetails details = 1;
}
message GetCustomPasswordResetMessageTextRequest {
string language = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
}

View File

@@ -2,6 +2,7 @@ syntax = "proto3";
import "zitadel/object.proto";
import "protoc-gen-openapiv2/options/annotations.proto";
import "validate/validate.proto";
package zitadel.text.v1;
@@ -45,3 +46,318 @@ message MessageCustomText {
}
];
}
message LoginCustomText {
zitadel.v1.ObjectDetails details = 1;
SelectAccountScreenText select_account_text = 2;
LoginScreenText login_text = 3;
PasswordScreenText password_text = 4;
UsernameChangeScreenText username_change_text = 5;
UsernameChangeDoneScreenText username_change_done_text = 6;
InitPasswordScreenText init_password_text = 7;
InitPasswordDoneScreenText init_password_done_text = 8;
EmailVerificationScreenText email_verification_text = 9;
EmailVerificationDoneScreenText email_verification_done_text = 10;
InitializeUserScreenText initialize_user_text = 11;
InitializeUserDoneScreenText initialize_done_text = 12;
InitMFAPromptScreenText init_mfa_prompt_text = 13;
InitMFAOTPScreenText init_mfa_otp_text = 14;
InitMFAU2FScreenText init_mfa_u2f_text = 15;
InitMFADoneScreenText init_mfa_done_text = 16;
MFAProvidersText mfa_providers_text = 17;
VerifyMFAOTPScreenText verify_mfa_otp_text = 18;
VerifyMFAU2FScreenText verify_mfa_u2f_text = 19;
PasswordlessScreenText passwordless_text = 20;
PasswordChangeScreenText password_change_text = 21;
PasswordChangeDoneScreenText password_change_done_text = 22;
PasswordResetDoneScreenText password_reset_done_text = 23;
RegistrationOptionScreenText registration_option_text = 24;
RegistrationUserScreenText registration_user_text = 25;
RegistrationOrgScreenText registration_org_text = 26;
LinkingUserDoneScreenText linking_user_done_text = 27;
ExternalUserNotFoundScreenText external_user_not_found_text = 28;
SuccessLoginScreenText success_login_text = 29;
LogoutDoneScreenText logout_text = 30;
FooterText footer_text = 31;
}
message SelectAccountScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string title_linking_process = 3 [(validate.rules).string = {max_len: 200}];
string description_linking_process = 4 [(validate.rules).string = {max_len: 500}];
string other_user = 5 [(validate.rules).string = {max_len: 500}];
string session_state_active = 6 [(validate.rules).string = {max_len: 100}];
string session_state_inactive = 7 [(validate.rules).string = {max_len: 100}];
string user_must_be_member_of_org = 8 [(validate.rules).string = {max_len: 500}];
}
message LoginScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string title_linking_process = 3 [(validate.rules).string = {max_len: 200}];
string description_linking_process = 4 [(validate.rules).string = {max_len: 500}];
string user_must_be_member_of_org = 5 [(validate.rules).string = {max_len: 500}];
string login_name_label = 6 [(validate.rules).string = {max_len: 200}];
string register_button_text = 7 [(validate.rules).string = {max_len: 100}];
string next_button_text = 8 [(validate.rules).string = {max_len: 100}];
string external_user_description = 9 [(validate.rules).string = {max_len: 500}];
string user_name_placeholder = 10 [(validate.rules).string = {max_len: 200}];
string login_name_placeholder = 11 [(validate.rules).string = {max_len: 200}];
}
message PasswordScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string password_label = 3 [(validate.rules).string = {max_len: 200}];
string reset_link_text = 4 [(validate.rules).string = {max_len: 100}];
string back_button_text = 5 [(validate.rules).string = {max_len: 100}];
string next_button_text = 6 [(validate.rules).string = {max_len: 100}];
string min_length = 7 [(validate.rules).string = {max_len: 100}];
string has_uppercase = 8 [(validate.rules).string = {max_len: 100}];
string has_lowercase = 9 [(validate.rules).string = {max_len: 100}];
string has_number = 10 [(validate.rules).string = {max_len: 100}];
string has_symbol = 11 [(validate.rules).string = {max_len: 100}];
string confirmation = 12 [(validate.rules).string = {max_len: 100}];
}
message UsernameChangeScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string username_label = 3 [(validate.rules).string = {max_len: 200}];
string cancel_button_text = 4 [(validate.rules).string = {max_len: 100}];
string next_button_text = 5 [(validate.rules).string = {max_len: 100}];
}
message UsernameChangeDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string next_button_text = 3 [(validate.rules).string = {max_len: 100}];
}
message InitPasswordScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string code_label = 3 [(validate.rules).string = {max_len: 200}];
string new_password_label = 4 [(validate.rules).string = {max_len: 200}];
string new_password_confirm_label = 5 [(validate.rules).string = {max_len: 200}];
string next_button_text = 6 [(validate.rules).string = {max_len: 100}];
string resend_button_text = 7 [(validate.rules).string = {max_len: 100}];
}
message InitPasswordDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string next_button_text = 3 [(validate.rules).string = {max_len: 100}];
string cancel_button_text = 4 [(validate.rules).string = {max_len: 100}];
}
message EmailVerificationScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string code_label = 3 [(validate.rules).string = {max_len: 200}];
string next_button_text = 4 [(validate.rules).string = {max_len: 100}];
string resend_button_text = 5 [(validate.rules).string = {max_len: 100}];
}
message EmailVerificationDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string next_button_text = 3 [(validate.rules).string = {max_len: 100}];
string cancel_button_text = 4 [(validate.rules).string = {max_len: 100}];
string login_button_text = 5 [(validate.rules).string = {max_len: 100}];
}
message InitializeUserScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string code_label = 3 [(validate.rules).string = {max_len: 200}];
string new_password_label = 4 [(validate.rules).string = {max_len: 200}];
string new_password_confirm_label = 5 [(validate.rules).string = {max_len: 200}];
string resend_button_text = 6 [(validate.rules).string = {max_len: 100}];
string next_button_text = 7 [(validate.rules).string = {max_len: 100}];
}
message InitializeUserDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string cancel_button_text = 3 [(validate.rules).string = {max_len: 100}];
string next_button_text = 4 [(validate.rules).string = {max_len: 100}];
}
message InitMFAPromptScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string otp_option = 3 [(validate.rules).string = {max_len: 200}];
string u2f_option = 4 [(validate.rules).string = {max_len: 200}];
string skip_button_text = 5 [(validate.rules).string = {max_len: 100}];
string next_button_text = 6 [(validate.rules).string = {max_len: 100}];
}
message InitMFAOTPScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string description_otp = 3 [(validate.rules).string = {max_len: 500}];
string secret_label = 4 [(validate.rules).string = {max_len: 200}];
string code_label = 5 [(validate.rules).string = {max_len: 200}];
string next_button_text = 6 [(validate.rules).string = {max_len: 100}];
string cancel_button_text = 7 [(validate.rules).string = {max_len: 100}];
}
message InitMFAU2FScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string token_name_label = 3 [(validate.rules).string = {max_len: 200}];
string not_supported = 4 [(validate.rules).string = {max_len: 500}];
string register_token_button_text = 5 [(validate.rules).string = {max_len: 100}];
string error_retry = 6 [(validate.rules).string = {max_len: 500}];
}
message InitMFADoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string cancel_button_text = 3 [(validate.rules).string = {max_len: 100}];
string next_button_text = 4 [(validate.rules).string = {max_len: 100}];
}
message MFAProvidersText {
string choose_other = 1 [(validate.rules).string = {max_len: 500}];
string otp = 2 [(validate.rules).string = {max_len: 200}];
string u2f = 3 [(validate.rules).string = {max_len: 200}];
}
message VerifyMFAOTPScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string code_label = 3 [(validate.rules).string = {max_len: 200}];
string next_button_text = 4 [(validate.rules).string = {max_len: 100}];
}
message VerifyMFAU2FScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string validate_token_text = 3 [(validate.rules).string = {max_len: 500}];
string not_supported = 4 [(validate.rules).string = {max_len: 500}];
string error_retry = 5 [(validate.rules).string = {max_len: 500}];
}
message PasswordlessScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string login_with_pw_button_text = 3 [(validate.rules).string = {max_len: 100}];
string validate_token_button_text = 4 [(validate.rules).string = {max_len: 200}];
string not_supported = 5 [(validate.rules).string = {max_len: 500}];
string error_retry = 6 [(validate.rules).string = {max_len: 500}];
}
message PasswordChangeScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string old_password_label = 3 [(validate.rules).string = {max_len: 200}];
string new_password_label = 4 [(validate.rules).string = {max_len: 200}];
string new_password_confirm_label = 5 [(validate.rules).string = {max_len: 200}];
string cancel_button_text = 6 [(validate.rules).string = {max_len: 100}];
string next_button_text = 7 [(validate.rules).string = {max_len: 100}];
}
message PasswordChangeDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string next_button_text = 3 [(validate.rules).string = {max_len: 100}];
}
message PasswordResetDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string next_button_text = 3 [(validate.rules).string = {max_len: 100}];
}
message RegistrationOptionScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string user_name_button_text = 3 [(validate.rules).string = {max_len: 200}];
string external_login_description = 4 [(validate.rules).string = {max_len: 500}];
}
message RegistrationUserScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string description_org_register = 3 [(validate.rules).string = {max_len: 500}];
string firstname_label = 4 [(validate.rules).string = {max_len: 200}];
string lastname_label = 5 [(validate.rules).string = {max_len: 200}];
string email_label = 6 [(validate.rules).string = {max_len: 200}];
string username_label = 7 [(validate.rules).string = {max_len: 200}];
string language_label = 8 [(validate.rules).string = {max_len: 200}];
string gender_label = 9 [(validate.rules).string = {max_len: 200}];
string password_label = 10 [(validate.rules).string = {max_len: 200}];
string password_confirm_label = 11 [(validate.rules).string = {max_len: 200}];
string tos_and_privacy_label = 12 [(validate.rules).string = {max_len: 200}];
string tos_confirm = 13 [(validate.rules).string = {max_len: 200}];
string tos_link = 14 [(validate.rules).string = {max_len: 200}];
string tos_link_text = 15 [(validate.rules).string = {max_len: 200}];
string privacy_confirm = 16 [(validate.rules).string = {max_len: 200}];
string privacy_link = 17 [(validate.rules).string = {max_len: 200}];
string privacy_link_text = 18 [(validate.rules).string = {max_len: 200}];
string external_login_description = 19 [(validate.rules).string = {max_len: 500}];
string next_button_text = 20 [(validate.rules).string = {max_len: 200}];
string back_button_text = 21 [(validate.rules).string = {max_len: 200}];
}
message RegistrationOrgScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string orgname_label = 3 [(validate.rules).string = {max_len: 200}];
string firstname_label = 4 [(validate.rules).string = {max_len: 200}];
string lastname_label = 5 [(validate.rules).string = {max_len: 200}];
string username_label = 6 [(validate.rules).string = {max_len: 200}];
string email_label = 7 [(validate.rules).string = {max_len: 200}];
string password_label = 9 [(validate.rules).string = {max_len: 200}];
string password_confirm_label = 10 [(validate.rules).string = {max_len: 200}];
string tos_and_privacy_label = 11 [(validate.rules).string = {max_len: 200}];
string tos_confirm = 12 [(validate.rules).string = {max_len: 200}];
string tos_link = 13 [(validate.rules).string = {max_len: 200}];
string tos_link_text = 14 [(validate.rules).string = {max_len: 200}];
string privacy_confirm = 15 [(validate.rules).string = {max_len: 200}];
string privacy_link = 16 [(validate.rules).string = {max_len: 200}];
string privacy_link_text = 17 [(validate.rules).string = {max_len: 200}];
string external_login_description = 18 [(validate.rules).string = {max_len: 500}];
string save_button_text = 19 [(validate.rules).string = {max_len: 200}];
}
message LinkingUserDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string cancel_button_text = 3 [(validate.rules).string = {max_len: 100}];
string next_button_text = 4 [(validate.rules).string = {max_len: 100}];
}
message ExternalUserNotFoundScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string link_button_text = 3 [(validate.rules).string = {max_len: 100}];
string auto_register_button_text = 4 [(validate.rules).string = {max_len: 100}];
}
message SuccessLoginScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
// Text to describe that auto redirect should happen after successful login
string auto_redirect_description = 2 [(validate.rules).string = {max_len: 500}];
// Text to describe that the window can be closed after redirect
string redirected_description = 3 [(validate.rules).string = {max_len: 100}];
string next_button_text = 4 [(validate.rules).string = {max_len: 200}];
}
message LogoutDoneScreenText {
string title = 1 [(validate.rules).string = {max_len: 200}];
string description = 2 [(validate.rules).string = {max_len: 500}];
string login_button_text = 3 [(validate.rules).string = {max_len: 200}];
}
message FooterText {
string tos = 1 [(validate.rules).string = {max_len: 200}];
string tos_link = 2 [(validate.rules).string = {max_len: 500}];
string privacy_policy = 3 [(validate.rules).string = {max_len: 200}];
string privacy_policy_link = 4 [(validate.rules).string = {max_len: 500}];
string help = 5 [(validate.rules).string = {max_len: 200}];
string help_link = 6 [(validate.rules).string = {max_len: 500}];
}