Completed
Push — master ( a9eb0d...87aa07 )
by Morris
37s
created
apps/federation/lib/BackgroundJob/GetSharedSecret.php 2 patches
Indentation   +198 added lines, -198 removed lines patch added patch discarded remove patch
@@ -55,202 +55,202 @@
 block discarded – undo
55 55
  */
56 56
 class GetSharedSecret extends Job {
57 57
 
58
-	/** @var IClient */
59
-	private $httpClient;
60
-
61
-	/** @var IJobList */
62
-	private $jobList;
63
-
64
-	/** @var IURLGenerator */
65
-	private $urlGenerator;
66
-
67
-	/** @var TrustedServers  */
68
-	private $trustedServers;
69
-
70
-	/** @var DbHandler */
71
-	private $dbHandler;
72
-
73
-	/** @var IDiscoveryService  */
74
-	private $ocsDiscoveryService;
75
-
76
-	/** @var ILogger */
77
-	private $logger;
78
-
79
-	/** @var ITimeFactory */
80
-	private $timeFactory;
81
-
82
-	/** @var bool */
83
-	protected $retainJob = false;
84
-
85
-	private $format = '?format=json';
86
-
87
-	private $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/shared-secret';
88
-
89
-	/** @var  int  30 day = 2592000sec */
90
-	private $maxLifespan = 2592000;
91
-
92
-	/**
93
-	 * RequestSharedSecret constructor.
94
-	 *
95
-	 * @param IClientService $httpClientService
96
-	 * @param IURLGenerator $urlGenerator
97
-	 * @param IJobList $jobList
98
-	 * @param TrustedServers $trustedServers
99
-	 * @param ILogger $logger
100
-	 * @param DbHandler $dbHandler
101
-	 * @param IDiscoveryService $ocsDiscoveryService
102
-	 * @param ITimeFactory $timeFactory
103
-	 */
104
-	public function __construct(
105
-		IClientService $httpClientService,
106
-		IURLGenerator $urlGenerator,
107
-		IJobList $jobList,
108
-		TrustedServers $trustedServers,
109
-		ILogger $logger,
110
-		DbHandler $dbHandler,
111
-		IDiscoveryService $ocsDiscoveryService,
112
-		ITimeFactory $timeFactory
113
-	) {
114
-		$this->logger = $logger;
115
-		$this->httpClient = $httpClientService->newClient();
116
-		$this->jobList = $jobList;
117
-		$this->urlGenerator = $urlGenerator;
118
-		$this->dbHandler = $dbHandler;
119
-		$this->ocsDiscoveryService = $ocsDiscoveryService;
120
-		$this->trustedServers = $trustedServers;
121
-		$this->timeFactory = $timeFactory;
122
-	}
123
-
124
-	/**
125
-	 * run the job, then remove it from the joblist
126
-	 *
127
-	 * @param JobList $jobList
128
-	 * @param ILogger|null $logger
129
-	 */
130
-	public function execute($jobList, ILogger $logger = null) {
131
-		$target = $this->argument['url'];
132
-		// only execute if target is still in the list of trusted domains
133
-		if ($this->trustedServers->isTrustedServer($target)) {
134
-			$this->parentExecute($jobList, $logger);
135
-		}
136
-
137
-		$jobList->remove($this, $this->argument);
138
-
139
-		if ($this->retainJob) {
140
-			$this->reAddJob($this->argument);
141
-		}
142
-	}
143
-
144
-	/**
145
-	 * call execute() method of parent
146
-	 *
147
-	 * @param JobList $jobList
148
-	 * @param ILogger $logger
149
-	 */
150
-	protected function parentExecute($jobList, $logger = null) {
151
-		parent::execute($jobList, $logger);
152
-	}
153
-
154
-	protected function run($argument) {
155
-		$target = $argument['url'];
156
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
157
-		$currentTime = $this->timeFactory->getTime();
158
-		$source = $this->urlGenerator->getAbsoluteURL('/');
159
-		$source = rtrim($source, '/');
160
-		$token = $argument['token'];
161
-
162
-		// kill job after 30 days of trying
163
-		$deadline = $currentTime - $this->maxLifespan;
164
-		if ($created < $deadline) {
165
-			$this->retainJob = false;
166
-			$this->trustedServers->setServerStatus($target,TrustedServers::STATUS_FAILURE);
167
-			return;
168
-		}
169
-
170
-		$endPoints = $this->ocsDiscoveryService->discover($target, 'FEDERATED_SHARING');
171
-		$endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
172
-
173
-		// make sure that we have a well formatted url
174
-		$url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
175
-
176
-		$result = null;
177
-		try {
178
-			$result = $this->httpClient->get(
179
-				$url,
180
-				[
181
-					'query' =>
182
-						[
183
-							'url' => $source,
184
-							'token' => $token
185
-						],
186
-					'timeout' => 3,
187
-					'connect_timeout' => 3,
188
-				]
189
-			);
190
-
191
-			$status = $result->getStatusCode();
192
-
193
-		} catch (ClientException $e) {
194
-			$status = $e->getCode();
195
-			if ($status === Http::STATUS_FORBIDDEN) {
196
-				$this->logger->info($target . ' refused to exchange a shared secret with you.', ['app' => 'federation']);
197
-			} else {
198
-				$this->logger->info($target . ' responded with a ' . $status . ' containing: ' . $e->getMessage(), ['app' => 'federation']);
199
-			}
200
-		} catch (ConnectException $e) {
201
-			$status = -1; // There is no status code if we could not connect
202
-			$this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
203
-		} catch (\Exception $e) {
204
-			$status = Http::STATUS_INTERNAL_SERVER_ERROR;
205
-			$this->logger->logException($e, ['app' => 'federation']);
206
-		}
207
-
208
-		// if we received a unexpected response we try again later
209
-		if (
210
-			$status !== Http::STATUS_OK
211
-			&& $status !== Http::STATUS_FORBIDDEN
212
-		) {
213
-			$this->retainJob = true;
214
-		}  else {
215
-			// reset token if we received a valid response
216
-			$this->dbHandler->addToken($target, '');
217
-		}
218
-
219
-		if ($status === Http::STATUS_OK && $result instanceof IResponse) {
220
-			$body = $result->getBody();
221
-			$result = json_decode($body, true);
222
-			if (isset($result['ocs']['data']['sharedSecret'])) {
223
-				$this->trustedServers->addSharedSecret(
224
-						$target,
225
-						$result['ocs']['data']['sharedSecret']
226
-				);
227
-			} else {
228
-				$this->logger->error(
229
-						'remote server "' . $target . '"" does not return a valid shared secret',
230
-						['app' => 'federation']
231
-				);
232
-				$this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
233
-			}
234
-		}
235
-
236
-	}
237
-
238
-	/**
239
-	 * re-add background job
240
-	 *
241
-	 * @param array $argument
242
-	 */
243
-	protected function reAddJob(array $argument) {
244
-		$url = $argument['url'];
245
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
246
-		$token = $argument['token'];
247
-		$this->jobList->add(
248
-			GetSharedSecret::class,
249
-			[
250
-				'url' => $url,
251
-				'token' => $token,
252
-				'created' => $created
253
-			]
254
-		);
255
-	}
58
+    /** @var IClient */
59
+    private $httpClient;
60
+
61
+    /** @var IJobList */
62
+    private $jobList;
63
+
64
+    /** @var IURLGenerator */
65
+    private $urlGenerator;
66
+
67
+    /** @var TrustedServers  */
68
+    private $trustedServers;
69
+
70
+    /** @var DbHandler */
71
+    private $dbHandler;
72
+
73
+    /** @var IDiscoveryService  */
74
+    private $ocsDiscoveryService;
75
+
76
+    /** @var ILogger */
77
+    private $logger;
78
+
79
+    /** @var ITimeFactory */
80
+    private $timeFactory;
81
+
82
+    /** @var bool */
83
+    protected $retainJob = false;
84
+
85
+    private $format = '?format=json';
86
+
87
+    private $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/shared-secret';
88
+
89
+    /** @var  int  30 day = 2592000sec */
90
+    private $maxLifespan = 2592000;
91
+
92
+    /**
93
+     * RequestSharedSecret constructor.
94
+     *
95
+     * @param IClientService $httpClientService
96
+     * @param IURLGenerator $urlGenerator
97
+     * @param IJobList $jobList
98
+     * @param TrustedServers $trustedServers
99
+     * @param ILogger $logger
100
+     * @param DbHandler $dbHandler
101
+     * @param IDiscoveryService $ocsDiscoveryService
102
+     * @param ITimeFactory $timeFactory
103
+     */
104
+    public function __construct(
105
+        IClientService $httpClientService,
106
+        IURLGenerator $urlGenerator,
107
+        IJobList $jobList,
108
+        TrustedServers $trustedServers,
109
+        ILogger $logger,
110
+        DbHandler $dbHandler,
111
+        IDiscoveryService $ocsDiscoveryService,
112
+        ITimeFactory $timeFactory
113
+    ) {
114
+        $this->logger = $logger;
115
+        $this->httpClient = $httpClientService->newClient();
116
+        $this->jobList = $jobList;
117
+        $this->urlGenerator = $urlGenerator;
118
+        $this->dbHandler = $dbHandler;
119
+        $this->ocsDiscoveryService = $ocsDiscoveryService;
120
+        $this->trustedServers = $trustedServers;
121
+        $this->timeFactory = $timeFactory;
122
+    }
123
+
124
+    /**
125
+     * run the job, then remove it from the joblist
126
+     *
127
+     * @param JobList $jobList
128
+     * @param ILogger|null $logger
129
+     */
130
+    public function execute($jobList, ILogger $logger = null) {
131
+        $target = $this->argument['url'];
132
+        // only execute if target is still in the list of trusted domains
133
+        if ($this->trustedServers->isTrustedServer($target)) {
134
+            $this->parentExecute($jobList, $logger);
135
+        }
136
+
137
+        $jobList->remove($this, $this->argument);
138
+
139
+        if ($this->retainJob) {
140
+            $this->reAddJob($this->argument);
141
+        }
142
+    }
143
+
144
+    /**
145
+     * call execute() method of parent
146
+     *
147
+     * @param JobList $jobList
148
+     * @param ILogger $logger
149
+     */
150
+    protected function parentExecute($jobList, $logger = null) {
151
+        parent::execute($jobList, $logger);
152
+    }
153
+
154
+    protected function run($argument) {
155
+        $target = $argument['url'];
156
+        $created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
157
+        $currentTime = $this->timeFactory->getTime();
158
+        $source = $this->urlGenerator->getAbsoluteURL('/');
159
+        $source = rtrim($source, '/');
160
+        $token = $argument['token'];
161
+
162
+        // kill job after 30 days of trying
163
+        $deadline = $currentTime - $this->maxLifespan;
164
+        if ($created < $deadline) {
165
+            $this->retainJob = false;
166
+            $this->trustedServers->setServerStatus($target,TrustedServers::STATUS_FAILURE);
167
+            return;
168
+        }
169
+
170
+        $endPoints = $this->ocsDiscoveryService->discover($target, 'FEDERATED_SHARING');
171
+        $endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
172
+
173
+        // make sure that we have a well formatted url
174
+        $url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
175
+
176
+        $result = null;
177
+        try {
178
+            $result = $this->httpClient->get(
179
+                $url,
180
+                [
181
+                    'query' =>
182
+                        [
183
+                            'url' => $source,
184
+                            'token' => $token
185
+                        ],
186
+                    'timeout' => 3,
187
+                    'connect_timeout' => 3,
188
+                ]
189
+            );
190
+
191
+            $status = $result->getStatusCode();
192
+
193
+        } catch (ClientException $e) {
194
+            $status = $e->getCode();
195
+            if ($status === Http::STATUS_FORBIDDEN) {
196
+                $this->logger->info($target . ' refused to exchange a shared secret with you.', ['app' => 'federation']);
197
+            } else {
198
+                $this->logger->info($target . ' responded with a ' . $status . ' containing: ' . $e->getMessage(), ['app' => 'federation']);
199
+            }
200
+        } catch (ConnectException $e) {
201
+            $status = -1; // There is no status code if we could not connect
202
+            $this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
203
+        } catch (\Exception $e) {
204
+            $status = Http::STATUS_INTERNAL_SERVER_ERROR;
205
+            $this->logger->logException($e, ['app' => 'federation']);
206
+        }
207
+
208
+        // if we received a unexpected response we try again later
209
+        if (
210
+            $status !== Http::STATUS_OK
211
+            && $status !== Http::STATUS_FORBIDDEN
212
+        ) {
213
+            $this->retainJob = true;
214
+        }  else {
215
+            // reset token if we received a valid response
216
+            $this->dbHandler->addToken($target, '');
217
+        }
218
+
219
+        if ($status === Http::STATUS_OK && $result instanceof IResponse) {
220
+            $body = $result->getBody();
221
+            $result = json_decode($body, true);
222
+            if (isset($result['ocs']['data']['sharedSecret'])) {
223
+                $this->trustedServers->addSharedSecret(
224
+                        $target,
225
+                        $result['ocs']['data']['sharedSecret']
226
+                );
227
+            } else {
228
+                $this->logger->error(
229
+                        'remote server "' . $target . '"" does not return a valid shared secret',
230
+                        ['app' => 'federation']
231
+                );
232
+                $this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
233
+            }
234
+        }
235
+
236
+    }
237
+
238
+    /**
239
+     * re-add background job
240
+     *
241
+     * @param array $argument
242
+     */
243
+    protected function reAddJob(array $argument) {
244
+        $url = $argument['url'];
245
+        $created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
246
+        $token = $argument['token'];
247
+        $this->jobList->add(
248
+            GetSharedSecret::class,
249
+            [
250
+                'url' => $url,
251
+                'token' => $token,
252
+                'created' => $created
253
+            ]
254
+        );
255
+    }
256 256
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -153,7 +153,7 @@  discard block
 block discarded – undo
153 153
 
154 154
 	protected function run($argument) {
155 155
 		$target = $argument['url'];
156
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
156
+		$created = isset($argument['created']) ? (int) $argument['created'] : $this->timeFactory->getTime();
157 157
 		$currentTime = $this->timeFactory->getTime();
158 158
 		$source = $this->urlGenerator->getAbsoluteURL('/');
159 159
 		$source = rtrim($source, '/');
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
 		$deadline = $currentTime - $this->maxLifespan;
164 164
 		if ($created < $deadline) {
165 165
 			$this->retainJob = false;
166
-			$this->trustedServers->setServerStatus($target,TrustedServers::STATUS_FAILURE);
166
+			$this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
167 167
 			return;
168 168
 		}
169 169
 
@@ -171,7 +171,7 @@  discard block
 block discarded – undo
171 171
 		$endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
172 172
 
173 173
 		// make sure that we have a well formatted url
174
-		$url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
174
+		$url = rtrim($target, '/').'/'.trim($endPoint, '/').$this->format;
175 175
 
176 176
 		$result = null;
177 177
 		try {
@@ -193,13 +193,13 @@  discard block
 block discarded – undo
193 193
 		} catch (ClientException $e) {
194 194
 			$status = $e->getCode();
195 195
 			if ($status === Http::STATUS_FORBIDDEN) {
196
-				$this->logger->info($target . ' refused to exchange a shared secret with you.', ['app' => 'federation']);
196
+				$this->logger->info($target.' refused to exchange a shared secret with you.', ['app' => 'federation']);
197 197
 			} else {
198
-				$this->logger->info($target . ' responded with a ' . $status . ' containing: ' . $e->getMessage(), ['app' => 'federation']);
198
+				$this->logger->info($target.' responded with a '.$status.' containing: '.$e->getMessage(), ['app' => 'federation']);
199 199
 			}
200 200
 		} catch (ConnectException $e) {
201 201
 			$status = -1; // There is no status code if we could not connect
202
-			$this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
202
+			$this->logger->info('Could not connect to '.$target, ['app' => 'federation']);
203 203
 		} catch (\Exception $e) {
204 204
 			$status = Http::STATUS_INTERNAL_SERVER_ERROR;
205 205
 			$this->logger->logException($e, ['app' => 'federation']);
@@ -211,7 +211,7 @@  discard block
 block discarded – undo
211 211
 			&& $status !== Http::STATUS_FORBIDDEN
212 212
 		) {
213 213
 			$this->retainJob = true;
214
-		}  else {
214
+		} else {
215 215
 			// reset token if we received a valid response
216 216
 			$this->dbHandler->addToken($target, '');
217 217
 		}
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
 				);
227 227
 			} else {
228 228
 				$this->logger->error(
229
-						'remote server "' . $target . '"" does not return a valid shared secret',
229
+						'remote server "'.$target.'"" does not return a valid shared secret',
230 230
 						['app' => 'federation']
231 231
 				);
232 232
 				$this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
@@ -242,7 +242,7 @@  discard block
 block discarded – undo
242 242
 	 */
243 243
 	protected function reAddJob(array $argument) {
244 244
 		$url = $argument['url'];
245
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
245
+		$created = isset($argument['created']) ? (int) $argument['created'] : $this->timeFactory->getTime();
246 246
 		$token = $argument['token'];
247 247
 		$this->jobList->add(
248 248
 			GetSharedSecret::class,
Please login to merge, or discard this patch.
apps/federation/lib/BackgroundJob/RequestSharedSecret.php 2 patches
Indentation   +184 added lines, -184 removed lines patch added patch discarded remove patch
@@ -55,188 +55,188 @@
 block discarded – undo
55 55
  */
56 56
 class RequestSharedSecret extends Job {
57 57
 
58
-	/** @var IClient */
59
-	private $httpClient;
60
-
61
-	/** @var IJobList */
62
-	private $jobList;
63
-
64
-	/** @var IURLGenerator */
65
-	private $urlGenerator;
66
-
67
-	/** @var DbHandler */
68
-	private $dbHandler;
69
-
70
-	/** @var TrustedServers */
71
-	private $trustedServers;
72
-
73
-	/** @var IDiscoveryService  */
74
-	private $ocsDiscoveryService;
75
-
76
-	/** @var ILogger */
77
-	private $logger;
78
-
79
-	/** @var ITimeFactory */
80
-	private $timeFactory;
81
-
82
-	/** @var bool */
83
-	protected $retainJob = false;
84
-
85
-	private $format = '?format=json';
86
-
87
-	private $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret';
88
-
89
-	/** @var  int  30 day = 2592000sec */
90
-	private $maxLifespan = 2592000;
91
-
92
-	/**
93
-	 * RequestSharedSecret constructor.
94
-	 *
95
-	 * @param IClientService $httpClientService
96
-	 * @param IURLGenerator $urlGenerator
97
-	 * @param IJobList $jobList
98
-	 * @param TrustedServers $trustedServers
99
-	 * @param DbHandler $dbHandler
100
-	 * @param IDiscoveryService $ocsDiscoveryService
101
-	 * @param ILogger $logger
102
-	 * @param ITimeFactory $timeFactory
103
-	 */
104
-	public function __construct(
105
-		IClientService $httpClientService,
106
-		IURLGenerator $urlGenerator,
107
-		IJobList $jobList,
108
-		TrustedServers $trustedServers,
109
-		DbHandler $dbHandler,
110
-		IDiscoveryService $ocsDiscoveryService,
111
-		ILogger $logger,
112
-		ITimeFactory $timeFactory
113
-	) {
114
-		$this->httpClient = $httpClientService->newClient();
115
-		$this->jobList = $jobList;
116
-		$this->urlGenerator = $urlGenerator;
117
-		$this->dbHandler = $dbHandler;
118
-		$this->logger = $logger;
119
-		$this->ocsDiscoveryService = $ocsDiscoveryService;
120
-		$this->trustedServers = $trustedServers;
121
-		$this->timeFactory = $timeFactory;
122
-	}
123
-
124
-
125
-	/**
126
-	 * run the job, then remove it from the joblist
127
-	 *
128
-	 * @param JobList $jobList
129
-	 * @param ILogger|null $logger
130
-	 */
131
-	public function execute($jobList, ILogger $logger = null) {
132
-		$target = $this->argument['url'];
133
-		// only execute if target is still in the list of trusted domains
134
-		if ($this->trustedServers->isTrustedServer($target)) {
135
-			$this->parentExecute($jobList, $logger);
136
-		}
137
-
138
-		$jobList->remove($this, $this->argument);
139
-
140
-		if ($this->retainJob) {
141
-			$this->reAddJob($this->argument);
142
-		}
143
-	}
144
-
145
-	/**
146
-	 * call execute() method of parent
147
-	 *
148
-	 * @param JobList $jobList
149
-	 * @param ILogger $logger
150
-	 */
151
-	protected function parentExecute($jobList, $logger) {
152
-		parent::execute($jobList, $logger);
153
-	}
154
-
155
-	protected function run($argument) {
156
-
157
-		$target = $argument['url'];
158
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
159
-		$currentTime = $this->timeFactory->getTime();
160
-		$source = $this->urlGenerator->getAbsoluteURL('/');
161
-		$source = rtrim($source, '/');
162
-		$token = $argument['token'];
163
-
164
-		// kill job after 30 days of trying
165
-		$deadline = $currentTime - $this->maxLifespan;
166
-		if ($created < $deadline) {
167
-			$this->retainJob = false;
168
-			$this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
169
-			return;
170
-		}
171
-
172
-		$endPoints = $this->ocsDiscoveryService->discover($target, 'FEDERATED_SHARING');
173
-		$endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
174
-
175
-		// make sure that we have a well formated url
176
-		$url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
177
-
178
-		try {
179
-			$result = $this->httpClient->post(
180
-				$url,
181
-				[
182
-					'body' => [
183
-						'url' => $source,
184
-						'token' => $token,
185
-					],
186
-					'timeout' => 3,
187
-					'connect_timeout' => 3,
188
-				]
189
-			);
190
-
191
-			$status = $result->getStatusCode();
192
-
193
-		} catch (ClientException $e) {
194
-			$status = $e->getCode();
195
-			if ($status === Http::STATUS_FORBIDDEN) {
196
-				$this->logger->info($target . ' refused to ask for a shared secret.', ['app' => 'federation']);
197
-			} else {
198
-				$this->logger->info($target . ' responded with a ' . $status . ' containing: ' . $e->getMessage(), ['app' => 'federation']);
199
-			}
200
-		} catch (ConnectException $e) {
201
-			$status = -1; // There is no status code if we could not connect
202
-			$this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
203
-		} catch (\Exception $e) {
204
-			$status = Http::STATUS_INTERNAL_SERVER_ERROR;
205
-			$this->logger->logException($e, ['app' => 'federation']);
206
-		}
207
-
208
-		// if we received a unexpected response we try again later
209
-		if (
210
-			$status !== Http::STATUS_OK
211
-			&& $status !== Http::STATUS_FORBIDDEN
212
-		) {
213
-			$this->retainJob = true;
214
-		}
215
-
216
-		if ($status === Http::STATUS_FORBIDDEN) {
217
-			// clear token if remote server refuses to ask for shared secret
218
-			$this->dbHandler->addToken($target, '');
219
-		}
220
-
221
-	}
222
-
223
-	/**
224
-	 * re-add background job
225
-	 *
226
-	 * @param array $argument
227
-	 */
228
-	protected function reAddJob(array $argument) {
229
-		$url = $argument['url'];
230
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
231
-		$token = $argument['token'];
232
-
233
-		$this->jobList->add(
234
-			RequestSharedSecret::class,
235
-			[
236
-				'url' => $url,
237
-				'token' => $token,
238
-				'created' => $created
239
-			]
240
-		);
241
-	}
58
+    /** @var IClient */
59
+    private $httpClient;
60
+
61
+    /** @var IJobList */
62
+    private $jobList;
63
+
64
+    /** @var IURLGenerator */
65
+    private $urlGenerator;
66
+
67
+    /** @var DbHandler */
68
+    private $dbHandler;
69
+
70
+    /** @var TrustedServers */
71
+    private $trustedServers;
72
+
73
+    /** @var IDiscoveryService  */
74
+    private $ocsDiscoveryService;
75
+
76
+    /** @var ILogger */
77
+    private $logger;
78
+
79
+    /** @var ITimeFactory */
80
+    private $timeFactory;
81
+
82
+    /** @var bool */
83
+    protected $retainJob = false;
84
+
85
+    private $format = '?format=json';
86
+
87
+    private $defaultEndPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret';
88
+
89
+    /** @var  int  30 day = 2592000sec */
90
+    private $maxLifespan = 2592000;
91
+
92
+    /**
93
+     * RequestSharedSecret constructor.
94
+     *
95
+     * @param IClientService $httpClientService
96
+     * @param IURLGenerator $urlGenerator
97
+     * @param IJobList $jobList
98
+     * @param TrustedServers $trustedServers
99
+     * @param DbHandler $dbHandler
100
+     * @param IDiscoveryService $ocsDiscoveryService
101
+     * @param ILogger $logger
102
+     * @param ITimeFactory $timeFactory
103
+     */
104
+    public function __construct(
105
+        IClientService $httpClientService,
106
+        IURLGenerator $urlGenerator,
107
+        IJobList $jobList,
108
+        TrustedServers $trustedServers,
109
+        DbHandler $dbHandler,
110
+        IDiscoveryService $ocsDiscoveryService,
111
+        ILogger $logger,
112
+        ITimeFactory $timeFactory
113
+    ) {
114
+        $this->httpClient = $httpClientService->newClient();
115
+        $this->jobList = $jobList;
116
+        $this->urlGenerator = $urlGenerator;
117
+        $this->dbHandler = $dbHandler;
118
+        $this->logger = $logger;
119
+        $this->ocsDiscoveryService = $ocsDiscoveryService;
120
+        $this->trustedServers = $trustedServers;
121
+        $this->timeFactory = $timeFactory;
122
+    }
123
+
124
+
125
+    /**
126
+     * run the job, then remove it from the joblist
127
+     *
128
+     * @param JobList $jobList
129
+     * @param ILogger|null $logger
130
+     */
131
+    public function execute($jobList, ILogger $logger = null) {
132
+        $target = $this->argument['url'];
133
+        // only execute if target is still in the list of trusted domains
134
+        if ($this->trustedServers->isTrustedServer($target)) {
135
+            $this->parentExecute($jobList, $logger);
136
+        }
137
+
138
+        $jobList->remove($this, $this->argument);
139
+
140
+        if ($this->retainJob) {
141
+            $this->reAddJob($this->argument);
142
+        }
143
+    }
144
+
145
+    /**
146
+     * call execute() method of parent
147
+     *
148
+     * @param JobList $jobList
149
+     * @param ILogger $logger
150
+     */
151
+    protected function parentExecute($jobList, $logger) {
152
+        parent::execute($jobList, $logger);
153
+    }
154
+
155
+    protected function run($argument) {
156
+
157
+        $target = $argument['url'];
158
+        $created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
159
+        $currentTime = $this->timeFactory->getTime();
160
+        $source = $this->urlGenerator->getAbsoluteURL('/');
161
+        $source = rtrim($source, '/');
162
+        $token = $argument['token'];
163
+
164
+        // kill job after 30 days of trying
165
+        $deadline = $currentTime - $this->maxLifespan;
166
+        if ($created < $deadline) {
167
+            $this->retainJob = false;
168
+            $this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
169
+            return;
170
+        }
171
+
172
+        $endPoints = $this->ocsDiscoveryService->discover($target, 'FEDERATED_SHARING');
173
+        $endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
174
+
175
+        // make sure that we have a well formated url
176
+        $url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
177
+
178
+        try {
179
+            $result = $this->httpClient->post(
180
+                $url,
181
+                [
182
+                    'body' => [
183
+                        'url' => $source,
184
+                        'token' => $token,
185
+                    ],
186
+                    'timeout' => 3,
187
+                    'connect_timeout' => 3,
188
+                ]
189
+            );
190
+
191
+            $status = $result->getStatusCode();
192
+
193
+        } catch (ClientException $e) {
194
+            $status = $e->getCode();
195
+            if ($status === Http::STATUS_FORBIDDEN) {
196
+                $this->logger->info($target . ' refused to ask for a shared secret.', ['app' => 'federation']);
197
+            } else {
198
+                $this->logger->info($target . ' responded with a ' . $status . ' containing: ' . $e->getMessage(), ['app' => 'federation']);
199
+            }
200
+        } catch (ConnectException $e) {
201
+            $status = -1; // There is no status code if we could not connect
202
+            $this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
203
+        } catch (\Exception $e) {
204
+            $status = Http::STATUS_INTERNAL_SERVER_ERROR;
205
+            $this->logger->logException($e, ['app' => 'federation']);
206
+        }
207
+
208
+        // if we received a unexpected response we try again later
209
+        if (
210
+            $status !== Http::STATUS_OK
211
+            && $status !== Http::STATUS_FORBIDDEN
212
+        ) {
213
+            $this->retainJob = true;
214
+        }
215
+
216
+        if ($status === Http::STATUS_FORBIDDEN) {
217
+            // clear token if remote server refuses to ask for shared secret
218
+            $this->dbHandler->addToken($target, '');
219
+        }
220
+
221
+    }
222
+
223
+    /**
224
+     * re-add background job
225
+     *
226
+     * @param array $argument
227
+     */
228
+    protected function reAddJob(array $argument) {
229
+        $url = $argument['url'];
230
+        $created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
231
+        $token = $argument['token'];
232
+
233
+        $this->jobList->add(
234
+            RequestSharedSecret::class,
235
+            [
236
+                'url' => $url,
237
+                'token' => $token,
238
+                'created' => $created
239
+            ]
240
+        );
241
+    }
242 242
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -155,7 +155,7 @@  discard block
 block discarded – undo
155 155
 	protected function run($argument) {
156 156
 
157 157
 		$target = $argument['url'];
158
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
158
+		$created = isset($argument['created']) ? (int) $argument['created'] : $this->timeFactory->getTime();
159 159
 		$currentTime = $this->timeFactory->getTime();
160 160
 		$source = $this->urlGenerator->getAbsoluteURL('/');
161 161
 		$source = rtrim($source, '/');
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
 		$endPoint = isset($endPoints['shared-secret']) ? $endPoints['shared-secret'] : $this->defaultEndPoint;
174 174
 
175 175
 		// make sure that we have a well formated url
176
-		$url = rtrim($target, '/') . '/' . trim($endPoint, '/') . $this->format;
176
+		$url = rtrim($target, '/').'/'.trim($endPoint, '/').$this->format;
177 177
 
178 178
 		try {
179 179
 			$result = $this->httpClient->post(
@@ -193,13 +193,13 @@  discard block
 block discarded – undo
193 193
 		} catch (ClientException $e) {
194 194
 			$status = $e->getCode();
195 195
 			if ($status === Http::STATUS_FORBIDDEN) {
196
-				$this->logger->info($target . ' refused to ask for a shared secret.', ['app' => 'federation']);
196
+				$this->logger->info($target.' refused to ask for a shared secret.', ['app' => 'federation']);
197 197
 			} else {
198
-				$this->logger->info($target . ' responded with a ' . $status . ' containing: ' . $e->getMessage(), ['app' => 'federation']);
198
+				$this->logger->info($target.' responded with a '.$status.' containing: '.$e->getMessage(), ['app' => 'federation']);
199 199
 			}
200 200
 		} catch (ConnectException $e) {
201 201
 			$status = -1; // There is no status code if we could not connect
202
-			$this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
202
+			$this->logger->info('Could not connect to '.$target, ['app' => 'federation']);
203 203
 		} catch (\Exception $e) {
204 204
 			$status = Http::STATUS_INTERNAL_SERVER_ERROR;
205 205
 			$this->logger->logException($e, ['app' => 'federation']);
@@ -227,7 +227,7 @@  discard block
 block discarded – undo
227 227
 	 */
228 228
 	protected function reAddJob(array $argument) {
229 229
 		$url = $argument['url'];
230
-		$created = isset($argument['created']) ? (int)$argument['created'] : $this->timeFactory->getTime();
230
+		$created = isset($argument['created']) ? (int) $argument['created'] : $this->timeFactory->getTime();
231 231
 		$token = $argument['token'];
232 232
 
233 233
 		$this->jobList->add(
Please login to merge, or discard this patch.