Difference between revisions of "Second Life Login API Strawman"

From Second Life Wiki
Jump to navigation Jump to search
 
(41 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{multi-lang}}
<strong> This page is now deprecated. It is retained in the wiki for transparency and for the discussion. The login protocol is now a part of the [[Open Grid Protocol | SL Grid Open Grid Protocol]] doc and should be referenced there</strong>
= Second Life Login API Strawman =
= Second Life Login API Strawman =
This is a work in progress.  Also see a similar Strawman by AWG: [[AWG_flows_login]]
This is a work in progress.  Also see a similar Strawman by AWG: [[AWG_flows_login]]
Line 4: Line 6:


== Introduction ==
== Introduction ==
This page attempts to merge [[Authentication_Flow]] with [[Current_login_protocols]] and adds additional protocol changes to fit with [[Agent_Domain#How_login_works]].  The goal is to expose a protocol allowing login to a separate region domain while making incremental, small changes to the current protocol.
This page attempts to merge [[Authentication_Flow]] with [[Current_login_protocols]] and adds additional protocol   changes to fit with [[Agent_Domain#How_login_works]].  The goal is to expose a protocol allowing login to a separate region domain while making incremental, small changes to the current protocol.


== Summary ==
== Summary ==
Line 15: Line 17:
# *(future) Viewer Polls Agent Host for messages via long-poll [[#poll_for_messages_Capability]]
# *(future) Viewer Polls Agent Host for messages via long-poll [[#poll_for_messages_Capability]]
# *(future) Viewer can send instant messages before being in world. [[#instant_message_Capability]]
# *(future) Viewer can send instant messages before being in world. [[#instant_message_Capability]]
# *Viewer invokes legacy_login capability [[#legacylogin_Capability]]
# *Viewer invokes legacy_login capability [[#legacy_login_Capability]]
#* Initialization data returned by login
#* Initialization data returned by login
#* Sets up agent presence
#* Sets up agent presence
#* Forwards location request to region domain, finding a region to rez the avatar
#* Forwards location request to region domain, finding a region to rez the avatar
#* Establishes session with region host, which gives back a seed capability to the client
#* Establishes session with region host, which gives back a (region domain) seed capability to the client
# *Viewer invokes region seed capability
# *Viewer invokes region seed capability


== Definitions ==
== Definitions ==
=== Seed Capability ===
=== Seed Capability ===
The current Login Seed Capability is a [[Capabilities|Capability]] associated with the simulator you are logging into. It should not be confused with the [[Seed-Capability|Seed-Capability]] proposed for the new protocols.
The current Login Seed Capability is a [[Capabilities|Capability]] associated with the simulator you are logging into. It should not be confused with the [[#Agent_Seed_Capability]] proposed for the new protocols.
 
=== Agent Seed Capability ===
=== Agent Seed Capability ===
This is a newly introduced capability associated with the agent host as part of the agent domain.   
This is a newly introduced capability associated with the agent host as part of the agent domain.   
This is different from the previously mentioned seed-capability, which associates with the sim host as part of the region domain.
This is different from the previously mentioned seed-capability, which associates with the sim host as part of the region domain.


== Conventions ==
== Conventions ==
On this page the following conventions are used:
On this page the following conventions are used:
:"in quotes is a literal string"
 
:[ represents a list of choices | separated by a vertical bar ]
:"--" followed by text, indicates a comment until the end of line, ala the C++ "//" style comments.
:< represents a value which can be substituted by an appropriate string described inside >  
:< represents a value which can be substituted by an appropriate string described inside >  
:'represents a string that must be quoted, but how will be implementation specific' for example in LSL "" denotes a string and " will be used in place of the single quote (').
:< represents a list of choices | separated by a vertical bar >
:+ means to concatenate the two parts, though how will be implementation specific, for example + can be used to concatenate strings.
:"..." ellipses indicates an unknown list of similar values follow
:"<int>" represents an [[integer]] value
:"<uuid>" represents a [[UUID]] value, e.g., 'c5853f4c-855f-4013-ce92-aabc59f1b9d8'
:The remaining syntax follows (very roughly) that of Python data structures:
::"in quotes is a literal string"
::{ <represents a map or dictionary of one or more key>:<value pairs> }  -- separated by commas
::[ represents an array, of elements, separated by commas ]
::'represents a string that must be quoted, but how will be implementation specific' for example in LSL "" denotes a string and " will be used in place of the single quote (').
::+ means to concatenate the two parts, though how will be implementation specific, for example + can be used to concatenate strings.


== Login Web Service ==
== Login Web Service ==
Client --> public Login Server: "Here is my credential, and optional agent identity desired"
Client --> public Login Server: "Here is my credential, and optional agent identity desired"
Second Life Login Server: https://login.agni.secondlife.com/app/login/
Second Life Login Server: https://login.agni.secondlife.com/app/login/
The login will be done using standard http/1.1 POST and the default format for all parameters in POST and RESPONSE will likely be "content-type" = "application/xml" and the actual xml format will be the [[LLSD#Example_XML_Output|text serialization of Linden Lab's XML-LLSD format]]. Future formats will be negotiated using [http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html#sec12| standard http/1.1 Content Negotiation].
=== Required Parameters ===
=== Required Parameters ===
     { 'credential': { 'type': 'agent',
     { 'credential': { 'type': 'agent',
Line 78: Line 90:
                     ... ] }
                     ... ] }
4xx : Unsuccessful authentication due to need for more information.
4xx : Unsuccessful authentication due to need for more information.
     { 'reason': 'tos'|'critical'|'more info',  -- reason why authentication failed
     { 'reason': <'tos'|'critical'|'more info'>,  -- reason why authentication failed
       'redirect' : <url>  } -- URL to visit to get more information on how to proceed
       'redirect' : <url>  } -- URL to visit to get more information on how to proceed
Other reasons:
Other reasons:
     * no agent
     * no agent - 404
     * bad identity and authentication information
     * bad identity and authentication information - 403
     * agent not enabled (banned)
     * agent not enabled (banned) - 403
5xx : Server unavailable.
5xx : Server unavailable.
     { 'reason': 'generic' }
     { 'reason': 'generic' }
Line 92: Line 104:
=== Required Parameters ===
=== Required Parameters ===
Map of named capabilities to Options
Map of named capabilities to Options
     { <capability name> : { 'enabled' : 'true' | 'false' },
     { 'caps': {<capability name> : { 'enabled' : <'true' | 'false'> },
       <capability name> : { 'enabled' : 'true' | 'false' },
       <capability name> : { 'enabled' : <'true' | 'false'> },
       ..., etc. ]
       ... }
    }
     <- Ok, here's the cap to do X
     <- Ok, here's the cap to do X
     -or-
     -or-
Line 101: Line 114:
=== Response ===
=== Response ===
Map of capability name to capability URL:
Map of capability name to capability URL:
     { <capability name> : <url>, <capability name> : <url>, ... etc. }
     { 'caps': {<capability name> : <url>, <capability name> : <url>, ... }}
 
=== Example: Basic Login Capabilities ===
=== Example: Basic Login Capabilities ===
POST data:
POST data:
Line 111: Line 125:
     { 'establish_presence' : <cap GO>, 'inventory' : <cap I>, 'be_in_world' : <cap CTR> }
     { 'establish_presence' : <cap GO>, 'inventory' : <cap I>, 'be_in_world' : <cap CTR> }


== legacy_login Capability ==
== RezAvatar Capability ==
* Viewer -> Agent Host (via cap LL): "I'd like to log in using the legacy login protocols"
This is the hypothetical proposed protocol for the future with many region domains.
The following is a direct dump from [[Current_login_protocols]]


[http://www.libsecondlife.org/wiki/Login] -- libsl login page, includes sample code.
RezAvatar agent host service
    {'region_url': <r_url>, 'position':  [x, y, z]}
->
    {'session_id': <s_id>, 'secure_session_id': <ssid>, 'circuit_code': <cc>,
    'seed_cap': <s_cap>, 'ip_address': <ip_address>, 'udp_port': <udp_port>, 'look_at': [lx, ly, lz]}


=== Required Parameters ===
The RezAvatar agent host service invokes the RezAvatar region host service on behalf of the client.
The following explains the standard key value pairs, with an explanation of "options" at the end:


:• "first": <first> -- first name of the avatar.
RezAvatar region host service
:• "last": <last> -- last name of the avatar.
    {'avatar_id': <a_id>, ..., 'position': [x, y, z]}
:• "passwd": '$1$' + <passwd_md5> -- the avatar password encrypted using MD5 encryption.
->
:• "start": ["first" | "last" | <specific location> ] -- attempt to log in to this sim, though if it is full or not available, or the agent is not allowed, another sim will be selected by the grid from its list of choices. "First" means home location. If home is filled then the grid will try last. If last is filled and home is set, the grid will try home. In either case the last choice will be from a list of [[telehubs]]. For a log in to a specific location the format is "uri:<existing region name>&<x>&<y>&<z>".
    {'seed_cap': <s_cap>, 'ip_address': <ip_address>, 'udp_port': <upd port>, 'circuit_code': <cc>, 'session_id': <s_id>, 'secure_session_id': <ssid>, 'look_at': [lx, ly, lz]}
:• "channel": <channel name> -- the name of the client. Used to differentiate official viewers from third party clients.
or
:• "version": <version string> -- version number of the client.
    403 Forbidden
:• "platform": ["Lin" | "Mac" | "Win"] -- the platform of the client.
:• "mac": <MAC Address> -- the MAC address associated with the client's computer.
:• "options": <optional_login> -- optional array of character strings. ([[Current_login_protocols#Optional Parameters|See below]])
:• "id0": "00000000-0000-0000-0000-000000000000" -- hardware hash (based on the serial number of the first hard drive in Windows) used for uniquely identifying computers.
:• "agree_to_tos": ["true" | "false" | ""] -- whether or not the user has agreed to the Terms of Service.
:• "read_critical": ["true" | "false" | ""] -- whether or not the user has read important messages such as Terms of Service updates.
:• "viewer_digest": "00000000-0000-0000-0000-000000000000" -- MD5 hash of the viewer executable, only relevant when the channel is set to an official Second Life viewer.


=== Optional Parameters ===
== legacy_login Capability ==
Zero or more of the  following character strings may appear in any order in the array following the "options" keyword:
This is for connecting to an existing sim.


''':"inventory-root" -- refers to the UUID of the root inventory folder in the client's inventory window'''
* Viewer -> Agent Host (via cap LL): "I'd like to log in using the legacy login protocols"
* folder_id of library root inventory lib (retrieved from inventory database)
** generate one if folder_id does not exit.
* check aganst existence and push folder_id value into inventory_root
* push inventory-root into array 'rv'
 
  {'inventory-root' => {folder_id' => 'UUID of Folder ID'} }   


''':"inventory-skeleton" -- "starter kit" inventory: name, folder_id, parent_id, type_default, version of all folders'''
=== Required Parameters ===
* create an array of 'inv'
    { 'start': <"first" | "last" | <uri> >,
* get name , folder_id, parent_id from user_inventory_folder according to the given agent_id and push them one by one into 'inv'
      "channel": <channel>,
* push the 'inv' into the 'rv' array at key "inventory-skeleton"
      "version": <client version>,
   
      "platform": <"Lin" | "Mac" | "Win">
    {'inventory-skeleton' =>  {'name, folder_id, parent_id'},{'name, folder_id, parent_id'} ,{'name, folder_id, parent_id'} .... }
      "mac": <MAC Address>,
      "options": <array of strings>,
      "id0": <uuid>,
      "agree_to_tos": <"true" | "false" | "">,
      "read_critical": <"true" | "false" | "">,
      "viewer_digest": <uuid>,
      "options" : [array of strings] }
'''start''' check for trust against region domain, attempt to log in to this region. If it is full or not available, or the agent is not allowed, invoke region domain service to select another. "First" means home location. If home is filled then the grid will try last. If last is filled and home is set, the grid will try home. If neither works, region domain will find a region to put you on.


''':• "inventory-lib-root" -- folder_id of library root inventory folder'''
'''channel''' the name of the client. Used to differentiate official viewers from third party clients.
* assign inventory_lib_owner a hardcode value if inventory-lib-root exists.
* check aganst existence and also check if inventory_lib_owner has value
* create array 'inventory_root' and
* get the folder_id according to the give agent_id (from inventory-lib-owner)
* push the folder_id into 'rv at key 'inventory-lib-root' if folder_id has value


    {'inventory-lib-root' => 'folder_id'}
'''options''' See [[Second_Life_Login_API_Strawman#Optional Parameters|Optional Parameters]]


''':• "inventory-lib-owner" -- agent_id of owner for inventory lib  '''
'''id0''' hardware hash (based on the serial number of the first hard drive in Windows) used for uniquely identifying computers.
* checked against existence and check if inventory_lib_owner has value
* if both true then create an array of 'owner' and push agent_id into the array
* push "agent_id" into the 'rv' array at "inventory-lib-owner" if
 
  {'inventory-lib-owner' => {'agent_id' => 'agent id uuid '}}
 
''':• "inventory-skel-lib" -- LL supplied library of inventory items: same as inventory-skeleton, except global inventory''' 
* checked against existence and check if inventory_lib_owner has value
* get f.name , f.folder_id, f.parent_id f.type_default f.version from user_inventory_folder f according to the given f.agent_id and push them one by one into 'inv'
* push the 'inv' into the 'rv' array at key "inventory-skeleton"
   
    {'inventory-skeleton' =>  {'f.name, f.folder_id, f.parent_id, f.type_default, f.version '},
                              {'f.name, f.folder_id, f.parent_id, f.type_default, f.version'} ,
                              {'f.name, f.folder_id, f.parent_id, f.type_default, f.version'} .... }


''':• "gestures" -- refers to the list of UUIDs that an avatar will perform: item_id, asset_id of active gestures'''  
'''viewer_digest''' MD5 hash of the viewer executable, only relevant when the channel is set to an official Second Life viewer.
* checked against existence
* if exist, get g.item_id and g.asset_id from user_gesture_active g and user_inventory_item if they exist in both
* push these values into 'rv' at key 'gestures'
   
    {'gestures' => {gesture item_id, gesture asset_id}
                  {gesture item_id, gesture asset_id}
                  {gesture item_id, gesture asset_id} ....}
   
''':• "event_categories" --  list of different event categories'''
* post webservices for query_cache_url "event_categories"  [http://asset.agni.lindenlab.com/querycache/event_categories]
* push the result to array 'rv' at key 'event-_categories'


    {'event_categories' => {category_id (int), category_name(string)},
=== Optional Parameters ===
                          {category_id (int), category_name(string)},
The "options" key points to an array of optional options.  Zero or more of the  following character strings may appear in any order in the array:
                          {category_id (int), category_name(string)},
    { 'options' : <"inventory-root" | "inventory-skeleton" | "inventory-lib-root" |
                          {category_id (int), category_name(string)}....}
      "inventory-lib-owner" | "inventory-skel-lib" | "gestures" | "event_categories" |
 
      "event_notifications" | "classified_categories" | "buddy_list" | "ui-config" |
''':"event_notifications" -- list of events for which you have notifications'''
      "login-flags" | "global-textures">* }
* checked against existence
See [[Second_Life_Login_API_Strawman#Optional Response|Optional Response]] for descriptions of information returned from these options
* if exist, get still available event_id,event_name, event_desc, event_date, grid_x, grid_y, x_region, y_region from event_notification n and
* push these values into 'rv' at key 'gestures'
   
    {'gestures' => {event_id, event_name,event_desc, event_date, grid_x, grid_y, x_region, y_region }
                  {event_id, event_name,event_desc, event_date, grid_x, grid_y, x_region, y_region }
                  {event_id, event_name,event_desc, event_date, grid_x, grid_y, x_region, y_region } ....}
 
''':• "classified_categories"'''
* post webservices for query_cache_url "classified_categories"
* http://asset.agni.lindenlab.com/querycache/classified_categories
* push the result to array 'rv' at key 'classified_categories'
 
    {'event_categories' => {category_id (int), category_name(string)},
                          {category_id (int), category_name(string)},
                          {category_id (int), category_name(string)},
                          {category_id (int), category_name(string)}....}


''':• "buddy-list" -- agent_id, granted rights and given rights of everyone that is your buddy''' 
=== Required Response ===
   
    {'buddy-list' => {buddy_id, buddy_rights_has, buddy_rights_given},
                    {buddy_id, buddy_rights_has, buddy_rights_given},
                    {buddy_id, buddy_rights_has, buddy_rights_given},....} 
           
''':• "ui-config" -- list of UI enabled/disabled states, currently: allow_first_life ('Y' or 'N') for teens'''   
* checked against existence
* if exist, push the values of 'allow first life' into 'rv' at key 'ui-config'
   
    {'ui-config' => {'allow_first_life' => if allow first life} }


''':• "login-flags" -- unknown'''
* checked against existence
* if exist get wearable_count from inventory database and check for daylight_savings
* push values into array 'rv' at key 'login-flags'
  {'login-flags' => {'stipend_since_login' => $stipend_since_login,
                      'ever_logged_in' => $ever_logged_in,
                      'gendered' => $gendered,
                      'daylight_savings' => $daylight_savings
                    }}
''':• "global-textures" unknown'''
* checked against existence
* if exist, push values into array 'rv' at key 'login-flags'
  {'global-textures' => {'sun_texture_id' => $sun_texture_id,
                        'moon_texture_id' => $moon_texture_id,
                        'cloud_texture_id' => $cloud_texture_id
                        }}
=== Response ===
The valid (non-error) value returned by the login call is in standard xmlrpc name, value format. The most important of these is the [[Current_login_protocols#Login_Seed-Capability|"Login Seed-Capability"]] discussed below (not to be confused with the new "seed capability" for the new login procedure):
The valid (non-error) value returned by the login call is in standard xmlrpc name, value format. The most important of these is the [[Current_login_protocols#Login_Seed-Capability|"Login Seed-Capability"]] discussed below (not to be confused with the new "seed capability" for the new login procedure):
    { "last_name" : lastname ,
      "sim_ip" : 64.129.40.58 ,
      "start_location" : last ,
      "seconds_since_epoch" : 1195447316 ,
      "message" : -=- http://blog.secondlife.com -=- Visit the Official Linden Blog for the latest world status updates! ,
      "first_name" : first_name ,
      "circuit_code" : 245160577 ,
      "sim_port" : 13005 ,
      "secure_session_id" : fdb501ca-22f1-4470-b515-2650f54b8117 ,
      "look_at" : [r-0.85717299999999996274,r0.51502899999999995906,r0] ,
      "agent_id" : d5f403c7-7981-425d-a0b5-c65a3d0a4693 ,
      "inventory_host" : inv12-mysql ,
      "region_y" : 244992 ,
      "region_x" : 247808 ,
      "seed_capability" : https://sim2054.agni.lindenlab.com:12043/cap/d373fdc9-d275-e484-3ad2-4a9b231f4e34 ,
      "agent_access" : M ,
      "session_id" : 65a7213a-723a-4fcf-baca-7b247c4b43c5 ,
      "login" : true }


::Note: Values associated with the optional string parameters are preceded by a "*".
=== Optional Response ===
:Note: all return values are in "name: value" format as used in [http://docs.python.org/lib/typesmapping.html Python 2.5 dictionaries] unless otherwise noted.


:• last_name: lastname
'''inventory-root'''
:UUID of the agent’s root inventory folder.
{ 'inventory-root': [{'folder_id': <uuid>}] } 


:• sim_ip: 64.129.40.58
'''inventory-skeleton'''
:Initial list of folders in agent’s inventory. Returned as an array of five-entry dictionaries. Each dictionary element describes a folder with its name, version, type, its UUID, and the UUID of the containing folder.
{'inventory-skeleton': [{'parent_id': <uuid>, 'version': <int>, 'name': <name>, 'type_default': <int>, 'folder_id': <uuid>},  .... ]}


:• login-flags: [{'daylight_savings': 'N', 'stipend_since_login': 'N', 'gendered': 'Y', 'ever_logged_in': 'Y'}]
'''inventory-lib-root'''  
:folder_id of library root inventory folder.
{ 'inventory-lib-root': [{'folder_id': <uuid>}] }


:inventory-lib-root: [{'folder_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b'}]
'''inventory-lib-owner'''
:agent_id of owner for inventory lib. 
{ 'inventory-lib-owner': [{'agent_id': <uuid>}] }


:• event_categories: [{'category_id': 18, 'category_name': 'Discussion'}, {'category_id': 19, 'category_name': 'Sports'}, {'category_id': 20, 'category_name': 'Live Music'}, {'category_id': 22, 'category_name': 'Commercial'}, {'category_id': 23, 'category_name': 'Nightlife/Entertainment'}, {'category_id': 24, 'category_name': 'Games/Contests'}, {'category_id': 25, 'category_name': 'Pageants'}, {'category_id': 26, 'category_name': 'Education'}, {'category_id': 27, 'category_name': 'Arts and Culture'}, {'category_id': 28, 'category_name': 'Charity/Support Groups'}, {'category_id': 29, 'category_name': 'Miscellaneous'}]
'''inventory-skel-lib'''  
:Initial list of folders in agent’s inventory. Returned as an array of five element dictionaires. Each dictionary describes a folder with its name, its UUID, the UUID of the containing folder, its type, its version.
{'inventory-skeleton': [{'parent_id': <uuid>, 'version': <int>, 'name': <name>, 'type_default': <int>, 'folder_id': <uuid>},... ]}


:inventory-lib-owner: [{'agent_id': 'ba2a564a-f0f1-4b82-9c61-b7520bfcd09f'}]
'''gestures'''
:List of active gestures. An array of two element dictionaries with the inventory item uuid and the asset uuid.
{ 'gestures': [{'item_id': <uuid>, 'asset_id': <uuid>},...] }


:• start_location: last


:• seconds_since_epoch: 1195447316
'''event_categories''' 
:List of different event categories, mapping category id (an integer) to a category name. Returned as an array of two element dictionaries. Each dictionary describes a category’s id and it’s name.
{ 'event_categories': [{'category_id': <int>, 'category_name': <name>},...] }


:• message: -=- http://blog.secondlife.com -=- Visit the Official Linden Blog for the latest world status updates!
'''event_notifications'''  
 
:List of events for which the agent has pending notifications. An array of eight-element dictionaries containing: event_id, event_name, event_desc, event_date, grid_x, grid_y, x_region, y_region.
:• first_name: first_name
{'events': [{"event_id":<uuid>, "event_name"<name>,"event_desc":<string>, "event_date":<date>, "grid_x":<float>, "grid_y":<float>, "x_region":<float>, "y_region":<float>}, ...]}
 
                 
:• inventory-skeleton:
'''classified_categories"'''  
<pre style="overflow:auto"><nowiki>[{'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 6, 'name': 'Calling Cards', 'type_default': 2, 'folder_id': '072ce32a-e091-42d4-ae23-251553011f8b'}, {'parent_id': 'a78d58ec-a457-45f2-bec2-090a9f031dc2', 'version': 13, 'name': 'Male Gestures', 'type_default': -1, 'folder_id': '0d77a3c2-fbba-5172-bd23-cec8735fb029'}, {'parent_id': 'a78d58ec-a457-45f2-bec2-090a9f031dc2', 'version': 28, 'name': 'Common Gestures', 'type_default': -1, 'folder_id': '1be3f1d4-4db4-9849-8c5f-7d54d6866f93'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 7, 'name': 'Body Parts', 'type_default': 13, 'folder_id': '2271d4db-9254-49de-b544-d66eb1efd19a'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 4, 'name': 'Notecards', 'type_default': 7, 'folder_id': '2e706667-00c6-4a9a-95f1-83c65a08f893'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 8, 'name': 'Clothing', 'type_default': 5, 'folder_id': '3cbf18ff-ed8d-4e1b-ba25-9ee1
:List of classifieds categories, mapping category id (an integer) to a category. Returned as an array of two element dictionaries with a category’s id and it’s name.
e4225b04'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 1, 'name': 'Scripts', 'type_default': 10, 'folder_id': '494154ea-ddc6-433d-a512-06a102218566'}, {'parent_id': '00000000-0000-0000-0000-000000000000', 'version': 2, 'name': 'My Inventory', 'type_default': 8, 'folder_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 1, 'name': 'Photo Album', 'type_default': 15, 'folder_id': '551c87dd-8479-4129-985e-ad5b3a956807'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 8, 'name': 'Landmarks', 'type_default': 3, 'folder_id': '7036e1f1-f45d-4dbf-9953-7fd039aaf372'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 1, 'name': 'Sounds', 'type_default': 1, 'folder_id': '854ad656-888d-4072-b21c-9f81ad4b573a'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 1, 'name': 'Lost And Found', 'type_default': 16, 'folder_id': '8af1b224-c0d4-4062-a57e-ceaa0b80739a'}, {'parent
{ 'event_categories': [{'category_id': <int>, 'category_name': <name>},...] }
_id': '3cbf18ff-ed8d-4e1b-ba25-9ee1e4225b04', 'version': 45, 'name': 'Male Shape & Outfit', 'type_default': -1, 'folder_id': '95da8586-07f4-1113-56c7-ae3c2f3fa0b7'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 3, 'name': 'Gestures', 'type_default': 21, 'folder_id': 'a78d58ec-a457-45f2-bec2-090a9f031dc2'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 29, 'name': 'Objects', 'type_default': 6, 'folder_id': 'aa8915e6-f0ea-4679-9c7a-d28f5eee2b22'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 1, 'name': 'Animations', 'type_default': 20, 'folder_id': 'bb4aa79e-0cd0-4284-bf77-321332d62739'}, {'parent_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b', 'version': 4, 'name': 'Trash', 'type_default': 14, 'folder_id': 'e87e122f-8155-bf41-3a84-ad7614737b05'}, {'parent_id': '3cbf18ff-ed8d-4e1b-ba25-9ee1e4225b04', 'version': 22, 'name': 'sai', 'type_default': -1, 'folder_id': 'eef687d0-7493-3139-1644-1fe676e7fb86'}, {'parent_id': '547448bd-4b66-4
         
bc9-bb87-2dc5c7a1fa8b', 'version': 1, 'name': 'Textures', 'type_default': 0, 'folder_id': 'f8e3725c-a294-4fce-842e-27e1b830c32b'}]</nowiki></pre>
'''buddy-list'''
 
:List of friends with granted and given rights masks. Returned as an array  of three-element dictionaries with riend’s agent id, granted rights mask, given rights mask.
:• circuit_code: 245160577
{ 'buddy-list':[{'buddy_id': <uuid>', 'buddy_rights_given': <int>, 'buddy_rights_has': <int>}, ....] }
 
           
:• sim_port: 13005
'''ui-config'''  
 
:list of UI enabled/disabled states, currently: allow_first_life ('Y' or 'N') for teens. 
:• buddy-list: [{'buddy_id': '3163a2e6-0be1-4660-8412-61345692f55e', 'buddy_rights_given': 1, 'buddy_rights_has': 1}, {'buddy_id': '5b20e809-4ec4-47e2-9141-83bf7878afa7', 'buddy_rights_given': 1, 'buddy_rights_has': 1}, {'buddy_id': 'aaabdfb6-8438-4485-b98c-20b6416d0a69', 'buddy_rights_given': 1, 'buddy_rights_has': 1}, {'buddy_id': 'b3ff9eb4-ca7d-4dae-bd3c-bfbed6e3fbac', 'buddy_rights_given': 1, 'buddy_rights_has': 1}, {'buddy_id': 'eeaedeb6-c702-472a-b725-e4492095c69a', 'buddy_rights_given': 1, 'buddy_rights_has': 1}]
{ 'ui-config': {'allow_first_life': if allow first life} }
 
:• inventory-skel-lib:
<pre style="overflow:auto"><nowiki>[{'parent_id': '5b064c39-607c-2ced-d5d4-a124a267bbb7', 'version': 2, 'name': 'Sculpt Textures', 'type_default': -1, 'folder_id': '00a9afce-5661-a7a0-c9b6-a79ebc0aaa91'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 11, 'name': 'Misc Textures', 'type_default': -1, 'folder_id': '089ea65b-4ecf-f16d-1290-95d36588b80d'}, {'parent_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8', 'version': 1, 'name': 'Irish Lass', 'type_default': -1, 'folder_id': '15cafc5d-b7f9-75ad-938a-49aebd99c27c'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 1, 'name': 'Atoll continent stuff', 'type_default': -1, 'folder_id': '1a189e4c-71df-be20-f67d-93eea2170b09'}, {'parent_id': '2e4ded39-d0d7-87fb-27e9-ca1bd01fd6c0', 'version': 69, 'name': 'Other Gestures', 'type_default': -1, 'folder_id': '1ace1c79-4125-fcbe-bf02-cf84514e0f78'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 1, 'name': 'Animations', 'type_default': 20, 'folder_id': '1b80d6c4-9
64f-bece-8b2d-f8af13fb4915'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 6, 'name': 'Body Parts', 'type_default': 13, 'folder_id': '1bfc19fc-6a63-3dd6-ad50-161711941610'}, {'parent_id': '00000000-0000-0000-0000-000000000000', 'version': 92, 'name': 'Library', 'type_default': 8, 'folder_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 16, 'name': 'Female Shape & Outfit', 'type_default': -1, 'folder_id': '1c7e4cf3-675d-97a5-7ea6-6c61e99e4a25'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 9, 'name': 'Landscaping', 'type_default': -1, 'folder_id': '1d92e88c-698b-1493-2d67-39e59536bd04'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 1, 'name': 'Road Textures', 'type_default': -1, 'folder_id': '1e986366-0cb1-c557-7784-914dfe334bc3'}, {'parent_id': '1bfc19fc-6a63-3dd6-ad50-161711941610', 'version': 1, 'name': "Hair - Women's", 'type_default': -1, 'folder_id': '1f10e3f5-
ed21-49f0-5eb7-c8e47f4e556d'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Nightclub Female', 'type_default': -1, 'folder_id': '21617ba6-3be6-ae19-5bea-187271ba98e6'}, {'parent_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8', 'version': 1, 'name': 'Ruth', 'type_default': -1, 'folder_id': '223e8dee-a7ce-ee79-6755-09c210ea6a73'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Cybergoth Female', 'type_default': -1, 'folder_id': '22bd7b4e-b32d-91a3-cd69-e50ed03ce4d8'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 1, 'name': 'Business', 'type_default': -1, 'folder_id': '240942f6-362d-59c3-412c-776e0e09c9af'}, {'parent_id': '68b1584f-bad8-6594-0dcb-3da2471c0ae2', 'version': 1, 'name': 'Particle System', 'type_default': -1, 'folder_id': '257acf7b-fc86-f4ef-8244-38245d609918'}, {'parent_id': '9732c8e2-3188-1e04-d0cf-6fe957ea4979', 'version': 1, 'name': 'Terrain Textures - Islands', 'type_default': -1, 'folder_id': '
269c4fca-c0fb-a765-2f2c-a2e09dfb4b32'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 4, 'name': 'Telehubs', 'type_default': -1, 'folder_id': '299124cf-b626-f13e-edb8-df6debc5e25a'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 1, 'name': 'Dominos', 'type_default': -1, 'folder_id': '2b28a8dc-6ced-600b-6158-26171a7b44ad'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 1, 'name': 'Sounds', 'type_default': 1, 'folder_id': '2bb04b35-a411-1682-85f1-ef97c0ab5621'}, {'parent_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8', 'version': 1, 'name': 'Little Red Riding Hood', 'type_default': -1, 'folder_id': '2dd24596-8706-1771-a383-865bcd82cfa4'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 8, 'name': 'Gestures', 'type_default': 21, 'folder_id': '2e4ded39-d0d7-87fb-27e9-ca1bd01fd6c0'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'City Chic Female', 'type_default': -1, 'folder_id': '3092d8ff-0
d06-64b6-84b2-814e59523d81'}, {'parent_id': '5b064c39-607c-2ced-d5d4-a124a267bbb7', 'version': 3, 'name': 'Surface Textures', 'type_default': -1, 'folder_id': '311caaa4-5a1c-235a-5e1f-5e395bef71bc'}, {'parent_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8', 'version': 1, 'name': 'Groupie Chick', 'type_default': -1, 'folder_id': '31919c06-855f-509f-cd92-2588229593f4'}, {'parent_id': '2e4ded39-d0d7-87fb-27e9-ca1bd01fd6c0', 'version': 1, 'name': 'Male Gestures', 'type_default': -1, 'folder_id': '3550b164-9362-46b8-d377-f0064c8db3b8'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 23, 'name': 'Floor Tile', 'type_default': -1, 'folder_id': '38fc02ce-9a62-8f80-2dc6-1caaa92f52be'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'City Chic Male', 'type_default': -1, 'folder_id': '41743b67-6cde-5496-6be4-4751c684f715'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 19, 'name': 'Sculpt Prims - Examples', 'type_default': -1, 'folder_i
d': '4341aa8e-970f-cd33-51fb-4cb5b02dd387'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Goth Female', 'type_default': -1, 'folder_id': '4ffd5f38-5c7a-3a73-505f-3575951d5240'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 87, 'name': 'Clothing', 'type_default': 5, 'folder_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6'}, {'parent_id': '1bfc19fc-6a63-3dd6-ad50-161711941610', 'version': 1, 'name': "Hair - Men's", 'type_default': -1, 'folder_id': '5603b09d-0579-b03a-6f5c-d5208e79415e'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 13, 'name': 'Dirt, Sand, Ground', 'type_default': -1, 'folder_id': '579b4127-d7df-c8bf-bb73-811a618661db'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 31, 'name': 'Atoll Textures', 'type_default': -1, 'folder_id': '588a92f7-1b3c-ff87-15cd-9045c3862d52'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 17, 'name': 'Wallpaper', 'type_default': -1, 'folder_id
': '58f5cec2-8392-ac4c-c453-cb2dee1241bb'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 1, 'name': 'Sculpt Textures', 'type_default': -1, 'folder_id': '5b064c39-607c-2ced-d5d4-a124a267bbb7'}, {'parent_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8', 'version': 1, 'name': 'Fireman', 'type_default': -1, 'folder_id': '5c096e4e-4a41-a4ee-cf4f-e07825ea4669'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 1, 'name': 'Household', 'type_default': -1, 'folder_id': '5df84333-610d-1737-eb9d-e64f873bc91c'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Female Shape & Outfit 3', 'type_default': -1, 'folder_id': '631ea3c6-db9a-952c-4248-9ff1b756e7ca'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 151, 'name': 'Objects', 'type_default': 6, 'folder_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 78, 'name': 'Fabric', 'type_default': -1, 'folder_id': '66f
abba2-ecae-bd3d-d426-8bdcd145c01c'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 10, 'name': 'Wood', 'type_default': -1, 'folder_id': '677ede83-2384-1d86-2b1f-29744dc216a6'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 1, 'name': 'Waterfalls', 'type_default': -1, 'folder_id': '68b1584f-bad8-6594-0dcb-3da2471c0ae2'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 51, 'name': 'Avatar Body and Clothing Templates', 'type_default': -1, 'folder_id': '6d83a4c1-98af-8912-3154-6028a4137467'}, {'parent_id': '2bb04b35-a411-1682-85f1-ef97c0ab5621', 'version': 1, 'name': 'Gesture sounds', 'type_default': -1, 'folder_id': '744aa72b-eb07-02ed-b344-0f81a16f073a'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Nightclub Male', 'type_default': -1, 'folder_id': '7f16b6a5-0958-3244-d90a-82def97efd57'}, {'parent_id': '9732c8e2-3188-1e04-d0cf-6fe957ea4979', 'version': 1, 'name': 'Terrain Textures - Default Set', 'type
_default': -1, 'folder_id': '809d37d7-9a9a-da85-08ea-254ba338bf3b'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 3, 'name': 'Orientation stations w/ notecards', 'type_default': -1, 'folder_id': '8100d5db-cb56-bc75-0710-aa6b6e1ae162'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 7, 'name': 'Furry Male Outfit', 'type_default': -1, 'folder_id': '8166a9cc-443d-c43e-f7af-f3c627b40036'}, {'parent_id': '2e4ded39-d0d7-87fb-27e9-ca1bd01fd6c0', 'version': 37, 'name': 'Common Gestures', 'type_default': -1, 'folder_id': '86814812-7bce-bc61-2c33-d508ca7b8dcd'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 16, 'name': 'Landmarks', 'type_default': 3, 'folder_id': '88ede071-ba7c-8288-5f1d-4cbb202117a5'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 4, 'name': 'Hair Textures', 'type_default': -1, 'folder_id': '8bdc580f-d8e5-0cc8-a125-e4d1eda19c27'}, {'parent_id': '9732c8e2-3188-1e04-d0cf-6fe957ea4979', 'version': 1, 'name
': 'Terrain Textures - NW Coastal', 'type_default': -1, 'folder_id': '90c11ca9-fea3-58a2-72ad-07abeab0752e'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 8, 'name': 'Furry Female Outfit', 'type_default': -1, 'folder_id': '964ef3b2-ff95-3f5f-f741-a5a093582b33'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 6, 'name': 'Terrain Textures', 'type_default': -1, 'folder_id': '9732c8e2-3188-1e04-d0cf-6fe957ea4979'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 10, 'name': 'Male Shape & Outfit', 'type_default': -1, 'folder_id': '9b6dfef7-544d-bc06-c29a-32635c929396'}, {'parent_id': '9732c8e2-3188-1e04-d0cf-6fe957ea4979', 'version': 1, 'name': 'Atoll terrain textures', 'type_default': -1, 'folder_id': 'a18b5df1-f967-084d-f680-82b501018b1c'}, {'parent_id': '2e4ded39-d0d7-87fb-27e9-ca1bd01fd6c0', 'version': 1, 'name': 'Female Gestures', 'type_default': -1, 'folder_id': 'a3cb2e10-cf0a-8bf5-e495-16f1c4e2c30b'}, {'parent_id': '68b1584f-bad8
-6594-0dcb-3da2471c0ae2', 'version': 6, 'name': 'Particle System', 'type_default': -1, 'folder_id': 'a5012dce-abfd-8f90-ef84-61c79552054a'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 9, 'name': 'Accessories', 'type_default': -1, 'folder_id': 'abdace20-c471-df45-e6f8-731df6454547'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 270, 'name': 'Textures', 'type_default': 0, 'folder_id': 'afd25620-d379-4c16-ed03-b4a18967472c'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Male Shape & Outfit 3', 'type_default': -1, 'folder_id': 'b0529a99-bd7d-f75c-e982-a691f50fdf3d'}, {'parent_id': '9732c8e2-3188-1e04-d0cf-6fe957ea4979', 'version': 1, 'name': 'Terrain Textures - Winter', 'type_default': -1, 'folder_id': 'be1efbab-4aec-686f-9740-20bc7ffab541'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Cybergoth Male', 'type_default': -1, 'folder_id': 'be5a13e9-4d1b-745e-5144-b46550317e84'}, {'parent_
id': '9732c8e2-3188-1e04-d0cf-6fe957ea4979', 'version': 1, 'name': 'Terrain Textures - Primitive Island', 'type_default': -1, 'folder_id': 'c1b1d0cd-87a3-aafb-e0e7-681bafddd66e'}, {'parent_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8', 'version': 1, 'name': 'Prince Charming', 'type_default': -1, 'folder_id': 'c6d679a4-9cee-0bb7-17c1-fe94f1e701db'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 5, 'name': 'More Outfits', 'type_default': -1, 'folder_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 5, 'name': 'Trees, plants and grasses', 'type_default': -1, 'folder_id': 'cd29debb-868e-35c8-41a2-93594c54d772'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 4, 'name': 'Goth Male', 'type_default': -1, 'folder_id': 'd05cd8f5-381e-fd60-8778-4d2974219319'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 6, 'name': 'Harajuku Female', 'type_default': -1, 'folder_id': 'd0a747f1-f7c3-
8c0c-be12-20df046f2277'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 20, 'name': 'Buildings', 'type_default': -1, 'folder_id': 'd6666744-7931-9888-027f-61f90186eb1e'}, {'parent_id': 'c9ea5076-9334-d847-f072-1cf56a1d52d8', 'version': 1, 'name': 'Gi', 'type_default': -1, 'folder_id': 'd902ac38-479c-245b-22f0-fdc3ea2ffcd0'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 26, 'name': 'Notecards', 'type_default': 7, 'folder_id': 'dc306e42-78b7-8e3c-e8d0-69aad9a9f39b'}, {'parent_id': '51ba6e1b-e503-9b98-d9df-b0664d5457d6', 'version': 3, 'name': 'Harajuku Male', 'type_default': -1, 'folder_id': 'e09c947b-0a2a-c383-d55a-68f93ec9d4f2'}, {'parent_id': '6371a71c-7fc2-c38f-f87c-f0933868fd73', 'version': 1, 'name': 'Walkways', 'type_default': -1, 'folder_id': 'e7b66ed2-a8ce-3e59-1f3e-83788e1fe866'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 24, 'name': 'Photo Album', 'type_default': 15, 'folder_id': 'eb2010ea-1f78-a93b-ae89-217345b47fd1
'}, {'parent_id': 'afd25620-d379-4c16-ed03-b4a18967472c', 'version': 1, 'name': 'Rock', 'type_default': -1, 'folder_id': 'ede89e78-9eed-d4a4-c320-2db92649eba5'}, {'parent_id': '1c7a7fd0-104e-a8b1-51c6-32ea9b08e38b', 'version': 1, 'name': 'Scripts', 'type_default': 10, 'folder_id': 'f7cfde4d-3b16-54b3-2169-72d390d1065e'}, {'parent_id': '2e4ded39-d0d7-87fb-27e9-ca1bd01fd6c0', 'version': 4, 'name': 'Speech Gestures', 'type_default': -1, 'folder_id': 'fd05f2bf-5d8a-ffb3-40d4-48a9b9084c3c'}]</nowiki></pre>
 
:• secure_session_id: fdb501ca-22f1-4470-b515-2650f54b8117
 
:• look_at: [r-0.85717299999999996274,r0.51502899999999995906,r0]
 
:• classified_categories: [{'category_id': 1, 'category_name': 'Shopping'}, {'category_id': 2, 'category_name': 'Land Rental'}, {'category_id': 3, 'category_name': 'Property Rental'}, {'category_id': 4, 'category_name': 'Special Attraction'}, {'category_id': 5, 'category_name': 'New Products'}, {'category_id': 6, 'category_name': 'Employment'}, {'category_id': 7, 'category_name': 'Wanted'}, {'category_id': 8, 'category_name': 'Service'}, {'category_id': 9, 'category_name': 'Personal'}]
 
:• gestures:  
<pre style="overflow:auto">[{'asset_id': '43417d10-a2f7-7727-6fd4-dd7f04ad7a13', 'item_id': '0405171b-190e-6e35-dedb-8be1eddfe609'}, {'asset_id': 'af2b8320-e579-2c41-b717-969759aeb3ca', 'item_id': '06d995f7-8184-d4c8-51d2-f99faadf6dd3'}, {'asset_id': '40b92916-8055-2562-008f-58924bd0e03c', 'item_id': '0ff437b5-4362-814e-7759-b2cdac564afd'}, {'asset_id': '76f7ced2-4f91-31c8-ff7d-e76b19abfa40', 'item_id': '220fef18-4ab8-2575-f6c1-af3f0d8160f8'}, {'asset_id': 'fb262981-4295-f048-c280-629081bf3b6b', 'item_id': '2628556d-57b0-3a26-fa79-b517ef16192f'}, {'asset_id': '6212ffdd-d447-a92f-18f3-8cb94a799d83', 'item_id': '347dc0a9-4272-399b-450e-15d4d78c52d6'}, {'asset_id': 'c63ac707-6325-14c8-d681-54b81d0dff77', 'item_id': '34f897bf-8922-1e8c-fdac-98a0f5a9eb0b'}, {'asset_id': 'd918a0d8-7291-ce83-762f-3f68dcc7402d', 'item_id': '37e5c513-149a-1a0a-ef47-c831548a30dd'}, {'asset_id': 'dbd054f1-132b-cc22-e46a-bad83c230c91', 'item_id': '3db7f1b9-b1f9-9fd2-3f65-d3e21d24b58c'}, {'asset_id': '0247dbfa-f37e-64ab-d09f-267888
4c7f4a', 'item_id': '3e65ec68-bdba-af60-d798-841a075cf17f'}, {'asset_id': '5a68100b-e6ba-5170-649c-80beddc67035', 'item_id': '44bf7318-21f4-32ad-d185-4e49e1a321de'}, {'asset_id': '865c5fe0-aafb-671a-8ad5-778beb24b6f8', 'item_id': '47a5b60f-0a2e-fda6-4bf4-1ff4566cf16a'}, {'asset_id': 'ea9ab69b-c2c7-3e18-a50b-37a9cfe457cd', 'item_id': '49b0ef41-9a33-067b-e9b7-dd2623db29eb'}, {'asset_id': '8868cfa3-5b82-97ab-dc38-ded906f7fd90', 'item_id': '634264c1-e98e-09a8-4782-c94bd2860c49'}, {'asset_id': '0401dc30-0fdd-1fc3-3e51-c683fe117184', 'item_id': '640b7215-02a9-e514-52c5-82a142f2e905'}, {'asset_id': '00b48fa0-ac43-fadf-d061-6b726a24a90a', 'item_id': '680923c5-100c-36b7-c644-c0d7a05913a0'}, {'asset_id': '52d9684f-2dcf-c252-2360-186b4236d07e', 'item_id': '6a972484-7490-fe5c-e526-ba75c111e37c'}, {'asset_id': '8b753e16-bd7d-2bb3-7765-671b7b31e77c', 'item_id': '6e548cd2-9c74-6112-ef7c-fdc38db91770'}, {'asset_id': 'f2483d55-bc31-38c0-65b2-9f7e87fce5c4', 'item_id': '7d65f0e3-1fd9-c81f-a61e-5de356f0eb
47'}, {'asset_id': '0eeb5ef7-10dd-4e4a-11a5-d053011fcdf2', 'item_id': '7e783987-2367-5276-bd27-78ac2667fef9'}, {'asset_id': '4b30f435-499f-32fe-f2a0-7e7bce8d881d', 'item_id': '7f05c4bf-a75c-847a-c018-bca16800b400'}, {'asset_id': 'aca78492-0487-03ec-4eb5-5c8e76c837e1', 'item_id': '7fffb1ef-38b5-82da-3076-4e9c0f443b2e'}, {'asset_id': '76d30ee1-c369-12ec-8dbc-9cf2f51120ff', 'item_id': '80f8c94a-a2d2-01eb-32bd-4cf1fe830383'}, {'asset_id': '0813d01a-d3d3-32a4-48a3-26b6e1e01e39', 'item_id': '83c4e26a-99e2-8f5e-1763-033a3a55d4f1'}, {'asset_id': 'fc3de4b8-bd3e-662b-934c-b72714dab5bf', 'item_id': '88754d75-93c6-c8e6-5fe8-7b9421b977b3'}, {'asset_id': 'b5ea617e-47cf-612b-2d99-8c6f6dcac218', 'item_id': '9148e1eb-e00c-2ef2-8bde-c3906baf885c'}, {'asset_id': 'a6a09cb1-0845-5ec0-051e-16bb79b30ddf', 'item_id': '97484726-f41d-9108-7678-93ba974d81c7'}, {'asset_id': 'ba38eeb2-d35f-0a07-0c04-0eb42fcc6010', 'item_id': '9ac86c71-c02b-ed95-6577-36eee67b7b73'}, {'asset_id': 'b57c996d-cb06-43c8-749d-e9ce361f172
e', 'item_id': '9bbbb8a1-2c75-87de-beed-eb15f5d74294'}, {'asset_id': '0a3336cf-3ad1-012a-91c2-5b5620aaaef3', 'item_id': '9bc6a34e-50a0-2248-2717-8a5524910ad0'}, {'asset_id': '1910ffbd-096c-5eb7-19f5-8c99ab6a748c', 'item_id': 'a6087696-9d56-e1c6-eca2-8bacdbf71e3c'}, {'asset_id': '04608b19-1668-399c-5790-b7df8d9dc9cf', 'item_id': 'a9d1a261-9632-6920-c0d7-2b3dfd9442c0'}, {'asset_id': '66ecd9bd-22e1-2633-f41e-ad1a38205662', 'item_id': 'ada896bc-52ae-f237-2a75-4e75179cceb1'}, {'asset_id': 'e7584536-86f2-c962-405d-d14adff71f38', 'item_id': 'adc59624-b875-de11-2bfe-236a2c610b8f'}, {'asset_id': '97c5742d-1d74-9408-2bae-9738a9e9d084', 'item_id': 'b1342b43-060d-492c-41a6-be0439839564'}, {'asset_id': '44a87e64-2d78-14b7-1cde-ac0f5031621f', 'item_id': 'c5853f4c-855f-4013-ce92-aabc59f1b9d8'}, {'asset_id': '2d03fd78-92fc-ca52-aabb-a4904e1339d1', 'item_id': 'e6fe4144-926c-ef17-c009-93227c7b159a'}, {'asset_id': 'b6f560d1-e2ad-24df-344c-2943c47a6775', 'item_id': 'f6f78510-02e7-526c-b35d-53cfd0b30361'},
{'asset_id': 'fa743da9-7e6e-d88e-3e4f-143dcb4fc01b', 'item_id': 'f92824f0-8129-b36d-f5b2-652762433e0a'}, {'asset_id': '0ce71257-7a07-257f-f023-fd68575a3a4e', 'item_id': 'fa184fed-6946-ec33-5fef-bcea29e2c8d7'}]</pre>
 
:• inventory-root: [{'folder_id': '547448bd-4b66-4bc9-bb87-2dc5c7a1fa8b'}]
 
:• agent_id: d5f403c7-7981-425d-a0b5-c65a3d0a4693
 
:• inventory_host: inv12-mysql
 
:• ui-config: [{'allow_first_life': 'Y'}]
 
:• global-textures: [{'sun_texture_id': 'cce0f112-878f-4586-a2e2-a8f104bba271', 'cloud_texture_id': 'fc4b9f0b-d008-45c6-96a4-01dd947ac621', 'moon_texture_id': 'd07f6eed-b96a-47cd-b51d-400ad4a1c428'}]
 
:• region_y: 244992
 
:• region_x: 247808
 
:• seed_capability: https://sim2054.agni.lindenlab.com:12043/cap/d373fdc9-d275-e484-3ad2-4a9b231f4e34
 
:• agent_access: M
 
:• session_id: 65a7213a-723a-4fcf-baca-7b247c4b43c5


:• event_notifications: []
'''login-flags''' 
:Several flags about the state of the agent.
{ 'login-flags': {'stipend_since_login': <'Y'|'N'>,  'ever_logged_in': <'Y'|'N'>, 'gendered': <'Y'|'N'>, 'daylight_savings': <'Y'|'N'>} }


:• login: true
'''global-textures'''
:The asset ids of several global textures.
{ 'global-textures': {'sun_texture_id': <uuid>, 'moon_texture_id': <uuid>, 'cloud_texture_id': <uuid>} }


[[Category: AW Groupies]]
[[Category: AW Groupies]]

Latest revision as of 18:03, 30 July 2008

This page is now deprecated. It is retained in the wiki for transparency and for the discussion. The login protocol is now a part of the SL Grid Open Grid Protocol doc and should be referenced there

Second Life Login API Strawman

This is a work in progress. Also see a similar Strawman by AWG: AWG_flows_login Innitial meeting with AWG to request feedback on protocol: Feedback Chat-log, 19 Feb 2008

Introduction

This page attempts to merge Authentication_Flow with Current_login_protocols and adds additional protocol changes to fit with Agent_Domain#How_login_works. The goal is to expose a protocol allowing login to a separate region domain while making incremental, small changes to the current protocol.

Summary

  1. *Viewer sends credentials to the Login Service #Login_Web_Service
  2. Login Service authenticates and sets up and queries for presence:
    • Queries the agent data from the Agent Store.
    • Finds an agent host, POST's agent presence checking for already online
    • grants seed capability, which lives on an agent host
  3. *Viewer requests capabilities needed for login via received seed capability. #Seed_Capability
  4. *(future) Viewer Polls Agent Host for messages via long-poll #poll_for_messages_Capability
  5. *(future) Viewer can send instant messages before being in world. #instant_message_Capability
  6. *Viewer invokes legacy_login capability #legacy_login_Capability
    • Initialization data returned by login
    • Sets up agent presence
    • Forwards location request to region domain, finding a region to rez the avatar
    • Establishes session with region host, which gives back a (region domain) seed capability to the client
  7. *Viewer invokes region seed capability

Definitions

Seed Capability

The current Login Seed Capability is a Capability associated with the simulator you are logging into. It should not be confused with the #Agent_Seed_Capability proposed for the new protocols.

Agent Seed Capability

This is a newly introduced capability associated with the agent host as part of the agent domain. This is different from the previously mentioned seed-capability, which associates with the sim host as part of the region domain.

Conventions

On this page the following conventions are used:

"--" followed by text, indicates a comment until the end of line, ala the C++ "//" style comments.
< represents a value which can be substituted by an appropriate string described inside >
< represents a list of choices | separated by a vertical bar >
"..." ellipses indicates an unknown list of similar values follow
"<int>" represents an integer value
"<uuid>" represents a UUID value, e.g., 'c5853f4c-855f-4013-ce92-aabc59f1b9d8'
The remaining syntax follows (very roughly) that of Python data structures:
"in quotes is a literal string"
{ <represents a map or dictionary of one or more key>:<value pairs> } -- separated by commas
[ represents an array, of elements, separated by commas ]
'represents a string that must be quoted, but how will be implementation specific' for example in LSL "" denotes a string and " will be used in place of the single quote (').
+ means to concatenate the two parts, though how will be implementation specific, for example + can be used to concatenate strings.

Login Web Service

Client --> public Login Server: "Here is my credential, and optional agent identity desired" Second Life Login Server: https://login.agni.secondlife.com/app/login/

The login will be done using standard http/1.1 POST and the default format for all parameters in POST and RESPONSE will likely be "content-type" = "application/xml" and the actual xml format will be the text serialization of Linden Lab's XML-LLSD format. Future formats will be negotiated using standard http/1.1 Content Negotiation.

Required Parameters

   { 'credential': { 'type': 'agent',
                     'first_name': <first>,
                     'last_name': <last>,
                     'password': '$1$' + <passwd_md5> } }

OR (future)

   { 'credential': { 'type': 'account',
                     'account_name': <IBM>,
                     'password': '$1$' + <passwd_md5> } }

OR (future)

   { 'credential': { 'type': 'openid',
                     'url': <URL> } }

OR (future)

   { 'credential': { 'type': 'agent',
                     'first_name': <first>,
                     'last_name': <last>}}

which will need to a challenge from the auth system.

Optional Parameters

Optionally, specify which account you want this credential to log you into

   { 'credential': { 'type': 'agent',
                     'first_name': <first>,
                     'last_name': <last>,
                     'password': '$1$' + <passwd_md5> },
     'first_name': <first>,
     'last_name': <last> }

Response

Response Codes : Response 200 : Successful authentication.

   { 'agent seed-capability' : <url> -- agent domain seed capability] }

4xx : If this credential has more than one account linked to it, and no specific account was specified in the optional parameters, the response will list a set of accounts to choose from.

   { 'reason': 'select account',  -- reason why authentication failed
     'accounts' : [ { 'first_name' : <first>, 'last_name' : <last> },
                    { 'first_name' : <first>, 'last_name' : <last> },
                    ... ] }

4xx : Unsuccessful authentication due to need for more information.

   { 'reason': <'tos'|'critical'|'more info'>,  -- reason why authentication failed
     'redirect' : <url>  } -- URL to visit to get more information on how to proceed

Other reasons:

   * no agent - 404
   * bad identity and authentication information - 403
   * agent not enabled (banned) - 403

5xx : Server unavailable.

   { 'reason': 'generic' }

Seed Capability

Client -> Agent Host (via seed cap): "I want cap X"

  • This service supports named capabilities for the agent domain requested by the client

Required Parameters

Map of named capabilities to Options

   { 'caps': {<capability name> : { 'enabled' : <'true' | 'false'> },
     <capability name> : { 'enabled' : <'true' | 'false'> },
     ... }
   }
   <- Ok, here's the cap to do X
   -or-
   <- Bzzzp, you don't get to do X

Response

Map of capability name to capability URL:

   { 'caps': {<capability name> : <url>, <capability name> : <url>, ... }}

Example: Basic Login Capabilities

POST data:

   { 'establish_presence' : { 'enabled' : 'true' },
     'inventory' : { 'enabled' : 'true' },
     'non_existent_cap' : { 'enabled' : 'false' },
     'be_in_world' : { 'enabled' : 'true' } }

Response value:

   { 'establish_presence' : <cap GO>, 'inventory' : <cap I>, 'be_in_world' : <cap CTR> }

RezAvatar Capability

This is the hypothetical proposed protocol for the future with many region domains.

RezAvatar agent host service

   {'region_url': <r_url>, 'position':  [x, y, z]}

->

   {'session_id': <s_id>, 'secure_session_id': <ssid>, 'circuit_code': <cc>,
   'seed_cap': <s_cap>, 'ip_address': <ip_address>, 'udp_port': <udp_port>, 'look_at': [lx, ly, lz]}

The RezAvatar agent host service invokes the RezAvatar region host service on behalf of the client.

RezAvatar region host service

   {'avatar_id': <a_id>, ..., 'position': [x, y, z]}

->

   {'seed_cap': <s_cap>, 'ip_address': <ip_address>, 'udp_port': <upd port>, 'circuit_code': <cc>, 'session_id': <s_id>, 'secure_session_id': <ssid>, 'look_at': [lx, ly, lz]}

or

   403 Forbidden

legacy_login Capability

This is for connecting to an existing sim.

  • Viewer -> Agent Host (via cap LL): "I'd like to log in using the legacy login protocols"

Required Parameters

   { 'start': <"first" | "last" | <uri> >,
     "channel": <channel>,
     "version": <client version>,
     "platform": <"Lin" | "Mac" | "Win">
     "mac": <MAC Address>,
     "options": <array of strings>,
     "id0": <uuid>,
     "agree_to_tos": <"true" | "false" | "">,
     "read_critical": <"true" | "false" | "">,
     "viewer_digest": <uuid>,
     "options" : [array of strings] }

start check for trust against region domain, attempt to log in to this region. If it is full or not available, or the agent is not allowed, invoke region domain service to select another. "First" means home location. If home is filled then the grid will try last. If last is filled and home is set, the grid will try home. If neither works, region domain will find a region to put you on.

channel the name of the client. Used to differentiate official viewers from third party clients.

options See Optional Parameters

id0 hardware hash (based on the serial number of the first hard drive in Windows) used for uniquely identifying computers.

viewer_digest MD5 hash of the viewer executable, only relevant when the channel is set to an official Second Life viewer.

Optional Parameters

The "options" key points to an array of optional options. Zero or more of the following character strings may appear in any order in the array:

   { 'options' : <"inventory-root" | "inventory-skeleton" | "inventory-lib-root" |
     "inventory-lib-owner" | "inventory-skel-lib" | "gestures" | "event_categories" |
     "event_notifications" | "classified_categories" | "buddy_list" | "ui-config" | 
     "login-flags" | "global-textures">* }

See Optional Response for descriptions of information returned from these options

Required Response

The valid (non-error) value returned by the login call is in standard xmlrpc name, value format. The most important of these is the "Login Seed-Capability" discussed below (not to be confused with the new "seed capability" for the new login procedure):

    { "last_name" : lastname ,
     "sim_ip" : 64.129.40.58 ,
     "start_location" : last ,
     "seconds_since_epoch" : 1195447316 ,
     "message" : -=- http://blog.secondlife.com -=- Visit the Official Linden Blog for the latest world status updates! ,
     "first_name" : first_name ,
     "circuit_code" : 245160577 ,
     "sim_port" : 13005 ,
     "secure_session_id" : fdb501ca-22f1-4470-b515-2650f54b8117 ,
     "look_at" : [r-0.85717299999999996274,r0.51502899999999995906,r0] ,
     "agent_id" : d5f403c7-7981-425d-a0b5-c65a3d0a4693 ,
     "inventory_host" : inv12-mysql ,
     "region_y" : 244992 ,
     "region_x" : 247808 ,
     "seed_capability" : https://sim2054.agni.lindenlab.com:12043/cap/d373fdc9-d275-e484-3ad2-4a9b231f4e34 ,
     "agent_access" : M ,
     "session_id" : 65a7213a-723a-4fcf-baca-7b247c4b43c5 ,
     "login" : true }

Optional Response

Note: all return values are in "name: value" format as used in Python 2.5 dictionaries unless otherwise noted.

inventory-root

UUID of the agent’s root inventory folder.

{ 'inventory-root': [{'folder_id': <uuid>}] }

inventory-skeleton

Initial list of folders in agent’s inventory. Returned as an array of five-entry dictionaries. Each dictionary element describes a folder with its name, version, type, its UUID, and the UUID of the containing folder.

{'inventory-skeleton': [{'parent_id': <uuid>, 'version': <int>, 'name': <name>, 'type_default': <int>, 'folder_id': <uuid>}, .... ]}

inventory-lib-root

folder_id of library root inventory folder.

{ 'inventory-lib-root': [{'folder_id': <uuid>}] }

inventory-lib-owner

agent_id of owner for inventory lib.

{ 'inventory-lib-owner': [{'agent_id': <uuid>}] }

inventory-skel-lib

Initial list of folders in agent’s inventory. Returned as an array of five element dictionaires. Each dictionary describes a folder with its name, its UUID, the UUID of the containing folder, its type, its version.

{'inventory-skeleton': [{'parent_id': <uuid>, 'version': <int>, 'name': <name>, 'type_default': <int>, 'folder_id': <uuid>},... ]}

gestures

List of active gestures. An array of two element dictionaries with the inventory item uuid and the asset uuid.

{ 'gestures': [{'item_id': <uuid>, 'asset_id': <uuid>},...] }


event_categories

List of different event categories, mapping category id (an integer) to a category name. Returned as an array of two element dictionaries. Each dictionary describes a category’s id and it’s name.

{ 'event_categories': [{'category_id': <int>, 'category_name': <name>},...] }

event_notifications

List of events for which the agent has pending notifications. An array of eight-element dictionaries containing: event_id, event_name, event_desc, event_date, grid_x, grid_y, x_region, y_region.

{'events': [{"event_id":<uuid>, "event_name"<name>,"event_desc":<string>, "event_date":<date>, "grid_x":<float>, "grid_y":<float>, "x_region":<float>, "y_region":<float>}, ...]}

classified_categories"

List of classifieds categories, mapping category id (an integer) to a category. Returned as an array of two element dictionaries with a category’s id and it’s name.

{ 'event_categories': [{'category_id': <int>, 'category_name': <name>},...] }

buddy-list

List of friends with granted and given rights masks. Returned as an array of three-element dictionaries with riend’s agent id, granted rights mask, given rights mask.

{ 'buddy-list':[{'buddy_id': <uuid>', 'buddy_rights_given': <int>, 'buddy_rights_has': <int>}, ....] }

ui-config

list of UI enabled/disabled states, currently: allow_first_life ('Y' or 'N') for teens.

{ 'ui-config': {'allow_first_life': if allow first life} }

login-flags

Several flags about the state of the agent.

{ 'login-flags': {'stipend_since_login': <'Y'|'N'>, 'ever_logged_in': <'Y'|'N'>, 'gendered': <'Y'|'N'>, 'daylight_savings': <'Y'|'N'>} }

global-textures

The asset ids of several global textures.

{ 'global-textures': {'sun_texture_id': <uuid>, 'moon_texture_id': <uuid>, 'cloud_texture_id': <uuid>} }