diff --git a/api/src/org/labkey/api/assay/AbstractAssayTsvDataHandler.java b/api/src/org/labkey/api/assay/AbstractAssayTsvDataHandler.java index 06c2f651481..0cffb184810 100644 --- a/api/src/org/labkey/api/assay/AbstractAssayTsvDataHandler.java +++ b/api/src/org/labkey/api/assay/AbstractAssayTsvDataHandler.java @@ -375,7 +375,7 @@ public void beforeDeleteData(List data, User user) throws ExperimentExc domain = provider.getResultsDomain(protocol); AssayProtocolSchema assayProtocolSchema = provider.createProtocolSchema(user, protocol.getContainer(), protocol, null); - TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.EVERYTHING_UNSAFE, false); + TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.getUnsafeEverythingFilter(), false); if (assayDataTable != null) { ColumnInfo lsidCol = assayDataTable.getColumn(assayResultLsidFieldKey); diff --git a/api/src/org/labkey/api/data/ContainerFilter.java b/api/src/org/labkey/api/data/ContainerFilter.java index 5b871ff9412..7f9e492f91e 100644 --- a/api/src/org/labkey/api/data/ContainerFilter.java +++ b/api/src/org/labkey/api/data/ContainerFilter.java @@ -517,8 +517,21 @@ public static ContainerFilter current(ContainerUser cu) } /** Use this with extreme caution - this doesn't check permissions */ + @Deprecated(forRemoval = true) // Use getUnsafeEverythingFilter() instead TODO: Remove public static final ContainerFilter EVERYTHING_UNSAFE = new InternalNoContainerFilter(); + private static ContainerFilter _everythingUnsafe = null; + + /** Use this with extreme caution - this doesn't check permissions! */ + public static synchronized ContainerFilter getUnsafeEverythingFilter() + { + if (_everythingUnsafe == null) + { + _everythingUnsafe = new InternalNoContainerFilter(); + } + return _everythingUnsafe; + } + public static class ContainerFilterWithPermission extends ContainerFilter { public ContainerFilterWithPermission(Container c, User user) @@ -1346,7 +1359,7 @@ public void testCacheKey() assertEquals(current(home, user).getCacheKey(), current(home, user).getCacheKey()); assertNotEquals(current(home, user).getCacheKey(), current(test, user).getCacheKey()); - assertEquals(EVERYTHING_UNSAFE.getCacheKey(), new InternalNoContainerFilter().getCacheKey()); + assertEquals(getUnsafeEverythingFilter().getCacheKey(), new InternalNoContainerFilter().getCacheKey()); assertEquals(new CurrentPlusExtras(home, user, shared).getCacheKey(), new CurrentPlusExtras(home, user, shared).getCacheKey()); assertNotEquals(new CurrentPlusExtras(home, user, shared).getCacheKey(), new CurrentPlusExtras(test, user, shared).getCacheKey()); diff --git a/api/src/org/labkey/api/exp/property/DomainPropertyAuditProvider.java b/api/src/org/labkey/api/exp/property/DomainPropertyAuditProvider.java index b7b5fa8f648..2778047abf9 100644 --- a/api/src/org/labkey/api/exp/property/DomainPropertyAuditProvider.java +++ b/api/src/org/labkey/api/exp/property/DomainPropertyAuditProvider.java @@ -124,7 +124,7 @@ protected void initColumn(MutableColumnInfo col) public TableInfo getLookupTableInfo() { DomainAuditProvider provider = new DomainAuditProvider(); - TableInfo table = provider.createTableInfo(getUserSchema(), ContainerFilter.EVERYTHING_UNSAFE); + TableInfo table = provider.createTableInfo(getUserSchema(), ContainerFilter.getUnsafeEverythingFilter()); return table; } }); diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index a1f3f4daced..f2a2902ec7a 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -1240,7 +1240,7 @@ private static void updateTextChoiceValueRows(Domain domain, User user, String p if (domain != null && domain.getDomainKind() != null) { // using ContainerFilter.EVERYTHING to account for /Shared domains - TableInfo domainTable = domain.getDomainKind().getTableInfo(user, domain.getContainer(), domain, ContainerFilter.EVERYTHING_UNSAFE); + TableInfo domainTable = domain.getDomainKind().getTableInfo(user, domain.getContainer(), domain, ContainerFilter.getUnsafeEverythingFilter()); if (domainTable != null && domainTable.getUpdateService() != null) { // we need to make all the row updates for this domain property at one time to prevent the diff --git a/api/src/org/labkey/api/exp/query/ExpSchema.java b/api/src/org/labkey/api/exp/query/ExpSchema.java index 6e880581da4..b43ce39098e 100644 --- a/api/src/org/labkey/api/exp/query/ExpSchema.java +++ b/api/src/org/labkey/api/exp/query/ExpSchema.java @@ -551,7 +551,7 @@ public ForeignKey getProtocolForeignKey(ContainerFilter cf, String targetColumnN @Override public TableInfo getLookupTableInfo() { - return getTable(TableType.Protocols.toString(), ContainerFilter.EVERYTHING_UNSAFE); + return getTable(TableType.Protocols.toString(), ContainerFilter.getUnsafeEverythingFilter()); } }; } diff --git a/api/src/org/labkey/api/exp/query/SamplesSchema.java b/api/src/org/labkey/api/exp/query/SamplesSchema.java index 8e2ded700d4..3ee29647527 100644 --- a/api/src/org/labkey/api/exp/query/SamplesSchema.java +++ b/api/src/org/labkey/api/exp/query/SamplesSchema.java @@ -114,7 +114,7 @@ public SamplesSchema(QuerySchema schema, boolean studyLinkedSamples) if (studyLinkedSamples) { - this.setContainerFilter(ContainerFilter.EVERYTHING_UNSAFE); + this.setContainerFilter(ContainerFilter.getUnsafeEverythingFilter()); this.withLinkToStudyColumns = false; this.supportTableRules = false; this.contextualRoles = Set.of(RoleManager.getRole(ReaderRole.class)); diff --git a/api/src/org/labkey/api/query/PrincipalIdForeignKey.java b/api/src/org/labkey/api/query/PrincipalIdForeignKey.java index 0011c6c564e..c2c82970b2d 100644 --- a/api/src/org/labkey/api/query/PrincipalIdForeignKey.java +++ b/api/src/org/labkey/api/query/PrincipalIdForeignKey.java @@ -36,7 +36,7 @@ public TableInfo getLookupTableInfo() { TableInfo tinfoUsersData = CoreSchema.getInstance().getTableInfoPrincipals(); FilteredTable ret = new FilteredTable<>(tinfoUsersData, _userSchema); - ret.setContainerFilter(ContainerFilter.EVERYTHING_UNSAFE); + ret.setContainerFilter(ContainerFilter.getUnsafeEverythingFilter()); ret.addWrapColumn(tinfoUsersData.getColumn("UserId")); ret.addColumn(ret.wrapColumn("Name", tinfoUsersData.getColumn("Name"))); ret.setTitleColumn("Name"); diff --git a/api/src/org/labkey/api/study/assay/SpecimenForeignKey.java b/api/src/org/labkey/api/study/assay/SpecimenForeignKey.java index ace81ad0f45..5aea1f1c390 100644 --- a/api/src/org/labkey/api/study/assay/SpecimenForeignKey.java +++ b/api/src/org/labkey/api/study/assay/SpecimenForeignKey.java @@ -149,7 +149,7 @@ void _initAssayColumns() if (null == _assayDataTable) { AssayProtocolSchema assaySchema = _provider.createProtocolSchema(_schema.getUser(), _schema.getContainer(), _protocol, null); - _assayDataTable = assaySchema.createDataTable(ContainerFilter.EVERYTHING_UNSAFE); + _assayDataTable = assaySchema.createDataTable(ContainerFilter.getUnsafeEverythingFilter()); } FieldKey specimenFK = _tableMetadata.getSpecimenIDFieldKey(); diff --git a/assay/src/org/labkey/assay/AssayController.java b/assay/src/org/labkey/assay/AssayController.java index 9e81aaabf48..a6603ee6d0c 100644 --- a/assay/src/org/labkey/assay/AssayController.java +++ b/assay/src/org/labkey/assay/AssayController.java @@ -1762,7 +1762,7 @@ public Object execute(AssayOperationConfirmationForm form, BindException errors) ExpProtocol protocol = service.getExpProtocol(form.getProtocolId()); AssayProvider provider = AssayService.get().getProvider(protocol); AssaySchema schema = provider.createProtocolSchema(getUser(), getContainer(), protocol, null); - TableInfo tableInfo = schema.getTableOrThrow(AssayProtocolSchema.DATA_TABLE_NAME, ContainerFilter.EVERYTHING_UNSAFE); + TableInfo tableInfo = schema.getTableOrThrow(AssayProtocolSchema.DATA_TABLE_NAME, ContainerFilter.getUnsafeEverythingFilter()); // need to query to get the dataIds for the data rowIds so that we can check container permissions on that exp.data table SimpleFilter filter = new SimpleFilter(FieldKey.fromParts("RowId"), allowedIds, CompareType.IN); diff --git a/assay/src/org/labkey/assay/AssayUpgradeCode.java b/assay/src/org/labkey/assay/AssayUpgradeCode.java index c4278a958f4..687c0f89e1c 100644 --- a/assay/src/org/labkey/assay/AssayUpgradeCode.java +++ b/assay/src/org/labkey/assay/AssayUpgradeCode.java @@ -330,7 +330,7 @@ public static void populatePlateSetPaths(ModuleContext ctx) throws Exception ContainerManager.getRoot(), User.getAdminServiceUser(), plateSetRowId, - ContainerFilter.EVERYTHING_UNSAFE + ContainerFilter.getUnsafeEverythingFilter() ); String lineagePath = lineage.getSeedPath(); @@ -676,7 +676,7 @@ public static void updateBuiltInColumns(ModuleContext ctx) for (Integer plateSetId : plateSetIds) { - PlateSet plateSet = PlateService.get().getPlateSet(ContainerFilter.EVERYTHING_UNSAFE, plateSetId); + PlateSet plateSet = PlateService.get().getPlateSet(ContainerFilter.getUnsafeEverythingFilter(), plateSetId); if (plateSet == null) throw new IllegalStateException("updateBuiltInColumns: Plate Set with plate of id " + plateSetId + " not found."); diff --git a/assay/src/org/labkey/assay/plate/PlateManager.java b/assay/src/org/labkey/assay/plate/PlateManager.java index f469a03906d..de01e0159da 100644 --- a/assay/src/org/labkey/assay/plate/PlateManager.java +++ b/assay/src/org/labkey/assay/plate/PlateManager.java @@ -548,7 +548,7 @@ public Map getPlateRunCounts(@NotNull Container c, @NotNull User for (ExpProtocol protocol : protocols) { AssayProtocolSchema assayProtocolSchema = provider.createProtocolSchema(user, protocol.getContainer(), protocol, null); - TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.EVERYTHING_UNSAFE, false); + TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.getUnsafeEverythingFilter(), false); if (assayDataTable != null) { ColumnInfo dataIdCol = assayDataTable.getColumn("DataId"); @@ -612,7 +612,7 @@ private int getRunCountUsingPlateInResults(@NotNull Container c, @NotNull User u for (ExpProtocol protocol : protocols) { AssayProtocolSchema assayProtocolSchema = provider.createProtocolSchema(user, protocol.getContainer(), protocol, null); - TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.EVERYTHING_UNSAFE, false); + TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.getUnsafeEverythingFilter(), false); if (assayDataTable != null) { ColumnInfo dataIdCol = assayDataTable.getColumn("DataId"); @@ -3192,7 +3192,7 @@ public void markHits( if (plateSet == null) throw new ValidationException(String.format("Failed to mark hits. Unable to resolve plate set for \"%s\" result (Row Id %d)", protocol.getName(), resultId)); - PlateSetLineage lineage = getPlateSetLineage(container, user, plateSet.getRowId(), ContainerFilter.EVERYTHING_UNSAFE); + PlateSetLineage lineage = getPlateSetLineage(container, user, plateSet.getRowId(), ContainerFilter.getUnsafeEverythingFilter()); String plateSetPath = lineage.getSeedPath(); cache.put(plateId, Pair.of(plate.getContainer().getEntityId(), plateSetPath)); @@ -3342,7 +3342,7 @@ public PlateSetAssays getPlateSetAssays(Container container, User user, int plat for (ExpProtocol protocol : protocols) { AssayProtocolSchema assayProtocolSchema = provider.createProtocolSchema(user, protocol.getContainer(), protocol, null); - TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.EVERYTHING_UNSAFE, false); + TableInfo assayDataTable = assayProtocolSchema.createDataTable(ContainerFilter.getUnsafeEverythingFilter(), false); if (assayDataTable != null) { diff --git a/audit/src/org/labkey/audit/query/AuditLogUnionTable.java b/audit/src/org/labkey/audit/query/AuditLogUnionTable.java index 432f3496739..322c718d4be 100644 --- a/audit/src/org/labkey/audit/query/AuditLogUnionTable.java +++ b/audit/src/org/labkey/audit/query/AuditLogUnionTable.java @@ -62,7 +62,7 @@ private static class AuditUnionTable extends VirtualTable public AuditUnionTable(@NotNull UserSchema schema, ContainerFilter cf) { - super(AuditSchema.getInstance().getSchema(), AuditQuerySchema.AUDIT_TABLE_NAME, schema, ContainerFilter.EVERYTHING_UNSAFE); + super(AuditSchema.getInstance().getSchema(), AuditQuerySchema.AUDIT_TABLE_NAME, schema, ContainerFilter.getUnsafeEverythingFilter()); _query = new SQLFragment(); _query.appendComment("", getSchema().getSqlDialect()); diff --git a/core/src/org/labkey/core/query/CoreQuerySchema.java b/core/src/org/labkey/core/query/CoreQuerySchema.java index 518693fd6eb..73f438b636a 100644 --- a/core/src/org/labkey/core/query/CoreQuerySchema.java +++ b/core/src/org/labkey/core/query/CoreQuerySchema.java @@ -315,7 +315,7 @@ private void toggleExpirationDateColumn(FilteredTable users) public TableInfo getPrincipals() { TableInfo principalsBase = CoreSchema.getInstance().getTableInfoPrincipals(); - FilteredTable principals = new FilteredTable<>(principalsBase, this, ContainerFilter.EVERYTHING_UNSAFE); + FilteredTable principals = new FilteredTable<>(principalsBase, this, ContainerFilter.getUnsafeEverythingFilter()); //we expose userid, name and type via query var col = principals.wrapColumn(principalsBase.getColumn("UserId")); diff --git a/experiment/src/org/labkey/experiment/ParentChildView.java b/experiment/src/org/labkey/experiment/ParentChildView.java index e7c4232243b..2bdb4ce22aa 100644 --- a/experiment/src/org/labkey/experiment/ParentChildView.java +++ b/experiment/src/org/labkey/experiment/ParentChildView.java @@ -142,7 +142,7 @@ else if (!classId.equals(id)) QueryView queryView = new QueryView(schema, settings, null); // Issue 38018: Sample Type: Multiple data inputs from different containers are not shown in the Parent Data grid // Use ContainerFilter.EVERYTHING - We've already set an IN clause that restricts us to showing just data that we have permission to view - queryView.setContainerFilter(ContainerFilter.EVERYTHING_UNSAFE); + queryView.setContainerFilter(ContainerFilter.getUnsafeEverythingFilter()); TableInfo table = queryView.getTable(); CustomView v = queryView.getCustomView(); @@ -225,7 +225,7 @@ else if (!typeName.equals(type)) protected TableInfo createTable() { // Use ContainerFilter.EVERYTHING - We've already set an IN clause that restricts us to showing just data that we have permission to view - ExpMaterialTable table = ExperimentServiceImpl.get().createMaterialTable(getSchema(), ContainerFilter.EVERYTHING_UNSAFE, st); + ExpMaterialTable table = ExperimentServiceImpl.get().createMaterialTable(getSchema(), ContainerFilter.getUnsafeEverythingFilter(), st); table.populate(); List defaultVisibleColumns = new ArrayList<>(); diff --git a/query/src/org/labkey/query/sql/CalculatedColumnTestCase.jsp b/query/src/org/labkey/query/sql/CalculatedColumnTestCase.jsp index 8adba5223de..b8756ca2289 100644 --- a/query/src/org/labkey/query/sql/CalculatedColumnTestCase.jsp +++ b/query/src/org/labkey/query/sql/CalculatedColumnTestCase.jsp @@ -394,7 +394,7 @@ UserSchema getUserSchema(String columns) throws Exception TableInfo getUserTableInfo(String columns) throws Exception { UserSchema userSchema = getUserSchema(columns); - return userSchema.getTable("R", ContainerFilter.EVERYTHING_UNSAFE, true, false); + return userSchema.getTable("R", ContainerFilter.getUnsafeEverythingFilter(), true, false); } diff --git a/query/src/org/labkey/query/sql/QValuesTable.java b/query/src/org/labkey/query/sql/QValuesTable.java index 21ed1ff888b..92d02b523d9 100644 --- a/query/src/org/labkey/query/sql/QValuesTable.java +++ b/query/src/org/labkey/query/sql/QValuesTable.java @@ -62,7 +62,7 @@ public void setQueryRelation(QueryRelation queryRelation) @Override public ContainerFilter.Type getContainerFilterType() { - return ContainerFilter.EVERYTHING_UNSAFE.getType(); + return ContainerFilter.getUnsafeEverythingFilter().getType(); } class _QueryRelation extends AbstractQueryRelation diff --git a/search/src/org/labkey/search/SearchModule.java b/search/src/org/labkey/search/SearchModule.java index 6a22f17ce98..27ef6e9f0eb 100644 --- a/search/src/org/labkey/search/SearchModule.java +++ b/search/src/org/labkey/search/SearchModule.java @@ -189,7 +189,7 @@ public void handle(Map properties // Report the total number of search entries in the audit log User user = new LimitedUser(User.getSearchUser(), CanSeeAuditLogRole.class); UserSchema auditSchema = AuditLogService.get().createSchema(user, ContainerManager.getRoot()); - TableInfo auditTable = auditSchema.getTableOrThrow(SearchAuditProvider.EVENT_TYPE, ContainerFilter.EVERYTHING_UNSAFE); + TableInfo auditTable = auditSchema.getTableOrThrow(SearchAuditProvider.EVENT_TYPE, ContainerFilter.getUnsafeEverythingFilter()); long count = new TableSelector(auditTable).getRowCount(); return Collections.singletonMap("fullTextSearches", count); diff --git a/study/src/org/labkey/study/assay/query/PublishAuditProvider.java b/study/src/org/labkey/study/assay/query/PublishAuditProvider.java index 64d9f58dd6c..650ff5bd6e8 100644 --- a/study/src/org/labkey/study/assay/query/PublishAuditProvider.java +++ b/study/src/org/labkey/study/assay/query/PublishAuditProvider.java @@ -127,7 +127,7 @@ else if (COLUMN_NAME_SAMPLE_TYPE_ID.equalsIgnoreCase(col.getName())) { // lookup to SampleType by ID col.setLabel("Sample Type ID"); - col.setFk(QueryForeignKey.from(getUserSchema(), ContainerFilter.EVERYTHING_UNSAFE).schema(ExpSchema.SCHEMA_NAME).table(ExpSchema.TableType.SampleSets)); + col.setFk(QueryForeignKey.from(getUserSchema(), ContainerFilter.getUnsafeEverythingFilter()).schema(ExpSchema.SCHEMA_NAME).table(ExpSchema.TableType.SampleSets)); // ExpSampleTypeTableImpl uses a details URL with the current Container as the URL's fixed // container context, but we would like to use the audit event row's container column instead. diff --git a/study/src/org/labkey/study/query/AssayDatasetTable.java b/study/src/org/labkey/study/query/AssayDatasetTable.java index 09e38a62ad7..8281d02d88e 100644 --- a/study/src/org/labkey/study/query/AssayDatasetTable.java +++ b/study/src/org/labkey/study/query/AssayDatasetTable.java @@ -302,7 +302,7 @@ private TableInfo getAssayResultTable() } AssayProtocolSchema schema = provider.createProtocolSchema(_userSchema.getUser(), protocol.getContainer(), protocol, getContainer()); schema.addContextualRole(RoleManager.getRole(ReaderRole.class)); - _assayResultTable = schema.createDataTable(ContainerFilter.EVERYTHING_UNSAFE, false); + _assayResultTable = schema.createDataTable(ContainerFilter.getUnsafeEverythingFilter(), false); schema.overlayMetadata(_assayResultTable, AssayProtocolSchema.DATA_TABLE_NAME); } return _assayResultTable; diff --git a/study/src/org/labkey/study/query/DatasetQueryView.java b/study/src/org/labkey/study/query/DatasetQueryView.java index 9486ac4abc7..2e4274043dd 100644 --- a/study/src/org/labkey/study/query/DatasetQueryView.java +++ b/study/src/org/labkey/study/query/DatasetQueryView.java @@ -846,7 +846,7 @@ else if (!timepointCol.isDateTimeType()) public SQLFragment getValidationSql(Container container, User user, ExpProtocol protocol, TableInfo dataTable) { var sqs = StudyQuerySchema.createSchema(_dataset.getStudy(), user, null); - TableInfo datasetTable = sqs.getDatasetTable(_dataset, ContainerFilter.EVERYTHING_UNSAFE); + TableInfo datasetTable = sqs.getDatasetTable(_dataset, ContainerFilter.getUnsafeEverythingFilter()); String studyVisit = _dataset.getStudy().getTimepointType().isVisitBased() ? "SequenceNum" : "Date"; if (datasetTable instanceof FilteredTable filteredTable) @@ -869,7 +869,7 @@ public SQLFragment getValidationSql(Container container, User user, ExpProtocol @Override public @Nullable ContainerFilter getContainerFilter() { - return ContainerFilter.EVERYTHING_UNSAFE; + return ContainerFilter.getUnsafeEverythingFilter(); } } } diff --git a/study/src/org/labkey/study/query/SampleDatasetTable.java b/study/src/org/labkey/study/query/SampleDatasetTable.java index fce65cb34ac..bdc338e04b3 100644 --- a/study/src/org/labkey/study/query/SampleDatasetTable.java +++ b/study/src/org/labkey/study/query/SampleDatasetTable.java @@ -124,7 +124,7 @@ private TableInfo getSamplesTable() // It is easier to handle these changes on the construction-side, so we use a helper schema // CONSIDER: do we need a version of getTable() that allows passing custom options? var noLinks = Objects.requireNonNull(samplesSchema.getSchema(SamplesSchema.STUDY_LINKED_SCHEMA_NAME)); - _sampleTable = Objects.requireNonNull(noLinks.getTable(sampleType.getName(), ContainerFilter.EVERYTHING_UNSAFE)); + _sampleTable = Objects.requireNonNull(noLinks.getTable(sampleType.getName(), ContainerFilter.getUnsafeEverythingFilter())); } else { diff --git a/study/src/org/labkey/study/query/VialTable.java b/study/src/org/labkey/study/query/VialTable.java index 2df2874c5f2..54e51ab8f22 100644 --- a/study/src/org/labkey/study/query/VialTable.java +++ b/study/src/org/labkey/study/query/VialTable.java @@ -52,7 +52,7 @@ public TableInfo getLookupTableInfo() TableInfo tableInfo = schema.getTable(StudyQuerySchema.SIMPLE_SPECIMEN_TABLE_NAME); if (tableInfo instanceof ContainerFilterable) { - ((ContainerFilterable) tableInfo).setContainerFilter(ContainerFilter.EVERYTHING_UNSAFE); // TODO: what would this do without provisioned? + ((ContainerFilterable) tableInfo).setContainerFilter(ContainerFilter.getUnsafeEverythingFilter()); // TODO: what would this do without provisioned? } return tableInfo; }