Skip to content

Commit 80388d2

Browse files
committed
cleaner request configuration
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
1 parent 87a00d1 commit 80388d2

10 files changed

+94
-60
lines changed

composer.lock

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/Command/CirclesTest.php

+24-19
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@
2929

3030
namespace OCA\Circles\Command;
3131

32-
use daita\MySmallPhpTools\Exceptions\RequestContentException;
3332
use daita\MySmallPhpTools\Exceptions\RequestNetworkException;
34-
use daita\MySmallPhpTools\Exceptions\RequestResultSizeException;
35-
use daita\MySmallPhpTools\Exceptions\RequestServerException;
3633
use daita\MySmallPhpTools\Model\Nextcloud\NC19Request;
3734
use daita\MySmallPhpTools\Model\Request;
3835
use daita\MySmallPhpTools\Traits\Nextcloud\TNC19Request;
@@ -110,7 +107,7 @@ protected function configure() {
110107
$this->setName('circles:test')
111108
->setDescription('testing some features')
112109
->addOption('delay', 'd', InputOption::VALUE_REQUIRED, 'delay before checking result')
113-
->addOption('url', '', InputOption::VALUE_REQUIRED, 'specify a source url');
110+
->addOption('url', '', InputOption::VALUE_REQUIRED, 'specify a source url', '');
114111
}
115112

116113

@@ -126,12 +123,19 @@ protected function execute(InputInterface $input, OutputInterface $output): int
126123
$this->delay = (int)$input->getOption('delay');
127124
}
128125

129-
// $url = $input->getOption('url');
130-
if (!$this->testLocalAddress($output)) {
126+
$this->configService->setAppValue(ConfigService::TEST_NC_BASE, '');
127+
$this->configService->setAppValue(ConfigService::TEST_NC_BASE, $input->getOption('url'));
128+
129+
if (!$this->testRequest($output, 'GET', 'core.CSRFToken.index')) {
131130
return 0;
132131
}
133132

134-
$instances = array_merge($this->globalScaleService->getInstances(true));
133+
if (!$this->testRequest(
134+
$output, 'POST', 'circles.GlobalScale.asyncBroadcast',
135+
['token' => 'test-dummy-token']
136+
)) {
137+
return 0;
138+
}
135139

136140
$test = new GSEvent(GSEvent::TEST, true, true);
137141
$test->setAsync(true);
@@ -144,6 +148,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
144148
$wrappers = $this->gsUpstreamService->getEventsByToken($token);
145149

146150
$result = [];
151+
$instances = array_merge($this->globalScaleService->getInstances(true));
147152
foreach ($wrappers as $wrapper) {
148153
$result[$wrapper->getInstance()] = $wrapper->getEvent();
149154
}
@@ -159,33 +164,33 @@ protected function execute(InputInterface $input, OutputInterface $output): int
159164
}
160165
}
161166

167+
$this->configService->setAppValue(ConfigService::TEST_NC_BASE, '');
168+
162169
return 0;
163170
}
164171

165172

166173
/**
167-
* @param OutputInterface $output
174+
* @param OutputInterface $o
175+
* @param string $type
176+
* @param string $route
177+
* @param array $args
168178
*
169179
* @return bool
170-
* @throws RequestContentException
171180
* @throws RequestNetworkException
172-
* @throws RequestResultSizeException
173-
* @throws RequestServerException
174181
*/
175-
private function testLocalAddress(OutputInterface $output): bool {
176-
$absolute = $this->urlGenerator->linkToRouteAbsolute('core.CSRFToken.index');
177-
$output->write('- Simple request on ' . $absolute . ': ');
178-
179-
$request = new NC19Request('', Request::TYPE_GET);
180-
$this->configService->configureRequest($request);
181-
$request->setAddressFromUrl($absolute);
182+
private function testRequest(OutputInterface $o, string $type, string $route, array $args = []): bool {
183+
$request = new NC19Request('', Request::type($type));
184+
$this->configService->configureRequest($request, $route, $args);
182185

186+
$o->write('- ' . $type . ' request on ' . $request->getCompleteUrl() . ': ');
183187
$this->doRequest($request);
188+
184189
$color = 'error';
185190
if ($request->getResultCode() === 200) {
186191
$color = 'info';
187192
}
188-
$output->writeln('<' . $color . '>' . $request->getResultCode() . '</' . $color . '>');
193+
$o->writeln('<' . $color . '>' . $request->getResultCode() . '</' . $color . '>');
189194

190195
if ($request->getResultCode() === 200) {
191196
return true;

lib/Command/MembersCreate.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
use daita\MySmallPhpTools\Model\Nextcloud\NC19Request;
3838
use daita\MySmallPhpTools\Model\Request;
3939
use daita\MySmallPhpTools\Traits\Nextcloud\TNC19Request;
40-
use daita\MySmallPhpTools\Traits\TRequest;
4140
use Exception;
4241
use OC\Core\Command\Base;
4342
use OC\User\NoUserException;
@@ -176,11 +175,11 @@ private function findUserFromLookup(string $search, string &$instance = ''): str
176175
return '';
177176
}
178177

179-
$request = new NC19Request('/users', Request::TYPE_GET);
178+
$request = new NC19Request(ConfigService::GS_LOOKUP_USERS, Request::TYPE_GET);
180179
$this->configService->configureRequest($request);
181180
$request->setProtocols(['https', 'http']);
182-
$request->addData('search', $search);
183-
$request->setAddressFromUrl($lookup);
181+
$request->basedOnUrl($lookup);
182+
$request->addParam('search', $search);
184183

185184
try {
186185
$users = $this->retrieveJson($request);

lib/Cron/Maintenance.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,8 @@
3232

3333
use OC\BackgroundJob\TimedJob;
3434
use OCA\Circles\AppInfo\Application;
35-
use OCA\Circles\Exceptions\GSStatusException;
36-
use OCA\Circles\Service\CirclesService;
3735
use OCA\Circles\Service\CleanService;
38-
use OCA\Circles\Service\GSUpstreamService;
39-
use OCA\Circles\Service\MembersService;
36+
use OCA\Circles\Service\ConfigService;
4037
use OCP\AppFramework\QueryException;
4138

4239

@@ -66,8 +63,11 @@ protected function run($argument) {
6663
$c = $app->getContainer();
6764

6865
/** @var CleanService $cleanService */
69-
$cleanService = \OC::$server->query(CleanService::class);
66+
$cleanService = $c->query(CleanService::class);
7067
$cleanService->clean();
68+
69+
$configService = $c->query(ConfigService::class);
70+
$configService->setAppValue(ConfigService::TEST_NC_BASE, '');
7171
}
7272

7373
}

lib/Search/GlobalScaleUsers.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ public function search($search) {
8282
return [];
8383
}
8484

85-
$request = new NC19Request('/users', Request::TYPE_GET);
85+
$request = new NC19Request(ConfigService::GS_LOOKUP_USERS, Request::TYPE_GET);
8686
$this->configService->configureRequest($request);
8787
$request->setProtocols(['https', 'http']);
88-
$request->addData('search', $search);
89-
$request->setAddressFromUrl($lookup);
88+
$request->basedOnUrl($lookup);
89+
$request->addParam('search', $search);
9090

9191
try {
9292
$users = $this->retrieveJson($request);

lib/Service/ConfigService.php

+41-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use OCA\Circles\Model\Circle;
3232
use OCP\IConfig;
3333
use OCP\IRequest;
34+
use OCP\IURLGenerator;
3435
use OCP\PreConditionNotMetException;
3536
use OCP\Util;
3637

@@ -57,13 +58,16 @@ class ConfigService {
5758
const CIRCLES_TEST_ASYNC_INIT = 'test_async_init';
5859
const CIRCLES_TEST_ASYNC_HAND = 'test_async_hand';
5960
const CIRCLES_TEST_ASYNC_COUNT = 'test_async_count';
61+
const FORCE_NC_BASE = 'force_nc_base';
62+
const TEST_NC_BASE = 'test_nc_base';
6063

6164
const GS_ENABLED = 'enabled';
6265
const GS_MODE = 'mode';
6366
const GS_KEY = 'key';
6467
const GS_LOOKUP = 'lookup';
6568

6669
const GS_LOOKUP_INSTANCES = '/instances';
70+
const GS_LOOKUP_USERS = '/users';
6771

6872

6973
private $defaults = [
@@ -82,6 +86,7 @@ class ConfigService {
8286
self::CIRCLES_NON_SSL_LOCAL => '0',
8387
self::CIRCLES_SELF_SIGNED => '0',
8488
self::LOCAL_CLOUD_ID => '',
89+
self::FORCE_NC_BASE => '',
8590
self::CIRCLES_ACTIVITY_ON_CREATION => '1',
8691
self::CIRCLES_SKIP_INVITATION_STEP => '0',
8792
self::CIRCLES_SEARCH_FROM_COLLABORATOR => '0'
@@ -99,6 +104,9 @@ class ConfigService {
99104
/** @var IRequest */
100105
private $request;
101106

107+
/** @var IURLGenerator */
108+
private $urlGenerator;
109+
102110
/** @var MiscService */
103111
private $miscService;
104112

@@ -124,15 +132,18 @@ class ConfigService {
124132
* @param IConfig $config
125133
* @param IRequest $request
126134
* @param string $userId
135+
* @param IURLGenerator $urlGenerator
127136
* @param MiscService $miscService
128137
*/
129138
public function __construct(
130-
$appName, IConfig $config, IRequest $request, $userId, MiscService $miscService
139+
$appName, IConfig $config, IRequest $request, $userId, IURLGenerator $urlGenerator,
140+
MiscService $miscService
131141
) {
132142
$this->appName = $appName;
133143
$this->config = $config;
134144
$this->request = $request;
135145
$this->userId = $userId;
146+
$this->urlGenerator = $urlGenerator;
136147
$this->miscService = $miscService;
137148
}
138149

@@ -551,14 +562,42 @@ public function getInstanceId() {
551562

552563
/**
553564
* @param NC19Request $request
565+
* @param string $routeName
566+
* @param array $args
554567
*/
555-
public function configureRequest(NC19Request $request) {
568+
public function configureRequest(NC19Request $request, string $routeName = '', array $args = []) {
569+
$this->configureRequestAddress($request, $routeName, $args);
570+
556571
if ($this->getAppValue(ConfigService::CIRCLES_SELF_SIGNED) === '1') {
557572
$request->setVerifyPeer(false);
558573
}
559574

560575
$request->setLocalAddressAllowed(true);
561576
}
562577

578+
/**
579+
* @param NC19Request $request
580+
* @param string $routeName
581+
* @param array $args
582+
*
583+
* @return string
584+
*/
585+
private function configureRequestAddress(NC19Request $request, string $routeName, array $args = []) {
586+
if ($routeName === '') {
587+
return;
588+
}
589+
590+
$ncBase = ($this->getAppValue(self::TEST_NC_BASE)) ?
591+
$this->getAppValue(self::TEST_NC_BASE) : $this->getAppValue(self::FORCE_NC_BASE);
592+
593+
if ($ncBase !== '') {
594+
$absolute = rtrim($ncBase, '/') . $this->urlGenerator->linkToRoute($routeName, $args);
595+
} else {
596+
$absolute = $this->urlGenerator->linkToRouteAbsolute($routeName, $args);
597+
}
598+
599+
$request->basedOnUrl($absolute);
600+
}
601+
563602
}
564603

lib/Service/GSUpstreamService.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,10 @@ public function broadcastEvent(GSEvent $event, string $instance, string $protoco
204204
$protocols = [$protocol];
205205
}
206206

207+
$request->setHost($instance);
207208
$request->setProtocols($protocols);
208209
$request->setDataSerialize($event);
209210

210-
$request->setAddress($instance);
211-
212211
$data = $this->retrieveJson($request);
213212
$event->setResult(new SimpleDataStore($this->getArray('result', $data, [])));
214213
}
@@ -232,14 +231,14 @@ public function confirmEvent(GSEvent &$event): void {
232231
$path = $this->urlGenerator->linkToRoute('circles.GlobalScale.event');
233232

234233
$request = new NC19Request($path, Request::TYPE_POST);
234+
$request->basedOnUrl($owner->getInstance());
235235
$this->configService->configureRequest($request);
236236

237237
if ($this->get('REQUEST_SCHEME', $_SERVER) !== '') {
238238
$request->setProtocols([$_SERVER['REQUEST_SCHEME']]);
239239
} else {
240240
$request->setProtocols(['https', 'http']);
241241
}
242-
$request->setAddressFromUrl($owner->getInstance());
243242
$request->setDataSerialize($event);
244243

245244
$result = $this->retrieveJson($request);
@@ -427,7 +426,7 @@ public function confirmCircleStatus(Circle $circle): bool {
427426
$notFound = false;
428427
$foundWithNoOwner = false;
429428
foreach ($this->globalScaleService->getInstances() as $instance) {
430-
$request->setAddress($instance);
429+
$request->setHost($instance);
431430

432431
try {
433432
$result = $this->retrieveJson($request);

lib/Service/GlobalScaleService.php

+6-12
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,10 @@ public function asyncBroadcast(GSEvent $event): string {
137137
$wrapper = $this->gsEventsRequest->create($wrapper);
138138
}
139139

140-
$absolute = $this->urlGenerator->linkToRouteAbsolute(
141-
'circles.GlobalScale.asyncBroadcast', ['token' => $wrapper->getToken()]
142-
);
143-
144140
$request = new NC19Request('', Request::TYPE_POST);
145-
$this->configService->configureRequest($request);
146-
$request->setAddressFromUrl($absolute);
141+
$this->configService->configureRequest(
142+
$request, 'circles.GlobalScale.asyncBroadcast', ['token' => $wrapper->getToken()]
143+
);
147144

148145
try {
149146
$this->doRequest($request);
@@ -225,13 +222,10 @@ public function getInstances(bool $all = false): array {
225222
try {
226223
$lookup = $this->configService->getGSStatus(ConfigService::GS_LOOKUP);
227224
$request = new NC19Request(ConfigService::GS_LOOKUP_INSTANCES, Request::TYPE_POST);
225+
$request->setProtocols(['https', 'http']);
226+
$request->basedOnUrl($lookup);
228227
$this->configService->configureRequest($request);
229-
230-
// $user = $this->getRandomUser();
231-
// $data = $this->signer->sign('lookupserver', ['federationId' => $user->getCloudId()], $user);
232-
$data = ['authKey' => $this->configService->getGSStatus(ConfigService::GS_KEY)];
233-
$request->setData($data);
234-
$request->setAddressFromUrl($lookup);
228+
$request->addData('authKey', $this->configService->getGSStatus(ConfigService::GS_KEY));
235229

236230
try {
237231
$instances = $this->retrieveJson($request);

lib/Service/MembersService.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -735,12 +735,12 @@ public function getUserDisplayName(string $ident, bool $fresh = false): string {
735735
private function getGlobalScaleUserDisplayName(string $ident): string {
736736
$lookup = $this->configService->getGSStatus(ConfigService::GS_LOOKUP);
737737

738-
$request = new NC19Request('/users', Request::TYPE_GET);
738+
$request = new NC19Request(ConfigService::GS_LOOKUP_USERS, Request::TYPE_GET);
739739
$this->configService->configureRequest($request);
740740
$request->setProtocols(['https', 'http']);
741-
$request->addData('search', $ident);
742-
$request->addData('exact', '1');
743-
$request->setAddressFromUrl($lookup);
741+
$request->basedOnUrl($lookup);
742+
$request->addParam('search', $ident);
743+
$request->addParam('exact', '1');
744744

745745
try {
746746
$users = $this->retrieveJson($request);

lib/Service/SharingFrameService.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -304,13 +304,11 @@ public function receiveFrame($token, $uniqueId, SharingFrame $frame) {
304304
* @throws Exception
305305
*/
306306
public function initiateShare(string $circleUniqueId, string $frameUniqueId) {
307-
$route = $this->urlGenerator->linkToRouteAbsolute('circles.Shares.initShareDelivery');
308307
$request = new NC19Request('', Request::TYPE_POST);
309-
$this->configService->configureRequest($request);
310308
$request->setProtocols(['https', 'http']);
309+
$this->configService->configureRequest($request, 'circles.Shares.initShareDelivery');
311310
$request->addParam('circleId', $circleUniqueId);
312311
$request->addParam('frameId', $frameUniqueId);
313-
$request->setAddressFromUrl($route);
314312

315313
try {
316314
$this->doRequest($request);

0 commit comments

Comments
 (0)