aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/share/perl/lib/OpenSim/UserServer
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--share/perl/lib/OpenSim/UserServer.pm239
-rw-r--r--share/perl/lib/OpenSim/UserServer/Config.pm125
-rw-r--r--share/perl/lib/OpenSim/UserServer/UserManager.pm49
3 files changed, 413 insertions, 0 deletions
diff --git a/share/perl/lib/OpenSim/UserServer.pm b/share/perl/lib/OpenSim/UserServer.pm
new file mode 100644
index 0000000..77117e1
--- /dev/null
+++ b/share/perl/lib/OpenSim/UserServer.pm
@@ -0,0 +1,239 @@
1package OpenSim::UserServer;
2
3use strict;
4use OpenSim::Config;
5use OpenSim::UserServer::Config;
6use OpenSim::UserServer::UserManager;
7
8sub getHandlerList {
9 my %list = (
10 "login_to_simulator" => \&_login_to_simulator,
11 "get_user_by_name" => \&_get_user_by_name,
12 "get_user_by_uuid" => \&_get_user_by_uuid,
13 "get_avatar_picker_avatar" => \&_get_avatar_picker_avatar,
14 );
15 return \%list;
16}
17
18# #################
19# Handlers
20sub _login_to_simulator {
21 my $params = shift;
22 # check params
23 if (!$params->{first} || !$params->{last} || !$params->{passwd}) {
24 return &_make_false_response("not enough params", $OpenSim::Config::SYS_MSG{FATAL});
25 }
26 # select user (check passwd)
27 my $user = &OpenSim::UserServer::UserManager::getUserByName($params->{first}, $params->{last});
28 if ($user->{passwordHash} ne $params->{passwd}) {
29 &_make_false_response("password not match", $OpenSim::Config::SYS_MSG{FAIL});
30 }
31
32 # contact with Grid server
33 my %grid_request_params = (
34 region_handle => $user->{homeRegion},
35 authkey => undef
36 );
37 my $grid_response = &OpenSim::Utility::XMLRPCCall($OpenSim::Config::GRID_SERVER_URL, "simulator_data_request", \%grid_request_params);
38 my $region_server_url = "http://" . $grid_response->{sim_ip} . ":" . $grid_response->{http_port};
39
40 # contact with Region server
41 my $session_id = &OpenSim::Utility::GenerateUUID;
42 my $secure_session_id = &OpenSim::Utility::GenerateUUID;
43 my $circuit_code = int(rand() * 1000000000); # just a random integer
44 my $caps_id = &OpenSim::Utility::GenerateUUID;
45 my %region_request_params = (
46 session_id => $session_id,
47 secure_session_id => $secure_session_id,
48 firstname => $user->{username},
49 lastname => $user->{lastname},
50 agent_id => $user->{UUID},
51 circuit_code => $circuit_code,
52 startpos_x => $user->{homeLocationX},
53 startpos_y => $user->{homeLocationY},
54 startpos_z => $user->{homeLocationZ},
55 regionhandle => $user->{homeRegion},
56 caps_path => $caps_id,
57 );
58 my $region_response = &OpenSim::Utility::XMLRPCCall($region_server_url, "expect_user", \%region_request_params);
59
60 # contact with Inventory server
61 my $inventory_data = &_create_inventory_data($user->{UUID});
62
63 # return to client
64 my %response = (
65 # login info
66 login => "true",
67 session_id => $session_id,
68 secure_session_id => $secure_session_id,
69 # agent
70 first_name => $user->{username},
71 last_name => $user->{lastname},
72 agent_id => $user->{UUID},
73 agent_access => "M", # TODO: do not know its meaning, hard coding in opensim
74 # grid
75 start_location => $params->{start},
76 sim_ip => $grid_response->{sim_ip},
77 sim_port => $grid_response->{sim_port},
78 #sim_port => 9001,
79 region_x => $grid_response->{region_locx} * 256,
80 region_y => $grid_response->{region_locy} * 256,
81 # other
82 inventory_host => undef, # inv13-mysql
83 circuit_code => $circuit_code,
84 message => $OpenSim::Config::SYS_MSG{LOGIN_WELCOME},
85 seconds_since_epoch => time,
86 seed_capability => $region_server_url . "/CAPS/" . $caps_id . "0000/", # https://sim2734.agni.lindenlab.com:12043/cap/61d6d8a0-2098-7eb4-2989-76265d80e9b6
87 look_at => &_make_r_string($user->{homeLookAtX}, $user->{homeLookAtY}, $user->{homeLookAtZ}),
88 home => &_make_home_string(
89 [$grid_response->{region_locx} * 256, $grid_response->{region_locy} * 256],
90 [$user->{homeLocationX}, $user->{homeLocationY}, $user->{homeLocationX}],
91 [$user->{homeLookAtX}, $user->{homeLookAtY}, $user->{homeLookAtZ}]),
92 "inventory-skeleton" => $inventory_data->{InventoryArray},
93 "inventory-root" => [ { folder_id => $inventory_data->{RootFolderID} } ],
94 "event_notifications" => \@OpenSim::UserServer::Config::event_notifications,
95 "event_categories" => \@OpenSim::UserServer::Config::event_categories,
96 "global-textures" => \@OpenSim::UserServer::Config::global_textures,
97 "inventory-lib-owner" => \@OpenSim::UserServer::Config::inventory_lib_owner,
98 "inventory-skel-lib" => \@OpenSim::UserServer::Config::inventory_skel_lib, # hard coding in OpenSim
99 "inventory-lib-root" => \@OpenSim::UserServer::Config::inventory_lib_root,
100 "classified_categories" => \@OpenSim::UserServer::Config::classified_categories,
101 "login-flags" => \@OpenSim::UserServer::Config::login_flags,
102 "initial-outfit" => \@OpenSim::UserServer::Config::initial_outfit,
103 "gestures" => \@OpenSim::UserServer::Config::gestures,
104 "ui-config" => \@OpenSim::UserServer::Config::ui_config,
105 );
106 return \%response;
107}
108
109sub _get_user_by_name {
110 my $param = shift;
111
112 if ($param->{avatar_name}) {
113 my ($first, $last) = split(/\s+/, $param->{avatar_name});
114 my $user = &OpenSim::UserServer::UserManager::getUserByName($first, $last);
115 if (!$user) {
116 return &_unknown_user_response;
117 }
118 return &_convert_to_response($user);
119 } else {
120 return &_unknown_user_response;
121 }
122}
123
124sub _get_user_by_uuid {
125 my $param = shift;
126
127 if ($param->{avatar_uuid}) {
128 my $user = &OpenSim::UserServer::UserManager::getUserByUUID($param->{avatar_uuid});
129 if (!$user) {
130 return &_unknown_user_response;
131 }
132 return &_convert_to_response($user);
133 } else {
134 return &_unknown_user_response;
135 }
136}
137
138sub _get_avatar_picker_avatar {
139}
140
141# #################
142# sub functions
143sub _create_inventory_data {
144 my $user_id = shift;
145 # TODO : too bad!! -> URI encoding
146 my $postdata =<< "POSTDATA";
147POSTDATA=<?xml version="1.0" encoding="utf-8"?><guid>$user_id</guid>
148POSTDATA
149 my $res = &OpenSim::Utility::HttpPostRequest($OpenSim::Config::INVENTORY_SERVER_URL . "/RootFolders/", $postdata);
150 my $res_obj = &OpenSim::Utility::XML2Obj($res);
151 if (!$res_obj->{InventoryFolderBase}) {
152 &OpenSim::Utility::HttpPostRequest($OpenSim::Config::INVENTORY_SERVER_URL . "/CreateInventory/", $postdata);
153 # Sleep(10000); # TODO: need not to do this
154 $res = &OpenSim::Utility::HttpPostRequest($OpenSim::Config::INVENTORY_SERVER_URL . "/RootFolders/", $postdata);
155 $res_obj = &OpenSim::Utility::XML2Obj($res);
156 }
157 my $folders = $res_obj->{InventoryFolderBase};
158 my $folders_count = @$folders;
159 if ($folders_count > 0) {
160 my @AgentInventoryFolders = ();
161 my $root_uuid = &OpenSim::Utility::ZeroUUID();
162 foreach my $folder (@$folders) {
163 if ($folder->{parentID}->{UUID} eq &OpenSim::Utility::ZeroUUID()) {
164 $root_uuid = $folder->{folderID}->{UUID};
165 }
166 my %folder_hash = (
167 name => $folder->{name},
168 parent_id => $folder->{parentID}->{UUID},
169 version => $folder->{version},
170 type_default => $folder->{type},
171 folder_id => $folder->{folderID}->{UUID},
172 );
173 push @AgentInventoryFolders, \%folder_hash;
174 }
175 return { InventoryArray => \@AgentInventoryFolders, RootFolderID => $root_uuid };
176 } else {
177 # TODO: impossible ???
178 }
179 return undef;
180}
181
182sub _convert_to_response {
183 my $user = shift;
184 my %response = (
185 firstname => $user->{username},
186 lastname => $user->{lastname},
187 uuid => $user->{UUID},
188 server_inventory => $user->{userInventoryURI},
189 server_asset => $user->{userAssetURI},
190 profile_about => $user->{profileAboutText},
191 profile_firstlife_about => $user->{profileFirstText},
192 profile_firstlife_image => $user->{profileFirstImage},
193 profile_can_do => $user->{profileCanDoMask} || "0",
194 profile_want_do => $user->{profileWantDoMask} || "0",
195 profile_image => $user->{profileImage},
196 profile_created => $user->{created},
197 profile_lastlogin => $user->{lastLogin} || "0",
198 home_coordinates_x => $user->{homeLocationX},
199 home_coordinates_y => $user->{homeLocationY},
200 home_coordinates_z => $user->{homeLocationZ},
201 home_region => $user->{homeRegion} || 0,
202 home_look_x => $user->{homeLookAtX},
203 home_look_y => $user->{homeLookAtY},
204 home_look_z => $user->{homeLookAtZ},
205 );
206 return \%response;
207}
208
209# #################
210# Utility Functions
211sub _make_false_response {
212 my ($reason, $message) = @_;
213 return { reason => $reason, login => "false", message => $message };
214}
215
216sub _unknown_user_response {
217 return {
218 error_type => "unknown_user",
219 error_desc => "The user requested is not in the database",
220 };
221}
222
223sub _make_home_string {
224 my ($region_handle, $position, $look_at) = @_;
225 my $region_handle_string = "'region_handle':" . &_make_r_string(@$region_handle);
226 my $position_string = "'position':" . &_make_r_string(@$position);
227 my $look_at_string = "'look_at':" . &_make_r_string(@$look_at);
228 return "{" . $region_handle_string . ", " . $position_string . ", " . $look_at_string . "}";
229}
230
231sub _make_r_string {
232 my @params = @_;
233 foreach (@params) {
234 $_ = "r" . $_;
235 }
236 return "[" . join(",", @params) . "]";
237}
238
2391;
diff --git a/share/perl/lib/OpenSim/UserServer/Config.pm b/share/perl/lib/OpenSim/UserServer/Config.pm
new file mode 100644
index 0000000..da628ed
--- /dev/null
+++ b/share/perl/lib/OpenSim/UserServer/Config.pm
@@ -0,0 +1,125 @@
1package OpenSim::UserServer::Config;
2
3use strict;
4
5our %SYS_SQL = (
6 select_user_by_name =>
7 "select * from users where username=? and lastname=?",
8 select_user_by_uuid =>
9 "select * from users where uuid=?",
10 create_user =>
11 "insert into users values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
12);
13
14our @USERS_COLUMNS = (
15 "UUID",
16 "username",
17 "lastname",
18 "passwordHash",
19 "passwordSalt",
20 "homeRegion",
21 "homeLocationX",
22 "homeLocationY",
23 "homeLocationZ",
24 "homeLookAtX",
25 "homeLookAtY",
26 "homeLookAtZ",
27 "created",
28 "lastLogin",
29 "userInventoryURI",
30 "userAssetURI",
31 "profileCanDoMask",
32 "profileWantDoMask",
33 "profileAboutText",
34 "profileFirstText",
35 "profileImage",
36 "profileFirstImage",
37);
38
39# copied from opensim
40our @classified_categories = (
41 { category_id => 1, category_name => "Shopping" },
42 { category_id => 2, category_name => "Land Rental" },
43 { category_id => 3, category_name => "Property Rental" },
44 { category_id => 4, category_name => "Special Attraction" },
45 { category_id => 5, category_name => "New Products" },
46 { category_id => 6, category_name => "Employment" },
47 { category_id => 7, category_name => "Wanted" },
48 { category_id => 8, category_name => "Service" },
49 { category_id => 9, category_name => "Personal" },
50);
51
52our @event_categories = ();
53our @event_notifications = ();
54our @gestures =();
55our @global_textures = (
56 {
57 cloud_texture_id => "dc4b9f0b-d008-45c6-96a4-01dd947ac621",
58 moon_texture_id => "ec4b9f0b-d008-45c6-96a4-01dd947ac621",
59 sun_texture_id => "cce0f112-878f-4586-a2e2-a8f104bba271",
60 },
61);
62our @initial_outfit = (
63 { folder_name => "Nightclub Female", gender => "female" }
64);
65our @inventory_lib_owner = ({ agent_id => "11111111-1111-0000-0000-000100bba000" });
66our @inventory_lib_root = ({ folder_id => "00000112-000f-0000-0000-000100bba000" });
67our @inventory_root = ({ folder_id => "2eb27bc2-22ee-48db-b2e9-5c79a6582919" });
68our @inventory_skel_lib = (
69 {
70 folder_id => "00000112-000f-0000-0000-000100bba000",
71 name => "OpenSim Library",
72 parent_id => "00000000-0000-0000-0000-000000000000",
73 type_default => -1,
74 version => 1,
75 },
76 {
77 folder_id => "00000112-000f-0000-0000-000100bba001",
78 name => "Texture Library",
79 parent_id => "00000112-000f-0000-0000-000100bba000",
80 type_default => -1,
81 version => 1,
82 },
83);
84our @inventory_skeleton = (
85 {
86 folder_id => "2eb27bc2-22ee-48db-b2e9-5c79a6582919",
87 name => "My Inventory",
88 parent_id => "00000000-0000-0000-0000-000000000000",
89 type_default => 8,
90 version => 1,
91 },
92 {
93 folder_id => "6cc20d86-9945-4997-a102-959348d56821",
94 name => "Textures",
95 parent_id => "2eb27bc2-22ee-48db-b2e9-5c79a6582919",
96 type_default => 0,
97 version => 1,
98 },
99 {
100 folder_id => "840b747f-bb7d-465e-ab5a-58badc953484",
101 name => "Clothes",
102 parent_id => "2eb27bc2-22ee-48db-b2e9-5c79a6582919",
103 type_default => 5,
104 version => 1,
105 },
106 {
107 folder_id => "37039005-7bbe-42a2-aa12-6bda453f37fd",
108 name => "Objects",
109 parent_id => "2eb27bc2-22ee-48db-b2e9-5c79a6582919",
110 type_default => 6,
111 version => 1,
112 },
113);
114our @login_flags = (
115 {
116 daylight_savings => "N",
117 ever_logged_in => "Y",
118 gendered => "Y",
119 stipend_since_login => "N",
120 },
121);
122our @ui_config = ({ allow_first_life => "Y" });
123
1241;
125
diff --git a/share/perl/lib/OpenSim/UserServer/UserManager.pm b/share/perl/lib/OpenSim/UserServer/UserManager.pm
new file mode 100644
index 0000000..ce35329
--- /dev/null
+++ b/share/perl/lib/OpenSim/UserServer/UserManager.pm
@@ -0,0 +1,49 @@
1package OpenSim::UserServer::UserManager;
2
3use strict;
4use Carp;
5use OpenSim::Utility;
6use OpenSim::UserServer::Config;
7
8sub getUserByName {
9 my ($first, $last) = @_;
10 my $res = &OpenSim::Utility::getSimpleResult($OpenSim::UserServer::Config::SYS_SQL{select_user_by_name}, $first, $last);
11 my $count = @$res;
12 my %user = ();
13 if ($count == 1) {
14 my $user_row = $res->[0];
15 foreach (@OpenSim::UserServer::Config::USERS_COLUMNS) {
16 $user{$_} = $user_row->{$_} || "";
17 }
18 } else {
19 Carp::croak("user not found");
20 }
21 return \%user;
22}
23
24sub getUserByUUID {
25 my ($uuid) = @_;
26 my $res = &OpenSim::Utility::getSimpleResult($OpenSim::UserServer::Config::SYS_SQL{select_user_by_uuid}, $uuid);
27 my $count = @$res;
28 my %user = ();
29 if ($count == 1) {
30 my $user_row = $res->[0];
31 foreach (@OpenSim::UserServer::Config::USERS_COLUMNS) {
32 $user{$_} = $user_row->{$_} || "";
33 }
34 } else {
35 Carp::croak("user not found");
36 }
37 return \%user;
38}
39
40sub createUser {
41 my $user = shift;
42 my @params = ();
43 foreach (@OpenSim::UserServer::Config::USERS_COLUMNS) {
44 push @params, $user->{$_};
45 }
46 my $res = &OpenSim::Utility::getSimpleResult($OpenSim::UserServer::Config::SYS_SQL{create_user}, @params);
47}
48
491;