View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
19   */
20  package org.waarp.ftp.core.command.internal;
21  
22  import io.netty.channel.ChannelFuture;
23  import io.netty.channel.ChannelFutureListener;
24  import org.waarp.common.command.ReplyCode;
25  import org.waarp.common.command.exception.Reply500Exception;
26  import org.waarp.common.command.exception.Reply501Exception;
27  import org.waarp.common.crypto.ssl.WaarpSslUtility;
28  import org.waarp.common.logging.WaarpLogger;
29  import org.waarp.common.logging.WaarpLoggerFactory;
30  import org.waarp.ftp.core.command.AbstractCommand;
31  import org.waarp.ftp.core.config.FtpConfiguration;
32  import org.waarp.ftp.core.utils.FtpChannelUtils;
33  
34  /**
35   * Internal shutdown command that will shutdown the FTP service with a password
36   */
37  public class INTERNALSHUTDOWN extends AbstractCommand {
38    /**
39     * Internal Logger
40     */
41    private static final WaarpLogger logger =
42        WaarpLoggerFactory.getLogger(INTERNALSHUTDOWN.class);
43  
44    /**
45     *
46     */
47    private static class ShutdownChannelFutureListener
48        implements ChannelFutureListener {
49  
50      private final FtpConfiguration configuration;
51  
52      protected ShutdownChannelFutureListener(
53          final FtpConfiguration configuration) {
54        this.configuration = configuration;
55      }
56  
57      @Override
58      public final void operationComplete(final ChannelFuture arg0) {
59        WaarpSslUtility.closingSslChannel(arg0.channel());
60        FtpChannelUtils.teminateServer(configuration);
61      }
62  
63    }
64  
65    @Override
66    public final void exec() throws Reply501Exception, Reply500Exception {
67      if (!getSession().getAuth().isAdmin()) {
68        // not admin
69        throw new Reply500Exception("Command Not Allowed");
70      }
71      if (!hasArg()) {
72        throw new Reply501Exception("Shutdown Need password");
73      }
74      final String password = getArg();
75      if (logger.isDebugEnabled()) {
76        logger.debug("{} {}", password,
77                     getConfiguration().checkPassword(password));
78      }
79      if (!getConfiguration().checkPassword(password)) {
80        throw new Reply501Exception("Shutdown Need a correct password");
81      }
82      logger.warn("Shutdown...");
83      getSession().setReplyCode(ReplyCode.REPLY_221_CLOSING_CONTROL_CONNECTION,
84                                "System shutdown");
85      getSession().getNetworkHandler().writeIntermediateAnswer().addListener(
86          new ShutdownChannelFutureListener(getConfiguration()));
87    }
88  
89  }