PageRenderTime 61ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/flotsam/Servers/XmlRpcGroupsServer/xmlrpc.php

https://bitbucket.org/VirtualReality/flotsam
PHP | 1754 lines | 1396 code | 245 blank | 113 comment | 223 complexity | 78a280a37b0792fa190ba9b3ff00e762 MD5 | raw file
  1. <?php
  2. // ini_set("display_errors",0);
  3. /*
  4. Actual failures that result in mysql or php errors should be returned as:
  5. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  6. Methods that run without errors, but do not have the intended result should return as:
  7. return array('succeed' => 'false', 'message' => 'No Groups Found', 'params' => var_export($params, TRUE));
  8. or if applicable:
  9. return array('succeed' => 'false', 'message' => 'What went wrong', 'params' => var_export($params, TRUE), 'sql' => $sql);
  10. */
  11. include("phpxmlrpclib/xmlrpc.inc");
  12. include("phpxmlrpclib/xmlrpcs.inc");
  13. include("config.php");
  14. $groupPowers = array(
  15. 'None' => '0',
  16. /// <summary>Can send invitations to groups default role</summary>
  17. 'Invite' => '2',
  18. /// <summary>Can eject members from group</summary>
  19. 'Eject' => '4',
  20. /// <summary>Can toggle 'Open Enrollment' and change 'Signup fee'</summary>
  21. 'ChangeOptions' => '8',
  22. /// <summary>Can create new roles</summary>
  23. 'CreateRole' => '16',
  24. /// <summary>Can delete existing roles</summary>
  25. 'DeleteRole' => '32',
  26. /// <summary>Can change Role names, titles and descriptions</summary>
  27. 'RoleProperties' => '64',
  28. /// <summary>Can assign other members to assigners role</summary>
  29. 'AssignMemberLimited' => '128',
  30. /// <summary>Can assign other members to any role</summary>
  31. 'AssignMember' => '256',
  32. /// <summary>Can remove members from roles</summary>
  33. 'RemoveMember' => '512',
  34. /// <summary>Can assign and remove abilities in roles</summary>
  35. 'ChangeActions' => '1024',
  36. /// <summary>Can change group Charter, Insignia, 'Publish on the web' and which
  37. /// members are publicly visible in group member listings</summary>
  38. 'ChangeIdentity' => '2048',
  39. /// <summary>Can buy land or deed land to group</summary>
  40. 'LandDeed' => '4096',
  41. /// <summary>Can abandon group owned land to Governor Linden on mainland, or Estate owner for
  42. /// private estates</summary>
  43. 'LandRelease' => '8192',
  44. /// <summary>Can set land for-sale information on group owned parcels</summary>
  45. 'LandSetSale' => '16384',
  46. /// <summary>Can subdivide and join parcels</summary>
  47. 'LandDivideJoin' => '32768',
  48. /// <summary>Can join group chat sessions</summary>
  49. 'JoinChat' => '65536',
  50. /// <summary>Can toggle "Show in Find Places" and set search category</summary>
  51. 'FindPlaces' => '131072',
  52. /// <summary>Can change parcel name, description, and 'Publish on web' settings</summary>
  53. 'LandChangeIdentity' => '262144',
  54. /// <summary>Can set the landing point and teleport routing on group land</summary>
  55. 'SetLandingPoint' => '524288',
  56. /// <summary>Can change music and media settings</summary>
  57. 'ChangeMedia' => '1048576',
  58. /// <summary>Can toggle 'Edit Terrain' option in Land settings</summary>
  59. 'LandEdit' => '2097152',
  60. /// <summary>Can toggle various About Land > Options settings</summary>
  61. 'LandOptions' => '4194304',
  62. /// <summary>Can always terraform land, even if parcel settings have it turned off</summary>
  63. 'AllowEditLand' => '8388608',
  64. /// <summary>Can always fly while over group owned land</summary>
  65. 'AllowFly' => '16777216',
  66. /// <summary>Can always rez objects on group owned land</summary>
  67. 'AllowRez' => '33554432',
  68. /// <summary>Can always create landmarks for group owned parcels</summary>
  69. 'AllowLandmark' => '67108864',
  70. /// <summary>Can use voice chat in Group Chat sessions</summary>
  71. 'AllowVoiceChat' => '134217728',
  72. /// <summary>Can set home location on any group owned parcel</summary>
  73. 'AllowSetHome' => '268435456',
  74. /// <summary>Can modify public access settings for group owned parcels</summary>
  75. 'LandManageAllowed' => '536870912',
  76. /// <summary>Can manager parcel ban lists on group owned land</summary>
  77. 'LandManageBanned' => '1073741824',
  78. /// <summary>Can manage pass list sales information</summary>
  79. 'LandManagePasses' => '2147483648',
  80. /// <summary>Can eject and freeze other avatars on group owned land</summary>
  81. 'LandEjectAndFreeze' => '4294967296',
  82. /// <summary>Can return objects set to group</summary>
  83. 'ReturnGroupSet' => '8589934592',
  84. /// <summary>Can return non-group owned/set objects</summary>
  85. 'ReturnNonGroup' => '17179869184',
  86. /// <summary>Can landscape using Linden plants</summary>
  87. 'LandGardening' => '34359738368',
  88. /// <summary>Can deed objects to group</summary>
  89. 'DeedObject' => '68719476736',
  90. /// <summary>Can moderate group chat sessions</summary>
  91. 'ModerateChat' => '137438953472',
  92. /// <summary>Can move group owned objects</summary>
  93. 'ObjectManipulate' => '274877906944',
  94. /// <summary>Can set group owned objects for-sale</summary>
  95. 'ObjectSetForSale' => '549755813888',
  96. /// <summary>Pay group liabilities and receive group dividends</summary>
  97. 'Accountable' => '1099511627776',
  98. /// <summary>Can send group notices</summary>
  99. 'SendNotices' => '4398046511104',
  100. /// <summary>Can receive group notices</summary>
  101. 'ReceiveNotices' => '8796093022208',
  102. /// <summary>Can create group proposals</summary>
  103. 'StartProposal' => '17592186044416',
  104. /// <summary>Can vote on group proposals</summary>
  105. 'VoteOnProposal' => '35184372088832',
  106. /// <summary>Can return group owned objects</summary>
  107. 'ReturnGroupOwned' => '281474976710656',
  108. /// <summary>Members are visible to non-owners</summary>
  109. 'RoleMembersVisible' => '140737488355328'
  110. );
  111. $uuidZero = "00000000-0000-0000-0000-000000000000";
  112. $groupDBCon = mysql_connect($dbHost,$dbUser,$dbPassword);
  113. if (!$groupDBCon)
  114. {
  115. die('Could not connect: ' . mysql_error());
  116. }
  117. mysql_select_db($dbName, $groupDBCon);
  118. // This is filled in by secure()
  119. $requestingAgent = $uuidZero;
  120. function test()
  121. {
  122. return array('name' => 'Joe','age' => 27);
  123. }
  124. // Use a common signature for all the group functions -> struct foo($struct)
  125. $common_sig = array(array($xmlrpcStruct, $xmlrpcStruct));
  126. function createGroup($params)
  127. {
  128. if( is_array($error = secureRequest($params, TRUE)) )
  129. {
  130. return $error;
  131. }
  132. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  133. $groupID = $params["GroupID"];
  134. $name = $params["Name"];
  135. $charter = $params["Charter"];
  136. $insigniaID = $params["InsigniaID"];
  137. $founderID = $params["FounderID"];
  138. $membershipFee = $params["MembershipFee"];
  139. $openEnrollment = $params["OpenEnrollment"];
  140. $showInList = $params["ShowInList"];
  141. $allowPublish = $params["AllowPublish"];
  142. $maturePublish = $params["MaturePublish"];
  143. $ownerRoleID = $params["OwnerRoleID"];
  144. $everyonePowers = $params["EveryonePowers"];
  145. $ownersPowers = $params["OwnersPowers"];
  146. $escapedParams = array_map("mysql_real_escape_string", $params);
  147. $escapedGroupID = $escapedParams["GroupID"];
  148. $escapedName = $escapedParams["Name"];
  149. $escapedCharter = $escapedParams["Charter"];
  150. $escapedInsigniaID = $escapedParams["InsigniaID"];
  151. $escapedFounderID = $escapedParams["FounderID"];
  152. $escapedMembershipFee = $escapedParams["MembershipFee"];
  153. $escapedOpenEnrollment = $escapedParams["OpenEnrollment"];
  154. $escapedShowInList = $escapedParams["ShowInList"];
  155. $escapedAllowPublish = $escapedParams["AllowPublish"];
  156. $escapedMaturePublish = $escapedParams["MaturePublish"];
  157. $escapedOwnerRoleID = $escapedParams["OwnerRoleID"];
  158. // Create group
  159. $sql = "INSERT INTO osgroup
  160. (GroupID, Name, Charter, InsigniaID, FounderID, MembershipFee, OpenEnrollment, ShowInList, AllowPublish, MaturePublish, OwnerRoleID)
  161. VALUES
  162. ('$escapedGroupID', '$escapedName', '$escapedCharter', '$escapedInsigniaID', '$escapedFounderID', $escapedMembershipFee, $escapedOpenEnrollment, $escapedShowInList, $escapedAllowPublish, $escapedMaturePublish, '$escapedOwnerRoleID')";
  163. if (!mysql_query($sql, $groupDBCon))
  164. {
  165. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  166. }
  167. // Create Everyone Role
  168. // NOTE: FIXME: This is a temp fix until the libomv enum for group powers is fixed in OpenSim
  169. $result = _addRoleToGroup(array('GroupID' => $groupID, 'RoleID' => $uuidZero, 'Name' => 'Everyone', 'Description' => 'Everyone in the group is in the everyone role.', 'Title' => "Member of $name", 'Powers' => $everyonePowers));
  170. if( isset($result['error']) )
  171. {
  172. return $result;
  173. }
  174. // Create Owner Role
  175. $result = _addRoleToGroup(array('GroupID' => $groupID, 'RoleID' => $ownerRoleID, 'Name' => 'Owners', 'Description' => "Owners of $name", 'Title' => "Owner of $name", 'Powers' => $ownersPowers));
  176. if( isset($result['error']) )
  177. {
  178. return $result;
  179. }
  180. // Add founder to group, will automatically place them in the Everyone Role, also places them in specified Owner Role
  181. $result = _addAgentToGroup(array('AgentID' => $founderID, 'GroupID' => $groupID, 'RoleID' => $ownerRoleID));
  182. if( isset($result['error']) )
  183. {
  184. return $result;
  185. }
  186. // Select the owner's role for the founder
  187. $result = _setAgentGroupSelectedRole(array('AgentID' => $founderID, 'RoleID' => $ownerRoleID, 'GroupID' => $groupID));
  188. if( isset($result['error']) )
  189. {
  190. return $result;
  191. }
  192. // Set the new group as the founder's active group
  193. $result = _setAgentActiveGroup(array('AgentID' => $founderID, 'GroupID' => $groupID));
  194. if( isset($result['error']) )
  195. {
  196. return $result;
  197. }
  198. return getGroup(array("GroupID"=>$groupID));
  199. }
  200. // Private method, does not include security, to only be called from places that have already verified security
  201. function _addRoleToGroup($params)
  202. {
  203. $everyonePowers = 8796495740928; // This should now be fixed, when libomv was updated...
  204. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  205. $groupID = mysql_real_escape_string( $params['GroupID'] );
  206. $roleID = mysql_real_escape_string( $params['RoleID'] );
  207. $name = mysql_real_escape_string( $params['Name'] );
  208. $desc = mysql_real_escape_string( $params['Description'] );
  209. $title = mysql_real_escape_string( $params['Title'] );
  210. $powers = mysql_real_escape_string( $params['Powers'] );
  211. if( !isset($powers) || ($powers == 0) || ($powers == '') )
  212. {
  213. $powers = $everyonePowers;
  214. }
  215. $sql = " INSERT INTO osrole (GroupID, RoleID, Name, Description, Title, Powers) VALUES "
  216. ." ('$groupID', '$roleID', '$name', '$desc', '$title', $powers)";
  217. if (!mysql_query($sql, $groupDBCon))
  218. {
  219. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error()
  220. , 'method' => 'addRoleToGroup'
  221. , 'params' => var_export($params, TRUE));
  222. }
  223. return array("success" => "true");
  224. }
  225. function addRoleToGroup($params)
  226. {
  227. if( is_array($error = secureRequest($params, TRUE)) )
  228. {
  229. return $error;
  230. }
  231. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  232. $groupID = $params['GroupID'];
  233. // Verify the requesting agent has permission
  234. if( is_array($error = checkGroupPermission($groupID, $groupPowers['CreateRole'])) )
  235. {
  236. return $error;
  237. }
  238. return _addRoleToGroup($params);
  239. }
  240. function updateGroupRole($params)
  241. {
  242. if( is_array($error = secureRequest($params, TRUE)) )
  243. {
  244. return $error;
  245. }
  246. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  247. $groupID = mysql_real_escape_string( $params['GroupID'] );
  248. $roleID = mysql_real_escape_string( $params['RoleID'] );
  249. $name = mysql_real_escape_string( $params['Name'] );
  250. $desc = mysql_real_escape_string( $params['Description'] );
  251. $title = mysql_real_escape_string( $params['Title'] );
  252. $powers = mysql_real_escape_string( $params['Powers'] );
  253. // Verify the requesting agent has permission
  254. if( is_array($error = checkGroupPermission($groupID, $groupPowers['RoleProperties'])) )
  255. {
  256. return $error;
  257. }
  258. $sql = " UPDATE osrole SET RoleID = '$roleID' ";
  259. if( isset($params['Name']) )
  260. {
  261. $sql .= ", Name = '$name'";
  262. }
  263. if( isset($params['Description']) )
  264. {
  265. $sql .= ", Description = '$desc'";
  266. }
  267. if( isset($params['Title']) )
  268. {
  269. $sql .= ", Title = '$title'";
  270. }
  271. if( isset($params['Powers']) )
  272. {
  273. $sql .= ", Powers = $powers";
  274. }
  275. $sql .= " WHERE GroupID = '$groupID' AND RoleID = '$roleID'";
  276. if (!mysql_query($sql, $groupDBCon))
  277. {
  278. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  279. }
  280. return array("success" => "true");
  281. }
  282. function removeRoleFromGroup($params)
  283. {
  284. if( is_array($error = secureRequest($params, TRUE)) )
  285. {
  286. return $error;
  287. }
  288. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  289. $groupID = mysql_real_escape_string( $params['GroupID'] );
  290. $roleID = mysql_real_escape_string( $params['RoleID'] );
  291. if( is_array($error = checkGroupPermission($groupID, $groupPowers['RoleProperties'])) )
  292. {
  293. return $error;
  294. }
  295. /// 1. Remove all members from Role
  296. /// 2. Set selected Role to uuidZero for anyone that had the role selected
  297. /// 3. Delete roll
  298. $sql = "DELETE FROM osgrouprolemembership WHERE GroupID = '$groupID' AND RoleID = '$roleID'";
  299. if (!mysql_query($sql, $groupDBCon))
  300. {
  301. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  302. }
  303. $sql = "UPDATE osgroupmembership SET SelectedRoleID = '$uuidZero' WHERE GroupID = '$groupID' AND SelectedRoleID = '$roleID'";
  304. if (!mysql_query($sql, $groupDBCon))
  305. {
  306. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  307. }
  308. $sql = "DELETE FROM osrole WHERE GroupID = '$groupID' AND RoleID = '$roleID'";
  309. if (!mysql_query($sql, $groupDBCon))
  310. {
  311. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  312. }
  313. return array("success" => "true");
  314. }
  315. function getGroup($params)
  316. {
  317. if( is_array($error = secureRequest($params, FALSE)) )
  318. {
  319. return $error;
  320. }
  321. return _getGroup($params);
  322. }
  323. function _getGroup($params)
  324. {
  325. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  326. $sql = " SELECT osgroup.GroupID, osgroup.Name, Charter, InsigniaID, FounderID, MembershipFee, OpenEnrollment, ShowInList, AllowPublish, MaturePublish, OwnerRoleID"
  327. ." , count(osrole.RoleID) as GroupRolesCount, count(osgroupmembership.AgentID) as GroupMembershipCount "
  328. ." FROM osgroup "
  329. ." LEFT JOIN osrole ON (osgroup.GroupID = osrole.GroupID)"
  330. ." LEFT JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)"
  331. ." WHERE ";
  332. if( isset($params['GroupID']) )
  333. {
  334. $sql .= "osgroup.GroupID = '" . mysql_real_escape_string($params['GroupID']). "'";
  335. }
  336. else if( isset($params['Name']) )
  337. {
  338. $sql .= "osgroup.Name = '" . mysql_real_escape_string($params['Name']) . "'";
  339. }
  340. else
  341. {
  342. return array("error" => "Must specify GroupID or Name");
  343. }
  344. $sql .= " GROUP BY osgroup.GroupID, osgroup.name, charter, insigniaID, founderID, membershipFee, openEnrollment, showInList, allowPublish, maturePublish, ownerRoleID";
  345. $result = mysql_query($sql, $groupDBCon);
  346. if (!$result)
  347. {
  348. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  349. }
  350. if (mysql_num_rows($result) == 0)
  351. {
  352. return array('succeed' => 'false', 'error' => 'Group Not Found', 'params' => var_export($params, TRUE), 'sql' => $sql);
  353. }
  354. return mysql_fetch_assoc($result);
  355. }
  356. function updateGroup($params)
  357. {
  358. if( is_array($error = secureRequest($params, TRUE)) )
  359. {
  360. return $error;
  361. }
  362. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  363. $groupID = mysql_real_escape_string( $params["GroupID"] );
  364. $charter = mysql_real_escape_string( $params["Charter"] );
  365. $insigniaID = mysql_real_escape_string( $params["InsigniaID"] );
  366. $membershipFee = mysql_real_escape_string( $params["MembershipFee"] );
  367. $openEnrollment = mysql_real_escape_string( $params["OpenEnrollment"] );
  368. $showInList = mysql_real_escape_string( $params["ShowInList"] );
  369. $allowPublish = mysql_real_escape_string( $params["AllowPublish"] );
  370. $maturePublish = mysql_real_escape_string( $params["MaturePublish"] );
  371. if( is_array($error = checkGroupPermission($groupID, $groupPowers['ChangeOptions'])) )
  372. {
  373. return $error;
  374. }
  375. // Create group
  376. $sql = "UPDATE osgroup
  377. SET
  378. Charter = '$charter'
  379. , InsigniaID = '$insigniaID'
  380. , MembershipFee = $membershipFee
  381. , OpenEnrollment= $openEnrollment
  382. , ShowInList = $showInList
  383. , AllowPublish = $allowPublish
  384. , MaturePublish = $maturePublish
  385. WHERE
  386. GroupID = '$groupID'";
  387. if (!mysql_query($sql, $groupDBCon))
  388. {
  389. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  390. }
  391. return array('success' => 'true');
  392. }
  393. function findGroups($params)
  394. {
  395. if( is_array($error = secureRequest($params, FALSE)) )
  396. {
  397. return $error;
  398. }
  399. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  400. $search = mysql_real_escape_string( $params['Search'] );
  401. $sql = " SELECT osgroup.GroupID, osgroup.Name, count(osgroupmembership.AgentID) as Members "
  402. ." FROM osgroup LEFT JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID) "
  403. ." WHERE "
  404. ." ( MATCH (osgroup.name) AGAINST ('$search' IN BOOLEAN MODE)"
  405. ." OR osgroup.name LIKE '%$search%'"
  406. ." OR osgroup.name REGEXP '$search'"
  407. ." ) AND ShowInList = 1"
  408. ." GROUP BY osgroup.GroupID, osgroup.Name";
  409. $result = mysql_query($sql, $groupDBCon);
  410. if (!$result)
  411. {
  412. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  413. }
  414. if( mysql_num_rows($result) == 0 )
  415. {
  416. return array('succeed' => 'false', 'error' => 'No groups found.', 'params' => var_export($params, TRUE), 'sql' => $sql);
  417. }
  418. $results = array();
  419. while ($row = mysql_fetch_assoc($result))
  420. {
  421. $groupID = $row['GroupID'];
  422. $results[$groupID] = $row;
  423. }
  424. return array('results' => $results, 'success' => TRUE);
  425. }
  426. function _setAgentActiveGroup($params)
  427. {
  428. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  429. $agentID = mysql_real_escape_string( $params['AgentID'] );
  430. $groupID = mysql_real_escape_string( $params['GroupID'] );
  431. $sql = " UPDATE osagent "
  432. ." SET ActiveGroupID = '$groupID'"
  433. ." WHERE AgentID = '$agentID'";
  434. if (!mysql_query($sql, $groupDBCon))
  435. {
  436. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  437. }
  438. if( mysql_affected_rows() == 0 )
  439. {
  440. $sql = " INSERT INTO osagent (ActiveGroupID, AgentID) VALUES "
  441. ." ('$groupID', '$agentID')";
  442. if (!mysql_query($sql, $groupDBCon))
  443. {
  444. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  445. }
  446. }
  447. return array("success" => "true");
  448. }
  449. function setAgentActiveGroup($params)
  450. {
  451. if( is_array($error = secureRequest($params, TRUE)) )
  452. {
  453. return $error;
  454. }
  455. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  456. $agentID = $params['AgentID'];
  457. $groupID = $params['GroupID'];
  458. if( isset($requestingAgent) && ($requestingAgent != $uuidZero) && ($requestingAgent != $agentID) )
  459. {
  460. return array('error' => "Agent can only change their own Selected Group Role", 'params' => var_export($params, TRUE));
  461. }
  462. return _setAgentActiveGroup($params);
  463. }
  464. function addAgentToGroup($params)
  465. {
  466. if( is_array($error = secureRequest($params, TRUE)) )
  467. {
  468. return $error;
  469. }
  470. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  471. $groupID = $params["GroupID"];
  472. $agentID = $params["AgentID"];
  473. if( is_array($error = checkGroupPermission($groupID, $groupPowers['AssignMember'])) )
  474. {
  475. // If they don't have direct permission, check to see if the group is marked for open enrollment
  476. $groupInfo = _getGroup( array ('GroupID' => $groupID) );
  477. if( isset($groupInfo['error']))
  478. {
  479. return $groupInfo;
  480. }
  481. if($groupInfo['OpenEnrollment'] != 1)
  482. {
  483. $escapedAgentID = mysql_real_escape_string($agentID);
  484. $escapedGroupID = mysql_real_escape_string($groupID);
  485. // Group is not open enrollment, check if the specified agentid has an invite
  486. $sql = " SELECT GroupID, RoleID, AgentID FROM osgroupinvite"
  487. ." WHERE osgroupinvite.AgentID = '$escapedAgentID' AND osgroupinvite.GroupID = '$escapedGroupID'";
  488. $results = mysql_query($sql, $groupDBCon);
  489. if (!$results)
  490. {
  491. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  492. }
  493. if( mysql_num_rows($results) == 1 )
  494. {
  495. // if there is an invite, make sure we're adding the user to the role specified in the invite
  496. $inviteInfo = mysql_fetch_assoc($results);
  497. $params['RoleID'] = $inviteInfo['RoleID'];
  498. }
  499. else
  500. {
  501. // Not openenrollment, not invited, return permission denied error
  502. return $error;
  503. }
  504. }
  505. }
  506. return _addAgentToGroup($params);
  507. }
  508. // Private method, does not include security, to only be called from places that have already verified security
  509. function _addAgentToGroup($params)
  510. {
  511. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  512. $agentID = $params["AgentID"];
  513. $groupID = $params["GroupID"];
  514. $roleID = $uuidZero;
  515. if( isset($params["RoleID"]) )
  516. {
  517. $roleID = $params["RoleID"];
  518. }
  519. $escapedAgentID = mysql_real_escape_string($agentID);
  520. $escapedGroupID = mysql_real_escape_string($groupID);
  521. $escapedRoleID = mysql_real_escape_string($roleID);
  522. // Check if agent already a member
  523. $sql = " SELECT count(AgentID) as isMember FROM osgroupmembership WHERE AgentID = '$escapedAgentID' AND GroupID = '$escapedGroupID'";
  524. $result = mysql_query($sql, $groupDBCon);
  525. if (!$result)
  526. {
  527. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  528. }
  529. // If not a member, add membership, select role (defaults to uuidZero, or everyone role)
  530. if( mysql_result($result, 0) == 0 )
  531. {
  532. $sql = " INSERT INTO osgroupmembership (GroupID, AgentID, Contribution, ListInProfile, AcceptNotices, SelectedRoleID) VALUES "
  533. ."('$escapedGroupID','$escapedAgentID', 0, 1, 1,'$escapedRoleID')";
  534. if (!mysql_query($sql, $groupDBCon))
  535. {
  536. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  537. }
  538. }
  539. // Make sure they're in the Everyone role
  540. $result = _addAgentToGroupRole(array("GroupID" => $groupID, "RoleID" => $uuidZero, "AgentID" => $agentID));
  541. if( isset($result['error']) )
  542. {
  543. return $result;
  544. }
  545. // Make sure they're in specified role, if they were invited
  546. if( $roleID != $uuidZero )
  547. {
  548. $result = _addAgentToGroupRole(array("GroupID" => $groupID, "RoleID" => $roleID, "AgentID" => $agentID));
  549. if( isset($result['error']) )
  550. {
  551. return $result;
  552. }
  553. }
  554. //Set the role they were invited to as their selected role
  555. _setAgentGroupSelectedRole(array('AgentID' => $agentID, 'RoleID' => $roleID, 'GroupID' => $groupID));
  556. // Set the group as their active group.
  557. // _setAgentActiveGroup(array("GroupID" => $groupID, "AgentID" => $agentID));
  558. return array("success" => "true");
  559. }
  560. function removeAgentFromGroup($params)
  561. {
  562. if( is_array($error = secureRequest($params, TRUE)) )
  563. {
  564. return $error;
  565. }
  566. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  567. $agentID = $params["AgentID"];
  568. $groupID = $params["GroupID"];
  569. // An agent is always allowed to remove themselves from a group -- so only check if the requesting agent is different then the agent being removed.
  570. if( $agentID != $requestingAgent )
  571. {
  572. if( is_array($error = checkGroupPermission($groupID, $groupPowers['RemoveMember'])) )
  573. {
  574. return $error;
  575. }
  576. }
  577. $escapedAgentID = mysql_real_escape_string($agentID);
  578. $escapedGroupID = mysql_real_escape_string($groupID);
  579. // 1. If group is agent's active group, change active group to uuidZero
  580. // 2. Remove Agent from group (osgroupmembership)
  581. // 3. Remove Agent from all of the groups roles (osgrouprolemembership)
  582. $sql = " UPDATE osagent "
  583. ." SET ActiveGroupID = '$uuidZero'"
  584. ." WHERE AgentID = '$escapedAgentID' AND ActiveGroupID = '$escapedGroupID'";
  585. if (!mysql_query($sql, $groupDBCon))
  586. {
  587. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  588. }
  589. $sql = " DELETE FROM osgroupmembership "
  590. ." WHERE AgentID = '$agentID' AND GroupID = '$groupID'";
  591. if (!mysql_query($sql, $groupDBCon))
  592. {
  593. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  594. }
  595. $sql = " DELETE FROM osgrouprolemembership "
  596. ." WHERE AgentID = '$escapedAgentID' AND GroupID = '$escapedGroupID'";
  597. if (!mysql_query($sql, $groupDBCon))
  598. {
  599. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  600. }
  601. return array("success" => "true");
  602. }
  603. function _addAgentToGroupRole($params)
  604. {
  605. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  606. $agentID = mysql_real_escape_string($params["AgentID"]);
  607. $groupID = mysql_real_escape_string($params["GroupID"]);
  608. $roleID = mysql_real_escape_string($params["RoleID"]);
  609. // Check if agent already a member
  610. $sql = " SELECT count(AgentID) as isMember FROM osgrouprolemembership WHERE AgentID = '$agentID' AND RoleID = '$roleID' AND GroupID = '$groupID'";
  611. $result = mysql_query($sql, $groupDBCon);
  612. if (!$result)
  613. {
  614. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  615. }
  616. if( mysql_result($result, 0) == 0 )
  617. {
  618. $sql = " INSERT INTO osgrouprolemembership (GroupID, RoleID, AgentID) VALUES "
  619. ."('$groupID', '$roleID', '$agentID')";
  620. if (!mysql_query($sql, $groupDBCon))
  621. {
  622. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  623. }
  624. }
  625. return array("success" => "true");
  626. }
  627. function addAgentToGroupRole($params)
  628. {
  629. if( is_array($error = secureRequest($params, TRUE)) )
  630. {
  631. return $error;
  632. }
  633. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  634. $agentID = $params["AgentID"];
  635. $groupID = $params["GroupID"];
  636. $roleID = $params["RoleID"];
  637. $escapedAgentID = mysql_real_escape_string($agentID);
  638. $escapedGroupID = mysql_real_escape_string($groupID);
  639. $escapedRoleID = mysql_real_escape_string($roleID);
  640. // Check if being assigned to Owners role, assignments to an owners role can only be requested by owners.
  641. $sql = " SELECT OwnerRoleID, osgrouprolemembership.AgentID "
  642. ." FROM osgroup LEFT JOIN osgrouprolemembership ON (osgroup.GroupID = osgrouprolemembership.GroupID AND osgroup.OwnerRoleID = osgrouprolemembership.RoleID) "
  643. ." WHERE osgrouprolemembership.AgentID = '" . mysql_real_escape_string($requestingAgent) . "' AND osgroup.GroupID = '$escapedGroupID'";
  644. $results = mysql_query($sql, $groupDBCon);
  645. if (!$results)
  646. {
  647. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  648. }
  649. if( mysql_num_rows($results) == 0 )
  650. {
  651. return array('error' => "Group ($groupID) not found or Agent ($agentID) is not in the owner's role", 'params' => var_export($params, TRUE));
  652. }
  653. $ownerRoleInfo = mysql_fetch_assoc($results);
  654. if( ($ownerRoleInfo['OwnerRoleID'] == $roleID) && ($ownerRoleInfo['AgentID'] != $requestingAgent) )
  655. {
  656. return array('error' => "Requesting agent $requestingAgent is not a member of the Owners Role and cannot add members to the owners role.", 'params' => var_export($params, TRUE));
  657. }
  658. if( is_array($error = checkGroupPermission($groupID, $groupPowers['AssignMember'])) )
  659. {
  660. return $error;
  661. }
  662. return _addAgentToGroupRole($params);
  663. }
  664. function removeAgentFromGroupRole($params)
  665. {
  666. if( is_array($error = secureRequest($params, TRUE)) )
  667. {
  668. return $error;
  669. }
  670. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  671. $agentID = mysql_real_escape_string($params["AgentID"]);
  672. $groupID = mysql_real_escape_string($params["GroupID"]);
  673. $roleID = mysql_real_escape_string($params["RoleID"]);
  674. if( is_array($error = checkGroupPermission($groupID, $groupPowers['AssignMember'])) )
  675. {
  676. return $error;
  677. }
  678. // If agent has this role selected, change their selection to everyone (uuidZero) role
  679. $sql = " UPDATE osgroupmembership SET SelectedRoleID = '$uuidZero' WHERE AgentID = '$agentID' AND GroupID = '$groupID' AND SelectedRoleID = '$roleID'";
  680. $result = mysql_query($sql, $groupDBCon);
  681. if (!$result)
  682. {
  683. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  684. }
  685. $sql = " DELETE FROM osgrouprolemembership WHERE AgentID = '$agentID' AND GroupID = '$groupID' AND RoleID = '$roleID'";
  686. if (!mysql_query($sql, $groupDBCon))
  687. {
  688. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  689. }
  690. return array("success" => "true");
  691. }
  692. function _setAgentGroupSelectedRole($params)
  693. {
  694. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  695. $agentID = mysql_real_escape_string($params["AgentID"]);
  696. $groupID = mysql_real_escape_string($params["GroupID"]);
  697. $roleID = mysql_real_escape_string($params["RoleID"]);
  698. $sql = " UPDATE osgroupmembership SET SelectedRoleID = '$roleID' WHERE AgentID = '$agentID' AND GroupID = '$groupID'";
  699. $result = mysql_query($sql, $groupDBCon);
  700. if (!$result)
  701. {
  702. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  703. }
  704. return array('success' => 'true');
  705. }
  706. function setAgentGroupSelectedRole($params)
  707. {
  708. if( is_array($error = secureRequest($params, TRUE)) )
  709. {
  710. return $error;
  711. }
  712. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  713. $agentID = $params["AgentID"];
  714. $groupID = $params["GroupID"];
  715. $roleID = $params["RoleID"];
  716. if( isset($requestingAgent) && ($requestingAgent != $uuidZero) && ($requestingAgent != $agentID) )
  717. {
  718. return array('error' => "Agent can only change their own Selected Group Role", 'params' => var_export($params, TRUE));
  719. }
  720. return _setAgentGroupSelectedRole($params);
  721. }
  722. function getAgentGroupMembership($params)
  723. {
  724. if( is_array($error = secureRequest($params, FALSE)) )
  725. {
  726. return $error;
  727. }
  728. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  729. $groupID = mysql_real_escape_string($params['GroupID']);
  730. $agentID = mysql_real_escape_string($params['AgentID']);
  731. $sql = " SELECT osgroup.GroupID, osgroup.Name as GroupName, osgroup.Charter, osgroup.InsigniaID, osgroup.FounderID, osgroup.MembershipFee, osgroup.OpenEnrollment, osgroup.ShowInList, osgroup.AllowPublish, osgroup.MaturePublish"
  732. ." , osgroupmembership.Contribution, osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices"
  733. ." , osgroupmembership.SelectedRoleID, osrole.Title"
  734. ." , osagent.ActiveGroupID "
  735. ." FROM osgroup JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)"
  736. ." JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)"
  737. ." JOIN osagent ON (osagent.AgentID = osgroupmembership.AgentID)"
  738. ." WHERE osgroup.GroupID = '$groupID' AND osgroupmembership.AgentID = '$agentID'";
  739. $groupmembershipResult = mysql_query($sql, $groupDBCon);
  740. if (!$groupmembershipResult)
  741. {
  742. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  743. }
  744. if( mysql_num_rows($groupmembershipResult) == 0 )
  745. {
  746. return array('succeed' => 'false', 'error' => 'None Found', 'params' => var_export($params, TRUE), 'sql' => $sql);
  747. }
  748. $groupMembershipInfo = mysql_fetch_assoc($groupmembershipResult);
  749. $sql = " SELECT BIT_OR(osrole.Powers) AS GroupPowers"
  750. ." FROM osgrouprolemembership JOIN osrole ON (osgrouprolemembership.GroupID = osrole.GroupID AND osgrouprolemembership.RoleID = osrole.RoleID)"
  751. ." WHERE osgrouprolemembership.GroupID = '$groupID' AND osgrouprolemembership.AgentID = '$agentID'";
  752. $groupPowersResult = mysql_query($sql, $groupDBCon);
  753. if (!$groupPowersResult)
  754. {
  755. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  756. }
  757. $groupPowersInfo = mysql_fetch_assoc($groupPowersResult);
  758. return array_merge($groupMembershipInfo, $groupPowersInfo);
  759. }
  760. function getAgentGroupMemberships($params)
  761. {
  762. if( is_array($error = secureRequest($params, FALSE)) )
  763. {
  764. return $error;
  765. }
  766. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  767. $agentID = mysql_real_escape_string($params['AgentID']);
  768. $sql = " SELECT osgroup.GroupID, osgroup.Name as GroupName, osgroup.Charter, osgroup.InsigniaID, osgroup.FounderID, osgroup.MembershipFee, osgroup.OpenEnrollment, osgroup.ShowInList, osgroup.AllowPublish, osgroup.MaturePublish"
  769. ." , osgroupmembership.Contribution, osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices"
  770. ." , osgroupmembership.SelectedRoleID, osrole.Title"
  771. ." , IFNULL(osagent.ActiveGroupID, '$uuidZero') AS ActiveGroupID"
  772. ." FROM osgroup JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)"
  773. ." JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)"
  774. ." LEFT JOIN osagent ON (osagent.AgentID = osgroupmembership.AgentID)"
  775. ." WHERE osgroupmembership.AgentID = '$agentID'";
  776. $groupmembershipResults = mysql_query($sql, $groupDBCon);
  777. if (!$groupmembershipResults)
  778. {
  779. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  780. }
  781. if( mysql_num_rows($groupmembershipResults) == 0 )
  782. {
  783. return array('succeed' => 'false', 'error' => 'No Memberships', 'params' => var_export($params, TRUE), 'sql' => $sql);
  784. }
  785. $groupResults = array();
  786. while($groupMembershipInfo = mysql_fetch_assoc($groupmembershipResults))
  787. {
  788. $groupID = $groupMembershipInfo['GroupID'];
  789. $sql = " SELECT BIT_OR(osrole.Powers) AS GroupPowers"
  790. ." FROM osgrouprolemembership JOIN osrole ON (osgrouprolemembership.GroupID = osrole.GroupID AND osgrouprolemembership.RoleID = osrole.RoleID)"
  791. ." WHERE osgrouprolemembership.GroupID = '$groupID' AND osgrouprolemembership.AgentID = '$agentID'";
  792. $groupPowersResult = mysql_query($sql, $groupDBCon);
  793. if (!$groupPowersResult)
  794. {
  795. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  796. }
  797. $groupPowersInfo = mysql_fetch_assoc($groupPowersResult);
  798. $groupResults[$groupID] = array_merge($groupMembershipInfo, $groupPowersInfo);
  799. }
  800. return $groupResults;
  801. }
  802. // Parameters should not already be mysql_real_escape_string() escaped
  803. function canAgentViewRoleMembers( $agentID, $groupID, $roleID )
  804. {
  805. global $membersVisibleTo, $groupDBCon;
  806. if( $membersVisibleTo == 'All' )
  807. return true;
  808. $agentID = mysql_real_escape_string($agentID);
  809. $groupID = mysql_real_escape_string($groupID);
  810. $roleID = mysql_real_escape_string($roleID);
  811. $sql = " SELECT CASE WHEN min(OwnerRoleMembership.AgentID) IS NOT NULL THEN 1 ELSE 0 END AS IsOwner ";
  812. $sql .= " FROM osgroup JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID AND osgroupmembership.AgentID = '$agentID')";
  813. $sql .= " LEFT JOIN osgrouprolemembership AS OwnerRoleMembership ON (OwnerRoleMembership.GroupID = osgroup.GroupID ";
  814. $sql .= " AND OwnerRoleMembership.RoleID = osgroup.OwnerRoleID ";
  815. $sql .= " AND OwnerRoleMembership.AgentID = '$agentID')";
  816. $sql .= " WHERE osgroup.GroupID = '$groupID' GROUP BY osgroup.GroupID";
  817. $viewMemberResults = mysql_query($sql, $groupDBCon);
  818. if (!$viewMemberResults)
  819. {
  820. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error());
  821. }
  822. if (mysql_num_rows($viewMemberResults) == 0)
  823. {
  824. return false;
  825. }
  826. $viewMemberInfo = mysql_fetch_assoc($viewMemberResults);
  827. switch( $membersVisibleTo )
  828. {
  829. case 'Group':
  830. // if we get to here, there is at least one row, so they are a member of the group
  831. return true;
  832. case 'Owners':
  833. default:
  834. return $viewMemberInfo['IsOwner'];
  835. }
  836. }
  837. function getGroupMembers($params)
  838. {
  839. if( is_array($error = secureRequest($params, FALSE)) )
  840. {
  841. return $error;
  842. }
  843. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  844. $groupID = $params['GroupID'];
  845. $escapedGroupID = mysql_real_escape_string($groupID);
  846. $sql = " SELECT osgroupmembership.AgentID"
  847. ." , osgroupmembership.Contribution, osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices"
  848. ." , osgroupmembership.SelectedRoleID, osrole.Title"
  849. ." , CASE WHEN OwnerRoleMembership.AgentID IS NOT NULL THEN 1 ELSE 0 END AS IsOwner"
  850. ." FROM osgroup JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID)"
  851. ." JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)"
  852. ." JOIN osrole AS OwnerRole ON (osgroup.OwnerRoleID = OwnerRole.RoleID AND osgroup.GroupID = OwnerRole.GroupID)"
  853. ." LEFT JOIN osgrouprolemembership AS OwnerRoleMembership ON (osgroup.OwnerRoleID = OwnerRoleMembership.RoleID
  854. AND (osgroup.GroupID = OwnerRoleMembership.GroupID)
  855. AND (osgroupmembership.AgentID = OwnerRoleMembership.AgentID))"
  856. ." WHERE osgroup.GroupID = '$escapedGroupID'";
  857. $groupmemberResults = mysql_query($sql, $groupDBCon);
  858. if (!$groupmemberResults)
  859. {
  860. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  861. }
  862. if (mysql_num_rows($groupmemberResults) == 0)
  863. {
  864. return array('succeed' => 'false', 'error' => 'No Group Members found', 'params' => var_export($params, TRUE), 'sql' => $sql);
  865. }
  866. $roleMembersVisibleBit = $groupPowers['RoleMembersVisible'];
  867. $canViewAllGroupRoleMembers = canAgentViewRoleMembers($requestingAgent, $groupID, '');
  868. $memberResults = array();
  869. while ($memberInfo = mysql_fetch_assoc($groupmemberResults))
  870. {
  871. $agentID = $memberInfo['AgentID'];
  872. $sql = " SELECT BIT_OR(osrole.Powers) AS AgentPowers, ( BIT_OR(osrole.Powers) & $roleMembersVisibleBit) as MemberVisible"
  873. ." FROM osgrouprolemembership JOIN osrole ON (osgrouprolemembership.GroupID = osrole.GroupID AND osgrouprolemembership.RoleID = osrole.RoleID)"
  874. ." WHERE osgrouprolemembership.GroupID = '$escapedGroupID' AND osgrouprolemembership.AgentID = '$agentID'";
  875. $memberPowersResult = mysql_query($sql, $groupDBCon);
  876. if (!$memberPowersResult)
  877. {
  878. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  879. }
  880. $memberPowersCount = mysql_num_rows($memberPowersResult);
  881. error_log("Found $memberPowersCount rows for agent $agentID for requesting agent $requestingAgent");
  882. if ($memberPowersCount == 0)
  883. {
  884. if ($canViewAllGroupRoleMembers || $agentID == $requestingAgent)
  885. {
  886. $memberResults[$agentID] = array_merge($memberInfo, array('AgentPowers' => 0));
  887. }
  888. else
  889. {
  890. // if can't view all group role members and there is no Member Visible bit, then don't return this member's info
  891. unset($memberResults[$agentID]);
  892. }
  893. }
  894. else
  895. {
  896. $memberPowersInfo = mysql_fetch_assoc($memberPowersResult);
  897. if ($memberPowersInfo['MemberVisible'] || $canViewAllGroupRoleMembers || $agentID == $requestingAgent)
  898. {
  899. $memberResults[$agentID] = array_merge($memberInfo, $memberPowersInfo);
  900. }
  901. else
  902. {
  903. // if can't view all group role members and there is no Member Visible bit, then don't return this member's info
  904. unset($memberResults[$agentID]);
  905. }
  906. }
  907. }
  908. error_log("Returning " . count($memberResults) . " visible members for group $groupID for agent $agentID");
  909. if (count($memberResults) == 0)
  910. {
  911. return array('succeed' => 'false', 'error' => 'No Visible Group Members found', 'params' => var_export($params, TRUE), 'sql' => $sql);
  912. }
  913. return $memberResults;
  914. }
  915. function getAgentActiveMembership($params)
  916. {
  917. if( is_array($error = secureRequest($params, FALSE)) )
  918. {
  919. return $error;
  920. }
  921. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  922. $agentID = mysql_real_escape_string($params['AgentID']);
  923. $sql = " SELECT osgroup.GroupID, osgroup.Name as GroupName, osgroup.Charter, osgroup.InsigniaID, osgroup.FounderID, osgroup.MembershipFee, osgroup.OpenEnrollment, osgroup.ShowInList, osgroup.AllowPublish, osgroup.MaturePublish"
  924. ." , osgroupmembership.Contribution, osgroupmembership.ListInProfile, osgroupmembership.AcceptNotices"
  925. ." , osgroupmembership.SelectedRoleID, osrole.Title"
  926. ." , osagent.ActiveGroupID "
  927. ." FROM osagent JOIN osgroup ON (osgroup.GroupID = osagent.ActiveGroupID)"
  928. ." JOIN osgroupmembership ON (osgroup.GroupID = osgroupmembership.GroupID AND osagent.AgentID = osgroupmembership.AgentID)"
  929. ." JOIN osrole ON (osgroupmembership.SelectedRoleID = osrole.RoleID AND osgroupmembership.GroupID = osrole.GroupID)"
  930. ." WHERE osagent.AgentID = '$agentID'";
  931. $groupmembershipResult = mysql_query($sql, $groupDBCon);
  932. if (!$groupmembershipResult)
  933. {
  934. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  935. }
  936. if (mysql_num_rows($groupmembershipResult) == 0)
  937. {
  938. return array('succeed' => 'false', 'error' => 'No Active Group Specified', 'params' => var_export($params, TRUE), 'sql' => $sql);
  939. }
  940. $groupMembershipInfo = mysql_fetch_assoc($groupmembershipResult);
  941. $groupID = $groupMembershipInfo['GroupID'];
  942. $sql = " SELECT BIT_OR(osrole.Powers) AS GroupPowers"
  943. ." FROM osgrouprolemembership JOIN osrole ON (osgrouprolemembership.GroupID = osrole.GroupID AND osgrouprolemembership.RoleID = osrole.RoleID)"
  944. ." WHERE osgrouprolemembership.GroupID = '$groupID' AND osgrouprolemembership.AgentID = '$agentID'";
  945. $groupPowersResult = mysql_query($sql, $groupDBCon);
  946. if (!$groupPowersResult)
  947. {
  948. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  949. }
  950. $groupPowersInfo = mysql_fetch_assoc($groupPowersResult);
  951. return array_merge($groupMembershipInfo, $groupPowersInfo);
  952. }
  953. function getAgentRoles($params)
  954. {
  955. if( is_array($error = secureRequest($params, FALSE)) )
  956. {
  957. return $error;
  958. }
  959. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  960. $agentID = mysql_real_escape_string($params['AgentID']);
  961. $sql = " SELECT "
  962. ." osrole.RoleID, osrole.GroupID, osrole.Title, osrole.Name, osrole.Description, osrole.Powers"
  963. ." , CASE WHEN osgroupmembership.SelectedRoleID = osrole.RoleID THEN 1 ELSE 0 END AS Selected"
  964. ." FROM osgroupmembership JOIN osgrouprolemembership ON (osgroupmembership.GroupID = osgrouprolemembership.GroupID AND osgroupmembership.AgentID = osgrouprolemembership.AgentID)"
  965. ." JOIN osrole ON ( osgrouprolemembership.RoleID = osrole.RoleID AND osgrouprolemembership.GroupID = osrole.GroupID)"
  966. ." LEFT JOIN osagent ON (osagent.AgentID = osgroupmembership.AgentID)"
  967. ." WHERE osgroupmembership.AgentID = '$agentID'";
  968. if( isset($params['GroupID']) )
  969. {
  970. $groupID = $params['GroupID'];
  971. $sql .= " AND osgroupmembership.GroupID = '$groupID'";
  972. }
  973. $roleResults = mysql_query($sql, $groupDBCon);
  974. if (!$roleResults)
  975. {
  976. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  977. }
  978. if( mysql_num_rows($roleResults) == 0 )
  979. {
  980. return array('succeed' => 'false', 'error' => 'None found', 'params' => var_export($params, TRUE), 'sql' => $sql);
  981. }
  982. $roles = array();
  983. while($role = mysql_fetch_assoc($roleResults))
  984. {
  985. $ID = $role['GroupID'].$role['RoleID'];
  986. $roles[$ID] = $role;
  987. }
  988. return $roles;
  989. }
  990. function getGroupRoles($params)
  991. {
  992. if( is_array($error = secureRequest($params, FALSE)) )
  993. {
  994. return $error;
  995. }
  996. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  997. $groupID = mysql_real_escape_string($params['GroupID']);
  998. $sql = " SELECT "
  999. ." osrole.RoleID, osrole.Name, osrole.Title, osrole.Description, osrole.Powers, count(osgrouprolemembership.AgentID) as Members"
  1000. ." FROM osrole LEFT JOIN osgrouprolemembership ON (osrole.GroupID = osgrouprolemembership.GroupID AND osrole.RoleID = osgrouprolemembership.RoleID)"
  1001. ." WHERE osrole.GroupID = '$groupID'"
  1002. ." GROUP BY osrole.RoleID, osrole.Name, osrole.Title, osrole.Description, osrole.Powers";
  1003. $roleResults = mysql_query($sql, $groupDBCon);
  1004. if (!$roleResults)
  1005. {
  1006. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1007. }
  1008. if( mysql_num_rows($roleResults) == 0 )
  1009. {
  1010. return array('succeed' => 'false', 'error' => 'No roles found for group', 'params' => var_export($params, TRUE), 'sql' => $sql);
  1011. }
  1012. $roles = array();
  1013. while($role = mysql_fetch_assoc($roleResults))
  1014. {
  1015. $RoleID = $role['RoleID'];
  1016. $roles[$RoleID] = $role;
  1017. }
  1018. return $roles;
  1019. }
  1020. function getGroupRoleMembers($params)
  1021. {
  1022. if( is_array($error = secureRequest($params, FALSE)) )
  1023. {
  1024. return $error;
  1025. }
  1026. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  1027. $groupID = $params['GroupID'];
  1028. $roleMembersVisibleBit = $groupPowers['RoleMembersVisible'];
  1029. $canViewAllGroupRoleMembers = canAgentViewRoleMembers($requestingAgent, $groupID, '');
  1030. $escapedGroupID = mysql_real_escape_string($groupID);
  1031. $sql = " SELECT "
  1032. ." osrole.RoleID, osgrouprolemembership.AgentID"
  1033. ." , (osrole.Powers & $roleMembersVisibleBit) as MemberVisible"
  1034. ." FROM osrole JOIN osgrouprolemembership ON (osrole.GroupID = osgrouprolemembership.GroupID AND osrole.RoleID = osgrouprolemembership.RoleID)"
  1035. ." WHERE osrole.GroupID = '$escapedGroupID'";
  1036. $memberResults = mysql_query($sql, $groupDBCon);
  1037. if (!$memberResults)
  1038. {
  1039. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1040. }
  1041. if( mysql_num_rows($memberResults) == 0 )
  1042. {
  1043. return array('succeed' => 'false', 'error' => 'No role memberships found for group', 'params' => var_export($params, TRUE), 'sql' => $sql);
  1044. }
  1045. $members = array();
  1046. while($member = mysql_fetch_assoc($memberResults))
  1047. {
  1048. if( $canViewAllGroupRoleMembers || $member['MemberVisible'] || ($member['AgentID'] == $requestingAgent) )
  1049. {
  1050. $Key = $member['AgentID'] . $member['RoleID'];
  1051. $members[$Key ] = $member;
  1052. }
  1053. }
  1054. if( count($members) == 0 )
  1055. {
  1056. return array('succeed' => 'false', 'error' => 'No role memberships visible for group', 'params' => var_export($params, TRUE), 'sql' => $sql);
  1057. }
  1058. return $members;
  1059. }
  1060. function setAgentGroupInfo($params)
  1061. {
  1062. if( is_array($error = secureRequest($params, TRUE)) )
  1063. {
  1064. return $error;
  1065. }
  1066. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  1067. if (isset($params['AgentID'])) {
  1068. $agentID = mysql_real_escape_string($params['AgentID']);
  1069. } else {
  1070. $agentID = "";
  1071. }
  1072. if (isset($params['GroupID'])) {
  1073. $groupID = mysql_real_escape_string($params['GroupID']);
  1074. } else {
  1075. $groupID = "";
  1076. }
  1077. if (isset($params['SelectedRoleID'])) {
  1078. $roleID = mysql_real_escape_string($params['SelectedRoleID']);
  1079. } else {
  1080. $roleID = "";
  1081. }
  1082. if (isset($params['AcceptNotices'])) {
  1083. $acceptNotices = mysql_real_escape_string($params['AcceptNotices']);
  1084. } else {
  1085. $acceptNotices = 1;
  1086. }
  1087. if (isset($params['ListInProfile'])) {
  1088. $listInProfile = mysql_real_escape_string($params['ListInProfile']);
  1089. } else {
  1090. $listInProfile = 0;
  1091. }
  1092. if( isset($requestingAgent) && ($requestingAgent != $uuidZero) && ($requestingAgent != $agentID) )
  1093. {
  1094. return array('error' => "Agent can only change their own group info", 'params' => var_export($params, TRUE));
  1095. }
  1096. $sql = " UPDATE "
  1097. ." osgroupmembership"
  1098. ." SET "
  1099. ." AgentID = '$agentID'";
  1100. if( isset($params['SelectedRoleID']) )
  1101. {
  1102. $sql .=" , SelectedRoleID = '$roleID'";
  1103. }
  1104. if( isset($params['AcceptNotices']) )
  1105. {
  1106. $sql .=" , AcceptNotices = $acceptNotices";
  1107. }
  1108. if( isset($params['ListInProfile']) )
  1109. {
  1110. $sql .=" , ListInProfile = $listInProfile";
  1111. }
  1112. $sql .=" WHERE osgroupmembership.GroupID = '$groupID' AND osgroupmembership.AgentID = '$agentID'";
  1113. $memberResults = mysql_query($sql, $groupDBCon);
  1114. if (!$memberResults)
  1115. {
  1116. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1117. }
  1118. return array('success'=> 'true');
  1119. }
  1120. function getGroupNotices($params)
  1121. {
  1122. if( is_array($error = secureRequest($params, FALSE)) )
  1123. {
  1124. return $error;
  1125. }
  1126. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  1127. $groupID = mysql_real_escape_string($params['GroupID']);
  1128. $sql = " SELECT "
  1129. ." GroupID, NoticeID, Timestamp, FromName, Subject, Message, BinaryBucket"
  1130. ." FROM osgroupnotice"
  1131. ." WHERE osgroupnotice.GroupID = '$groupID'";
  1132. $results = mysql_query($sql, $groupDBCon);
  1133. if (!$results)
  1134. {
  1135. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1136. }
  1137. if( mysql_num_rows($results) == 0 )
  1138. {
  1139. return array('succeed' => 'false', 'error' => 'No Notices', 'params' => var_export($params, TRUE), 'sql' => $sql);
  1140. }
  1141. $notices = array();
  1142. while($notice = mysql_fetch_assoc($results))
  1143. {
  1144. $NoticeID = $notice['NoticeID'];
  1145. $notices[$NoticeID] = $notice;
  1146. }
  1147. return $notices;
  1148. }
  1149. function getGroupNotice($params)
  1150. {
  1151. if( is_array($error = secureRequest($params, FALSE)) )
  1152. {
  1153. return $error;
  1154. }
  1155. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  1156. $noticeID = mysql_real_escape_string($params['NoticeID']);
  1157. $sql = " SELECT "
  1158. ." GroupID, NoticeID, Timestamp, FromName, Subject, Message, BinaryBucket"
  1159. ." FROM osgroupnotice"
  1160. ." WHERE osgroupnotice.NoticeID = '$noticeID'";
  1161. $results = mysql_query($sql, $groupDBCon);
  1162. if (!$results)
  1163. {
  1164. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1165. }
  1166. if( mysql_num_rows($results) == 0 )
  1167. {
  1168. return array('succeed' => 'false', 'error' => 'Group Notice Not Found', 'params' => var_export($params, TRUE), 'sql' => $sql);
  1169. }
  1170. return mysql_fetch_assoc($results);
  1171. }
  1172. function addGroupNotice($params)
  1173. {
  1174. if( is_array($error = secureRequest($params, TRUE)) )
  1175. {
  1176. return $error;
  1177. }
  1178. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  1179. $groupID = mysql_real_escape_string($params['GroupID']);
  1180. $noticeID = mysql_real_escape_string($params['NoticeID']);
  1181. $fromName = mysql_real_escape_string($params['FromName']);
  1182. $subject = mysql_real_escape_string($params['Subject']);
  1183. $binaryBucket = mysql_real_escape_string($params['BinaryBucket']);
  1184. $message = mysql_real_escape_string($params['Message']);
  1185. $timeStamp = mysql_real_escape_string($params['TimeStamp']);
  1186. if( is_array($error = checkGroupPermission($groupID, $groupPowers['SendNotices'])) )
  1187. {
  1188. return $error;
  1189. }
  1190. $sql = " INSERT INTO osgroupnotice"
  1191. ." (GroupID, NoticeID, Timestamp, FromName, Subject, Message, BinaryBucket)"
  1192. ." VALUES "
  1193. ." ('$groupID', '$noticeID', $timeStamp, '$fromName', '$subject', '$message', '$binaryBucket')";
  1194. $results = mysql_query($sql, $groupDBCon);
  1195. if (!$results)
  1196. {
  1197. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1198. }
  1199. return array('success' => 'true');
  1200. }
  1201. function addAgentToGroupInvite($params)
  1202. {
  1203. if( is_array($error = secureRequest($params, TRUE)) )
  1204. {
  1205. return $error;
  1206. }
  1207. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  1208. if( is_array($error = checkGroupPermission($params['GroupID'], $groupPowers['Invite'])) )
  1209. {
  1210. return $error;
  1211. }
  1212. $inviteID = mysql_real_escape_string($params['InviteID']);
  1213. $groupID = mysql_real_escape_string($params['GroupID']);
  1214. $roleID = mysql_real_escape_string($params['RoleID']);
  1215. $agentID = mysql_real_escape_string($params['AgentID']);
  1216. // Remove any existing invites for this agent to this group
  1217. $sql = " DELETE FROM osgroupinvite"
  1218. ." WHERE osgroupinvite.AgentID = '$agentID' AND osgroupinvite.GroupID = '$groupID'";
  1219. $results = mysql_query($sql, $groupDBCon);
  1220. if (!$results)
  1221. {
  1222. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1223. }
  1224. // Add new invite for this agent to this group for the specifide role
  1225. $sql = " INSERT INTO osgroupinvite"
  1226. ." (InviteID, GroupID, RoleID, AgentID) VALUES ('$inviteID', '$groupID', '$roleID', '$agentID')";
  1227. $results = mysql_query($sql, $groupDBCon);
  1228. if (!$results)
  1229. {
  1230. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1231. }
  1232. return array('success' => 'true');
  1233. }
  1234. function getAgentToGroupInvite($params)
  1235. {
  1236. if( is_array($error = secureRequest($params, FALSE)) )
  1237. {
  1238. return $error;
  1239. }
  1240. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  1241. $inviteID = mysql_real_escape_string($params['InviteID']);
  1242. $sql = " SELECT GroupID, RoleID, AgentID FROM osgroupinvite"
  1243. ." WHERE osgroupinvite.InviteID = '$inviteID'";
  1244. $results = mysql_query($sql, $groupDBCon);
  1245. if (!$results)
  1246. {
  1247. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1248. }
  1249. if( mysql_num_rows($results) == 1 )
  1250. {
  1251. $inviteInfo = mysql_fetch_assoc($results);
  1252. $groupID = $inviteInfo['GroupID'];
  1253. $roleID = $inviteInfo['RoleID'];
  1254. $agentID = $inviteInfo['AgentID'];
  1255. return array('success' => 'true', 'GroupID'=>$groupID, 'RoleID'=>$roleID, 'AgentID'=>$agentID);
  1256. }
  1257. else
  1258. {
  1259. return array('succeed' => 'false', 'error' => 'Invitation not found', 'params' => var_export($params, TRUE), 'sql' => $sql);
  1260. }
  1261. }
  1262. function removeAgentToGroupInvite($params)
  1263. {
  1264. if( is_array($error = secureRequest($params, TRUE)) )
  1265. {
  1266. return $error;
  1267. }
  1268. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon;
  1269. $inviteID = mysql_real_escape_string($params['InviteID']);
  1270. $sql = " DELETE FROM osgroupinvite"
  1271. ." WHERE osgroupinvite.InviteID = '$inviteID'";
  1272. $results = mysql_query($sql, $groupDBCon);
  1273. if (!$results)
  1274. {
  1275. return array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error(), 'params' => var_export($params, TRUE));
  1276. }
  1277. return array('success' => 'true');
  1278. }
  1279. function secureRequest($params, $write = FALSE)
  1280. {
  1281. global $groupWriteKey, $groupReadKey, $verifiedReadKey, $verifiedWriteKey, $groupRequireAgentAuthForWrite, $requestingAgent;
  1282. global $overrideAgentUserService;
  1283. // Cache this for access by other security functions
  1284. $requestingAgent = $params['RequestingAgentID'];
  1285. if( isset($groupReadKey) && ($groupReadKey != '') && (!isset($verifiedReadKey) || ($verifiedReadKey !== TRUE)) )
  1286. {
  1287. if( !isset($params['ReadKey']) || ($params['ReadKey'] != $groupReadKey ) )
  1288. {
  1289. return array('error' => "Invalid (or No) Read Key Specified", 'params' => var_export($params, TRUE));
  1290. }
  1291. else
  1292. {
  1293. $verifiedReadKey = TRUE;
  1294. }
  1295. }
  1296. if( ($write == TRUE) && isset($groupWriteKey) && ($groupWriteKey != '') && (!isset($verifiedWriteKey) || ($verifiedWriteKey !== TRUE)) )
  1297. {
  1298. if( !isset($params['WriteKey']) || ($params['WriteKey'] != $groupWriteKey ) )
  1299. {
  1300. return array('error' => "Invalid (or No) Write Key Specified", 'params' => var_export($params, TRUE));
  1301. }
  1302. else
  1303. {
  1304. $verifiedWriteKey = TRUE;
  1305. }
  1306. }
  1307. if( ($write == TRUE) && isset($groupRequireAgentAuthForWrite) && ($groupRequireAgentAuthForWrite == TRUE) )
  1308. {
  1309. // Note: my brain can't do boolean logic this morning, so just putting this here instead of integrating with line above.
  1310. // If the write key has already been verified for this request, don't check it again. This comes into play with methods that call other methods, such as CreateGroup() which calls Addrole()
  1311. if( isset($verifiedWriteKey) && ($verifiedWriteKey !== TRUE))
  1312. {
  1313. return TRUE;
  1314. }
  1315. if( !isset($params['RequestingAgentID'])
  1316. || !isset($params['RequestingAgentUserService'])
  1317. || !isset($params['RequestingSessionID']) )
  1318. {
  1319. return array('error' => "Requesting AgentID and SessionID must be specified", 'params' => var_export($params, TRUE));
  1320. }
  1321. // NOTE: an AgentID and SessionID of $uuidZero will likely be a region making a request, that is not tied to a specific agent making the request.
  1322. $UserService = $params['RequestingAgentUserService'];
  1323. if( isset($overrideAgentUserService) && ($overrideAgentUserService != "") )
  1324. {
  1325. $UserService = $overrideAgentUserService;
  1326. }
  1327. $client = new xmlrpc_client($UserService);
  1328. $client->return_type = 'phpvals';
  1329. $verifyParams = new xmlrpcval(array('avatar_uuid' => new xmlrpcval($params['RequestingAgentID'], 'string')
  1330. ,'session_id' => new xmlrpcval($params['RequestingSessionID'], 'string'))
  1331. , 'struct');
  1332. $message = new xmlrpcmsg("check_auth_session", array($verifyParams));
  1333. $resp = $client->send($message, 5);
  1334. if ($resp->faultCode())
  1335. {
  1336. return array('error' => "Error validating AgentID and SessionID"
  1337. , 'xmlrpcerror'=> $resp->faultString()
  1338. , 'params' => var_export($params, TRUE));
  1339. }
  1340. $verifyReturn = $resp->value();
  1341. if( !isset($verifyReturn['auth_session']) || ($verifyReturn['auth_session'] != 'TRUE') )
  1342. {
  1343. return array('error' => "UserService.check_auth_session() did not return TRUE"
  1344. , 'userservice' => var_export($verifyReturn, TRUE)
  1345. , 'params' => var_export($params, TRUE));
  1346. }
  1347. }
  1348. return TRUE;
  1349. }
  1350. function checkGroupPermission($GroupID, $Permission)
  1351. {
  1352. global $groupEnforceGroupPerms, $requestingAgent, $uuidZero, $groupDBCon, $groupPowers;
  1353. if( !isset($Permission) || ($Permission == 0) )
  1354. {
  1355. return array('error' => 'No Permission value specified for checkGroupPermission'
  1356. , 'Permission' => $Permission);
  1357. }
  1358. // If it isn't set to true, then always return true, otherwise verify they have perms
  1359. if( !isset($groupEnforceGroupPerms) || ($groupEnforceGroupPerms != TRUE) )
  1360. {
  1361. return true;
  1362. }
  1363. if( !isset($requestingAgent) || ($requestingAgent == $uuidZero) )
  1364. {
  1365. return array('error' => 'Requesting agent was either not specified or not validated.'
  1366. , 'requestingAgent' => $requestingAgent);
  1367. }
  1368. $params = array('AgentID' => $requestingAgent, 'GroupID' => $GroupID);
  1369. $reqAgentMembership = getAgentGroupMembership($params);
  1370. if( isset($reqAgentMembership['error'] ) )
  1371. {
  1372. return array('error' => 'Could not get agent membership for group'
  1373. , 'params' => var_export($params, TRUE)
  1374. , 'nestederror' => $reqAgentMembership['error']);
  1375. }
  1376. // Worlds ugliest bitwise operation, EVER
  1377. $PermMask = $reqAgentMembership['GroupPowers'];
  1378. $PermValue = $Permission;
  1379. global $groupDBCon;
  1380. $sql = " SELECT $PermMask & $PermValue AS Allowed";
  1381. $results = mysql_query($sql, $groupDBCon);
  1382. if (!$results)
  1383. {
  1384. echo print_r( array('error' => "Could not successfully run query ($sql) from DB: " . mysql_error()));
  1385. }
  1386. $PermMasked = mysql_result($results, 0);
  1387. if( $PermMasked != $Permission )
  1388. {
  1389. $permNames = array_flip($groupPowers);
  1390. return array('error' => 'Agent does not have group power to ' . $Permission .'('.$permNames[$Permission].')'
  1391. , 'PermMasked' => $PermMasked
  1392. , 'params' => var_export($params, TRUE)
  1393. , 'permBitMaskSql' => $sql
  1394. , 'Permission' => $Permission);
  1395. }
  1396. /*
  1397. return array('error' => 'Reached end'
  1398. , 'reqAgentMembership' => var_export($reqAgentMembership, TRUE)
  1399. , 'GroupID' => $GroupID
  1400. , 'Permission' => $Permission
  1401. , 'PermMasked' => $PermMasked
  1402. );
  1403. */
  1404. return TRUE;
  1405. }
  1406. $s = new xmlrpc_server(array(
  1407. "test" => array("function" => "test")
  1408. , "groups.createGroup" => array("function" => "createGroup", "signature" => $common_sig)
  1409. , "groups.updateGroup" => array("function" => "updateGroup", "signature" => $common_sig)
  1410. , "groups.getGroup" => array("function" => "getGroup", "signature" => $common_sig)
  1411. , "groups.findGroups" => array("function" => "findGroups", "signature" => $common_sig)
  1412. , "groups.getGroupRoles" => array("function" => "getGroupRoles", "signature" => $common_sig)
  1413. , "groups.addRoleToGroup" => array("function" => "addRoleToGroup", "signature" => $common_sig)
  1414. , "groups.removeRoleFromGroup" => array("function" => "removeRoleFromGroup", "signature" => $common_sig)
  1415. , "groups.updateGroupRole" => array("function" => "updateGroupRole", "signature" => $common_sig)
  1416. , "groups.getGroupRoleMembers" => array("function" => "getGroupRoleMembers", "signature" => $common_sig)
  1417. , "groups.setAgentGroupSelectedRole" => array("function" => "setAgentGroupSelectedRole", "signature" => $common_sig)
  1418. , "groups.addAgentToGroupRole" => array("function" => "addAgentToGroupRole", "signature" => $common_sig)
  1419. , "groups.removeAgentFromGroupRole" => array("function" => "removeAgentFromGroupRole", "signature" => $common_sig)
  1420. , "groups.getGroupMembers" => array("function" => "getGroupMembers", "signature" => $common_sig)
  1421. , "groups.addAgentToGroup" => array("function" => "addAgentToGroup", "signature" => $common_sig)
  1422. , "groups.removeAgentFromGroup" => array("function" => "removeAgentFromGroup", "signature" => $common_sig)
  1423. , "groups.setAgentGroupInfo" => array("function" => "setAgentGroupInfo", "signature" => $common_sig)
  1424. , "groups.addAgentToGroupInvite" => array("function" => "addAgentToGroupInvite", "signature" => $common_sig)
  1425. , "groups.getAgentToGroupInvite" => array("function" => "getAgentToGroupInvite", "signature" => $common_sig)
  1426. , "groups.removeAgentToGroupInvite" => array("function" => "removeAgentToGroupInvite", "signature" => $common_sig)
  1427. , "groups.setAgentActiveGroup" => array("function" => "setAgentActiveGroup", "signature" => $common_sig)
  1428. , "groups.getAgentGroupMembership" => array("function" => "getAgentGroupMembership", "signature" => $common_sig)
  1429. , "groups.getAgentGroupMemberships" => array("function" => "getAgentGroupMemberships", "signature" => $common_sig)
  1430. , "groups.getAgentActiveMembership" => array("function" => "getAgentActiveMembership", "signature" => $common_sig)
  1431. , "groups.getAgentRoles" => array("function" => "getAgentRoles", "signature" => $common_sig)
  1432. , "groups.getGroupNotices" => array("function" => "getGroupNotices", "signature" => $common_sig)
  1433. , "groups.getGroupNotice" => array("function" => "getGroupNotice", "signature" => $common_sig)
  1434. , "groups.addGroupNotice" => array("function" => "addGroupNotice", "signature" => $common_sig)
  1435. ), false);
  1436. $s->functions_parameters_type = 'phpvals';
  1437. if (isset($debugXMLRPC) && $debugXMLRPC > 0 && isset($debugXMLRPCFile) && $debugXMLRPCFile != "")
  1438. {
  1439. $s->setDebug($debugXMLRPC);
  1440. }
  1441. $s->service();
  1442. if (isset($debugXMLRPC) && $debugXMLRPC > 0 && isset($debugXMLRPCFile) && $debugXMLRPCFile != "")
  1443. {
  1444. $f = fopen($debugXMLRPCFile,"a");
  1445. fwrite($f,"\n----- " . date("Y-m-d H:i:s") . " -----\n");
  1446. $debugInfo = $s->serializeDebug();
  1447. $debugInfo = split("\n",$debugInfo);
  1448. unset($debugInfo[0]);
  1449. unset($debugInfo[count($debugInfo) -1]);
  1450. $debugInfo = join("\n",$debugInfo);
  1451. fwrite($f,base64_decode($debugInfo));
  1452. fclose($f);
  1453. }
  1454. mysql_close($groupDBCon);
  1455. ?>