2011-08-30 23:26:23 +02:00
package com.earth2me.essentials.perm ;
2014-06-19 02:38:28 +01:00
import com.earth2me.essentials.Essentials ;
2015-06-19 09:14:46 -04:00
import com.earth2me.essentials.perm.impl.* ;
2020-06-03 13:36:27 -07:00
import com.google.common.collect.ImmutableSet ;
2015-04-14 23:06:16 -05:00
import org.bukkit.entity.Player ;
2015-06-02 17:33:25 -06:00
import java.util.Arrays ;
2011-08-30 23:26:23 +02:00
import java.util.Collections ;
import java.util.List ;
2020-06-03 13:36:27 -07:00
import java.util.function.Function ;
import java.util.function.Supplier ;
2011-08-30 23:26:23 +02:00
import java.util.logging.Level ;
2015-04-14 23:06:16 -05:00
public class PermissionsHandler implements IPermissionsHandler {
2015-06-19 09:14:46 -04:00
private transient IPermissionsHandler handler = null ;
2020-04-25 08:08:57 -04:00
private final transient String defaultGroup = " default " ;
2015-04-14 23:06:16 -05:00
private final transient Essentials ess ;
2019-01-27 14:14:16 +02:00
private transient boolean useSuperperms ;
2015-04-14 23:06:16 -05:00
2016-03-03 07:44:49 -07:00
private Class < ? > lastHandler = null ;
2015-04-14 23:06:16 -05:00
public PermissionsHandler ( final Essentials plugin , final boolean useSuperperms ) {
this . ess = plugin ;
this . useSuperperms = useSuperperms ;
}
@Override
public String getGroup ( final Player base ) {
final long start = System . nanoTime ( ) ;
String group = handler . getGroup ( base ) ;
if ( group = = null ) {
group = defaultGroup ;
}
2015-04-22 11:26:41 -05:00
checkPermLag ( start , String . format ( " Getting group for %s " , base . getName ( ) ) ) ;
2015-04-14 23:06:16 -05:00
return group ;
}
@Override
public List < String > getGroups ( final Player base ) {
final long start = System . nanoTime ( ) ;
List < String > groups = handler . getGroups ( base ) ;
if ( groups = = null | | groups . isEmpty ( ) ) {
groups = Collections . singletonList ( defaultGroup ) ;
}
2015-04-22 11:26:41 -05:00
checkPermLag ( start , String . format ( " Getting groups for %s " , base . getName ( ) ) ) ;
2015-04-14 23:06:16 -05:00
return Collections . unmodifiableList ( groups ) ;
}
@Override
public boolean canBuild ( final Player base , final String group ) {
return handler . canBuild ( base , group ) ;
}
@Override
public boolean inGroup ( final Player base , final String group ) {
final long start = System . nanoTime ( ) ;
final boolean result = handler . inGroup ( base , group ) ;
2015-04-22 11:26:41 -05:00
checkPermLag ( start , String . format ( " Checking if %s is in group %s " , base . getName ( ) , group ) ) ;
2015-04-14 23:06:16 -05:00
return result ;
}
@Override
public boolean hasPermission ( final Player base , final String node ) {
return handler . hasPermission ( base , node ) ;
}
2019-06-09 07:56:58 -07:00
@Override
public boolean isPermissionSet ( final Player base , final String node ) {
return handler . isPermissionSet ( base , node ) ;
}
2015-04-14 23:06:16 -05:00
@Override
public String getPrefix ( final Player base ) {
final long start = System . nanoTime ( ) ;
String prefix = handler . getPrefix ( base ) ;
if ( prefix = = null ) {
prefix = " " ;
}
2015-04-22 11:26:41 -05:00
checkPermLag ( start , String . format ( " Getting prefix for %s " , base . getName ( ) ) ) ;
2015-04-14 23:06:16 -05:00
return prefix ;
}
@Override
public String getSuffix ( final Player base ) {
final long start = System . nanoTime ( ) ;
String suffix = handler . getSuffix ( base ) ;
if ( suffix = = null ) {
suffix = " " ;
}
2015-04-22 11:26:41 -05:00
checkPermLag ( start , String . format ( " Getting suffix for %s " , base . getName ( ) ) ) ;
2015-04-14 23:06:16 -05:00
return suffix ;
}
2020-06-03 13:36:27 -07:00
@Override
public void registerContext ( String context , Function < Player , Iterable < String > > calculator , Supplier < Iterable < String > > suggestions ) {
handler . registerContext ( context , calculator , suggestions ) ;
}
@Override
public void unregisterContexts ( ) {
handler . unregisterContexts ( ) ;
}
2020-07-05 19:30:01 +01:00
@Override
public String getBackendName ( ) {
return handler . getBackendName ( ) ;
}
2015-06-19 09:14:46 -04:00
@Override
public boolean tryProvider ( ) {
return true ;
}
2015-04-14 23:06:16 -05:00
public void checkPermissions ( ) {
2015-06-19 09:14:46 -04:00
// load and assign a handler
List < Class < ? extends SuperpermsHandler > > providerClazz = Arrays . asList (
2020-06-03 13:36:27 -07:00
LuckPermsHandler . class ,
2019-12-26 15:08:07 +00:00
ModernVaultHandler . class ,
2015-06-19 09:14:46 -04:00
GenericVaultHandler . class ,
SuperpermsHandler . class
) ;
for ( Class < ? extends IPermissionsHandler > providerClass : providerClazz ) {
try {
IPermissionsHandler provider = providerClass . newInstance ( ) ;
if ( provider . tryProvider ( ) ) {
2020-06-03 13:36:27 -07:00
if ( provider . getClass ( ) . isInstance ( this . handler ) ) {
return ;
}
if ( this . handler ! = null ) {
unregisterContexts ( ) ;
}
2015-06-21 08:45:01 -04:00
this . handler = provider ;
2020-06-03 13:36:27 -07:00
initContexts ( ) ;
2015-06-19 09:14:46 -04:00
break ;
2015-06-03 07:04:39 -06:00
}
2015-06-19 09:14:46 -04:00
} catch ( Throwable ignored ) {
2015-04-14 23:06:16 -05:00
}
}
2015-06-19 09:14:46 -04:00
if ( handler = = null ) {
2016-03-03 07:57:37 -07:00
if ( useSuperperms ) {
handler = new SuperpermsHandler ( ) ;
} else {
handler = new ConfigPermissionsHandler ( ess ) ;
}
2015-06-19 09:14:46 -04:00
}
2016-03-03 07:44:49 -07:00
// don't spam logs
Class < ? > handlerClass = handler . getClass ( ) ;
2016-03-03 07:57:37 -07:00
if ( lastHandler ! = null & & lastHandler = = handlerClass ) {
2016-03-03 07:44:49 -07:00
return ;
}
lastHandler = handlerClass ;
2015-06-19 09:14:46 -04:00
// output handler info
2016-07-09 18:42:42 -06:00
if ( handler instanceof AbstractVaultHandler ) {
String enabledPermsPlugin = ( ( AbstractVaultHandler ) handler ) . getEnabledPermsPlugin ( ) ;
2015-06-19 09:14:46 -04:00
if ( enabledPermsPlugin = = null ) enabledPermsPlugin = " generic " ;
ess . getLogger ( ) . info ( " Using Vault based permissions ( " + enabledPermsPlugin + " ) " ) ;
2015-06-21 08:45:01 -04:00
} else if ( handler . getClass ( ) = = SuperpermsHandler . class ) {
2015-06-19 09:14:46 -04:00
if ( handler . tryProvider ( ) ) {
ess . getLogger ( ) . warning ( " Detected supported permissions plugin " +
( ( SuperpermsHandler ) handler ) . getEnabledPermsPlugin ( ) + " without Vault installed. " ) ;
ess . getLogger ( ) . warning ( " Features such as chat prefixes/suffixes and group-related functionality will not " +
" work until you install Vault. " ) ;
2015-04-14 23:06:16 -05:00
}
2015-06-19 21:59:17 -04:00
ess . getLogger ( ) . info ( " Using superperms-based permissions. " ) ;
2015-06-21 08:45:01 -04:00
} else if ( handler . getClass ( ) = = ConfigPermissionsHandler . class ) {
2015-06-19 09:14:46 -04:00
ess . getLogger ( ) . info ( " Using config file enhanced permissions. " ) ;
ess . getLogger ( ) . info ( " Permissions listed in as player-commands will be given to all users. " ) ;
2015-04-14 23:06:16 -05:00
}
}
public void setUseSuperperms ( final boolean useSuperperms ) {
this . useSuperperms = useSuperperms ;
}
public String getName ( ) {
2015-06-19 09:14:46 -04:00
return handler . getClass ( ) . getSimpleName ( ) . replace ( " Provider " , " " ) ;
2015-04-14 23:06:16 -05:00
}
2015-04-22 11:26:41 -05:00
private void checkPermLag ( long start , String summary ) {
2015-04-14 23:06:16 -05:00
final long elapsed = System . nanoTime ( ) - start ;
if ( elapsed > ess . getSettings ( ) . getPermissionsLagWarning ( ) ) {
2015-04-22 11:26:41 -05:00
ess . getLogger ( ) . log ( Level . WARNING , String . format ( " Permissions lag notice with (%s). Response took %fms. Summary: %s " , getName ( ) , elapsed / 1000000 . 0 , summary ) ) ;
2015-04-14 23:06:16 -05:00
}
}
2015-04-22 11:26:41 -05:00
2020-06-03 13:36:27 -07:00
private void initContexts ( ) {
registerContext ( " essentials:afk " , player - > Collections . singleton ( String . valueOf ( ess . getUser ( player ) . isAfk ( ) ) ) , ( ) - > ImmutableSet . of ( " true " , " false " ) ) ;
registerContext ( " essentials:muted " , player - > Collections . singleton ( String . valueOf ( ess . getUser ( player ) . isMuted ( ) ) ) , ( ) - > ImmutableSet . of ( " true " , " false " ) ) ;
registerContext ( " essentials:vanished " , player - > Collections . singleton ( String . valueOf ( ess . getUser ( player ) . isHidden ( ) ) ) , ( ) - > ImmutableSet . of ( " true " , " false " ) ) ;
}
2011-08-30 23:26:23 +02:00
}