Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
Openfire
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Openfire
Commits
4b98b442
Commit
4b98b442
authored
Mar 08, 2018
by
Guus der Kinderen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
OF-1496: Store providers, rather than their provided data.
parent
4093e410
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
100 additions
and
38 deletions
+100
-38
IQDiscoInfoHandler.java
...a/org/jivesoftware/openfire/disco/IQDiscoInfoHandler.java
+100
-38
No files found.
src/java/org/jivesoftware/openfire/disco/IQDiscoInfoHandler.java
View file @
4b98b442
...
@@ -69,26 +69,42 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
...
@@ -69,26 +69,42 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
private
Map
<
String
,
DiscoInfoProvider
>
entities
=
new
HashMap
<>();
private
Map
<
String
,
DiscoInfoProvider
>
entities
=
new
HashMap
<>();
private
Set
<
String
>
localServerFeatures
=
new
CopyOnWriteArraySet
<>();
private
Set
<
String
>
localServerFeatures
=
new
CopyOnWriteArraySet
<>();
private
Cache
<
String
,
Set
<
NodeID
>>
serverFeatures
;
private
Cache
<
String
,
Set
<
NodeID
>>
serverFeatures
;
private
List
<
Element
>
serverIdentitie
s
=
new
ArrayList
<>();
private
List
<
ServerIdentitiesProvider
>
serverIdentityProvider
s
=
new
ArrayList
<>();
private
Map
<
String
,
DiscoInfoProvider
>
serverNodeProviders
=
new
ConcurrentHashMap
<>();
private
Map
<
String
,
DiscoInfoProvider
>
serverNodeProviders
=
new
ConcurrentHashMap
<>();
private
IQHandlerInfo
info
;
private
IQHandlerInfo
info
;
private
List
<
Element
>
anonymousUserIdentitie
s
=
new
ArrayList
<>();
private
List
<
UserIdentitiesProvider
>
anonymousUserIdentityProvider
s
=
new
ArrayList
<>();
private
List
<
Element
>
registeredUserIdentitie
s
=
new
ArrayList
<>();
private
List
<
UserIdentitiesProvider
>
registeredUserIdentityProvider
s
=
new
ArrayList
<>();
public
IQDiscoInfoHandler
()
{
public
IQDiscoInfoHandler
()
{
super
(
"XMPP Disco Info Handler"
);
super
(
"XMPP Disco Info Handler"
);
info
=
new
IQHandlerInfo
(
"query"
,
NAMESPACE_DISCO_INFO
);
info
=
new
IQHandlerInfo
(
"query"
,
NAMESPACE_DISCO_INFO
);
// Initialize the user identity and features collections (optimization to avoid creating
// the same objects for each response)
anonymousUserIdentityProviders
.
add
(
new
UserIdentitiesProvider
()
Element
userIdentity
=
DocumentHelper
.
createElement
(
"identity"
);
{
userIdentity
.
addAttribute
(
"category"
,
"account"
);
@Override
userIdentity
.
addAttribute
(
"type"
,
"anonymous"
);
public
Iterator
<
Element
>
getIdentities
()
anonymousUserIdentities
.
add
(
userIdentity
);
{
userIdentity
=
DocumentHelper
.
createElement
(
"identity"
);
final
Element
userIdentity
=
DocumentHelper
.
createElement
(
"identity"
);
userIdentity
.
addAttribute
(
"category"
,
"account"
);
userIdentity
.
addAttribute
(
"category"
,
"account"
);
userIdentity
.
addAttribute
(
"type"
,
"registered"
);
userIdentity
.
addAttribute
(
"type"
,
"anonymous"
);
registeredUserIdentities
.
add
(
userIdentity
);
return
Collections
.
singleton
(
userIdentity
).
iterator
();
}
}
);
registeredUserIdentityProviders
.
add
(
new
UserIdentitiesProvider
()
{
@Override
public
Iterator
<
Element
>
getIdentities
()
{
final
Element
userIdentity
=
DocumentHelper
.
createElement
(
"identity"
);
userIdentity
.
addAttribute
(
"category"
,
"account"
);
userIdentity
.
addAttribute
(
"type"
,
"registered"
);
return
Collections
.
singleton
(
userIdentity
).
iterator
();
}
}
);
}
}
@Override
@Override
...
@@ -258,27 +274,56 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
...
@@ -258,27 +274,56 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
}
}
/**
/**
* Adds the "discoverable" identities provided by the provider. This information will be used whenever a disco for
* Adds the "discoverable" identities provided by the provider whenever a disco for info is made against the server.
* info is made against the server.
*
*
* @param provider The provider of identities.
* @param provider The provider of identities.
*/
*/
public
void
addServerIdentitiesProvider
(
ServerIdentitiesProvider
provider
)
{
public
void
addServerIdentitiesProvider
(
ServerIdentitiesProvider
provider
)
{
for
(
Iterator
<
Element
>
it
=
provider
.
getIdentities
();
it
.
hasNext
();)
{
if
(
provider
==
null
)
serverIdentities
.
add
(
it
.
next
());
{
throw
new
NullPointerException
(
"Argument 'provider' cannot be null."
);
}
}
serverIdentityProviders
.
add
(
provider
);
}
}
/**
/**
* Adds the "discoverable" user identities provided by the provider. This information will be used whenever a disco
* Removes this provider of identities.
* for info is made against users of the server.
*
* @param provider The provider of identities.
*/
public
void
removeServerIdentitiesProvider
(
ServerIdentitiesProvider
provider
)
{
if
(
provider
==
null
)
{
throw
new
NullPointerException
(
"Argument 'provider' cannot be null."
);
}
serverIdentityProviders
.
remove
(
provider
);
}
/**
* Adds the "discoverable" user identities provided by the provider whenever a disco for info is made against users
* of the server.
*
*
* @param provider The provider of user identities.
* @param provider The provider of user identities.
*/
*/
public
void
addUserIdentitiesProvider
(
UserIdentitiesProvider
provider
)
{
public
void
addUserIdentitiesProvider
(
UserIdentitiesProvider
provider
)
{
for
(
Iterator
<
Element
>
it
=
provider
.
getIdentities
();
it
.
hasNext
();)
{
if
(
provider
==
null
)
registeredUserIdentities
.
add
(
it
.
next
()
);
{
throw
new
NullPointerException
(
"Argument 'provider' cannot be null."
);
}
}
registeredUserIdentityProviders
.
add
(
provider
);
}
/**
* Removes this provider of user identities.
*
* @param provider The provider of identities.
*/
public
void
removeUserIdentitiesProvider
(
UserIdentitiesProvider
provider
)
{
if
(
provider
==
null
)
{
throw
new
NullPointerException
(
"Argument 'provider' cannot be null."
);
}
registeredUserIdentityProviders
.
remove
(
provider
);
}
}
/**
/**
...
@@ -419,7 +464,6 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
...
@@ -419,7 +464,6 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
*/
*/
private
DiscoInfoProvider
getServerInfoProvider
()
{
private
DiscoInfoProvider
getServerInfoProvider
()
{
return
new
DiscoInfoProvider
()
{
return
new
DiscoInfoProvider
()
{
final
ArrayList
<
Element
>
identities
=
new
ArrayList
<>();
@Override
@Override
public
Iterator
<
Element
>
getIdentities
(
String
name
,
String
node
,
JID
senderJID
)
{
public
Iterator
<
Element
>
getIdentities
(
String
name
,
String
node
,
JID
senderJID
)
{
...
@@ -429,20 +473,20 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
...
@@ -429,20 +473,20 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
}
}
if
(
name
==
null
||
name
.
equals
(
XMPPServer
.
getInstance
().
getServerInfo
().
getXMPPDomain
()))
{
if
(
name
==
null
||
name
.
equals
(
XMPPServer
.
getInstance
().
getServerInfo
().
getXMPPDomain
()))
{
// Answer identity of the server
// Answer identity of the server
synchronized
(
identities
)
{
final
ArrayList
<
Element
>
identities
=
new
ArrayList
<>();
if
(
identities
.
isEmpty
())
{
final
Element
identity
=
DocumentHelper
.
createElement
(
"identity"
);
Element
identity
=
DocumentHelper
.
createElement
(
"identity
"
);
identity
.
addAttribute
(
"category"
,
"server
"
);
identity
.
addAttribute
(
"category"
,
"server"
);
identity
.
addAttribute
(
"name"
,
JiveGlobals
.
getProperty
(
"xmpp.server.name"
,
"Openfire Server"
)
);
identity
.
addAttribute
(
"name"
,
JiveGlobals
.
getProperty
(
identity
.
addAttribute
(
"type"
,
"im"
);
"xmpp.server.name"
,
"Openfire Server"
)
);
identities
.
add
(
identity
);
identity
.
addAttribute
(
"type"
,
"im"
);
// Include identities from modules that implement ServerIdentitiesProvider
identities
.
add
(
identity
);
for
(
ServerIdentitiesProvider
provider
:
serverIdentityProviders
)
{
// Include identities from modules that implement ServerIdentitiesProvider
final
Iterator
<
Element
>
iterator
=
provider
.
getIdentities
();
for
(
Element
identityElement
:
serverIdentities
)
{
while
(
iterator
.
hasNext
()
)
identities
.
add
(
identityElement
);
{
}
identities
.
add
(
iterator
.
next
()
);
}
}
}
}
return
identities
.
iterator
();
return
identities
.
iterator
();
...
@@ -453,12 +497,30 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
...
@@ -453,12 +497,30 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
else
{
else
{
if
(
SessionManager
.
getInstance
().
isAnonymousRoute
(
name
))
{
if
(
SessionManager
.
getInstance
().
isAnonymousRoute
(
name
))
{
// Answer identity of an anonymous user.
// Answer identity of an anonymous user.
return
anonymousUserIdentities
.
iterator
();
final
Set
<
Element
>
result
=
new
HashSet
<>();
for
(
final
UserIdentitiesProvider
provider
:
anonymousUserIdentityProviders
)
{
final
Iterator
<
Element
>
identities
=
provider
.
getIdentities
();
while
(
identities
.
hasNext
()
)
{
result
.
add
(
identities
.
next
()
);
}
}
return
result
.
iterator
();
}
}
else
{
else
{
// Answer identity of a registered user.
// Answer identity of a registered user.
// Note: We know that this user exists because #hasInfo returned true
// Note: We know that this user exists because #hasInfo returned true
return
registeredUserIdentities
.
iterator
();
final
Set
<
Element
>
result
=
new
HashSet
<>();
for
(
final
UserIdentitiesProvider
provider
:
registeredUserIdentityProviders
)
{
final
Iterator
<
Element
>
identities
=
provider
.
getIdentities
();
while
(
identities
.
hasNext
()
)
{
result
.
add
(
identities
.
next
()
);
}
}
return
result
.
iterator
();
}
}
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment