]>
jfr.im git - irc/rizon/acid.git/blob - acid/src/main/java/net/rizon/acid/core/User.java
c3accd5a320ca01eb2ff375c20a313cda456ae33
1 package net
. rizon
. acid
. core
;
3 import java
. net
. InetAddress
;
4 import java
. sql
. PreparedStatement
;
5 import java
. sql
. ResultSet
;
6 import java
. sql
. SQLException
;
7 import java
. util
. ArrayList
;
8 import java
. util
. Collection
;
9 import java
. util
. HashMap
;
10 import java
. util
. HashSet
;
11 import java
. util
. Hashtable
;
12 import java
. util
. Iterator
;
14 import net
. rizon
. acid
. conf
. AccessPreset
;
15 import net
. rizon
. acid
. events
. EventUserMode
;
16 import org
. slf4j
. Logger
;
17 import org
. slf4j
. LoggerFactory
;
19 public class User
implements Comparable
< User
>
21 private static final Logger log
= LoggerFactory
. getLogger ( User
. class );
23 private String nick
, user
, host
, vhost
, name
, identnick
, modes
, UID
, ip
,
24 certfp
, authflags
, su
, snomask
;
25 private String cloakedIp
, cloakedHost
;
26 private int nickTS
, conTS
;
27 private Server server
;
28 private String flags
; // Access flags
29 private ArrayList
< String
> oldNicks
;
30 private Hashtable
< String
, ArrayList
< Integer
>> chans
;
31 private HashSet
< Channel
> chanList
;
32 private InetAddress cgisockhost
;
33 private String cgihost
;
35 public User ( String nick
, String user
, String host
, String vhost
, String name
,
36 Server server
, int nickTS
, int conTS
, String modes
, String UID
, String ip
)
51 // Check if this IP isn't spoofed.
54 // Cloak IP if IP is visible host, else cloak hostname.
55 this . cloakedIp
= Acidictive
. cloakGenerator
. cloak ( this . ip
);
56 if ( this . ip
. equals ( this . host
))
58 this . cloakedHost
= this . cloakedIp
;
62 this . cloakedHost
= Acidictive
. cloakGenerator
. cloak ( this . host
);
67 this . cloakedIp
= this . ip
;
68 this . cloakedHost
= this . host
;
76 * i'm not sure if this is just how plexus handles it
77 * or if it's irc protocol for empty snomasks.
79 * -!- Mode change [-s] for user kristina
80 * -!- + Server notice mask
84 oldNicks
= new ArrayList
< String
>();
85 chans
= new Hashtable
< String
, ArrayList
< Integer
>>();
86 chanList
= new HashSet
< Channel
>();
88 uidMap
. put ( UID
, this );
89 nickMap
. put ( nick
. toLowerCase (), this );
91 this . getServer (). incUsers ();
94 public final boolean isSpoofed ()
96 return this . ip
. equals ( "255.255.255.255" ) || this . ip
. equals ( "0" );
99 public void setSnomask ( String s
)
101 /* see comment in ctor */
102 if ( s
== null || s
. isEmpty ())
108 public String
getSnomask ()
115 for ( Iterator
< Channel
> it
= chanList
. iterator (); it
. hasNext ();)
117 Channel chan
= it
. next ();
118 chan
. removeUser ( this );
122 this . getServer (). decUsers ();
123 if (!( this instanceof AcidUser
))
124 UserList
. decreaseHost ( this . ip
);
127 nickMap
. remove ( nick
. toLowerCase ());
136 public void clearFlood ()
142 public ArrayList
< Integer
> addChanJoinPart ( String chan
, int TS
)
144 ArrayList
< Integer
> x
= chans
. get ( chan
. toLowerCase ());
147 ArrayList
< Integer
> tmp
= new ArrayList
< Integer
>();
148 tmp
. add ( new Integer ( TS
));
149 chans
. put ( chan
. toLowerCase (), tmp
);
154 x
. add ( new Integer ( TS
));
162 public boolean isOnChan ( Channel chan
)
164 return chanList
. contains ( chan
);
167 public void addChan ( Channel chan
)
172 public void remChan ( Channel chan
)
174 chanList
. remove ( chan
);
177 public Set
< Channel
> getChannels ()
179 return this . chanList
;
182 public String
getChanStr ()
184 StringBuilder sb
= new StringBuilder ();
186 for ( Channel c
: chanList
)
194 sb
. append ( c
. getName ());
197 if ( sb
. length () == 0 )
200 return sb
. toString ();
203 public void setRealhost ( String ip
, String host
)
209 public void setFlags ( String flags
)
214 public void setUID ( String uid
)
219 public void changeNick ( String newNick
)
221 String oldnick
= this . getNick ();
223 nickMap
. remove ( this . getNick (). toLowerCase ());
224 oldNicks
. add ( this . getNick ());
225 if ( oldNicks
. size () > 20 )
228 nickMap
. put ( this . getNick (). toLowerCase (), this );
232 for ( Channel chan
: chanList
)
234 chan
. onNick ( oldnick
, this . getNick ());
239 public String
getIdentNick ()
244 public String
getIP ()
249 public String
getNick ()
254 public boolean hasMode ( String mode
)
256 return modes
. contains ( mode
);
259 public void setMode ( String mode
)
261 if ( mode
. equals ( "" ) || mode
== null )
268 for ( int x
= 0 ; x
< mode
. length (); x
++)
270 chr
= mode
. substring ( x
, x
+ 1 );
275 else if ( chr
. equals ( "-" ))
279 else if ( plus
&& modes
. indexOf ( chr
) == - 1 )
283 else if (! plus
&& modes
. indexOf ( chr
) >= 0 )
286 this . vhost
= this . host
;
287 modes
= modes
. replaceAll ( chr
, "" );
291 EventUserMode event
= new EventUserMode ();
292 event
. setNewmodes ( modes
);
293 event
. setOldmodes ( old
);
295 Acidictive
. eventBus
. post ( event
);
298 public String
getUser ()
303 public void setUser ( String user
)
308 public String
getUID ()
313 public String
getHost ()
318 public String
getVhost ()
323 public void setVhost ( String vhost
)
328 public String
getRealName ()
333 public int getNickTS ()
338 public int getConTS ()
343 public void changeNickTS ( int nickTS
)
345 this . nickTS
= nickTS
;
348 public Server
getServer ()
353 /* Does this user have all of these flags? Can also take a type (SRA/SA/SO/whatever) */
354 public boolean hasFlags ( String flags
)
359 String my_flags
= this . flags
;
361 for ( AccessPreset p
: Acidictive
. conf
. access_preset
)
363 for ( String s
: p
. name
)
365 my_flags
= my_flags
. replace ( s
, p
. privileges
);
366 flags
= flags
. replace ( s
, p
. privileges
);
370 for ( int i
= 0 ; i
< flags
. length (); ++ i
)
371 if ( my_flags
. indexOf ( flags
. charAt ( i
)) == - 1 )
377 public String
getCloakedIp ()
379 return this . cloakedIp
;
382 public String
getCloakedHost ()
384 return this . cloakedHost
;
387 public String
getFlags ()
392 public String
getModes ()
397 public String
getCertFP ()
402 public void setCertFP ( String certfp
)
404 this . certfp
= certfp
;
407 public String
getAuthFlags ()
412 public void setAuthFlags ( String authflags
)
414 this . authflags
= authflags
;
417 public void setCgisockhost ( InetAddress cgisockhost
)
419 this . cgisockhost
= cgisockhost
;
422 public void setCgihost ( String cgihost
)
424 this . cgihost
= cgihost
;
427 public InetAddress
getCgisockhost ()
429 return this . cgisockhost
;
432 public String
getCgihost ()
437 public String
getSU ()
442 public void setSU ( String su
)
448 public int compareTo ( User user
)
450 return nick
. compareTo ( user
. getNick ());
454 public String
toString ()
456 return nick
+ "!" + user
+ "@" + host
+ "/" + ip
+ "/" + this . cloakedIp
+ "/" + this . cloakedHost
+ "/" + "(" + name
+ ")[" + server
+ "] / " + oldNicksList ();
459 public String
getNickString ()
461 return nick
+ "!" + user
+ "@" + host
+ "/" + ip
+ "/" + this . cloakedIp
+ "/" + this . cloakedHost
+ "/" + vhost
+ "(" + name
+ ")" ;
464 public String
getSNString ()
466 return nick
+ "!" + user
+ "@" + host
;
469 public String
getNString ()
471 return nick
+ "!" + user
+ "@" + host
+ "/" + ip
+ "/" + this . cloakedIp
+ "/" + this . cloakedHost
+ "/" + vhost
+ "(" + name
+ ")(" + modes
+ ")[" + server
+ "]" ;
474 public String
getNStringON ()
476 return nick
+ "!" + user
+ "@" + host
+ "/" + ip
+ "/" + this . cloakedIp
+ "/" + this . cloakedHost
+ "/" + vhost
+ "(" + name
+ ")(" + modes
+ ")[" + server
+ "] / " + oldNicksList ();
479 public String
getNickLine ()
481 return getNick () + "!" + getUser () + "@" + getHost () + "/" + getRealName ();
484 public ArrayList
< String
> oldNicks ()
486 return oldNicks
== null ?
new ArrayList
< String
>() : oldNicks
;
489 public String
oldNicksList ()
491 if ( oldNicks
== null )
492 return "No nick changes." ;
493 if ( oldNicks
. size () > 0 )
495 StringBuffer sb
= new StringBuffer ();
496 for ( int i
= 0 ; i
< oldNicks
. size (); i
++)
498 sb
. append ( oldNicks
. get ( i
) + " -> " );
501 return sb
. toString ();
503 return "No nick changes." ;
506 public boolean isIdentified ()
508 if ( this . hasMode ( "r" ))
510 return this . su
!= null && ! this . su
. isEmpty () && ! this . su
. equals ( "*" ) && ! Character
. isDigit ( this . su
. charAt ( 0 ));
513 // TODO: Fixme to make this either properly static or a "real" method
514 // XXX ??????????????????????????????????? wtf is this
515 public void loadAccess ( final User user
)
519 PreparedStatement ps
= Acidictive
. acidcore_sql
. prepare ( "SELECT `user`, `flags` FROM `access` WHERE `user` = ?" );
520 ps
. setString ( 1 , user
. getSU ());
521 ResultSet rs
= Acidictive
. acidcore_sql
. executeQuery ( ps
);
524 String oldflags
= this . flags
;
526 this . flags
= rs
. getString ( "flags" );
527 this . identnick
= user
. getSU ();
529 if ( oldflags
. equals ( this . flags
) == false )
530 Acidictive
. notice ( this , "You have been logged in with flags " + this . flags
);
533 catch ( SQLException ex
)
535 log
. warn ( "Unable to load access for user" , ex
);
539 private static HashMap
< String
, User
> uidMap
= new HashMap
< String
, User
>();
540 private static HashMap
< String
, User
> nickMap
= new HashMap
< String
, User
>();
542 public static User
findUser ( final String nick
)
544 if ( nick
!= null && nick
. isEmpty () == false && Character
. isDigit ( nick
. charAt ( 0 )))
545 return uidMap
. get ( nick
);
546 return nickMap
. get ( nick
. toLowerCase ());
549 public static final Set
< String
> getUsers ()
551 return nickMap
. keySet ();
554 public static Collection
< User
> getUsersC () { return nickMap
. values (); }
556 public static final String
toName ( final String uid
)
558 User u
= findUser ( uid
);
564 public static int userCount ()
566 return nickMap
. size ();
569 private static char [] currentUid
= new char [] { 'A' , 'A' , 'A' , 'A' , 'A' , '@' };
571 public static String
generateUID ()
573 for ( int i
= 5 ; i
>= 0 ; -- i
)
575 if ( currentUid
[ i
] == 'Z' )
580 else if ( currentUid
[ i
] != '9' )
589 return AcidCore
. me
. getSID () + new String ( currentUid
);