// Copyright 2005-2017 The Mumble Developers. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file at the root of the // Mumble source tree or at . syntax = "proto2"; package MurmurRPC; // Note about embedded messages: // // To help save bandwidth, the protocol does not always send complete embedded // messages (i.e. an embeddded message with all of the fields filled in). These // incomplete messages only contain enough identifying information to get more // information from the message's corresponding "Get" method. For example: // // User.server only ever contains the server ID. Calling ServerGet(User.server) // will return a Server message with the server's status and uptime. message Void { } message Version { // 2-byte Major, 1-byte Minor and 1-byte Patch version number. optional uint32 version = 1; // Client release name. optional string release = 2; // Client OS name. optional string os = 3; // Client OS version. optional string os_version = 4; } message Uptime { // The number of seconds from the starting time. optional uint64 secs = 1; } message Server { // The unique server ID. required uint32 id = 1; // Is the server currently running? optional bool running = 2; // The update of the server. optional Uptime uptime = 3; message Event { enum Type { UserConnected = 0; UserDisconnected = 1; UserStateChanged = 2; UserTextMessage = 3; ChannelCreated = 4; ChannelRemoved = 5; ChannelStateChanged = 6; }; // The server on which the event happened. optional Server server = 1; // The type of event that happened. optional Type type = 2; // The user tied to the event (if applicable). optional User user = 3; // The text message tied to the event (if applicable). optional TextMessage message = 4; // The channel tied to the event (if applicable). optional Channel channel = 5; } message Query { } message List { // The servers. repeated Server servers = 1; } } message Event { enum Type { ServerStopped = 0; ServerStarted = 1; }; // The server for which the event happened. optional Server server = 1; // The type of event that happened. optional Type type = 2; } message ContextAction { enum Context { Server = 0x01; Channel = 0x02; User = 0x04; }; // The server on which the action is. optional Server server = 1; // The context in which the action is. optional uint32 context = 2; // The action name. optional string action = 3; // The user-visible descriptive name of the action. optional string text = 4; // The user that triggered the ContextAction. optional User actor = 5; // The user on which the ContextAction was triggered. optional User user = 6; // The channel on which the ContextAction was triggered. optional Channel channel = 7; } message TextMessage { // The server on which the TextMessage originates. optional Server server = 1; // The user who sent the message. optional User actor = 2; // The users to whom the message is sent. repeated User users = 3; // The channels to which the message is sent. repeated Channel channels = 4; // The channels to which the message is sent, including the channels' // ancestors. repeated Channel trees = 5; // The message body that is sent. optional string text = 6; message Filter { enum Action { // Accept the message. Accept = 0; // Reject the message with a permission error. Reject = 1; // Silently drop the message. Drop = 2; } // The server on which the message originated. optional Server server = 1; // The action to perform for the message. optional Action action = 2; // The text message. optional TextMessage message = 3; } } message Log { // The server on which the log message was generated. optional Server server = 1; // The unix timestamp of when the message was generated. optional int64 timestamp = 2; // The log message. optional string text = 3; message Query { // The server whose logs will be queried. optional Server server = 1; // The minimum log index to receive. optional uint32 min = 2; // The maximum log index to receive. optional uint32 max = 3; } message List { // The server where the log entries are from. optional Server server = 1; // The total number of logs entries on the server. optional uint32 total = 2; // The minimum log index that was sent. optional uint32 min = 3; // The maximum log index that was sent. optional uint32 max = 4; // The log entries. repeated Log entries = 5; } } message Config { // The server for which the configuration is for. optional Server server = 1; // The configuration keys and values. map fields = 2; message Field { // The server for which the configuration field is for. optional Server server = 1; // The field key. optional string key = 2; // The field value. optional string value = 3; } } message Channel { // The server on which the channel exists. optional Server server = 1; // The unique channel identifier. optional uint32 id = 2; // The channel name. optional string name = 3; // The channel's parent. optional Channel parent = 4; // Linked channels. repeated Channel links = 5; // The channel's description. optional string description = 6; // Is the channel temporary? optional bool temporary = 7; // The position in which the channel should appear in a sorted list. optional int32 position = 8; message Query { // The server on which the channels are. optional Server server = 1; } message List { // The server on which the channels are. optional Server server = 1; // The channels. repeated Channel channels = 2; } } message User { // The server to which the user is connected. optional Server server = 1; // The user's session ID. optional uint32 session = 2; // The user's registered ID. optional uint32 id = 3; // The user's name. optional string name = 4; // Is the user muted? optional bool mute = 5; // Is the user deafened? optional bool deaf = 6; // Is the user suppressed? optional bool suppress = 7; // Is the user a priority speaker? optional bool priority_speaker = 8; // Has the user muted him/herself? optional bool self_mute = 9; // Has the user muted him/herself? optional bool self_deaf = 10; // Is the user recording? optional bool recording = 11; // The channel the user is in. optional Channel channel = 12; // How long the user has been connected to the server. optional uint32 online_secs = 13; // How long the user has been idle on the server. optional uint32 idle_secs = 14; // How many bytes per second is the user transmitting to the server. optional uint32 bytes_per_sec = 15; // The user's client version. optional Version version = 16; // The user's plugin context. optional bytes plugin_context = 17; // The user's plugin identity. optional string plugin_identity = 18; // The user's comment. optional string comment = 19; // The user's texture. optional bytes texture = 20; // The user's IP address. optional bytes address = 21; // Is the user in TCP-only mode? optional bool tcp_only = 22; // The user's UDP ping in milliseconds. optional float udp_ping_msecs = 23; // The user's TCP ping in milliseconds. optional float tcp_ping_msecs = 24; message Query { // The server whose users will be queried. optional Server server = 1; } message List { // The server to which the users are connected. optional Server server = 1; // The users. repeated User users = 2; } message Kick { // The server to which the user is connected. optional Server server = 1; // The user to kick. optional User user = 2; // The user who performed the kick. optional User actor = 3; // The reason for why the user is being kicked. optional string reason = 4; } } message Tree { // The server which the tree represents. optional Server server = 1; // The current channel. optional Channel channel = 2; // Channels below the current channel. repeated Tree children = 3; // The users in the current channel. repeated User users = 4; message Query { // The server to query. optional Server server = 1; } } message Ban { // The server on which the ban is applied. optional Server server = 1; // The banned IP address. optional bytes address = 2; // The number of leading bits in the address to which the ban applies. optional uint32 bits = 3; // The name of the banned user. optional string name = 4; // The certificate hash of the banned user. optional string hash = 5; // The reason for the ban. optional string reason = 6; // The ban start time (in epoch form). optional int64 start = 7; // The ban duration. optional int64 duration_secs = 8; message Query { // The server whose bans to query. optional Server server = 1; } message List { // The server for which the bans apply. optional Server server = 1; // The bans. repeated Ban bans = 2; } } message ACL { enum Permission { None = 0x00; Write = 0x01; Traverse = 0x02; Enter = 0x04; Speak = 0x08; Whisper = 0x100; MuteDeafen = 0x10; Move = 0x20; MakeChannel = 0x40; MakeTemporaryChannel = 0x400; LinkChannel = 0x80; TextMessage = 0x200; Kick = 0x10000; Ban = 0x20000; Register = 0x40000; RegisterSelf = 0x80000; } message Group { // The ACL group name. optional string name = 1; // Is the group inherited? optional bool inherited = 2; // Does the group inherit members? optional bool inherit = 3; // Can this group be inherited by its children? optional bool inheritable = 4; // The users explicitly added by this group. repeated DatabaseUser users_add = 5; // The users explicitly removed by this group. repeated DatabaseUser users_remove = 6; // All of the users who are part of this group. repeated DatabaseUser users = 7; } // Does the ACL apply to the current channel? optional bool apply_here = 3; // Does the ACL apply to the current channel's sub-channels? optional bool apply_subs = 4; // Was the ACL inherited? optional bool inherited = 5; // The user to whom the ACL applies. optional DatabaseUser user = 6; // The group to whom the ACL applies. optional ACL.Group group = 7; // The permissions granted by the ACL (bitmask of ACL.Permission). optional uint32 allow = 8; // The permissions denied by the ACL (bitmask of ACL.Permission). optional uint32 deny = 9; message Query { // The server where the user and channel exist. optional Server server = 1; // The user to query. optional User user = 2; // The channel to query. optional Channel channel = 3; } message List { // The server on which the ACLs exist. optional Server server = 1; // The channel to which the ACL refers. optional Channel channel = 2; // The ACLs part of the given channel. repeated ACL acls = 3; // The groups part of the given channel. repeated ACL.Group groups = 4; // Should ACLs be inherited from the parent channel. optional bool inherit = 5; } message TemporaryGroup { // The server where the temporary group exists. optional Server server = 1; // The channel to which the temporary user group is added. optional Channel channel = 2; // The user who is added to the group. optional User user = 3; // The name of the temporary group. optional string name = 4; } } message Authenticator { message Request { // An authentication request for a connecting user. message Authenticate { // The user's name. optional string name = 1; // The user's password. optional string password = 2; // The user's certificate chain in DER format. repeated bytes certificates = 3; // The hexadecimal hash of the user's certificate. optional string certificate_hash = 4; // If the user is connecting with a strong certificate. optional bool strong_certificate = 5; } // A request for information about a user, given by either the user's ID // or name. message Find { // The user's ID used for lookup. optional uint32 id = 1; // The user's name used for lookup. optional string name = 2; } // A query of all the registered users, optionally filtered by the given // filter string. message Query { // A user name filter (% is often used as a wildcard) optional string filter = 1; } // A request for a new user registration. message Register { // The database user to register. optional DatabaseUser user = 1; } // A request for deregistering a registered user. message Deregister { // The database user to deregister. optional DatabaseUser user = 1; } // A request to update a registered user's information. The information // provided should be merged with existing data. message Update { // The database user to update. optional DatabaseUser user = 1; } optional Authenticate authenticate = 1; optional Find find = 2; optional Query query = 3; optional Register register = 4; optional Deregister deregister = 5; optional Update update = 6; } message Response { // The initialization for the authenticator stream. This message must be // sent before authentication requests will start streaming. message Initialize { optional Server server = 1; } enum Status { // The request should fallthrough to murmur's default action. Fallthrough = 0; // The request was successful. Success = 1; // The request failed; there was some error. Failure = 2; // A temporary failure prevented the request from succeeding (e.g. a // database was unavailable). TemporaryFailure = 3; } message Authenticate { // The status of the request. optional Status status = 1; // The user's registered ID. optional uint32 id = 2; // The corrected user's name; optional string name = 3; // Additional ACL groups that the user belongs too. repeated ACL.Group groups = 4; } message Find { // The database user (if found). optional DatabaseUser user = 1; } message Query { // The matched database users. repeated DatabaseUser users = 1; } message Register { // The status of the request. optional Status status = 1; // The registered database user (must contain the registered user's ID). optional DatabaseUser user = 2; } message Deregister { // The status of the request. optional Status status = 1; } message Update { // The status of the request. optional Status status = 1; } optional Initialize initialize = 1; optional Authenticate authenticate = 2; optional Find find = 3; optional Query query = 4; optional Register register = 5; optional Deregister deregister = 6; optional Update update = 7; } } message DatabaseUser { // The server on which the user is registered. optional Server server = 1; // The unique user ID. optional uint32 id = 2; // The user's name. optional string name = 3; // The user's email address. optional string email = 4; // The user's comment. optional string comment = 5; // The user's certificate hash. optional string hash = 6; // The user's password (never sent; used only when updating). optional string password = 7; // When the user was last on the server. optional string last_active = 8; // The user's texture. optional bytes texture = 9; message Query { // The server whose users will be queried. optional Server server = 1; // A string to filter the users by. optional string filter = 2; } message List { // The server on which the users are registered. optional Server server = 1; // The users. repeated DatabaseUser users = 2; } message Verify { // The server on which the user-password pair will be authenticated. optional Server server = 1; // The user's name. optional string name = 2; // The user's password. optional string password = 3; } } message RedirectWhisperGroup { // The server on which the whisper redirection will take place. optional Server server = 1; // The user to whom the redirection will be applied. optional User user = 2; // The source group. optional ACL.Group source = 3; // The target group. optional ACL.Group target = 4; } service V1 { // // Meta // // GetUptime returns murmur's uptime. rpc GetUptime(Void) returns(Uptime); // GetVersion returns murmur's version. rpc GetVersion(Void) returns(Version); // Events returns a stream of murmur events. rpc Events(Void) returns(stream Event); // // Servers // // ServerCreate creates a new virtual server. The returned server object // contains the newly created server's ID. rpc ServerCreate(Void) returns(Server); // ServerQuery returns a list of servers that match the given query. rpc ServerQuery(Server.Query) returns(Server.List); // ServerGet returns information about the given server. rpc ServerGet(Server) returns(Server); // ServerStart starts the given stopped server. rpc ServerStart(Server) returns(Void); // ServerStop stops the given virtual server. rpc ServerStop(Server) returns(Void); // ServerRemove removes the given virtual server and its configuration. rpc ServerRemove(Server) returns(Void); // ServerEvents returns a stream of events that happen on the given server. rpc ServerEvents(Server) returns(stream Server.Event); // // ContextActions // // ContextActionAdd adds a context action to the given user's client. The // following ContextAction fields must be set: // context, action, text, and user. // // Added context actions are valid until: // - The context action is removed with ContextActionRemove, or // - The user disconnects from the server, or // - The server stops. rpc ContextActionAdd(ContextAction) returns(Void); // ContextActionRemove removes a context action from the given user's client. // The following ContextAction must be set: // action // If no user is given, the context action is removed from all users. rpc ContextActionRemove(ContextAction) returns(Void); // ContextActionEvents returns a stream of context action events that are // triggered by users. rpc ContextActionEvents(ContextAction) returns(stream ContextAction); // // TextMessage // // TextMessageSend sends the given TextMessage to the server. // // If no users, channels, or trees are added to the TextMessage, the message // will be broadcast the entire server. Otherwise, the message will be // targeted to the specified users, channels, and trees. rpc TextMessageSend(TextMessage) returns(Void); // TextMessageFilter filters text messages on a given server. // TextMessageFilter filters text messages for a given server. // // When a filter stream is active, text messages sent from users to the // server are sent over the stream. The RPC client then sends a message back // on the same stream, containing an action: whether the message should be // accepted, rejected, or dropped. // // To activate the filter stream, an initial TextMessage.Filter message must // be sent that contains the server on which the filter will be active. rpc TextMessageFilter(stream TextMessage.Filter) returns(stream TextMessage.Filter); // // Logs // // LogQuery returns a list of log entries from the given server. // // To get the total number of log entries, omit min and/or max from the // query. rpc LogQuery(Log.Query) returns(Log.List); // // Config // // ConfigGet returns the explicitly set configuration for the given server. rpc ConfigGet(Server) returns(Config); // ConfigGetField returns the configuration value for the given key. rpc ConfigGetField(Config.Field) returns(Config.Field); // ConfigSetField sets the configuration value to the given value. rpc ConfigSetField(Config.Field) returns(Void); // ConfigGetDefault returns the default server configuration. rpc ConfigGetDefault(Void) returns(Config); // // Channels // // ChannelQuery returns a list of channels that match the given query. rpc ChannelQuery(Channel.Query) returns(Channel.List); // ChannelGet returns the channel with the given ID. rpc ChannelGet(Channel) returns(Channel); // ChannelAdd adds the channel to the given server. The parent and name of // the channel must be set. rpc ChannelAdd(Channel) returns(Channel); // ChannelRemove removes the given channel from the server. rpc ChannelRemove(Channel) returns(Void); // ChannelUpdate updates the given channel's attributes. Only the fields that // are set will be updated. rpc ChannelUpdate(Channel) returns(Channel); // // Users // // UserQuery returns a list of connected users who match the given query. rpc UserQuery(User.Query) returns(User.List); // UserGet returns information on the connected user, given by the user's // session or name. rpc UserGet(User) returns(User); // UserUpdate changes the given user's state. Only the following fields can // be changed: // name, mute, deaf, suppress, priority_speaker, channel, comment. rpc UserUpdate(User) returns(User); // UserKick kicks the user from the server. rpc UserKick(User.Kick) returns(Void); // // Tree // // TreeQuery returns a representation of the given server's channel/user // tree. rpc TreeQuery(Tree.Query) returns(Tree); // // Bans // // BansGet returns a list of bans for the given server. rpc BansGet(Ban.Query) returns(Ban.List); // BansSet replaces the server's ban list with the given list. rpc BansSet(Ban.List) returns(Void); // // ACL // // ACLGet returns the ACL for the given channel. rpc ACLGet(Channel) returns(ACL.List); // ACLSet overrides the ACL of the given channel to what is provided. rpc ACLSet(ACL.List) returns(Void); // ACLGetEffectivePermissions returns the effective permissions for the given // user in the given channel. rpc ACLGetEffectivePermissions(ACL.Query) returns(ACL); // ACLAddTemporaryGroup adds a user to a temporary group. rpc ACLAddTemporaryGroup(ACL.TemporaryGroup) returns(Void); // ACLRemoveTemporaryGroup removes a user from a temporary group. rpc ACLRemoveTemporaryGroup(ACL.TemporaryGroup) returns(Void); // // Authenticator // // AuthenticatorStream opens an authentication stream to the server. // // There can only be one RPC client with an open Stream. If a new // authenticator connects, the open connected will be closed. rpc AuthenticatorStream(stream Authenticator.Response) returns(stream Authenticator.Request); // // Database // // DatabaseUserQuery returns a list of registered users who match given // query. rpc DatabaseUserQuery(DatabaseUser.Query) returns(DatabaseUser.List); // DatabaseUserGet returns the database user with the given ID. rpc DatabaseUserGet(DatabaseUser) returns(DatabaseUser); // DatabaseUserUpdate updates the given database user. rpc DatabaseUserUpdate(DatabaseUser) returns(Void); // DatabaseUserRegister registers a user with the given information on the // server. The returned DatabaseUser will contain the newly registered user's // ID. rpc DatabaseUserRegister(DatabaseUser) returns(DatabaseUser); // DatabaseUserDeregister deregisters the given user. rpc DatabaseUserDeregister(DatabaseUser) returns(Void); // DatabaseUserVerify verifies the that the given user-password pair is // correct. rpc DatabaseUserVerify(DatabaseUser.Verify) returns(DatabaseUser); // // Audio // // AddRedirectWhisperGroup add a whisper targets redirection for the given // user. Whenever a user whispers to group "source", the whisper will be // redirected to group "target". rpc RedirectWhisperGroupAdd(RedirectWhisperGroup) returns(Void); // RemoveRedirectWhisperGroup removes a whisper target redirection for // the the given user. rpc RedirectWhisperGroupRemove(RedirectWhisperGroup) returns(Void); }