Commit 3f067a1d authored by Daniel Henninger's avatar Daniel Henninger Committed by dhenninger

[GATE-7] Added support for access restrictions (during new registrations).

Added another index to restrictions table.

git-svn-id: http://svn.igniterealtime.org/svn/repos/wildfire/trunk@6295 b35dd754-fafc-0310-a699-88a17e54d16e
parent b2f655c4
...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions ( ...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR(50) groupname VARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2); INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2);
...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions ( ...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR(50) groupname VARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2); INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2);
...@@ -25,7 +25,8 @@ CREATE TABLE gatewayRestrictions ( ...@@ -25,7 +25,8 @@ CREATE TABLE gatewayRestrictions (
transportType VARCHAR(15) NOT NULL, transportType VARCHAR(15) NOT NULL,
username VARCHAR(255), username VARCHAR(255),
groupname VARCHAR(50), groupname VARCHAR(50),
INDEX gatewayRstr_ttype_idx(transportType) INDEX gatewayRstr_ttype_idx(transportType),
INDEX gatewayRstr_uname_idx(username)
); );
INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2); INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2);
...@@ -27,6 +27,7 @@ CREATE TABLE gatewayRestrictions ( ...@@ -27,6 +27,7 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR2(50) groupname VARCHAR2(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2); INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2);
......
...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions ( ...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR(50) groupname VARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2); INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2);
...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions ( ...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions (
groupname NVARCHAR(50) groupname NVARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2); INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2);
...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions ( ...@@ -27,5 +27,6 @@ CREATE TABLE gatewayRestrictions (
groupname NVARCHAR(50) groupname NVARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2); INSERT INTO jiveVersion (name, version) VALUES ('gateway', 2);
...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions ( ...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR(50) groupname VARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
-- Update database version -- Update database version
UPDATE jiveVersion SET version = 2 WHERE name = 'gateway'; UPDATE jiveVersion SET version = 2 WHERE name = 'gateway';
...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions ( ...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR(50) groupname VARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
// Update database version // Update database version
UPDATE jiveVersion SET version = 2 WHERE name = 'gateway'; UPDATE jiveVersion SET version = 2 WHERE name = 'gateway';
...@@ -3,7 +3,8 @@ CREATE TABLE gatewayRestrictions ( ...@@ -3,7 +3,8 @@ CREATE TABLE gatewayRestrictions (
transportType VARCHAR(15) NOT NULL, transportType VARCHAR(15) NOT NULL,
username VARCHAR(255), username VARCHAR(255),
groupname VARCHAR(50), groupname VARCHAR(50),
INDEX gatewayRstr_ttype_idx(transportType) INDEX gatewayRstr_ttype_idx(transportType),
INDEX gatewayRstr_uname_idx(username)
); );
# Update database version # Update database version
......
...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions ( ...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR2(50) groupname VARCHAR2(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
-- Update database version -- Update database version
UPDATE jiveVersion SET version = 2 WHERE name = 'gateway'; UPDATE jiveVersion SET version = 2 WHERE name = 'gateway';
......
...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions ( ...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions (
groupname VARCHAR(50) groupname VARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
-- Update database version -- Update database version
UPDATE jiveVersion SET version = 2 WHERE name = 'gateway'; UPDATE jiveVersion SET version = 2 WHERE name = 'gateway';
...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions ( ...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions (
groupname NVARCHAR(50) groupname NVARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
/* Update database version */ /* Update database version */
UPDATE jiveVersion SET version = 2 WHERE name = 'gateway'; UPDATE jiveVersion SET version = 2 WHERE name = 'gateway';
...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions ( ...@@ -5,6 +5,7 @@ CREATE TABLE gatewayRestrictions (
groupname NVARCHAR(50) groupname NVARCHAR(50)
); );
CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType); CREATE INDEX gatewayRstr_ttype_idx ON gatewayRestrictions (transportType);
CREATE INDEX gatewayRstr_uname_idx ON gatewayRestrictions (username);
/* Update database version */ /* Update database version */
UPDATE jiveVersion SET version = 2 WHERE name = 'gateway'; UPDATE jiveVersion SET version = 2 WHERE name = 'gateway';
...@@ -82,6 +82,12 @@ public abstract class BaseTransport implements Component, RosterEventListener { ...@@ -82,6 +82,12 @@ public abstract class BaseTransport implements Component, RosterEventListener {
*/ */
public final RegistrationManager registrationManager = new RegistrationManager(); public final RegistrationManager registrationManager = new RegistrationManager();
/**
* Manages permission information.
* @see org.jivesoftware.wildfire.gateway.PermissionManager
*/
public final PermissionManager permissionManager = new PermissionManager();
/** /**
* JID of the transport in question. * JID of the transport in question.
*/ */
...@@ -259,7 +265,6 @@ public abstract class BaseTransport implements Component, RosterEventListener { ...@@ -259,7 +265,6 @@ public abstract class BaseTransport implements Component, RosterEventListener {
session = this.registrationLoggedIn(registration, from, getPresenceType(packet), packet.getStatus(), packet.getPriority()); session = this.registrationLoggedIn(registration, from, getPresenceType(packet), packet.getStatus(), packet.getPriority());
sessionManager.storeSession(from, session); sessionManager.storeSession(from, session);
} }
} }
else if (packet.getType() == Presence.Type.unavailable) { else if (packet.getType() == Presence.Type.unavailable) {
...@@ -558,6 +563,21 @@ public abstract class BaseTransport implements Component, RosterEventListener { ...@@ -558,6 +563,21 @@ public abstract class BaseTransport implements Component, RosterEventListener {
} }
if (packet.getType() == IQ.Type.set) { if (packet.getType() == IQ.Type.set) {
Boolean registered = false;
Collection<Registration> registrations = registrationManager.getRegistrations(from, this.transportType);
if (registrations.iterator().hasNext()) {
registered = true;
}
if (!registered && !permissionManager.hasAccess(this.transportType, from)) {
// User does not have permission to register with transport.
// We want to allow them to change settings if they are already registered.
IQ result = IQ.createResultIQ(packet);
result.setError(Condition.bad_request);
reply.add(result);
return reply;
}
Element userEl = packet.getChildElement().element("username"); Element userEl = packet.getChildElement().element("username");
Element passEl = packet.getChildElement().element("password"); Element passEl = packet.getChildElement().element("password");
Element nickEl = packet.getChildElement().element("nick"); Element nickEl = packet.getChildElement().element("nick");
...@@ -642,6 +662,14 @@ public abstract class BaseTransport implements Component, RosterEventListener { ...@@ -642,6 +662,14 @@ public abstract class BaseTransport implements Component, RosterEventListener {
registered = true; registered = true;
} }
if (!registered && !permissionManager.hasAccess(this.transportType, from)) {
// User does not have permission to register with transport.
// We want to allow them to change settings if they are already registered.
result.setError(Condition.bad_request);
reply.add(result);
return reply;
}
DataForm form = new DataForm(DataForm.Type.form); DataForm form = new DataForm(DataForm.Type.form);
form.addInstruction(getTerminologyRegistration()); form.addInstruction(getTerminologyRegistration());
......
...@@ -10,6 +10,20 @@ ...@@ -10,6 +10,20 @@
package org.jivesoftware.wildfire.gateway; package org.jivesoftware.wildfire.gateway;
import org.xmpp.packet.JID;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.Log;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.wildfire.group.GroupManager;
import org.jivesoftware.wildfire.group.Group;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
/** /**
* Registration Permissions Manager * Registration Permissions Manager
* *
...@@ -21,4 +35,69 @@ package org.jivesoftware.wildfire.gateway; ...@@ -21,4 +35,69 @@ package org.jivesoftware.wildfire.gateway;
*/ */
public class PermissionManager { public class PermissionManager {
private static final String IS_USER_LISTED =
"SELECT count(*) FROM gatewayRestrictions WHERE transportType=? AND username=?";
private static final String GROUPS_LISTED =
"SELECT groupname FROM gatewayRestrictions WHERE transportType=?";
public boolean hasAccess(TransportType type, JID jid) {
int setting = JiveGlobals.getIntProperty("plugin.gateway."+type.toString()+".registration", 1);
if (setting == 1) { return true; }
if (setting == 3) { return false; }
if (isUserAllowed(type, jid)) { return true; }
if (isUserInAllowedGroup(type, jid)) { return true; }
return false;
}
public boolean isUserAllowed(TransportType type, JID jid) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(IS_USER_LISTED);
pstmt.setString(1, type.toString());
pstmt.setString(2, jid.getNode());
rs = pstmt.executeQuery();
rs.next();
return (rs.getInt(1) > 1);
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return false;
}
public boolean isUserInAllowedGroup(TransportType type, JID jid) {
ArrayList<String> allowedGroups = new ArrayList<String>();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(GROUPS_LISTED);
pstmt.setString(1, type.toString());
rs = pstmt.executeQuery();
while (rs.next()) {
allowedGroups.add(rs.getString(1));
}
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
Collection<Group> userGroups = GroupManager.getInstance().getGroups(jid);
for (Group g : userGroups) {
if (allowedGroups.contains(g.getName())) {
return true;
}
}
return false;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment