From 9820abe11c0c037f50bb2f7ddbb0bd19646264dc Mon Sep 17 00:00:00 2001
From: Vitaly Takmazov
Date: Fri, 7 Apr 2017 10:29:52 +0300
Subject: juick-www: merge juick-spring-www i18n, drop thymeleaf
---
.gitmodules | 3 -
juick-spring-www/.eslintrc | 32 -
juick-spring-www/build.gradle | 62 --
juick-spring-www/lynks.txt | 37 -
juick-spring-www/package.json | 36 -
.../src/main/java/com/juick/www/HelpService.java | 48 --
.../src/main/java/com/juick/www/WebApp.java | 79 --
.../www/configuration/WebAppConfiguration.java | 60 --
.../juick/www/configuration/WebSecurityConfig.java | 70 --
.../juick/www/configuration/WwwInitializer.java | 52 --
.../www/configuration/WwwSecurityInitializer.java | 20 -
.../www/configuration/WwwServletConfiguration.java | 157 ----
.../com/juick/www/controllers/ErrorController.java | 49 --
.../com/juick/www/controllers/HelpController.java | 67 --
.../com/juick/www/controllers/IndexController.java | 133 ----
.../com/juick/www/controllers/PMController.java | 134 ----
.../com/juick/www/controllers/PostController.java | 286 -------
.../juick/www/controllers/SettingsController.java | 278 -------
.../www/controllers/ShowMessageController.java | 169 ----
.../com/juick/www/controllers/TagController.java | 112 ---
.../juick/www/controllers/ThreadController.java | 67 --
.../juick/www/formatter/SpringDateFormatter.java | 44 --
.../java/com/juick/www/helpers/QueryString.java | 14 -
.../com/juick/www/helpers/QueryStringResolver.java | 31 -
.../main/java/com/juick/www/util/EncodeUtils.java | 10 -
.../src/main/resources/errors.properties | 3 -
.../src/main/resources/errors_ru.properties | 3 -
juick-spring-www/src/main/resources/help | 1 -
.../src/main/resources/messages.properties | 51 --
.../src/main/resources/messages_ru.properties | 51 --
.../WEB-INF/templates/layout/mainLayout.html | 29 -
.../WEB-INF/templates/layout/partial/footer.html | 37 -
.../templates/layout/partial/navigation.html | 55 --
.../main/webapp/WEB-INF/templates/views/error.html | 16 -
.../main/webapp/WEB-INF/templates/views/help.html | 17 -
.../main/webapp/WEB-INF/templates/views/index.html | 21 -
.../main/webapp/WEB-INF/templates/views/login.html | 145 ----
.../templates/views/partial/blog_messages.html | 54 --
.../templates/views/partial/blog_paginator.html | 3 -
.../templates/views/partial/blog_postform.html | 14 -
.../templates/views/partial/homecolumn.html | 4 -
.../templates/views/partial/settings_tabs.html | 7 -
.../WEB-INF/templates/views/partial/tags.html | 3 -
.../templates/views/partial/thread_message.html | 57 --
.../webapp/WEB-INF/templates/views/pm_inbox.html | 45 --
.../webapp/WEB-INF/templates/views/pm_sent.html | 42 -
.../webapp/WEB-INF/templates/views/posted.html | 40 -
.../WEB-INF/templates/views/settings_about.html | 31 -
.../templates/views/settings_auth-email.html | 20 -
.../WEB-INF/templates/views/settings_main.html | 153 ----
.../WEB-INF/templates/views/settings_password.html | 28 -
.../WEB-INF/templates/views/settings_result.html | 18 -
.../webapp/WEB-INF/templates/views/thread.html | 17 -
juick-spring-www/src/main/webapp/WEB-INF/web.xml | 7 -
juick-spring-www/src/main/webapp/favicon.ico | Bin 244 -> 0 bytes
juick-spring-www/src/main/webapp/favicon.png | Bin 244 -> 0 bytes
juick-spring-www/src/main/webapp/logo.png | Bin 1184 -> 0 bytes
.../src/main/webapp/static/dialog-close.png | Bin 1097 -> 0 bytes
.../src/main/webapp/static/facebook.png | Bin 203 -> 0 bytes
.../src/main/webapp/static/favicon.png | Bin 244 -> 0 bytes
.../src/main/webapp/static/icon-fb.png | Bin 203 -> 0 bytes
.../src/main/webapp/static/icon-gplus.png | Bin 501 -> 0 bytes
.../src/main/webapp/static/icon-lj.png | Bin 1183 -> 0 bytes
.../src/main/webapp/static/icon-twitter.png | Bin 458 -> 0 bytes
.../src/main/webapp/static/icon-vk.png | Bin 306 -> 0 bytes
juick-spring-www/src/main/webapp/static/logo.png | Bin 2447 -> 0 bytes
.../src/main/webapp/static/logo@2x.png | Bin 4822 -> 0 bytes
juick-spring-www/src/main/webapp/static/menu.png | Bin 479 -> 0 bytes
.../main/webapp/static/photo-attachment-active.png | Bin 267 -> 0 bytes
.../src/main/webapp/static/photo-attachment.png | Bin 234 -> 0 bytes
juick-spring-www/src/main/webapp/static/scripts.js | 753 ------------------
.../src/main/webapp/static/sharesocial.png | Bin 4474 -> 0 bytes
juick-spring-www/src/main/webapp/static/style.css | 874 ---------------------
.../src/main/webapp/static/tagscloud.png | Bin 42316 -> 0 bytes
.../src/main/webapp/static/toolbar-icons.png | Bin 737 -> 0 bytes
juick-spring-www/src/main/webapp/static/vk.png | Bin 306 -> 0 bytes
.../test/java/com/juick/www/NotFoundPageTest.java | 58 --
.../com/juick/www/ThymeleafTestsJunitRunner.java | 40 -
.../src/test/resources/tests/simple.thtest | 25 -
juick-spring-www/webpack.config.js | 37 -
juick-www/src/main/resources/errors.properties | 3 +
juick-www/src/main/resources/errors_ru.properties | 3 +
juick-www/src/main/resources/messages.properties | 51 ++
.../src/main/resources/messages_ru.properties | 51 ++
juick-www/src/main/webapp/WEB-INF/views/login.html | 13 +-
.../main/webapp/WEB-INF/views/partial/footer.html | 10 +-
.../webapp/WEB-INF/views/partial/navigation.html | 20 +-
.../WEB-INF/views/partial/settings_tabs.html | 6 +-
settings.gradle | 2 +-
89 files changed, 135 insertions(+), 4833 deletions(-)
delete mode 100644 juick-spring-www/.eslintrc
delete mode 100644 juick-spring-www/build.gradle
delete mode 100644 juick-spring-www/lynks.txt
delete mode 100644 juick-spring-www/package.json
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/HelpService.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/WebApp.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/configuration/WebAppConfiguration.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/configuration/WebSecurityConfig.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/configuration/WwwSecurityInitializer.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/ErrorController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/PMController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/PostController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/ShowMessageController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/controllers/ThreadController.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/formatter/SpringDateFormatter.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java
delete mode 100644 juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java
delete mode 100644 juick-spring-www/src/main/resources/errors.properties
delete mode 100644 juick-spring-www/src/main/resources/errors_ru.properties
delete mode 160000 juick-spring-www/src/main/resources/help
delete mode 100644 juick-spring-www/src/main/resources/messages.properties
delete mode 100644 juick-spring-www/src/main/resources/messages_ru.properties
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/layout/mainLayout.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/footer.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/navigation.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/error.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/help.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/index.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/login.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_messages.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_paginator.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_postform.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/homecolumn.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/settings_tabs.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/tags.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/thread_message.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_inbox.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_sent.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/posted.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_about.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_auth-email.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_main.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_password.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_result.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/templates/views/thread.html
delete mode 100644 juick-spring-www/src/main/webapp/WEB-INF/web.xml
delete mode 100644 juick-spring-www/src/main/webapp/favicon.ico
delete mode 100644 juick-spring-www/src/main/webapp/favicon.png
delete mode 100644 juick-spring-www/src/main/webapp/logo.png
delete mode 100644 juick-spring-www/src/main/webapp/static/dialog-close.png
delete mode 100644 juick-spring-www/src/main/webapp/static/facebook.png
delete mode 100644 juick-spring-www/src/main/webapp/static/favicon.png
delete mode 100644 juick-spring-www/src/main/webapp/static/icon-fb.png
delete mode 100644 juick-spring-www/src/main/webapp/static/icon-gplus.png
delete mode 100644 juick-spring-www/src/main/webapp/static/icon-lj.png
delete mode 100644 juick-spring-www/src/main/webapp/static/icon-twitter.png
delete mode 100644 juick-spring-www/src/main/webapp/static/icon-vk.png
delete mode 100644 juick-spring-www/src/main/webapp/static/logo.png
delete mode 100644 juick-spring-www/src/main/webapp/static/logo@2x.png
delete mode 100644 juick-spring-www/src/main/webapp/static/menu.png
delete mode 100644 juick-spring-www/src/main/webapp/static/photo-attachment-active.png
delete mode 100644 juick-spring-www/src/main/webapp/static/photo-attachment.png
delete mode 100644 juick-spring-www/src/main/webapp/static/scripts.js
delete mode 100644 juick-spring-www/src/main/webapp/static/sharesocial.png
delete mode 100644 juick-spring-www/src/main/webapp/static/style.css
delete mode 100644 juick-spring-www/src/main/webapp/static/tagscloud.png
delete mode 100644 juick-spring-www/src/main/webapp/static/toolbar-icons.png
delete mode 100644 juick-spring-www/src/main/webapp/static/vk.png
delete mode 100644 juick-spring-www/src/test/java/com/juick/www/NotFoundPageTest.java
delete mode 100644 juick-spring-www/src/test/java/com/juick/www/ThymeleafTestsJunitRunner.java
delete mode 100644 juick-spring-www/src/test/resources/tests/simple.thtest
delete mode 100644 juick-spring-www/webpack.config.js
create mode 100644 juick-www/src/main/resources/errors.properties
create mode 100644 juick-www/src/main/resources/errors_ru.properties
create mode 100644 juick-www/src/main/resources/messages.properties
create mode 100644 juick-www/src/main/resources/messages_ru.properties
diff --git a/.gitmodules b/.gitmodules
index 54466eb1..9fbba638 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
[submodule "juick-www/src/main/resources/help"]
path = juick-www/src/main/resources/help
url = https://github.com/juick/help.git
-[submodule "juick-spring-www/src/main/resources/help"]
- path = juick-spring-www/src/main/resources/help
- url = https://github.com/juick/help.git
diff --git a/juick-spring-www/.eslintrc b/juick-spring-www/.eslintrc
deleted file mode 100644
index 70f0fc89..00000000
--- a/juick-spring-www/.eslintrc
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- // Extend existing configuration
- // from ESlint and eslint-plugin-react defaults.
- "extends": [
- "eslint:recommended"
- //, "plugin:react/recommended"
- ],
- // Enable ES6 support. If you want to use custom Babel
- // features, you will need to enable a custom parser
- // as described in a section below.
- "parserOptions": {
- "ecmaVersion": 6,
- "sourceType": "module"
- },
- "env": {
- "browser": true,
- "node": true
- },
- // Enable custom plugin known as eslint-plugin-react
- "plugins": [
- // "react"
- ],
- "rules": {
- // Disable `no-console` rule
- "no-console": 0,
- // Give a warning if identifiers contain underscores
- "no-underscore-dangle": 1,
- // Default to single quotes and raise an error if something
- // else is used
- "quotes": [2, "single"]
- }
-}
\ No newline at end of file
diff --git a/juick-spring-www/build.gradle b/juick-spring-www/build.gradle
deleted file mode 100644
index 8c1df178..00000000
--- a/juick-spring-www/build.gradle
+++ /dev/null
@@ -1,62 +0,0 @@
-buildscript {
- repositories {
- mavenCentral()
- jcenter()
- }
-}
-
-plugins {
- id "com.moowork.node" version "1.1.0"
-}
-
-task compileFrontend(type: NpmTask) {
- args = ['run', 'compile']
-}
-
-apply plugin: 'java'
-apply plugin: 'war'
-apply plugin: 'org.akhikhl.gretty'
-apply plugin: 'com.github.ben-manes.versions'
-
-def thymeleafVersion = "3.0.3.RELEASE"
-
-dependencies {
- compile project(':juick-server')
- compile "com.sun.mail:javax.mail:1.5.6"
- compile "org.pegdown:pegdown:1.6.0"
- compile "org.springframework:spring-webmvc:${rootProject.springFrameworkVersion}"
- compile "org.springframework:spring-context-support:${rootProject.springFrameworkVersion}"
- compile "org.thymeleaf:thymeleaf:${thymeleafVersion}"
- compile "org.thymeleaf:thymeleaf-spring4:${thymeleafVersion}"
- compile "org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.0.RELEASE"
- compile "org.thymeleaf.extras:thymeleaf-extras-springsecurity4:3.0.2.RELEASE"
- compile "nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:2.2.1"
-
- compile 'org.imgscalr:imgscalr-lib:4.2'
- testCompile "junit:junit:${rootProject.junitVersion}"
- testCompile "org.hamcrest:hamcrest-all:${rootProject.hamcrestVersion}"
- testCompile "org.mockito:mockito-core:${rootProject.mockitoVersion}"
- testCompile "org.springframework:spring-test:${rootProject.springFrameworkVersion}"
- testCompile "ch.vorburger.mariaDB4j:mariaDB4j:2.2.3"
-
- testCompile "org.thymeleaf:thymeleaf-testing:3.0.2.RELEASE"
- testCompile "org.springframework.security:spring-security-test:${rootProject.springSecurityVersion}"
-
- providedCompile "javax.servlet:javax.servlet-api:3.1.0"
-
- providedRuntime "mysql:mysql-connector-java:5.1.40"
-}
-
-compileFrontend.dependsOn 'npmInstall'
-war.dependsOn 'compileFrontend'
-compileJava.options.encoding = 'UTF-8'
-
-gretty {
- httpPort = 8080
- contextPath = ''
- servletContainer = 'tomcat8'
-}
-
-configurations {
- all*.exclude module: 'commons-logging'
-}
diff --git a/juick-spring-www/lynks.txt b/juick-spring-www/lynks.txt
deleted file mode 100644
index 8df4fe80..00000000
--- a/juick-spring-www/lynks.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-* Exception Handling in Spring MVC
-https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
-
-* Spring security EL
-http://docs.spring.io/spring-security/site/docs/4.2.0.RELEASE/reference/htmlsingle/#el-access
-
-* Tutorial: Using Thymeleaf
-http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
-
-
-* Tutorial: Thymeleaf + Spring
-http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html
-
-
-* Spring MVC and Thymeleaf: how to access data from templates
-http://www.thymeleaf.org/doc/articles/springmvcaccessdata.html
-
-
-* Thymeleaf + Spring Security integration basics
-http://www.thymeleaf.org/doc/articles/springsecurity.html
-
-
-* Thymeleaf Layout Dialect
-https://ultraq.github.io/thymeleaf-layout-dialect/
-
-
-* Thymeleaf Testing Library
-https://github.com/thymeleaf/thymeleaf-testing
-
-
-* Markdown to HTML with Java/Scala
-http://stackoverflow.com/questions/19784525/markdown-to-html-with-java-scala
-
-
-* A pure-Java Markdown processor based on a parboiled PEG parser supporting a number of extensions - pegdown
-https://github.com/sirthias/pegdown
-
diff --git a/juick-spring-www/package.json b/juick-spring-www/package.json
deleted file mode 100644
index 2eda35cd..00000000
--- a/juick-spring-www/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "juick",
- "version": "1.0.0",
- "private": true,
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "compile": "webpack --colors -p"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/juick/juick.git"
- },
- "license": "AGPLv3",
- "devDependencies": {
- "css-loader": "^0.23.1",
- "csslint": "^1.0.2",
- "csslint-loader": "^1.0.0",
- "eslint": "^3.1.1",
- "eslint-loader": "^1.4.1",
- "extract-text-webpack-plugin": "^1.0.1",
- "file-loader": "^0.9.0",
- "globby": "^4.1.0",
- "script-loader": "^0.7.0",
- "style-loader": "^0.13.1",
- "uglify-loader": "^1.3.0",
- "url-loader": "^0.5.7",
- "webpack": "^1.13.1"
- },
- "dependencies": {
- "autosize": "^3.0.16",
- "classlist.js": "^1.1.20150312",
- "element-closest": "^2.0.1",
- "evil-icons": "^1.8.0",
- "whatwg-fetch": "^1.0.0"
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/HelpService.java b/juick-spring-www/src/main/java/com/juick/www/HelpService.java
deleted file mode 100644
index 8ece4cfb..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/HelpService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.juick.www;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.cache.annotation.Cacheable;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.regex.Pattern;
-
-/**
- * Created by aalexeev on 12/11/16.
- */
-public class HelpService {
- private static final Pattern LANG_PATTERN = Pattern.compile("[a-z]{2}");
-
- private static final Pattern PAGE_PATTERN = Pattern.compile("[a-zA-Z0-9\\-_]+");
-
- private final String helpPath;
-
-
- public HelpService(String helpPath) {
- this.helpPath = helpPath;
- }
-
- @Cacheable("help")
- public String getHelp(final String page, final String lang) {
- if (canBePage(page) && canBeLang(lang)) {
- String path = StringUtils.joinWith("/", helpPath, lang, page);
-
- try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(path)) {
- if (is != null)
- return IOUtils.toString(is, StandardCharsets.UTF_8);
- } catch (IOException e) {
- }
- }
- return null;
- }
-
- public boolean canBePage(final String anything) {
- return anything != null && PAGE_PATTERN.matcher(anything).matches();
- }
-
- public boolean canBeLang(final String anything) {
- return anything != null && LANG_PATTERN.matcher(anything).matches();
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/WebApp.java b/juick-spring-www/src/main/java/com/juick/www/WebApp.java
deleted file mode 100644
index 6b26ec03..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/WebApp.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.juick.www;
-
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.env.Environment;
-import rocks.xmpp.core.XmppException;
-import rocks.xmpp.core.session.Extension;
-import rocks.xmpp.core.session.XmppSessionConfiguration;
-import rocks.xmpp.extensions.component.accept.ExternalComponent;
-
-import javax.annotation.PostConstruct;
-
-/**
- * Created by vitalyster on 09.12.2016.
- */
-public class WebApp implements AutoCloseable {
- private static Logger logger = LoggerFactory.getLogger(WebApp.class);
-
- private ExternalComponent xmpp;
-
- public String tmpDir;
- public String imgDir;
-
- private String xmppHost, xmppPassword, xmppJid;
- private int xmppPort;
- private boolean isXmppDisabled;
-
-
- public WebApp(Environment conf) {
- tmpDir = conf.getProperty("upload_tmp_dir", "/var/www/juick.com/i/tmp/");
- imgDir = conf.getProperty("img_path", "/var/www/juick.com/i/");
- isXmppDisabled = BooleanUtils.toBoolean(conf.getProperty("xmpp_disabled"));
- xmppHost = conf.getProperty("xmpp_host", "localhost");
- xmppPort = NumberUtils.toInt(conf.getProperty("xmpp_port", "5347"), 5347);
- xmppJid = conf.getProperty("xmpp_jid", "www.localhost");
- xmppPassword = conf.getProperty("xmpp_password");
- }
-
- @PostConstruct
- public void init() {
- if (!isXmppDisabled) {
- setupXmppComponent(xmppHost, xmppPort, xmppJid, xmppPassword);
- }
- }
-
- @Override
- public void close() {
- try {
- if (getXmpp() != null)
- getXmpp().close();
-
- logger.info("ExternalComponent on juick-www destroyed");
- } catch (Exception e) {
- logger.warn("Exception occurs on juick-www destroy", e);
- }
- }
-
- public void setupXmppComponent(final String host, final int port, final String jid, final String password) {
- XmppSessionConfiguration configuration = XmppSessionConfiguration.builder()
- .extensions(Extension.of(com.juick.Message.class))
- .build();
- setXmpp(ExternalComponent.create(jid, password, configuration, host, port));
- try {
- getXmpp().connect();
- } catch (XmppException e) {
- logger.warn("xmpp extension", e);
- }
- }
-
- public ExternalComponent getXmpp() {
- return xmpp;
- }
-
- public void setXmpp(ExternalComponent xmpp) {
- this.xmpp = xmpp;
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WebAppConfiguration.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WebAppConfiguration.java
deleted file mode 100644
index 4482dce1..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/configuration/WebAppConfiguration.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.juick.www.configuration;
-
-import com.juick.www.HelpService;
-import com.juick.www.WebApp;
-import org.apache.commons.lang3.CharEncoding;
-import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.cache.guava.GuavaCacheManager;
-import org.springframework.cache.interceptor.KeyGenerator;
-import org.springframework.cache.interceptor.SimpleKeyGenerator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.context.support.ResourceBundleMessageSource;
-import org.springframework.core.env.Environment;
-
-import javax.annotation.Resource;
-
-/**
- * Created by aalexeev on 11/22/16.
- */
-@Configuration
-@PropertySource("classpath:juick.conf")
-@EnableCaching
-public class WebAppConfiguration {
- @Resource
- private Environment env;
-
- @Bean
- public ResourceBundleMessageSource messageSource() {
- ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
-
- messageSource.setBasenames("messages", "errors");
- messageSource.setDefaultEncoding(CharEncoding.UTF_8);
- messageSource.setFallbackToSystemLocale(false);
- messageSource.setUseCodeAsDefaultMessage(true);
-
- return messageSource;
- }
-
- @Bean
- public WebApp webApp() {
- return new WebApp(env);
- }
-
- @Bean
- public GuavaCacheManager cacheManager() {
- return new GuavaCacheManager("help");
- }
-
- @Bean
- public HelpService helpService() {
- return new HelpService("help");
- }
-
- @Bean
- public KeyGenerator keyGenerator() {
- // configure and return an implementation of Spring's KeyGenerator SPI
- return new SimpleKeyGenerator();
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WebSecurityConfig.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WebSecurityConfig.java
deleted file mode 100644
index 19485579..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/configuration/WebSecurityConfig.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.juick.www.configuration;
-
-import com.juick.server.security.entities.JuickUser;
-import com.juick.service.UserService;
-import com.juick.service.security.JuickUserDetailsService;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.core.env.Environment;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.core.userdetails.UserDetailsService;
-
-import javax.annotation.Resource;
-
-/**
- * Created by aalexeev on 11/21/16.
- */
-@EnableWebSecurity
-@PropertySource("classpath:juick.conf")
-public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Resource
- private Environment env;
- @Resource
- private UserService userService;
-
- @Bean("userDetailsService")
- @Override
- public UserDetailsService userDetailsServiceBean() throws Exception {
- return super.userDetailsServiceBean();
- }
-
- @Override
- public UserDetailsService userDetailsService() {
- return new JuickUserDetailsService(userService);
- }
-
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- http
- .authorizeRequests()
- .antMatchers("/settings", "/pm/**").authenticated()
- .anyRequest().permitAll()
- .and()
- .anonymous().principal(JuickUser.ANONYMOUS_USER).authorities(JuickUser.ANONYMOUS_AUTHORITY)
- .and()
- .sessionManagement().invalidSessionUrl("/")
- .and()
- .logout().invalidateHttpSession(true).logoutUrl("/logout").logoutSuccessUrl("/")
- .and()
- .formLogin()
- .loginPage("/login")
- .permitAll()
- .defaultSuccessUrl("/")
- .loginProcessingUrl("/do_login")
- .usernameParameter("j_username")
- .passwordParameter("j_password")
- .failureUrl("/login-error")
- .and()
- .rememberMe()
- .tokenValiditySeconds(6 * 30 * 24 * 3600)
- .alwaysRemember(true)
- //.useSecureCookie(true) // TODO Enable if https is supports
- .rememberMeCookieDomain(env.getProperty("web_domain", "juick.com"))
- .userDetailsService(userDetailsService())
- .key(env.getProperty("auth_remember_me_key"))
- .and()
- .csrf().disable();
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java
deleted file mode 100644
index 33687983..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.juick.www.configuration;
-
-import com.juick.configuration.DataConfiguration;
-import com.juick.configuration.SearchConfiguration;
-import org.apache.commons.lang3.CharEncoding;
-import org.springframework.web.filter.CharacterEncodingFilter;
-import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
-
-import javax.servlet.FilterRegistration;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-
-/**
- * Created by aalexeev on 11/20/16.
- */
-public class WwwInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
-
- @Override
- protected Class>[] getRootConfigClasses() {
- return new Class>[]{
- WebAppConfiguration.class,
- DataConfiguration.class,
- SearchConfiguration.class,
- WebSecurityConfig.class};
- }
-
- @Override
- protected Class>[] getServletConfigClasses() {
- return new Class>[]{WwwServletConfiguration.class};
- }
-
- @Override
- protected String[] getServletMappings() {
- return new String[]{"/"};
- }
-
- @Override
- protected String getServletName() {
- return "WWW-spring dispatcher servlet";
- }
-
- @Override
- public void onStartup(ServletContext servletContext) throws ServletException {
- super.onStartup(servletContext);
-
- FilterRegistration.Dynamic registration = servletContext.addFilter(
- "encodingFilter", new CharacterEncodingFilter(CharEncoding.UTF_8, true));
-
- registration.addMappingForUrlPatterns(null, true, "/*");
- }
-}
-
diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwSecurityInitializer.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwSecurityInitializer.java
deleted file mode 100644
index 0ea8c907..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwSecurityInitializer.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.juick.www.configuration;
-
-/**
- * Created by vitalyster on 25.11.2016.
- */
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
-
-import javax.servlet.ServletContext;
-
-public class WwwSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
- private final Logger logger = LoggerFactory.getLogger(getClass());
-
- @Override
- protected void afterSpringSecurityFilterChain(ServletContext servletContext) {
- logger.info("SpringSecurityFilterChain initialized");
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java
deleted file mode 100644
index 5cd251e6..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package com.juick.www.configuration;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
-import com.juick.www.formatter.SpringDateFormatter;
-import nz.net.ultraq.thymeleaf.LayoutDialect;
-import org.apache.commons.lang3.BooleanUtils;
-import org.apache.commons.lang3.CharEncoding;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.core.env.Environment;
-import org.springframework.format.FormatterRegistry;
-import org.springframework.http.CacheControl;
-import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
-import org.springframework.web.multipart.MultipartResolver;
-import org.springframework.web.multipart.commons.CommonsMultipartResolver;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
-import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
-import org.springframework.web.servlet.resource.PathResourceResolver;
-import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect;
-import org.thymeleaf.spring4.SpringTemplateEngine;
-import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
-import org.thymeleaf.spring4.view.ThymeleafViewResolver;
-import org.thymeleaf.templatemode.TemplateMode;
-
-import javax.annotation.Resource;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Created by vitalyster on 28.06.2016.
- */
-@Configuration
-@ComponentScan(basePackages = {"com.juick.www.controllers"})
-@PropertySource("classpath:juick.conf")
-public class WwwServletConfiguration extends WebMvcConfigurationSupport {
- @Resource
- private Environment env;
-
- @Bean
- public SpringResourceTemplateResolver templateResolver() {
- // SpringResourceTemplateResolver automatically integrates with Spring's own
- // resource resolution infrastructure, which is highly recommended.
- SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
- templateResolver.setApplicationContext(getApplicationContext());
- templateResolver.setPrefix("/WEB-INF/templates/");
- templateResolver.setSuffix(".html");
- // HTML is the default value, added here for the sake of clarity.
- templateResolver.setTemplateMode(TemplateMode.HTML);
- // Template cache is true by default. Set to false if you want
- // templates to be automatically updated when modified.
- templateResolver.setCacheable(true);
-
- templateResolver.setCharacterEncoding(CharEncoding.UTF_8);
- return templateResolver;
- }
-
- @Bean
- public SpringTemplateEngine templateEngine() {
- // SpringTemplateEngine automatically applies SpringStandardDialect and
- // enables Spring's own MessageSource message resolution mechanisms.
- SpringTemplateEngine templateEngine = new SpringTemplateEngine();
- templateEngine.setTemplateResolver(templateResolver());
- // Enabling the SpringEL compiler with Spring 4.2.4 or newer can
- // speed up execution in most scenarios, but might be incompatible
- // with specific cases when expressions in one template are reused
- // across different data types, so this flag is "false" by default
- // for safer backwards compatibility.
- templateEngine.setEnableSpringELCompiler(true);
- // Thymeleaf Layout Dialect
- templateEngine.addDialect(new LayoutDialect());
- // Thymeleaf Spring Security integration dialect
- templateEngine.addDialect(new SpringSecurityDialect());
-
- return templateEngine;
- }
-
- @Bean
- public ThymeleafViewResolver viewResolver() {
- ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
- viewResolver.setTemplateEngine(templateEngine());
- viewResolver.setCharacterEncoding(CharEncoding.UTF_8);
-
- viewResolver.addStaticVariable(
- "showSape", BooleanUtils.toBoolean(env.getProperty("template.showSape", "true")));
- viewResolver.addStaticVariable(
- "showAdv", BooleanUtils.toBoolean(env.getProperty("template.showAdv", "true")));
- viewResolver.addStaticVariable(
- "showSponsors", BooleanUtils.toBoolean(env.getProperty("template.showSponsors", "false")));
-
- return viewResolver;
- }
-
- @Override
- protected void configureMessageConverters(List> converters) {
- Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
- .serializationInclusion(JsonInclude.Include.NON_DEFAULT)
- .serializationInclusion(JsonInclude.Include.NON_NULL)
- .serializationInclusion(JsonInclude.Include.NON_ABSENT)
- .serializationInclusion(JsonInclude.Include.NON_EMPTY);
-
- MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
- converter.getObjectMapper().registerModule(new Jdk8Module());
- converters.add(converter);
-
- super.configureMessageConverters(converters);
- }
-
- @Override
- protected void addResourceHandlers(ResourceHandlerRegistry registry) {
- registry.setOrder(0);
- registry.addResourceHandler(
- "/scripts.js*",
- "/style.css*",
- "/*.png",
- "/favicon.ico")
- .addResourceLocations("/")
- .setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
- .resourceChain(true)
- .addResolver(new PathResourceResolver());
-
- registry.addResourceHandler("/static/**")
- .addResourceLocations("/static/")
- .setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS));
- }
-
- @Override
- public RequestMappingHandlerMapping requestMappingHandlerMapping() {
- RequestMappingHandlerMapping result = super.requestMappingHandlerMapping();
-
- result.setOrder(1);
-
- return result;
- }
-
- @Override
- public void addFormatters(final FormatterRegistry registry) {
- registry.addFormatter(dateFormatter());
- }
-
- @Bean
- public SpringDateFormatter dateFormatter() {
- return new SpringDateFormatter();
- }
-
- @Bean
- public MultipartResolver multipartResolver() {
- CommonsMultipartResolver resolver = new CommonsMultipartResolver();
- resolver.setMaxUploadSize(10000000);
- return resolver;
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/ErrorController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/ErrorController.java
deleted file mode 100644
index 57a34076..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/ErrorController.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.server.util.HttpBadRequestException;
-import com.juick.server.util.HttpForbiddenException;
-import com.juick.server.util.HttpNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpStatus;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseStatus;
-
-/**
- * Created by aalexeev on 12/12/16.
- */
-@ControllerAdvice
-public class ErrorController {
- private static Logger logger = LoggerFactory.getLogger(ErrorController.class);
-
- @ExceptionHandler(HttpBadRequestException.class)
- @ResponseStatus(value = HttpStatus.BAD_REQUEST)
- public String badRequest() {
- return "views/error";
- }
-
- @ExceptionHandler(HttpForbiddenException.class)
- @ResponseStatus(value = HttpStatus.FORBIDDEN)
- public String forbidden() {
- return "views/error";
- }
-
- @ExceptionHandler(HttpNotFoundException.class)
- @ResponseStatus(value = HttpStatus.NOT_FOUND)
- public String notFound() {
- return "views/error";
- }
-
- @ExceptionHandler(Throwable.class)
- @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
- public String exception(final Throwable throwable, final Model model) {
- logger.error("Exception during execution of SpringSecurity application", throwable);
-
- String errorMessage = (throwable != null ? throwable.getMessage() : "Unknown error");
- model.addAttribute("errorMessage", errorMessage);
-
- return "views/error";
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java
deleted file mode 100644
index 3387f821..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.server.util.HttpNotFoundException;
-import com.juick.util.UserUtils;
-import com.juick.www.HelpService;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import javax.inject.Inject;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.Locale;
-import java.util.Objects;
-import java.util.Optional;
-
-/**
- * Created by aalexeev on 11/21/16.
- */
-@Controller
-public class HelpController {
- @Inject
- private HelpService helpService;
-
- @RequestMapping({"/help", "/help/{langOrPage}", "/help/{lang}/{page}"})
- public String showHelp(
- Locale locale,
- @PathVariable("lang") Optional langParam,
- @PathVariable("page") Optional pageParam,
- @PathVariable("langOrPage") Optional langOrPageParam,
- Model model) throws IOException, URISyntaxException {
-
- String page = pageParam.orElse("index");
- String lang = langParam.orElse(locale.getLanguage());
-
- String navigation = null;
-
- if (langOrPageParam.isPresent()) {
- String langOrPage = langOrPageParam.get();
-
- if (helpService.canBeLang(langOrPage)) {
- navigation = helpService.getHelp("navigation", langOrPage);
- if (navigation != null)
- lang = langOrPage;
- }
-
- if (navigation == null && helpService.canBePage(langOrPage))
- page = langOrPage;
- }
-
- String content = helpService.getHelp(page, lang);
- if (content == null && !Objects.equals("index", page))
- content = helpService.getHelp("index", lang);
-
- if (navigation == null)
- navigation = helpService.getHelp("navigation", lang);
-
- if (content == null || navigation == null)
- throw new HttpNotFoundException();
-
- model.addAttribute("help_nav", navigation);
- model.addAttribute("help_data", content);
-
- return "views/help";
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java
deleted file mode 100644
index 87540795..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.Message;
-import com.juick.User;
-import com.juick.service.MessagesService;
-import com.juick.service.TagService;
-import com.juick.service.UserService;
-import com.juick.util.UserUtils;
-import com.juick.www.util.EncodeUtils;
-import org.apache.commons.lang3.StringEscapeUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.context.MessageSource;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-/**
- * Created by aalexeev on 11/21/16.
- */
-@Controller
-public class IndexController {
- @Inject
- private MessageSource messageSource;
- @Inject
- private UserService userService;
- @Inject
- private MessagesService messagesService;
- @Inject
- private TagService tagService;
-
- @RequestMapping(value = "/", method = RequestMethod.GET)
- public String indexPage(
- @RequestParam("show") Optional paramShow,
- @RequestParam("tag") Optional paramTagStr,
- @RequestParam(value = "before") Optional paramBefore,
- @RequestParam(value = "search", required = false) String paramSearch,
- ModelMap model) throws IOException {
-
- int before = paramBefore.orElse(0);
- String tag = paramTagStr.orElse(StringUtils.EMPTY);
-
- if (StringUtils.isNotEmpty(tag)) {
- StringBuilder builder = new StringBuilder();
- builder.append("redirect:").append("/tag/").append(tag);
- if (before > 0)
- builder.append("?before=").append(before);
- return builder.toString();
- }
-
- if (StringUtils.isNotEmpty(paramSearch) && paramSearch.length() > 64)
- paramSearch = StringUtils.EMPTY;
-
- User visitor = UserUtils.getCurrentUser();
-
- String title = StringUtils.EMPTY;
-
- List mids = new ArrayList<>();
-
- if (StringUtils.isNotEmpty(paramSearch)) {
- title = "Поиск: " + StringEscapeUtils.escapeHtml4(paramSearch);
- mids = messagesService.getSearch(EncodeUtils.encodeSphinx(paramSearch),
- before);
- } else if (!paramShow.isPresent()) {
- mids = messagesService.getPopular(visitor.getUid(), before);
- } else if (paramShow.get().equals("top")) {
- return "redirect:/";
- } else if (paramShow.get().equals("my") && visitor.getUid() > 0) {
- title = "Моя лента";
- mids = messagesService.getMyFeed(visitor.getUid(), before);
- } else if (paramShow.get().equals("private") && visitor.getUid() > 0) {
- title = "Приватные";
- mids = messagesService.getPrivate(visitor.getUid(), before);
- } else if (paramShow.get().equals("discuss") && visitor.getUid() > 0) {
- title = "Обсуждения";
- mids = messagesService.getDiscussions(visitor.getUid(), before);
- } else if (paramShow.get().equals("recommended") && visitor.getUid() > 0) {
- title = "Рекомендации";
- mids = messagesService.getRecommended(visitor.getUid(), before);
- } else if (paramShow.get().equals("photos")) {
- title = "Фотографии";
- mids = messagesService.getPhotos(visitor.getUid(), before);
- } else if (paramShow.get().equals("all")) {
- title = "Все сообщения";
- mids = messagesService.getAll(visitor.getUid(), before);
- }
- model.addAttribute("title", title);
- model.addAttribute("tags", tagService.getPopularTags());
- List msgs = messagesService.getMessages(mids);
- List blUIDs = userService.checkBL(visitor.getUid(),
- msgs.stream().map(m -> m.getUser().getUid()).collect(Collectors.toList()));
- model.addAttribute("msgs",
- msgs.stream().map(msg -> {
- msg.ReadOnly |= blUIDs.contains(msg.getUser().getUid());
- if (msg.ReadOnly) {
- msg.ReadOnly = visitor.getUid() != msg.getUser().getUid();
- }
- return msg;
- }).collect(Collectors.toList())
- );
- if (mids.size() >= 20) {
- String nextpage = "?before=" + mids.get(mids.size() - 1);
- if (paramShow.isPresent()) {
- nextpage += "&show=" + paramShow.get();
- }
- if (StringUtils.isNotEmpty(paramSearch)) {
- nextpage += "&search=" + paramSearch;
- }
- model.addAttribute("nextpage", nextpage);
- }
- return "views/index";
- }
-
- @RequestMapping(value = "/login", method = RequestMethod.GET)
- public String getLoginForm() {
- return "views/login";
- }
-
- @RequestMapping(value = "/login-error", method = RequestMethod.GET)
- public String getLoginErrorForm(Model model) {
- model.addAttribute("loginError", true);
- return "views/login";
- }
-}
\ No newline at end of file
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/PMController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/PMController.java
deleted file mode 100644
index f590fc7c..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/PMController.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.Message;
-import com.juick.User;
-import com.juick.server.util.HttpBadRequestException;
-import com.juick.server.util.HttpForbiddenException;
-import com.juick.service.PMQueriesService;
-import com.juick.service.TagService;
-import com.juick.service.UserService;
-import com.juick.util.MessageUtils;
-import com.juick.util.UserUtils;
-import com.juick.util.WebUtils;
-import com.juick.www.WebApp;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import rocks.xmpp.addr.Jid;
-
-import javax.inject.Inject;
-import java.util.List;
-
-/**
- * Created by vitalyster on 09.12.2016.
- */
-@Controller
-public class PMController {
- private static final Logger logger = LoggerFactory.getLogger(PMController.class);
-
- @Inject
- PMQueriesService pmQueriesService;
- @Inject
- UserService userService;
- @Inject
- TagService tagService;
- @Inject
- WebApp webApp;
-
- @RequestMapping("/pm/inbox")
- public String doGetInbox(ModelMap context) {
- User visitor = UserUtils.getCurrentUser();
-
- String title = "PM: Inbox";
- List msgs = pmQueriesService.getLastPMInbox(visitor.getUid());
-
- msgs.forEach(m -> m.setText(MessageUtils.formatMessage(m.getText())));
-
- context.put("title", title);
- context.put("msgs", msgs);
- context.put("tags", tagService.getPopularTags());
-
- return "views/pm_inbox";
- }
-
- @RequestMapping(value = "/pm/sent", method = RequestMethod.GET)
- public String doGetSent(
- @RequestParam String uname,
- ModelMap context) {
- String title = "PM: Sent";
- User visitor = UserUtils.getCurrentUser();
- List msgs = pmQueriesService.getLastPMSent(visitor.getUid());
-
- if (WebUtils.isNotUserName(uname)) {
- uname = StringUtils.EMPTY;
- }
- context.put("title", title);
- context.put("msgs", msgs);
- context.put("tags", tagService.getPopularTags());
- context.put("uname", uname);
- return "views/pm_sent";
- }
-
- @RequestMapping(value = "/pm/send", method = RequestMethod.POST)
- public String doPostPM(
- @RequestParam String uname,
- @RequestParam String body,
- ModelMap context) {
- User visitor = UserUtils.getCurrentUser();
- if (uname.startsWith("@")) {
- uname = uname.substring(1);
- }
- int uid = 0;
- if (WebUtils.isUserName(uname)) {
- uid = userService.getUIDbyName(uname);
- }
-
- if (uid == 0 || body == null || body.length() < 1 || body.length() > 10240) {
- throw new HttpBadRequestException();
- }
-
- if (userService.isInBLAny(uid, visitor.getUid())) {
- throw new HttpForbiddenException();
- }
-
- if (pmQueriesService.createPM(visitor.getUid(), uid, body)) {
- if (webApp.getXmpp() != null) {
- rocks.xmpp.core.stanza.model.Message msg = new rocks.xmpp.core.stanza.model.Message();
- msg.setFrom(Jid.of("juick@juick.com"));
- msg.setTo(Jid.of(String.format("%d@push.juick.com", uid)));
- com.juick.Message jmsg = new com.juick.Message();
- jmsg.setUser(visitor);
- jmsg.setText(body);
- msg.addExtension(jmsg);
- webApp.getXmpp().send(msg);
-
- msg.setTo(Jid.of(String.format("%d@ws.juick.com", uid)));
- webApp.getXmpp().send(msg);
-
- List jids = userService.getJIDsbyUID(uid);
- for (String jid : jids) {
- rocks.xmpp.core.stanza.model.Message mm = new rocks.xmpp.core.stanza.model.Message();
- mm.setTo(Jid.of(jid));
- mm.setType(rocks.xmpp.core.stanza.model.Message.Type.CHAT);
- if (pmQueriesService.havePMinRoster(visitor.getUid(), jid)) {
- mm.setFrom(Jid.of(jmsg.getUser().getName(), "juick.com", "Juick"));
- mm.setBody(body);
- } else {
- mm.setFrom(Jid.of("juick", "juick.com", "Juick"));
- mm.setBody("Private message from @" + jmsg.getUser().getName() + ":\n" + body);
- }
- webApp.getXmpp().send(mm);
- }
- } else {
- logger.warn("XMPP unavailable");
- }
- return "redirect:/pm/sent";
- }
- throw new HttpBadRequestException();
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/PostController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/PostController.java
deleted file mode 100644
index 8ad06402..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/PostController.java
+++ /dev/null
@@ -1,286 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.Tag;
-import com.juick.User;
-import com.juick.server.util.HttpBadRequestException;
-import com.juick.server.util.HttpForbiddenException;
-import com.juick.server.util.HttpNotFoundException;
-import com.juick.server.util.HttpUtils;
-import com.juick.service.MessagesService;
-import com.juick.service.SubscriptionService;
-import com.juick.service.TagService;
-import com.juick.service.UserService;
-import com.juick.util.UserUtils;
-import com.juick.www.WebApp;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.lang3.CharEncoding;
-import org.apache.commons.lang3.StringUtils;
-import org.imgscalr.Scalr;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.multipart.MultipartFile;
-import rocks.xmpp.addr.Jid;
-import rocks.xmpp.core.stanza.model.Message;
-import rocks.xmpp.extensions.nick.model.Nickname;
-import rocks.xmpp.extensions.oob.model.x.OobX;
-
-import javax.imageio.ImageIO;
-import javax.inject.Inject;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-
-/**
- * Created by vitalyster on 20.12.2016.
- */
-@Controller
-public class PostController {
-
- private static final Logger logger = LoggerFactory.getLogger(PostController.class);
-
- @Inject
- MessagesService messagesService;
- @Inject
- UserService userService;
- @Inject
- SubscriptionService subscriptionService;
- @Inject
- TagService tagService;
- @Inject
- WebApp webApp;
- @Inject
- Environment env;
-
- @RequestMapping(value = "/post", method = RequestMethod.POST)
- public String doPost(
- @RequestParam(required = false, value = "tags") String tagsStr,
- @RequestParam String body,
- @RequestParam(required = false) String img,
- @RequestParam(required = false) MultipartFile attach,
- ModelMap modelMap
- ) throws IOException {
- body = body.replace("\r", StringUtils.EMPTY);
-
- List tags = tagService.fromString(tagsStr, true);
-
- String attachmentFName = HttpUtils.receiveMultiPartFile(attach, env.getProperty("upload_tmp_dir",
- "/var/www/juick.com/i/tmp/"));
-
- if (StringUtils.isBlank(attachmentFName) && img != null && img.length() > 10) {
- try {
- URL imgUrl = new URL(img);
- attachmentFName = HttpUtils.downloadImage(imgUrl);
- } catch (Exception e) {
- logger.error("DOWNLOAD ERROR", e);
- throw new HttpBadRequestException();
- }
- }
-
- User visitor = UserUtils.getCurrentUser();
-
- String attachmentType = StringUtils.isNotEmpty(attachmentFName) ? attachmentFName.substring(attachmentFName.length() - 3) : null;
- int mid = messagesService.createMessage(visitor.getUid(), body, attachmentType, tags);
- subscriptionService.subscribeMessage(mid, visitor.getUid());
-
- Message xmsg = new Message();
- xmsg.setFrom(Jid.of("juick@juick.com"));
- xmsg.setType(Message.Type.CHAT);
- xmsg.setThread("juick-" + mid);
- com.juick.Message jmsg = messagesService.getMessage(mid);
- xmsg.addExtension(jmsg);
- xmsg.addExtension(new Nickname("@" + jmsg.getUser().getName()));
-
- if (StringUtils.isNotEmpty(attachmentFName)) {
- String fname = mid + "." + attachmentType;
- String attachmentURL = "http://i.juick.com/photos-1024/" + fname;
-
- Path origName = Paths.get(webApp.imgDir, "p", fname);
- Files.move(Paths.get(webApp.tmpDir, attachmentFName), origName);
- BufferedImage originalImage = ImageIO.read(origName.toFile());
- ImageIO.write(Scalr.resize(originalImage, 1024),
- FilenameUtils.getExtension(origName.toString()),
- Paths.get(webApp.imgDir, "photos-1024", fname).toFile());
- ImageIO.write(Scalr.resize(originalImage, 512),
- FilenameUtils.getExtension(origName.toString()),
- Paths.get(webApp.imgDir, "photos-512", fname).toFile());
- ImageIO.write(Scalr.resize(originalImage, 160),
- FilenameUtils.getExtension(origName.toString()),
- Paths.get(webApp.imgDir, "ps", fname).toFile());
-
- body = attachmentURL + "\n" + body;
- try {
- xmsg.addExtension(new OobX(new URI(attachmentURL)));
- } catch (URISyntaxException e) {
- logger.warn("invalid uri: {} exception {}", attachmentURL, e);
- }
- }
- if (webApp.getXmpp() != null) {
-
- xmsg.setBody("@" + jmsg.getUser().getName() + ":" + jmsg.getTagsString() + "\n" + body + "\n\n#" + mid + " http://juick.com/" + mid);
-
- xmsg.setTo(Jid.of("juick@s2s.juick.com"));
- webApp.getXmpp().send(xmsg);
-
- xmsg.setTo(Jid.of("juick@ws.juick.com"));
- webApp.getXmpp().send(xmsg);
-
- xmsg.setTo(Jid.of("juick@push.juick.com"));
- webApp.getXmpp().send(xmsg);
-
- xmsg.setTo(Jid.of("jubo@nologin.ru"));
- webApp.getXmpp().send(xmsg);
- } else {
- logger.warn("XMPP unavailable");
- }
-
- String hashtags = StringUtils.EMPTY;
- String tagscomma = StringUtils.EMPTY;
- for (int i = 0; i < jmsg.getTags().size(); i++) {
- if (i > 0) {
- hashtags += " ";
- tagscomma += ",";
- }
- hashtags += "#" + jmsg.getTags().get(i);
- tagscomma += jmsg.getTags().get(i);
- }
-
- String url = URLEncoder.encode("http://juick.com/" + mid, CharEncoding.UTF_8);
- String sharetwi = hashtags + " " + body;
- if (sharetwi.length() > 115) {
- sharetwi = sharetwi.substring(0, 114) + "…";
- }
- sharetwi += " http://juick.com/" + mid;
- String sharelj = URLEncoder.encode(body + "\n", CharEncoding.UTF_8) + url;
-
- modelMap.put("title", "Сообщение опубликовано");
- modelMap.put("url", url);
- modelMap.put("sharetwi", URLEncoder.encode(sharetwi, CharEncoding.UTF_8));
- modelMap.put("sharelj", sharelj);
- modelMap.put("mid", mid);
-
- return "views/posted";
- }
-
- @RequestMapping(value = "/comment", method = RequestMethod.POST)
- public String doComment(
- @RequestParam(defaultValue = "0") int mid,
- @RequestParam(required = false, defaultValue = "0") int rid,
- @RequestParam String body,
- @RequestParam(required = false) String img,
- @RequestParam(required = false) MultipartFile attach) throws IOException {
- com.juick.Message msg = messagesService.getMessage(mid);
- if (msg == null) {
- throw new HttpNotFoundException();
- }
-
- com.juick.Message reply = null;
- if (rid > 0) {
- reply = messagesService.getReply(mid, rid);
- if (reply == null) {
- throw new HttpNotFoundException();
- }
- }
-
- if (body.length() < 1 || body.length() > 4096) {
- throw new HttpBadRequestException();
- }
- body = body.replace("\r", StringUtils.EMPTY);
-
- User visitor = UserUtils.getCurrentUser();
-
- if ((msg.ReadOnly && msg.getUser().getUid() != visitor.getUid())
- || userService.isInBLAny(msg.getUser().getUid(), visitor.getUid())
- || (reply != null && userService.isInBLAny(reply.getUser().getUid(), visitor.getUid()))) {
- throw new HttpForbiddenException();
- }
-
- String attachmentFName = HttpUtils.receiveMultiPartFile(attach, env.getProperty("upload_tmp_dir",
- "/var/www/juick.com/i/tmp/"));
-
- if (StringUtils.isBlank(attachmentFName) && img != null && img.length() > 10) {
- try {
- URL imgUrl = new URL(img);
- attachmentFName = HttpUtils.downloadImage(imgUrl);
- } catch (Exception e) {
- logger.error("DOWNLOAD ERROR", e);
- throw new HttpBadRequestException();
- }
- }
-
- String attachmentType = StringUtils.isNotEmpty(attachmentFName) ? attachmentFName.substring(attachmentFName.length() - 3) : null;
- int ridnew = messagesService.createReply(mid, rid, visitor.getUid(), body, attachmentType);
- subscriptionService.subscribeMessage(mid, visitor.getUid());
-
- com.juick.Message jmsg = messagesService.getReply(mid, ridnew);
-
- Message xmsg = new Message();
- xmsg.setFrom(Jid.of("juick@juick.com"));
- xmsg.setType(Message.Type.CHAT);
- xmsg.setThread("juick-" + mid);
-
- xmsg.addExtension(jmsg);
-
- String quote = reply != null ? reply.getText() : msg.getText();
- if (quote.length() >= 50) {
- quote = quote.substring(0, 47) + "...";
- }
- xmsg.addExtension(new Nickname("@" + jmsg.getUser().getName()));
-
- if (StringUtils.isNotEmpty(attachmentFName)) {
- String fname = mid + "-" + ridnew + "." + attachmentType;
- String attachmentURL = "http://i.juick.com/photos-1024/" + fname;
-
- Path origName = Paths.get(webApp.imgDir, "p", fname);
- Files.move(Paths.get(webApp.tmpDir, attachmentFName), origName);
- BufferedImage originalImage = ImageIO.read(origName.toFile());
- ImageIO.write(Scalr.resize(originalImage, 1024),
- FilenameUtils.getExtension(origName.toString()),
- Paths.get(webApp.imgDir, "photos-1024", fname).toFile());
- ImageIO.write(Scalr.resize(originalImage, 512),
- FilenameUtils.getExtension(origName.toString()),
- Paths.get(webApp.imgDir, "photos-512", fname).toFile());
- ImageIO.write(Scalr.resize(originalImage, 160),
- FilenameUtils.getExtension(origName.toString()),
- Paths.get(webApp.imgDir, "ps", fname).toFile());
-
- body = attachmentURL + "\n" + body;
- try {
- xmsg.addExtension(new OobX(new URI(attachmentURL)));
- } catch (URISyntaxException e) {
- logger.warn("invalid uri: {}, exception {}", attachmentURL, e);
- }
- }
-
- if (webApp.getXmpp() != null) {
-
- xmsg.setBody("Reply by @" + jmsg.getUser().getName() + ":\n>" + quote + "\n" + body + "\n\n#" +
- mid + "/" + ridnew + " http://juick.com/" + mid + "#" + ridnew);
-
- xmsg.setTo(Jid.of("juick@s2s.juick.com"));
- webApp.getXmpp().send(xmsg);
-
- xmsg.setTo(Jid.of("juick@ws.juick.com"));
- webApp.getXmpp().send(xmsg);
-
- xmsg.setTo(Jid.of("juick@push.juick.com"));
- webApp.getXmpp().send(xmsg);
- } else {
- logger.warn("XMPP unavailable");
- }
-
- return "redirect:/" + msg.getUser().getName() + "/" + mid + "#" + ridnew;
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java
deleted file mode 100644
index 58668dc1..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java
+++ /dev/null
@@ -1,278 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.User;
-import com.juick.server.helpers.NotifyOpts;
-import com.juick.server.helpers.UserInfo;
-import com.juick.server.util.HttpBadRequestException;
-import com.juick.server.util.HttpForbiddenException;
-import com.juick.server.util.HttpUtils;
-import com.juick.service.*;
-import com.juick.util.UserUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.imgscalr.Scalr;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.env.Environment;
-import org.springframework.dao.EmptyResultDataAccessException;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.imageio.ImageIO;
-import javax.inject.Inject;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletResponse;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-/**
- * Created by aalexeev on 11/21/16.
- */
-@Controller
-public class SettingsController {
- private static final Logger logger = LoggerFactory.getLogger(SettingsController.class);
- @Inject
- UserService userService;
- @Inject
- TagService tagService;
- @Inject
- CrosspostService crosspostService;
- @Inject
- SubscriptionService subscriptionService;
- @Inject
- EmailService emailService;
- @Inject
- TelegramService telegramService;
- @Inject
- Environment env;
-
- @RequestMapping(value = "settings", method = RequestMethod.GET)
- public String showSettings(
- @RequestParam(required = false) String page,
- @RequestParam(required = false) String code,
- ModelMap context) {
- User visitor = UserUtils.getCurrentUser();
- if (visitor.getUid() == 0) {
- return "redirect:/login";
- }
- List pages = Arrays.asList("main", "password", "about", "auth-email", "privacy");
- if (StringUtils.isEmpty(page) || !pages.contains(page)) {
- page = "main";
- }
- context.put("title", "Настройки");
- context.put("tags", tagService.getPopularTags());
- context.put("auths", userService.getAuthCodes(visitor));
- context.put("eopts", userService.getEmailOpts(visitor));
- context.put("ehash", userService.getEmailHash(visitor));
- context.put("emails", userService.getEmails(visitor));
- context.put("jids", userService.getAllJIDs(visitor));
- List hours = IntStream.rangeClosed(0, 23).boxed()
- .map(i -> StringUtils.leftPad(String.format("%d", i), 2, "0")).collect(Collectors.toList());
- context.put("hours", hours);
- context.put("fbstatus", crosspostService.getFbCrossPostStatus(visitor.getUid()));
- context.put("twitter_name", crosspostService.getTwitterName(visitor.getUid()));
- context.put("telegram_name", crosspostService.getTelegramName(visitor.getUid()));
- context.put("notify_options", subscriptionService.getNotifyOptions(visitor));
- context.put("userinfo", userService.getUserInfo(visitor));
- if (page.equals("auth-email")) {
- String response = emailService.verifyAddressByCode(visitor.getUid(), code) ?
- "OK!" : "Sorry, code unknown.";
- context.put("result", response);
- }
- return String.format("views/settings_%s", page);
- }
- @RequestMapping(value = "/settings", method = RequestMethod.POST)
- protected String doPost(
- HttpServletResponse response,
- @RequestParam String page,
- @RequestParam(required = false) String password,
- @RequestParam(required = false) String jnotify,
- @RequestParam(required = false) String subscr_notify,
- @RequestParam(required = false) String recomm,
- @RequestParam(required = false) String fullname,
- @RequestParam(required = false) String country,
- @RequestParam(required = false) String url,
- @RequestParam(required = false) String descr,
- @RequestParam(required = false) MultipartFile avatar,
- @RequestParam(required = false) String account,
- @RequestParam(required = false) String time,
- ModelMap context) throws IOException {
- User visitor = UserUtils.getCurrentUser();
- if (visitor.getUid() == 0) {
- throw new HttpForbiddenException();
- }
- List pages = Arrays.asList("main", "password", "about", "email", "email-add", "email-del",
- "email-subscr", "auth-email", "privacy", "jid-del", "twitter-del", "telegram-del", "facebook-disable",
- "facebook-enable", "vk-del");
- if (StringUtils.isEmpty(page) || !pages.contains(page)) {
- throw new HttpBadRequestException();
- }
- String result = StringUtils.EMPTY;
- switch (page) {
- case "password":
- if (userService.updatePassword(visitor, password)) {
- result = "Password has been changed.
";
- String hash = userService.getHashByUID(visitor.getUid());
- Cookie c = new Cookie("hash", hash);
- c.setMaxAge(365 * 24 * 60 * 60);
- // FIXME: use spring-security
- response.addCookie(c);
- }
- break;
- case "main":
- NotifyOpts opts = new NotifyOpts();
- opts.setRepliesEnabled(StringUtils.isNotEmpty(jnotify));
- opts.setSubscriptionsEnabled(StringUtils.isNotEmpty(subscr_notify));
- opts.setRecommendationsEnabled(StringUtils.isNotEmpty(recomm));
- if (subscriptionService.setNotifyOptions(visitor, opts)) {
- result = "Notification options has been updated
";
- }
- break;
- case "about":
- UserInfo info = new UserInfo();
- info.setFullName(fullname);
- info.setCountry(country);
- info.setUrl(url);
- info.setDescription(descr);
- String imgPath = env.getProperty("img_path", "/var/www/juick.com/i/");
- String tmpDir = env.getProperty("upload_tmp_dir",
- "/var/www/juick.com/i/tmp/");
- String avatarTmpPath = HttpUtils.receiveMultiPartFile(avatar, tmpDir);
- if (StringUtils.isNotEmpty(avatarTmpPath)) {
- String originalExtension = FilenameUtils.getExtension(avatarTmpPath);
- String originalName = String.format("%s.%s", visitor.getUid(), originalExtension);
- String targetName = String.format("%s.png", visitor.getUid());
- Path ao = Paths.get(imgPath, "ao", originalName);
- Path a = Paths.get(imgPath, "a", targetName);
- Path as = Paths.get(imgPath, "as", targetName);
- Files.move(Paths.get(tmpDir, avatarTmpPath), ao, StandardCopyOption.REPLACE_EXISTING);
- BufferedImage originalImage = ImageIO.read(ao.toFile());
- ImageIO.write(Scalr.resize(originalImage, 96), "png", a.toFile());
- ImageIO.write(Scalr.resize(originalImage, 32), "png", as.toFile());
- }
- if (userService.updateUserInfo(visitor, info)) {
- result = String.format("Your info is updated.
Back to blog .
", visitor.getName());
- }
- break;
- case "jid-del":
- // FIXME: stop using ugnich-csv in parameters
-// String[] params = request.getParameter("delete").split(";", 2);
-// int res = -1;
-// if (params[0].equals("xmpp")) {
-// res = sql.update("DELETE FROM jids WHERE user_id=? AND jid=?", visitor.getUid(), params[1]);
-// } else if (params[0].equals("xmpp-unauth")) {
-// res = sql.update("DELETE FROM auth WHERE user_id=? AND protocol='xmpp' AND account=?", visitor.getUid(), params[1]);
-// }
-// if (res == 1) {
-// result = "Deleted. Back .
";
-// } else {
-// result = "Error
";
-// }
- break;
- case "email":
- String newHash = userService.updateSecretEmail(visitor);
- if (StringUtils.isNotEmpty(newHash)) {
- result = String.format("New secret email: %s@mail.juick.com
" +
- "Back .
", newHash);
- } else {
- throw new HttpBadRequestException();
- }
- break;
- case "email-add":
- try {
- emailService.verifyAddressByCode(visitor.getUid(), account);
- } catch (EmptyResultDataAccessException e) {
- String authCode = UserUtils.generateHash(8);
- if (emailService.addVerificationCode(visitor.getUid(), account, authCode)) {
- Session session = Session.getDefaultInstance(System.getProperties());
- try {
- MimeMessage message = new MimeMessage(session);
- message.setFrom(new InternetAddress("noreply@mail.juick.com"));
- message.addRecipient(Message.RecipientType.TO, new InternetAddress(account));
- message.setSubject("Juick authorization link");
- message.setText(String.format("Follow link to attach this email to Juick account:\n" +
- "http://juick.com/settings?page=auth-email&code=%s\n\n" +
- "If you don't know, what this mean - just ignore this mail.\n", authCode));
- Transport.send(message);
- result = "Authorization link has been sent to your email. Follow it to proceed.
" +
- "Back
";
-
- } catch (MessagingException ex) {
- logger.error("mail exception", ex);
- throw new HttpBadRequestException();
- }
- }
- }
- break;
- case "email-del":
- if (emailService.deleteEmail(visitor.getUid(), account)) {
- result = "Deleted. Back .
";
- } else {
- result = "An error occured while deleting.
";
- }
- break;
- case "email-subscr":
- if (emailService.setSubscriptionHour(visitor.getUid(), account, time)) {
- result = String.format("Saved! Will send to %s at %s:00 GMT ." +
- "
Back
", account, time);
- } else {
- result = "Disabled.
Back
";
- }
- break;
- case "twitter-del":
- crosspostService.deleteTwitterToken(visitor.getUid());
- // FIXME: use spring-security
-// for (Cookie cookie : request.getCookies()) {
-// if (cookie.getName().equals("request_token")) {
-// cookie.setMaxAge(0);
-// response.addCookie(cookie);
-// }
-// if (cookie.getName().equals("request_token_secret")) {
-// cookie.setMaxAge(0);
-// response.addCookie(cookie);
-// }
-// }
- result = "Back
";
- break;
- case "telegram-del":
- telegramService.deleteTelegramUser(visitor.getUid());
- result = "Back
";
- break;
- case "facebook-disable":
- crosspostService.disableFBCrosspost(visitor.getUid());
- result = "Back
";
- break;
- case "facebook-enable":
- crosspostService.enableFBCrosspost(visitor.getUid());
- result = "Back
";
- break;
- case "vk-del":
- crosspostService.deleteVKUser(visitor.getUid());
- result = "Back
";
- break;
- default:
- throw new HttpBadRequestException();
- }
- context.put("title", "Настройки");
- context.put("result", result);
- return "views/settings_result";
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/ShowMessageController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/ShowMessageController.java
deleted file mode 100644
index 93039a37..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/ShowMessageController.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.User;
-import com.juick.server.util.HttpNotFoundException;
-import com.juick.service.MessagesService;
-import com.juick.service.UserService;
-import com.juick.util.WebUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.inject.Inject;
-
-/**
- * Created by aalexeev on 11/21/16.
- */
-@Controller
-public class ShowMessageController {
- @Inject
- private UserService userService;
- @Inject
- private MessagesService messagesService;
-
-
- @RequestMapping("/{anything}")
- public String parseAnything(
- @PathVariable String anything,
- @RequestParam(required = false, defaultValue = "0") int before,
- Model model) {
-
- if (before == 0) {
- boolean isPostNumber = WebUtils.isPostNumber(anything);
- int messageId = isPostNumber ?
- NumberUtils.toInt(anything) : 0;
-
- if (isPostNumber && anything.equals(Integer.toString(messageId))) {
- if (messageId > 0) {
- com.juick.User author = messagesService.getMessageAuthor(messageId);
-
- if (author != null)
- return "redirect:/" + author.getName() + "/" + anything;
- }
-
- model.addAttribute("messageId", anything);
-
- throw new HttpNotFoundException();
- }
- }
- return showUserMessages(anything, null, before, model);
- }
-
- //@RequestMapping("/{userName}/tag/{tagName}")
- public String showUserMessagesByTag(
- @PathVariable String userName,
- @PathVariable String tagName,
- @RequestParam(required = false, defaultValue = "0") int before,
- Model model) {
-
- return showUserMessages(userName, tagName, before, model);
- }
-
- private String showUserMessages(
- String userName,
- String tagName,
- int before,
- Model model) {
- // Check validity of user name before quering from database
- if (WebUtils.isNotUserName(userName)) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- User user = userService.getUserByName(userName);
- if (user.getUid() == 0) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- return "views/index";
- }
-
- //@RequestMapping("/{userName}/friends")
- public String getFriends(
- @PathVariable String userName,
- Model model) {
- // Check validity of user name before quering from database
- if (WebUtils.isNotUserName(userName)) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- User user = userService.getUserByName(userName);
- if (user.getUid() == 0) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- return "views/index";
- }
-
- //@RequestMapping("/{userName}/readers")
- public String getReaders(
- @PathVariable String userName,
- Model model) {
- // Check validity of user name before quering from database
- if (WebUtils.isNotUserName(userName)) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- User user = userService.getUserByName(userName);
- if (user.getUid() == 0) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- return "views/index";
- }
-
- @RequestMapping("/{userName}/tags")
- public String geTags(
- @PathVariable String userName,
- Model model) {
- // Check validity of user name before quering from database
- if (WebUtils.isNotUserName(userName)) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- User user = userService.getUserByName(userName);
- if (user.getUid() == 0) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- return "views/index";
- }
-
- //@RequestMapping("/{userName}/{postNumber}")
- public String checkShowPost(
- @PathVariable String userName,
- @PathVariable String postNumber,
- Model model) {
- // Check validity of post number before quering from database
- if (WebUtils.isNotPostNumber(postNumber)) {
- model.addAttribute("messageId", postNumber);
- throw new HttpNotFoundException();
- }
-
- // Check validity of user name before quering from database
- if (WebUtils.isNotUserName(userName)) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
- User user = userService.getUserByName(userName);
- if (user.getUid() == 0) {
- model.addAttribute("userName", userName);
- throw new HttpNotFoundException();
- }
-
-
- return "views/thread";
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java
deleted file mode 100644
index 8c4ab46d..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.Message;
-import com.juick.User;
-import com.juick.server.util.HttpNotFoundException;
-import com.juick.service.AdsService;
-import com.juick.service.MessagesService;
-import com.juick.service.TagService;
-import com.juick.service.UserService;
-import com.juick.util.UserUtils;
-import com.juick.www.helpers.QueryString;
-import org.apache.commons.lang3.CharEncoding;
-import org.apache.commons.lang3.StringEscapeUtils;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.inject.Inject;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-/**
- * Created by aalexeev on 11/21/16.
- */
-@Controller
-public class TagController {
- @Inject
- private TagService tagService;
- @Inject
- private MessagesService messagesService;
- @Inject
- private AdsService adsService;
- @Inject
- private UserService userService;
-
-
- @RequestMapping("/tag/{tagName}")
- protected String doGet(
- @PathVariable("tagName") String paramTagStr,
- @RequestParam(value = "before", required = false, defaultValue = "0") Integer paramBefore,
- @QueryString Optional queryString,
- ModelMap model) throws UnsupportedEncodingException {
- User visitor = UserUtils.getCurrentUser();
-
- com.juick.Tag paramTag = tagService.getTag(paramTagStr, false);
- if (paramTag == null) {
- throw new HttpNotFoundException();
- } else if (paramTag.SynonymID > 0 && paramTag.TID != paramTag.SynonymID) {
- com.juick.Tag synTag = tagService.getTag(paramTag.SynonymID);
- String url = "/tag/" + URLEncoder.encode(synTag.getName(), CharEncoding.UTF_8);
- if (queryString.isPresent()) {
- url += "?" + queryString.get();
- }
- return "redirect:" + url;
- } else if (!paramTag.getName().equals(paramTagStr)) {
- String url = "/tag/" + URLEncoder.encode(paramTag.getName(), CharEncoding.UTF_8);
- if (queryString.isPresent()) {
- url += "?" + queryString.get();
- }
- return "redirect:" + url;
- }
-
- int visitor_uid = visitor != null ? visitor.getUid() : 0;
-
- String title = "*" + StringEscapeUtils.escapeHtml4(paramTag.getName());
- List mids = messagesService.getTag(paramTag.TID, visitor_uid, paramBefore, (visitor == null) ? 40 : 20);
- model.addAttribute("title", title);
- if (tagService.getTagNoIndex(paramTag.TID)) {
- model.addAttribute("headers", " ");
- } else if (paramBefore > 0 || mids.size() < 5) {
- model.addAttribute("headers", " ");
- }
- if (mids.size() > 0) {
- int vuid = visitor != null ? visitor.getUid() : 0;
- int ad_mid = adsService.getAdMid(vuid);
- if (ad_mid > 0 && mids.indexOf(ad_mid) == -1) {
- mids.add(0, ad_mid);
- adsService.logAdMid(vuid, ad_mid);
- } else {
- ad_mid = 0;
- }
- }
- List msgs = messagesService.getMessages(mids);
- List blUIDs = userService.checkBL(visitor_uid,
- msgs.stream().map(m -> m.getUser().getUid()).collect(Collectors.toList()));
- model.addAttribute("msgs",
- msgs.stream().map(msg -> {
- msg.ReadOnly |= blUIDs.contains(msg.getUser().getUid());
- if (msg.ReadOnly) {
- msg.ReadOnly = visitor.getUid() != msg.getUser().getUid();
- }
- return msg;
- }).collect(Collectors.toList())
- );
- if (mids.size() >= 20) {
- String nextpage = "/tag/" + URLEncoder.encode(paramTag.getName(), CharEncoding.UTF_8) + "?before=" + mids.get(mids.size() - 1);
- model.addAttribute("nextpage", nextpage);
- }
- model.addAttribute("tags", tagService.getPopularTags());
- return "views/index";
- }
-
- @RequestMapping("/tag")
- public String redirectToMain() {
- return "redirect:/";
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/ThreadController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/ThreadController.java
deleted file mode 100644
index f8693e13..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/ThreadController.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.juick.www.controllers;
-
-import com.juick.server.util.HttpForbiddenException;
-import com.juick.service.MessagesService;
-import com.juick.service.UserService;
-import com.juick.util.UserUtils;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.inject.Inject;
-
-/**
- * Created by vitalyster on 20.12.2016.
- */
-@Controller
-public class ThreadController {
- @Inject
- MessagesService messagesService;
- @Inject
- UserService userService;
-
- @RequestMapping(value = "/{userName}/{mid}")
- public String doGetThread(
- @PathVariable int mid,
- @RequestParam(required = false, value = "view") String paramView,
- ModelMap modelMap) {
- com.juick.User visitor = UserUtils.getCurrentUser();
-
- if (!messagesService.canViewThread(mid, visitor.getUid())) {
- throw new HttpForbiddenException();
- }
-
- com.juick.Message msg = messagesService.getMessage(mid);
-
- boolean listview = false;
- if (paramView != null) {
- if (paramView.equals("list")) {
- listview = true;
- if (visitor.getUid() > 0) {
- userService.setUserOptionInt(visitor.getUid(), "repliesview", 1);
- }
- } else if (paramView.equals("tree") && visitor.getUid() > 0) {
- userService.setUserOptionInt(visitor.getUid(), "repliesview", 0);
- }
- } else if (visitor.getUid() > 0 && userService.getUserOptionInt(visitor.getUid(), "repliesview", 0) == 1) {
- listview = true;
- }
-
- String title = msg.getUser().getName() + ": " + msg.getTagsString();
-
- modelMap.put("title", title);
- String headers = " ";
- if (paramView != null) {
- headers += " ";
- }
- if (msg.Hidden) {
- headers += " ";
- }
- modelMap.put("headers", headers);
- modelMap.put("msg", msg);
- modelMap.put("listview", listview);
- return "views/thread";
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/formatter/SpringDateFormatter.java b/juick-spring-www/src/main/java/com/juick/www/formatter/SpringDateFormatter.java
deleted file mode 100644
index bbc776c2..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/formatter/SpringDateFormatter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.juick.www.formatter;
-
-import com.juick.util.DateFormatter;
-import org.springframework.context.MessageSource;
-import org.springframework.format.Formatter;
-
-import javax.annotation.Resource;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Locale;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * Created by aalexeev on 11/22/16.
- */
-public class SpringDateFormatter implements Formatter {
- @Resource
- private MessageSource messageSource;
- private ConcurrentMap formattersMap =
- new ConcurrentHashMap<>(4, 0.75f, 2); // MAX 4 languages and 4/2=2 threads for write
-
-
- @Override
- public Date parse(final String text, final Locale locale) throws ParseException {
- DateFormatter formatter = formattersMap.getOrDefault(
- locale, createFormatter(locale));
-
- return formatter.parse(text);
- }
-
- @Override
- public String print(final Date object, final Locale locale) {
- DateFormatter formatter = formattersMap.getOrDefault(
- locale, createFormatter(locale));
- return formatter.format(object);
- }
-
- private DateFormatter createFormatter(final Locale locale) {
- String pattern = messageSource.getMessage("date.format", null, locale);
-
- return new DateFormatter(pattern);
- }
-}
diff --git a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java
deleted file mode 100644
index 0eb6c76f..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.juick.www.helpers;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Created by vt on 22/03/16.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.PARAMETER)
-public @interface QueryString {
-}
\ No newline at end of file
diff --git a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java
deleted file mode 100644
index 812c4497..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.juick.www.helpers;
-
-import org.springframework.core.MethodParameter;
-import org.springframework.web.bind.support.WebDataBinderFactory;
-import org.springframework.web.context.request.NativeWebRequest;
-import org.springframework.web.method.support.HandlerMethodArgumentResolver;
-import org.springframework.web.method.support.ModelAndViewContainer;
-
-import javax.servlet.http.HttpServletRequest;
-import java.lang.annotation.Annotation;
-import java.util.Optional;
-
-public class QueryStringResolver implements HandlerMethodArgumentResolver {
- @Override
- public boolean supportsParameter(MethodParameter parameter) {
- Annotation[] parameterAnnotations = parameter.getParameterAnnotations();
- for (Annotation parameterAnnotation : parameterAnnotations) {
- if (QueryString.class.isInstance(parameterAnnotation)) {
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
- HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
- return Optional.ofNullable(request.getQueryString());
- }
-}
\ No newline at end of file
diff --git a/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java b/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java
deleted file mode 100644
index a444ec4d..00000000
--- a/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.juick.www.util;
-
-/**
- * Created by vitalyster on 09.12.2016.
- */
-public class EncodeUtils {
- public static String encodeSphinx(String str) {
- return str.replaceAll("@", "\\\\@");
- }
-}
diff --git a/juick-spring-www/src/main/resources/errors.properties b/juick-spring-www/src/main/resources/errors.properties
deleted file mode 100644
index 7ec8fbfd..00000000
--- a/juick-spring-www/src/main/resources/errors.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-error.title = Error page
-
-error.login=Wrong user or password
\ No newline at end of file
diff --git a/juick-spring-www/src/main/resources/errors_ru.properties b/juick-spring-www/src/main/resources/errors_ru.properties
deleted file mode 100644
index ca13b926..00000000
--- a/juick-spring-www/src/main/resources/errors_ru.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-error.title = Произошла ошибка
-
-error.login=Произошла ошибка, проверьте имя пользователя и пароль
\ No newline at end of file
diff --git a/juick-spring-www/src/main/resources/help b/juick-spring-www/src/main/resources/help
deleted file mode 160000
index 491a2f16..00000000
--- a/juick-spring-www/src/main/resources/help
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 491a2f167939a81fc6da354c67a1efdb7d60845a
diff --git a/juick-spring-www/src/main/resources/messages.properties b/juick-spring-www/src/main/resources/messages.properties
deleted file mode 100644
index 0d98f7d0..00000000
--- a/juick-spring-www/src/main/resources/messages.properties
+++ /dev/null
@@ -1,51 +0,0 @@
-date.format=MM/dd/yyyy
-
-link.settings=Settings
-link.returnToMain=Back to Home Page
-link.contacts=Contacts
-link.help=Help
-link.adv=Advertisement
-
-link.popular=Popular
-link.allMessages=All messages
-link.withPhotos=Photos
-link.my=My feed
-link.privateMessages=PM
-link.discuss=Discuss
-link.recommended=Recommended
-link.postMessage=Post
-link.logout=Logout
-
-link.settings.main=Main
-link.settings.password=Password
-link.settings.about=About
-
-label.sponsor=Sponsor
-label.sponsors=Sponsors
-label.search=Search
-label.register=Register
-label.username=User name
-label.password=Password
-
-postForm.newMessage=New message
-postForm.imageLink=Link to image (JPG/PNG, up to 10 MB)
-postForm.orImageUpload=or Upload
-postForm.tags=Tags (space separated)
-
-button.send=Send
-
-message.loginForSending=Login for post messages and comments
-message.recommend=Recommend
-message.sendLoginToXmpp=Send LOGIN to juick@juick.com
-
-question.areRegistered=Are you registered?
-
-title.help=Help
-title.loginOrSignup=Juick - Log In or Sign Up
-title.index.anonym=Juick microblogs: popular posts
-title.index.user=Popular
-message.comment=Comment
-postForm.writeReply=Write a reply
-messages.next=Next
-error.pageNotFound=Page not found
-error.pageNotFound.description=Probably, user deleted this post, or this page never existed.
\ No newline at end of file
diff --git a/juick-spring-www/src/main/resources/messages_ru.properties b/juick-spring-www/src/main/resources/messages_ru.properties
deleted file mode 100644
index 20d53c8f..00000000
--- a/juick-spring-www/src/main/resources/messages_ru.properties
+++ /dev/null
@@ -1,51 +0,0 @@
-date.format=dd.MM.yyyy
-
-link.settings = Настройки
-link.returnToMain =Вернуться на главную
-link.contacts=Контакты
-link.help=Помощь
-link.adv=Реклама
-
-link.popular=Популярные
-link.allMessages=Все сообщения
-link.withPhotos=Фотографии
-link.my=Моя лента
-link.privateMessages=Приватные
-link.discuss=Обсуждения
-link.recommended=Рекомендации
-link.postMessage=Написать сообщение
-link.logout=Выйти
-
-link.settings.main=Главная
-link.settings.password=Пароль
-link.settings.about=О пользователе
-
-label.sponsor=Спонсор
-label.sponsors=Спонсоры
-label.search=Поиск
-label.register=Зарегистрироваться
-label.username=Имя пользователя
-label.password=Пароль
-
-postForm.newMessage=Новое сообщение
-postForm.imageLink=Ссылка на изображение (JPG/PNG, до 10Мб)
-postForm.orImageUpload=или загрузить
-postForm.tags=Теги (через пробел)
-
-button.send=Отправить
-
-message.loginForSending=Чтобы добавлять сообщения и комментарии, представьтесь
-message.recommend=Рекомендовать
-message.sendLoginToXmpp=Отправьте LOGIN на juick@juick.com
-
-question.areRegistered=Уже зарегистрированы?
-
-title.help=Справка
-title.loginOrSignup=Juick - Войдите в систему или зарегистрируйтесь
-title.index.anonym=Микроблоги Juick: популярные записи
-title.index.user=Популярные
-message.comment=Комментировать
-postForm.writeReply=Написать ответ
-messages.next=Читать далее
-error.pageNotFound=Страница не найдена
-error.pageNotFound.description=Сожалеем, но страницу с этим адресом удалил её автор, либо её никогда не существовало.
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/mainLayout.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/mainLayout.html
deleted file mode 100644
index c07886b6..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/mainLayout.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- Juick.com
-
-
-
-
- Navigation block
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/footer.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/footer.html
deleted file mode 100644
index 1d565db3..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/footer.html
+++ /dev/null
@@ -1,37 +0,0 @@
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/navigation.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/navigation.html
deleted file mode 100644
index 3b2d3bff..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/layout/partial/navigation.html
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [(#{message.loginForSending(@{/login})})]
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/error.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/error.html
deleted file mode 100644
index 9d763feb..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/error.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- Page not found
-
-
-
-
- Page not found
- Probably, user deleted this post, or this page never existed.
-
-
-Main side column
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/help.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/help.html
deleted file mode 100644
index d935b9d4..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/help.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- Help title
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/index.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/index.html
deleted file mode 100644
index 24aa9472..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/index.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- Page title
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/login.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/login.html
deleted file mode 100644
index 2736ca53..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/login.html
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
-
-
-
-
-
- Juick
-
-
-
-
-
-
-
-
-
-
-
-
Зарегистрироваться:
-
-
-
XMPP
-
[(#{message.sendLoginToXmpp})]
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_messages.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_messages.html
deleted file mode 100644
index 5d808f98..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_messages.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
-
- Lorem ipsum
-
-
-
- Recommend
- Recommend
-
- Comment
-
-
-
- +
- -
- x
-
-
-
-
- 10
-
- 42
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_paginator.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_paginator.html
deleted file mode 100644
index aa1e0466..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_paginator.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Next →
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_postform.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_postform.html
deleted file mode 100644
index a9ed9f5d..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/blog_postform.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/homecolumn.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/homecolumn.html
deleted file mode 100644
index 46c146f2..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/homecolumn.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
Tags
- конструктор сайтов
-
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/settings_tabs.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/settings_tabs.html
deleted file mode 100644
index 253511b5..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/settings_tabs.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/tags.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/tags.html
deleted file mode 100644
index f4822b4a..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/tags.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Tag
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/thread_message.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/thread_message.html
deleted file mode 100644
index 159eebf5..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/partial/thread_message.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
01.01.1970
-
-
-
- Lorem ipsum
-
-
-
-
-
-
-
Recommended(1): @ugnich
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_inbox.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_inbox.html
deleted file mode 100644
index 80464e65..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_inbox.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
- Inbox title
-
-
-
-
-
-
-
-
-
-
Lorem ipsum
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_sent.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_sent.html
deleted file mode 100644
index 8978ff67..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/pm_sent.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
- Settings title
-
-
-
-
-
-
-
-
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/posted.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/posted.html
deleted file mode 100644
index 25432c2c..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/posted.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
- Page title
-
-
-
-
- Сообщение опубликовано
- Поделитесь своим новым постом в социальных сетях:
-
- Отправить в Twitter
-
-
- Отправить в LiveJournal
-
-
- Отправить в ВКонтакте
-
-
- Отправить в Facebook
-
- Ссылка на сообщение:
- http://juick.com/12345
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_about.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_about.html
deleted file mode 100644
index 6f8f61dd..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_about.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
- Settings title
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_auth-email.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_auth-email.html
deleted file mode 100644
index 715d474d..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_auth-email.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- Settings title
-
-
-
-
-
- Authentication result
Settings .
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_main.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_main.html
deleted file mode 100644
index 2db977f4..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_main.html
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
- Settings title
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_password.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_password.html
deleted file mode 100644
index c76363e5..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_password.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
- Settings title
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_result.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_result.html
deleted file mode 100644
index 20cb097d..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/settings_result.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- Settings title
-
-
-
-
- Settings update status
-
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/thread.html b/juick-spring-www/src/main/webapp/WEB-INF/templates/views/thread.html
deleted file mode 100644
index ac7da17f..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/templates/views/thread.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- Page title
-
-
-
-
-
-
-
diff --git a/juick-spring-www/src/main/webapp/WEB-INF/web.xml b/juick-spring-www/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index a57cceb9..00000000
--- a/juick-spring-www/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/juick-spring-www/src/main/webapp/favicon.ico b/juick-spring-www/src/main/webapp/favicon.ico
deleted file mode 100644
index bc7161e2..00000000
Binary files a/juick-spring-www/src/main/webapp/favicon.ico and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/favicon.png b/juick-spring-www/src/main/webapp/favicon.png
deleted file mode 100644
index bc7161e2..00000000
Binary files a/juick-spring-www/src/main/webapp/favicon.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/logo.png b/juick-spring-www/src/main/webapp/logo.png
deleted file mode 100644
index 933f6099..00000000
Binary files a/juick-spring-www/src/main/webapp/logo.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/dialog-close.png b/juick-spring-www/src/main/webapp/static/dialog-close.png
deleted file mode 100644
index 9c4275cc..00000000
Binary files a/juick-spring-www/src/main/webapp/static/dialog-close.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/facebook.png b/juick-spring-www/src/main/webapp/static/facebook.png
deleted file mode 100644
index 5d111590..00000000
Binary files a/juick-spring-www/src/main/webapp/static/facebook.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/favicon.png b/juick-spring-www/src/main/webapp/static/favicon.png
deleted file mode 100644
index bc7161e2..00000000
Binary files a/juick-spring-www/src/main/webapp/static/favicon.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/icon-fb.png b/juick-spring-www/src/main/webapp/static/icon-fb.png
deleted file mode 100644
index 5d111590..00000000
Binary files a/juick-spring-www/src/main/webapp/static/icon-fb.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/icon-gplus.png b/juick-spring-www/src/main/webapp/static/icon-gplus.png
deleted file mode 100644
index d83d2520..00000000
Binary files a/juick-spring-www/src/main/webapp/static/icon-gplus.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/icon-lj.png b/juick-spring-www/src/main/webapp/static/icon-lj.png
deleted file mode 100644
index 9cde1e02..00000000
Binary files a/juick-spring-www/src/main/webapp/static/icon-lj.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/icon-twitter.png b/juick-spring-www/src/main/webapp/static/icon-twitter.png
deleted file mode 100644
index 259078f7..00000000
Binary files a/juick-spring-www/src/main/webapp/static/icon-twitter.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/icon-vk.png b/juick-spring-www/src/main/webapp/static/icon-vk.png
deleted file mode 100644
index 80b6920b..00000000
Binary files a/juick-spring-www/src/main/webapp/static/icon-vk.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/logo.png b/juick-spring-www/src/main/webapp/static/logo.png
deleted file mode 100644
index 4e0f6d56..00000000
Binary files a/juick-spring-www/src/main/webapp/static/logo.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/logo@2x.png b/juick-spring-www/src/main/webapp/static/logo@2x.png
deleted file mode 100644
index 6febeaf9..00000000
Binary files a/juick-spring-www/src/main/webapp/static/logo@2x.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/menu.png b/juick-spring-www/src/main/webapp/static/menu.png
deleted file mode 100644
index 4cac2563..00000000
Binary files a/juick-spring-www/src/main/webapp/static/menu.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/photo-attachment-active.png b/juick-spring-www/src/main/webapp/static/photo-attachment-active.png
deleted file mode 100644
index ecbf10e8..00000000
Binary files a/juick-spring-www/src/main/webapp/static/photo-attachment-active.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/photo-attachment.png b/juick-spring-www/src/main/webapp/static/photo-attachment.png
deleted file mode 100644
index 07d48517..00000000
Binary files a/juick-spring-www/src/main/webapp/static/photo-attachment.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/scripts.js b/juick-spring-www/src/main/webapp/static/scripts.js
deleted file mode 100644
index d368cacd..00000000
--- a/juick-spring-www/src/main/webapp/static/scripts.js
+++ /dev/null
@@ -1,753 +0,0 @@
-var autosize = require('autosize');
-require('whatwg-fetch');
-require('element-closest');
-require('classlist.js');
-if (!('remove' in Element.prototype)) { // Firefox <23
- Element.prototype.remove = function() {
- if (this.parentNode) {
- this.parentNode.removeChild(this);
- }
- };
-}
-
-NodeList.prototype.forEach = Array.prototype.forEach;
-HTMLCollection.prototype.forEach = Array.prototype.forEach;
-
-var ws,
- pageTitle;
-
-function initWS() {
- var content = document.getElementById('content');
- if (!content) { return }
- var pageMID = content.getAttribute('data-mid');
- if (!pageMID) { return }
-
- var url = (window.location.protocol === 'https:' ? 'wss' : 'ws') + ':'
- + (typeof juickDebug !== 'undefined' ?
- '//ws.juick.com/_replies' : ('//ws.juick.com/' + pageMID)),
- hash = document.getElementById('body').getAttribute('data-hash');
-
- if (hash) {
- url += '?hash=' + hash;
- }
-
- ws = new WebSocket(url);
- ws.onopen = function () {
- console.log('online');
- if (!document.querySelector('#wsthread')) {
- var d = document.createElement('div');
- d.id = 'wsthread';
- d.addEventListener('click', nextReply);
- document.querySelector('body').appendChild(d);
- pageTitle = document.title;
- }
- };
- ws.onclose = function () {
- console.log('offline');
- ws = false;
- setTimeout(function () {
- initWS();
- }, 2000);
- };
- ws.onmessage = function (msg) {
- if (msg.data == ' ') {
- ws.send(' ');
- } else {
- try {
- var jsonMsg = JSON.parse(msg.data);
- console.log('data: ' + msg.data);
- wsIncomingReply(jsonMsg);
- } catch (err) {
- console.log(err);
- }
- }
- };
- setInterval(wsSendKeepAlive, 90000);
-}
-
-function wsSendKeepAlive() {
- if (ws) {
- ws.send(' ');
- }
-}
-
-function wsShutdown() {
- if (ws) {
- ws.onclose = function () { };
- ws.close();
- }
-}
-
-function isTreeMode() {
- // relies on UserThread.printReplies implementation TODO keep this in cookie or something
- return document.querySelector('.title2-right > a').href.match(/\?view=(\w+)/)[1] == 'list';
-}
-
-function wsIncomingReply(msg) {
- var li = document.createElement('li');
- li.setAttribute('class', 'msg reply-new');
- li.setAttribute('id', msg.rid);
- li.addEventListener('click', newReply);
- li.addEventListener('mouseover', newReply);
- var msgAvatar = document.createElement('div');
- msgAvatar.setAttribute('class', 'msg-avatar');
- var msgAvatarLink = document.createElement('a');
- msgAvatarLink.setAttribute('href', '/' + msg.user.uname + '/');
- var msgAvatarImg = document.createElement('img');
- msgAvatarImg.setAttribute('src', '//i.juick.com/a/' + msg.user.uid + '.png');
- msgAvatarLink.appendChild(msgAvatarImg);
- msgAvatar.appendChild(msgAvatarLink);
-
- var msgCont = document.createElement('div');
- msgCont.setAttribute('class', 'msg-cont');
- var msgMenu = document.createElement('div');
- msgMenu.setAttribute('class', 'msg-menu');
- msgCont.appendChild(msgMenu);
- var msgMenuLink = document.createElement('a');
- msgMenuLink.setAttribute('href', '#');
- msgMenuLink.addEventListener('click', function (e) {
- showMessageLinksDialog(msg.mid, msg.rid);
- e.preventDefault();
- });
- msgMenu.appendChild(msgMenuLink);
- var msgHeader = document.createElement('div');
- msgHeader.setAttribute('class', 'msg-header');
- var msgHeaderLink = document.createElement('a');
- msgHeaderLink.setAttribute('href', '/' + msg.user.uname + '/');
- msgHeaderLink.textContent = '@' + msg.user.uname + ':';
- msgHeader.appendChild(msgHeaderLink);
- var msgTimestamp = document.createElement('div');
- msgTimestamp.setAttribute('class', 'msg-ts');
- var msgTimestampLink = document.createElement('a');
- msgTimestampLink.setAttribute('href', '/' + msg.mid + '#' + msg.rid);
- msgTimestampLink.setAttribute('title', msg.timestamp + ' GMT');
- msgTimestampLink.textContent = msg.timestamp;
- msgTimestamp.appendChild(msgTimestampLink);
- var msgTxt = document.createElement('div');
- msgTxt.setAttribute('class', 'msg-txt');
- var msgLinks = document.createElement('div');
- msgLinks.setAttribute('class', 'msg-links');
- var msgNum = '/' + msg.rid;
- if (msg.replyto > 0) {
- msgNum += ' в ответ на /' + msg.replyto + ' ';
- }
- msgLinks.innerHTML = msgNum + ' · ';
- var msgLinksLink = document.createElement('a');
- msgLinksLink.setAttribute('href', '#');
- msgLinksLink.textContent = 'Ответить';
- msgLinksLink.addEventListener('click', function (e) {
- showCommentForm(msg.mid, msg.rid);
- e.preventDefault();
- });
- msgLinks.appendChild(msgLinksLink);
- var msgComment = document.createElement('div');
- msgComment.setAttribute('class', 'msg-comment');
- msgComment.style.display = 'none';
- msgHeader.appendChild(msgAvatar);
- msgHeader.appendChild(msgMenu);
- msgHeader.appendChild(msgTimestamp);
- msgCont.appendChild(msgHeader);
- msgCont.appendChild(msgTxt);
- msgCont.appendChild(msgLinks);
- msgCont.appendChild(msgComment);
- li.appendChild(msgCont);
-
- li.querySelector('.msg-txt').textContent = msg.body;
-
- if (isTreeMode() && (msg.replyto > 0)) {
- var p = document.getElementById(msg.replyto);
- var m = parseInt(p.style.marginLeft) + 20;
- while (p.nextElementSibling && (parseInt(p.nextElementSibling.style.marginLeft) >= m)) p = p.nextElementSibling;
- li.style.marginLeft = m + 'px';
- p.parentNode.insertBefore(li, p.nextSibling);
- } else {
- document.getElementById('replies').appendChild(li);
- }
-
- updateRepliesCounter();
-}
-
-function newReply(e) {
- var li = e.target;
- li.classList.remove('reply-new');
- li.removeEventListener('click', e);
- li.removeEventListener('mouseover', e);
- updateRepliesCounter();
-}
-
-function nextReply() {
- var li = document.querySelector('#replies>li.reply-new');
- if (li) {
- li.classList.remove('reply-new');
- li.removeEventListener('click', this);
- li.childNodes[0].scrollIntoView();
- updateRepliesCounter();
- }
-}
-
-function updateRepliesCounter() {
- var replies = document.querySelectorAll('#replies>li.reply-new').length;
- var wsthread = document.getElementById('wsthread');
- if (replies) {
- wsthread.textContent = replies;
- wsthread.style.display = 'block';
- document.title = '[' + replies + '] ' + pageTitle;
- } else {
- wsthread.style.display = 'none';
- document.title = pageTitle;
- }
-}
-
-/******************************************************************************/
-/******************************************************************************/
-/******************************************************************************/
-
-function postformListener(formEl, ev) {
- var form = formEl.closest('form');
- if (ev.ctrlKey && (ev.keyCode == 10 || ev.keyCode == 13)) {
- if (!form.onsubmit || form.onsubmit()) {
- form.submit();
- }
- }
-}
-
-function unfoldPostForm() {
- if (window.location.pathname === '/' && window.location.hash === '#post') {
- document.querySelector('#newmessage>div').style.display = 'block';
- var ta = document.querySelector('#newmessage textarea');
- ta.style.minHeight = '70px';
- ta.focus();
- }
-}
-
-function newMessage() {
- if (document.querySelector('#newmessage textarea').value.length == 0) {
- openDialog('Пожалуйста, введите текст сообщения
');
- return false;
- }
- return true;
-}
-
-function showMoreReplies(el, id) {
- var foldedReplies = el.closest('li').querySelector('.msg-comments');
- if (!foldedReplies) { return }
- foldedReplies.style.display = 'none';
-
- var replies = document.querySelectorAll('#replies>li'),
- flagshow = 0,
- i = 0;
- for (; i < replies.length; i += 1) {
- if (flagshow == 1) {
- if (replies[i].style.display == 'none') {
- replies[i].style.display = 'block';
- } else {
- break;
- }
- }
- if (replies[i].id == id) {
- flagshow = 1;
- }
- }
- return false;
-}
-
-function replyForm(mid, rid) {
- var form = document.createElement('form');
- form.setAttribute('action', '/comment');
- form.setAttribute('method', 'POST');
- form.setAttribute('enctype', 'multipart/form-data');
- var input = document.createElement('input');
- input.setAttribute('type', 'hidden');
- input.setAttribute('name', 'mid');
- input.setAttribute('value', mid);
- form.appendChild(input);
- if (rid) {
- var inputRid = document.createElement('input');
- inputRid.setAttribute('type', 'hidden');
- inputRid.setAttribute('name', 'rid');
- inputRid.setAttribute('value', rid);
- form.appendChild(inputRid);
- }
- return form;
-}
-
-function taWrapper() {
- var txtarea = document.createElement('textarea');
- txtarea.setAttribute('name', 'body');
- txtarea.setAttribute('rows', 1);
- txtarea.setAttribute('class', 'reply narrow');
- txtarea.setAttribute('placeholder', 'Написать комментарий...');
- var txtKeypress = function (e) {
- postformListener(e.target, e);
- };
- txtarea.addEventListener('keypress', txtKeypress);
- var wrapper = document.createElement('div');
- wrapper.setAttribute('class', 'ta-wrapper');
- wrapper.appendChild(txtarea);
- var att = document.createElement('div');
- att.setAttribute('class', 'attach-photo');
- att.addEventListener('click', function () {
- attachCommentPhoto(this);
- });
- wrapper.appendChild(att);
- return wrapper;
-}
-
-function showCommentForm(mid, rid) {
- var reply = document.getElementById(rid);
- if (reply && !reply.querySelector('textarea')) {
- var c = reply.querySelector('div.msg-cont > .msg-comment'),
- newNode = c.cloneNode(true),
- form = replyForm(mid, rid);
- form.appendChild(newNode);
- newNode.appendChild(taWrapper());
- var subm = document.createElement('input');
- subm.setAttribute('type', 'submit');
- subm.setAttribute('value', 'OK');
- newNode.appendChild(subm);
- c.parentNode.insertBefore(form, c);
- c.remove();
- }
-
- var commentBlock = reply.querySelector('div.msg-cont > form > div.msg-comment');
- commentBlock.style.display = 'block';
- var commentText = commentBlock.querySelector('textarea');
- if (commentText) {
- autosize(commentText);
- commentText.focus();
- }
-}
-
-function showCommentFooter(e, mid, rid) {
- var a = e.closest('article');
- if (!a.querySelector('footer.comm')) {
- var form = replyForm(mid, rid),
- footer = document.createElement('footer');
- footer.setAttribute('class', 'comm');
- footer.appendChild(taWrapper());
- var subm = document.createElement('input');
- subm.setAttribute('type', 'submit');
- subm.setAttribute('value', 'OK');
- footer.appendChild(subm);
- form.appendChild(footer);
- a.appendChild(form);
- autosize(a.querySelector('textarea'));
- }
- a.querySelector('textarea').focus();
-}
-
-function attachInput() {
- var inp = document.createElement('input');
- inp.setAttribute('type', 'file');
- inp.setAttribute('name', 'attach');
- inp.setAttribute('accept', 'image/jpeg,image/png');
- inp.style.visibility = 'hidden';
- return inp;
-}
-
-function attachCommentPhoto(div) {
- if (div.children.length === 0) {
- var inp = attachInput();
- inp.addEventListener('change', function () {
- inp.parentNode.classList.add('attach-photo-active');
- });
- inp.click();
- div.appendChild(inp);
- } else {
- div.innerHTML = null;
- div.classList.add('attach-photo');
- }
-}
-
-function attachMessagePhoto(div) {
- var f = div.closest('form'),
- finput = f.querySelector('input[type="file"]');
- if (!finput) {
- var inp = attachInput();
- inp.style.float = 'left';
- inp.style.width = 0;
- inp.style.height = 0;
- inp.addEventListener('change', function () {
- div.textContent = 'загрузить (✓)';
- });
- f.appendChild(inp);
- inp.click();
- } else {
- finput.remove();
- div.textContent = 'загрузить';
- }
-}
-
-function unfoldReply() {
- var anchor = window.location.hash.substring(1);
- if ((0 + anchor) > 0) {
- var el = document.getElementById(anchor);
- if (!el) { return }
- while (el.style.display === 'none') {
- el = el.previousElementSibling;
- }
- showMoreReplies(el, el.getAttribute('id'));
- window.location.replace(window.location.hash);
- }
-}
-
-function showMessageLinksDialog(mid, rid) {
- var hlink = window.location.protocol + '//juick.com/' + mid,
- mlink = '#' + mid;
- if (rid > 0) {
- hlink += '#' + rid;
- mlink += '/' + rid;
- }
- var hlinkenc = encodeURIComponent(hlink),
- html = 'Ссылка на сообщение:'
- + '
' + hlink + '
'
- + 'Номер сообщения:'
- + '
' + mlink + '
'
- + 'Поделиться:
'
- + ' '
- + ' '
- + ' '
- + ' '
- + ' ';
-
- openDialog(html);
-}
-
-function showPhotoDialog(fname) {
- var width = window.innerWidth,
- height = window.innerHeight * 0.9;
- if (width < 640) {
- return true;
- } else if (width < 1280) {
- openDialog(' ');
- document.querySelector('#dialogw img').style.maxHeight = height + 'px';
- return false;
- } else {
- openDialog(' ');
- document.querySelector('#dialogw img').style.maxHeight = height + 'px';
- return false;
- }
-}
-
-function openDialog(html) {
- var dhtml = '';
- document.querySelector('body').insertAdjacentHTML('afterbegin', dhtml);
- document.querySelector('#dialogb').addEventListener('click', closeDialog);
- document.querySelector('#dialogc').addEventListener('click', closeDialog);
-}
-
-function closeDialog() {
- document.querySelector('#dialogb').remove();
- document.querySelector('#dialogt').remove();
-}
-
-function openSocialWindow(a) {
- var w = window.open(a.href, 'juickshare', 'width=640,height=400');
- if (window.focus) w.focus();
- return false;
-}
-
-function checkUsername() {
- var uname = document.querySelector('#username').textContent,
- style = document.querySelector('#username').style;
- fetch('//api.juick.com/users?uname=' + uname)
- .then(function () {
- style.background = '#FFCCCC';
- })
- .catch(function () {
- style.background = '#CCFFCC';
- });
-}
-
-/******************************************************************************/
-
-function openDialogLogin() {
- var html = '';
- openDialog(html);
- return false;
-}
-
-/******************************************************************************/
-
-function resultMessage(str) {
- var result = document.createElement('p');
- result.textContent = str;
- return result;
-}
-
-function likeMessage(e, mid) {
- if (confirm('Are you sure?')) {
- fetch('//juick.com/like?mid=' + mid, {
- method: 'POST',
- credentials: 'same-origin'
- })
- .then(function (response) {
- if (response.ok) {
- e.closest('article').appendChild(resultMessage('OK!'));
- }
- })
- .catch(function () {
- e.closest('article').appendChild(resultMessage('Ошибка'));
- });
- }
- return false;
-}
-
-/******************************************************************************/
-
-function setPopular(e, mid, popular) {
- fetch('//api.juick.com/messages/set_popular?mid=' + mid
- + '&popular=' + popular
- + '&hash=' + document.getElementById('body').getAttribute('data-hash'), {
- credentials: 'same-origin'
- })
- .then(function () {
- e.closest('article').append(resultMessage('OK!'));
- });
- return false;
-}
-
-function setPrivacy(e, mid) {
- fetch('//api.juick.com/messages/set_privacy?mid=' + mid
- + '&hash=' + document.getElementById('body').getAttribute('data-hash'), {
- credentials: 'same-origin'
- })
- .then(function () {
- e.closest('article').append(resultMessage('OK!'));
- });
- return false;
-}
-/******************************************************************************/
-
-Element.prototype.selectText = function () {
- var d = document;
- if (d.body.createTextRange) {
- var range = d.body.createTextRange();
- range.moveToElementText(this);
- range.select();
- } else if (window.getSelection) {
- var selection = window.getSelection();
- var rangeSel = d.createRange();
- rangeSel.selectNodeContents(this);
- selection.removeAllRanges();
- selection.addRange(rangeSel);
- }
-};
-
-function ready(fn) {
- if (document.readyState != 'loading') {
- fn();
- } else {
- document.addEventListener('DOMContentLoaded', fn);
- }
-}
-
-ready(function () {
- autosize(document.querySelectorAll('textarea'));
-
- var insertButtons = function (e) {
- var textarea = e.target;
- textarea.classList.add('narrow');
- var att = document.createElement('div');
- att.classList.add('attach-photo');
- att.addEventListener('click', function(e) {
- attachCommentPhoto(e.target);
- });
- textarea.parentNode.insertBefore(att, textarea.nextSibling);
- textarea.parentNode.insertAdjacentHTML('afterend', ' ');
- textarea.removeEventListener('click', insertButtons);
- e.preventDefault();
- };
- document.querySelectorAll('textarea.reply').forEach(function(e) {
- e.addEventListener('click', insertButtons);
- e.addEventListener('keypress', function(e) {
- postformListener(e.target, e);
- });
- });
-
- var insertPMButtons = function (e) {
- e.target.classList.add('narrowpm');
- e.target.parentNode.insertAdjacentHTML('afterend', ' ');
- e.target.removeEventListener('click', insertPMButtons);
- e.preventDefault();
- };
- document.querySelectorAll('textarea.replypm').forEach(function(e) {
- e.addEventListener('click', insertPMButtons);
- });
-
- var content = document.getElementById('content');
- if (content) {
- var pageMID = content.getAttribute('data-mid');
- if (pageMID > 0) {
- document.querySelectorAll('.msg-comments').forEach(function(e) {
- e.addEventListener('click', function (e) {
- var rid = e.target.closest('li').id;
- showMoreReplies(e.target, rid);
- e.preventDefault();
- });
- });
- document.querySelectorAll('.a-thread-comment').forEach(function(e) {
- e.addEventListener('click', function (e) {
- var rid = e.target.closest('li').id;
- showCommentForm(pageMID, rid);
- e.preventDefault();
- });
- });
- }
- }
-
- document.querySelectorAll('.msg-menu a').forEach(function(el) {
- el.addEventListener('click', function(e) {
- showMessageLinksDialog(
- e.target.closest('section').getAttribute('data-mid'),
- parseInt(e.target.closest('li').id)); // rid
- e.preventDefault();
- });
- });
- document.querySelectorAll('.l .a-comment').forEach(function(e) {
- e.addEventListener('click', function (e) {
- showCommentFooter(
- e.target,
- e.target.closest('article').getAttribute('data-mid'));
- e.preventDefault();
- });
- });
- document.querySelectorAll('.l .a-privacy').forEach(function(e) {
- e.addEventListener('click', function (e) {
- setPrivacy(
- e.target,
- e.target.closest('article').getAttribute('data-mid'));
- e.preventDefault();
- });
- });
- document.querySelectorAll('.l .a-popular-plus').forEach(function(e) {
- e.addEventListener('click', function (e) {
- setPopular(
- e.target,
- e.target.closest('article').getAttribute('data-mid'),
- 2);
- e.preventDefault();
- });
- });
- document.querySelectorAll('.l .a-popular-minus').forEach(function(e) {
- e.addEventListener('click', function (e) {
- setPopular(
- e.target,
- e.target.closest('article').getAttribute('data-mid'),
- -1);
- e.preventDefault();
- });
- });
- document.querySelectorAll('.l .a-popular-delete').forEach(function(e) {
- e.addEventListener('click', function (e) {
- setPopular(
- e.target,
- e.target.closest('article').getAttribute('data-mid'),
- -2);
- e.preventDefault();
- });
- });
- document.querySelectorAll('.ir a').forEach(function(e) {
- e.addEventListener('click', function (e) {
- var fname = e.target.closest('[data-fname]').getAttribute('data-fname');
- if (!showPhotoDialog(fname)) {
- e.preventDefault();
- }
- });
- });
- document.querySelectorAll('.social a').forEach(function(e) {
- e.addEventListener('click', function (e) {
- openSocialWindow(e.target);
- e.preventDefault();
- });
- });
- var username = document.getElementById('username');
- if (username) {
- username.addEventListener('blur', function () {
- checkUsername();
- });
- }
-
- document.querySelectorAll('.l .a-like').forEach(function(e) {
- e.addEventListener('click', function (e) {
- likeMessage(
- e.target,
- e.target.closest('article').getAttribute('data-mid'));
- e.preventDefault();
- });
- });
- document.querySelectorAll('.a-login').forEach(function(el) {
- el.addEventListener('click', function(e) {
- openDialogLogin();
- e.preventDefault();
- });
- });
- document.querySelectorAll('.attach-photo').forEach(function(el) {
- el.addEventListener('click', function(e) {
- attachCommentPhoto(e.target);
- });
- });
- var unfoldall = document.getElementById('unfoldall');
- if (unfoldall) {
- unfoldall.addEventListener('click', function(e) {
- document.querySelectorAll('#replies>li').forEach(function(e) {
- e.style.display = 'block';
- });
- document.querySelectorAll('#replies .msg-comments').forEach(function(e) {
- e.style.display = 'none';
- });
- e.preventDefault();
- });
- }
- var newMessageBlock = document.getElementById('newmessage');
- if (newMessageBlock) {
- var form = newMessageBlock.parentNode;
- form.addEventListener('submit', newMessage);
- newMessageBlock.querySelector('textarea').addEventListener('click', function(e) {
- var parent = e.target.parentNode;
- parent.querySelector('div').style.display = 'block';
- e.target.style.minHeight = '70px';
- e.target.addEventListener('keypress', function(e) {
- postformListener(e.target, e);
- });
- });
- newMessageBlock.querySelector('a').addEventListener('click', function(e) {
- attachMessagePhoto(e.target);
- });
- }
- document.querySelectorAll('article').forEach(function(article) {
- if (Array.prototype.some.call(
- article.querySelectorAll('.u a'),
- function (a) {
- return a.textContent === 'NSFW';
- }
- )) {
- var img = article.querySelector('.ir img');
- if (img) {
- img.style.opacity = 0.05;
- img.addEventListener('mouseover', function(e) {
- e.target.style.opacity = 1;
- });
- img.addEventListener('mouseout', function(e) {
- e.target.style.opacity = 0.05;
- });
- }
- }
- });
-
- unfoldPostForm();
- unfoldReply();
- initWS();
- window.addEventListener('hashchange', unfoldPostForm);
- window.addEventListener('hashchange', unfoldReply);
-
- window.addEventListener('pagehide', wsShutdown);
-});
diff --git a/juick-spring-www/src/main/webapp/static/sharesocial.png b/juick-spring-www/src/main/webapp/static/sharesocial.png
deleted file mode 100644
index 1031b343..00000000
Binary files a/juick-spring-www/src/main/webapp/static/sharesocial.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/style.css b/juick-spring-www/src/main/webapp/static/style.css
deleted file mode 100644
index 46af7b81..00000000
--- a/juick-spring-www/src/main/webapp/static/style.css
+++ /dev/null
@@ -1,874 +0,0 @@
-html,body,div,h1,h2,ul,li,p,form,input,textarea,pre {
- margin: 0;
- padding: 0;
-}
-html,input,textarea {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Droid Sans", "Helvetica Neue", sans-serif;
- font-size: 12pt;
- -webkit-font-smoothing: subpixel-antialiased;
-}
-html {
- background: #EEEEE5;
- color: #222;
-}
-body {
- margin: 0 auto;
- width: 1000px;
-}
-h1,h2 {
- font-weight: normal;
-}
-ul {
- list-style-type: none;
-}
-a {
- color: #069;
- text-decoration: none;
-}
-img,hr {
- border: none;
-}
-hr {
- background: #CCC;
- height: 1px;
- margin: 10px 0;
-}
-pre {
- white-space: pre-wrap;
- white-space: -moz-pre-wrap;
- white-space: -pre-wrap;
- white-space: -o-pre-wrap;
- word-wrap: break-word;
-}
-span.u {
- text-decoration: underline;
-}
-#content {
- float: right;
- margin: 25px 0 0 0;
- width: 728px;
-}
-#topwrapper {
- clear: both;
- position: relative;
-}
-body>header {
- width: 1000px;
-}
-body>header a {
- border-bottom: 1px dotted #666;
- color: #222;
- font-size: 13pt;
-}
-#logo {
- float: left;
- height: 36px;
- margin: 7px 25px 0 20px;
- width: 110px;
-}
-#logo a {
- background: url("logo.png") no-repeat;
- border: 0;
- display: block;
- height: 36px;
- overflow: hidden;
- text-indent: 100%;
- white-space: nowrap;
- width: 110px;
-}
-@media screen and (-webkit-min-device-pixel-ratio: 2),(min-resolution: 192dpi) {
- #logo a {
- background: url("logo@2x.png") no-repeat;
- background-size: cover;
- }
-}
-nav#global {
- float: left;
-}
-nav#global li {
- display: inline-block;
- margin: 14px 12px 0 0;
-}
-#search {
- float: right;
- margin: 12px 20px 12px 0;
-}
-#search input {
- background: #FFF;
- border: 1px solid #DDDDD5;
- padding: 4px;
-}
-#headdiv {
- background: #DDDDD5;
- border-bottom: 1px solid #D5D5D0;
- border-top: 1px solid #D5D5D0;
- clear: both;
- margin: 0 0 5px 0;
- padding: 0 20px;
- position: relative;
-}
-#headdiv li {
- display: inline-block;
- margin: 12px 12px 12px 0;
-}
-nav#actions {
- position: absolute;
- right: 8px;
- top: 0;
-}
-body>header nav li:after {
- color: #AAA;
- content: "/";
- display: inline-block;
- margin-left: 12px;
-}
-body>header nav li:last-child:after {
- display: none;
-}
-body>header p {
- color: #222;
- font-size: 13pt;
- margin: 12px 0;
- text-align: center;
-}
-#content>p, #content>h1, #content>h2 {
- margin: 1em 0;
-}
-#newmessage {
- background: #E5E5E0;
- margin-bottom: 20px;
- padding: 15px;
-}
-#newmessage textarea {
- border: 1px solid #CCC;
- height: 14pt;
- margin: 0 0 5px 0;
- min-height: 14pt;
- padding: 4px;
- resize: vertical;
- width: 688px;
-}
-#newmessage input {
- border: 1px solid #CCC;
- margin: 5px 0;
- padding: 2px 4px;
-}
-#newmessage>div {
- display: none;
-}
-#newmessage .img {
- width: 500px;
-}
-#newmessage .tags {
- width: 500px;
-}
-#newmessage .subm {
- background: #EEEEE5;
- width: 150px;
-}
-article {
- background: #fff;
- line-height: 140%;
- margin-bottom: 20px;
- padding: 20px;
-}
-article aside {
- float: left;
- height: 48px;
- margin-right: 10px;
- width: 48px;
-}
-article aside img {
- height: 48px;
- width: 48px;
-}
-article time {
- border-bottom: 1px dotted #999;
- color: #999;
- font-size: 10pt;
-}
-article p {
- clear: left;
- margin: 5px 0 15px 0;
-}
-article p.i {
- text-align: center;
-}
-article p.ir {
- float: right;
- margin-bottom: 10px;
- margin-left: 10px;
-}
-article p.ir a {
- cursor: -moz-zoom-in;
- cursor: -webkit-zoom-in;
-}
-article p.ir img {
- max-height: 200px;
- max-width: 200px;
-}
-article .irbr {
- clear: right;
-}
-article>nav.l {
- display: inline-block;
- font-size: 10pt;
-}
-article>nav.l a {
- border-bottom: 1px dotted #AAA;
- color: #888;
- margin-right: 15px;
-}
-article>nav.s {
- display: inline-block;
- float: right;
- text-align: right;
-}
-article>nav.s a {
- color: #222;
- font-weight: bold;
- vertical-align: middle;
-}
-article a.likes {
- padding-left: 20px;
-}
-article a.replies {
- margin-left: 18px;
-}
-article footer.comm {
- margin: 13px 0 0 0;
-}
-article textarea {
- border: 0;
- height: 12pt;
- min-height: 12pt;
- padding: 2px;
- resize: vertical;
- vertical-align: top;
- width: 530px;
-}
-article input {
- background: #EEE;
- border: 1px solid #CCC;
- color: #999;
- margin-left: 6px;
- min-width: 50px;
- vertical-align: top;
-}
-article .tags {
- margin-top: 3px;
-}
-.msg-tags {
- margin-top: 5px;
-}
-article .tags>a, .msg-tags>a {
- border: 1px dotted #ccc;
- color: #888;
- display: inline-block;
- font-size: 10pt;
- margin-bottom: 5px;
- margin-right: 5px;
- padding: 0 10px;
-}
-#geomap {
- height: 300px;
- margin-top: 1em;
- overflow: hidden;
- width: 700px;
-}
-.msg {
- margin: 10px 0 20px 0;
-}
-.ads {
- background: #FFF;
- margin: 8px 0 16px 58px;
- padding: 13px 10px 5px 10px;
-}
-.msgthread {
- margin-bottom: 0;
-}
-.msg-avatar {
- float: left;
- height: 48px;
- margin-right: 10px;
- width: 48px;
-}
-.msg-avatar img {
- height: 48px;
- vertical-align: top;
- width: 48px;
-}
-.msg-cont {
- background: #FFF;
- line-height: 140%;
- margin-bottom: 20px;
- padding: 20px;
- width: 640px;
-}
-.msg-menu {
- float: right;
- height: 16px;
- margin-left: 10px;
- margin-top: 2.4px;
- width: 16px;
-}
-.msg-menu>a {
- background: url("menu.png") no-repeat;
- display: block;
- height: 16px;
- vertical-align: top;
- width: 16px;
-}
-.msg-ts, article header.t {
- float: right;
- font-size: small;
- vertical-align: top;
-}
-.msg-ts, .msg-ts>a {
- color: #999;
-}
-.msg-place {
- font-size: small;
-}
-.msg-place>a {
- color: #999;
-}
-.msg-txt {
- clear: both;
- margin: 0 0 12px;
- padding-top: 10px;
-}
-.msg-media {
- text-align: center;
-}
-.msg-links {
- color: #999;
- font-size: small;
- margin: 5px 0 0 0;
-}
-.msg-comments {
- color: #AAA;
- font-size: small;
- margin-top: 10px;
- overflow: hidden;
- text-indent: 10px;
-}
-.ta-wrapper {
- border: 1px solid #DDD;
- display: inline-block;
-}
-.msg-comment textarea {
- border: 0;
- height: 12pt;
- min-height: 12pt;
- padding: 2px;
- resize: vertical;
- vertical-align: top;
- width: 634px;
-}
-.msg-comment .narrow {
- width: 554px;
-}
-.msg-comment .narrowpm {
- width: 580px;
-}
-.attach-photo {
- background: url("photo-attachment.png") no-repeat 3px 4px;
- cursor: pointer;
- display: inline-block;
- height: 13px;
- overflow: hidden;
- padding: 2px 4px;
- width: 16px;
-}
-.attach-photo-active {
- background: url("photo-attachment-active.png") no-repeat 3px 4px;
- cursor: pointer;
- display: inline-block;
- height: 13px;
- overflow: hidden;
- padding: 2px 4px;
- width: 16px;
-}
-.msg-comment input {
- background: #EEE;
- border: 1px solid #CCC;
- color: #999;
- margin-left: 6px;
- vertical-align: top;
- width: 50px;
-}
-.msg-recomms {
- color: #AAA;
- font-size: small;
- margin-top: 10px;
- overflow: hidden;
- text-indent: 10px;
-}
-.reply-new .msg-cont {
- border-right: 5px solid #0C0;
-}
-q:before, q:after {
- content: "";
-}
-q {
- border-left: 1px dashed #CCC;
- color: #666;
- display: block;
- margin: 10px 0 10px 10px;
- padding-left: 10px;
-}
-#mtoolbar {
- background: #E5E5DD;
- border-top: 1px solid #CCC;
- width: 680px;
-}
-#mtoolbar ul, #mtoolbar a {
- padding: 5px;
-}
-#mtoolbar li {
- display: inline;
-}
-#mtoolbar div {
- background: url("toolbar-icons.png") no-repeat;
- display: inline-block;
- height: 16px;
- margin: 5px;
- vertical-align: middle;
- width: 16px;
-}
-#replies .msg-txt, #private-messages .msg-txt {
- margin: 0;
-}
-.msg-comment {
- margin-top: 10px;
-}
-.newmessage {
- border: 1px solid #DDD;
- padding: 2px;
- resize: vertical;
- width: 695px;
-}
-.users {
- margin: 10px 0;
- width: 100%;
-}
-.users td {
- overflow: hidden;
- padding: 6px 0;
- width: 33%;
-}
-.users img {
- height: 32px;
- margin-right: 6px;
- vertical-align: middle;
- width: 32px;
-}
-.title2 {
- background: #DDDDD0;
- margin: 20px 0;
- padding: 10px 20px;
-}
-.title2-right {
- float: right;
- line-height: 24px;
-}
-#content .title2 h2 {
- font-size: x-large;
- margin: 0;
-}
-.page {
- background: #E5E5DD;
- padding: 5px;
- text-align: center;
-}
-.signup-h1>img {
- margin-right: 10px;
- vertical-align: middle;
-}
-.signup-h1 {
- font-size: x-large;
- margin: 20px 0 10px 0;
-}
-.signup-h2 {
- font-size: large;
- margin: 10px 0 5px 0;
-}
-.signup-hr {
- margin: 20px 0;
-}
-.newpm {
- margin: 20px 60px 30px 60px;
-}
-.newpm textarea {
- resize: vertical;
- width: 100%;
-}
-.newpm-send input {
- width: 100px;
-}
-#column {
- float: left;
- margin-left: 10px;
- overflow: hidden;
- padding-top: 10px;
- width: 240px;
-}
-#column ul, #column p, #column hr {
- margin: 10px 0;
-}
-#column li {
- margin: 6px 0;
-}
-#column .margtop {
- margin-top: 15px;
-}
-#column p {
- font-size: 10pt;
- line-height: 140%;
-}
-#column .tags {
- text-align: justify;
-}
-#column .inp {
- background: #F5F5E9;
- border: 1px solid #CCC;
- border-radius: 3px;
- padding: 3px;
- width: 222px;
-}
-#ctitle {
- font-size: 14pt;
-}
-#ctitle img {
- margin-right: 5px;
- vertical-align: middle;
-}
-#ctoolbar {
- background: #E5E5DD;
- line-height: 0;
- margin: 10px 0;
- padding: 5px;
-}
-#ctoolbar li {
- display: inline;
-}
-#ctoolbar a {
- padding: 5px 10px;
-}
-#ctoolbar div {
- background: url("toolbar-icons.png") no-repeat;
- display: inline-block;
- height: 16px;
- margin: 5px 0;
- vertical-align: middle;
- width: 16px;
-}
-#ustats li {
- font-size: 10pt;
- margin: 3px 0;
-}
-#column table.iread {
- width: 100%;
-}
-#column table.iread td {
- text-align: center;
-}
-#column table.iread img {
- height: 48px;
- width: 48px;
-}
-#dialogb {
- background: #222;
- height: 100%;
- left: 0;
- opacity: 0.6;
- position: fixed;
- top: 0;
- width: 100%;
- z-index: 10;
-}
-#dialogt {
- height: 100%;
- left: 0;
- position: fixed;
- top: 0;
- width: 100%;
- z-index: 10;
-}
-#dialogt td {
- text-align: center;
- vertical-align: middle;
-}
-#dialogw {
- display: inline-block;
- position: relative;
- text-align: left;
- z-index: 11;
-}
-#dialogc {
- background: url("dialog-close.png");
- cursor: pointer;
- height: 30px;
- position: absolute;
- right: -15px;
- top: -15px;
- width: 30px;
- z-index: 12;
-}
-.dialoglogin {
- background: #EEEEE5;
- padding: 25px;
- width: 300px;
-}
-#signfb,#signvk {
- display: block;
- height: 32px;
- line-height: 32px;
- margin: 10px 0;
- overflow: hidden;
- text-decoration: none;
- text-indent: 37px;
- width: 100%;
-}
-#signfb {
- background: url("facebook.png") no-repeat #3A569C;
- color: #FFF;
-}
-#signvk {
- background: url("vk.png") no-repeat #6d8fb3;
- color: #FFF;
- margin-bottom: 30px;
-}
-.dialoglogin form {
- margin-top: 7px;
-}
-.signinput,.signsubmit {
- border: 1px solid #CCC;
- margin: 3px 0;
- padding: 3px;
-}
-.signinput {
- width: 292px;
-}
-.signsubmit {
- width: 70px;
-}
-.dialogshare {
- background: #EEEEE5;
- border: 1px solid #999;
- min-width: 300px;
- overflow: auto;
- padding: 20px;
-}
-.dialogl {
- background: #F5F5E9;
- border: 1px solid #DDD;
- margin: 3px 0 20px;
- padding: 5px;
-}
-.dialogshare li {
- float: left;
- margin: 5px 10px 0 0;
-}
-.dialogshare a {
- background-image: url("sharesocial.png");
- display: block;
- height: 32px;
- width: 32px;
-}
-.dialogtxt {
- background: #EEEEE5;
- padding: 20px;
-}
-#wsthread {
- background: #CCC;
- bottom: 20px;
- cursor: pointer;
- display: none;
- padding: 5px 10px;
- position: fixed;
- right: 20px;
-}
-#footer {
- clear: both;
- color: #999;
- font-size: 10pt;
- margin: 0 auto 20px 0;
- padding: 10px 0;
- width: 1004px;
-}
-#footer-social {
- float: left;
-}
-#footer-social a {
- border: 0;
- display: inline-block;
- height: 32px;
- margin: 0 15px 0 0;
- overflow: hidden;
- text-indent: 100%;
- white-space: nowrap;
- width: 32px;
-}
-#footer-left {
- margin-left: 286px;
- margin-right: 350px;
-}
-#footer-right {
- float: right;
-}
-.sharenew {
- color: #FFF;
- display: inline-block;
- line-height: 32px;
- min-height: 32px;
- min-width: 200px;
- padding: 0 12px 0 37px;
-}
-.ico32-twi {
- background: #55acee url("icon-twitter.png") no-repeat;
-}
-.ico32-vk {
- background: #6d8fb3 url("icon-vk.png") no-repeat;
-}
-.ico32-fb {
- background: #3b579d url("icon-fb.png") no-repeat;
-}
-.ico32-lj {
- background: #888888 url("icon-lj.png") no-repeat;
-}
-.ico32-gp {
- background: #dc4a38 url("icon-gplus.png") no-repeat;
-}
-.icon {
- margin-top: -2px;
- vertical-align: middle;
-}
-.icon--ei-comment {
- margin-top: -3px;
-}
-fieldset {
- border: 1px dotted #ccc;
- margin-top: 25px;
-}
-@media screen and (max-width: 850px) {
- body {
- text-size-adjust: 100%;
- -webkit-text-size-adjust: 100%;
- }
- body,body>header,#topwrapper,#content,#footer,#mtoolbar {
- float: none;
- margin: 0 auto;
- min-width: 310px;
- width: auto;
- }
- body>header {
- margin-bottom: 15px;
- }
- body>header a {
- font-size: 12pt;
- }
- #logo {
- display: none;
- }
- nav#global {
- margin-left: 10px;
- }
- nav#global li {
- margin-right: 10px;
- }
- #search {
- display: inline-block;
- float: none;
- margin: 10px 10px;
- }
- #headdiv {
- padding: 0 10px;
- }
- #headdiv li {
- margin-right: 10px;
- }
- nav#actions {
- position: relative;
- right: auto;
- }
- #newmessage .img, #newmessage .tags {
- width: 100%;
- }
- #column {
- float: none;
- margin: 0 10px;
- padding-top: 0;
- width: auto;
-
- }
- article {
- margin: 8px;
- overflow: auto;
- }
- article p {
- margin: 10px 0 8px 0;
- }
- article>nav.l {
- display: block;
- float: left;
- line-height: 15pt;
- width: 80%;
- }
- article>nav.s {
- display: block;
- }
- article textarea {
- width: 205px;
- }
- article footer {
- float: left;
- }
- #content textarea {
- width: 100%;
- }
- .msg,.msg-cont {
- min-width: 280px;
- width: auto;
- }
- .msg-cont,.ads {
- margin: 8px;
- }
- .msg-comment textarea {
- width: 100%;
- }
- .msg-media {
- overflow: auto;
- }
- .title2 h2 {
- font-size: large;
- }
- #footer {
- margin: 0 10px;
- }
- #footer div {
- float: none;
- margin: 10px 0;
- }
-}
-@media screen and (max-width: 480px) {
- .msg-ts {
- float: none;
- }
- .msg-tags {
- margin-top: 10px;
- }
- .msg-txt {
- padding-top: 5px;
- }
- .title2 {
- font-size: 11pt;
- }
- #content .title2 h2 {
- font-size: 11pt;
- }
- .title2-right {
- line-height: initial;
- }
-}
diff --git a/juick-spring-www/src/main/webapp/static/tagscloud.png b/juick-spring-www/src/main/webapp/static/tagscloud.png
deleted file mode 100644
index 3e1bf169..00000000
Binary files a/juick-spring-www/src/main/webapp/static/tagscloud.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/toolbar-icons.png b/juick-spring-www/src/main/webapp/static/toolbar-icons.png
deleted file mode 100644
index cd4efd45..00000000
Binary files a/juick-spring-www/src/main/webapp/static/toolbar-icons.png and /dev/null differ
diff --git a/juick-spring-www/src/main/webapp/static/vk.png b/juick-spring-www/src/main/webapp/static/vk.png
deleted file mode 100644
index 80b6920b..00000000
Binary files a/juick-spring-www/src/main/webapp/static/vk.png and /dev/null differ
diff --git a/juick-spring-www/src/test/java/com/juick/www/NotFoundPageTest.java b/juick-spring-www/src/test/java/com/juick/www/NotFoundPageTest.java
deleted file mode 100644
index c01194f4..00000000
--- a/juick-spring-www/src/test/java/com/juick/www/NotFoundPageTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.juick.www;
-
-import com.juick.configuration.DataConfiguration;
-import com.juick.www.configuration.WebSecurityConfig;
-import com.juick.www.configuration.WwwServletConfiguration;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.ContextHierarchy;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.context.WebApplicationContext;
-
-import javax.inject.Inject;
-
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
-
-/**
- * Created by aalexeev on 11/24/16.
- */
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextHierarchy({
- @ContextConfiguration(classes = {
- com.juick.www.configuration.WebAppConfiguration.class,
- WebSecurityConfig.class,
- DataConfiguration.class}),
- @ContextConfiguration(classes = {WwwServletConfiguration.class}),
-})
-public class NotFoundPageTest {
- @Inject
- private WebApplicationContext wac;
-
- private MockMvc mockMvc;
-
- @Before
- public void setup() {
- this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
- .apply(SecurityMockMvcConfigurers.springSecurity()).build();
- }
-
- @Test
- public void pageNotFoundTest() throws Exception {
- mockMvc.perform(get("/-11"))
- .andExpect(status().is4xxClientError())
- .andExpect(view().name("views/error"));
-
- mockMvc.perform(get("/-1"))
- .andExpect(status().is4xxClientError())
- .andExpect(view().name("views/error"));
- }
-}
diff --git a/juick-spring-www/src/test/java/com/juick/www/ThymeleafTestsJunitRunner.java b/juick-spring-www/src/test/java/com/juick/www/ThymeleafTestsJunitRunner.java
deleted file mode 100644
index 4fd1f1f5..00000000
--- a/juick-spring-www/src/test/java/com/juick/www/ThymeleafTestsJunitRunner.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.juick.www;
-
-import nz.net.ultraq.thymeleaf.LayoutDialect;
-import org.junit.Assert;
-import org.junit.Test;
-import org.thymeleaf.dialect.IDialect;
-import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect;
-import org.thymeleaf.spring4.dialect.SpringStandardDialect;
-import org.thymeleaf.testing.templateengine.context.web.SpringWebProcessingContextBuilder;
-import org.thymeleaf.testing.templateengine.engine.TestExecutor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by aalexeev on 11/24/16.
- */
-public class ThymeleafTestsJunitRunner {
-
- @Test
- public void runThymeleafTest() {
- final List dialects = new ArrayList<>();
- dialects.add(new SpringStandardDialect());
- dialects.add(new LayoutDialect());
- dialects.add(new SpringSecurityDialect());
-
- final SpringWebProcessingContextBuilder springPCBuilder = new SpringWebProcessingContextBuilder();
-
- springPCBuilder.setApplicationContextConfigLocation(null);
-
- final TestExecutor executor = new TestExecutor();
- executor.setProcessingContextBuilder(springPCBuilder);
- executor.setDialects(dialects);
-
- executor.execute("classpath:tests");
-
- Assert.assertTrue(executor.isAllOK());
- executor.reset();
- }
-}
diff --git a/juick-spring-www/src/test/resources/tests/simple.thtest b/juick-spring-www/src/test/resources/tests/simple.thtest
deleted file mode 100644
index 1505a382..00000000
--- a/juick-spring-www/src/test/resources/tests/simple.thtest
+++ /dev/null
@@ -1,25 +0,0 @@
-%TEMPLATE_MODE HTML
-# ------------ separator comment -----------
-%CONTEXT
-onevar = 'Goodbye,'
-# ------------------------------------------
-%MESSAGES
-one.msg = Crisis
-# ------------------------------------------
-%INPUT
-
-
-
- Hello,
- World!
-
-
-# ------------------------------------------
-%OUTPUT
-
-
-
- Goodbye,
- Crisis
-
-
\ No newline at end of file
diff --git a/juick-spring-www/webpack.config.js b/juick-spring-www/webpack.config.js
deleted file mode 100644
index acefc658..00000000
--- a/juick-spring-www/webpack.config.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var webpack = require("webpack")
-var globby = require("globby")
-var ExtractTextPlugin = require("extract-text-webpack-plugin")
-module.exports = {
- devtool: 'source-map',
- entry: {
- "scripts" : globby.sync([
- __dirname + "/src/main/webapp/static/*.*",
- require.resolve('evil-icons/assets/evil-icons.css'),
- require.resolve('evil-icons/assets/evil-icons.js')
- ])
- },
- output: {
- path: __dirname + "/src/main/webapp",
- filename: "[name].js"
- },
- module: {
- preLoaders: [
- { test: /\.jsx?$/, loader: 'eslint', exclude: /node_modules/ },
- { test: /\.css$/, loader: 'csslint?failOnWarning=false', exclude: /node_modules/ }
- ],
- loaders: [
- { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") },
- { test: /\.png$/, loader: "url-loader?limit=10000000000" },
- { test: /\.svg$/, loader: "url-loader?limit=10000000000" }
- ]
- },
- plugins: [
- new ExtractTextPlugin("style.css", {
- allChunks: true
- })
- ],
- eslint: {
- failOnWarning: false,
- failOnError: true
- },
-}
\ No newline at end of file
diff --git a/juick-www/src/main/resources/errors.properties b/juick-www/src/main/resources/errors.properties
new file mode 100644
index 00000000..7ec8fbfd
--- /dev/null
+++ b/juick-www/src/main/resources/errors.properties
@@ -0,0 +1,3 @@
+error.title = Error page
+
+error.login=Wrong user or password
\ No newline at end of file
diff --git a/juick-www/src/main/resources/errors_ru.properties b/juick-www/src/main/resources/errors_ru.properties
new file mode 100644
index 00000000..ca13b926
--- /dev/null
+++ b/juick-www/src/main/resources/errors_ru.properties
@@ -0,0 +1,3 @@
+error.title = Произошла ошибка
+
+error.login=Произошла ошибка, проверьте имя пользователя и пароль
\ No newline at end of file
diff --git a/juick-www/src/main/resources/messages.properties b/juick-www/src/main/resources/messages.properties
new file mode 100644
index 00000000..6f587853
--- /dev/null
+++ b/juick-www/src/main/resources/messages.properties
@@ -0,0 +1,51 @@
+date.format=MM/dd/yyyy
+
+link.settings=Settings
+link.returnToMain=Back to Home Page
+link.contacts=Contacts
+link.help=Help
+link.adv=Advertisement
+
+link.popular=Popular
+link.allMessages=All messages
+link.withPhotos=Photos
+link.my=My feed
+link.privateMessages=PM
+link.discuss=Discuss
+link.recommended=Recommended
+link.postMessage=Post
+link.logout=Logout
+
+link.settings.main=Main
+link.settings.password=Password
+link.settings.about=About
+
+label.sponsor=Sponsor
+label.sponsors=Sponsors
+label.search=Search
+label.register=Register
+label.username=User name
+label.password=Password
+
+postForm.newMessage=New message
+postForm.imageLink=Link to image (JPG/PNG, up to 10 MB)
+postForm.orImageUpload=or Upload
+postForm.tags=Tags (space separated)
+
+button.send=Send
+
+message.loginForSending=Login for post messages and comments
+message.recommend=Recommend
+message.sendLoginToXmpp=Send LOGIN to juick@juick.com
+
+question.areRegistered=Already registered?
+
+title.help=Help
+title.loginOrSignup=Juick - Log In or Sign Up
+title.index.anonym=Juick microblogs: popular posts
+title.index.user=Popular
+message.comment=Comment
+postForm.writeReply=Write a reply
+messages.next=Next
+error.pageNotFound=Page not found
+error.pageNotFound.description=Probably, user deleted this post, or this page never existed.
\ No newline at end of file
diff --git a/juick-www/src/main/resources/messages_ru.properties b/juick-www/src/main/resources/messages_ru.properties
new file mode 100644
index 00000000..4d8c2c0f
--- /dev/null
+++ b/juick-www/src/main/resources/messages_ru.properties
@@ -0,0 +1,51 @@
+date.format=dd.MM.yyyy
+
+link.settings = Настройки
+link.returnToMain =Вернуться на главную
+link.contacts=Контакты
+link.help=Помощь
+link.adv=Реклама
+
+link.popular=Популярные
+link.allMessages=Все сообщения
+link.withPhotos=Фотографии
+link.my=Моя лента
+link.privateMessages=Приватные
+link.discuss=Обсуждения
+link.recommended=Рекомендации
+link.postMessage=Написать
+link.logout=Выйти
+
+link.settings.main=Главная
+link.settings.password=Пароль
+link.settings.about=О пользователе
+
+label.sponsor=Спонсор
+label.sponsors=Спонсоры
+label.search=Поиск
+label.register=Зарегистрироваться
+label.username=Имя пользователя
+label.password=Пароль
+
+postForm.newMessage=Новое сообщение
+postForm.imageLink=Ссылка на изображение (JPG/PNG, до 10Мб)
+postForm.orImageUpload=или загрузить
+postForm.tags=Теги (через пробел)
+
+button.send=Отправить
+
+message.loginForSending=Чтобы добавлять сообщения и комментарии, представьтесь
+message.recommend=Рекомендовать
+message.sendLoginToXmpp=Отправьте LOGIN на juick@juick.com
+
+question.areRegistered=Уже зарегистрированы?
+
+title.help=Справка
+title.loginOrSignup=Juick - Войдите в систему или зарегистрируйтесь
+title.index.anonym=Микроблоги Juick: популярные записи
+title.index.user=Популярные
+message.comment=Комментировать
+postForm.writeReply=Написать ответ
+messages.next=Читать далее
+error.pageNotFound=Страница не найдена
+error.pageNotFound.description=Сожалеем, но страницу с этим адресом удалил её автор, либо её никогда не существовало.
\ No newline at end of file
diff --git a/juick-www/src/main/webapp/WEB-INF/views/login.html b/juick-www/src/main/webapp/WEB-INF/views/login.html
index 4d870951..b534796a 100644
--- a/juick-www/src/main/webapp/WEB-INF/views/login.html
+++ b/juick-www/src/main/webapp/WEB-INF/views/login.html
@@ -120,17 +120,20 @@
- Зарегистрироваться:
+ {{ i18n("messages","label.register") }}:
XMPP
-
+
{{ i18n("messages","message.sendLoginToXmpp") }}
-Уже зарегистрированы?
+
diff --git a/juick-www/src/main/webapp/WEB-INF/views/partial/footer.html b/juick-www/src/main/webapp/WEB-INF/views/partial/footer.html
index 19f22cbd..71d675de 100644
--- a/juick-www/src/main/webapp/WEB-INF/views/partial/footer.html
+++ b/juick-www/src/main/webapp/WEB-INF/views/partial/footer.html
@@ -1,9 +1,9 @@
diff --git a/juick-www/src/main/webapp/WEB-INF/views/partial/navigation.html b/juick-www/src/main/webapp/WEB-INF/views/partial/navigation.html
index 89115b87..64877723 100644
--- a/juick-www/src/main/webapp/WEB-INF/views/partial/navigation.html
+++ b/juick-www/src/main/webapp/WEB-INF/views/partial/navigation.html
@@ -2,9 +2,9 @@
@@ -16,23 +16,23 @@
{% if visitor.getUID() > 0 %}
{% else %}
-
Чтобы добавлять сообщения и комментарии, представьтесь .
+
{{ i18n("messages","link.loginForSending", "/login") }}.
{% endif %}
diff --git a/juick-www/src/main/webapp/WEB-INF/views/partial/settings_tabs.html b/juick-www/src/main/webapp/WEB-INF/views/partial/settings_tabs.html
index d7901d5e..35a5a98e 100644
--- a/juick-www/src/main/webapp/WEB-INF/views/partial/settings_tabs.html
+++ b/juick-www/src/main/webapp/WEB-INF/views/partial/settings_tabs.html
@@ -1,5 +1,5 @@
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index fe2d7c3f..43dd810f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,4 +1,4 @@
rootProject.name = "Juick"
-include ':juick-core', 'juick-server', ':juick-api', ':juick-www', ':juick-rss', ':juick-ws', ':juick-notifications', ':juick-crosspost', ':juick-xmpp', ':juick-xmpp-bot', ':juick-spring-www'
+include ':juick-core', 'juick-server', ':juick-api', ':juick-www', ':juick-rss', ':juick-ws', ':juick-notifications', ':juick-crosspost', ':juick-xmpp', ':juick-xmpp-bot'
--
cgit v1.2.3