/////////////////////////////////////////////////////////////// // // CResource::RefreshAutoPermissions // // Update group and acl used aclrequest items // /////////////////////////////////////////////////////////////// bool CResource::RefreshAutoPermissions ( CXMLNode* pNodeAclRequest ) { // Ensure group and acl exist CAccessControlListGroup* pAutoGroup = g_pGame->GetACLManager()->AddGroup ( GetAutoGroupName () ); pAutoGroup->AddACL ( GetAutoAcl () ); pAutoGroup->AddObject ( GetName ().c_str (), CAccessControlListGroupObject::OBJECT_TYPE_RESOURCE ); // Track unused right names std::vector < CAclRightName > unusedRightNameMap; std::vector < SAclRequest > unusedRequestList; GetAclRequests ( unusedRequestList ); for ( uint i = 0 ; i < unusedRequestList.size () ; i++ ) unusedRightNameMap.push_back ( unusedRequestList[i].rightName ); // Track any pending requests bool bHasPending = false; for ( uint uiIndex = 0 ; true ; uiIndex++ ) { CXMLNode* pNodeRight = pNodeAclRequest->FindSubNode ( "right", uiIndex ); if ( !pNodeRight ) break; // Find existing SAclRequest request ( CAclRightName ( pNodeRight->GetAttributeValue ( "name" ) ) ); if ( !FindAclRequest ( request ) ) { // Add new request request.bAccess = false; request.bPending = true; request.strWho = ""; request.strDate = ""; // Validate request if ( !request.rightName.IsValid () || !StringToBool ( pNodeRight->GetAttributeValue ( "access" ) ) ) { CLogger::ErrorPrintf ( "Invalid aclrequest line in %s (%s)\n", GetName ().c_str (), *request.rightName.GetFullName () ); return false; } CommitAclRequest ( request ); } // This right is used ListRemove ( unusedRightNameMap, request.rightName ); // Update flag bHasPending |= request.bPending; } // Remove rights not requested for ( std::vector < CAclRightName >::iterator iter = unusedRightNameMap.begin () ; iter != unusedRightNameMap.end () ; ++iter ) GetAutoAcl ()->RemoveRight ( iter->GetName (), iter->GetType () ); // If any rights are pending, print message if ( bHasPending ) { CLogger::LogPrintf ( "Resource '%s' requests some acl rights. Use the command 'aclrequest list %s'\n", GetName ().c_str (), GetName ().c_str () ); } return bHasPending; }