View Javadoc
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  }