1 package org.sentrysoftware.ipmi.core.sm.states;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import org.sentrysoftware.ipmi.core.coding.commands.session.OpenSession;
26 import org.sentrysoftware.ipmi.core.coding.payload.PlainMessage;
27 import org.sentrysoftware.ipmi.core.coding.protocol.AuthenticationType;
28 import org.sentrysoftware.ipmi.core.coding.protocol.IpmiMessage;
29 import org.sentrysoftware.ipmi.core.coding.protocol.PayloadType;
30 import org.sentrysoftware.ipmi.core.coding.protocol.decoder.PlainCommandv20Decoder;
31 import org.sentrysoftware.ipmi.core.coding.protocol.decoder.ProtocolDecoder;
32 import org.sentrysoftware.ipmi.core.coding.protocol.decoder.Protocolv20Decoder;
33 import org.sentrysoftware.ipmi.core.coding.rmcp.RmcpMessage;
34 import org.sentrysoftware.ipmi.core.coding.security.CipherSuite;
35 import org.sentrysoftware.ipmi.core.common.TypeConverter;
36 import org.sentrysoftware.ipmi.core.sm.StateMachine;
37 import org.sentrysoftware.ipmi.core.sm.actions.ErrorAction;
38 import org.sentrysoftware.ipmi.core.sm.actions.ResponseAction;
39 import org.sentrysoftware.ipmi.core.sm.events.DefaultAck;
40 import org.sentrysoftware.ipmi.core.sm.events.StateMachineEvent;
41 import org.sentrysoftware.ipmi.core.sm.events.Timeout;
42
43
44
45
46
47
48
49
50 public class OpenSessionWaiting extends State {
51
52 private int tag;
53
54 public OpenSessionWaiting(int tag) {
55 this.tag = tag;
56 }
57
58 @Override
59 public void doTransition(StateMachine stateMachine,
60 StateMachineEvent machineEvent) {
61 if (machineEvent instanceof DefaultAck) {
62 stateMachine.setCurrent(new OpenSessionComplete());
63 } else if (machineEvent instanceof Timeout) {
64 stateMachine.setCurrent(new Authcap());
65 } else {
66 stateMachine.doExternalAction(new ErrorAction(
67 new IllegalArgumentException("Invalid transition")));
68 }
69 }
70
71 @Override
72 public void doAction(StateMachine stateMachine, RmcpMessage message) {
73 if (ProtocolDecoder.decodeAuthenticationType(message) != AuthenticationType.RMCPPlus) {
74 return;
75 }
76 PlainCommandv20Decoder decoder = new PlainCommandv20Decoder(
77 CipherSuite.getEmpty());
78 if (Protocolv20Decoder.decodePayloadType(message.getData()[1]) != PayloadType.RmcpOpenSessionResponse) {
79 return;
80 }
81 IpmiMessage ipmiMessage = null;
82 try {
83 ipmiMessage = decoder.decode(message);
84 OpenSession openSession = new OpenSession(CipherSuite.getEmpty());
85 if (openSession.isCommandResponse(ipmiMessage)
86 && TypeConverter.byteToInt(((PlainMessage) ipmiMessage
87 .getPayload()).getPayloadData()[0]) == tag) {
88 stateMachine.doExternalAction(new ResponseAction(openSession
89 .getResponseData(ipmiMessage)));
90 }
91 } catch (Exception e) {
92 stateMachine.doExternalAction(new ErrorAction(e));
93 }
94 }
95 }