Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2484977
SharedFoldersController.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
SharedFoldersController.php
View Options
<?php
namespace
App\Http\Controllers\API\V4
;
use
App\Http\Controllers\RelationController
;
use
App\SharedFolder
;
use
App\Rules\SharedFolderName
;
use
App\Rules\SharedFolderType
;
use
Illuminate\Http\Request
;
use
Illuminate\Support\Facades\DB
;
use
Illuminate\Support\Facades\Validator
;
use
Illuminate\Support\Str
;
class
SharedFoldersController
extends
RelationController
{
/** @var string Resource localization label */
protected
$label
=
'shared-folder'
;
/** @var string Resource model name */
protected
$model
=
SharedFolder
::
class
;
/** @var array Resource listing order (column names) */
protected
$order
=
[
'name'
];
/** @var array Common object properties in the API response */
protected
$objectProps
=
[
'email'
,
'name'
,
'type'
];
/**
* SharedFolder status (extended) information
*
* @param \App\SharedFolder $folder SharedFolder object
*
* @return array Status information
*/
public
static
function
statusInfo
(
$folder
):
array
{
return
self
::
processStateInfo
(
$folder
,
[
'shared-folder-new'
=>
true
,
'shared-folder-ldap-ready'
=>
$folder
->
isLdapReady
(),
'shared-folder-imap-ready'
=>
$folder
->
isImapReady
(),
]
);
}
/**
* Create a new shared folder record.
*
* @param \Illuminate\Http\Request $request The API request.
*
* @return \Illuminate\Http\JsonResponse The response
*/
public
function
store
(
Request
$request
)
{
$current_user
=
$this
->
guard
()->
user
();
$owner
=
$current_user
->
walletOwner
();
if
(
empty
(
$owner
)
||
$owner
->
id
!=
$current_user
->
id
)
{
return
$this
->
errorResponse
(
403
);
}
if
(
$error_response
=
$this
->
validateFolderRequest
(
$request
,
null
,
$owner
))
{
return
$error_response
;
}
DB
::
beginTransaction
();
// Create the shared folder
$folder
=
new
SharedFolder
();
$folder
->
name
=
$request
->
input
(
'name'
);
$folder
->
type
=
$request
->
input
(
'type'
);
$folder
->
domainName
=
$request
->
input
(
'domain'
);
$folder
->
save
();
if
(!
empty
(
$request
->
aliases
)
&&
$folder
->
type
===
'mail'
)
{
$folder
->
setAliases
(
$request
->
aliases
);
}
$folder
->
assignToWallet
(
$owner
->
wallets
->
first
());
DB
::
commit
();
return
response
()->
json
([
'status'
=>
'success'
,
'message'
=>
self
::
trans
(
'app.shared-folder-create-success'
),
]);
}
/**
* Update a shared folder.
*
* @param \Illuminate\Http\Request $request The API request.
* @param string $id Shared folder identifier
*
* @return \Illuminate\Http\JsonResponse The response
*/
public
function
update
(
Request
$request
,
$id
)
{
$folder
=
SharedFolder
::
find
(
$id
);
if
(!
$this
->
checkTenant
(
$folder
))
{
return
$this
->
errorResponse
(
404
);
}
$current_user
=
$this
->
guard
()->
user
();
if
(!
$current_user
->
canUpdate
(
$folder
))
{
return
$this
->
errorResponse
(
403
);
}
if
(
$error_response
=
$this
->
validateFolderRequest
(
$request
,
$folder
,
$folder
->
walletOwner
()))
{
return
$error_response
;
}
$name
=
$request
->
input
(
'name'
);
DB
::
beginTransaction
();
// SkusController::updateEntitlements($folder, $request->skus);
if
(
$name
&&
$name
!=
$folder
->
name
)
{
$folder
->
name
=
$name
;
}
$folder
->
save
();
if
(
isset
(
$request
->
aliases
)
&&
$folder
->
type
===
'mail'
)
{
$folder
->
setAliases
(
$request
->
aliases
);
}
DB
::
commit
();
return
response
()->
json
([
'status'
=>
'success'
,
'message'
=>
self
::
trans
(
'app.shared-folder-update-success'
),
]);
}
/**
* Execute (synchronously) specified step in a shared folder setup process.
*
* @param \App\SharedFolder $folder Shared folder object
* @param string $step Step identifier (as in self::statusInfo())
*
* @return bool|null True if the execution succeeded, False if not, Null when
* the job has been sent to the worker (result unknown)
*/
public
static
function
execProcessStep
(
SharedFolder
$folder
,
string
$step
):
?
bool
{
try
{
if
(
strpos
(
$step
,
'domain-'
)
===
0
)
{
return
DomainsController
::
execProcessStep
(
$folder
->
domain
(),
$step
);
}
switch
(
$step
)
{
case
'shared-folder-ldap-ready'
:
case
'shared-folder-imap-ready'
:
// Use worker to do the job, frontend might not have the IMAP admin credentials
\App\Jobs\SharedFolder\CreateJob
::
dispatch
(
$folder
->
id
);
return
null
;
}
}
catch
(
\Exception
$e
)
{
\Log
::
error
(
$e
);
}
return
false
;
}
/**
* Validate shared folder input
*
* @param \Illuminate\Http\Request $request The API request.
* @param \App\SharedFolder|null $folder Shared folder
* @param \App\User|null $owner Account owner
*
* @return \Illuminate\Http\JsonResponse|null The error response on error
*/
protected
function
validateFolderRequest
(
Request
$request
,
$folder
,
$owner
)
{
$errors
=
[];
if
(
empty
(
$folder
))
{
$name
=
$request
->
input
(
'name'
);
$domain
=
$request
->
input
(
'domain'
);
$rules
=
[
'name'
=>
[
'required'
,
'string'
,
new
SharedFolderName
(
$owner
,
$domain
)],
'type'
=>
[
'required'
,
'string'
,
new
SharedFolderType
()],
];
}
else
{
// On update validate the folder name (if changed)
$name
=
$request
->
input
(
'name'
);
$domain
=
explode
(
'@'
,
$folder
->
email
,
2
)[
1
];
if
(
$name
!==
null
&&
$name
!=
$folder
->
name
)
{
$rules
=
[
'name'
=>
[
'required'
,
'string'
,
new
SharedFolderName
(
$owner
,
$domain
)]];
}
}
if
(!
empty
(
$rules
))
{
$v
=
Validator
::
make
(
$request
->
all
(),
$rules
);
if
(
$v
->
fails
())
{
$errors
=
$v
->
errors
()->
toArray
();
}
}
// Validate aliases input
if
(
isset
(
$request
->
aliases
))
{
$aliases
=
[];
$existing_aliases
=
$owner
->
aliases
()->
get
()->
pluck
(
'alias'
)->
toArray
();
foreach
(
$request
->
aliases
as
$idx
=>
$alias
)
{
if
(
is_string
(
$alias
)
&&
!
empty
(
$alias
))
{
// Alias cannot be the same as the email address
if
(!
empty
(
$folder
)
&&
Str
::
lower
(
$alias
)
==
Str
::
lower
(
$folder
->
email
))
{
continue
;
}
// validate new aliases
if
(
!
in_array
(
$alias
,
$existing_aliases
)
&&
(
$error
=
self
::
validateAlias
(
$alias
,
$owner
,
$name
,
$domain
))
)
{
if
(!
isset
(
$errors
[
'aliases'
]))
{
$errors
[
'aliases'
]
=
[];
}
$errors
[
'aliases'
][
$idx
]
=
$error
;
continue
;
}
$aliases
[]
=
$alias
;
}
}
$request
->
aliases
=
$aliases
;
}
if
(!
empty
(
$errors
))
{
return
response
()->
json
([
'status'
=>
'error'
,
'errors'
=>
$errors
],
422
);
}
return
null
;
}
/**
* Email address validation for use as a shared folder alias.
*
* @param string $alias Email address
* @param \App\User $owner The account owner
* @param string $folderName Folder name
* @param string $domain Folder domain
*
* @return ?string Error message on validation error
*/
public
static
function
validateAlias
(
string
$alias
,
\App\User
$owner
,
string
$folderName
,
string
$domain
):
?
string
{
$lmtp_alias
=
"shared+shared/{$folderName}@{$domain}"
;
if
(
$alias
===
$lmtp_alias
)
{
return
null
;
}
return
UsersController
::
validateAlias
(
$alias
,
$owner
);
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Thu, Nov 20, 5:03 PM (17 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
387221
Default Alt Text
SharedFoldersController.php (8 KB)
Attached To
Mode
R2 kolab
Attached
Detach File
Event Timeline
Log In to Comment