proxygen
fizz::server::detail Namespace Reference

Enumerations

enum  CookieHasGroup : uint8_t { No = 0, Yes = 1 }
 

Functions

template<typename... Args>
Actions actions (Args &&...act)
 
Buf encodeCookie (const CookieState &state)
 
CookieState decodeCookie (Buf cookie)
 
AsyncActions processEvent (const State &state, Param param)
 
Actions handleError (const State &state, ReportError error, Optional< AlertDescription > alertDesc)
 
Actions handleAppClose (const State &state)
 
Actions handleInvalidEvent (const State &state, Event event, Param param)
 

Enumeration Type Documentation

Enumerator
No 
Yes 

Definition at line 15 of file AeadCookieCipher-inl.h.

Function Documentation

template<typename... Args>
Actions fizz::server::detail::actions ( Args &&...  act)
CookieState fizz::server::detail::decodeCookie ( Buf  cookie)
inline

Definition at line 40 of file AeadCookieCipher-inl.h.

References group, fizz::detail::read(), and Yes.

Referenced by fizz::server::AeadCookieCipher< AeadType, HkdfType >::decrypt().

40  {
41  folly::io::Cursor cursor(cookie.get());
42 
43  CookieState state;
44  fizz::detail::read(state.version, cursor);
45  fizz::detail::read(state.cipher, cursor);
46 
47  CookieHasGroup hasGroup;
48  fizz::detail::read(hasGroup, cursor);
49  if (hasGroup == CookieHasGroup::Yes) {
51  fizz::detail::read(group, cursor);
52  state.group = group;
53  }
54 
55  fizz::detail::readBuf<uint16_t>(state.chloHash, cursor);
56  fizz::detail::readBuf<uint16_t>(state.appToken, cursor);
57 
58  return state;
59 }
StringPiece cookie
NamedGroup
Definition: Types.h:302
size_t read(T &out, folly::io::Cursor &cursor)
Definition: Types-inl.h:258
Optional< NamedGroup > group
state
Definition: http_parser.c:272
Buf fizz::server::detail::encodeCookie ( const CookieState state)
inline

Definition at line 20 of file AeadCookieCipher-inl.h.

References fizz::server::CookieState::appToken, fizz::server::CookieState::chloHash, fizz::server::CookieState::cipher, folly::IOBuf::create(), fizz::server::CookieState::group, No, fizz::server::CookieState::version, fizz::detail::write(), and Yes.

Referenced by fizz::server::AeadCookieCipher< AeadType, HkdfType >::getStatelessResponse().

20  {
21  auto buf = folly::IOBuf::create(100);
22  folly::io::Appender appender(buf.get(), 100);
23 
24  fizz::detail::write(state.version, appender);
25  fizz::detail::write(state.cipher, appender);
26 
27  if (state.group) {
29  fizz::detail::write(*state.group, appender);
30  } else {
32  }
33 
34  fizz::detail::writeBuf<uint16_t>(state.chloHash, appender);
35  fizz::detail::writeBuf<uint16_t>(state.appToken, appender);
36 
37  return buf;
38 }
void write(const T &in, folly::io::Appender &appender)
Definition: Types-inl.h:112
static std::unique_ptr< IOBuf > create(std::size_t capacity)
Definition: IOBuf.cpp:229
state
Definition: http_parser.c:272
Actions fizz::server::detail::handleAppClose ( const State state)

Definition at line 243 of file ServerProtocol.cpp.

References actions(), fizz::alert, fizz::close_notify, fizz::WriteToSocket::contents, fizz::server::Error, folly::gen::move, fizz::detail::write(), fizz::WriteRecordLayer::writeAlert(), and fizz::server::State::writeRecordLayer().

Referenced by fizz::server::ServerStateMachine::processAppClose().

243  {
244  auto transition = [](State& newState) {
245  newState.state() = StateEnum::Error;
246  newState.writeRecordLayer() = nullptr;
247  newState.readRecordLayer() = nullptr;
248  };
249  if (state.writeRecordLayer()) {
250  Alert alert(AlertDescription::close_notify);
251  WriteToSocket write;
252  write.contents.emplace_back(
253  state.writeRecordLayer()->writeAlert(std::move(alert)));
254  return actions(std::move(transition), std::move(write));
255  } else {
256  return actions(std::move(transition));
257  }
258 }
void write(const T &in, folly::io::Appender &appender)
Definition: Types-inl.h:112
TLSContent writeAlert(Alert &&alert) const
Definition: RecordLayer.h:65
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
const WriteRecordLayer * writeRecordLayer() const
Definition: State.h:223
error_stage Error
Actions actions(Args &&...act)
Definition: Actions.h:86
Actions fizz::server::detail::handleError ( const State state,
ReportError  error,
Optional< AlertDescription alertDesc 
)

Definition at line 220 of file ServerProtocol.cpp.

References actions(), fizz::alert, fizz::WriteToSocket::contents, fizz::server::Error, folly::gen::move, fizz::server::State::state(), fizz::detail::write(), fizz::WriteRecordLayer::writeAlert(), and fizz::server::State::writeRecordLayer().

Referenced by processEvent(), and fizz::server::ServerStateMachine::processSocketData().

223  {
224  if (state.state() == StateEnum::Error) {
225  return actions();
226  }
227  auto transition = [](State& newState) {
228  newState.state() = StateEnum::Error;
229  newState.writeRecordLayer() = nullptr;
230  newState.readRecordLayer() = nullptr;
231  };
232  if (alertDesc && state.writeRecordLayer()) {
233  Alert alert(*alertDesc);
234  WriteToSocket write;
235  write.contents.emplace_back(
236  state.writeRecordLayer()->writeAlert(std::move(alert)));
237  return actions(std::move(transition), std::move(write), std::move(error));
238  } else {
239  return actions(std::move(transition), std::move(error));
240  }
241 }
void write(const T &in, folly::io::Appender &appender)
Definition: Types-inl.h:112
TLSContent writeAlert(Alert &&alert) const
Definition: RecordLayer.h:65
StateEnum state() const
Definition: State.h:69
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
requires And< SemiMovable< VN >... > &&SemiMovable< E > auto error(E e)
Definition: error.h:48
const WriteRecordLayer * writeRecordLayer() const
Definition: State.h:223
error_stage Error
Actions actions(Args &&...act)
Definition: Actions.h:86
Actions fizz::server::detail::handleInvalidEvent ( const State state,
Event  event,
Param  param 
)

Definition at line 260 of file ServerProtocol.cpp.

References folly::netops::accept(), actions(), fizz::Alert, fizz::alert, context, folly::pushmi::executor, folly::gen::move, folly::none, fizz::server::State::state(), fizz::toString(), and fizz::unexpected_message.

260  {
261  if (event == Event::Alert) {
262  auto& alert = boost::get<Alert>(param);
263  throw FizzException(
264  folly::to<std::string>(
265  "received alert: ",
266  toString(alert.description),
267  ", in state ",
268  toString(state.state())),
269  folly::none);
270  } else {
271  throw FizzException(
272  folly::to<std::string>(
273  "invalid event: ",
274  toString(event),
275  ", in state ",
276  toString(state.state())),
277  AlertDescription::unexpected_message);
278  }
279 }
folly::StringPiece toString(StateEnum state)
Definition: State.cpp:16
StateEnum state() const
Definition: State.h:69
constexpr None none
Definition: Optional.h:87
AsyncActions fizz::server::detail::processEvent ( const State state,
Param  param 
)

Definition at line 180 of file ServerProtocol.cpp.

References actions(), folly::apply_visitor(), folly::exception_wrapper::get_exception(), fizz::FizzException::getAlert(), fizz::sm::StateMachine< SM >::getHandler(), handleError(), folly::gen::move, fizz::server::State::state(), fizz::unexpected_message, and folly::variant_match().

Referenced by fizz::server::ServerStateMachine::processAccept(), fizz::server::ServerStateMachine::processAppWrite(), fizz::server::ServerStateMachine::processEarlyAppWrite(), fizz::server::ServerStateMachine::processSocketData(), and fizz::server::ServerStateMachine::processWriteNewSessionTicket().

180  {
181  auto event = boost::apply_visitor(EventVisitor(), param);
182  // We can have an exception directly in the handler or in a future so we need
183  // to handle both types.
184  try {
185  auto actions = sm::StateMachine<ServerTypes>::getHandler(
186  state.state(), event)(state, std::move(param));
187 
188  return folly::variant_match(
189  actions,
190  [&state](folly::Future<Actions>& futureActions) -> AsyncActions {
191  return std::move(futureActions)
192  .onError([&state](folly::exception_wrapper ew) {
193  auto ex = ew.get_exception<FizzException>();
194  if (ex) {
195  return detail::handleError(
196  state, ReportError(std::move(ew)), ex->getAlert());
197  }
198  return detail::handleError(
199  state,
200  ReportError(std::move(ew)),
201  AlertDescription::unexpected_message);
202  });
203  },
204  [](Actions& immediateActions) -> AsyncActions {
205  return std::move(immediateActions);
206  });
207  } catch (const FizzException& e) {
208  return detail::handleError(
209  state,
210  ReportError(folly::exception_wrapper(std::current_exception(), e)),
211  e.getAlert());
212  } catch (const std::exception& e) {
213  return detail::handleError(
214  state,
215  ReportError(folly::exception_wrapper(std::current_exception(), e)),
216  AlertDescription::unexpected_message);
217  }
218 }
StateEnum state() const
Definition: State.h:69
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
boost::variant< Actions, folly::Future< Actions >> AsyncActions
Definition: Actions.h:52
std::exception * get_exception() noexcept
Actions handleError(const State &state, ReportError error, Optional< AlertDescription > alertDesc)
Actions actions(Args &&...act)
Definition: Actions.h:86
decltype(auto) apply_visitor(Visitor &&visitor, const DiscriminatedPtr< Args... > &variant)
decltype(auto) variant_match(Variant &&variant, Cases &&...cases)
Definition: Overload.h:74