コード例 #1
0
  /**
   * Method description
   *
   * @param packet
   * @param session
   * @param repo
   * @param results
   * @param settings
   * @throws XMPPException
   */
  @Override
  public void process(
      final Packet packet,
      final XMPPResourceConnection session,
      final NonAuthUserRepository repo,
      final Queue<Packet> results,
      final Map<String, Object> settings)
      throws XMPPException {
    if (session == null) {
      return;
    } // end of if (session == null)
    if (!session.isAuthorized()) {
      results.offer(
          session
              .getAuthState()
              .getResponseMessage(packet, "Session is not yet authorized.", false));

      return;
    } // end of if (!session.isAuthorized())

    // TODO: test what happens if resource is bound multiple times for the same
    // user session. in particular if XMPPSession object removes the old
    // resource from the list.
    Element request = packet.getElement();
    StanzaType type = packet.getType();

    try {
      switch (type) {
        case set:
          String resource = request.getChildCDataStaticStr(Iq.IQ_BIND_RESOURCE_PATH);

          try {
            if ((resource == null) || resource.trim().isEmpty()) {
              resource = resourceDefPrefix + (++resGenerator);
              session.setResource(resource);
            } else {
              try {
                session.setResource(resource);
              } catch (TigaseStringprepException ex) {

                // User provided resource is invalid, generating different
                // server one
                log.log(
                    Level.INFO,
                    "Incrrect resource provided by the user: {0}, generating a "
                        + "different one by the server.",
                    resource);
                resource = resourceDefPrefix + (++resGenerator);
                session.setResource(resource);
              }
            } // end of if (resource == null) else
          } catch (TigaseStringprepException ex) {
            log.log(
                Level.WARNING,
                "stringprep problem with the server generated resource: {0}",
                resource);
          }
          packet.initVars(session.getJID(), packet.getStanzaTo());

          // session.putSessionData(RESOURCE_KEY, "true");
          results.offer(packet.okResult(new Element("jid", session.getJID().toString()), 1));

          break;

        default:
          results.offer(
              Authorization.BAD_REQUEST.getResponseMessage(
                  packet, "Bind type is incorrect", false));

          break;
      } // end of switch (type)
    } catch (NotAuthorizedException e) {
      results.offer(
          session
              .getAuthState()
              .getResponseMessage(packet, "Session is not yet authorized.", false));
    } // end of try-catch
  }