public void Startup(ConfigurationLoader loader)
        {
            IConfig config = loader.Config.Configs[GetType().FullName];
            string  inventoryServiceName = config.GetString("InventoryService");

            m_InventoryService = loader.GetService <InventoryServiceInterface>(inventoryServiceName);
        }
예제 #2
0
 public static bool StartTransferLocal(
     UUID transactionID,
     UGUI dstAgent,
     IReadOnlyList <IUserAgentServicePlugin> userAgentServicePlugins,
     IReadOnlyList <IInventoryServicePlugin> inventoryServicePlugins,
     IReadOnlyList <IAssetServicePlugin> assetServicePlugins,
     UGUIWithName srcAgent,
     InventoryServiceInterface srcInventoryService,
     AssetServiceInterface srcAssetService,
     AssetType givenAssetType,
     UUID givenInventoryID,
     IMServiceInterface imService,
     Action <UUID> inventoryCreate = null) => StartTransfer(
     transactionID,
     dstAgent,
     userAgentServicePlugins,
     inventoryServicePlugins,
     assetServicePlugins,
     srcAgent,
     null,
     srcInventoryService,
     srcAssetService,
     givenAssetType,
     givenInventoryID,
     imService,
     inventoryCreate);
예제 #3
0
 public InventoryTransferWorkItem(
     UUID transactionID,
     UGUI dstAgent,
     UserAgentServiceInterface dstUserAgentService,
     InventoryServiceInterface dstInventoryService,
     AssetServiceInterface dstAssetService,
     UGUIWithName srcAgent,
     InventoryServiceInterface srcInventoryService,
     AssetServiceInterface srcAssetService,
     UUID assetid,
     InventoryItem item,
     IMServiceInterface imService,
     Action <UUID> inventoryCreate)
     : base(dstAssetService, srcAssetService, assetid, ReferenceSource.Source)
 {
     m_TransactionID       = transactionID;
     m_DstUserAgentService = dstUserAgentService;
     m_DstInventoryService = dstInventoryService;
     m_SrcInventoryService = srcInventoryService;
     m_DestinationAgent    = dstAgent;
     m_Item            = item;
     m_SrcAgent        = srcAgent;
     m_IMService       = imService;
     m_InventoryCreate = inventoryCreate;
 }
예제 #4
0
 public NewFileAgentInventoryBase(ViewerAgent agent, string serverURI, string remoteip)
     : base(agent.Owner, serverURI, remoteip)
 {
     m_Agent            = agent;
     m_InventoryService = agent.InventoryService;
     m_AssetService     = agent.AssetService;
 }
예제 #5
0
        public void Startup(ConfigurationLoader loader)
        {
            HomeURI = loader.HomeURI;

            m_AgentInventoryService = loader.GetService <InventoryServiceInterface>(m_AgentInventoryServiceName);
            m_AgentAssetService     = loader.GetService <AssetServiceInterface>(m_AgentAssetServiceName);
            if (m_AgentProfileServiceName?.Length != 0)
            {
                m_AgentProfileService = loader.GetService <ProfileServiceInterface>(m_AgentProfileServiceName);
            }
            m_AgentFriendsService = loader.GetService <FriendsServiceInterface>(m_AgentFriendsServiceName);
            m_UserSessionService  = loader.GetService <UserSessionServiceInterface>(m_UserSessionServiceName);
            m_GridService         = loader.GetService <GridServiceInterface>(m_GridServiceName);
            if (m_OfflineIMServiceName?.Length != 0)
            {
                m_OfflineIMService = loader.GetService <OfflineIMServiceInterface>(m_OfflineIMServiceName);
            }
            if (m_AgentExperienceServiceName?.Length != 0)
            {
                loader.GetService(m_AgentExperienceServiceName, out m_AgentExperienceService);
            }
            if (m_AgentGroupsServiceName?.Length != 0)
            {
                loader.GetService(m_AgentGroupsServiceName, out m_AgentGroupsService);
            }
            m_UserAccountService    = loader.GetService <UserAccountServiceInterface>(m_UserAccountServiceName);
            m_AgentUserAgentService = new LocalUserAgentService(m_UserSessionService, m_UserAccountService, m_RequiresInventoryIDAsIMSessionID, HomeURI);

            m_Scenes               = loader.Scenes;
            m_Commands             = loader.CommandRegistry;
            m_CapsRedirector       = loader.CapsRedirector;
            m_PacketHandlerPlugins = loader.GetServicesByValue <IProtocolExtender>();
        }
예제 #6
0
 public static void StartTransferLocal(
     UUID transactionID,
     UGUI dstAgent,
     UserAgentServiceInterface dstUserAgentService,
     InventoryServiceInterface dstInventoryService,
     AssetServiceInterface dstAssetService,
     UGUIWithName srcAgent,
     InventoryServiceInterface srcInventoryService,
     AssetServiceInterface srcAssetService,
     AssetType givenAssetType,
     UUID givenInventoryID,
     IMServiceInterface imService,
     Action <UUID> inventoryCreate = null) => StartTransfer(
     transactionID,
     dstAgent,
     dstUserAgentService,
     dstInventoryService,
     dstAssetService,
     srcAgent,
     null,
     srcInventoryService,
     srcAssetService,
     givenAssetType,
     givenInventoryID,
     imService,
     inventoryCreate);
        private static UUID GetPath(
            UGUI principalID,
            InventoryServiceInterface inventoryService,
            Dictionary <UUID, UUID> folders,
            string path,
            LoadOptions options)
        {
            path = path.Substring(10); /* Get Rid of inventory/ */
            int slashPos = path.LastIndexOf('/');

            if (slashPos >= 0)
            {
                path = path.Substring(0, slashPos);
            }

            string[] pathcomps = path.Split('/');
            var      finalpath = new StringBuilder();
            UUID     folderID  = folders[string.Empty];

            int pathidx = 0;

            if ((options & LoadOptions.Merge) != 0 &&
                pathcomps[0].StartsWith("MyInventory") &&
                pathcomps[0].Length == 13 + 36)
            {
                pathidx = 1;
            }

            for (; pathidx < pathcomps.Length; ++pathidx)
            {
                if (finalpath.Length != 0)
                {
                    finalpath.Append("/");
                }

                string uuidstr      = pathcomps[pathidx].Substring(pathcomps[pathidx].Length - 36);
                UUID   nextfolderid = UUID.Parse(uuidstr);
                string pname        = pathcomps[pathidx].Substring(0, pathcomps[pathidx].Length - 38);
                finalpath.Append(pname);
                if (folders.ContainsKey(nextfolderid))
                {
                    folderID = folders[nextfolderid];
                }
                else
                {
                    var folder = new InventoryFolder
                    {
                        Owner          = principalID,
                        ParentFolderID = folderID,
                        Name           = EscapingMethods.UnescapeName(pname)
                    };
                    inventoryService.Folder.Add(folder);
                    folderID = folder.ID;
                    folders[nextfolderid] = folderID;
                }
            }
            return(folderID);
        }
 public Request(HttpRequest req, InventoryServiceInterface inventoryService, UGUI agent, bool isLibrary, string rawPrefixUrl, string fullPrefixUrl)
 {
     HttpRequest      = req;
     InventoryService = inventoryService;
     Agent            = agent;
     IsLibrary        = isLibrary;
     RawPrefixUrl     = rawPrefixUrl;
     FullPrefixUrl    = fullPrefixUrl;
 }
        public void Startup(ConfigurationLoader loader)
        {
            IConfig config = loader.Config.Configs[GetType().FullName];
            string  inventoryServiceName = config.GetString("InventoryService");

            m_InventoryService        = loader.GetService <InventoryServiceInterface>(inventoryServiceName);
            m_BackendInventoryService = loader.GetService <InventoryServiceInterface>(config.GetString("BackendInventoryService", inventoryServiceName));
            m_UserID = new UGUI(config.GetString("User"));
        }
예제 #10
0
        public void HandleInventoryDeclined(ViewerAgent dstAgent, AgentCircuit circuit, Message m)
        {
            var im = (ImprovedInstantMessage)m;

            UserAgentServiceInterface userAgentService = dstAgent.UserAgentService;
            InventoryServiceInterface inventorySerice  = dstAgent.InventoryService;

            if (userAgentService == null)
            {
                return;
            }

            if (userAgentService.SupportsInventoryTransfer)
            {
                userAgentService.DeclineInventoryTransfer(dstAgent.ID, im.ID);
            }
            else
            {
                SceneInterface scene = circuit.Scene;
                if (scene == null)
                {
                    return;
                }

                UGUI toAgent;
                if (!scene.AvatarNameService.TryGetValue(im.ToAgentID, out toAgent))
                {
                    /* pass the unresolved here */
                    toAgent = new UGUI(im.ToAgentID);
                }

                InventoryFolder trashFolder;
                if (userAgentService.RequiresInventoryIDAsIMSessionID &&
                    inventorySerice != null &&
                    inventorySerice.Folder.TryGetValue(dstAgent.ID, AssetType.TrashFolder, out trashFolder))
                {
                    if (inventorySerice.Item.ContainsKey(dstAgent.ID, im.ID))
                    {
                        inventorySerice.Item.Move(dstAgent.ID, im.ID, trashFolder.ID);
                    }
                    else
                    {
                        inventorySerice.Folder.Move(dstAgent.ID, im.ID, trashFolder.ID);
                    }
                }

                m_IMService.Send(new GridInstantMessage
                {
                    ToAgent     = toAgent,
                    FromAgent   = dstAgent.NamedOwner,
                    Message     = string.Empty,
                    IMSessionID = im.ID,
                    Dialog      = GridInstantMessageDialog.InventoryDeclined
                });
            }
        }
예제 #11
0
 public UpdateScriptAgent(
     ViewerAgent agent,
     InventoryServiceInterface inventoryService,
     AssetServiceInterface assetService,
     string serverURI,
     string remoteip)
     : base(agent.Owner, serverURI, remoteip)
 {
     m_Agent            = agent;
     m_InventoryService = inventoryService;
     m_AssetService     = assetService;
 }
예제 #12
0
        private bool TryGetServices(UGUI targetAgentId, out InventoryServiceInterface inventoryService, out AssetServiceInterface assetService)
        {
            UserAgentServiceInterface userAgentService = null;

            inventoryService = null;
            assetService     = null;
            if (targetAgentId.HomeURI == null)
            {
                return(false);
            }
            var homeUri     = targetAgentId.HomeURI.ToString();
            var heloheaders = ServicePluginHelo.HeloRequest(homeUri);

            foreach (IUserAgentServicePlugin userAgentPlugin in UserAgentServicePlugins)
            {
                if (userAgentPlugin.IsProtocolSupported(homeUri, heloheaders))
                {
                    userAgentService = userAgentPlugin.Instantiate(homeUri);
                }
            }

            if (userAgentService == null)
            {
                return(false);
            }

            ServerURIs serverurls         = userAgentService.GetServerURLs(targetAgentId);
            string     inventoryServerURI = serverurls.InventoryServerURI;
            string     assetServerURI     = serverurls.AssetServerURI;

            heloheaders = ServicePluginHelo.HeloRequest(inventoryServerURI);
            foreach (IInventoryServicePlugin inventoryPlugin in InventoryServicePlugins)
            {
                if (inventoryPlugin.IsProtocolSupported(inventoryServerURI, heloheaders))
                {
                    inventoryService = inventoryPlugin.Instantiate(inventoryServerURI);
                    break;
                }
            }

            heloheaders = ServicePluginHelo.HeloRequest(assetServerURI);
            foreach (IAssetServicePlugin assetPlugin in AssetServicePlugins)
            {
                if (assetPlugin.IsProtocolSupported(assetServerURI, heloheaders))
                {
                    assetService = assetPlugin.Instantiate(assetServerURI);
                    break;
                }
            }

            return(inventoryService != null && assetService != null);
        }
        public void Startup(ConfigurationLoader loader)
        {
            m_UserSessionService = loader.GetService <UserSessionServiceInterface>(m_UserSessionServiceName);

            m_InventoryService   = loader.GetService <InventoryServiceInterface>(m_InventoryServiceName);
            m_UserAccountService = loader.GetService <UserAccountServiceInterface>(m_UserAccountServiceName);
            m_HttpServer         = loader.HttpServer;
            m_HttpServer.StartsWithUriHandlers.Add("/UserCAPS/FetchInventoryDescendents2/", CapsHandler);
            if (loader.TryGetHttpsServer(out m_HttpsServer))
            {
                m_HttpsServer.StartsWithUriHandlers.Add("/UserCAPS/FetchInventoryDescendents2/", CapsHandler);
            }
        }
예제 #14
0
 public void Startup(ConfigurationLoader loader)
 {
     m_UserAccountService    = loader.GetService <UserAccountServiceInterface>(m_UserAccountServiceName);
     m_InventoryService      = loader.GetService <InventoryServiceInterface>(m_InventoryServiceName);
     m_AccountDeleteServices = loader.GetServicesByValue <IUserAccountDeleteServiceInterface>();
     m_AuthInfoService       = loader.GetService <AuthInfoServiceInterface>(m_AuthInfoServiceName);
     m_ServiceURLsGetters    = loader.GetServicesByValue <IServiceURLsGetInterface>();
     loader.CommandRegistry.AddCreateCommand("user", CreateUserCommand);
     loader.CommandRegistry.AddDeleteCommand("user", DeleteUserCommand);
     loader.CommandRegistry.AddChangeCommand("user", ChangeUserCommand);
     loader.CommandRegistry.AddShowCommand("user", ShowUserCommand);
     loader.CommandRegistry.AddShowCommand("serviceurls", ShowServiceUrlsCommand);
     loader.CommandRegistry.AddResetCommand("user", ResetUserPasswordCommand);
 }
예제 #15
0
 public ObjectTransferItem(
     IAgent agent,
     SceneInterface scene,
     UUID assetid,
     List <InventoryItem> items,
     string destinationFolder = "")
     : base(agent.AssetService, scene.AssetService, assetid, ReferenceSource.Source)
 {
     m_InventoryService  = agent.InventoryService;
     m_DestinationAgent  = agent.Owner;
     m_SceneID           = scene.ID;
     m_Items             = items;
     m_DestinationFolder = destinationFolder;
     TryGetScene         = scene.TryGetScene;
 }
예제 #16
0
 public NpcAgent(
     UGUIWithName npcID,
     AgentServiceList serviceList,
     UUID sceneID)
     : base(npcID.ID, npcID.HomeURI)
 {
     FirstName           = npcID.FirstName;
     LastName            = npcID.LastName;
     m_InventoryService  = serviceList.Get <InventoryServiceInterface>();
     m_ProfileService    = serviceList.Get <ProfileServiceInterface>();
     m_PresenceService   = serviceList.Get <IPresenceServiceInterface>();
     NpcPresenceService  = serviceList.Get <NpcPresenceServiceInterface>();
     m_UpdateInfo        = new AgentUpdateInfo(this, sceneID);
     OnAppearanceUpdate += HandleAppearanceUpdate;
 }
 public void Startup(ConfigurationLoader loader)
 {
     m_NpcInventoryService = loader.GetService <InventoryServiceInterface>(m_NpcInventoryServiceName);
     m_NpcPresenceService  = loader.GetService <NpcPresenceServiceInterface>(m_NpcPresenceServiceName);
     m_NpcAssetService     = loader.GetService <AssetServiceInterface>(m_NpcAssetServiceName);
     foreach (string avatarNameService in m_AvatarNameServiceNames.Split(','))
     {
         if (!string.IsNullOrEmpty(avatarNameService))
         {
             m_AvatarNameServices.Add(loader.GetService <AvatarNameServiceInterface>(avatarNameService));
         }
     }
     loader.CommandRegistry.AddLoadCommand("npc-iar", LoadIarCommand);
     loader.CommandRegistry.AddSaveCommand("npc-iar", SaveIarCommand);
 }
예제 #18
0
        public void Startup(ConfigurationLoader loader)
        {
            List <IAdminWebIF> webifs = loader.GetServicesByValue <IAdminWebIF>();

            if (webifs.Count > 0)
            {
                m_AdminWebIF = webifs[0];
                m_AdminWebIF.JsonMethods.Add("npcs.show", HandleShowNpcs);
                m_AdminWebIF.JsonMethods.Add("npc.remove", HandleRemoveNpc);
                m_AdminWebIF.JsonMethods.Add("npc.get", HandleGetNpc);
                m_AdminWebIF.AutoGrantRights["npcs.manage"].Add("npcs.view");
                m_AdminWebIF.ModuleNames.Add("npcs");
            }
            /* non persistent inventory is needed for baking logic */
            m_NonpersistentInventoryService = loader.GetService <InventoryServiceInterface>(m_NonpersistentInventoryServiceName);
            m_NonpersistentAgentServices.Add(m_NonpersistentInventoryService);
            m_NonpersistentAgentServices.Add(new NpcNonPersistentPresenceService());

            /* persistence is optional */
            if (!string.IsNullOrEmpty(m_NpcPresenceServiceName) || !string.IsNullOrEmpty(m_PersistentInventoryServiceName))
            {
                m_NpcPresenceService = loader.GetService <NpcPresenceServiceInterface>(m_NpcPresenceServiceName);
                m_PersistentAgentServices.Add(m_NpcPresenceService);
                m_PersistentInventoryService = loader.GetService <InventoryServiceInterface>(m_PersistentInventoryServiceName);
                m_PersistentAgentServices.Add(m_PersistentInventoryService);

                /* profile is optional */
                if (!string.IsNullOrEmpty(m_PersistentProfileServiceName))
                {
                    m_PersistentProfileService = loader.GetService <ProfileServiceInterface>(m_PersistentProfileServiceName);
                    m_PersistentAgentServices.Add(m_PersistentProfileService);
                }
            }

            /* profile is optional */
            if (!string.IsNullOrEmpty(m_NonpersistentProfileServiceName))
            {
                m_NonpersistentProfileService = loader.GetService <ProfileServiceInterface>(m_NonpersistentProfileServiceName);
                m_NonpersistentAgentServices.Add(m_NonpersistentProfileService);
            }
            loader.Scenes.OnRegionAdd    += OnSceneAdded;
            loader.Scenes.OnRegionRemove += OnSceneRemoved;

            loader.CommandRegistry.AddShowCommand("npcs", ShowNpcsCommand);
            loader.CommandRegistry.AddRemoveCommand("npc", RemoveNpcCommand);
            loader.CommandRegistry.AddCreateCommand("npc", CreateNpcCommand);
            loader.CommandRegistry.AddRemoveAllCommand("npcs", RemoveAllNpcsCommand);
        }
예제 #19
0
 public void Startup(ConfigurationLoader loader)
 {
     loader.CommandRegistry.AddSaveCommand("iar", SaveIarCommand);
     loader.CommandRegistry.AddLoadCommand("iar", LoadIarCommand);
     m_AuthInfoService    = loader.GetService <AuthInfoServiceInterface>(m_AuthInfoServiceName);
     m_AssetService       = loader.GetService <AssetServiceInterface>(m_AssetServiceName);
     m_InventoryService   = loader.GetService <InventoryServiceInterface>(m_InventoryServiceName);
     m_UserAccountService = loader.GetService <UserAccountServiceInterface>(m_UserAccountServiceName);
     foreach (string avatarNameService in m_AvatarNameServiceNames.Split(','))
     {
         if (!string.IsNullOrEmpty(avatarNameService))
         {
             m_AvatarNameServices.Add(loader.GetService <AvatarNameServiceInterface>(avatarNameService));
         }
     }
 }
예제 #20
0
 public ObjectTransferItem(
     InventoryServiceInterface inventoryService,
     AssetServiceInterface assetService,
     UGUI agentOwner,
     SceneInterface scene,
     List <UUID> assetids,
     List <InventoryItem> items,
     AssetType destinationFolderType)
     : base(assetService, scene.AssetService, assetids, ReferenceSource.Source)
 {
     m_InventoryService      = inventoryService;
     m_DestinationAgent      = agentOwner;
     m_SceneID               = scene.ID;
     m_Items                 = items;
     m_DestinationFolderType = destinationFolderType;
     TryGetScene             = scene.TryGetScene;
 }
예제 #21
0
        private static TransferInventoryFolder GetTree(InventoryServiceInterface inventoryService, InventoryFolder baseFolder, List <UUID> assetids)
        {
            TransferInventoryFolder catBase = new TransferInventoryFolder(baseFolder);

            List <TransferInventoryFolder> collect = new List <TransferInventoryFolder>
            {
                catBase
            };

            while (collect.Count != 0)
            {
                InventoryFolderContent  content;
                TransferInventoryFolder cat = collect[0];
                if (inventoryService.Folder.Content.TryGetValue(cat.Owner.ID, cat.ID, out content))
                {
                    foreach (InventoryItem item in content.Items)
                    {
                        if (item.AssetType != AssetType.Link && item.AssetType != AssetType.LinkFolder)
                        {
                            if (!item.CheckPermissions(cat.Owner, UGI.Unknown, InventoryPermissionsMask.Transfer))
                            {
                                return(null);
                            }
                            assetids.Add(item.AssetID);
                            cat.Items.Add(item);
                        }
                    }

                    foreach (InventoryFolder folder in content.Folders)
                    {
                        var childFolder = new TransferInventoryFolder(folder);
                        collect.Add(childFolder);
                        cat.Folders.Add(childFolder);
                    }
                }

                cat.ID = UUID.Random;
                collect.RemoveAt(0);
            }

            return(catBase);
        }
예제 #22
0
 public ViewerAgent(
     SceneList scenes,
     UUID agentID,
     string firstName,
     string lastName,
     Uri homeURI,
     UUID sessionID,
     UUID secureSessionID,
     ClientInfo clientInfo,
     UserAccount untrustedAccountInfo,
     AgentServiceList serviceList)
     : base(agentID, homeURI)
 {
     m_Scenes           = scenes;
     m_TeleportServices = serviceList.GetAll <IAgentTeleportServiceInterface>();
     foreach (IAgentTeleportServiceInterface service in m_TeleportServices)
     {
         service.Agent = this;
     }
     CollisionPlane         = Vector4.UnitW;
     SessionID              = sessionID;
     m_UntrustedAccountInfo = untrustedAccountInfo;
     m_SecureSessionID      = secureSessionID;
     Client              = clientInfo;
     m_AssetService      = serviceList.Get <AssetServiceInterface>();
     m_InventoryService  = serviceList.Get <InventoryServiceInterface>();
     m_GroupsService     = serviceList.Get <GroupsServiceInterface>();
     m_ExperienceService = serviceList.Get <ExperienceServiceInterface>();
     m_ProfileService    = serviceList.Get <ProfileServiceInterface>();
     m_FriendsService    = serviceList.Get <FriendsServiceInterface>();
     m_UserAgentService  = serviceList.Get <UserAgentServiceInterface>();
     m_PresenceService   = serviceList.Get <IPresenceServiceInterface>();
     EconomyService      = serviceList.Get <EconomyServiceInterface>();
     OfflineIMService    = serviceList.Get <OfflineIMServiceInterface>();
     MuteListService     = serviceList.Get <MuteListServiceInterface>();
     FirstName           = firstName;
     LastName            = lastName;
     OnPositionChange   += ChildUpdateOnPositionChange;
     OnAppearanceUpdate += HandleAppearanceUpdate;
 }
예제 #23
0
        private void HandleDeclineCallingCard(Message m)
        {
            var req = (DeclineCallingCard)m;

            if (req.AgentID != req.CircuitAgentID ||
                req.SessionID != req.CircuitSessionID)
            {
                return;
            }

            SceneInterface scene;

            if (!m_Scenes.TryGetValue(req.CircuitSceneID, out scene))
            {
                return;
            }

            IAgent agent;

            if (!scene.Agents.TryGetValue(req.AgentID, out agent))
            {
                return;
            }

            InventoryServiceInterface inventoryService = agent.InventoryService;

            if (inventoryService == null)
            {
                return;
            }

            InventoryFolder folder;

            if (inventoryService.Folder.TryGetValue(req.AgentID, AssetType.TrashFolder, out folder))
            {
                inventoryService.Item.Move(req.AgentID, req.TransactionID, folder.ID);
            }
        }
        public static void Save(
            UGUI principal,
            InventoryServiceInterface inventoryService,
            AssetServiceInterface assetService,
            List <AvatarNameServiceInterface> nameServices,
            SaveOptions options,
            string fileName,
            string frompath,
            TTY console_io = null)
        {
            UUID parentFolder = inventoryService.Folder[principal.ID, AssetType.RootFolder].ID;

            if (!frompath.StartsWith("/"))
            {
                throw new InvalidInventoryPathException();
            }
            foreach (string pathcomp in frompath.Substring(1).Split('/'))
            {
                List <InventoryFolder> childfolders = inventoryService.Folder.GetFolders(principal.ID, parentFolder);
                int idx;
                for (idx = 0; idx < childfolders.Count; ++idx)
                {
                    if (pathcomp.ToLower() == childfolders[idx].Name.ToLower())
                    {
                        break;
                    }
                }

                if (idx == childfolders.Count)
                {
                    throw new InvalidInventoryPathException();
                }

                parentFolder = childfolders[idx].ID;
            }
        }
예제 #25
0
        public static bool StartTransfer(
            UUID transactionID,
            UGUI dstAgent,
            IReadOnlyList <IUserAgentServicePlugin> userAgentServicePlugins,
            IReadOnlyList <IInventoryServicePlugin> inventoryServicePlugins,
            IReadOnlyList <IAssetServicePlugin> assetServicePlugins,
            UGUIWithName srcAgent,
            UserAgentServiceInterface srcUserAgentService,
            InventoryServiceInterface srcInventoryService,
            AssetServiceInterface srcAssetService,
            AssetType givenAssetType,
            UUID givenInventoryID,
            IMServiceInterface imService,
            Action <UUID> inventoryCreate = null)
        {
            InventoryServiceInterface dstInventoryService = null;
            AssetServiceInterface     dstAssetService     = null;
            UserAgentServiceInterface dstUserAgentService = null;

            if (dstAgent.HomeURI == null)
            {
                m_Log.ErrorFormat("No route to agent id {0}", dstAgent.ID);
                return(false);
            }

            var homeUri     = dstAgent.HomeURI.ToString();
            var heloheaders = ServicePluginHelo.HeloRequest(homeUri);

            foreach (IUserAgentServicePlugin userAgentPlugin in userAgentServicePlugins)
            {
                if (userAgentPlugin.IsProtocolSupported(homeUri, heloheaders))
                {
                    dstUserAgentService = userAgentPlugin.Instantiate(homeUri);
                }
            }

            if (dstUserAgentService == null)
            {
                m_Log.ErrorFormat("No user agent service found to agent id {0}", dstAgent.ID);
                return(false);
            }

            ServerURIs uris = dstUserAgentService.GetServerURLs(dstAgent);

            heloheaders = ServicePluginHelo.HeloRequest(uris.AssetServerURI);
            foreach (IAssetServicePlugin assetPlugin in assetServicePlugins)
            {
                if (assetPlugin.IsProtocolSupported(homeUri, heloheaders))
                {
                    dstAssetService = assetPlugin.Instantiate(homeUri);
                }
            }
            if (dstAssetService == null)
            {
                m_Log.ErrorFormat("No asset service found to agent id {0}", dstAgent.ID);
                return(false);
            }

            heloheaders = ServicePluginHelo.HeloRequest(uris.InventoryServerURI);
            foreach (IInventoryServicePlugin inventoryPlugin in inventoryServicePlugins)
            {
                if (inventoryPlugin.IsProtocolSupported(homeUri, heloheaders))
                {
                    dstInventoryService = inventoryPlugin.Instantiate(homeUri);
                }
            }

            if (dstInventoryService == null)
            {
                m_Log.ErrorFormat("No inventory service found to agent id {0}", dstAgent.ID);
                return(false);
            }

            StartTransfer(
                transactionID,
                dstAgent,
                dstUserAgentService,
                dstInventoryService,
                dstAssetService,
                srcAgent,
                srcUserAgentService,
                srcInventoryService,
                srcAssetService,
                givenAssetType,
                givenInventoryID,
                imService,
                inventoryCreate);
            return(true);
        }
예제 #26
0
        public NpcAgent CreateNpc(UUID sceneid, UGUI owner, UGI group, string firstName, string lastName, Vector3 position, Notecard nc, NpcOptions options = NpcOptions.None)
        {
            SceneInterface   scene;
            AgentServiceList agentServiceList = m_NonpersistentAgentServices;

            if ((options & NpcOptions.Persistent) != NpcOptions.None)
            {
                if (m_NpcPresenceService == null)
                {
                    throw new InvalidOperationException("Persistence of NPCs not configured");
                }
                agentServiceList = m_PersistentAgentServices;
            }

            NpcPresenceServiceInterface presenceService  = agentServiceList.Get <NpcPresenceServiceInterface>();
            InventoryServiceInterface   inventoryService = agentServiceList.Get <InventoryServiceInterface>();

            var npcId = new UGUIWithName
            {
                ID        = UUID.Random,
                FirstName = firstName,
                LastName  = lastName
            };

            if (m_KnownScenes.TryGetValue(sceneid, out scene))
            {
                var agent = new NpcAgent(npcId, agentServiceList, sceneid)
                {
                    NpcOwner = owner,
                    Group    = group
                };
                try
                {
                    m_NpcAgents.Add(agent.ID, agent);
                    var npcInfo = new NpcPresenceInfo
                    {
                        RegionID = sceneid,
                        Npc      = agent.NamedOwner,
                        Owner    = agent.NpcOwner,
                        Group    = agent.Group,
                    };
                    inventoryService.CheckInventory(npcInfo.Npc.ID);
                    presenceService.Store(npcInfo);
                    agent.CurrentScene = scene;
                    agent.Position     = position;
                    scene.Add(agent);
                }
                catch
                {
                    if (m_NpcPresenceService != null)
                    {
                        presenceService.Remove(agent.ID);
                    }
                    inventoryService.Remove(agent.ID);
                    m_NpcAgents.Remove(agent.ID);
                    throw;
                }
                agent.EnableListen();

                scene.SendAgentObjectToAllAgents(agent);
                agent.SendAnimations();

                ThreadPool.QueueUserWorkItem(LoadAppearanceFromNotecardJob, new RebakeJob {
                    Notecard = nc, Agent = agent
                });
                return(agent);
            }

            throw new KeyNotFoundException("Scene not found");
        }
예제 #27
0
        public void Startup(ConfigurationLoader loader)
        {
            IConfig config = loader.Config.Configs[GetType().FullName];

            m_AssetService     = loader.GetService <AssetServiceInterface>(config.GetString("AssetService"));
            m_InventoryService = loader.GetService <InventoryServiceInterface>(config.GetString("InventoryService"));
            m_RootFolderID     = new UUID(config.GetString("RootFolderID"));
            m_AgentOwner       = new UGUI(config.GetString("Owner"));

            m_BakeEyesFilename  = config.GetString("BakeEyeFilename", string.Empty);
            m_BakeHeadFilename  = config.GetString("BakeHeadFilename", string.Empty);
            m_BakeUpperFilename = config.GetString("BakeUpperFilename", string.Empty);
            m_BakeLowerFilename = config.GetString("BakeLowerFilename", string.Empty);
            m_BakeHairFilename  = config.GetString("BakeHairFilename", string.Empty);
            m_BakeSkirtFilename = config.GetString("BakeSkirtFilename", string.Empty);

            m_ReferenceBakeEyesFilename  = config.GetString("ReferenceBakeEyeFilename", string.Empty);
            m_ReferenceBakeHeadFilename  = config.GetString("ReferenceBakeHeadFilename", string.Empty);
            m_ReferenceBakeUpperFilename = config.GetString("ReferenceBakeUpperFilename", string.Empty);
            m_ReferenceBakeLowerFilename = config.GetString("ReferenceBakeLowerFilename", string.Empty);
            m_ReferenceBakeHairFilename  = config.GetString("ReferenceBakeHairFilename", string.Empty);
            m_ReferenceBakeSkirtFilename = config.GetString("ReferenceBakeSkirtFilename", string.Empty);

            double tolerance = config.GetDouble("ReferenceBakeTolerance", 0);

            m_ReferenceBakeEyesTolerance  = config.GetDouble("ReferenceBakeEyesTolerance", tolerance);
            m_ReferenceBakeHeadTolerance  = config.GetDouble("ReferenceBakeHeadTolerance", tolerance);
            m_ReferenceBakeUpperTolerance = config.GetDouble("ReferenceBakeUpperTolerance", tolerance);
            m_ReferenceBakeLowerTolerance = config.GetDouble("ReferenceBakeLowerTolerance", tolerance);
            m_ReferenceBakeHairTolerance  = config.GetDouble("ReferenceBakeHairTolerance", tolerance);
            m_ReferenceBakeSkirtTolerance = config.GetDouble("ReferenceBakeSkirtTolerance", tolerance);

            if (config.Contains("ReferenceVisualParams"))
            {
                m_ReferenceVisualParams = Convert.FromBase64String(config.GetString("ReferenceVisualParams"));
            }

            foreach (string key in config.GetKeys())
            {
                UUID id;
                AvatarTextureIndex atIdx;
                if (key.StartsWith("Folder-") && UUID.TryParse(key.Substring(7), out id))
                {
                    m_InventoryFolders[id] = config.GetString(key);
                }
                else if (key.StartsWith("FolderParent-") && UUID.TryParse(key.Substring(13), out id))
                {
                    m_InventoryFolderParents[id] = new UUID(config.GetString(key));
                }
                else if (key.StartsWith("FolderType-") && UUID.TryParse(key.Substring(11), out id))
                {
                    m_InventoryFolderTypes[id] = (AssetType)config.GetInt(key);
                }
                else if (key.StartsWith("Item-") && UUID.TryParse(key.Substring(5), out id))
                {
                    m_InventoryFiles[id] = config.GetString(key);
                }
                else if (key.StartsWith("ItemParent-") && UUID.TryParse(key.Substring(11), out id))
                {
                    m_InventoryItemParents[id] = new UUID(config.GetString(key));
                }
                else if (key.StartsWith("ItemAssetID-") && UUID.TryParse(key.Substring(12), out id))
                {
                    m_InventoryItemAssetIDs[id] = new UUID(config.GetString(key));
                }
                else if (key.StartsWith("ItemIsLink-") && UUID.TryParse(key.Substring(11), out id))
                {
                    m_AssetLinkDescriptions[id] = config.GetString(key);
                }
                else if (key.StartsWith("Asset-") && UUID.TryParse(key.Substring(6), out id))
                {
                    m_AssetFiles[id] = config.GetString(key);
                }
                else if (key.StartsWith("ExpectedIdAt-") && Enum.TryParse(key.Substring(13), out atIdx))
                {
                    m_ExpectedTextureIDs[atIdx] = UUID.Parse(config.GetString(key));
                }
            }
        }
예제 #28
0
        protected static void HandleHttpRequest(HttpRequest httpreq, InventoryServiceInterface inventoryService, UUID agentID, UUID ownerID)
        {
            IValue o;

            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            try
            {
                o = LlsdXml.Deserialize(httpreq.Body);
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }

            var reqmap = o as Map;

            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            using (var res = httpreq.BeginResponse("application/llsd+xml"))
                using (var text = res.GetOutputStream().UTF8XmlTextWriter())
                {
                    var baditems = new List <UUID>();
                    text.WriteStartElement("llsd");
                    text.WriteStartElement("map");
                    text.WriteKeyValuePair("agent_id", agentID);
                    bool wroteheader = false;

                    foreach (var iv in (AnArray)reqmap["items"])
                    {
                        var itemmap = iv as Map;
                        if (itemmap == null)
                        {
                            continue;
                        }

                        if (!itemmap.ContainsKey("item_id"))
                        {
                            continue;
                        }
                        var           itemid = itemmap["item_id"].AsUUID;
                        InventoryItem item;
                        if (itemid == UUID.Zero)
                        {
                            baditems.Add(itemid);
                            continue;
                        }
                        try
                        {
                            item = inventoryService.Item[ownerID, itemid];
                        }
                        catch
                        {
                            baditems.Add(itemid);
                            continue;
                        }
                        if (!wroteheader)
                        {
                            wroteheader = true;
                            text.WriteNamedValue("key", "items");
                            text.WriteStartElement("array");
                        }
                        text.WriteStartElement("map");
                        WriteInventoryItem(item, text, agentID);
                        text.WriteEndElement();
                    }
                    if (wroteheader)
                    {
                        text.WriteEndElement();
                    }
                    if (baditems.Count != 0)
                    {
                        text.WriteStartElement("key");
                        text.WriteValue("bad_items");
                        text.WriteEndElement();
                        text.WriteStartElement("array");
                        foreach (var id in baditems)
                        {
                            text.WriteNamedValue("uuid", id);
                        }
                        text.WriteEndElement();
                    }
                    text.WriteEndElement();
                    text.WriteEndElement();
                }
        }
        protected static void HandleHttpRequest(HttpRequest httpreq, InventoryServiceInterface inventoryService, UUID agentID, UUID requestingOwnerID)
        {
            IValue o;

            if (httpreq.Method != "POST")
            {
                httpreq.ErrorResponse(HttpStatusCode.MethodNotAllowed, "Method not allowed");
                return;
            }

            try
            {
                o = LlsdXml.Deserialize(httpreq.Body);
            }
            catch (Exception e)
            {
                m_Log.WarnFormat("Invalid LLSD_XML: {0} {1}", e.Message, e.StackTrace);
                httpreq.ErrorResponse(HttpStatusCode.UnsupportedMediaType, "Unsupported Media Type");
                return;
            }

            var reqmap = o as Map;

            if (reqmap == null)
            {
                httpreq.ErrorResponse(HttpStatusCode.BadRequest, "Misformatted LLSD-XML");
                return;
            }

            using (var res = httpreq.BeginResponse("application/llsd+xml"))
            {
                using (var text = res.GetOutputStream().UTF8XmlTextWriter())
                {
                    var badfolders = new Dictionary <UUID, string>();
                    text.WriteStartElement("llsd");
                    text.WriteStartElement("map");
                    var wroteheader = false;

                    var folderRequests = new Dictionary <UUID, List <Map> >();

                    var foldersreqarray = (AnArray)reqmap["folders"];
                    foreach (var iv1 in foldersreqarray)
                    {
                        var itemmap = iv1 as Map;
                        if (itemmap == null)
                        {
                            continue;
                        }

                        if (!itemmap.ContainsKey("folder_id") ||
                            !itemmap.ContainsKey("fetch_folders") ||
                            !itemmap.ContainsKey("fetch_items"))
                        {
                            continue;
                        }
                        var ownerid = itemmap["owner_id"].AsUUID;
                        if (!folderRequests.ContainsKey(ownerid))
                        {
                            folderRequests[ownerid] = new List <Map>();
                        }
                        folderRequests[ownerid].Add(itemmap);
                    }

                    var folderContents = new Dictionary <UUID, Dictionary <UUID, InventoryFolderContent> >();
                    foreach (var req in folderRequests)
                    {
                        var list = new List <UUID>();
                        foreach (var fm in req.Value)
                        {
                            if (fm["folder_id"].AsUUID != UUID.Zero && !list.Contains(fm["folder_id"].AsUUID))
                            {
                                list.Add(fm["folder_id"].AsUUID);
                            }
                        }
                        try
                        {
                            foreach (var folderContent in inventoryService.Folder.Content[requestingOwnerID, list.ToArray()])
                            {
                                if (!folderContents.ContainsKey(req.Key))
                                {
                                    folderContents.Add(req.Key, new Dictionary <UUID, InventoryFolderContent>());
                                }
                                folderContents[req.Key][folderContent.FolderID] = folderContent;
                            }
                        }
                        catch
                        {
                            /* no action required */
                        }
                    }

                    foreach (var iv in foldersreqarray)
                    {
                        var itemmap = iv as Map;
                        if (iv == null)
                        {
                            continue;
                        }

                        if (!itemmap.ContainsKey("folder_id") ||
                            !itemmap.ContainsKey("fetch_folders") ||
                            !itemmap.ContainsKey("fetch_items"))
                        {
                            continue;
                        }

                        var  folderid      = itemmap["folder_id"].AsUUID;
                        var  ownerid       = itemmap["owner_id"].AsUUID;
                        bool fetch_folders = itemmap["fetch_folders"].AsBoolean;
                        bool fetch_items   = itemmap["fetch_items"].AsBoolean;

                        if (folderContents.ContainsKey(ownerid))
                        {
                            if (folderContents[ownerid].ContainsKey(folderid))
                            {
                                var fc = folderContents[ownerid][folderid];
                                if (!wroteheader)
                                {
                                    wroteheader = true;
                                    text.WriteNamedValue("key", "folders");
                                    text.WriteStartElement("array");
                                }

                                WriteInventoryFolderContent(text, fc, fetch_folders, fetch_items, agentID);
                            }
                            else if (!badfolders.ContainsKey(folderid))
                            {
                                badfolders.Add(folderid, "Not found");
                            }
                        }
                        else if (!badfolders.ContainsKey(folderid))
                        {
                            badfolders.Add(folderid, "Not found");
                        }
                    }
                    if (wroteheader)
                    {
                        text.WriteEndElement();
                    }
                    if (badfolders.Count != 0)
                    {
                        text.WriteNamedValue("key", "bad_folders");
                        text.WriteStartElement("array");
                        foreach (KeyValuePair <UUID, string> id in badfolders)
                        {
                            text.WriteStartElement("map");
                            text.WriteNamedValue("folder_id", id.Key);
                            text.WriteNamedValue("error", id.Value);
                            text.WriteEndElement();
                        }
                        text.WriteEndElement();
                    }
                    text.WriteEndElement();
                    text.WriteEndElement();
                }
            }
        }
예제 #30
0
        public static void StartTransfer(
            UUID transactionID,
            UGUI dstAgent,
            UserAgentServiceInterface dstUserAgentService,
            InventoryServiceInterface dstInventoryService,
            AssetServiceInterface dstAssetService,
            UGUIWithName srcAgent,
            UserAgentServiceInterface srcUserAgentService,
            InventoryServiceInterface srcInventoryService,
            AssetServiceInterface srcAssetService,
            AssetType givenAssetType,
            UUID givenInventoryID,
            IMServiceInterface imService,
            Action <UUID> inventoryCreate = null)
        {
            if (dstUserAgentService == null)
            {
                throw new ArgumentNullException(nameof(dstUserAgentService));
            }

            if (dstInventoryService == null)
            {
                throw new ArgumentNullException(nameof(dstInventoryService));
            }

            if (dstAssetService == null)
            {
                throw new ArgumentNullException(nameof(dstAssetService));
            }

            if (srcInventoryService == null)
            {
                throw new ArgumentNullException(nameof(srcInventoryService));
            }

            if (srcAssetService == null)
            {
                throw new ArgumentNullException(nameof(srcAssetService));
            }

            if (imService == null)
            {
                throw new ArgumentNullException(nameof(imService));
            }

            if (srcUserAgentService != null && srcUserAgentService.SupportsInventoryTransfer)
            {
                srcUserAgentService.InitiateInventoryTransfer(dstAgent, srcAgent, givenAssetType, givenInventoryID, transactionID);
                return;
            }

            if (givenAssetType == AssetType.Folder)
            {
                InventoryFolder folder;
#if DEBUG
                m_Log.DebugFormat("Sending folder {0} from {1} to {2}", givenInventoryID, srcAgent, dstAgent);
#endif
                if (srcInventoryService.Folder.TryGetValue(srcAgent.ID, givenInventoryID, out folder))
                {
                    /* this has a whole bunch of such entries, but later only the first 17 bytes are kept and adjusted */
                    var assetids = new List <UUID>();
                    TransferInventoryFolder transferFolder = GetTree(srcInventoryService, folder, assetids);
                    if (transferFolder != null)
                    {
                        new InventoryTransferWorkItem(
                            transactionID,
                            dstAgent,
                            dstUserAgentService,
                            dstInventoryService,
                            dstAssetService,
                            srcAgent,
                            srcInventoryService,
                            srcAssetService,
                            assetids,
                            transferFolder,
                            imService,
                            inventoryCreate).QueueWorkItem();
                    }
                }
                else
                {
#if DEBUG
                    m_Log.DebugFormat("Sending folder {0} from {1} to {2}: Not found", givenInventoryID, srcAgent, dstAgent);
#endif
                }
            }
            else
            {
#if DEBUG
                m_Log.DebugFormat("Sending item {0} from {1} to {2}", givenInventoryID, srcAgent, dstAgent);
#endif
                /* just some item */
                InventoryItem item;
                if (srcInventoryService.Item.TryGetValue(srcAgent.ID, givenInventoryID, out item) &&
                    item.AssetType != AssetType.Link && item.AssetType != AssetType.LinkFolder &&
                    item.CheckPermissions(srcAgent, UGI.Unknown, InventoryPermissionsMask.Transfer))
                {
                    new InventoryTransferWorkItem(
                        transactionID,
                        dstAgent,
                        dstUserAgentService,
                        dstInventoryService,
                        dstAssetService,
                        srcAgent,
                        srcInventoryService,
                        dstAssetService,
                        item.AssetID,
                        item,
                        imService,
                        inventoryCreate).QueueWorkItem();
                }
                else
                {
#if DEBUG
                    m_Log.DebugFormat("Sending item {0} from {1} to {2}: Not found", givenInventoryID, srcAgent, dstAgent);
#endif
                }
            }
        }