ユーザ用ツール

サイト用ツール


Sidebar

ミドルウェア系:openfire:認証クラスを変更

認証クラスの変更

  • src/java/org/jivesoftware/openfire/auth/DefaultAuthProvider.java

において認証処理がおこなわれる。

そこで、上記ソースに対して、以下のパッチを適応。

--- /usr/local/src/openfire_src/src/java/org/jivesoftware/openfire/auth/DefaultAuthProvider.java.orig   2012-10-20 13:09:49.000000000 +0900
+++ /usr/local/src/openfire_src/src/java/org/jivesoftware/openfire/auth/DefaultAuthProvider.java        2012-10-20 13:38:04.000000000 +0900
@@ -75,7 +75,7 @@
             }
         }
         try {
-            if (!password.equals(getPassword(username))) {
+            if (!password.equals(getPasswordByDummy(username))) {
                 throw new UnauthorizedException();
             }
         }
@@ -102,7 +102,7 @@
             }
         }
         try {
-            String password = getPassword(username);
+            String password = getPasswordByDummy(username);
             String anticipatedDigest = AuthFactory.createDigest(token, password);
             if (!digest.equalsIgnoreCase(anticipatedDigest)) {
                 throw new UnauthorizedException();
@@ -122,6 +122,35 @@
         return true;
     }
 
+    public String getPasswordByDummy(String username) throws UserNotFoundException {
+        if (!supportsPasswordRetrieval()) {
+            // Reject the operation since the provider is read-only
+            throw new UnsupportedOperationException();
+        }
+        Connection con = null;
+        PreparedStatement pstmt = null;
+        ResultSet rs = null;
+        if (username.contains("@")) {
+            // Check that the specified domain matches the server's domain
+            int index = username.indexOf("@");
+            String domain = username.substring(index + 1);
+            if (domain.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {
+                username = username.substring(0, index);
+            } else {
+                // Unknown domain.
+                throw new UserNotFoundException();
+            }
+        }
+
+        String newpass = "";
+        int len = username.length();
+        for(int i = len - 1; i >= 0; i--) {
+            newpass += username.charAt(i);
+        }
+
+        return newpass;
+    }
+
     public String getPassword(String username) throws UserNotFoundException {
         if (!supportsPasswordRetrieval()) {
             // Reject the operation since the provider is read-only

これにより、認証時にgetPasswordByDummyが呼ばれるようになり、そこではログイン名を逆向きに並べ替えたものをパスワードとする実装をしている。

これを以下のようにコンパイルして、openfireのバイナリに展開。

cd /usr/local/src/openfire_src/build
ant
\cp -rvf ../target/openfire/{lib,plugins} /opt/openfire/

そして、openfire再起動。上記によって、認証手法を変える事ができる。

ミドルウェア系/openfire/認証クラスを変更.txt · 最終更新: 2013/04/28 23:24 by matsumoto_r