Skip to content

Commit 79dcff6

Browse files
dati18deer-wmde
andcommitted
feat: generate OAuth2 key pair dynamically within PHP (#914)
* feat: generate OAuth2 key pair dynamically within PHP * job: generate keys for old wikis without keys * change constant name Co-authored-by: dena <91744937+deer-wmde@users.noreply.github.com> * Change file name --------- Co-authored-by: dena <91744937+deer-wmde@users.noreply.github.com>
1 parent 5f0fbe9 commit 79dcff6

3 files changed

Lines changed: 87 additions & 0 deletions

File tree

app/Http/Controllers/WikiController.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,37 @@ public function create(Request $request): \Illuminate\Http\Response
109109
abort(503, 'QS Namespace ready, but failed to assign');
110110
}
111111

112+
// Create keys for OAuth2
113+
// T336937
114+
$keyPair = openssl_pkey_new([
115+
'private_key_bits' => 2048,
116+
'private_key_type' => OPENSSL_KEYTYPE_RSA,
117+
]);
118+
// Extract private key
119+
openssl_pkey_export($keyPair, $wgOAuth2PrivateKey);
120+
// Extract pub key
121+
$keyDetails = openssl_pkey_get_details($keyPair);
122+
$wgOAuth2PublicKey = $keyDetails['key'];
123+
124+
WikiSetting::create([
125+
'wiki_id' => $wiki->id,
126+
'name' => WikiSetting::wgOAuth2PrivateKey,
127+
'value' => $wgOAuth2PrivateKey,
128+
]);
129+
130+
WikiSetting::create([
131+
'wiki_id' => $wiki->id,
132+
'name' => WikiSetting::wgOAuth2PublicKey,
133+
'value' => $wgOAuth2PublicKey,
134+
]);
135+
112136
// Create initial needed non default settings
113137
// Docs: https://www.mediawiki.org/wiki/Manual:$wgSecretKey
114138
WikiSetting::create([
115139
'wiki_id' => $wiki->id,
116140
'name' => WikiSetting::wgSecretKey,
117141
'value' => Str::random(64),
142+
118143
]);
119144

120145
// Create the elasticsearch setting

app/Jobs/GenerateOAuth2KeysJob.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace App\Jobs;
4+
5+
use App\Wiki;
6+
use App\WikiSetting;
7+
use Illuminate\Bus\Queueable;
8+
use Illuminate\Support\Facades\Log;
9+
use Illuminate\Contracts\Queue\ShouldQueue;
10+
use Illuminate\Foundation\Bus\Dispatchable;
11+
use Illuminate\Queue\InteractsWithQueue;
12+
use Illuminate\Queue\SerializesModels;
13+
14+
class GenerateOAuth2KeysJob extends Job implements ShouldQueue
15+
{
16+
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
17+
18+
public function handle()
19+
{
20+
$allWikis = Wiki::all();
21+
22+
foreach ($allWikis as $wiki) {
23+
try {
24+
$hasPrivateKey = WikiSetting::where('wiki_id', $wiki->id)
25+
->where('name', 'wgOAuth2PrivateKey')
26+
->exists();
27+
28+
if (!$hasPrivateKey) {
29+
$keyPair = openssl_pkey_new([
30+
'private_key_bits' => 2048,
31+
'private_key_type' => OPENSSL_KEYTYPE_RSA,
32+
]);
33+
// Extract private key
34+
openssl_pkey_export($keyPair, $wgOAuth2PrivateKey);
35+
// Extract pub key
36+
$keyDetails = openssl_pkey_get_details($keyPair);
37+
$wgOAuth2PublicKey = $keyDetails['key'];
38+
39+
WikiSetting::create([
40+
'wiki_id' => $wiki->id,
41+
'name' => WikiSetting::wgOAuth2PrivateKey,
42+
'value' => $wgOAuth2PrivateKey,
43+
]);
44+
45+
WikiSetting::create([
46+
'wiki_id' => $wiki->id,
47+
'name' => WikiSetting::wgOAuth2PublicKey,
48+
'value' => $wgOAuth2PublicKey,
49+
]);
50+
}
51+
} catch (\Exception $ex) {
52+
$this->job->markAsFailed();
53+
Log::error(
54+
'Failure generating keys for '.$wiki->getAttribute('domain').' for sitestats: '.$ex->getMessage()
55+
);
56+
}
57+
}
58+
59+
}
60+
}

app/WikiSetting.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class WikiSetting extends Model
3636
public const wgSecretKey = 'wgSecretKey';
3737
public const wgLogo = 'wgLogo';
3838
public const wgFavicon = 'wgFavicon';
39+
public const wgOAuth2PrivateKey = 'wgOAuth2PrivateKey';
40+
public const wgOAuth2PublicKey = 'wgOAuth2PublicKey';
3941

4042
/**
4143
* The attributes that are mass assignable.

0 commit comments

Comments
 (0)