mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-09 11:33:25 -08:00
* [Server] Let users fetch their own private chat history Players lose their private conversations on reconnect or on another device. Servatrice can already log private messages, but only moderators can read the logs. Add Command_GetPrivateChatHistory / Response_PrivateChatHistory so a registered user can page through their own logged conversation with one other user. Operators opt in with logging/allow_user_chat_history (default off, and log_user_msg_chat must be on). The caller is matched by account id so reused guest or deleted-account names can't read older messages; only time, sender name and text are returned. Pages hold 1..200 messages and never split a second, since log_time has 1-second resolution. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [Server] Harden private chat history identity matching Match both participants by account id and name so a federated user's remote id cannot collide with a local account, and stop storing foreign ids in the local chat log. Extract the paging assembly into a pure helper and cover the whole-second boundary rules with gtests. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Lukas Brübach <44814898+BruebachL@users.noreply.github.com>
246 lines
6.6 KiB
Protocol Buffer
246 lines
6.6 KiB
Protocol Buffer
syntax = "proto2";
|
|
|
|
message SessionCommand {
|
|
enum SessionCommandType {
|
|
PING = 1000;
|
|
LOGIN = 1001;
|
|
MESSAGE = 1002;
|
|
LIST_USERS = 1003;
|
|
GET_GAMES_OF_USER = 1004;
|
|
GET_USER_INFO = 1005;
|
|
ADD_TO_LIST = 1006;
|
|
REMOVE_FROM_LIST = 1007;
|
|
DECK_LIST = 1008;
|
|
DECK_NEW_DIR = 1009;
|
|
DECK_DEL_DIR = 1010;
|
|
DECK_DEL = 1011;
|
|
DECK_DOWNLOAD = 1012;
|
|
DECK_UPLOAD = 1013;
|
|
LIST_ROOMS = 1014;
|
|
JOIN_ROOM = 1015;
|
|
REGISTER = 1016;
|
|
ACTIVATE = 1017;
|
|
ACCOUNT_EDIT = 1018;
|
|
ACCOUNT_IMAGE = 1019;
|
|
ACCOUNT_PASSWORD = 1020;
|
|
FORGOT_PASSWORD_REQUEST = 1021;
|
|
FORGOT_PASSWORD_RESET = 1022;
|
|
FORGOT_PASSWORD_CHALLENGE = 1023;
|
|
REQUEST_PASSWORD_SALT = 1024;
|
|
SET_CARD_ART_PARAMS = 1025;
|
|
DECK_SHARE_CREATE = 1026;
|
|
DECK_SHARE_LIST = 1027;
|
|
DECK_SHARE_DOWNLOAD = 1028;
|
|
DECK_LIST_OTHER_USER = 1029;
|
|
DECK_SET_VISIBILITY = 1030;
|
|
DECK_DOWNLOAD_PUBLIC = 1031;
|
|
DECK_SHARE_LIST_MINE = 1032;
|
|
DECK_SHARE_REMOVE = 1033;
|
|
SUBMIT_PASSWORD_VERIFIER = 1034;
|
|
GET_PRIVATE_CHAT_HISTORY = 1035;
|
|
REPLAY_LIST = 1100;
|
|
REPLAY_DOWNLOAD = 1101;
|
|
REPLAY_MODIFY_MATCH = 1102;
|
|
REPLAY_DELETE_MATCH = 1103;
|
|
REPLAY_GET_CODE = 1104;
|
|
REPLAY_SUBMIT_CODE = 1105;
|
|
REPORT = 1200;
|
|
// 1201-1203 reserved: removed during squash
|
|
REPORT_MY_LIST = 1204;
|
|
REPORT_ADD_COMMENT = 1205;
|
|
REPORT_DETAILS = 1206;
|
|
}
|
|
extensions 100 to max;
|
|
}
|
|
|
|
message Command_Ping {
|
|
extend SessionCommand {
|
|
optional Command_Ping ext = 1000;
|
|
}
|
|
}
|
|
|
|
message Command_Login {
|
|
extend SessionCommand {
|
|
optional Command_Login ext = 1001;
|
|
}
|
|
optional string user_name = 1;
|
|
optional string password = 2;
|
|
optional string clientid = 3;
|
|
optional string clientver = 4;
|
|
repeated string clientfeatures = 5;
|
|
optional string hashed_password = 6;
|
|
}
|
|
|
|
message Command_Message {
|
|
extend SessionCommand {
|
|
optional Command_Message ext = 1002;
|
|
}
|
|
optional string user_name = 1;
|
|
optional string message = 2;
|
|
}
|
|
|
|
message Command_ListUsers {
|
|
extend SessionCommand {
|
|
optional Command_ListUsers ext = 1003;
|
|
}
|
|
}
|
|
|
|
message Command_GetGamesOfUser {
|
|
extend SessionCommand {
|
|
optional Command_GetGamesOfUser ext = 1004;
|
|
}
|
|
optional string user_name = 1;
|
|
}
|
|
|
|
message Command_GetUserInfo {
|
|
extend SessionCommand {
|
|
optional Command_GetUserInfo ext = 1005;
|
|
}
|
|
optional string user_name = 1;
|
|
}
|
|
|
|
message Command_AddToList {
|
|
extend SessionCommand {
|
|
optional Command_AddToList ext = 1006;
|
|
}
|
|
optional string list = 1;
|
|
optional string user_name = 2;
|
|
}
|
|
|
|
message Command_RemoveFromList {
|
|
extend SessionCommand {
|
|
optional Command_RemoveFromList ext = 1007;
|
|
}
|
|
optional string list = 1;
|
|
optional string user_name = 2;
|
|
}
|
|
|
|
message Command_ListRooms {
|
|
extend SessionCommand {
|
|
optional Command_ListRooms ext = 1014;
|
|
}
|
|
}
|
|
|
|
message Command_JoinRoom {
|
|
extend SessionCommand {
|
|
optional Command_JoinRoom ext = 1015;
|
|
}
|
|
optional uint32 room_id = 1;
|
|
}
|
|
|
|
// User wants to register a new account
|
|
message Command_Register {
|
|
extend SessionCommand {
|
|
optional Command_Register ext = 1016;
|
|
}
|
|
// User name client wants to register
|
|
required string user_name = 1;
|
|
// Hashed password to be inserted into database
|
|
optional string password = 2;
|
|
// Email address of the client for user validation
|
|
optional string email = 3;
|
|
// gender = 4; // obsolete
|
|
// Country code of the user. 2 letter ISO format
|
|
optional string country = 5;
|
|
optional string real_name = 6;
|
|
optional string clientid = 7;
|
|
optional string hashed_password = 8;
|
|
}
|
|
|
|
// User wants to activate an account
|
|
message Command_Activate {
|
|
extend SessionCommand {
|
|
optional Command_Activate ext = 1017;
|
|
}
|
|
// User name client wants to activate
|
|
required string user_name = 1;
|
|
// Activation token
|
|
required string token = 2;
|
|
optional string clientid = 3;
|
|
}
|
|
|
|
message Command_AccountEdit {
|
|
extend SessionCommand {
|
|
optional Command_AccountEdit ext = 1018;
|
|
}
|
|
optional string real_name = 1;
|
|
optional string email = 2;
|
|
// gender = 3; // obsolete
|
|
optional string country = 4;
|
|
optional string password_check = 100; // password is required to change sensitive information
|
|
}
|
|
|
|
message Command_AccountImage {
|
|
extend SessionCommand {
|
|
optional Command_AccountImage ext = 1019;
|
|
}
|
|
optional bytes image = 1;
|
|
}
|
|
|
|
message Command_AccountPassword {
|
|
extend SessionCommand {
|
|
optional Command_AccountPassword ext = 1020;
|
|
}
|
|
optional string old_password = 1;
|
|
optional string new_password = 2;
|
|
// optional string hashed_old_password = 3; // we don't want users to steal hashed passwords and change them
|
|
optional string hashed_new_password = 4;
|
|
}
|
|
|
|
message Command_ForgotPasswordRequest {
|
|
extend SessionCommand {
|
|
optional Command_ForgotPasswordRequest ext = 1021;
|
|
}
|
|
required string user_name = 1;
|
|
optional string clientid = 2;
|
|
}
|
|
|
|
message Command_ForgotPasswordReset {
|
|
extend SessionCommand {
|
|
optional Command_ForgotPasswordReset ext = 1022;
|
|
}
|
|
required string user_name = 1;
|
|
optional string clientid = 2;
|
|
optional string token = 3;
|
|
optional string new_password = 4;
|
|
optional string hashed_new_password = 5;
|
|
}
|
|
|
|
message Command_ForgotPasswordChallenge {
|
|
extend SessionCommand {
|
|
optional Command_ForgotPasswordChallenge ext = 1023;
|
|
}
|
|
required string user_name = 1;
|
|
optional string clientid = 2;
|
|
optional string email = 3;
|
|
}
|
|
|
|
message Command_RequestPasswordSalt {
|
|
extend SessionCommand {
|
|
optional Command_RequestPasswordSalt ext = 1024;
|
|
}
|
|
required string user_name = 1;
|
|
}
|
|
|
|
message Command_SetCardArtParams {
|
|
extend SessionCommand {
|
|
optional Command_SetCardArtParams ext = 1025;
|
|
}
|
|
optional string card_name = 1;
|
|
optional string card_provider_id = 2;
|
|
optional double margin_pct_l = 3;
|
|
optional double margin_pct_r = 4;
|
|
optional double vertical_offset = 5;
|
|
optional double zoom = 6;
|
|
}
|
|
|
|
// Client uploads the new password verifier to migrate a legacy account
|
|
// after a successful challenge-response login. Idempotent; only applies
|
|
// to accounts still using the legacy password format.
|
|
message Command_SubmitPasswordVerifier {
|
|
extend SessionCommand {
|
|
optional Command_SubmitPasswordVerifier ext = 1034;
|
|
}
|
|
// Full verifier string to store, e.g. "$scrypt$32768$8$1$<salt>$<verifier>"
|
|
required string password_verifier = 1;
|
|
}
|