1 package org.metricshub.winrm.service.client.encryption;
2
3 /*-
4 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
5 * WinRM Java Client
6 * ჻჻჻჻჻჻
7 * Copyright 2023 - 2024 Metricshub
8 * ჻჻჻჻჻჻
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
21 */
22
23 import java.io.OutputStream;
24 import org.apache.cxf.interceptor.StaxOutInterceptor;
25 import org.apache.cxf.message.Message;
26 import org.apache.cxf.phase.AbstractPhaseInterceptor;
27 import org.apache.cxf.phase.Phase;
28
29 /**
30 * Not only encrypts if necessary, but must track the payload and make it available to
31 * {@link AsyncHttpEncryptionAwareConduit} in case we need to subsequently encrypt.
32 *
33 * Code from io.cloudsoft.winrm4j.client.encryption.SignAndEncryptOutInterceptor.SignAndEncryptOutInterceptor
34 * release 0.12.3 @link https://github.com/cloudsoft/winrm4j
35 */
36 public class SignAndEncryptOutInterceptor extends AbstractPhaseInterceptor<Message> {
37
38 private static final String APPLIED = SignAndEncryptOutInterceptor.class.getSimpleName() + ".APPLIED";
39
40 public SignAndEncryptOutInterceptor() {
41 super(Phase.PRE_STREAM);
42 // we need to be set before various other output devices, so they write to us
43 addBefore(StaxOutInterceptor.class.getName());
44 }
45
46 @Override
47 public void handleMessage(final Message message) {
48 boolean hasApplied = message.containsKey(APPLIED);
49 if (!hasApplied) {
50 message.put(APPLIED, Boolean.TRUE);
51 final OutputStream outputStream = message.getContent(OutputStream.class);
52 final EncryptAndSignOutputStream newOut = new EncryptAndSignOutputStream(message, outputStream);
53 message.setContent(OutputStream.class, newOut);
54 message.setContent(EncryptAndSignOutputStream.class, newOut);
55 }
56 }
57 }