Changeset 5dc487d6f8fa08760e5156f406bf9475a1f8ce56

Show
Ignore:
Timestamp:
05/12/08 12:19:17 (2 months ago)
Author:
Christopher Jung <bktheg@web.de>
git-committer:
Christopher Jung <bktheg@web.de> 1210587557 +0200
git-parent:

[ea1ac253acd3a04e25eff3bef4e2b888430eee2b]

git-author:
Christopher Jung <bktheg@web.de> 1210587557 +0200
Message:

[ref] Authentifizieren der Session in den AuthenticationManager? verschoben

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/net/driftingsouls/ds2/server/framework/BasicContext.java

    r3b915f2 r5dc487d  
    2525import java.util.Map; 
    2626 
     27import net.driftingsouls.ds2.server.framework.authentication.DefaultAuthenticationManager; 
    2728import net.driftingsouls.ds2.server.framework.db.Database; 
    2829import net.driftingsouls.ds2.server.framework.db.HibernateFacade; 
     
    3132import net.driftingsouls.ds2.server.framework.pipeline.Response; 
    3233 
    33 import org.apache.commons.lang.math.RandomUtils; 
    3434import org.hibernate.Transaction; 
    3535 
     
    5050        private Map<Class<?>, Object> contextSingletons = new HashMap<Class<?>,Object>(); 
    5151        private Map<Class<?>, Map<String,Object>> variables = new HashMap<Class<?>, Map<String, Object>>(); 
    52         private String currentSession = ""; 
    5352        private List<ContextListener> listener = new ArrayList<ContextListener>(); 
    5453        private org.hibernate.Session session; 
    5554        private Transaction transaction; 
    56          
    57         private static String[] actionBlockingPhrases = { 
    58                 "Immer mit der Ruhe!\nDer arme Server ist schon total erschl&ouml;pft.\nG&ouml;nn ihm mal ein oder zwei Minuten Pause :)", 
    59                 "Laaaaangsaaaaam!\nDeine Maus hat ja schon nen Krampf von dem vielen geklicke bekommen!\nMach mal eine kleine Pause und g&ouml;nn ihr die Entspannung...", 
    60                 "In der Ruhe liegt die Kraft!\nNur der arme Server hat wegen deiner Klickerei keine Ruhe und somit auch keine Kraft mehr. Lass ihm eine kleine Verschnaufpause und mach dann weiter.", 
    61                 "Vorsicht mein junger Padawan!\nBei diesem Klicktempo k&ouml;nntest du aus versehen auf den Selbstzerst&ouml;rungsknopf dr&uuml;cken! Mach eine kurze Pause und klicke dann langsam und gewissenhaft weiter..." 
    62         }; 
    6355         
    6456        /** 
     
    8375        } 
    8476         
    85         private void authenticateUser() { 
    86                 String sess = request.getParameter("sess"); 
    87                 currentSession = sess; 
    88                  
    89                 String errorurl = Configuration.getSetting("URL")+"ds?module=portal&action=login"; 
    90          
    91                 if( (sess == null) || sess.equals("") ) { 
    92                         return; 
    93                 } 
    94                  
    95                 long time = Common.time(); 
    96                 Session sessdata = (Session)getDB().get(Session.class, sess); 
    97                  
    98                 if( sessdata == null ) { 
    99                         addError( "Sie sind offenbar nicht eingeloggt", errorurl ); 
    100  
    101                         return; 
    102                 } 
    103  
    104                 if( sessdata.getTick() ) { 
    105                         addError( "Im Moment werden einige Tick-Berechnungen f&uuml;r sie durchgef&uuml;hrt. Bitte haben sie daher ein wenig Geduld",  
    106                                         getRequest().getRequestURL() +  
    107                                                 (getRequest().getQueryString() != null ? "?" + getRequest().getQueryString() : "")  
    108                         ); 
    109  
    110                         return; 
    111                 } 
    112          
    113                 BasicUser user = sessdata.getUser(); 
    114                 user.setSessionData(sessdata); 
    115                 if( !user.hasFlag(BasicUser.FLAG_DISABLE_IP_SESSIONS) && !sessdata.isValidIP(getRequest().getRemoteAddress()) ) { 
    116                         addError( "Diese Session ist einer anderen IP zugeordnet", errorurl ); 
    117  
    118                         return; 
    119                 } 
    120          
    121                 if( !user.hasFlag(BasicUser.FLAG_DISABLE_AUTO_LOGOUT) && (Common.time() - sessdata.getLastAction() > Configuration.getIntSetting("AUTOLOGOUT_TIME")) ) { 
    122                         getDB().delete(sessdata); 
    123                         addError( "Diese Session ist bereits abgelaufen", errorurl ); 
    124  
    125                         return; 
    126                 } 
    127                  
    128                 final long oldtime = sessdata.getLastAction(); 
    129                  
    130                 sessdata.setLastAction(time); 
    131                 commit(); 
    132                  
    133                 if( !user.hasFlag(BasicUser.FLAG_NO_ACTION_BLOCKING) ) { 
    134                         // Alle 1.5 Sekunden Counter um 1 reduzieren, sofern mindestens 5 Sekunden Pause vorhanden waren 
    135                         int reduce = (int)((time - oldtime)/1.5); 
    136                         if( time < oldtime + 5 ) { 
    137                                 reduce = -1; 
    138                         } 
    139                         int actioncounter = sessdata.getActionCounter()-reduce; 
    140                         if( actioncounter < 0 ) { 
    141                                 actioncounter = 0; 
    142                         } 
    143  
    144                         if( reduce > 0 ) { 
    145                                 final int value = sessdata.getActionCounter() - reduce; 
    146                                  
    147                                 sessdata.setActionCounter(value > 0 ? value : 0); 
    148                         } 
    149                         else if( reduce < 0 ) { 
    150                                 sessdata.setActionCounter(sessdata.getActionCounter()+1); 
    151                         } 
    152                          
    153                         int sleep = -1; 
    154                          
    155                         // Bei viel zu hoher Aktivitaet einfach die Ausfuehrung mit einem Fehler beenden 
    156                         if( actioncounter >= 35 ) { 
    157                                 addError( actionBlockingPhrases[RandomUtils.nextInt(actionBlockingPhrases.length)], 
    158                                                 getRequest().getRequestURL() +  
    159                                                 (getRequest().getQueryString() != null ? "?" + getRequest().getQueryString() : "") ); 
    160                                  
    161                                 return; 
    162                         } 
    163                         // Bei hoher Aktivitaet stattdessen nur eine Pause einlegen 
    164                         else if( actioncounter > 10 ) { 
    165                                 sleep = 100 * actioncounter; 
    166                         } 
    167                          
    168                         if( sleep > 0 ) { 
    169                                 try { 
    170                                         Thread.sleep(2500); 
    171                                 } 
    172                                 catch( InterruptedException e ) { 
    173                                         LOG.error(e,e); 
    174                                 } 
    175                         } 
    176                 } 
    177  
    178                 // Inaktivitaet zuruecksetzen 
    179                 user.setInactivity(0); 
    180                  
    181                 if( (sessdata.getAttach() != null) && !sessdata.getAttach().equals("-1") ) { 
    182                         Session attachSession = (Session)getDB().get(Session.class, sessdata.getAttach()); 
    183                         if( attachSession != null) { 
    184                                 user.attachToUser(attachSession.getUser());      
    185                         } 
    186                 } 
    187                  
    188                 setActiveUser(user); 
    189                  
    190                 return; 
    191         } 
    192          
    19377        public void revalidate() { 
    194                 if( (currentSession == null && request.getParameter("sess") != null) ||  
    195                         (currentSession != null && !currentSession.equals(request.getParameter("sess"))) ) { 
     78                if( this.activeUser == null ) { 
    19679                        errorList.clear(); 
    197                         authenticateUser(); 
     80                        new DefaultAuthenticationManager() 
     81                                .authenticateCurrentSession(); 
    19882                } 
    19983        } 
  • src/net/driftingsouls/ds2/server/framework/authentication/AuthenticationManager.java

    r47cd40b r5dc487d  
    5454         */ 
    5555        public Session adminLogin(BasicUser user, boolean attach) throws AuthenticationException; 
     56 
     57        /** 
     58         * Authentifiziert die genutzte Session. Falls die Session ungueltig ist, 
     59         * oder ein sonstiger Fehler auftritt wird ein entsprechender Fehlertext dem  
     60         * Context hinzugefuegt. 
     61         */ 
     62        public void authenticateCurrentSession(); 
    5663} 
  • src/net/driftingsouls/ds2/server/framework/authentication/DefaultAuthenticationManager.java

    r47cd40b r5dc487d  
    2323import net.driftingsouls.ds2.server.framework.BasicUser; 
    2424import net.driftingsouls.ds2.server.framework.Common; 
     25import net.driftingsouls.ds2.server.framework.Configuration; 
    2526import net.driftingsouls.ds2.server.framework.Context; 
    2627import net.driftingsouls.ds2.server.framework.ContextMap; 
     
    2930import net.driftingsouls.ds2.server.framework.pipeline.Request; 
    3031 
     32import org.apache.commons.lang.math.RandomUtils; 
     33import org.apache.commons.logging.Log; 
     34import org.apache.commons.logging.LogFactory; 
     35 
    3136/** 
    3237 * Verwaltungsklasse fuer Aktionen rund um das ein- und ausloggen. 
     
    3540 */ 
    3641public class DefaultAuthenticationManager implements AuthenticationManager { 
    37         private static ServiceLoader<LoginEventListener> listenerList = ServiceLoader.load(LoginEventListener.class); 
     42        private static final Log log = LogFactory.getLog(DefaultAuthenticationManager.class); 
     43        private static final ServiceLoader<LoginEventListener> listenerList = ServiceLoader.load(LoginEventListener.class); 
     44         
     45        private static final String[] actionBlockingPhrases = { 
     46                "Immer mit der Ruhe!\nDer arme Server ist schon total erschl&ouml;pft.\nG&ouml;nn ihm mal ein oder zwei Minuten Pause :)", 
     47                "Laaaaangsaaaaam!\nDeine Maus hat ja schon nen Krampf von dem vielen geklicke bekommen!\nMach mal eine kleine Pause und g&ouml;nn ihr die Entspannung...", 
     48                "In der Ruhe liegt die Kraft!\nNur der arme Server hat wegen deiner Klickerei keine Ruhe und somit auch keine Kraft mehr. Lass ihm eine kleine Verschnaufpause und mach dann weiter.", 
     49                "Vorsicht mein junger Padawan!\nBei diesem Klicktempo k&ouml;nntest du aus versehen auf den Selbstzerst&ouml;rungsknopf dr&uuml;cken! Mach eine kurze Pause und klicke dann langsam und gewissenhaft weiter..." 
     50        }; 
    3851         
    3952        public Session login(String username, String password, boolean useGfxPak) throws AuthenticationException { 
     
    141154                return session; 
    142155        } 
     156         
     157        public void authenticateCurrentSession() { 
     158                Context context = ContextMap.getContext(); 
     159                 
     160                Request request = context.getRequest(); 
     161                org.hibernate.Session db = context.getDB(); 
     162                 
     163                String sess = request.getParameter("sess"); 
     164                 
     165                String errorurl = Configuration.getSetting("URL")+"ds?module=portal&action=login"; 
     166         
     167                if( (sess == null) || sess.equals("") ) { 
     168                        return; 
     169                } 
     170                 
     171                long time = Common.time(); 
     172                Session sessdata = (Session)db.get(Session.class, sess); 
     173                 
     174                if( sessdata == null ) { 
     175                        context.addError( "Sie sind offenbar nicht eingeloggt", errorurl ); 
     176 
     177                        return; 
     178                } 
     179 
     180                if( sessdata.getTick() ) { 
     181                        context.addError( "Im Moment werden einige Tick-Berechnungen f&uuml;r sie durchgef&uuml;hrt. Bitte haben sie daher ein wenig Geduld",  
     182                                        request.getRequestURL() +  
     183                                                (request.getQueryString() != null ? "?" + request.getQueryString() : "")  
     184                        ); 
     185 
     186                        return; 
     187                } 
     188         
     189                BasicUser user = sessdata.getUser(); 
     190                user.setSessionData(sessdata); 
     191                if( !user.hasFlag(BasicUser.FLAG_DISABLE_IP_SESSIONS) && !sessdata.isValidIP(request.getRemoteAddress()) ) { 
     192                        context.addError( "Diese Session ist einer anderen IP zugeordnet", errorurl ); 
     193 
     194                        return; 
     195                } 
     196         
     197                if( !user.hasFlag(BasicUser.FLAG_DISABLE_AUTO_LOGOUT) && (Common.time() - sessdata.getLastAction() > Configuration.getIntSetting("AUTOLOGOUT_TIME")) ) { 
     198                        db.delete(sessdata); 
     199                        context.addError( "Diese Session ist bereits abgelaufen", errorurl ); 
     200 
     201                        return; 
     202                } 
     203                 
     204                final long oldtime = sessdata.getLastAction(); 
     205                 
     206                sessdata.setLastAction(time); 
     207                context.commit(); 
     208                 
     209                if( !user.hasFlag(BasicUser.FLAG_NO_ACTION_BLOCKING) ) { 
     210                        // Alle 1.5 Sekunden Counter um 1 reduzieren, sofern mindestens 5 Sekunden Pause vorhanden waren 
     211                        int reduce = (int)((time - oldtime)/1.5); 
     212                        if( time < oldtime + 5 ) { 
     213                                reduce = -1; 
     214                        } 
     215                        int actioncounter = sessdata.getActionCounter()-reduce; 
     216                        if( actioncounter < 0 ) { 
     217                                actioncounter = 0; 
     218                        } 
     219 
     220                        if( reduce > 0 ) { 
     221                                final int value = sessdata.getActionCounter() - reduce; 
     222                                 
     223                                sessdata.setActionCounter(value > 0 ? value : 0); 
     224                        } 
     225                        else if( reduce < 0 ) { 
     226                                sessdata.setActionCounter(sessdata.getActionCounter()+1); 
     227                        } 
     228                         
     229                        int sleep = -1; 
     230                         
     231                        // Bei viel zu hoher Aktivitaet einfach die Ausfuehrung mit einem Fehler beenden 
     232                        if( actioncounter >= 35 ) { 
     233                                context.addError( actionBlockingPhrases[RandomUtils.nextInt(actionBlockingPhrases.length)], 
     234                                                request.getRequestURL() +  
     235                                                (request.getQueryString() != null ? "?" + request.getQueryString() : "") ); 
     236                                 
     237                                return; 
     238                        } 
     239                        // Bei hoher Aktivitaet stattdessen nur eine Pause einlegen 
     240                        else if( actioncounter > 10 ) { 
     241                                sleep = 100 * actioncounter; 
     242                        } 
     243                         
     244                        if( sleep > 0 ) { 
     245                                try { 
     246                                        Thread.sleep(2500); 
     247                                } 
     248                                catch( InterruptedException e ) { 
     249                                        log.error(e,e); 
     250                                } 
     251                        } 
     252                } 
     253 
     254                // Inaktivitaet zuruecksetzen 
     255                user.setInactivity(0); 
     256                 
     257                if( (sessdata.getAttach() != null) && !sessdata.getAttach().equals("-1") ) { 
     258                        Session attachSession = (Session)db.get(Session.class, sessdata.getAttach()); 
     259                        if( attachSession != null) { 
     260                                user.attachToUser(attachSession.getUser());      
     261                        } 
     262                } 
     263                 
     264                context.setActiveUser(user); 
     265                 
     266                return; 
     267        } 
    143268}