chore: Update copyright year from 2025 to 2026 across core files

- Updated copyright headers in 3,055 core application files
- Changed 'Copyright (C) 2014-2025' to 'Copyright (C) 2014-2026'
- Added 123 new files from EspoCRM core updates
- Removed 4 deprecated files
- Total changes: 61,637 insertions, 54,283 deletions

This is a routine maintenance update for the new year 2026.
This commit is contained in:
2026-02-07 16:05:21 +01:00
parent 6a8a4a2882
commit 127fa6503b
6468 changed files with 564781 additions and 31179 deletions

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -29,7 +29,7 @@
namespace Espo\Core\Select\AccessControl;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
/**
* An access filter.
@@ -42,5 +42,5 @@ use Espo\ORM\Query\SelectBuilder as QueryBuilder;
*/
interface Filter
{
public function apply(QueryBuilder $queryBuilder): void;
public function apply(SelectBuilder $queryBuilder): void;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -29,10 +29,14 @@
namespace Espo\Core\Select\AccessControl\Filters;
use Espo\Core\Acl\AssignmentChecker\Helper;
use Espo\Core\Name\Field;
use Espo\Core\Select\AccessControl\Filter;
use Espo\ORM\Defs;
use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\Part\Condition as Cond;
use Espo\ORM\Query\Part\Expression as Expr;
use Espo\ORM\Query\Part\Where\OrGroup;
use Espo\ORM\Query\SelectBuilder;
use Espo\Core\Utils\Metadata;
use Espo\Entities\User;
@@ -45,7 +49,8 @@ class ForeignOnlyOwn implements Filter
private string $entityType,
private User $user,
private Metadata $metadata,
private Defs $defs
private Defs $defs,
private Helper $helper,
) {}
public function apply(SelectBuilder $queryBuilder): void
@@ -53,7 +58,7 @@ class ForeignOnlyOwn implements Filter
$link = $this->metadata->get(['aclDefs', $this->entityType, 'link']);
if (!$link) {
throw new LogicException("No `link` in aclDefs for {$this->entityType}.");
throw new LogicException("No `link` in aclDefs for $this->entityType.");
}
$alias = $link . 'Access';
@@ -67,18 +72,82 @@ class ForeignOnlyOwn implements Filter
$foreignEntityDefs = $this->defs->getEntity($foreignEntityType);
$orBuilder = OrGroup::createBuilder();
if ($this->helper->hasCollaboratorsField($foreignEntityType)) {
$orBuilder->add(
Cond::equal(
Expr::column("$alias." . Attribute::ID),
SelectBuilder::create()
->from(User::RELATIONSHIP_ENTITY_COLLABORATOR, 's')
->select('s.entityId')
->where(
Cond::and(
Cond::equal(
Expr::column('s.entityType'),
$foreignEntityType,
),
Cond::equal(
Expr::column('s.userId'),
$this->user->getId(),
)
)
)
->build()
)
);
}
if ($this->helper->hasAssignedUsersField($foreignEntityType)) {
$orBuilder->add(
Cond::equal(
Expr::column("$alias." . Attribute::ID),
SelectBuilder::create()
->from(User::RELATIONSHIP_ENTITY_USER, 's')
->select('s.entityId')
->where(
Cond::and(
Cond::equal(
Expr::column('s.entityType'),
$foreignEntityType,
),
Cond::equal(
Expr::column('s.userId'),
$this->user->getId(),
)
)
)
->build()
)
);
$queryBuilder->where($orBuilder->build());
return;
}
if ($foreignEntityDefs->hasField(Field::ASSIGNED_USER)) {
$queryBuilder->where([
"{$alias}.assignedUserId" => $this->user->getId(),
]);
$orBuilder->add(
Cond::equal(
Expr::column("$alias.assignedUserId"),
$this->user->getId()
)
);
$queryBuilder->where($orBuilder->build());
return;
}
if ($foreignEntityDefs->hasField(Field::CREATED_BY)) {
$queryBuilder->where([
"{$alias}.createdById" => $this->user->getId(),
]);
$orBuilder->add(
Cond::equal(
Expr::column("$alias.createdById"),
$this->user->getId()
)
);
$queryBuilder->where($orBuilder->build());
return;
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -29,13 +29,15 @@
namespace Espo\Core\Select\AccessControl\Filters;
use Espo\Core\Acl\AssignmentChecker\Helper;
use Espo\Core\Name\Field;
use Espo\Core\Select\AccessControl\Filter;
use Espo\Entities\Team;
use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\Part\Condition;
use Espo\ORM\Query\Part\Expression;
use Espo\ORM\Query\Part\Condition as Cond;
use Espo\ORM\Query\Part\Expression as Expr;
use Espo\ORM\Query\Part\Where\OrGroup;
use Espo\ORM\Query\Part\Where\OrGroupBuilder;
use Espo\ORM\Query\SelectBuilder;
use Espo\Core\Utils\Metadata;
use Espo\ORM\Defs;
@@ -52,7 +54,8 @@ class ForeignOnlyTeam implements Filter
private string $entityType,
private User $user,
private Metadata $metadata,
private Defs $defs
private Defs $defs,
private Helper $helper,
) {}
public function apply(SelectBuilder $queryBuilder): void
@@ -65,33 +68,149 @@ class ForeignOnlyTeam implements Filter
$alias = "{$link}Access";
$ownerAttribute = $this->getOwnerAttribute($link);
$foreignEntityType = $this->getForeignEntityType($link);
if (!$ownerAttribute) {
$queryBuilder->leftJoin($link, $alias);
$orBuilder = OrGroup::createBuilder();
$this->applyCollaborators($foreignEntityType, $orBuilder, $alias);
$this->applyAssignedUsers($foreignEntityType, $orBuilder, $alias);
$this->applyAssignedUser($foreignEntityType, $orBuilder, $alias);
$this->applyCreatedBy($foreignEntityType, $orBuilder, $alias);
$this->applyTeams($foreignEntityType, $orBuilder, $alias);
if ($orBuilder->build()->getItemCount() === 0) {
$queryBuilder->where([Attribute::ID => null]);
return;
}
$teamIdList = $this->user->getTeamIdList();
$queryBuilder
->where($orBuilder->build())
->where(["$alias.id!=" => null]);
}
if (count($teamIdList) === 0) {
$queryBuilder
->leftJoin($link, $alias)
->where(["$alias.$ownerAttribute" => $this->user->getId()]);
private function getForeignEntityType(string $link): string
{
return $this->defs
->getEntity($this->entityType)
->getRelation($link)
->getForeignEntityType();
}
private function applyCollaborators(string $foreignEntityType, OrGroupBuilder $orBuilder, string $alias): void
{
if (!$this->helper->hasCollaboratorsField($foreignEntityType)) {
return;
}
$foreignEntityType = $this->getForeignEntityType($link);
$orBuilder->add(
Cond::equal(
Expr::column("$alias." . Attribute::ID),
SelectBuilder::create()
->from(User::RELATIONSHIP_ENTITY_COLLABORATOR, 's')
->select('s.entityId')
->where(
Cond::and(
Cond::equal(
Expr::column('s.entityType'),
$foreignEntityType,
),
Cond::equal(
Expr::column('s.userId'),
$this->user->getId(),
)
)
)
->build()
)
);
}
$orGroup = OrGroup::create(
Condition::equal(
Expression::column("$alias.$ownerAttribute"),
private function applyAssignedUsers(
string $foreignEntityType,
OrGroupBuilder $orBuilder,
string $alias,
): void {
if (!$this->helper->hasAssignedUsersField($foreignEntityType)) {
return;
}
$orBuilder->add(
Cond::equal(
Expr::column("$alias." . Attribute::ID),
SelectBuilder::create()
->from(User::RELATIONSHIP_ENTITY_USER, 's')
->select('s.entityId')
->where(
Cond::and(
Cond::equal(
Expr::column('s.entityType'),
$foreignEntityType,
),
Cond::equal(
Expr::column('s.userId'),
$this->user->getId(),
)
)
)
->build()
)
);
}
private function applyAssignedUser(string $foreignEntityType, OrGroupBuilder $orBuilder, string $alias): void
{
$foreignEntityDefs = $this->defs->getEntity($foreignEntityType);
if (
$this->helper->hasAssignedUsersField($foreignEntityType) ||
!$foreignEntityDefs->hasField(Field::ASSIGNED_USER)
) {
return;
}
$orBuilder->add(
Cond::equal(
Expr::column("$alias.assignedUserId"),
$this->user->getId()
),
Condition::in(
Expression::column("$alias.id"),
)
);
}
private function applyCreatedBy(string $foreignEntityType, OrGroupBuilder $orBuilder, string $alias): void
{
$foreignEntityDefs = $this->defs->getEntity($foreignEntityType);
if (
$this->helper->hasAssignedUsersField($foreignEntityType) ||
$foreignEntityDefs->hasField(Field::ASSIGNED_USER) ||
!$foreignEntityDefs->hasField(Field::CREATED_BY)
) {
return;
}
$orBuilder->add(
Cond::equal(
Expr::column("$alias.createdById"),
$this->user->getId()
)
);
}
private function applyTeams(string $foreignEntityType, OrGroupBuilder $orBuilder, string $alias): void
{
$teamIdList = $this->user->getTeamIdList();
if (count($teamIdList) === 0) {
return;
}
$orBuilder->add(
Cond::in(
Expr::column("$alias.id"),
SelectBuilder::create()
->from(Team::RELATIONSHIP_ENTITY_TEAM)
->select('entityId')
@@ -102,35 +221,5 @@ class ForeignOnlyTeam implements Filter
->build()
)
);
$queryBuilder
->leftJoin($link, $alias)
->where($orGroup)
->where(["$alias.id!=" => null]);
}
private function getOwnerAttribute(string $link): ?string
{
$foreignEntityType = $this->getForeignEntityType($link);
$foreignEntityDefs = $this->defs->getEntity($foreignEntityType);
if ($foreignEntityDefs->hasField(Field::ASSIGNED_USER)) {
return 'assignedUserId';
}
if ($foreignEntityDefs->hasField(Field::CREATED_BY)) {
return 'createdById';
}
return null;
}
private function getForeignEntityType(string $link): string
{
return $this->defs
->getEntity($this->entityType)
->getRelation($link)
->getForeignEntityType();
}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -30,10 +30,10 @@
namespace Espo\Core\Select\AccessControl\Filters;
use Espo\Core\Select\AccessControl\Filter;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
class Mandatory implements Filter
{
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -31,11 +31,11 @@ namespace Espo\Core\Select\AccessControl\Filters;
use Espo\Core\Select\AccessControl\Filter;
use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
class No implements Filter
{
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{
$queryBuilder->where([Attribute::ID => null]);
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -37,7 +37,7 @@ use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\Part\Where\OrGroup;
use Espo\ORM\Query\Part\WhereClause;
use Espo\ORM\Query\Part\WhereItem;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
class OnlyOwn implements Filter
{
@@ -48,7 +48,7 @@ class OnlyOwn implements Filter
private RelationQueryHelper $relationQueryHelper,
) {}
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{
$ownItem = $this->getOwnWhereItem();
@@ -67,7 +67,7 @@ class OnlyOwn implements Filter
$queryBuilder->where($ownItem);
}
private function applyCollaborators(QueryBuilder $queryBuilder, ?WhereItem $ownItem): void
private function applyCollaborators(SelectBuilder $queryBuilder, ?WhereItem $ownItem): void
{
$sharedItem = $this->relationQueryHelper->prepareCollaboratorsWhere($this->entityType, $this->user->getId());

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -36,7 +36,7 @@ use Espo\Entities\Team;
use Espo\Entities\User;
use Espo\ORM\Defs;
use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
/**
* @noinspection PhpUnused
@@ -50,7 +50,7 @@ class OnlyTeam implements Filter
private Defs $defs
) {}
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{
if (!$this->fieldHelper->hasTeamsField()) {
$queryBuilder->where([Attribute::ID => null]);
@@ -58,7 +58,7 @@ class OnlyTeam implements Filter
return;
}
$subQueryBuilder = QueryBuilder::create()
$subQueryBuilder = SelectBuilder::create()
->select(Attribute::ID)
->from($this->entityType)
->leftJoin(Team::RELATIONSHIP_ENTITY_TEAM, 'entityTeam', [

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -30,10 +30,10 @@
namespace Espo\Core\Select\AccessControl\Filters;
use Espo\Core\Select\AccessControl\Filter;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
class PortalAll implements Filter
{
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{}
}

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -41,7 +41,7 @@ use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\Part\Where\OrGroup;
use Espo\ORM\Query\Part\WhereClause;
use Espo\ORM\Query\Part\WhereItem;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
class PortalOnlyAccount implements Filter
{
@@ -53,7 +53,7 @@ class PortalOnlyAccount implements Filter
private RelationQueryHelper $relationQueryHelper,
) {}
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{
$orBuilder = OrGroup::createBuilder();
@@ -96,7 +96,7 @@ class PortalOnlyAccount implements Filter
/**
* @param string[] $ids
*/
private function prepareAccountWhere(QueryBuilder $queryBuilder, array $ids): ?WhereItem
private function prepareAccountWhere(SelectBuilder $queryBuilder, array $ids): ?WhereItem
{
$defs = $this->metadataProvider->getAccountLink($this->entityType);
@@ -107,7 +107,7 @@ class PortalOnlyAccount implements Filter
return $this->relationQueryHelper->prepareLinkWhere($defs, Account::ENTITY_TYPE, $ids, $queryBuilder);
}
private function prepareContactWhere(QueryBuilder $queryBuilder, string $id): ?WhereItem
private function prepareContactWhere(SelectBuilder $queryBuilder, string $id): ?WhereItem
{
$defs = $this->metadataProvider->getContactLink($this->entityType);

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -40,7 +40,7 @@ use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\Part\Where\OrGroup;
use Espo\ORM\Query\Part\WhereClause;
use Espo\ORM\Query\Part\WhereItem;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
class PortalOnlyContact implements Filter
{
@@ -52,7 +52,7 @@ class PortalOnlyContact implements Filter
private RelationQueryHelper $relationQueryHelper,
) {}
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{
$orBuilder = OrGroup::createBuilder();
@@ -83,7 +83,7 @@ class PortalOnlyContact implements Filter
$queryBuilder->where($orGroup);
}
private function prepareContactWhere(QueryBuilder $queryBuilder, string $id): ?WhereItem
private function prepareContactWhere(SelectBuilder $queryBuilder, string $id): ?WhereItem
{
$defs = $this->metadataProvider->getContactLink($this->entityType);

View File

@@ -3,7 +3,7 @@
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
@@ -33,14 +33,14 @@ use Espo\Core\Select\AccessControl\Filter;
use Espo\Core\Select\Helpers\FieldHelper;
use Espo\Entities\User;
use Espo\ORM\Name\Attribute;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
use Espo\ORM\Query\SelectBuilder;
class PortalOnlyOwn implements Filter
{
public function __construct(private User $user, private FieldHelper $fieldHelper)
{}
public function apply(QueryBuilder $queryBuilder): void
public function apply(SelectBuilder $queryBuilder): void
{
if ($this->fieldHelper->hasCreatedByField()) {
$queryBuilder->where([