public String addUser(String login, String password) {
    try {
      File file = new File(ServerSettings.STATISTICS_ROOT + File.separator + type + ".xml");
      if (!file.exists()) {
        return "File doesn't exists: " + file.getAbsolutePath();
      }

      Map<String, String> map = readUsersFromFile();
      if (map == null) {
        return "Impossible to read xml file: " + file.getAbsolutePath();
      }
      if (map.containsKey(login)) {
        return "User already exists";
      }

      Document document = ResponseUtils.getXmlDocument(file);
      if (document == null) {
        return "Impossible to read xml file: " + file.getAbsolutePath();
      }
      NodeList nodeList = document.getElementsByTagName("users");
      Node newNode = document.createElement("user");
      newNode.appendChild(document.createElement("login"));
      newNode.appendChild(document.createTextNode(login));
      newNode.appendChild(document.createElement("password"));
      try {
        password = generateMD5(password);
      } catch (NoSuchAlgorithmException e) {
        ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
            e, SessionInfo.TypeOfRequest.AUTHORIZATION.name(), "ldap: " + login);
        return "Impossible to generate MD5";
      } catch (UnsupportedEncodingException e) {
        ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
            e, SessionInfo.TypeOfRequest.AUTHORIZATION.name(), "ldap: " + login);
        return "Impossible to read password in UTF-8";
      }
      newNode.appendChild(document.createTextNode(password));
      nodeList.item(0).appendChild(newNode);

      NodeList list = document.getElementsByTagName("users");
      Node node = list.item(0);

      DOMSource source = new DOMSource(node);

      TransformerFactory tFactory = TransformerFactory.newInstance();
      Transformer transformer = tFactory.newTransformer();

      FileWriter writer = new FileWriter(file);
      StreamResult result = new StreamResult(writer);
      transformer.transform(source, result);

      writer.close();
      return "User was added";
    } catch (Throwable e) {
      ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
          e, SessionInfo.TypeOfRequest.ANALYZE_LOG.name(), "");
      return "Unknown error: User wasn't added";
    }
  }
  @Nullable
  private Map<String, String> readUsersFromFile() {
    try {
      // TODO add exceptions
      Map<String, String> users = new HashMap<String, String>();

      File file = new File(ServerSettings.STATISTICS_ROOT + File.separator + type + ".xml");
      if (!file.exists()) {
        return null;
      }

      Document document = ResponseUtils.getXmlDocument(file);
      if (document == null) {
        return null;
      }
      NodeList nodeList = document.getElementsByTagName("user");
      if (nodeList == null) {
        return null;
      }
      for (int i = 0; i < nodeList.getLength(); i++) {
        NodeList children = nodeList.item(i).getChildNodes();
        users.put(children.item(1).getTextContent(), children.item(3).getTextContent());
      }
      return users;
    } catch (Throwable e) {
      ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
          e, SessionInfo.TypeOfRequest.ANALYZE_LOG.name(), "");
    }
    return null;
  }
  private String getPostDataFromRequest(HttpExchange exchange) {
    StringBuilder reqResponse = new StringBuilder();
    try {
      reqResponse.append(ResponseUtils.readData(exchange.getRequestBody()));
    } catch (IOException e) {
      ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
          e, SessionInfo.TypeOfRequest.AUTHORIZATION.name(), "ldap: " + exchange.getRequestURI());
      throw new IllegalArgumentException("Cannot read data from file");
    }

    String finalResponse = null;
    try {
      finalResponse = URLDecoder.decode(reqResponse.toString(), "UTF-8");
    } catch (UnsupportedEncodingException e) {
      ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
          e, SessionInfo.TypeOfRequest.AUTHORIZATION.name(), "ldap");
      throw new IllegalArgumentException("Cannot read data from file");
    }
    return finalResponse;
  }
  private boolean loginWithLDAP(String login, String password) {
    try {

      LdapContext context = null;
      try {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "Simple");
        env.put(Context.SECURITY_PRINCIPAL, login);
        //                env.put(Context.SECURITY_PRINCIPAL, "labs\\natalia.ukhorskaya");
        //                env.put(Context.SECURITY_CREDENTIALS, "DeeJou5d");
        env.put(Context.SECURITY_CREDENTIALS, password);
        env.put(Context.PROVIDER_URL, "ldap://msdc.labs.intellij.net:389");
        context = new InitialLdapContext(env, null);

      } catch (NamingException nex) {
        // nex.printStackTrace();
        return false;
      }

      String cn;
      if (login.contains("\\")) {
        cn = login.substring(login.indexOf("\\"));
      } else {
        cn = login;
      }

      String query = "(&(objectclass=person)(samaccountname=" + cn + "))";
      String attribute = "cn";

      SearchControls ctrl = new SearchControls();
      ctrl.setSearchScope(SearchControls.SUBTREE_SCOPE);
      NamingEnumeration enumeration = context.search("dc=labs,dc=intellij,dc=net", query, ctrl);
      SearchResult result = (SearchResult) enumeration.next();
      if (result != null) {
        Attributes attribs = result.getAttributes();
        NamingEnumeration values = attribs.get(attribute).getAll();
        if (values.hasMore()) {
          userName = values.next().toString();
        }
        return true;
      }

    } catch (Throwable e) {
      // incorrect login or password
      ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
          e, SessionInfo.TypeOfRequest.ANALYZE_LOG.name(), login + " " + password);
    }
    return false;
  }
 @Override
 public Result authenticate(HttpExchange exchange) {
   String data;
   try {
     data = getPostDataFromRequest(exchange);
   } catch (IllegalArgumentException e) {
     ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
         e,
         SessionInfo.TypeOfRequest.AUTHORIZATION.name(),
         "ldap: " + exchange.getRequestURI().toString());
     return super.authenticate(exchange);
   }
   Pair<String, String> pair = parseData(data);
   if (checkCredentials(pair.first, pair.second)) {
     return new Success(new HttpPrincipal(pair.first, this.getRealm()));
   } else {
     return new Failure(401);
   }
   // To change body of overridden methods use File | Settings | File Templates.
 }
  public String getResult() {
    ErrorAnalyzer analyzer = new ErrorAnalyzer(currentPsiFile, sessionInfo);
    List<ErrorDescriptor> errors;
    try {
      errors = analyzer.getAllErrors();
    } catch (KotlinCoreException e) {
      ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
          e, sessionInfo.getType(), currentPsiFile.getText());
      return ResponseUtils.getErrorWithStackTraceInJson(
          ServerSettings.KOTLIN_ERROR_MESSAGE, e.getStackTraceString());
    }

    if (errors.isEmpty() || isOnlyWarnings(errors)) {
      Project currentProject = currentPsiFile.getProject();
      //            BindingContext bindingContext =
      // AnalyzerFacade.analyzeOneFileWithJavaIntegration(
      //                                (JetFile) currentPsiFile,
      // JetControlFlowDataTraceFactory.EMPTY);

      sessionInfo.getTimeManager().saveCurrentTime();
      GenerationState generationState;
      try {
        generationState = new GenerationState(currentProject, ClassBuilderFactory.BINARIES);
        generationState.compile((JetFile) currentPsiFile);
        //                generationState.compileCorrectFiles(bindingContext,
        // Collections.singletonList((JetFile) currentPsiFile));
      } catch (Throwable e) {
        ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
            e, sessionInfo.getType(), currentPsiFile.getText());
        //
        // ErrorWriterOnServer.LOG_FOR_EXCEPTIONS.error(ErrorWriter.getExceptionForLog(sessionInfo.getType(), e, currentPsiFile.getText()));
        return ResponseUtils.getErrorWithStackTraceInJson(
            ServerSettings.KOTLIN_ERROR_MESSAGE, new KotlinCoreException(e).getStackTraceString());
      }
      ErrorWriterOnServer.LOG_FOR_INFO.info(
          ErrorWriter.getInfoForLogWoIp(
              sessionInfo.getType(),
              sessionInfo.getId(),
              "COMPILE correctNamespaces "
                  + sessionInfo.getTimeManager().getMillisecondsFromSavedTime()));

      StringBuilder stringBuilder = new StringBuilder("Generated classfiles: ");
      stringBuilder.append(ResponseUtils.addNewLine());
      final ClassFileFactory factory = generationState.getFactory();

      sessionInfo.getTimeManager().saveCurrentTime();
      List<String> files = factory.files();
      File outputDir =
          new File(
              ServerSettings.OUTPUT_DIRECTORY + File.separator + "tmp" + RandomUtils.nextInt());
      boolean isOutputExists = true;
      if (!outputDir.exists()) {
        isOutputExists = outputDir.mkdirs();
      }
      for (String file : files) {
        //                File outputDir = new File(ServerSettings.OUTPUT_DIRECTORY);
        //                ServerSettings.OUTPUT_DIRECTORY = outputDir.getAbsolutePath();
        if (isOutputExists) {
          File target = new File(outputDir, file);
          try {
            FileUtil.writeToFile(target, factory.asBytes(file));
            stringBuilder.append(file).append(ResponseUtils.addNewLine());
          } catch (IOException e) {
            ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
                e, sessionInfo.getType(), currentPsiFile.getText());
            return ResponseUtils.getErrorInJson("Cannot get a completion.");
          }
        } else {
          ErrorWriter.ERROR_WRITER.writeExceptionToExceptionAnalyzer(
              new UnsupportedOperationException("Cannot create output directory for files"),
              SessionInfo.TypeOfRequest.DOWNLOAD_LOG.name(),
              currentPsiFile.getText());
          return ResponseUtils.getErrorInJson("Error on server: cannot run your program.");
        }
      }
      ErrorWriterOnServer.LOG_FOR_INFO.info(
          ErrorWriter.getInfoForLogWoIp(
              sessionInfo.getType(),
              sessionInfo.getId(),
              "Write files on disk "
                  + sessionInfo.getTimeManager().getMillisecondsFromSavedTime()));

      JSONArray jsonArray = new JSONArray();
      Map<String, String> map = new HashMap<String, String>();
      map.put("type", "info");
      map.put("text", stringBuilder.toString());
      jsonArray.put(map);

      JavaRunner runner =
          new JavaRunner(files, arguments, jsonArray, currentPsiFile.getText(), sessionInfo);

      return runner.getResult(outputDir.getAbsolutePath());

    } else {
      return generateResponseWithErrors(errors);
    }
  }