Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions ProcessMaker/Enums/ExporterMap.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace ProcessMaker\Enums;

use ProcessMaker\Models\ProcessMakerModel;

enum ExporterMap
{
const TYPES = [
Expand Down Expand Up @@ -30,4 +32,13 @@ public static function getExporterClass(string $type): ?string
{
return self::TYPES[$type][1] ?? null;
}

public static function getExporterClassForModel(ProcessMakerModel $model): string | null
{
$class = get_class($model);

return collect(self::TYPES)->first(function ($type) use ($class) {
return $type[0] == $class;
})[1] ?? null;
}
}
9 changes: 9 additions & 0 deletions ProcessMaker/Exception/ExporterNotSupported.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace ProcessMaker\Exception;

use Exception;

class ExporterNotSupported extends Exception
{
}
105 changes: 105 additions & 0 deletions ProcessMaker/Http/Controllers/Admin/DevLinkController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
<?php

namespace ProcessMaker\Http\Controllers\Admin;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Laravel\Passport\Client;
use ProcessMaker\Http\Controllers\Controller;
use ProcessMaker\Models\DevLink;

class DevLinkController extends Controller
{
public function index(Request $request)
{
$updatedDevLink = $this->storeClientCredentials($request);

if ($updatedDevLink) {
return redirect($updatedDevLink->getOauthRedirectUrl());
}

$updatedDevLink = $this->storeOauthCredentials($request);
if ($updatedDevLink) {
return redirect(route('devlink.index'));
}

return view('admin.devlink.index');
}

public function getOauthClient(Request $request)
{
$request->validate([
'devlink_id' => 'required',
'redirect_uri' => ['required', 'url'],
]);

$devLinkId = $request->input('devlink_id');
$redirectUri = $request->input('redirect_uri');

$client = Client::where([
'name' => 'devlink',
'redirect' => $redirectUri,
])->first();

if (!$client) {
$clientRepository = app('Laravel\Passport\ClientRepository');
$client = $clientRepository->create(null, 'devlink', $redirectUri);
}

$query = http_build_query([
'devlink_id' => $devLinkId,
'client_id' => $client->id,
'client_secret' => $client->secret,
]);

return redirect($redirectUri . '?' . $query);
}

private function storeClientCredentials(Request $request)
{
if (
$request->has('devlink_id') &&
$request->has('client_id') &&
$request->has('client_secret')
) {
$devlink = DevLink::findOrFail($request->input('devlink_id'));
$devlink->update([
'client_id' => $request->input('client_id'),
'client_secret' => $request->input('client_secret'),
]);

return $devlink;
}

return false;
}

private function storeOauthCredentials(Request $request)
{
if (
$request->has('state') &&
$request->has('code')
) {
$devlink = DevLink::where('state', $request->input('state'))->firstOrFail();

$response = Http::asForm()->post($devlink->url . '/oauth/token', [
'grant_type' => 'authorization_code',
'client_id' => $devlink->client_id,
'client_secret' => $devlink->client_secret,
'redirect_uri' => route('devlink.index'),
'code' => $request->input('code'),
]);

$response = $response->json();
$devlink->update([
'access_token' => $response['access_token'],
'refresh_token' => $response['refresh_token'],
'expires_in' => $response['expires_in'],
]);

return $devlink;
}

return false;
}
}
154 changes: 154 additions & 0 deletions ProcessMaker/Http/Controllers/Api/DevLinkController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?php

namespace ProcessMaker\Http\Controllers\Api;

use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use ProcessMaker\Http\Controllers\Controller;
use ProcessMaker\Models\Bundle;
use ProcessMaker\Models\DevLink;

class DevLinkController extends Controller
{
public function index()
{
return DevLink::all();
}

public function show(DevLink $devLink)
{
return $devLink;
}

public function store(Request $request)
{
$request->validate([
'name' => ['required', 'unique:dev_links,name'],
'url' => ['required', 'url', 'unique:dev_links,url'],
]);

$devLink = new DevLink();
$devLink->name = $request->input('name');
$devLink->url = $request->input('url');
$devLink->saveOrFail();

return [
...$devLink->toArray(),
'redirect_uri' => route('devlink.index'),
];
}

public function update(Request $request, DevLink $devLink)
{
$devLink->name = $request->input('name');
$devLink->saveOrFail();

return $devLink;
}

public function destroy(DevLink $devLink)
{
$devLink->delete();
}

public function ping(DevLink $devLink)
{
return $devLink->client()->get(route('api.devlink.pong', [], false));
}

public function pong()
{
return ['status' => 'ok'];
}

public function localBundles(Request $request)
{
if ($request->has('published')) {
return Bundle::published()->get();
}

return Bundle::get();
}

public function showBundle(Bundle $bundle)
{
return $bundle->load('assets');
}

public function remoteBundles(DevLink $devLink)
{
return $devLink->remoteBundles();
}

public function createBundle(Request $request)
{
$bundle = new Bundle();
$bundle->name = $request->input('name');
$bundle->published = (bool) $request->input('published', false);
$bundle->locked = (bool) $request->input('locked', false);
$bundle->version = 1;
$bundle->saveOrFail();

return $bundle;
}

public function updateBundle(Request $request, Bundle $bundle)
{
$bundle->name = $request->input('name');
$bundle->published = (bool) $request->input('published', false);
$bundle->locked = (bool) $request->input('locked', false);
$bundle->version = $bundle->version + 1;
$bundle->saveOrFail();

return $bundle;
}

public function deleteBundle(Bundle $bundle)
{
$bundle->delete();
}

public function installRemoteBundle(DevLink $devLink, $remoteBundleId)
{
return $devLink->installRemoteBundle($remoteBundleId);
}

public function exportLocalBundle(Bundle $bundle)
{
return ['payloads' => $bundle->export()];
}

public function exportLocalAsset(Request $request)
{
$asset = $request->input('class')::findOrFail($request->input('id'));

return $asset->export();
}

public function addAsset(Request $request, Bundle $bundle)
{
$request->validate([
'type' => ['required', 'string'],
'id' => Rule::unique('bundle_assets', 'asset_id')->where(function ($query) use ($request) {
$query->where([
'asset_id' => $request->input('id'),
'asset_type' => $request->input('type'),
]);
}),
],
[
'id.unique' => __('Asset already exists in bundle'),
]);

$asset = $request->input('type')::findOrFail($request->input('id'));
$bundle->addAsset($asset);
}

public function installRemoteAsset(Request $request, DevLink $devLink)
{
return $devLink->installRemoteAsset(
$request->input('class'),
$request->input('id')
);
}
}
51 changes: 26 additions & 25 deletions ProcessMaker/Http/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ class Kernel extends HttpKernel
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\ProcessMaker\Http\Middleware\TrimStrings::class,
Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\ProcessMaker\Http\Middleware\TrustProxies::class,
\ProcessMaker\Http\Middleware\BrowserCache::class,
Middleware\TrustProxies::class,
Middleware\BrowserCache::class,
];

/**
Expand All @@ -29,17 +29,17 @@ class Kernel extends HttpKernel
*/
protected $middlewareGroups = [
'web' => [
\ProcessMaker\Http\Middleware\EncryptCookies::class,
Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\ProcessMaker\Http\Middleware\SessionStarted::class,
\ProcessMaker\Http\Middleware\AuthenticateSession::class,
\ProcessMaker\Http\Middleware\SessionControlKill::class,
Middleware\SessionStarted::class,
Middleware\AuthenticateSession::class,
Middleware\SessionControlKill::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
//\ProcessMaker\Http\Middleware\VerifyCsrfToken::class,
\ProcessMaker\Http\Middleware\SetLocale::class, // This is disabled until all routes are handled by our new engine
Middleware\SetLocale::class, // This is disabled until all routes are handled by our new engine
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\ProcessMaker\Http\Middleware\GenerateMenus::class,
Middleware\GenerateMenus::class,
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],
'api' => [
Expand All @@ -62,25 +62,26 @@ class Kernel extends HttpKernel
* @var array
*/
protected $routeMiddleware = [
'auth' => \ProcessMaker\Http\Middleware\ProcessMakerAuthenticate::class,
'auth' => Middleware\ProcessMakerAuthenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \ProcessMaker\Http\Middleware\CustomAuthorize::class,
'force_change_password' => \ProcessMaker\Http\Middleware\VerifyChangePasswordNeeded::class,
'guest' => \ProcessMaker\Http\Middleware\RedirectIfAuthenticated::class,
'permission' => \ProcessMaker\Http\Middleware\PermissionCheck::class,
'can' => Middleware\CustomAuthorize::class,
'force_change_password' => Middleware\VerifyChangePasswordNeeded::class,
'guest' => Middleware\RedirectIfAuthenticated::class,
'permission' => Middleware\PermissionCheck::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'sanitize' => \ProcessMaker\Http\Middleware\SanitizeInput::class,
'setlocale' => \ProcessMaker\Http\Middleware\SetLocale::class,
'setskin' => \ProcessMaker\Http\Middleware\SetSkin::class,
'sanitize' => Middleware\SanitizeInput::class,
'setlocale' => Middleware\SetLocale::class,
'setskin' => Middleware\SetSkin::class,
'client' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
'template-authorization' => \ProcessMaker\Http\Middleware\TemplateAuthorization::class,
'edit_username_password' => \ProcessMaker\Http\Middleware\ValidateEditUserAndPasswordPermission::class,
'2fa' => \ProcessMaker\Http\Middleware\TwoFactorAuthentication::class,
'saml_request' => \ProcessMaker\Http\Middleware\SamlRequest::class,
'session_block' => \ProcessMaker\Http\Middleware\SessionControlBlock::class,
'session_kill' => \ProcessMaker\Http\Middleware\SessionControlKill::class,
'no-cache' => \ProcessMaker\Http\Middleware\NoCache::class,
'template-authorization' => Middleware\TemplateAuthorization::class,
'edit_username_password' => Middleware\ValidateEditUserAndPasswordPermission::class,
'2fa' => Middleware\TwoFactorAuthentication::class,
'saml_request' => Middleware\SamlRequest::class,
'session_block' => Middleware\SessionControlBlock::class,
'session_kill' => Middleware\SessionControlKill::class,
'no-cache' => Middleware\NoCache::class,
'admin' => Middleware\IsAdmin::class,
];

/**
Expand All @@ -95,6 +96,6 @@ class Kernel extends HttpKernel
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\AuthenticateSession::class,
\ProcessMaker\Http\Middleware\ProcessMakerAuthenticate::class,
Middleware\ProcessMakerAuthenticate::class,
];
}
Loading