Skip to content

Commit b7f777d

Browse files
authored
Merge pull request #33 from TomHAnderson/feature/security
Feature/security
2 parents 240024b + 4fb8dbd commit b7f777d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+568
-227
lines changed

app/Http/Kernel.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace App\Http;
66

7+
use ApiSkeletons\Laravel\Doctrine\ApiKey\Http\Middleware\AuthorizeApiKey;
78
use App\Http\Middleware\Authenticate;
89
use App\Http\Middleware\EncryptCookies;
910
use App\Http\Middleware\PreventRequestsDuringMaintenance;
@@ -66,7 +67,6 @@ class Kernel extends HttpKernel
6667
],
6768

6869
'api' => [
69-
// 'auth.apikey' => AuthorizeApiKey:class
7070
ThrottleRequests::class . ':api',
7171
SubstituteBindings::class,
7272
],
@@ -83,6 +83,7 @@ class Kernel extends HttpKernel
8383
// phpcs:disable
8484
protected $middlewareAliases = [
8585
'auth' => Authenticate::class,
86+
'auth.apikey' => AuthorizeApiKey::class,
8687
'auth.basic' => AuthenticateWithBasicAuth::class,
8788
'auth.session' => AuthenticateSession::class,
8889
'cache.headers' => SetCacheHeaders::class,

config/migrations.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
| the migrations on disk haven't actually been run in the database.
2828
|
2929
*/
30-
'table_name' => 'migrations',
30+
'table_name' => 'doctrine_migrations',
3131

3232
/*
3333
|--------------------------------------------------------------------------
@@ -43,7 +43,7 @@
4343
],
4444

4545
'migrations_paths' => [
46-
'Database\\Migrations' => database_path('migrations'),
46+
'Database\\Doctrine\\Migrations' => __DIR__ . '/../database/doctrine-migrations',
4747
],
4848

4949
/*

database/database.sqlite

48 KB
Binary file not shown.

database/doctrine-migrations/.gitkeep

Whitespace-only changes.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('oauth_auth_codes', function (Blueprint $table) {
15+
$table->string('id', 100)->primary();
16+
$table->unsignedBigInteger('user_id')->index();
17+
$table->unsignedBigInteger('client_id');
18+
$table->text('scopes')->nullable();
19+
$table->boolean('revoked');
20+
$table->dateTime('expires_at')->nullable();
21+
});
22+
}
23+
24+
/**
25+
* Reverse the migrations.
26+
*/
27+
public function down(): void
28+
{
29+
Schema::dropIfExists('oauth_auth_codes');
30+
}
31+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('oauth_access_tokens', function (Blueprint $table) {
15+
$table->string('id', 100)->primary();
16+
$table->unsignedBigInteger('user_id')->nullable()->index();
17+
$table->unsignedBigInteger('client_id');
18+
$table->string('name')->nullable();
19+
$table->text('scopes')->nullable();
20+
$table->boolean('revoked');
21+
$table->timestamps();
22+
$table->dateTime('expires_at')->nullable();
23+
});
24+
}
25+
26+
/**
27+
* Reverse the migrations.
28+
*/
29+
public function down(): void
30+
{
31+
Schema::dropIfExists('oauth_access_tokens');
32+
}
33+
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('oauth_refresh_tokens', function (Blueprint $table) {
15+
$table->string('id', 100)->primary();
16+
$table->string('access_token_id', 100)->index();
17+
$table->boolean('revoked');
18+
$table->dateTime('expires_at')->nullable();
19+
});
20+
}
21+
22+
/**
23+
* Reverse the migrations.
24+
*/
25+
public function down(): void
26+
{
27+
Schema::dropIfExists('oauth_refresh_tokens');
28+
}
29+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('oauth_clients', function (Blueprint $table) {
15+
$table->bigIncrements('id');
16+
$table->unsignedBigInteger('user_id')->nullable()->index();
17+
$table->string('name');
18+
$table->string('secret', 100)->nullable();
19+
$table->string('provider')->nullable();
20+
$table->text('redirect');
21+
$table->boolean('personal_access_client');
22+
$table->boolean('password_client');
23+
$table->boolean('revoked');
24+
$table->timestamps();
25+
});
26+
}
27+
28+
/**
29+
* Reverse the migrations.
30+
*/
31+
public function down(): void
32+
{
33+
Schema::dropIfExists('oauth_clients');
34+
}
35+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('oauth_personal_access_clients', function (Blueprint $table) {
15+
$table->bigIncrements('id');
16+
$table->unsignedBigInteger('client_id');
17+
$table->timestamps();
18+
});
19+
}
20+
21+
/**
22+
* Reverse the migrations.
23+
*/
24+
public function down(): void
25+
{
26+
Schema::dropIfExists('oauth_personal_access_clients');
27+
}
28+
};

ldog.skipper

Lines changed: 94 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,33 +50,97 @@
5050
</orm-attributes>
5151
</module>
5252
<external-module storage-path="vendor/api-skeletons/laravel-doctrine-apikey/ApiKey.skipper.module"/>
53-
<module name="\Passport" local-name="Passport" namespace="\" uuid="15347adb-b310-4527-b4ba-57c8f36ca1d5">
54-
<entity name="\migrations" local-name="migrations" namespace="\" uuid="e103599d-8e1e-46b9-a479-aa52f0d8f593">
55-
<field name="id" type="integer" required="true" unique="true" primary="true" auto-increment="true" uuid="1a1b8c15-4b56-4335-8d00-f9cb5a4f4aeb"/>
56-
<field name="migration" type="string" required="true" uuid="712a2910-b42d-496f-b1cf-d957ea13ae44"/>
57-
<field name="batch" type="integer" required="true" uuid="42bd0614-9077-493c-8ecd-7267b337418d"/>
53+
<module name="\Passport" local-name="Passport" namespace="\" uuid="097a2b56-85e5-496a-9d3b-9b0aa904ceda">
54+
<entity name="\migrations" local-name="migrations" namespace="\" uuid="3001edfe-9a29-4886-a8e0-8e9e7a7209c1">
55+
<field name="id" type="integer" required="true" unique="true" primary="true" auto-increment="true" uuid="777a98ba-c7c6-4009-9690-74eb4180db0a"/>
56+
<field name="migration" type="string" required="true" uuid="f392d52b-a537-4e34-8b9a-9c152bdeefc5"/>
57+
<field name="batch" type="integer" required="true" uuid="828ab0c2-054a-4921-8684-000ed4a602f3"/>
5858
<orm-attributes>
5959
<attribute name="table">migrations</attribute>
6060
</orm-attributes>
6161
</entity>
62-
<entity name="\personal_access_tokens" local-name="personal_access_tokens" namespace="\" uuid="89f37a78-2c71-4535-920c-8975771a4465">
63-
<field name="id" type="integer" required="true" unique="true" primary="true" auto-increment="true" uuid="38e00fb0-bb8b-4bf6-ac5e-a12dc6ebbd19"/>
64-
<field name="tokenable_type" type="string" required="true" uuid="b647e0c5-ca9c-434e-aba1-339ed234b775"/>
65-
<field name="tokenable_id" type="integer" required="true" uuid="af760ce5-dfdb-4d4e-9403-0adbd556d65d"/>
66-
<field name="name" type="string" required="true" uuid="b5fe402b-67dd-4939-adb6-c5f3b39e9952"/>
67-
<field name="token" type="string" required="true" uuid="adc6a44d-8d2c-4b27-9fcf-28829d3e6f9c"/>
68-
<field name="abilities" type="text" uuid="c2cdba1f-e3b0-4a82-bae9-5a7f8509d300"/>
69-
<field name="last_used_at" type="datetime" uuid="fa8b2ef5-aedb-453f-9ffb-5d9225cebfea"/>
70-
<field name="expires_at" type="datetime" uuid="d4061637-7348-40cd-aab2-b8ae3f7b6553"/>
71-
<field name="created_at" type="datetime" uuid="bca34e13-d3c5-4e2a-abad-f2288f254da6"/>
72-
<field name="updated_at" type="datetime" uuid="6de1e70b-6e2a-4dc3-b04f-b6246daa708e"/>
73-
<index name="personal_access_tokens_token_unique" unique="true" uuid="456cc82b-42f5-4139-9011-1c45542c3149">
74-
<index-field name="token" uuid="5772e17d-ebf3-456a-bb77-10f97e714f40"/>
62+
<entity name="\oauth_auth_codes" local-name="oauth_auth_codes" namespace="\" uuid="c41e658b-0cb0-4125-873d-a07385ee77a8">
63+
<field name="id" type="string" required="true" unique="true" primary="true" auto-increment="true" uuid="36548313-4e57-4357-9f67-8aa2c1dfa41a"/>
64+
<field name="user_id" type="integer" required="true" uuid="72ef03ed-c1d1-4e0c-ab75-763fb9d189a6"/>
65+
<field name="client_id" type="integer" required="true" uuid="c243d9f7-398f-4259-822b-ecd42b32c41d"/>
66+
<field name="scopes" type="text" uuid="19fd6fa0-d8fb-48e5-9f0e-1b0ba628d0e0"/>
67+
<field name="revoked" type="smallint" required="true" uuid="e5427c83-0d0d-4b36-b2d2-b3314d95a7a6"/>
68+
<field name="expires_at" type="datetime" uuid="a240aa9e-3d63-4686-8390-628e57eb2352"/>
69+
<index name="oauth_auth_codes_user_id_index" uuid="fc8def35-4471-40a6-81be-8e29ddb8aef1">
70+
<index-field name="user_id" uuid="6ec2ca75-494a-477b-9f5d-7843d1010c5e"/>
7571
</index>
76-
<index name="personal_access_tokens_tokenable_type_tokenable_id_index" uuid="9e104ec0-7b9b-4904-9f56-6444ee7fd421">
77-
<index-field name="tokenable_type" uuid="5f826091-d773-434e-a98b-4b72b57ebb77"/>
78-
<index-field name="tokenable_id" uuid="22a41aa9-4860-4ffd-ae88-3a4fb25e9d3e"/>
72+
<orm-attributes>
73+
<attribute name="table">oauth_auth_codes</attribute>
74+
</orm-attributes>
75+
</entity>
76+
<entity name="\oauth_access_tokens" local-name="oauth_access_tokens" namespace="\" uuid="8cddbaad-33cb-400c-8c0e-c7e0cae6bebc">
77+
<field name="id" type="string" required="true" unique="true" primary="true" auto-increment="true" uuid="55c12d7c-9955-405d-8648-a49e530dc996"/>
78+
<field name="user_id" type="integer" uuid="c71c9e4a-9b5b-4910-ae0d-a403731c2a0a"/>
79+
<field name="client_id" type="integer" required="true" uuid="2c8b95de-8a2b-434a-a6e1-1b4bbc1c00de"/>
80+
<field name="name" type="string" uuid="cf35d245-1a02-4f90-8859-5bdfece31483"/>
81+
<field name="scopes" type="text" uuid="b9a99b06-8067-46f5-a78a-6165ab557697"/>
82+
<field name="revoked" type="smallint" required="true" uuid="783ac46f-c583-45f7-82dd-46fe82c2c2de"/>
83+
<field name="created_at" type="datetime" uuid="dbc053b1-1cd4-45bb-90a7-0edf72fba20f"/>
84+
<field name="updated_at" type="datetime" uuid="604cdfc5-135f-40ce-bb67-b60667c70e3e"/>
85+
<field name="expires_at" type="datetime" uuid="e58b2edf-eced-4a48-8fd3-b4bfde1d4b8b"/>
86+
<index name="oauth_access_tokens_user_id_index" uuid="174ef192-7604-4369-9121-e6e144d3ba80">
87+
<index-field name="user_id" uuid="1368a14d-b0dd-49d6-b919-c7714b4c8a13"/>
7988
</index>
89+
<orm-attributes>
90+
<attribute name="table">oauth_access_tokens</attribute>
91+
</orm-attributes>
92+
</entity>
93+
<entity name="\oauth_refresh_tokens" local-name="oauth_refresh_tokens" namespace="\" uuid="3e8b75e0-6832-4cd6-8cbe-e4216910b08c">
94+
<field name="id" type="string" required="true" unique="true" primary="true" auto-increment="true" uuid="6ca523d9-627a-498c-936f-62bf1744f81c"/>
95+
<field name="access_token_id" type="string" required="true" uuid="8ce0af9e-d221-4a7d-93fe-68535dc874c3"/>
96+
<field name="revoked" type="smallint" required="true" uuid="d4b0721d-b000-44ee-95e3-b0d4b26ef821"/>
97+
<field name="expires_at" type="datetime" uuid="e67c1e4b-a080-420b-980e-913346c23cd9"/>
98+
<index name="oauth_refresh_tokens_access_token_id_index" uuid="d28ba320-4e3b-43db-8da7-347fc7d433ba">
99+
<index-field name="access_token_id" uuid="211e7281-a87e-4980-b4ee-02785c81c2a8"/>
100+
</index>
101+
<orm-attributes>
102+
<attribute name="table">oauth_refresh_tokens</attribute>
103+
</orm-attributes>
104+
</entity>
105+
<entity name="\oauth_clients" local-name="oauth_clients" namespace="\" uuid="5abaded9-2ca2-4589-ba94-504ca52d5345">
106+
<field name="id" type="integer" required="true" unique="true" primary="true" auto-increment="true" uuid="43c96cbd-757e-482a-b3f2-44ff4ea0d764"/>
107+
<field name="user_id" type="integer" uuid="5e0e2565-4b38-44a5-9ee9-64ea5eae5fcf"/>
108+
<field name="name" type="string" required="true" uuid="93c60b5c-217e-4a69-bdd0-e0debf1d9593"/>
109+
<field name="secret" type="string" uuid="f337e852-deb6-42db-95e7-f2f8bab79567"/>
110+
<field name="provider" type="string" uuid="3bb14069-1f39-4829-a9a4-972b967ad055"/>
111+
<field name="redirect" type="text" required="true" uuid="9cce055b-db0e-4646-ae17-7107ebc57ffc"/>
112+
<field name="personal_access_client" type="smallint" required="true" uuid="f2ade62e-8fc8-4747-a22a-5fcced0fa307"/>
113+
<field name="password_client" type="smallint" required="true" uuid="0fd5eb5f-ebd8-4461-b8a3-13c7784e016c"/>
114+
<field name="revoked" type="smallint" required="true" uuid="c8575309-7b1a-4c95-b501-1b93ed93b698"/>
115+
<field name="created_at" type="datetime" uuid="65210397-153c-4fee-bbfb-ad51a4e87849"/>
116+
<field name="updated_at" type="datetime" uuid="6582ee2d-4254-4ec7-a889-327ce12d5626"/>
117+
<index name="oauth_clients_user_id_index" uuid="c2f7d75f-9558-4d3b-a957-4d2a80a12c1b">
118+
<index-field name="user_id" uuid="bbc1ef3f-64e5-46ce-9a70-6e4d2e601b7e"/>
119+
</index>
120+
<orm-attributes>
121+
<attribute name="table">oauth_clients</attribute>
122+
</orm-attributes>
123+
</entity>
124+
<entity name="\oauth_personal_access_clients" local-name="oauth_personal_access_clients" namespace="\" uuid="1dc3563a-5927-4e48-945b-22a722e80084">
125+
<field name="id" type="integer" required="true" unique="true" primary="true" auto-increment="true" uuid="504277b0-7da5-4185-b067-78c71918469e"/>
126+
<field name="client_id" type="integer" required="true" uuid="07248e33-d8cc-4f6d-a37b-b12a38888f30"/>
127+
<field name="created_at" type="datetime" uuid="4fac7c24-594a-4269-b060-23ca9f95bf3c"/>
128+
<field name="updated_at" type="datetime" uuid="ac10afe3-1b84-4c6d-b80e-81c656cc1ffa"/>
129+
<orm-attributes>
130+
<attribute name="table">oauth_personal_access_clients</attribute>
131+
</orm-attributes>
132+
</entity>
133+
<entity name="\personal_access_tokens" local-name="personal_access_tokens" namespace="\" uuid="90662c08-b30e-43ce-a111-c4615908eb60">
134+
<field name="id" type="integer" required="true" unique="true" primary="true" auto-increment="true" uuid="80060c1e-5eb0-4947-be2f-b4880c6b22e3"/>
135+
<field name="tokenable_type" type="string" required="true" uuid="126ec36d-4942-41ba-b403-52fa980ba8c1"/>
136+
<field name="tokenable_id" type="integer" required="true" uuid="eae9680a-1d54-4f46-9a41-660f32dd2a4f"/>
137+
<field name="name" type="string" required="true" uuid="191c2a53-2e32-4c86-a0fb-d0b958f89e79"/>
138+
<field name="token" type="string" required="true" uuid="099600af-e913-4f7b-b030-24460ea547e2"/>
139+
<field name="abilities" type="text" uuid="4be6c024-56b5-4bd5-b795-49b3b92eee4e"/>
140+
<field name="last_used_at" type="datetime" uuid="5617e3a9-a3ce-4f46-863c-df716904a23c"/>
141+
<field name="expires_at" type="datetime" uuid="d7ae6b7c-20a0-427f-9d02-19e30d72fc1a"/>
142+
<field name="created_at" type="datetime" uuid="bda95f82-c053-4d27-a677-e0b6ac5c4c1a"/>
143+
<field name="updated_at" type="datetime" uuid="00cbf300-2caa-42b7-9e08-69951ebcbadd"/>
80144
<orm-attributes>
81145
<attribute name="table">personal_access_tokens</attribute>
82146
</orm-attributes>
@@ -89,16 +153,21 @@
89153
<association uuid="c997c4aa-195c-4f0e-8a32-5506f53f0ab9" color="#969696"/>
90154
<comment uuid="0e4ff410-5025-42fd-89ae-0d05319ab49b" bg-color="#FFFFE0" position-x="243" position-y="253" size-x="6" size-x2="128" size-y="-3" size-y2="63" txt-color="#000000"/>
91155
<entity uuid="10de66e4-a8b3-44a9-a6d0-a9fd28338fe2" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="-3" position-y="-29" size-x="0" size-x2="77" size-y="0" size-y2="45"/>
156+
<entity uuid="1dc3563a-5927-4e48-945b-22a722e80084" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="418" position-y="251" size-x="0" size-x2="143" size-y="0" size-y2="73"/>
157+
<entity uuid="3001edfe-9a29-4886-a8e0-8e9e7a7209c1" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="52" position-y="40" size-x="0" size-x2="91" size-y="0" size-y2="59"/>
158+
<entity uuid="3e8b75e0-6832-4cd6-8cbe-e4216910b08c" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="37" position-y="251" size-x="0" size-x2="121" size-y="0" size-y2="73"/>
92159
<entity uuid="568a03b7-3dd5-435a-9bc8-869bc673923c" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="-3" position-y="136" size-x="0" size-x2="93" size-y="0" size-y2="87"/>
93-
<entity uuid="89f37a78-2c71-4535-920c-8975771a4465" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="178" position-y="40" size-x="0" size-x2="118" size-y="0" size-y2="157"/>
160+
<entity uuid="5abaded9-2ca2-4589-ba94-504ca52d5345" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="216" position-y="251" size-x="0" size-x2="156" size-y="0" size-y2="171"/>
94161
<entity uuid="8a04b312-72bb-4723-baac-75502524ae38" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="177" position-y="-44" size-x="0" size-x2="136" size-y="0" size-y2="101"/>
162+
<entity uuid="8cddbaad-33cb-400c-8c0e-c7e0cae6bebc" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="434" position-y="40" size-x="0" size-x2="112" size-y="0" size-y2="143"/>
163+
<entity uuid="90662c08-b30e-43ce-a111-c4615908eb60" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="39" position-y="462" size-x="0" size-x2="118" size-y="0" size-y2="157"/>
95164
<entity uuid="ad470906-9e63-41e7-9558-979789bc2d28" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="177" position-y="136" size-x="0" size-x2="122" size-y="0" size-y2="59"/>
96-
<entity uuid="e103599d-8e1e-46b9-a479-aa52f0d8f593" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="33" position-y="40" size-x="0" size-x2="91" size-y="0" size-y2="59"/>
165+
<entity uuid="c41e658b-0cb0-4125-873d-a07385ee77a8" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="240" position-y="40" size-x="0" size-x2="108" size-y="0" size-y2="101"/>
97166
<entity uuid="e5603f71-6798-480b-bcf8-0d185a08e653" bg-color="#FFFFFF" hdr-color="#D2D2D2" position-x="77" position-y="256" size-x="0" size-x2="109" size-y="0" size-y2="60"/>
98167
<many-to-many-association uuid="e4936d0d-1d1f-4fb8-af31-fa1d0665ccf7" color="#969696"/>
99-
<module uuid="15347adb-b310-4527-b4ba-57c8f36ca1d5" bg-color="#FEEFE3" position-x="0" position-y="500" size-x="0" size-x2="460" size-y="0" size-y2="317"/>
168+
<module uuid="097a2b56-85e5-496a-9d3b-9b0aa904ceda" bg-color="#EAE4F1" position-x="0" position-y="500" size-x="0" size-x2="600" size-y="0" size-y2="660"/>
100169
<module uuid="5bbfe5b4-7579-44ee-81f9-fa036ee071a3" position-x="443" position-y="-18"/>
101170
<module uuid="d5f257f8-d854-4bae-a05d-1ed8673c7eb5" bg-color="#E0F0EF" position-x="43" position-y="84" size-x="43" size-x2="417" size-y="84" size-y2="376"/>
102-
<project uuid="25d2b513-c6b7-4071-9ada-7c48f127f426" size-x="70" size-x2="1220" size-y="50" size-y2="867"/>
171+
<project uuid="25d2b513-c6b7-4071-9ada-7c48f127f426" size-x="40" size-x2="1220" size-y="40" size-y2="1200"/>
103172
</visual-data>
104173
</skipper>

0 commit comments

Comments
 (0)