<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://osimdev.org/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenSimulator_Internals%2FConnector_Architecture%2FUserAccount_Connector</id>
	<title>OpenSimulator Internals/Connector Architecture/UserAccount Connector - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://osimdev.org/wiki/index.php?action=history&amp;feed=atom&amp;title=OpenSimulator_Internals%2FConnector_Architecture%2FUserAccount_Connector"/>
	<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Connector_Architecture/UserAccount_Connector&amp;action=history"/>
	<updated>2026-08-04T15:31:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Connector_Architecture/UserAccount_Connector&amp;diff=72&amp;oldid=prev</id>
		<title>Jwbshaw: first</title>
		<link rel="alternate" type="text/html" href="http://osimdev.org/wiki/index.php?title=OpenSimulator_Internals/Connector_Architecture/UserAccount_Connector&amp;diff=72&amp;oldid=prev"/>
		<updated>2026-07-07T12:18:02Z</updated>

		<summary type="html">&lt;p&gt;first&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= OpenSimulator Internals/Connector Architecture/UserAccount Connector =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
UserAccountServicesConnector is the simulator-side remote connector for IUserAccountService. It translates IUserAccountService calls into HTTP POST requests to the ROBUST UserAccount handler at /accounts.&lt;br /&gt;
&lt;br /&gt;
Source file:&lt;br /&gt;
&lt;br /&gt;
 OpenSim/Services/Connectors/UserAccountServicesConnector.cs&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Initialisation ===&lt;br /&gt;
&lt;br /&gt;
Config section: [UserAccountService]&lt;br /&gt;
&lt;br /&gt;
Required key:&lt;br /&gt;
* UserAccountServerURI -- URL of the ROBUST UserAccount endpoint; throws if missing or unresolvable&lt;br /&gt;
&lt;br /&gt;
Base class BaseServiceConnector.Initialise() called for auth setup.&lt;br /&gt;
&lt;br /&gt;
Three constructors:&lt;br /&gt;
* Default (no args) -- URI must be set externally&lt;br /&gt;
* String URI -- used by callers that pass the URI directly&lt;br /&gt;
* IConfigSource -- calls Initialise(), normal grid mode&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Transport ===&lt;br /&gt;
&lt;br /&gt;
All methods POST to m_ServerURI + &amp;quot;/accounts&amp;quot; using SynchronousRestFormsRequester.&lt;br /&gt;
&lt;br /&gt;
All requests include:&lt;br /&gt;
* VERSIONMIN / VERSIONMAX -- protocol version negotiation&lt;br /&gt;
* METHOD -- identifies the operation&lt;br /&gt;
&lt;br /&gt;
Two internal helpers:&lt;br /&gt;
&lt;br /&gt;
SendAndGetReply() -- used by single-account GET methods and StoreUserAccount():&lt;br /&gt;
* POSTs, parses XML response&lt;br /&gt;
* Returns UserAccount constructed from result dictionary, or null&lt;br /&gt;
&lt;br /&gt;
SendAndGetBoolReply() -- defined but not called by any method in this file. Dead code.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Methods ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Method !! METHOD field !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| GetUserAccount(scopeID, firstName, lastName) || &amp;quot;getaccount&amp;quot; || Lookup by name&lt;br /&gt;
|-&lt;br /&gt;
| GetUserAccount(scopeID, email) || &amp;quot;getaccount&amp;quot; || Lookup by email&lt;br /&gt;
|-&lt;br /&gt;
| GetUserAccount(scopeID, userID) || &amp;quot;getaccount&amp;quot; || Lookup by UUID&lt;br /&gt;
|-&lt;br /&gt;
| GetUserAccounts(scopeID, query) || &amp;quot;getaccounts&amp;quot; || Search by name fragment; returns List&amp;lt;UserAccount&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GetUserAccounts(scopeID, List&amp;lt;string&amp;gt; IDs) || &amp;quot;getmultiaccounts&amp;quot; || Batch lookup by UUID list; falls back to one-by-one if server returns &amp;quot;Failure&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| StoreUserAccount(data) || &amp;quot;setaccount&amp;quot; || Serializes UserAccount via ToKeyValuePairs(); returns true if result is non-null&lt;br /&gt;
|-&lt;br /&gt;
| CreateUser(first, last, password, email, scopeID) || &amp;quot;createuser&amp;quot; || Remote user creation; not part of IUserAccountService interface&lt;br /&gt;
|-&lt;br /&gt;
| InvalidateCache(userID) || (none) || No-op -- cache invalidation not implemented for remote connector&lt;br /&gt;
|-&lt;br /&gt;
| GetUserAccountsWhere(scopeID, where) || (none) || Always returns null -- not implemented for regions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
GetUserAccounts(List&amp;lt;string&amp;gt; IDs) fallback:&lt;br /&gt;
* Tries &amp;quot;getmultiaccounts&amp;quot; first&lt;br /&gt;
* If result == &amp;quot;Failure&amp;quot;: sets suported = false, falls back to calling GetUserAccount(scopeID, uuid) one by one&lt;br /&gt;
* Skips IDs that are not valid non-zero UUIDs in the fallback path&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* CreateUser() has a bug: the email field sends first name instead of the email value. The line reads sendData[&amp;quot;Email&amp;quot;] = first rather than sendData[&amp;quot;Email&amp;quot;] = email.&lt;br /&gt;
* SendAndGetBoolReply() is defined but never called -- dead code.&lt;br /&gt;
* InvalidateCache() is a no-op -- the remote connector has no local cache to invalidate.&lt;br /&gt;
* GetUserAccountsWhere() returns null unconditionally -- SQL WHERE clause queries are not supported over HTTP.&lt;br /&gt;
* ScopeID fields are present in the code but some are commented out.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenSimulator Internals/Connector Architecture]]&lt;br /&gt;
* [[OpenSimulator Internals/Code Map/ROBUST/UserAccountService]]&lt;br /&gt;
* [[OpenSimulator Internals/Code Map/Shared]]&lt;/div&gt;</summary>
		<author><name>Jwbshaw</name></author>
	</entry>
</feed>