1{ 2 "protocol": "user", 3 "imports": [ 4 { 5 "path": "common.avdl", 6 "type": "idl" 7 } 8 ], 9 "types": [ 10 { 11 "type": "record", 12 "name": "TrackProof", 13 "fields": [ 14 { 15 "type": "string", 16 "name": "proofType" 17 }, 18 { 19 "type": "string", 20 "name": "proofName" 21 }, 22 { 23 "type": "string", 24 "name": "idString" 25 } 26 ] 27 }, 28 { 29 "type": "record", 30 "name": "WebProof", 31 "fields": [ 32 { 33 "type": "string", 34 "name": "hostname" 35 }, 36 { 37 "type": { 38 "type": "array", 39 "items": "string" 40 }, 41 "name": "protocols" 42 } 43 ] 44 }, 45 { 46 "type": "record", 47 "name": "Proofs", 48 "fields": [ 49 { 50 "type": { 51 "type": "array", 52 "items": "TrackProof" 53 }, 54 "name": "social" 55 }, 56 { 57 "type": { 58 "type": "array", 59 "items": "WebProof" 60 }, 61 "name": "web" 62 }, 63 { 64 "type": { 65 "type": "array", 66 "items": "PublicKey" 67 }, 68 "name": "publicKeys" 69 } 70 ] 71 }, 72 { 73 "type": "record", 74 "name": "UserSummary", 75 "fields": [ 76 { 77 "type": "UID", 78 "name": "uid" 79 }, 80 { 81 "type": "string", 82 "name": "username" 83 }, 84 { 85 "type": "string", 86 "name": "fullName" 87 }, 88 { 89 "type": [ 90 null, 91 "LinkID" 92 ], 93 "name": "linkID" 94 } 95 ] 96 }, 97 { 98 "type": "record", 99 "name": "UserSummarySet", 100 "fields": [ 101 { 102 "type": { 103 "type": "array", 104 "items": "UserSummary" 105 }, 106 "name": "users" 107 }, 108 { 109 "type": "Time", 110 "name": "time" 111 }, 112 { 113 "type": "int", 114 "name": "version" 115 } 116 ] 117 }, 118 { 119 "type": "record", 120 "name": "EmailAddress", 121 "fields": [], 122 "typedef": "string" 123 }, 124 { 125 "type": "record", 126 "name": "Email", 127 "fields": [ 128 { 129 "type": "EmailAddress", 130 "name": "email" 131 }, 132 { 133 "type": "boolean", 134 "name": "isVerified" 135 }, 136 { 137 "type": "boolean", 138 "name": "isPrimary" 139 }, 140 { 141 "type": "IdentityVisibility", 142 "name": "visibility" 143 }, 144 { 145 "type": "UnixTime", 146 "name": "lastVerifyEmailDate" 147 } 148 ] 149 }, 150 { 151 "type": "record", 152 "name": "UserSettings", 153 "fields": [ 154 { 155 "type": { 156 "type": "array", 157 "items": "Email" 158 }, 159 "name": "emails" 160 }, 161 { 162 "type": { 163 "type": "array", 164 "items": "UserPhoneNumber" 165 }, 166 "name": "phoneNumbers" 167 } 168 ] 169 }, 170 { 171 "type": "record", 172 "name": "InterestingPerson", 173 "fields": [ 174 { 175 "type": "UID", 176 "name": "uid" 177 }, 178 { 179 "type": "string", 180 "name": "username" 181 }, 182 { 183 "type": "string", 184 "name": "fullname" 185 }, 186 { 187 "type": { 188 "type": "map", 189 "values": "string", 190 "keys": "string" 191 }, 192 "name": "serviceMap" 193 } 194 ] 195 }, 196 { 197 "type": "record", 198 "name": "ProofSuggestionsRes", 199 "fields": [ 200 { 201 "type": { 202 "type": "array", 203 "items": "ProofSuggestion" 204 }, 205 "name": "suggestions" 206 }, 207 { 208 "type": "boolean", 209 "name": "showMore" 210 } 211 ] 212 }, 213 { 214 "type": "record", 215 "name": "ProofSuggestion", 216 "fields": [ 217 { 218 "type": "string", 219 "name": "key" 220 }, 221 { 222 "type": "boolean", 223 "name": "belowFold" 224 }, 225 { 226 "type": "string", 227 "name": "profileText" 228 }, 229 { 230 "type": { 231 "type": "array", 232 "items": "SizedImage" 233 }, 234 "name": "profileIcon" 235 }, 236 { 237 "type": { 238 "type": "array", 239 "items": "SizedImage" 240 }, 241 "name": "profileIconDarkmode" 242 }, 243 { 244 "type": "string", 245 "name": "pickerText" 246 }, 247 { 248 "type": "string", 249 "name": "pickerSubtext" 250 }, 251 { 252 "type": { 253 "type": "array", 254 "items": "SizedImage" 255 }, 256 "name": "pickerIcon" 257 }, 258 { 259 "type": { 260 "type": "array", 261 "items": "SizedImage" 262 }, 263 "name": "pickerIconDarkmode" 264 }, 265 { 266 "type": { 267 "type": "array", 268 "items": "Identify3RowMeta" 269 }, 270 "name": "metas" 271 } 272 ] 273 }, 274 { 275 "type": "record", 276 "name": "NextMerkleRootRes", 277 "fields": [ 278 { 279 "type": [ 280 null, 281 "MerkleRootV2" 282 ], 283 "name": "res" 284 } 285 ] 286 }, 287 { 288 "type": "enum", 289 "name": "PassphraseState", 290 "symbols": [ 291 "KNOWN_0", 292 "RANDOM_1" 293 ], 294 "doc": "PassphraseState values are used in .config.json, so should not be changed without a migration strategy" 295 }, 296 { 297 "type": "record", 298 "name": "CanLogoutRes", 299 "fields": [ 300 { 301 "type": "boolean", 302 "name": "canLogout" 303 }, 304 { 305 "type": "string", 306 "name": "reason" 307 }, 308 { 309 "type": "PassphraseState", 310 "name": "passphraseState" 311 } 312 ] 313 }, 314 { 315 "type": "record", 316 "name": "UserPassphraseStateMsg", 317 "fields": [ 318 { 319 "type": "PassphraseState", 320 "name": "passphraseState", 321 "jsonkey": "state" 322 } 323 ], 324 "lint": "ignore" 325 }, 326 { 327 "type": "record", 328 "name": "UserBlockedRow", 329 "fields": [ 330 { 331 "type": "UID", 332 "name": "uid", 333 "jsonkey": "block_uid" 334 }, 335 { 336 "type": "string", 337 "name": "username", 338 "jsonkey": "block_username" 339 }, 340 { 341 "type": [ 342 null, 343 "boolean" 344 ], 345 "name": "chat", 346 "jsonkey": "chat" 347 }, 348 { 349 "type": [ 350 null, 351 "boolean" 352 ], 353 "name": "follow", 354 "jsonkey": "follow" 355 } 356 ] 357 }, 358 { 359 "type": "enum", 360 "name": "UserBlockType", 361 "symbols": [ 362 "CHAT_0", 363 "FOLLOW_1" 364 ] 365 }, 366 { 367 "type": "record", 368 "name": "UserBlockedBody", 369 "fields": [ 370 { 371 "type": { 372 "type": "array", 373 "items": "UserBlockedRow" 374 }, 375 "name": "blocks", 376 "jsonkey": "blocks" 377 }, 378 { 379 "type": "UID", 380 "name": "uid", 381 "jsonkey": "blocker_uid" 382 }, 383 { 384 "type": "string", 385 "name": "username", 386 "jsonkey": "blocker_username" 387 } 388 ] 389 }, 390 { 391 "type": "record", 392 "name": "UserBlockState", 393 "fields": [ 394 { 395 "type": "UserBlockType", 396 "name": "blockType" 397 }, 398 { 399 "type": "boolean", 400 "name": "blocked" 401 } 402 ] 403 }, 404 { 405 "type": "record", 406 "name": "UserBlockedSummary", 407 "fields": [ 408 { 409 "type": "string", 410 "name": "blocker" 411 }, 412 { 413 "type": { 414 "type": "map", 415 "values": { 416 "type": "array", 417 "items": "UserBlockState" 418 }, 419 "keys": "string" 420 }, 421 "name": "blocks" 422 } 423 ] 424 }, 425 { 426 "type": "record", 427 "name": "UserBlock", 428 "fields": [ 429 { 430 "type": "string", 431 "name": "username" 432 }, 433 { 434 "type": "boolean", 435 "name": "chatBlocked" 436 }, 437 { 438 "type": "boolean", 439 "name": "followBlocked" 440 }, 441 { 442 "type": [ 443 null, 444 "Time" 445 ], 446 "name": "createTime" 447 }, 448 { 449 "type": [ 450 null, 451 "Time" 452 ], 453 "name": "modifyTime" 454 } 455 ] 456 }, 457 { 458 "type": "record", 459 "name": "UserBlockArg", 460 "fields": [ 461 { 462 "type": "string", 463 "name": "username" 464 }, 465 { 466 "type": [ 467 null, 468 "boolean" 469 ], 470 "name": "setChatBlock" 471 }, 472 { 473 "type": [ 474 null, 475 "boolean" 476 ], 477 "name": "setFollowBlock" 478 } 479 ] 480 }, 481 { 482 "type": "record", 483 "name": "TeamBlock", 484 "fields": [ 485 { 486 "type": "string", 487 "name": "teamName", 488 "jsonkey": "fq_name" 489 }, 490 { 491 "type": "Time", 492 "name": "createTime", 493 "jsonkey": "ctime" 494 } 495 ] 496 } 497 ], 498 "messages": { 499 "listTracking": { 500 "request": [ 501 { 502 "name": "sessionID", 503 "type": "int" 504 }, 505 { 506 "name": "filter", 507 "type": "string" 508 }, 509 { 510 "name": "assertion", 511 "type": "string" 512 } 513 ], 514 "response": "UserSummarySet", 515 "doc": "listTracking gets verified data from the tracking statements in the user's\n sigchain. However, it does not check to make sure the tracked users have\n not reset since the track statement.\n\n If assertion is empty, it will use the current logged in user." 516 }, 517 "listTrackingJSON": { 518 "request": [ 519 { 520 "name": "sessionID", 521 "type": "int" 522 }, 523 { 524 "name": "filter", 525 "type": "string" 526 }, 527 { 528 "name": "verbose", 529 "type": "boolean" 530 }, 531 { 532 "name": "assertion", 533 "type": "string" 534 } 535 ], 536 "response": "string" 537 }, 538 "listTrackersUnverified": { 539 "request": [ 540 { 541 "name": "sessionID", 542 "type": "int" 543 }, 544 { 545 "name": "assertion", 546 "type": "string" 547 } 548 ], 549 "response": "UserSummarySet", 550 "doc": "listTrackersUnverified returns the users following the given user, and is unverified\n and server-trust." 551 }, 552 "loadUser": { 553 "request": [ 554 { 555 "name": "sessionID", 556 "type": "int" 557 }, 558 { 559 "name": "uid", 560 "type": "UID" 561 } 562 ], 563 "response": "User", 564 "doc": "Load a user from the server." 565 }, 566 "loadUserByName": { 567 "request": [ 568 { 569 "name": "sessionID", 570 "type": "int" 571 }, 572 { 573 "name": "username", 574 "type": "string" 575 } 576 ], 577 "response": "User" 578 }, 579 "loadUserPlusKeys": { 580 "request": [ 581 { 582 "name": "sessionID", 583 "type": "int" 584 }, 585 { 586 "name": "uid", 587 "type": "UID" 588 }, 589 { 590 "name": "pollForKID", 591 "type": "KID" 592 } 593 ], 594 "response": "UserPlusKeys", 595 "doc": "Load a user + device keys from the server." 596 }, 597 "loadUserPlusKeysV2": { 598 "request": [ 599 { 600 "name": "sessionID", 601 "type": "int" 602 }, 603 { 604 "name": "uid", 605 "type": "UID" 606 }, 607 { 608 "name": "pollForKID", 609 "type": "KID" 610 }, 611 { 612 "name": "oa", 613 "type": "OfflineAvailability" 614 } 615 ], 616 "response": "UserPlusKeysV2AllIncarnations" 617 }, 618 "loadPublicKeys": { 619 "request": [ 620 { 621 "name": "sessionID", 622 "type": "int" 623 }, 624 { 625 "name": "uid", 626 "type": "UID" 627 } 628 ], 629 "response": { 630 "type": "array", 631 "items": "PublicKey" 632 }, 633 "doc": "Load public keys for a user." 634 }, 635 "loadMyPublicKeys": { 636 "request": [ 637 { 638 "name": "sessionID", 639 "type": "int" 640 } 641 ], 642 "response": { 643 "type": "array", 644 "items": "PublicKey" 645 }, 646 "doc": "Load my public keys (for logged in user)." 647 }, 648 "loadMySettings": { 649 "request": [ 650 { 651 "name": "sessionID", 652 "type": "int" 653 } 654 ], 655 "response": "UserSettings", 656 "doc": "Load user settings (for logged in user)." 657 }, 658 "loadAllPublicKeysUnverified": { 659 "request": [ 660 { 661 "name": "sessionID", 662 "type": "int" 663 }, 664 { 665 "name": "uid", 666 "type": "UID" 667 } 668 ], 669 "response": { 670 "type": "array", 671 "items": "PublicKey" 672 }, 673 "doc": "Load all the user's public keys (even those in reset key families)\n from the server with no verification" 674 }, 675 "profileEdit": { 676 "request": [ 677 { 678 "name": "sessionID", 679 "type": "int" 680 }, 681 { 682 "name": "fullName", 683 "type": "string" 684 }, 685 { 686 "name": "location", 687 "type": "string" 688 }, 689 { 690 "name": "bio", 691 "type": "string" 692 } 693 ], 694 "response": null 695 }, 696 "interestingPeople": { 697 "request": [ 698 { 699 "name": "maxUsers", 700 "type": "int" 701 }, 702 { 703 "name": "namespace", 704 "type": "string" 705 } 706 ], 707 "response": { 708 "type": "array", 709 "items": "InterestingPerson" 710 } 711 }, 712 "meUserVersion": { 713 "request": [ 714 { 715 "name": "sessionID", 716 "type": "int" 717 }, 718 { 719 "name": "forcePoll", 720 "type": "boolean" 721 } 722 ], 723 "response": "UserVersion" 724 }, 725 "getUPAK": { 726 "request": [ 727 { 728 "name": "uid", 729 "type": "UID" 730 }, 731 { 732 "name": "unstubbed", 733 "type": "boolean" 734 } 735 ], 736 "response": "UPAKVersioned", 737 "doc": "getUPAK returns a UPAK. Used mainly for debugging.", 738 "lint": "ignore" 739 }, 740 "getUPAKLite": { 741 "request": [ 742 { 743 "name": "uid", 744 "type": "UID" 745 } 746 ], 747 "response": "UPKLiteV1AllIncarnations", 748 "doc": "getUPAKLite returns a UPKLiteV1AllIncarnations. Used mainly for debugging.", 749 "lint": "ignore" 750 }, 751 "uploadUserAvatar": { 752 "request": [ 753 { 754 "name": "filename", 755 "type": "string" 756 }, 757 { 758 "name": "crop", 759 "type": [ 760 null, 761 "ImageCropRect" 762 ] 763 } 764 ], 765 "response": null 766 }, 767 "proofSuggestions": { 768 "request": [ 769 { 770 "name": "sessionID", 771 "type": "int" 772 } 773 ], 774 "response": "ProofSuggestionsRes" 775 }, 776 "findNextMerkleRootAfterRevoke": { 777 "request": [ 778 { 779 "name": "uid", 780 "type": "UID" 781 }, 782 { 783 "name": "kid", 784 "type": "KID" 785 }, 786 { 787 "name": "loc", 788 "type": "SigChainLocation" 789 }, 790 { 791 "name": "prev", 792 "type": "MerkleRootV2" 793 } 794 ], 795 "response": "NextMerkleRootRes", 796 "doc": "FindNextMerkleRootAfterRevoke finds the first Merkle Root that contains the UID/KID\n revocation at the given SigChainLocataion. The MerkleRootV2 prev is a hint as to where\n we'll start our search. Usually it's the next one, but not always" 797 }, 798 "findNextMerkleRootAfterReset": { 799 "request": [ 800 { 801 "name": "uid", 802 "type": "UID" 803 }, 804 { 805 "name": "resetSeqno", 806 "type": "Seqno" 807 }, 808 { 809 "name": "prev", 810 "type": "ResetMerkleRoot" 811 } 812 ], 813 "response": "NextMerkleRootRes", 814 "doc": "FindNextMerkleRootAfterReset finds the first Merkle root that contains the UID reset\n at resetSeqno. You should pass it prev, which was the last known Merkle root at the time of\n the reset. Usually, we'll just turn up the next Merkle root, but not always." 815 }, 816 "canLogout": { 817 "request": [ 818 { 819 "name": "sessionID", 820 "type": "int" 821 } 822 ], 823 "response": "CanLogoutRes" 824 }, 825 "loadPassphraseState": { 826 "request": [ 827 { 828 "name": "sessionID", 829 "type": "int" 830 } 831 ], 832 "response": "PassphraseState" 833 }, 834 "userCard": { 835 "request": [ 836 { 837 "name": "sessionID", 838 "type": "int" 839 }, 840 { 841 "name": "username", 842 "type": "string" 843 }, 844 { 845 "name": "useSession", 846 "type": "boolean" 847 } 848 ], 849 "response": [ 850 null, 851 "UserCard" 852 ] 853 }, 854 "setUserBlocks": { 855 "request": [ 856 { 857 "name": "sessionID", 858 "type": "int" 859 }, 860 { 861 "name": "blocks", 862 "type": { 863 "type": "array", 864 "items": "UserBlockArg" 865 } 866 } 867 ], 868 "response": null 869 }, 870 "getUserBlocks": { 871 "request": [ 872 { 873 "name": "sessionID", 874 "type": "int" 875 }, 876 { 877 "name": "usernames", 878 "type": { 879 "type": "array", 880 "items": "string" 881 } 882 } 883 ], 884 "response": { 885 "type": "array", 886 "items": "UserBlock" 887 } 888 }, 889 "reportUser": { 890 "request": [ 891 { 892 "name": "sessionID", 893 "type": "int" 894 }, 895 { 896 "name": "username", 897 "type": "string" 898 }, 899 { 900 "name": "reason", 901 "type": "string" 902 }, 903 { 904 "name": "comment", 905 "type": "string" 906 }, 907 { 908 "name": "includeTranscript", 909 "type": "boolean" 910 }, 911 { 912 "name": "convID", 913 "type": [ 914 null, 915 "string" 916 ] 917 } 918 ], 919 "response": null 920 }, 921 "dismissBlockButtons": { 922 "request": [ 923 { 924 "name": "tlfID", 925 "type": "TLFID" 926 } 927 ], 928 "response": null 929 }, 930 "blockUser": { 931 "request": [ 932 { 933 "name": "username", 934 "type": "string" 935 } 936 ], 937 "response": null 938 }, 939 "unblockUser": { 940 "request": [ 941 { 942 "name": "username", 943 "type": "string" 944 } 945 ], 946 "response": null 947 }, 948 "getTeamBlocks": { 949 "request": [ 950 { 951 "name": "sessionID", 952 "type": "int" 953 } 954 ], 955 "response": { 956 "type": "array", 957 "items": "TeamBlock" 958 } 959 } 960 }, 961 "namespace": "keybase.1" 962}