package dmg.cells.services.login ;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.StringTokenizer;
import dmg.util.Formats;
public class UserPrivileges {
private Hashtable<String,String> _allowed = new Hashtable<>() ;
private Hashtable<String,String> _denied = new Hashtable<>() ;
private String _userName = "unknown" ;
private boolean _faked;
UserPrivileges(){}
UserPrivileges( String userName ){ _userName = userName ; _faked = true ; }
UserPrivileges( String userName ,
String [] allowedList ,
String [] deniedList ){
_userName = userName ;
for (String s : allowedList) {
_allowed.put(s, s);
}
for (String s : deniedList) {
_denied.put(s, s);
_allowed.remove(s);
}
}
public String getUserName(){ return _userName ; }
void mergeHorizontal( UserPrivileges right ){
String attr;
for (Object o : right._denied.keySet()) {
_denied.put(attr = (String) o, attr);
}
for (Object o : right._allowed.keySet()) {
_allowed.put(attr = (String) o, attr);
_denied.remove(attr);
}
}
void mergeVertical( UserPrivileges upper ){
String attr;
for (Object o : upper._allowed.keySet()) {
if (_denied.get((attr = (String) o)) == null) {
_allowed.put(attr, attr);
}
}
for (Object o : upper._denied.keySet()) {
if (_allowed.get((attr = (String) o)) == null) {
_denied.put(attr, attr);
}
}
}
public boolean isAllowed( String check ){
if( _faked ) {
return false;
}
if( _userName.equals("root") ) {
return true;
}
try{
if( _denied.get( check ) != null ) {
return false;
}
if( _allowed.get( check ) != null ) {
return true;
}
String base;
int last = check.lastIndexOf(':') ;
if( last < 0 ){
base = "" ;
}else{
base = check.substring(0,last) + ':';
check = check.substring(last+1) ;
}
if( check.length() < 1 ) {
return false;
}
StringTokenizer st = new StringTokenizer(check,".") ;
String [] tokens = new String[st.countTokens()] ;
for( int i = 0 ; i < tokens.length ; i++ ) {
tokens[i] = st.nextToken();
}
for( int i = tokens.length ; i > 0 ; i-- ){
StringBuilder sb = new StringBuilder() ;
sb.append( base ) ;
for( int j = 0 ; j < (i-1) ; j++ ) {
sb.append(tokens[j]).append('.');
}
sb.append('*') ;
String x = sb.toString() ;
if( _denied.get( x ) != null ) {
return false;
}
if( _allowed.get( x ) != null ) {
return true;
}
}
return false ;
}catch( Exception ee ){
ee.printStackTrace() ;
return false ;
}
}
public String toString(){
if( _faked ) {
return "UserPrivileges for " + _userName + " faked";
}
StringBuilder sb = new StringBuilder() ;
String x = " " ;
int dx = 20 ;
int m = Math.min( _allowed.size() , _denied.size() ) ;
Iterator<String> a = _allowed.keySet().iterator();
Iterator<String> d = _denied.keySet().iterator();
for( int i = 0 ; i < m ; i ++ ) {
sb.append(x).
append(Formats.field(a.next(), dx)).
append(Formats.field(d.next(), dx)).
append('\n');
}
if( _allowed.size() > m ) {
while (a.hasNext()) {
sb.append(x).
append(Formats.field(a.next(), dx)).
append(Formats.field("", 20)).
append('\n');
}
}
if( _denied.size() > m ) {
while (d.hasNext()) {
sb.append(x).
append(Formats.field("", 20)).
append(Formats.field(d.next(), dx)).
append('\n');
}
}
return sb.toString() ;
}
}