818 if (allowedModes == TRUSTED) // IMPL_LOOKUP can make any lookup at all
819 return new Lookup(requestedLookupClass, FULL_POWER_MODES);
820 if (requestedLookupClass == this.lookupClass)
821 return this; // keep same capabilities
822 int newModes = (allowedModes & FULL_POWER_MODES);
823 if (!VerifyAccess.isSameModule(this.lookupClass, requestedLookupClass)) {
824 // Need to drop all access when teleporting from a named module to another
825 // module. The exception is publicLookup where PUBLIC is not lost.
826 if (this.lookupClass.getModule().isNamed()
827 && (this.allowedModes & UNCONDITIONAL) == 0)
828 newModes = 0;
829 else
830 newModes &= ~(MODULE|PACKAGE|PRIVATE|PROTECTED);
831 }
832 if ((newModes & PACKAGE) != 0
833 && !VerifyAccess.isSamePackage(this.lookupClass, requestedLookupClass)) {
834 newModes &= ~(PACKAGE|PRIVATE|PROTECTED);
835 }
836 // Allow nestmate lookups to be created without special privilege:
837 if ((newModes & PRIVATE) != 0
838 && !Reflection.areNestMates(this.lookupClass, requestedLookupClass)) {
839 newModes &= ~(PRIVATE|PROTECTED);
840 }
841 if ((newModes & PUBLIC) != 0
842 && !VerifyAccess.isClassAccessible(requestedLookupClass, this.lookupClass, allowedModes)) {
843 // The requested class it not accessible from the lookup class.
844 // No permissions.
845 newModes = 0;
846 }
847
848 checkUnprivilegedlookupClass(requestedLookupClass);
849 return new Lookup(requestedLookupClass, newModes);
850 }
851
852
853 /**
854 * Creates a lookup on the same lookup class which this lookup object
855 * finds members, but with a lookup mode that has lost the given lookup mode.
856 * The lookup mode to drop is one of {@link #PUBLIC PUBLIC}, {@link #MODULE
857 * MODULE}, {@link #PACKAGE PACKAGE}, {@link #PROTECTED PROTECTED} or {@link #PRIVATE PRIVATE}.
858 * {@link #PROTECTED PROTECTED} and {@link #UNCONDITIONAL UNCONDITIONAL} are always
|
818 if (allowedModes == TRUSTED) // IMPL_LOOKUP can make any lookup at all
819 return new Lookup(requestedLookupClass, FULL_POWER_MODES);
820 if (requestedLookupClass == this.lookupClass)
821 return this; // keep same capabilities
822 int newModes = (allowedModes & FULL_POWER_MODES);
823 if (!VerifyAccess.isSameModule(this.lookupClass, requestedLookupClass)) {
824 // Need to drop all access when teleporting from a named module to another
825 // module. The exception is publicLookup where PUBLIC is not lost.
826 if (this.lookupClass.getModule().isNamed()
827 && (this.allowedModes & UNCONDITIONAL) == 0)
828 newModes = 0;
829 else
830 newModes &= ~(MODULE|PACKAGE|PRIVATE|PROTECTED);
831 }
832 if ((newModes & PACKAGE) != 0
833 && !VerifyAccess.isSamePackage(this.lookupClass, requestedLookupClass)) {
834 newModes &= ~(PACKAGE|PRIVATE|PROTECTED);
835 }
836 // Allow nestmate lookups to be created without special privilege:
837 if ((newModes & PRIVATE) != 0
838 && !VerifyAccess.areNestMates(this.lookupClass, requestedLookupClass)) {
839 newModes &= ~(PRIVATE|PROTECTED);
840 }
841 if ((newModes & PUBLIC) != 0
842 && !VerifyAccess.isClassAccessible(requestedLookupClass, this.lookupClass, allowedModes)) {
843 // The requested class it not accessible from the lookup class.
844 // No permissions.
845 newModes = 0;
846 }
847
848 checkUnprivilegedlookupClass(requestedLookupClass);
849 return new Lookup(requestedLookupClass, newModes);
850 }
851
852
853 /**
854 * Creates a lookup on the same lookup class which this lookup object
855 * finds members, but with a lookup mode that has lost the given lookup mode.
856 * The lookup mode to drop is one of {@link #PUBLIC PUBLIC}, {@link #MODULE
857 * MODULE}, {@link #PACKAGE PACKAGE}, {@link #PROTECTED PROTECTED} or {@link #PRIVATE PRIVATE}.
858 * {@link #PROTECTED PROTECTED} and {@link #UNCONDITIONAL UNCONDITIONAL} are always
|