Changeset 5dc487d6f8fa08760e5156f406bf9475a1f8ce56
- Timestamp:
- 05/12/08 12:19:17 (2 months ago)
- git-parent:
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
src/net/driftingsouls/ds2/server/framework/BasicContext.java
r3b915f2 r5dc487d 25 25 import java.util.Map; 26 26 27 import net.driftingsouls.ds2.server.framework.authentication.DefaultAuthenticationManager; 27 28 import net.driftingsouls.ds2.server.framework.db.Database; 28 29 import net.driftingsouls.ds2.server.framework.db.HibernateFacade; … … 31 32 import net.driftingsouls.ds2.server.framework.pipeline.Response; 32 33 33 import org.apache.commons.lang.math.RandomUtils;34 34 import org.hibernate.Transaction; 35 35 … … 50 50 private Map<Class<?>, Object> contextSingletons = new HashMap<Class<?>,Object>(); 51 51 private Map<Class<?>, Map<String,Object>> variables = new HashMap<Class<?>, Map<String, Object>>(); 52 private String currentSession = "";53 52 private List<ContextListener> listener = new ArrayList<ContextListener>(); 54 53 private org.hibernate.Session session; 55 54 private Transaction transaction; 56 57 private static String[] actionBlockingPhrases = {58 "Immer mit der Ruhe!\nDer arme Server ist schon total erschlöpft.\nGö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ö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önntest du aus versehen auf den Selbstzerstörungsknopf drücken! Mach eine kurze Pause und klicke dann langsam und gewissenhaft weiter..."62 };63 55 64 56 /** … … 83 75 } 84 76 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ür sie durchgefü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 waren135 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 beenden156 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 einlegen164 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 zuruecksetzen179 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 193 77 public void revalidate() { 194 if( (currentSession == null && request.getParameter("sess") != null) || 195 (currentSession != null && !currentSession.equals(request.getParameter("sess"))) ) { 78 if( this.activeUser == null ) { 196 79 errorList.clear(); 197 authenticateUser(); 80 new DefaultAuthenticationManager() 81 .authenticateCurrentSession(); 198 82 } 199 83 } src/net/driftingsouls/ds2/server/framework/authentication/AuthenticationManager.java
r47cd40b r5dc487d 54 54 */ 55 55 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(); 56 63 } src/net/driftingsouls/ds2/server/framework/authentication/DefaultAuthenticationManager.java
r47cd40b r5dc487d 23 23 import net.driftingsouls.ds2.server.framework.BasicUser; 24 24 import net.driftingsouls.ds2.server.framework.Common; 25 import net.driftingsouls.ds2.server.framework.Configuration; 25 26 import net.driftingsouls.ds2.server.framework.Context; 26 27 import net.driftingsouls.ds2.server.framework.ContextMap; … … 29 30 import net.driftingsouls.ds2.server.framework.pipeline.Request; 30 31 32 import org.apache.commons.lang.math.RandomUtils; 33 import org.apache.commons.logging.Log; 34 import org.apache.commons.logging.LogFactory; 35 31 36 /** 32 37 * Verwaltungsklasse fuer Aktionen rund um das ein- und ausloggen. … … 35 40 */ 36 41 public 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öpft.\nGö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ö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önntest du aus versehen auf den Selbstzerstörungsknopf drücken! Mach eine kurze Pause und klicke dann langsam und gewissenhaft weiter..." 50 }; 38 51 39 52 public Session login(String username, String password, boolean useGfxPak) throws AuthenticationException { … … 141 154 return session; 142 155 } 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ür sie durchgefü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 } 143 268 }
